From 73898d59542897dab82eaabdd592452b8b457a03 Mon Sep 17 00:00:00 2001 From: Marco Serantoni Date: Wed, 12 Feb 2014 00:13:14 +0100 Subject: [PATCH 01/11] [MacOSX] Refines in building system, now bundles lib migration supports symbolic links --- CMakeLists.txt | 26 +++++++++++++++--------- scripts/osx_fixbundle.sh | 43 ++++++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25042ed729..84ec69197f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,9 +190,11 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) set( TO_LINKER -Wl ) endif() - # Thou shalt not link vaporware and tell us it's a valid DSO: - set( CMAKE_SHARED_LINKER_FLAGS "${TO_LINKER},--no-undefined" ) - set( CMAKE_MODULE_LINKER_FLAGS "${TO_LINKER},--no-undefined" ) + # Thou shalt not link vaporware and tell us it's a valid DSO (apple ld doesn't support it) + if( NOT APPLE ) + set( CMAKE_SHARED_LINKER_FLAGS "${TO_LINKER},--no-undefined" ) + set( CMAKE_MODULE_LINKER_FLAGS "${TO_LINKER},--no-undefined" ) + endif() set( CMAKE_EXE_LINKER_FLAGS_RELEASE "-s" ) endif() @@ -345,12 +347,6 @@ check_find_package_result( OPENGL_FOUND "OpenGL" ) if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) add_custom_target( lib-wxpython ) - include( download_pcre ) - include( download_swig ) - include( download_wxpython ) - add_dependencies( lib-wxpython pcre ) - add_dependencies( lib-wxpython swig ) - add_dependencies( lib-wxpython libwxpython ) #set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so;.dylib;.dll") @@ -361,6 +357,9 @@ add_custom_target( lib-wxpython ) if( KICAD_BUILD_STATIC ) message(STATUS "KICAD_BUILD_STATIC set") + if( KICAD_SCRIPTING OR KICAD_SCRIPTING_WXPYTHON OR KICAD_SCRIPTING_MODULES ) + message(FATAL_ERROR "KICAD_SCRIPTING* is not supported with KICAD_BUILD_STATIC, please select KICAD_BUILD_DYNAMIC" ) + endif() endif() if( KICAD_BUILD_DYNAMIC ) @@ -374,6 +373,9 @@ add_custom_target( lib-wxpython ) include( download_libpng ) if( KICAD_SCRIPTING OR KICAD_SCRIPTING_WXPYTHON OR KICAD_SCRIPTING_MODULES ) + + message(STATUS "Scripting ENABLED") + set( SWIG_EXECUTABLE ${SWIG_ROOT}/bin/swig ) set( SWIG_INCLUDE ${SWIG_ROOT}/include ) set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages ) @@ -392,6 +394,12 @@ add_custom_target( lib-wxpython ) set(wxWidgets_INCLUDE_DIRS ${LIBWXPYTHON_ROOT}/include/wx-3.0 ) set(wxWidgets_LIBRARY_DIRS ${LIBWXPYTHON_ROOT}/lib ) + include( download_pcre ) + include( download_swig ) + include( download_wxpython ) + add_dependencies( lib-wxpython pcre ) + add_dependencies( lib-wxpython swig ) + add_dependencies( lib-wxpython libwxpython ) add_dependencies( lib-dependencies libwxpython ) else() include( download_wxwidgets ) diff --git a/scripts/osx_fixbundle.sh b/scripts/osx_fixbundle.sh index 93ace4b6db..d2c8726963 100755 --- a/scripts/osx_fixbundle.sh +++ b/scripts/osx_fixbundle.sh @@ -1,4 +1,5 @@ -#!/bin/bash +#!/bin/bash +# v 1.1 Supports migration of links (limited to the same directory) - I should add checks.. # usage osx_fixbundle.sh if [[ ! -f version.h ]]; then @@ -11,7 +12,6 @@ fi EXECUTABLES="`find . -name '*.app'`" - # # Copies libraries under in the bundle and relocates them in the binary # @@ -29,7 +29,11 @@ function fixbundle() { if [[ "$library" =~ "$bzroot" ]]; then echo "${exec}: Migrating `basename $library` in the bundle" if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then - cp -f $library ${execpath}${exec}.app/Contents/Frameworks + if [ ! -L $library ]; then + cp -f $library ${execpath}${exec}.app/Contents/Frameworks + else + resolvelink "$library" "`dirname $library`" "${execpath}/${exec}.app/Contents/Frameworks" + fi fi install_name_tool -change $library @executable_path/../Frameworks/`basename $library` ${execpath}${exec}.app/Contents/MacOS/${exec} fi @@ -46,7 +50,11 @@ function fixbundle() { for library in $LIBRARIES; do if [[ "$library" =~ "$bzroot" ]]; then if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then - cp -f $library ${exec}.app/Contents/Frameworks + if [ ! -L $library ]; then + cp -f $library ${exec}.app/Contents/Frameworks + else + resolvelink "$library" "`dirname $library`" "${execpath}/${exec}.app/Contents/Frameworks" + fi fi install_name_tool -change $library @executable_path/../Frameworks/`basename $library` $module fi @@ -70,7 +78,11 @@ function fixbundle() { for library in $LIBRARIES; do if [[ "$library" =~ "$bzroot" ]]; then if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then - cp -f $library ${exec}.app/Contents/Frameworks + if [ ! -L $library ]; then + cp -f $library ${exec}.app/Contents/Frameworks + else + resolvelink "$library" "`dirname $library`" "${execpath}/${exec}.app/Contents/Frameworks" + fi echo "copied `basename $library` into bundle" (( dynlib_migrate += 1)) fi @@ -84,8 +96,27 @@ function fixbundle() { cd - >/dev/null } +# +# This supports only links on the same dir (TODO ?) +# -#fixbundle $1 $2 $3 +function resolvelink() { + local srclib="`basename $1`" + local srcpath="$2" + local destpath="$3" + + #if is a file i expect a pointed "" + local pointed="`readlink ${srcpath}/${srclib}`" + + if [ ! -f ${pointed} ]; then + resolvelink "${pointed}" "${srcpath}" "${destpath}" + echo "Link ${srclib} -> ${pointed} " + (cd "${destpath}"; ln -s "${pointed}" "${srclib}" ) + else + echo "Copy ${srcpath}/${srclib} -> ${destpath} " + cp "${srcpath}/${srclib}" ${destpath} + fi +} for executable in $EXECUTABLES; do From b9544786212f309165c4271c3869e42ab39b57c4 Mon Sep 17 00:00:00 2001 From: Fabrizio Tappero Date: Wed, 12 Feb 2014 08:53:55 +0100 Subject: [PATCH 02/11] Update icon_bitmap2component. --- bitmaps_png/cpp_48/icon_bitmap2component.cpp | 291 ++---- bitmaps_png/icons/icon_bitmap2component.ico | Bin 3262 -> 3262 bytes bitmaps_png/sources/icon_bitmap2component.svg | 834 +++++++----------- 3 files changed, 394 insertions(+), 731 deletions(-) diff --git a/bitmaps_png/cpp_48/icon_bitmap2component.cpp b/bitmaps_png/cpp_48/icon_bitmap2component.cpp index 6d3a8a8313..e96ff04481 100644 --- a/bitmaps_png/cpp_48/icon_bitmap2component.cpp +++ b/bitmaps_png/cpp_48/icon_bitmap2component.cpp @@ -8,214 +8,89 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, - 0x87, 0x00, 0x00, 0x0c, 0xdb, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x99, 0x7b, 0x6c, 0x54, - 0xd7, 0x9d, 0x80, 0xbf, 0xfb, 0xf0, 0xcc, 0xd8, 0x1e, 0x3f, 0xc6, 0x9e, 0xf1, 0x1b, 0x1b, 0x1c, - 0x8c, 0xbd, 0xa6, 0x36, 0x09, 0x09, 0x10, 0x36, 0xae, 0x4b, 0x29, 0xc1, 0x09, 0x50, 0x85, 0x87, - 0x01, 0xb5, 0x8e, 0x20, 0x51, 0xac, 0x88, 0x26, 0x80, 0xaa, 0xb6, 0xa4, 0x34, 0x8d, 0xd2, 0xa8, - 0x5d, 0x56, 0x95, 0x1a, 0xd4, 0x55, 0x68, 0x57, 0x9b, 0x84, 0x50, 0x20, 0x9b, 0x22, 0x2d, 0x54, - 0x21, 0x29, 0x24, 0x4d, 0xe4, 0x50, 0x20, 0x6e, 0x03, 0xd4, 0xa1, 0x6e, 0x30, 0x25, 0x25, 0x7e, - 0xe1, 0x07, 0x7e, 0x8e, 0x3d, 0xf6, 0xd8, 0x33, 0x9e, 0xc7, 0xbd, 0x67, 0xff, 0xb0, 0xe7, 0xe2, - 0xf1, 0x8c, 0x89, 0xcd, 0x2e, 0x2b, 0xed, 0x91, 0xae, 0xce, 0xb9, 0xe7, 0xde, 0x73, 0xce, 0xef, - 0xfd, 0x3a, 0x92, 0x10, 0x82, 0xff, 0xcf, 0x4d, 0x0d, 0x0d, 0xb6, 0x6d, 0xdb, 0xf6, 0xb4, 0xd9, - 0x6c, 0xce, 0x51, 0x55, 0x15, 0x59, 0x96, 0x51, 0x55, 0x95, 0xc9, 0xe3, 0xc9, 0xbd, 0xa2, 0x28, - 0xa8, 0xea, 0xf8, 0xd2, 0xe9, 0xfe, 0x99, 0xfc, 0x08, 0x21, 0x3a, 0x9e, 0x7c, 0xf2, 0xc9, 0xd7, - 0xee, 0x1a, 0x02, 0x4f, 0x3c, 0xf1, 0xc4, 0xee, 0x17, 0x5e, 0x78, 0xe1, 0xe5, 0xa4, 0xa4, 0xa4, - 0x18, 0x00, 0x49, 0x92, 0x98, 0xda, 0x0b, 0x21, 0x90, 0x24, 0x29, 0x6c, 0x3c, 0xb5, 0x45, 0x9b, - 0x13, 0x42, 0xa0, 0x69, 0x5a, 0xf0, 0xe8, 0xd1, 0xa3, 0xea, 0xb6, 0x6d, 0xdb, 0xfe, 0xfd, 0xae, - 0x20, 0x60, 0x32, 0x99, 0x8a, 0x6d, 0x36, 0x5b, 0x8c, 0xae, 0xeb, 0xc6, 0xa1, 0x00, 0xa3, 0x17, - 0x2f, 0x62, 0xca, 0xcd, 0x45, 0xcd, 0xc8, 0x08, 0x9b, 0x8f, 0xd6, 0x87, 0x9e, 0xa9, 0xef, 0x42, - 0x08, 0x6c, 0x36, 0x9b, 0x6a, 0x32, 0x99, 0x0a, 0xef, 0x06, 0x07, 0xe4, 0xa9, 0x14, 0x94, 0x24, - 0x09, 0x59, 0x96, 0xc1, 0xe3, 0xa1, 0xe3, 0xe9, 0xa7, 0x69, 0xdd, 0xb8, 0x11, 0xd7, 0xb1, 0x63, - 0x48, 0x93, 0x38, 0x30, 0xdb, 0x27, 0x24, 0x6a, 0x77, 0x15, 0x81, 0xc9, 0xc0, 0x4f, 0x16, 0x85, - 0xcc, 0xea, 0x6a, 0x06, 0x5e, 0x7d, 0x95, 0xb6, 0xed, 0xdb, 0x09, 0x34, 0x35, 0x85, 0xfd, 0x33, - 0x1d, 0xb0, 0x93, 0xf7, 0x9b, 0x2a, 0x8e, 0x77, 0x95, 0x03, 0x53, 0x01, 0x03, 0xb0, 0x6f, 0xd8, - 0xc0, 0xa2, 0x3f, 0xfe, 0x91, 0xb8, 0x79, 0xf3, 0x68, 0xdd, 0xba, 0x95, 0xfe, 0x5f, 0xfd, 0x0a, - 0x02, 0x81, 0x19, 0x51, 0x7d, 0x72, 0xd3, 0x34, 0xed, 0xff, 0x86, 0x03, 0xd1, 0x80, 0x88, 0x49, - 0x4d, 0xa5, 0xe0, 0xc0, 0x01, 0x0a, 0x0f, 0x1d, 0x62, 0xe4, 0xfd, 0xf7, 0x69, 0xad, 0xac, 0xc4, - 0x7b, 0xf9, 0x72, 0x18, 0x75, 0xbf, 0x0c, 0x99, 0x60, 0x30, 0x78, 0xf7, 0xcc, 0x68, 0x34, 0x36, - 0x47, 0xa3, 0x62, 0xf2, 0x8a, 0x15, 0x2c, 0xaa, 0xa9, 0xa1, 0x7d, 0xff, 0x7e, 0xda, 0xab, 0xab, - 0x49, 0xda, 0xb0, 0x01, 0xc7, 0x77, 0xbf, 0x8b, 0x64, 0xb5, 0x46, 0xfd, 0xbf, 0xab, 0xab, 0x8b, - 0x9a, 0x9a, 0x1a, 0x54, 0x55, 0xa5, 0xb7, 0xb7, 0x77, 0xe3, 0xc5, 0x8b, 0x17, 0x4b, 0x14, 0x45, - 0x31, 0xcc, 0xad, 0xa2, 0x28, 0x86, 0x49, 0x9e, 0x3c, 0x3f, 0xd5, 0x64, 0x87, 0xbe, 0x4d, 0x7e, - 0x00, 0xdd, 0xef, 0xf7, 0xbf, 0xa8, 0x4e, 0x06, 0x38, 0xd0, 0xd1, 0x41, 0xf7, 0xcb, 0x2f, 0x23, - 0x34, 0x0d, 0x31, 0x41, 0x31, 0x11, 0x0c, 0xd2, 0x7d, 0xf8, 0x30, 0x3d, 0x47, 0x8e, 0x18, 0x80, - 0x2d, 0x38, 0x78, 0x10, 0xfb, 0xfa, 0xf5, 0x34, 0xed, 0xd9, 0x43, 0xcb, 0x86, 0x0d, 0xa4, 0xed, - 0xdd, 0x8b, 0xf5, 0x1b, 0xdf, 0x88, 0x40, 0xa0, 0xa6, 0xa6, 0x86, 0x67, 0x9e, 0x79, 0x26, 0xf4, - 0x9a, 0x23, 0x49, 0x52, 0xce, 0x4c, 0xa8, 0x1a, 0x32, 0xd5, 0xd3, 0x35, 0x21, 0x04, 0xb2, 0x2c, - 0x53, 0x5b, 0x5b, 0x3b, 0x5f, 0x9d, 0x3c, 0xa9, 0x58, 0xad, 0xc4, 0x16, 0x15, 0x81, 0x10, 0xe8, - 0x3e, 0x1f, 0xee, 0x73, 0xe7, 0x40, 0x96, 0xb1, 0x6f, 0xdc, 0x88, 0x6d, 0xd5, 0x2a, 0x63, 0x03, - 0x53, 0x7a, 0x3a, 0x52, 0x4c, 0x0c, 0x25, 0xa7, 0x4e, 0xd1, 0xf5, 0xfa, 0xeb, 0x74, 0xfc, 0xf8, - 0xc7, 0xc4, 0x9f, 0x3e, 0x8d, 0x63, 0xef, 0x5e, 0x14, 0x87, 0xc3, 0xf8, 0x2f, 0x21, 0x21, 0x01, - 0x80, 0xb1, 0xb1, 0xb1, 0xdb, 0x02, 0x33, 0x75, 0x7c, 0x3b, 0x93, 0x1c, 0x9a, 0x8b, 0x8b, 0x8b, - 0x23, 0x29, 0x29, 0x49, 0x09, 0xe3, 0x40, 0x8c, 0xdd, 0x4e, 0xc6, 0xce, 0x9d, 0xe3, 0x4a, 0x37, - 0x3c, 0x4c, 0xef, 0x6b, 0xaf, 0x21, 0xc9, 0x32, 0x6a, 0x62, 0x22, 0x6a, 0x62, 0x62, 0x24, 0xa5, - 0x54, 0x95, 0xac, 0xef, 0x7c, 0x87, 0xd4, 0xb5, 0x6b, 0x69, 0xda, 0xbb, 0x97, 0xd6, 0x8d, 0x1b, - 0xb1, 0xef, 0xde, 0x4d, 0xe2, 0xa6, 0x4d, 0x11, 0xd6, 0x28, 0x5a, 0xab, 0xaf, 0xaf, 0xe7, 0xcc, - 0x99, 0x33, 0x51, 0xa9, 0x3d, 0xe1, 0x3f, 0xa8, 0xaa, 0xaa, 0x0a, 0x89, 0x4c, 0x04, 0xc2, 0x92, - 0x24, 0xa1, 0x4e, 0xe7, 0x49, 0x67, 0x63, 0xf6, 0xcc, 0xb9, 0xb9, 0x14, 0xff, 0xf6, 0xb7, 0x74, - 0xbd, 0xfe, 0x3a, 0x37, 0x7e, 0xf6, 0x33, 0xfa, 0x5f, 0x79, 0x05, 0xc9, 0x6c, 0x26, 0xb0, 0x6e, - 0x9d, 0xb1, 0x57, 0xc7, 0x48, 0x07, 0xdb, 0xdf, 0xdf, 0x8e, 0x2e, 0x74, 0x1e, 0xce, 0x7b, 0x98, - 0xe7, 0x97, 0x3d, 0xcf, 0xd1, 0xa3, 0x47, 0x71, 0x3a, 0x9d, 0xe4, 0xe6, 0xe6, 0xe2, 0x74, 0x3a, - 0x51, 0x55, 0x95, 0x60, 0x30, 0x88, 0xa2, 0x28, 0xc4, 0xc6, 0xc6, 0x72, 0xe6, 0xcc, 0x19, 0x96, - 0x2f, 0x5f, 0x0e, 0x0e, 0xd8, 0xf6, 0xc1, 0x36, 0x74, 0xa1, 0x53, 0x91, 0x5b, 0xc1, 0x8b, 0x4b, - 0x5f, 0xbc, 0xe5, 0x5f, 0xa2, 0x21, 0x20, 0x49, 0x12, 0x42, 0x0e, 0xb3, 0xb0, 0x8c, 0xd4, 0xd7, - 0xd3, 0xfe, 0x8b, 0x5f, 0xf0, 0x4f, 0x6f, 0xbd, 0x15, 0x15, 0x89, 0xfe, 0xb7, 0xdf, 0xa6, 0xf3, - 0xd7, 0xbf, 0x26, 0xb6, 0xa4, 0x84, 0xc4, 0x4d, 0x9b, 0x50, 0xec, 0x76, 0xd4, 0x96, 0x16, 0x83, - 0x03, 0xbd, 0x9e, 0x5e, 0xae, 0xf4, 0x5d, 0x01, 0x20, 0x3d, 0x2e, 0xdd, 0x38, 0x6b, 0xc9, 0x92, - 0x25, 0xec, 0xda, 0xb5, 0x8b, 0x43, 0x87, 0x0e, 0xe1, 0xf3, 0xf9, 0x70, 0xb9, 0x5c, 0x94, 0x94, - 0x94, 0xb0, 0x78, 0xf1, 0x62, 0x9e, 0x7a, 0xea, 0x29, 0x84, 0x10, 0x38, 0xbd, 0x4e, 0xda, 0xdd, - 0xed, 0x00, 0x34, 0x0d, 0x35, 0x19, 0x6b, 0x85, 0x10, 0x84, 0x89, 0x90, 0xf0, 0x7a, 0x71, 0x7d, - 0xf8, 0xe1, 0xb8, 0x12, 0x87, 0xe4, 0x56, 0x08, 0x9c, 0xef, 0xbe, 0x4b, 0xf7, 0x9b, 0x6f, 0xe2, - 0xbd, 0x7e, 0x9d, 0x7f, 0x54, 0x57, 0x33, 0xf7, 0x27, 0x3f, 0xc1, 0x3c, 0x67, 0x0e, 0x00, 0xbe, - 0x8e, 0x0e, 0x9a, 0x7f, 0xf4, 0x23, 0xdc, 0x75, 0x75, 0x38, 0x76, 0xef, 0x26, 0x79, 0xcb, 0x16, - 0x84, 0x24, 0xa1, 0xeb, 0x3a, 0x72, 0x77, 0xb7, 0xe1, 0x5f, 0x2c, 0xaa, 0xe5, 0x16, 0xc7, 0x54, - 0xb3, 0x21, 0x16, 0x21, 0x04, 0xcb, 0xca, 0xca, 0xf8, 0xe0, 0x83, 0x0f, 0xb0, 0x5a, 0xad, 0x2c, - 0x5e, 0xbc, 0x38, 0x8c, 0x98, 0xf1, 0x31, 0xf1, 0xc6, 0xda, 0xc9, 0x63, 0x5d, 0xd7, 0xc3, 0x39, - 0xe0, 0xbf, 0x79, 0x93, 0x9e, 0x43, 0x87, 0x40, 0x08, 0xc4, 0x84, 0xe3, 0xd1, 0xfd, 0x7e, 0xe2, - 0x4b, 0x4b, 0x49, 0xa9, 0xa8, 0xa0, 0x6f, 0x68, 0x88, 0xf4, 0xc7, 0x1f, 0x47, 0xb5, 0xd9, 0x10, - 0x9a, 0x46, 0xf7, 0x1b, 0x6f, 0xd0, 0xbe, 0x7f, 0x3f, 0xf1, 0x4b, 0x97, 0x92, 0x7f, 0xf2, 0x24, - 0x6a, 0x7a, 0xfa, 0xb8, 0x8c, 0x4e, 0x0a, 0xf6, 0x42, 0x00, 0x96, 0xa6, 0x95, 0x72, 0xe5, 0xc9, - 0x2b, 0x68, 0x42, 0x23, 0xc5, 0x92, 0x12, 0x21, 0xae, 0x45, 0x45, 0x45, 0x14, 0x16, 0x16, 0x1a, - 0xca, 0xda, 0xd3, 0xd3, 0x63, 0x7c, 0xbf, 0x37, 0xed, 0x5e, 0x3e, 0xdf, 0xfe, 0x39, 0xba, 0xd0, - 0xb1, 0x28, 0x16, 0x63, 0xcf, 0x08, 0x04, 0x62, 0x0b, 0x0a, 0x58, 0x78, 0xea, 0x14, 0x92, 0x24, - 0xa1, 0x0d, 0x0f, 0xf3, 0x69, 0x69, 0x29, 0xb2, 0xd9, 0x8c, 0x65, 0xee, 0x5c, 0x52, 0x1e, 0x7d, - 0x14, 0x49, 0x55, 0x49, 0x5e, 0xb1, 0x82, 0xd1, 0xab, 0x57, 0x69, 0xde, 0xb3, 0x07, 0x5f, 0x77, - 0x37, 0xd9, 0xfb, 0xf6, 0x91, 0x58, 0x51, 0x81, 0xae, 0xeb, 0xd3, 0x9a, 0x3e, 0x49, 0x92, 0xd0, - 0x84, 0xc6, 0x75, 0xd7, 0x75, 0x84, 0x10, 0xe4, 0x27, 0xe7, 0x93, 0x60, 0x4e, 0xf8, 0x52, 0x25, - 0x0f, 0xb5, 0xb1, 0xe0, 0x18, 0x67, 0x3b, 0xce, 0xa2, 0xe9, 0x1a, 0x85, 0xb6, 0x42, 0x16, 0x24, - 0x2f, 0x88, 0x2e, 0x42, 0xb7, 0x0b, 0x07, 0xcc, 0xd9, 0xd9, 0xa4, 0x6d, 0xdd, 0xca, 0x8d, 0x7d, - 0xfb, 0xe8, 0x3e, 0x78, 0x10, 0xdb, 0xfa, 0xf5, 0xe4, 0xbd, 0xf1, 0x06, 0x72, 0x42, 0x82, 0x11, - 0x5e, 0x47, 0x43, 0x20, 0xb4, 0xd7, 0xc5, 0xce, 0x8b, 0x6c, 0x7a, 0x7b, 0xdc, 0x3a, 0xad, 0x9a, - 0xbb, 0x8a, 0x13, 0xeb, 0x4f, 0x44, 0x0d, 0xd7, 0xa3, 0xe9, 0xe3, 0x85, 0xee, 0x0b, 0xec, 0xf8, - 0x68, 0x07, 0x00, 0x15, 0x79, 0x15, 0x1c, 0x5c, 0x75, 0xd0, 0x08, 0x4f, 0x66, 0x1c, 0x22, 0x0e, - 0x7d, 0xfc, 0x31, 0xcd, 0x7b, 0xf7, 0x82, 0x2c, 0x93, 0xff, 0x9b, 0xdf, 0x10, 0xbf, 0x74, 0x69, - 0x98, 0x6d, 0xbe, 0x9d, 0x53, 0x92, 0x24, 0x09, 0xa4, 0x70, 0x13, 0x19, 0x0d, 0x58, 0x31, 0x45, - 0xf4, 0x8c, 0x5e, 0x9a, 0xde, 0x87, 0x84, 0x39, 0xb2, 0x68, 0x4e, 0x25, 0x38, 0x30, 0x40, 0xe3, - 0x81, 0x03, 0x38, 0xdf, 0x79, 0x87, 0xb4, 0xea, 0x6a, 0xd2, 0x77, 0xee, 0x44, 0x32, 0x99, 0x22, - 0x00, 0x9f, 0x8e, 0xfa, 0xa1, 0x7e, 0xbe, 0x6d, 0x3e, 0x95, 0x45, 0x95, 0x08, 0x21, 0x28, 0x9f, - 0x53, 0x1e, 0xa1, 0x23, 0xb7, 0xdb, 0x67, 0x61, 0xea, 0x42, 0xb6, 0x17, 0x8f, 0x9b, 0xe0, 0x87, - 0xb2, 0x1e, 0x32, 0xd6, 0x44, 0x70, 0x20, 0x1a, 0x02, 0xd7, 0xaa, 0xaa, 0x88, 0x2d, 0x28, 0xa0, - 0xe8, 0xe4, 0x49, 0x2c, 0x45, 0x45, 0x51, 0x11, 0x9d, 0x09, 0x17, 0xb2, 0x12, 0xb2, 0x38, 0xbc, - 0xee, 0x70, 0x54, 0x20, 0x6f, 0x97, 0xdd, 0x49, 0x92, 0x44, 0x46, 0x7c, 0x06, 0x3f, 0xff, 0xea, - 0xcf, 0xa3, 0x7a, 0x64, 0x35, 0x1a, 0x5b, 0x84, 0x10, 0x48, 0xb1, 0xb1, 0x78, 0x1e, 0xab, 0xa2, - 0xd7, 0x96, 0xcd, 0x40, 0xc6, 0x5c, 0x4c, 0x7f, 0xe9, 0x22, 0xa7, 0xcb, 0xc7, 0xc2, 0x85, 0xb9, - 0xa4, 0xa6, 0x26, 0x7e, 0x29, 0xe0, 0x53, 0x3d, 0x66, 0xbb, 0xbb, 0x9d, 0x6f, 0x9d, 0xfc, 0x16, - 0x9a, 0xd0, 0x58, 0x99, 0xb7, 0x92, 0x7d, 0x5f, 0xdb, 0x17, 0x15, 0x81, 0x68, 0x7b, 0xb6, 0x0e, - 0xb7, 0xb2, 0xf9, 0xdd, 0xcd, 0xe8, 0xe8, 0x3c, 0x92, 0xf7, 0x08, 0x2f, 0x3d, 0xf8, 0x52, 0xb8, - 0x19, 0x0d, 0x04, 0x02, 0x3d, 0x2d, 0x2d, 0x1d, 0x5a, 0x47, 0xc7, 0x90, 0xa2, 0x69, 0x3a, 0x20, - 0xd1, 0xd8, 0xd8, 0x45, 0xdd, 0xa0, 0x8c, 0x32, 0xdc, 0x86, 0xdc, 0x7e, 0x63, 0x22, 0x24, 0x96, - 0xf0, 0x7a, 0x55, 0xb6, 0x6c, 0x59, 0x8d, 0xd5, 0x1a, 0xcb, 0xb8, 0x70, 0x4e, 0x3e, 0x30, 0xfc, - 0xbd, 0xbd, 0xdd, 0xc3, 0x99, 0x33, 0x9f, 0x01, 0x82, 0x96, 0xa1, 0x16, 0xfa, 0x1a, 0xc6, 0xf7, - 0xfe, 0xac, 0xab, 0x93, 0xb3, 0xe2, 0x0a, 0x7e, 0x7f, 0x02, 0x4e, 0x27, 0x9c, 0x3b, 0xd7, 0x60, - 0xac, 0x99, 0x3b, 0x37, 0x8d, 0xec, 0xec, 0x70, 0x33, 0xeb, 0xf4, 0x3a, 0x69, 0x73, 0xb7, 0x01, - 0xd0, 0xe8, 0x6a, 0x8c, 0x74, 0x64, 0x57, 0xaf, 0x9a, 0x3f, 0x3f, 0x7f, 0xfe, 0xaa, 0xbc, 0x74, - 0x69, 0x31, 0x8a, 0xa2, 0x20, 0x49, 0x32, 0x0e, 0x47, 0x12, 0x8b, 0x17, 0xcf, 0x27, 0x18, 0xd4, - 0xd0, 0x75, 0x1d, 0x49, 0x92, 0x19, 0x5f, 0x17, 0xca, 0xd8, 0x24, 0x64, 0x39, 0x9a, 0xe5, 0xba, - 0x35, 0x5e, 0xb3, 0x66, 0x9d, 0x31, 0x77, 0x7f, 0x8a, 0x9d, 0xe3, 0xf9, 0xbf, 0x0b, 0xfb, 0xfe, - 0xfd, 0xef, 0x3f, 0x37, 0x21, 0xcb, 0x3a, 0x7e, 0xbf, 0x46, 0x20, 0x10, 0xa4, 0xb6, 0xb6, 0x15, - 0x4d, 0xbb, 0xca, 0xca, 0x95, 0x05, 0x06, 0x77, 0xe2, 0xd4, 0x38, 0x03, 0x19, 0xab, 0xc9, 0x6a, - 0x8c, 0x83, 0xc1, 0xe0, 0x38, 0x02, 0x79, 0x79, 0xe9, 0x7b, 0x2a, 0x2b, 0xbf, 0x2a, 0x99, 0xcd, - 0x26, 0x23, 0x06, 0x1f, 0x1a, 0xf2, 0x30, 0x34, 0xe4, 0xc5, 0xe3, 0x19, 0xc3, 0xe7, 0x0b, 0x22, - 0xcb, 0xca, 0x04, 0xc0, 0xe1, 0xbd, 0x2c, 0x2b, 0xf4, 0xf5, 0x75, 0x73, 0xfc, 0xf8, 0x9b, 0x98, - 0x4c, 0x16, 0xb6, 0x6c, 0x79, 0x1c, 0xbf, 0xdf, 0x4f, 0x4f, 0x4f, 0x3b, 0x9a, 0xe6, 0x43, 0xd7, - 0x75, 0x12, 0x13, 0xed, 0x64, 0x65, 0xcd, 0x23, 0x3d, 0x3d, 0x87, 0x9b, 0x3d, 0x9d, 0x38, 0x07, - 0x9d, 0x48, 0x12, 0x84, 0x88, 0xac, 0xeb, 0xe0, 0xf5, 0xfa, 0xc8, 0x76, 0x14, 0x50, 0x5a, 0x5a, - 0xc4, 0x47, 0x1f, 0x7d, 0xc2, 0xd8, 0x58, 0xc0, 0x00, 0xb4, 0xd8, 0x5e, 0x4c, 0xe3, 0x53, 0x8d, - 0x68, 0xba, 0x86, 0x45, 0xb1, 0x44, 0x5a, 0xa1, 0x8c, 0x8c, 0xe4, 0x7c, 0xb7, 0x7b, 0x18, 0x49, - 0x4a, 0x44, 0x51, 0x14, 0x84, 0x10, 0xf8, 0x7c, 0x7e, 0x46, 0x47, 0xbd, 0xb8, 0xdd, 0x1e, 0xc6, - 0xc6, 0x42, 0x08, 0xc8, 0x11, 0xbd, 0xa2, 0x28, 0xbc, 0xf4, 0xaf, 0xff, 0x42, 0xfe, 0xe3, 0x47, - 0xe9, 0x73, 0x7b, 0xd8, 0xff, 0xcb, 0x9d, 0xbc, 0xf2, 0x6f, 0xbf, 0x44, 0x92, 0x86, 0x39, 0x72, - 0xe4, 0x08, 0x6b, 0xd6, 0xac, 0xe1, 0xeb, 0x5f, 0x7f, 0x90, 0x9e, 0x9e, 0x6e, 0xbe, 0xf8, 0xe2, - 0x02, 0x0d, 0xed, 0x43, 0x54, 0x6d, 0xac, 0x20, 0xa0, 0x43, 0xe7, 0xa8, 0x42, 0x9f, 0x47, 0xc6, - 0x35, 0x26, 0xe3, 0x72, 0xfb, 0xf0, 0x35, 0x5f, 0xc6, 0x6c, 0x76, 0x30, 0x32, 0x12, 0xc4, 0xed, - 0xbe, 0x15, 0x82, 0x7b, 0x02, 0x1e, 0x8e, 0xfe, 0xfd, 0x28, 0x41, 0x3d, 0xc8, 0x22, 0xfb, 0x22, - 0xca, 0xb2, 0xca, 0xc2, 0x75, 0xc0, 0xe7, 0x0b, 0xdc, 0x71, 0x79, 0x4e, 0x08, 0x9d, 0x2f, 0xba, - 0xdc, 0x34, 0x34, 0xa6, 0xa0, 0x6b, 0xc9, 0x14, 0x0e, 0x04, 0xc8, 0xcd, 0xcd, 0xe5, 0x87, 0x3f, - 0x7c, 0x8e, 0x13, 0x27, 0x4e, 0x50, 0x5f, 0x5f, 0xcf, 0xe6, 0xcd, 0x5b, 0x89, 0x8d, 0x8d, 0x23, - 0x23, 0x23, 0x9b, 0x76, 0x57, 0x2d, 0xb5, 0x6d, 0xe0, 0x09, 0x2a, 0x13, 0xda, 0xa2, 0x03, 0x3a, - 0x09, 0x8a, 0x17, 0x49, 0x92, 0x27, 0xf2, 0x07, 0x7f, 0xd8, 0x19, 0xd7, 0x06, 0xae, 0xf1, 0xd3, - 0x4f, 0x7e, 0x0a, 0xc0, 0x8a, 0x9c, 0x15, 0x06, 0x02, 0x06, 0x07, 0xee, 0xb4, 0x62, 0xe0, 0xf1, - 0xb8, 0xb9, 0x79, 0xb3, 0x81, 0x5d, 0x55, 0x0f, 0xf3, 0x1f, 0xa7, 0xab, 0x20, 0x38, 0xc6, 0x0f, - 0x7e, 0x50, 0x05, 0xc0, 0xb3, 0xcf, 0x3e, 0x4b, 0x77, 0x77, 0x37, 0x3b, 0x76, 0xec, 0x30, 0x2c, - 0x8b, 0xaa, 0xaa, 0x3c, 0xb8, 0x70, 0x2e, 0xcd, 0x2d, 0xe7, 0x19, 0x1b, 0x76, 0xd3, 0xd6, 0xd6, - 0x41, 0x71, 0xf1, 0x72, 0x02, 0x01, 0x1d, 0x9f, 0x4f, 0xc3, 0x9e, 0x36, 0x0f, 0x97, 0x6b, 0x74, - 0xc6, 0xe7, 0x47, 0xc4, 0x42, 0xb3, 0xa3, 0xbc, 0xa0, 0xa3, 0xa3, 0x81, 0xd5, 0xab, 0xd7, 0x60, - 0xb1, 0x98, 0xf9, 0xf6, 0xb7, 0xdd, 0xc4, 0xc5, 0x99, 0xb1, 0xdb, 0x53, 0x01, 0x28, 0x2f, 0x2f, - 0xe7, 0xfc, 0xf9, 0x8f, 0x11, 0x42, 0x27, 0x18, 0xd4, 0x8d, 0x75, 0x59, 0x59, 0x73, 0x70, 0x38, - 0x32, 0x09, 0x04, 0x34, 0x3c, 0x9e, 0x11, 0x2e, 0x5c, 0xb8, 0xcc, 0x92, 0x25, 0x6b, 0x70, 0xb9, - 0x46, 0x19, 0x1a, 0x1a, 0x35, 0x14, 0xb7, 0xbe, 0xbe, 0xde, 0x58, 0x53, 0x98, 0x52, 0xc8, 0x73, - 0x4b, 0x9e, 0x43, 0xd3, 0x35, 0xee, 0x75, 0xdc, 0x1b, 0x89, 0xc0, 0x9d, 0x30, 0xa0, 0xa9, 0xe9, - 0x33, 0x96, 0x2d, 0xfb, 0x67, 0x83, 0xed, 0xa9, 0xa9, 0xa9, 0x98, 0x4c, 0xca, 0xac, 0xf6, 0x88, - 0x89, 0xb1, 0x90, 0x97, 0x97, 0x41, 0x6f, 0x6f, 0x3b, 0x26, 0x53, 0x4a, 0xd8, 0xb7, 0x63, 0xc7, - 0x8e, 0x61, 0xb3, 0xd9, 0x70, 0x38, 0x1c, 0xc4, 0xab, 0xf1, 0x7c, 0xef, 0xfe, 0xef, 0x45, 0x38, - 0xb2, 0x59, 0xc5, 0x42, 0x53, 0x45, 0x27, 0x3b, 0xdb, 0x81, 0xc5, 0x62, 0x8d, 0xfa, 0x3d, 0x10, - 0xf0, 0xd3, 0xd6, 0xd6, 0xc6, 0xe0, 0xe0, 0x20, 0x00, 0x69, 0x69, 0xe9, 0x64, 0x66, 0x66, 0x45, - 0xfd, 0x37, 0x3b, 0x3b, 0x97, 0xda, 0xda, 0xb3, 0x14, 0x14, 0xac, 0x0e, 0x9b, 0x3f, 0x7c, 0xf8, - 0x30, 0xe9, 0xe9, 0x49, 0xd3, 0xe6, 0xca, 0xaa, 0xaa, 0x22, 0x84, 0x10, 0x77, 0x84, 0x40, 0x57, - 0xd7, 0x75, 0x96, 0x2d, 0xfb, 0x5a, 0xd4, 0x6f, 0x9d, 0x9d, 0xed, 0xb4, 0xb5, 0xb5, 0xa1, 0xaa, - 0x26, 0x86, 0x86, 0x46, 0x90, 0x24, 0x09, 0x9f, 0xcf, 0xcf, 0xa7, 0x9f, 0xd6, 0x51, 0x56, 0x56, - 0x8e, 0xd9, 0x1c, 0x37, 0x45, 0x8e, 0xe1, 0xbe, 0xfb, 0x96, 0x50, 0x57, 0xf7, 0x09, 0xd9, 0xd9, - 0xf7, 0x19, 0x22, 0xd4, 0xd3, 0xd3, 0x43, 0x30, 0x38, 0x12, 0x35, 0x4a, 0x08, 0x51, 0xbf, 0xa1, - 0xa1, 0xa1, 0xff, 0x8e, 0x94, 0xd8, 0xe1, 0x70, 0xa0, 0xeb, 0x91, 0x86, 0xab, 0xb7, 0xb7, 0x9b, - 0xc1, 0xc1, 0x41, 0x46, 0x47, 0x35, 0xac, 0x56, 0xab, 0x51, 0x95, 0xd0, 0xb4, 0x20, 0x16, 0x8b, - 0x87, 0x0b, 0x17, 0xfe, 0x4c, 0x59, 0x59, 0xf9, 0xd4, 0x82, 0x20, 0xb1, 0xb1, 0x56, 0x02, 0x81, - 0x81, 0x30, 0x8f, 0x7e, 0xe0, 0xc0, 0xab, 0xaf, 0xc8, 0xf2, 0x48, 0xff, 0xd4, 0xca, 0x21, 0x20, - 0x64, 0x59, 0xd6, 0x15, 0x45, 0xf1, 0x0d, 0x0e, 0x0e, 0xbe, 0x35, 0x6b, 0x04, 0x7c, 0xbe, 0x31, - 0x12, 0x13, 0x93, 0x22, 0xe6, 0x15, 0x45, 0xa2, 0xa3, 0xa3, 0x1d, 0xbf, 0x5f, 0x22, 0x3b, 0x7b, - 0x1e, 0x03, 0x03, 0x7d, 0xfc, 0xfe, 0xf7, 0x27, 0x70, 0x38, 0x1c, 0xac, 0x5c, 0xb9, 0x0e, 0x9b, - 0xad, 0x80, 0xae, 0xae, 0x26, 0xde, 0x7b, 0xef, 0x14, 0x6b, 0xd7, 0xae, 0x27, 0x10, 0xd0, 0xc2, - 0x3c, 0xaa, 0xdd, 0x6e, 0x0b, 0xdb, 0xef, 0xf2, 0xe5, 0xab, 0x57, 0x9a, 0x9b, 0x2f, 0xb6, 0x47, - 0x93, 0x50, 0xc0, 0x07, 0x0c, 0x44, 0x24, 0xf5, 0x33, 0x69, 0x2e, 0x57, 0x1f, 0x76, 0x7b, 0x5e, - 0x64, 0x52, 0xdf, 0xdf, 0x4b, 0x7c, 0x7c, 0x3c, 0x99, 0x59, 0x59, 0x0c, 0x38, 0xfb, 0x78, 0xf4, - 0xd1, 0x72, 0x02, 0x81, 0x71, 0x6f, 0xba, 0x60, 0xc1, 0x21, 0x4e, 0xbf, 0x77, 0x0e, 0xc1, 0x1c, - 0x5c, 0xae, 0x7e, 0x14, 0x45, 0x9a, 0x22, 0x1a, 0x90, 0x94, 0x64, 0xc3, 0xe7, 0xf3, 0x13, 0x32, - 0x2a, 0x56, 0x6b, 0x4a, 0x17, 0x10, 0x0d, 0x01, 0x6d, 0xe2, 0xf1, 0x00, 0x6e, 0xf9, 0x56, 0x10, - 0x36, 0x53, 0x04, 0x7a, 0xb1, 0x58, 0x62, 0xa3, 0xcc, 0x0f, 0x10, 0x08, 0x6a, 0xd8, 0x52, 0x12, - 0x79, 0xe7, 0xdd, 0xff, 0x32, 0x80, 0x07, 0xb8, 0x7e, 0xfd, 0x3a, 0x7f, 0xfb, 0xdb, 0x25, 0xb2, - 0x73, 0xb2, 0x48, 0x48, 0x48, 0xa0, 0xb9, 0xb9, 0x29, 0x62, 0x7d, 0x52, 0x92, 0x0d, 0x97, 0xab, - 0xc7, 0xd0, 0x81, 0xc2, 0xc2, 0xf2, 0x66, 0xe0, 0x5a, 0x94, 0xe7, 0xba, 0x10, 0xa2, 0x51, 0x08, - 0x71, 0x53, 0x08, 0x31, 0x3a, 0x6b, 0x11, 0x92, 0x24, 0x99, 0x68, 0x51, 0x74, 0x28, 0x2d, 0xd4, - 0x75, 0x1d, 0x6b, 0x7c, 0xa4, 0x75, 0x8a, 0xb7, 0x5a, 0x8d, 0xc0, 0x30, 0x74, 0x91, 0x32, 0xd5, - 0xa3, 0x2b, 0x8a, 0x32, 0x49, 0x24, 0x55, 0x21, 0x66, 0x70, 0x81, 0x27, 0xcf, 0x56, 0x84, 0x92, - 0x93, 0xd3, 0x18, 0x1b, 0x8b, 0xf4, 0x96, 0xa9, 0xa9, 0x76, 0x4c, 0x31, 0x31, 0x8c, 0x8c, 0xb8, - 0xf9, 0xe6, 0x63, 0x9b, 0x48, 0x49, 0xb9, 0x65, 0xd7, 0x1f, 0x7a, 0xa8, 0x8c, 0xe2, 0xe2, 0x12, - 0x7a, 0x7b, 0xbb, 0x71, 0xbb, 0xdd, 0xe4, 0xe7, 0xcf, 0x8f, 0x4c, 0x59, 0x87, 0x06, 0x49, 0x4a, - 0x4a, 0x9f, 0x75, 0x61, 0x6d, 0xd6, 0x8e, 0xcc, 0x66, 0x73, 0xe0, 0x76, 0x0f, 0x61, 0xb1, 0x24, - 0x4c, 0x41, 0xcc, 0x4e, 0x43, 0xc3, 0x15, 0xdc, 0x23, 0xa3, 0xe4, 0xcc, 0xc9, 0xe7, 0xec, 0xf9, - 0x8b, 0xd4, 0x7c, 0xf8, 0x1e, 0x76, 0xbb, 0x83, 0x65, 0xcb, 0xcb, 0xf0, 0x7a, 0xbd, 0xf4, 0x76, - 0x77, 0xe0, 0x74, 0x3a, 0xd1, 0xb4, 0xc8, 0x8c, 0x6c, 0x70, 0x70, 0x90, 0xa4, 0xa4, 0x7b, 0x66, - 0x5c, 0xa9, 0x08, 0xe3, 0xc0, 0x6c, 0x44, 0x28, 0x26, 0xc6, 0xc4, 0xe8, 0xe8, 0x50, 0x94, 0x0b, - 0x0c, 0x9d, 0xd2, 0xd2, 0x45, 0x20, 0x34, 0x6e, 0xb4, 0x7e, 0x81, 0xa6, 0x05, 0x58, 0xfd, 0xc8, - 0x5a, 0x16, 0x3f, 0xb0, 0x14, 0x97, 0x6b, 0x80, 0x96, 0xa6, 0x6b, 0xb4, 0xb6, 0xb6, 0x50, 0x59, - 0xb9, 0x35, 0x22, 0xeb, 0x8a, 0x89, 0x51, 0xe8, 0xef, 0x1f, 0xfe, 0x9f, 0x5d, 0xb3, 0xce, 0xa6, - 0xf5, 0xf4, 0xf4, 0x93, 0x9f, 0x1f, 0x29, 0x9e, 0x29, 0x29, 0xe3, 0x71, 0xd0, 0x9f, 0xfe, 0x54, - 0x8b, 0x84, 0x3e, 0xa1, 0x2f, 0x3a, 0x63, 0x63, 0x63, 0x34, 0x37, 0x37, 0xf3, 0xd8, 0x63, 0x1b, - 0x89, 0x8d, 0x8d, 0x27, 0x10, 0x08, 0xbf, 0xec, 0x70, 0xbb, 0x5d, 0x58, 0xad, 0x19, 0x5f, 0x9a, - 0x27, 0xff, 0xaf, 0xe8, 0xc0, 0x78, 0x02, 0xf4, 0x15, 0x9a, 0x9a, 0xfe, 0x1e, 0x71, 0x88, 0x10, - 0xe3, 0x61, 0x43, 0x65, 0xe5, 0x66, 0x0a, 0x0b, 0x0b, 0xf1, 0x7a, 0x3d, 0xf8, 0x7c, 0x3e, 0x4a, - 0x4b, 0x17, 0x51, 0x5d, 0xfd, 0x34, 0xc9, 0xc9, 0xb6, 0x48, 0x00, 0x64, 0xa8, 0xab, 0xfb, 0x0b, - 0x05, 0x05, 0x0f, 0xcc, 0xa8, 0xa2, 0x7d, 0xdb, 0x1b, 0x9a, 0x99, 0x36, 0x93, 0xc9, 0x42, 0x5f, - 0x9f, 0xce, 0xf0, 0xb0, 0x13, 0x87, 0x23, 0x23, 0x7a, 0x15, 0x22, 0x2b, 0x8b, 0xec, 0xec, 0x1c, - 0x23, 0x1a, 0x0d, 0x06, 0xb5, 0x69, 0x82, 0xc2, 0x7f, 0x50, 0x52, 0xb2, 0x6a, 0x8a, 0x29, 0x9f, - 0x39, 0x3c, 0x77, 0xc4, 0x01, 0x80, 0x39, 0x73, 0x0a, 0xb8, 0x74, 0xe9, 0x12, 0xc1, 0x60, 0xe0, - 0x8e, 0xef, 0xb7, 0x3c, 0x1e, 0x37, 0xc3, 0xc3, 0x1a, 0xc9, 0xc9, 0xf6, 0x19, 0x5d, 0x9a, 0xdf, - 0x06, 0x81, 0x3b, 0x4b, 0x68, 0xee, 0xb9, 0xe7, 0x7e, 0xfe, 0xf0, 0x87, 0xd3, 0xf4, 0xf5, 0xf5, - 0xcc, 0x7a, 0xed, 0x8d, 0x1b, 0x8d, 0xd4, 0xd5, 0x7d, 0xc6, 0x92, 0x25, 0xab, 0xa2, 0x00, 0x3f, - 0x7b, 0x1d, 0xb8, 0xa3, 0x94, 0xd2, 0x6c, 0xb6, 0x50, 0x5a, 0xba, 0x82, 0xbf, 0xfe, 0xf5, 0x73, - 0x2e, 0x5d, 0xfa, 0xf3, 0x8c, 0xae, 0x52, 0xbd, 0x5e, 0x2f, 0x35, 0x35, 0x1f, 0xa2, 0xeb, 0xc9, - 0x94, 0x97, 0xaf, 0x9f, 0xa6, 0xa8, 0x35, 0x73, 0x98, 0x54, 0x80, 0x96, 0x96, 0xde, 0xda, 0x91, - 0x11, 0xcf, 0x37, 0x13, 0xa3, 0x5c, 0x23, 0xcd, 0x8c, 0x13, 0x5f, 0xc1, 0xeb, 0x1d, 0xe5, 0xf8, - 0xf1, 0xdf, 0x91, 0x9e, 0x6e, 0x27, 0x27, 0x27, 0x8b, 0xcc, 0xcc, 0x4c, 0x1c, 0x8e, 0x34, 0x02, - 0x01, 0x3f, 0x3d, 0x3d, 0xbd, 0x74, 0x76, 0x76, 0xd2, 0xd5, 0xd5, 0x8d, 0xdb, 0xed, 0x63, 0xd9, - 0xb2, 0xb5, 0x98, 0xcd, 0x96, 0x69, 0x32, 0x3d, 0x70, 0xbb, 0x47, 0x9c, 0x92, 0x24, 0x35, 0xcf, - 0x28, 0x32, 0x10, 0x42, 0x50, 0x51, 0xf1, 0xfc, 0x03, 0x99, 0x99, 0xc9, 0xff, 0xb9, 0x60, 0x41, - 0x56, 0xa1, 0x10, 0xe3, 0xf5, 0x1e, 0xbf, 0x5f, 0xc3, 0xe7, 0x0b, 0x10, 0x0c, 0xea, 0x84, 0x8a, - 0x5d, 0xe3, 0xd5, 0x88, 0x90, 0x85, 0x90, 0x8d, 0x8b, 0xf1, 0xd0, 0x9c, 0x2c, 0x2b, 0x13, 0x3e, - 0xc1, 0x47, 0x30, 0x38, 0x8c, 0xaa, 0x8e, 0xa1, 0x69, 0x12, 0x8a, 0x92, 0x88, 0xc5, 0x62, 0x43, - 0x55, 0xcd, 0x46, 0x5d, 0xe8, 0xd6, 0x75, 0xe9, 0x78, 0x8d, 0x33, 0x10, 0x18, 0xaf, 0x0b, 0xf5, - 0xf5, 0x0d, 0xf4, 0x8d, 0x8c, 0x8c, 0xee, 0x39, 0x7c, 0x78, 0xd7, 0x91, 0x99, 0x20, 0xf0, 0xdf, - 0xd1, 0x1d, 0xfc, 0xa3, 0x61, 0x31, 0x70, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, - 0xae, 0x42, 0x60, 0x82, + 0x87, 0x00, 0x00, 0x05, 0x10, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xdd, 0x59, 0x5d, 0x4c, 0x14, + 0x57, 0x14, 0xde, 0x76, 0x85, 0xb6, 0x01, 0x1a, 0x1b, 0x94, 0x07, 0x9f, 0x0c, 0xb6, 0x94, 0xd2, + 0x16, 0x69, 0xf1, 0xc1, 0x6a, 0x6d, 0x35, 0x2d, 0xd4, 0x57, 0x53, 0xd3, 0x8a, 0x11, 0x94, 0x28, + 0xb1, 0x89, 0x09, 0xb1, 0x21, 0xc6, 0x18, 0xfb, 0x47, 0xda, 0x26, 0xc6, 0x57, 0x63, 0x7c, 0x30, + 0x3e, 0x98, 0x5a, 0xda, 0x25, 0x4d, 0x30, 0x08, 0xd6, 0x52, 0x96, 0xa2, 0x82, 0xeb, 0xee, 0xec, + 0x32, 0xf1, 0xa7, 0x69, 0x8c, 0x35, 0x90, 0x22, 0xd4, 0x34, 0xa2, 0x24, 0x12, 0x81, 0x65, 0x96, + 0xd3, 0x73, 0xc6, 0x19, 0x32, 0xcc, 0xde, 0xb9, 0xf7, 0xce, 0xec, 0x6c, 0xd1, 0x6e, 0xf2, 0x65, + 0xf8, 0x96, 0xbd, 0x3f, 0xdf, 0xcc, 0x77, 0xee, 0x39, 0xf7, 0x4e, 0x00, 0x00, 0x02, 0x4e, 0xc0, + 0x4f, 0x1e, 0xa2, 0x9c, 0xf7, 0x1b, 0x2f, 0xc0, 0xcf, 0x53, 0x88, 0x4a, 0xea, 0x3f, 0xe3, 0xbe, + 0x18, 0x9d, 0x2f, 0x42, 0xbc, 0x86, 0xa8, 0x45, 0x7c, 0x8d, 0x78, 0xd7, 0x6f, 0x01, 0xc6, 0x38, + 0xef, 0x19, 0xfd, 0xd3, 0x38, 0xaf, 0x22, 0x82, 0x19, 0x09, 0x30, 0x3a, 0xd9, 0x82, 0xf8, 0x02, + 0xf1, 0xad, 0x05, 0x65, 0x88, 0xa5, 0x59, 0xc0, 0xeb, 0xb6, 0x71, 0x3e, 0x47, 0x7c, 0x8c, 0x28, + 0x75, 0x79, 0x23, 0x02, 0xf9, 0x88, 0x7a, 0x5b, 0x67, 0x0b, 0x8d, 0x6d, 0x88, 0xe7, 0xa4, 0x9f, + 0x80, 0xe1, 0x49, 0xb2, 0xcd, 0x56, 0xc4, 0x97, 0x0b, 0xf4, 0x04, 0x3e, 0x43, 0x7c, 0x84, 0x78, + 0x39, 0xd3, 0x18, 0xc8, 0xa1, 0xc0, 0x45, 0xec, 0x30, 0x3c, 0xfa, 0x4e, 0x96, 0x62, 0xe0, 0x7d, + 0x44, 0xb3, 0x71, 0xd3, 0x5e, 0xc9, 0x38, 0x06, 0x1c, 0x06, 0x79, 0x1e, 0xf1, 0x66, 0x96, 0x56, + 0xa1, 0x95, 0xb2, 0x36, 0xf1, 0x2c, 0xe0, 0x49, 0xc0, 0xff, 0x42, 0xc0, 0x22, 0xc4, 0x16, 0xc4, + 0x6f, 0x88, 0xf1, 0x05, 0xc6, 0x7d, 0x44, 0x17, 0x62, 0x33, 0x22, 0xc8, 0xb0, 0xde, 0xb3, 0x2c, + 0x01, 0xf5, 0xf1, 0x78, 0x1c, 0x1e, 0x37, 0x24, 0x93, 0xc9, 0x3a, 0x86, 0x80, 0x1a, 0x96, 0x00, + 0x95, 0x1a, 0x58, 0x3f, 0xd9, 0xe6, 0x89, 0x44, 0x22, 0x8d, 0xa7, 0x52, 0xa9, 0x79, 0x5c, 0xd3, + 0xb4, 0x8b, 0xb6, 0xc9, 0xbf, 0x68, 0x2c, 0xb7, 0x25, 0x76, 0x01, 0x9e, 0x27, 0xa4, 0xcd, 0x6a, + 0x70, 0xed, 0xfe, 0x35, 0x9d, 0x37, 0x5f, 0x6d, 0x86, 0xa6, 0x78, 0x13, 0x34, 0x44, 0x1a, 0x74, + 0xbe, 0x7f, 0x60, 0x3f, 0x1c, 0xba, 0x7e, 0x08, 0x3a, 0x6f, 0x77, 0x7a, 0x12, 0x30, 0x3b, 0x3b, + 0x3b, 0x6e, 0x13, 0xf0, 0xa1, 0x21, 0x60, 0xb3, 0x2f, 0x02, 0x76, 0x45, 0x76, 0xc1, 0xe2, 0xd0, + 0x62, 0x08, 0x7c, 0x17, 0xd0, 0x39, 0x5d, 0x4d, 0xb0, 0x78, 0x65, 0x67, 0x25, 0x1c, 0xbd, 0x71, + 0x14, 0x26, 0x66, 0x26, 0x5c, 0x0b, 0xa0, 0x1c, 0x61, 0x24, 0x3a, 0x33, 0xe1, 0x05, 0xd3, 0x04, + 0x3c, 0x6e, 0x40, 0x41, 0x56, 0x01, 0xa5, 0xb6, 0xac, 0x5d, 0x9a, 0x26, 0x80, 0xee, 0x80, 0x09, + 0x16, 0x3f, 0x3b, 0x7c, 0x16, 0x0a, 0x43, 0x85, 0x90, 0x7b, 0x2a, 0x57, 0xe7, 0x74, 0x35, 0xe1, + 0x96, 0x47, 0x94, 0x08, 0x84, 0x47, 0xc3, 0x73, 0xfd, 0xd3, 0x1d, 0x9f, 0x99, 0x99, 0x99, 0xc7, + 0x6d, 0x4f, 0xa0, 0xc6, 0x26, 0xa0, 0xc6, 0xb5, 0x85, 0x82, 0xa7, 0x82, 0x5c, 0x8b, 0xb8, 0xe1, + 0x97, 0x94, 0x4b, 0x50, 0xf0, 0x63, 0x01, 0x0c, 0x4d, 0x0c, 0x09, 0x2d, 0x44, 0xd9, 0xda, 0x28, + 0x39, 0xac, 0x02, 0x9a, 0xcd, 0x2c, 0x2e, 0x14, 0x10, 0xbb, 0x1b, 0xcb, 0x78, 0xc2, 0x2c, 0x01, + 0x74, 0xdd, 0xd4, 0xbb, 0x49, 0x46, 0x00, 0x95, 0x1c, 0x1f, 0x58, 0x8a, 0xbf, 0x0a, 0x44, 0x35, + 0x7d, 0xff, 0x44, 0xc4, 0x00, 0xd5, 0x4d, 0xc6, 0xf5, 0x05, 0x43, 0xc0, 0xd2, 0x79, 0xdf, 0xf3, + 0x62, 0xe0, 0xf0, 0xf5, 0xc3, 0x42, 0x4f, 0x57, 0x74, 0x54, 0x30, 0xdb, 0x9f, 0xbf, 0x73, 0x1e, + 0x56, 0x75, 0xae, 0x72, 0x8c, 0x01, 0xf3, 0xef, 0x13, 0x37, 0x4f, 0x08, 0x63, 0x80, 0x25, 0x40, + 0x18, 0x03, 0xb4, 0xc6, 0x2f, 0xfb, 0x69, 0x19, 0xd7, 0x12, 0x65, 0xed, 0x65, 0x30, 0x36, 0x3d, + 0xe6, 0x68, 0xc1, 0xd1, 0x87, 0xa3, 0x50, 0xd8, 0x5a, 0xe8, 0x68, 0x21, 0xc2, 0x41, 0xf5, 0xa0, + 0x6c, 0x1e, 0x70, 0x27, 0x40, 0xb9, 0xab, 0x40, 0x71, 0x5b, 0x31, 0xe4, 0xfd, 0x90, 0xe7, 0x28, + 0x20, 0xfc, 0x77, 0x58, 0x98, 0x37, 0x6a, 0xfb, 0x6b, 0xb9, 0x02, 0x1a, 0x95, 0x46, 0x7f, 0x04, + 0x50, 0x23, 0x13, 0x2c, 0x1e, 0x4f, 0x3c, 0x82, 0x92, 0x50, 0x74, 0x1e, 0x8b, 0xc7, 0xb8, 0xbf, + 0x37, 0xff, 0x8e, 0xc6, 0xa3, 0x3a, 0xa7, 0x49, 0x9b, 0xb0, 0x72, 0xea, 0x87, 0xd5, 0xde, 0x9a, + 0x07, 0xa4, 0x04, 0x88, 0xf2, 0x80, 0x57, 0x5e, 0xf5, 0x6b, 0x15, 0x37, 0x06, 0x8e, 0xdd, 0x38, + 0x96, 0x9d, 0x18, 0xf0, 0x8b, 0x2f, 0x69, 0x5d, 0xc2, 0xb5, 0x50, 0xdb, 0x5f, 0x6d, 0xd9, 0x89, + 0x01, 0x2f, 0x7c, 0x3a, 0x35, 0x0d, 0xb7, 0x1e, 0xdc, 0xd2, 0xf9, 0xbe, 0xc4, 0x3e, 0x58, 0x73, + 0x6e, 0x0d, 0x37, 0x0f, 0x10, 0x06, 0x1f, 0x0c, 0xfe, 0x37, 0x31, 0x60, 0xe7, 0x4a, 0x5c, 0xd1, + 0xfd, 0x6b, 0x7a, 0x9c, 0x6c, 0xc1, 0xf2, 0x38, 0x8f, 0x53, 0x1b, 0xa7, 0xfe, 0x7d, 0x8f, 0x81, + 0xdd, 0x91, 0xdd, 0x50, 0x72, 0xba, 0xc4, 0xb7, 0x5a, 0x88, 0xae, 0x1b, 0xc3, 0x1b, 0xa5, 0x6a, + 0x21, 0xcf, 0x16, 0x6a, 0x1f, 0x6e, 0x87, 0xf2, 0x8e, 0xf2, 0xac, 0x95, 0x12, 0xb4, 0x67, 0x70, + 0xb1, 0x1f, 0x70, 0x27, 0x60, 0xaf, 0xb2, 0xd7, 0xb7, 0x09, 0x3b, 0x09, 0x08, 0x0d, 0x85, 0xfc, + 0x13, 0x60, 0xf7, 0xa0, 0x8c, 0x87, 0x79, 0x5c, 0x26, 0x26, 0x28, 0xaf, 0xf8, 0x1e, 0x03, 0x54, + 0xa7, 0xbb, 0xf1, 0x74, 0x7e, 0x4b, 0xbe, 0xce, 0xf7, 0x44, 0xf7, 0xc0, 0x91, 0x3f, 0x8e, 0x40, + 0xf7, 0x48, 0xb7, 0xce, 0x3b, 0x86, 0x3b, 0xb8, 0x31, 0x50, 0xd4, 0x5a, 0x04, 0x5a, 0x4a, 0xf3, + 0x3f, 0x06, 0x56, 0xff, 0xbc, 0x5a, 0xca, 0x12, 0x3b, 0x23, 0x3b, 0xa1, 0xe7, 0x4e, 0x0f, 0x4c, + 0x6a, 0x93, 0x4c, 0x0b, 0x1e, 0x50, 0x0f, 0x70, 0x2d, 0xb4, 0xa1, 0x6b, 0x83, 0xdb, 0x3d, 0xb1, + 0x58, 0x80, 0x7a, 0x4f, 0x15, 0x7a, 0x98, 0x6a, 0x78, 0x99, 0xbc, 0xb0, 0xf6, 0xdc, 0x5a, 0xae, + 0x00, 0x3a, 0x00, 0xf0, 0x55, 0x00, 0x35, 0xa2, 0x75, 0x9d, 0xe7, 0xd9, 0xcb, 0xca, 0x65, 0xe9, + 0x3c, 0x21, 0x8a, 0x01, 0xca, 0x23, 0xbc, 0xf6, 0x9e, 0x62, 0xa0, 0xee, 0x62, 0x1d, 0xd7, 0xf3, + 0x27, 0xff, 0x3c, 0x29, 0x5d, 0x0b, 0x89, 0xf2, 0x80, 0x3a, 0xa6, 0x4a, 0xef, 0x89, 0xa5, 0x2d, + 0x44, 0x89, 0x85, 0x67, 0xa1, 0x2b, 0xf7, 0xae, 0x48, 0x97, 0x16, 0xbc, 0x18, 0x22, 0x01, 0x54, + 0x76, 0xf8, 0x1e, 0x03, 0xeb, 0x7e, 0x59, 0xc7, 0x15, 0x70, 0xe6, 0xf6, 0x19, 0xa1, 0x80, 0xe3, + 0x37, 0x8f, 0x0b, 0x05, 0x90, 0x15, 0x3d, 0x1c, 0x6c, 0x89, 0x63, 0x80, 0xea, 0x1a, 0x5e, 0x0c, + 0xd0, 0xff, 0x79, 0x31, 0x40, 0x7b, 0x05, 0xba, 0xbb, 0x32, 0x79, 0x42, 0x14, 0x43, 0x9e, 0x62, + 0x80, 0xd6, 0x72, 0xd1, 0xba, 0xdf, 0xa4, 0x34, 0x31, 0x3d, 0xbf, 0xbd, 0x6f, 0xbb, 0x74, 0x2d, + 0x44, 0x37, 0xc2, 0xda, 0x9e, 0x17, 0x03, 0xc6, 0xcb, 0xc7, 0xb7, 0x11, 0xc5, 0xe6, 0xd9, 0x28, + 0xe2, 0x2d, 0xc4, 0x1b, 0x69, 0x16, 0x6a, 0x19, 0x6c, 0x91, 0x2e, 0x0d, 0xd6, 0x77, 0xad, 0x87, + 0xea, 0xee, 0x6a, 0x58, 0x71, 0x7a, 0x85, 0xeb, 0x52, 0x82, 0x56, 0x3b, 0x59, 0x0b, 0xd1, 0x91, + 0x3a, 0xe3, 0x5c, 0xe8, 0x1b, 0x7a, 0x7b, 0x94, 0x26, 0x80, 0x36, 0xe8, 0xbc, 0x3d, 0xb0, 0x5f, + 0x9c, 0x96, 0x50, 0x97, 0x67, 0xa3, 0xf6, 0x93, 0xb9, 0x7a, 0xc7, 0x5a, 0xc8, 0xdc, 0xa3, 0x7a, + 0xad, 0x85, 0xb2, 0x11, 0x03, 0x8c, 0xb3, 0xd1, 0x8a, 0x34, 0x01, 0x9a, 0xa6, 0xe9, 0x18, 0x9f, + 0x1c, 0xd7, 0x79, 0x41, 0x4b, 0xc1, 0x1c, 0x64, 0x79, 0x51, 0xa8, 0x08, 0x7a, 0x46, 0x7a, 0x84, + 0xbf, 0xa7, 0x9b, 0x64, 0x8e, 0x47, 0xa0, 0x49, 0x27, 0x93, 0xc9, 0x79, 0xdc, 0xf6, 0x04, 0x9e, + 0xb6, 0x9c, 0x4e, 0x7f, 0x85, 0xc8, 0x15, 0x96, 0xd3, 0xe6, 0x99, 0x90, 0xac, 0x45, 0x96, 0xb7, + 0x2d, 0x87, 0xfe, 0x7f, 0xfa, 0xa5, 0xf2, 0x00, 0x05, 0x71, 0x06, 0xef, 0x07, 0xb6, 0xd9, 0x57, + 0xa1, 0xdf, 0x59, 0x02, 0x46, 0x1e, 0x8e, 0x40, 0x55, 0x77, 0x95, 0x50, 0x40, 0xce, 0xf7, 0x39, + 0x3a, 0xa7, 0x73, 0x7f, 0x37, 0x89, 0x4c, 0xe2, 0x0d, 0x4d, 0xd4, 0x26, 0xe0, 0x25, 0x43, 0xc0, + 0x4a, 0xbb, 0x80, 0x4f, 0x68, 0x00, 0x55, 0x55, 0xe7, 0x60, 0xe5, 0xca, 0xc0, 0xa3, 0x73, 0xa0, + 0x0b, 0xb1, 0x0b, 0xd0, 0x1b, 0xeb, 0xd5, 0x41, 0x41, 0xd8, 0xa7, 0xf4, 0x41, 0x34, 0x11, 0x85, + 0x01, 0x75, 0x00, 0x58, 0xed, 0xa9, 0x9d, 0x09, 0x16, 0x77, 0x1a, 0xcf, 0xe4, 0x68, 0xa9, 0x06, + 0xc6, 0x3b, 0xb2, 0x1d, 0xe6, 0x99, 0xa8, 0x55, 0xc0, 0x33, 0x53, 0x53, 0x53, 0x9f, 0xe2, 0x3a, + 0x7c, 0xd5, 0xea, 0xcb, 0x85, 0x02, 0xce, 0x23, 0x81, 0xf3, 0x69, 0xc4, 0x79, 0xe5, 0x30, 0x04, + 0xe4, 0xdb, 0xbf, 0xfb, 0x17, 0xa9, 0xb6, 0x0a, 0x59, 0x1b, 0xa7, 0xa9, 0x98, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE icon_bitmap2component_xpm[1] = {{ png, sizeof( png ), "icon_bitmap2component_xpm" }}; diff --git a/bitmaps_png/icons/icon_bitmap2component.ico b/bitmaps_png/icons/icon_bitmap2component.ico index 590b782d593b06818ca9605f653ee712a6e0b60c..c336b69f382e947d7b6634703646b86df19bf5ea 100644 GIT binary patch literal 3262 zcmbuBTTBya6vt;@G%@?&YO-1NL7&VfzW88bVvL#?eex3ZfoL!i@e&{=#%p9%geXA> zU_|i>6c(gVEd_cLq+Ci{pxjEKgWM~3L|hcJ;H~?EStm_fSvG#m9R73qeg8S%IsZ8` zg76c6Yt{(Z-vs5)g7B*#2)}dU61H*9`oE1sfZ6lgXliPD_3G95`1tVf@axyF0YgJW z;(%!Fwu)|%%h98yg!L8Q~HOW^HF@XH`{|M6A(hBrq^A(BI$x_U+q_j*j86 z;iUQ`MYUp^X4`)4{^W|}AY)K|V}5UcFB4i^EfEzF9O@c1_Dau%eq-6;Gi#F}EUE0rtHmYfCbF510EzsEdkwzOHeI016rj7in`q(G>2$%t!8dN)0JA$$6#1#Nu9St4Yi(LA!K1I8a79u7YvCnpDfY82TRdHKcV70MNhvKPgf;;@^w zo1Zm3D|8p$wckDX{GjXyur=(ur|Vk#TEBexf*#(zdk0_(#Gjv^fAQi)ZgKVM)wsAg zDL)FELSxm)`Qa9=?XB#WC1g)*7qe@#rM!9Pr_NEw1poYy_Vee@7Z(@H_1#*s)jL1C zOuJ@gX3#C$XLpm6lb^qS&ah>W9Pj+7ThsybyIQ zdK8Pa+-^6!2G|@ne&xuj&cYtiA5qpR@v{X|1VElref{~Lv_A3XXL){0z7M}kbnVsd z_2$2Cx&NR1l72@19*H(Z`{*a8A|}z5Sl3%OIx$Kfh%=}v$U8sBjK@BG{p7EI@Azf? zTN|x%eJP@k{!`2;Cc7!kn&w^KTuW|4d&5HNOL*itsxgZ27OwvgeaPd^$MeT8_Xqet ze*9QFUYk>!vovq%LY^=9!)n9k=jT_K%hlD@)zZ>JK>-ejgHG7sYOpogj7`Sp_UD>f z%_GYrV~vpna!BAo z51EIV9@yO1oYtIXup6Q+(X{srOGcqs*w@!b08F4yVAXBvoa!8!_Ho1Uo2HupyJ#l> zX@WmL_vIOp^fUB+Xi4r8Z~ZLGTh=q&Lw}I-wqCp5J3l1K<#x@JAM{T`cn47?o*-4d zs>oJ!t?U{NpYj2+ELpmGozY<|uP=|Uh{r>t!zNWEWmjj%Rm33=^Z1#P|7 z;dCH-fBh#VCBc940Rl!?YGZWpWC3{aL0US$BP|Dtw(i@ zI`@?O!-o&V#!ReFeR;FM&&!KKpeP0kp+*xE699yYr6|M(K%6khegHzn^36lZ09alY z(gfDR$%u%Ec>44yfNp?#nf&7e37O62IeMX>pg;nW<-6+#M`dNDH{thiQBhG@S=sk~ z_3>-9T9e7-;|zFdG#XP=Q_q|^gR}xp2({UIIma#7!m|Yr;%5oBU=`#gB_-e61%93dwiz26 zyYT$OpOTWI*X!q@<)>AgD>#4QT>9_Hzd7Hm|Now|YiGwS*DUAk`c)Nz5H;g@?=gG+ Q@^HQSnjma-dnP^q0KVuR-T(jq literal 3262 zcmcJRNlaUJ9><+q4tAWIztCvMXf)ah9Qca%cO2F4YxXftsz=Q%W;5^JJ(ABi5=0-9 zsd(@}djG!S`|njPEt(&G(6+Yrx3%dyItV)baa)^OCXRR3zdvnH+t69-Yo_FocGNqGq#Qt0nvU7w6`7 zcXyvXd-n70?slb8%;$TR%5pgTESs%_!^NQ?KZm1cGWWQ(GbNYnv{(+}Yeb@u&$qt3 z3}&6bv$?sky1Fty?;IVCjEqqH;N!>2&dwTj?_J5^ILzjK`J)<5(CuC<6b|Aq! z*D1F;+S@!%hfpA(`1yET&EZt}4pv+LM?Ie3^1HI4*Xu1tqjg}w(%)~? z>2Tu{H01OA23@W+NrK;g=T7(UjLl}F-VWlUK6M&Ry?)SNUayxVNv&3kaO(A0LVYR} zRDF)A)vK$kPo6wkd2Y+g%XYh6c7Xqw4<@BD;`blkU(T_y1-F~x|MS9yYuBzJthu?l znVFelu?Ux{{Ndq!`xo;^B@_;5Gz}NeqOC9=+S}U`@i^wgO1bQDI(6FK0f{(j&{O*8 zc)TlDuK1>WNA4bZz3X)_eLkOz#X5wK`POjh!s<0z!|A^*EiD~Adi3_~+u%ndkp+)( zBPieUa(7&vgWR8>KgAEE12291(rMOd@B@K>S||)S9Eb?F=aR_@yFFksg)Ekc)f%_i zQcfo+k=$(j`1WU?VO;d6)drI6S1KJOnHcLWj+^nHbq~0d;yCgymBRmO+Dk}$9{lm~ zag=ChbF)z*8Inp3e13m-x0b=^XEFy^ERw?+BLrcSN^LTkRZ5J> zrEZnVrBu3=N*h7oF%b=i!S_yiX?JO_b-f0DC=>!8Dpe|#&CSiAJtk~}a7Yb`%eTA#zot?Q%X1$?dA|78&B-TFqX#B>F zSU!)Sf71tQ12|cl%+2M{KH!(jWdw+_NhA`NFJDGyW%8L!E|bq=vc|!8yWQpTy4gJU z_1DR+uAELc|L(hff+!)7ot>vbVe#x)Z%@zk?CflBZ!gsLrmGe5YS*i{5qxZY>(;I2 z=4Q~qhyPXeI#1?uIYdP9kuoGsAjm;~U;}{_yw)w9UO#cd@zz`Jn>Qs;JCq4QpZA6D zyIihImoA~Hu}foPBb`o%KJJ7Y^>e2COg5XX^ARath|lM8QR zGc`L~X=;jIy&8(eNDyXA1me zvRXEue;%2ho~^^-JQX-LLRxXxi<{HwM0LT~?9}=5fw$lG8jV>9{J(IN1U5pyzc?H# z!3PRJ{9d5bqZL?)BzPx1fXi{HcshaE=_bKov6zWDLxFL!Bs$1kv70Z@9x_y7O^ diff --git a/bitmaps_png/sources/icon_bitmap2component.svg b/bitmaps_png/sources/icon_bitmap2component.svg index 1cc7950255..01324ffd40 100644 --- a/bitmaps_png/sources/icon_bitmap2component.svg +++ b/bitmaps_png/sources/icon_bitmap2component.svg @@ -8,11 +8,11 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - height="32" - width="32" + height="48" + width="48" version="1.1" id="svg2" - inkscape:version="0.48.4 r9939" + inkscape:version="0.48.3.1 r9886" sodipodi:docname="icon_bitmap2component.svg" inkscape:export-filename="E:\kicad-launchpad\kicad-bzr\bitmaps_png\icon_bitmap2component.png" inkscape:export-xdpi="90" @@ -38,19 +38,107 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1280" - inkscape:window-height="977" + inkscape:window-width="1600" + inkscape:window-height="849" id="namedview345" - showgrid="false" - inkscape:zoom="4.9166667" - inkscape:cx="24" - inkscape:cy="23.59322" - inkscape:window-x="-4" - inkscape:window-y="-4" + showgrid="true" + inkscape:zoom="18.178537" + inkscape:cx="20.737894" + inkscape:cy="23.730717" + inkscape:window-x="0" + inkscape:window-y="29" inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> + inkscape:current-layer="svg2" + inkscape:snap-to-guides="false" + inkscape:snap-grids="false"> + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + a - - - - - - - + id="g4585" + transform="matrix(1.011705,0,0,1,-0.00570879,0)" + style="stroke:#cccccc"> + id="path3333-6" + d="m 0.98772317,30.533269 36.59759283,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + id="path3333-33" + d="m 0.98772317,34.538333 36.59759283,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + id="path3333-7" + d="m 0.98772317,38.543396 36.59759283,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + id="path3333-79" + d="m 0.98772317,42.548457 36.59759383,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + id="path3333-31-7" + d="m 0.98772317,10.507956 36.59759283,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + id="path3333-8-1" + d="m 0.98772317,14.513019 36.59759283,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + id="path3333-33-0" + d="m 0.98772317,18.518083 36.59759283,0 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + + + + id="g4563" + transform="matrix(1,0,0,0.99268819,-0.08251488,0.07386002)" + style="stroke:#cccccc"> - + inkscape:connector-curvature="0" + id="path3333-79-6-7" + d="m 9.5832994,10.601471 0,36.617177 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:connector-curvature="0" + id="path3333-79-6-7-4" + d="m 5.5802244,10.601471 0,36.617177 0,0" + style="fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + + + + + + + + + + + From f214a576298d21c8dc2def4365d6677476bfa4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nick=20=C3=98stergaard?= Date: Wed, 12 Feb 2014 08:59:56 +0100 Subject: [PATCH 03/11] Fix wrong numbering in the QFP footprint wizard python script --- pcbnew/scripting/plugins/qfp_wizard.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pcbnew/scripting/plugins/qfp_wizard.py b/pcbnew/scripting/plugins/qfp_wizard.py index 8bd5600b6b..2df89e113b 100644 --- a/pcbnew/scripting/plugins/qfp_wizard.py +++ b/pcbnew/scripting/plugins/qfp_wizard.py @@ -109,18 +109,22 @@ class QFPWizard(pcbnew.FootprintWizardPlugin): pad_size = pad_size_left_right pad_pos_x = -(pad_horizontal_pitch / 2) + pad_pos_y = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2) + if side == 2: pad_pos_x = -pad_pos_x + pad_pos_y = -pad_pos_y - pad_pos_y = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2) else: pad_size = pad_size_bottom_top pad_pos_x = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2) - pad_pos_y = -(pad_vertical_pitch / 2) + if side == 1: pad_pos_y = -pad_pos_y + else: + pad_pos_x = -pad_pos_x pad_pos = pcbnew.wxPoint(pad_pos_x, pad_pos_y) From 29a1bdb32a8256a1e78fa91a53682455669a49ca Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 12 Feb 2014 11:03:34 +0100 Subject: [PATCH 04/11] Fix issues in print mirror. (include some changes coming from Cirilo Berdarno's patch) gr_basic.cpp: rewrite the function which draws the outlines of a thick segment. --- common/gr_basic.cpp | 149 ++++++++++------------------------ pcbnew/class_edge_mod.cpp | 12 ++- pcbnew/printout_controler.cpp | 34 ++++---- 3 files changed, 74 insertions(+), 121 deletions(-) diff --git a/common/gr_basic.cpp b/common/gr_basic.cpp index 22a58b338a..1e256225b0 100644 --- a/common/gr_basic.cpp +++ b/common/gr_basic.cpp @@ -623,18 +623,10 @@ void GRLineArray( EDA_RECT* aClipBox, wxDC* aDC, std::vector& aLines, aClipBox->Inflate(-aWidth/2); } - +// Draw the outline of a thick segment wih rounded ends void GRCSegm( EDA_RECT* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int aPenSize, EDA_COLOR_T Color ) { - long radius; - int dwx, dwy; - long dx, dy, dwx2, dwy2; - long sx1, sy1, ex1, ey1; - long sx2, sy2, ex2, ey2; - bool swap_ends = false; - - GRLastMoveToX = x2; GRLastMoveToY = y2; @@ -658,114 +650,63 @@ void GRCSegm( EDA_RECT* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, GRSetColorPen( DC, Color, aPenSize ); GRSetBrush( DC, Color, false ); - radius = (width + 1) >> 1; + int radius = (width + 1) >> 1; + int dx = x2 - x1; + int dy = y2 - y1; + double angle = -ArcTangente( dy, dx ); + wxPoint start; + wxPoint end; + wxPoint org( x1, y1); + int len = (int) hypot( dx, dy ); - dx = x2 - x1; - dy = y2 - y1; + // We know if the DC is mirrored, to draw arcs + int slx = DC->DeviceToLogicalX( 1 ) - DC->DeviceToLogicalX( 0 ); + int sly = DC->DeviceToLogicalY( 1 ) - DC->DeviceToLogicalY( 0 ); + bool mirrored = (slx > 0 && sly < 0) || (slx < 0 && sly > 0); - if( dx == 0 ) /* segment vertical */ - { - dwx = radius; - if( dy >= 0 ) - dwx = -dwx; + // first edge + start.x = 0; + start.y = radius; + end.x = len; + end.y = radius; + RotatePoint( &start, angle); + RotatePoint( &end, angle); - sx1 = x1 - dwx; - sy1 = y1; + start += org; + end += org; - ex1 = x2 - dwx; - ey1 = y2; + DC->DrawLine( start, end ); - DC->DrawLine( sx1, sy1, ex1, ey1 ); + // first rounded end + end.x = 0; + end.y = -radius; + RotatePoint( &end, angle); + end += org; - sx2 = x1 + dwx; - sy2 = y1; - - ex2 = x2 + dwx; - ey2 = y2; - - DC->DrawLine( sx2, sy2, ex2, ey2 ); - } - else if( dy == 0 ) /* segment horizontal */ - { - dwy = radius; - if( dx < 0 ) - dwy = -dwy; - - sx1 = x1; - sy1 = y1 - dwy; - - ex1 = x2; - ey1 = y2 - dwy; - - DC->DrawLine( sx1, sy1, ex1, ey1 ); - - sx2 = x1; - sy2 = y1 + dwy; - - ex2 = x2; - ey2 = y2 + dwy; - - DC->DrawLine( sx2, sy2, ex2, ey2 ); - } + if( !mirrored ) + DC->DrawArc( end, start, org ); else - { - if( std::abs( dx ) == std::abs( dy ) ) // segment 45 degrees - { - dwx = dwy = ( (width * 5) + 4 ) / 7; // = width / 2 * 0.707 - if( dy < 0 ) - { - if( dx <= 0 ) - { - dwx = -dwx; swap_ends = true; - } - } - else // dy >= 0 - { - if( dx > 0 ) - { - dwy = -dwy; swap_ends = true; - } - else - swap_ends = true; - } - } - else - { - double delta_angle = ArcTangente( dy, dx ); - dwx = 0; - dwy = width; - RotatePoint( &dwx, &dwy, -delta_angle ); - } - dwx2 = dwx >> 1; - dwy2 = dwy >> 1; + DC->DrawArc( start, end, org ); - sx1 = x1 - dwx2; - sy1 = y1 - dwy2; - ex1 = x2 - dwx2; - ey1 = y2 - dwy2; + // second edge + start.x = len; + start.y = -radius; + RotatePoint( &start, angle); + start += org; - DC->DrawLine( sx1, sy1, ex1, ey1 ); + DC->DrawLine( start, end ); - sx2 = x1 + dwx2; - sy2 = y1 + dwy2; + // second rounded end + end.x = len; + end.y = radius; + RotatePoint( &end, angle); + end += org; - ex2 = x2 + dwx2; - ey2 = y2 + dwy2; - - DC->DrawLine( sx2, sy2, ex2, ey2 ); - } - - if( swap_ends ) - { - DC->DrawArc( sx2, sy2, sx1, sy1, x1, y1 ); - DC->DrawArc( ex1, ey1, ex2, ey2, x2, y2 ); - } + if( !mirrored ) + DC->DrawArc( end.x, end.y, start.x, start.y, x2, y2 ); else - { - DC->DrawArc( sx1, sy1, sx2, sy2, x1, y1 ); - DC->DrawArc( ex2, ey2, ex1, ey1, x2, y2 ); - } + DC->DrawArc( start.x, start.y, end.x, end.y, x2, y2 ); } diff --git a/pcbnew/class_edge_mod.cpp b/pcbnew/class_edge_mod.cpp index 7513096095..ede9d43564 100644 --- a/pcbnew/class_edge_mod.cpp +++ b/pcbnew/class_edge_mod.cpp @@ -200,8 +200,16 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, StAngle = ArcTangente( dy - uy0, dx - ux0 ); EndAngle = StAngle + m_Angle; - if( StAngle > EndAngle ) - EXCHG( StAngle, EndAngle ); + if( !panel->GetPrintMirrored() ) + { + if( StAngle > EndAngle ) + EXCHG( StAngle, EndAngle ); + } + else // Mirrored mode: arc orientation is reversed + { + if( StAngle < EndAngle ) + EXCHG( StAngle, EndAngle ); + } if( typeaff == LINE ) { diff --git a/pcbnew/printout_controler.cpp b/pcbnew/printout_controler.cpp index 7be6b40d3c..3ee6e390f0 100644 --- a/pcbnew/printout_controler.cpp +++ b/pcbnew/printout_controler.cpp @@ -282,7 +282,7 @@ void BOARD_PRINTOUT_CONTROLLER::DrawPage() if( printMirror ) { // Calculate the mirrored center of the board. - center.y = m_Parent->GetPageSizeIU().y - boardBoundingBox.Centre().y; + center.x = m_Parent->GetPageSizeIU().x - boardBoundingBox.Centre().x; } offset += center; @@ -301,21 +301,29 @@ void BOARD_PRINTOUT_CONTROLLER::DrawPage() screen->m_IsPrinting = true; EDA_COLOR_T bg_color = g_DrawBgColor; + // Print frame reference, if reqquested, before + if( m_PrintParams.m_Print_Black_and_White ) + GRForceBlackPen( true ); + + if( m_PrintParams.PrintBorderAndTitleBlock() ) + m_Parent->DrawWorkSheet( dc, screen, m_PrintParams.m_PenDefaultSize, + IU_PER_MILS, titleblockFilename ); + if( printMirror ) { - // To plot mirror, we reverse the y axis, and modify the plot y origin - dc->SetAxisOrientation( true, true ); + // To plot mirror, we reverse the x axis, and modify the plot x origin + dc->SetAxisOrientation( false, false); - /* Plot offset y is moved by the y plot area size in order to have + /* Plot offset x is moved by the x plot area size in order to have * the old draw area in the new draw area, because the draw origin has not moved - * (this is the upper left corner) but the Y axis is reversed, therefore the plotting area - * is the y coordinate values from - PlotAreaSize.y to 0 */ - int y_dc_offset = PlotAreaSizeInPixels.y; - y_dc_offset = KiROUND( y_dc_offset * userscale ); - dc->SetDeviceOrigin( 0, y_dc_offset ); + * (this is the upper left corner) but the X axis is reversed, therefore the plotting area + * is the x coordinate values from - PlotAreaSize.x to 0 */ + int x_dc_offset = PlotAreaSizeInPixels.x; + x_dc_offset = KiROUND( x_dc_offset * userscale ); + dc->SetDeviceOrigin( x_dc_offset, 0 ); wxLogTrace( tracePrinting, wxT( "Device origin: x=%d, y=%d" ), - 0, y_dc_offset ); + x_dc_offset, 0 ); panel->SetClipBox( EDA_RECT( wxPoint( -MAX_VALUE/2, -MAX_VALUE/2 ), panel->GetClipBox()->GetSize() ) ); @@ -359,13 +367,9 @@ void BOARD_PRINTOUT_CONTROLLER::DrawPage() printMirror, &m_PrintParams ); GRForceBlackPen( false ); } - - if( m_PrintParams.m_Print_Black_and_White ) + else GRForceBlackPen( true ); - if( m_PrintParams.PrintBorderAndTitleBlock() ) - m_Parent->DrawWorkSheet( dc, screen, m_PrintParams.m_PenDefaultSize, - IU_PER_MILS, titleblockFilename ); #if defined (GERBVIEW) // In B&W mode, do not force black pen for Gerbview From b4f6cc45f2185547ea7bda73633656c24af26964 Mon Sep 17 00:00:00 2001 From: Fabrizio Tappero Date: Wed, 12 Feb 2014 14:56:52 +0100 Subject: [PATCH 05/11] Some icons update --- bitmaps_png/cpp_26/find.cpp | 168 +- bitmaps_png/cpp_26/new_pcb.cpp | 125 +- bitmaps_png/cpp_48/icon_bitmap2component.cpp | 165 +- bitmaps_png/sources/find.svg | 435 +++- bitmaps_png/sources/icon_bitmap2component.svg | 1489 +----------- bitmaps_png/sources/new_pcb.svg | 2045 +++++++---------- 6 files changed, 1421 insertions(+), 3006 deletions(-) diff --git a/bitmaps_png/cpp_26/find.cpp b/bitmaps_png/cpp_26/find.cpp index d223aedacc..e57d2a01de 100644 --- a/bitmaps_png/cpp_26/find.cpp +++ b/bitmaps_png/cpp_26/find.cpp @@ -8,84 +8,96 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, - 0xce, 0x00, 0x00, 0x04, 0xbb, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x4b, 0x6c, 0x1b, - 0x55, 0x14, 0x86, 0xbf, 0x7b, 0x67, 0xfc, 0x4a, 0x1c, 0xdb, 0x72, 0xd3, 0x34, 0x4a, 0xe3, 0x28, - 0xa5, 0xb1, 0xe2, 0x3a, 0x21, 0x88, 0x22, 0x0a, 0x34, 0x52, 0xda, 0xaa, 0xa2, 0x5d, 0x20, 0xd2, - 0xec, 0x40, 0xa2, 0x11, 0x0b, 0x58, 0x50, 0x56, 0xac, 0x91, 0x8a, 0x58, 0x21, 0x58, 0x74, 0xd3, - 0x15, 0xad, 0x94, 0x45, 0x57, 0x45, 0x42, 0x42, 0x65, 0x55, 0xb1, 0xa0, 0x40, 0xc5, 0x06, 0xa5, - 0x4f, 0x35, 0xcd, 0x4b, 0x4e, 0x1f, 0x4e, 0x5b, 0x8b, 0x46, 0x69, 0x1c, 0xb7, 0x71, 0x33, 0x9e, - 0xc7, 0x61, 0x41, 0xc6, 0xb2, 0x63, 0x07, 0xe8, 0x86, 0x2b, 0xfd, 0x9a, 0x3b, 0x9a, 0x3b, 0xf7, - 0x3f, 0xff, 0x39, 0x67, 0xfe, 0x3b, 0x4a, 0x44, 0xf8, 0x3f, 0x86, 0x09, 0x70, 0xf6, 0xec, 0xd9, - 0xf3, 0x4a, 0xa9, 0xf7, 0x4d, 0xd3, 0xc4, 0x30, 0x0c, 0x44, 0x04, 0xc7, 0x71, 0x70, 0x5d, 0x17, - 0xc7, 0x71, 0xaa, 0x78, 0xd1, 0x7b, 0xad, 0xf5, 0xb7, 0x13, 0x13, 0x13, 0x27, 0x00, 0x38, 0x7d, - 0xfa, 0x74, 0xec, 0xcc, 0x99, 0x33, 0x15, 0xdb, 0xb6, 0xc5, 0x75, 0xdd, 0xa6, 0x70, 0x1c, 0xa7, - 0x0a, 0xdb, 0xb6, 0xeb, 0x50, 0xa9, 0x54, 0xaa, 0xb0, 0x2c, 0xab, 0x8a, 0x52, 0xa9, 0x24, 0xe3, - 0xe3, 0xe3, 0x9e, 0x88, 0x20, 0x22, 0x98, 0xae, 0xeb, 0x6a, 0xad, 0xb5, 0xa7, 0x94, 0x22, 0x9f, - 0xcf, 0xa3, 0x94, 0x02, 0x40, 0x29, 0x55, 0x37, 0x6f, 0x76, 0xdd, 0x6a, 0x68, 0xad, 0x49, 0x24, - 0x12, 0x88, 0x88, 0xaa, 0x4b, 0x9d, 0xe7, 0x79, 0x4d, 0x37, 0x6f, 0x36, 0xff, 0x2f, 0x44, 0xcd, - 0x9e, 0x9b, 0x00, 0xae, 0xeb, 0x02, 0x50, 0x2a, 0x95, 0x58, 0x59, 0x59, 0xa1, 0xa7, 0xa7, 0x07, - 0xad, 0x35, 0x0b, 0x0b, 0x0b, 0x6c, 0x6e, 0x96, 0x7f, 0x22, 0x11, 0x11, 0xfa, 0xfb, 0xfb, 0xab, - 0x6b, 0x6a, 0xdf, 0x6d, 0x50, 0xd4, 0xd7, 0xd7, 0x47, 0x28, 0x14, 0xa2, 0x5c, 0x2e, 0x93, 0x4e, - 0xa7, 0x5f, 0x28, 0x7d, 0x22, 0x82, 0xd6, 0x1a, 0xad, 0x75, 0x23, 0xd1, 0xea, 0xea, 0x2a, 0x89, - 0x44, 0x02, 0x80, 0x44, 0x22, 0x81, 0x52, 0x0a, 0xcb, 0xb2, 0x50, 0x4a, 0x91, 0xcb, 0xe5, 0xea, - 0x16, 0x6f, 0xde, 0x5c, 0x44, 0x18, 0x18, 0x18, 0xd8, 0x32, 0x75, 0x0d, 0x8a, 0x5c, 0xd7, 0x45, - 0x44, 0x50, 0x4a, 0x55, 0x1f, 0x2a, 0xa5, 0x48, 0xa7, 0xd3, 0xd5, 0xe8, 0x9a, 0x35, 0x87, 0xaf, - 0x60, 0x33, 0xb9, 0xbf, 0xb6, 0x81, 0xc8, 0x71, 0x9c, 0xa6, 0x11, 0xfd, 0x9b, 0xa2, 0x66, 0x0a, - 0xb3, 0xd9, 0x6c, 0xf5, 0xde, 0x2f, 0x49, 0x43, 0x33, 0xf8, 0x91, 0xf8, 0x1b, 0xf8, 0x85, 0xad, - 0x55, 0x92, 0xcb, 0xe5, 0xb0, 0x6d, 0x9b, 0xb6, 0xb6, 0x36, 0x4c, 0xd3, 0xa4, 0x58, 0x2c, 0xb2, - 0xbe, 0xbe, 0x4e, 0x36, 0x9b, 0x25, 0x14, 0x0a, 0xd5, 0x29, 0x6c, 0x20, 0xb2, 0x6d, 0xbb, 0x4e, - 0xb2, 0xbf, 0xf1, 0xfc, 0xfc, 0x7c, 0x55, 0x91, 0x65, 0x59, 0x88, 0x08, 0x83, 0x43, 0xaf, 0xf0, - 0xd3, 0xd5, 0x87, 0x4c, 0xdd, 0x5c, 0xc2, 0x71, 0x3c, 0xd2, 0xdd, 0x09, 0xde, 0x79, 0xa3, 0x8f, - 0xc5, 0xc5, 0xfb, 0x14, 0x0a, 0x05, 0x46, 0x46, 0x46, 0x30, 0x0c, 0xa3, 0x91, 0xa8, 0x58, 0x2c, - 0x12, 0x8b, 0xc5, 0xea, 0xd2, 0xb1, 0x59, 0x91, 0xe7, 0x79, 0xcc, 0xcc, 0xcc, 0xd0, 0xb2, 0xbd, - 0x97, 0x93, 0xe7, 0xae, 0x71, 0x6c, 0x64, 0x0f, 0x1f, 0x0e, 0xec, 0xc2, 0xb2, 0x3d, 0xee, 0x14, - 0x56, 0xf9, 0xea, 0xbb, 0x9b, 0x1c, 0x7d, 0xb5, 0x93, 0x3d, 0xe9, 0x34, 0x4b, 0x4b, 0x4b, 0x74, - 0x76, 0x76, 0x36, 0x57, 0xe4, 0x38, 0x4e, 0xc3, 0x47, 0x09, 0x30, 0x37, 0x37, 0x87, 0x88, 0xf0, - 0xf8, 0xf1, 0x63, 0x5e, 0x7f, 0x73, 0x98, 0x2f, 0xce, 0x5d, 0xe5, 0xb3, 0xf7, 0xf6, 0xd1, 0xb5, - 0x2d, 0x8a, 0xe3, 0x7a, 0x94, 0x2d, 0x9b, 0x4c, 0x77, 0x8c, 0x64, 0x6c, 0x88, 0xef, 0x7f, 0xbe, - 0x4d, 0x3a, 0xd5, 0xcf, 0xfd, 0x85, 0x5b, 0x74, 0x74, 0x74, 0x6c, 0x5d, 0xa3, 0x66, 0xa9, 0xcb, - 0x64, 0x32, 0x68, 0xad, 0xb1, 0x2c, 0x8b, 0x1f, 0x7e, 0xbf, 0xcb, 0xdb, 0x6f, 0xf5, 0x13, 0x8f, - 0x46, 0x70, 0x3c, 0x01, 0xa5, 0x09, 0x06, 0x02, 0x78, 0x68, 0x44, 0x2a, 0xbc, 0x36, 0xd8, 0xc3, - 0xc4, 0xc5, 0x69, 0x4e, 0x1c, 0xdd, 0xc5, 0xf2, 0xf2, 0x32, 0x91, 0x48, 0xa4, 0xb9, 0xa2, 0x66, - 0x63, 0x7e, 0x7e, 0x1e, 0xdb, 0xb6, 0x31, 0x4d, 0x93, 0x85, 0x47, 0x25, 0x76, 0xf7, 0xec, 0xe0, - 0xe9, 0xb3, 0x32, 0xeb, 0xa6, 0x42, 0x21, 0xb8, 0xae, 0xc7, 0xda, 0xba, 0xcd, 0x83, 0x47, 0x4b, - 0xd8, 0x15, 0xe1, 0xb9, 0xe5, 0x10, 0x0e, 0x87, 0x29, 0x14, 0x0a, 0x74, 0x77, 0x77, 0xd7, 0xfb, - 0x5f, 0xb1, 0x58, 0xac, 0x76, 0xdd, 0xe6, 0x3a, 0x65, 0x32, 0x19, 0x32, 0x99, 0x0c, 0x86, 0x61, - 0x60, 0x1a, 0x0a, 0xcc, 0x20, 0xda, 0x0c, 0x12, 0x0c, 0x86, 0x88, 0x44, 0x22, 0x44, 0x5a, 0x5a, - 0xc0, 0x0c, 0x93, 0xda, 0xd9, 0x49, 0x57, 0xe7, 0x76, 0x42, 0xc1, 0x00, 0x96, 0x65, 0xe1, 0x79, - 0x5e, 0x43, 0x19, 0xaa, 0x8a, 0x6a, 0x53, 0xe7, 0x8f, 0xd9, 0xd9, 0x59, 0x3c, 0xcf, 0x63, 0x6d, - 0x6d, 0x8d, 0xc1, 0xde, 0x76, 0xae, 0xdc, 0xbe, 0xc7, 0xb3, 0xd5, 0x36, 0xa2, 0x21, 0x8d, 0x16, - 0x07, 0x25, 0x36, 0xcf, 0x6d, 0xc5, 0xba, 0xa3, 0x58, 0x29, 0x7b, 0x84, 0x03, 0x42, 0xb9, 0x5c, - 0x26, 0x99, 0x4c, 0x36, 0x3a, 0xba, 0xdf, 0xde, 0x00, 0x4f, 0x9e, 0x3c, 0x61, 0x7a, 0x7a, 0x1a, - 0xcb, 0xb2, 0xaa, 0x35, 0x1a, 0x1c, 0x1c, 0x44, 0x6b, 0xcd, 0xb1, 0xfd, 0xbb, 0x78, 0xf8, 0xe7, - 0x53, 0x08, 0x44, 0x69, 0x8d, 0x6f, 0x63, 0xfb, 0x8e, 0x9d, 0x74, 0xa5, 0x76, 0xd3, 0xd3, 0xd3, - 0x4b, 0x47, 0x67, 0x17, 0x33, 0xf9, 0xa7, 0x7c, 0x3a, 0x3a, 0xc4, 0xf5, 0xeb, 0xd7, 0x49, 0xa5, - 0x52, 0xcd, 0xdd, 0xdb, 0xaf, 0x91, 0x61, 0x18, 0xa4, 0xd3, 0x69, 0x5a, 0x5b, 0x5b, 0xa9, 0x54, - 0x2a, 0xcc, 0xce, 0xce, 0x22, 0x22, 0x84, 0xc3, 0x61, 0x2e, 0x5f, 0xfe, 0x8d, 0x93, 0xe3, 0x07, - 0xf8, 0xe6, 0xfc, 0x24, 0xd1, 0x48, 0x80, 0x9d, 0xed, 0x61, 0xa2, 0xad, 0x11, 0xd6, 0x2a, 0x26, - 0x53, 0xb9, 0x02, 0x9f, 0xbc, 0x3b, 0x40, 0x40, 0x39, 0x58, 0x96, 0xc5, 0xe4, 0xe4, 0x24, 0xc3, - 0xc3, 0xc3, 0xf5, 0x44, 0xc5, 0x62, 0x91, 0x78, 0x3c, 0x8e, 0x88, 0x10, 0x8f, 0xc7, 0xd1, 0x5a, - 0x57, 0x15, 0xf6, 0xf7, 0xf7, 0x63, 0x18, 0x06, 0x4a, 0x29, 0x8a, 0xc5, 0x22, 0xd7, 0xfe, 0xb8, - 0xcc, 0x97, 0xe3, 0xc3, 0xdc, 0x5b, 0x5a, 0xe7, 0xd6, 0x9d, 0x65, 0xca, 0x65, 0x9b, 0x97, 0x5f, - 0x4a, 0xf0, 0xc1, 0x81, 0x7d, 0x5c, 0xbd, 0x32, 0x89, 0x93, 0x48, 0x10, 0x0a, 0x85, 0xc8, 0xe7, - 0xf3, 0x2c, 0x2e, 0x2e, 0x36, 0xa6, 0xae, 0xb6, 0xeb, 0x6a, 0xbd, 0xad, 0xd6, 0x50, 0x93, 0xc9, - 0x24, 0x87, 0x0f, 0x1f, 0x26, 0x97, 0xcb, 0xf1, 0x60, 0xee, 0x0a, 0xa9, 0xd0, 0x12, 0x43, 0x1d, - 0xcf, 0x59, 0xbe, 0x7b, 0x8d, 0x5f, 0x7f, 0xb9, 0x44, 0xa9, 0x54, 0x22, 0x9f, 0xcf, 0xfb, 0x27, - 0x2b, 0x22, 0x42, 0x7b, 0x7b, 0x3b, 0xa3, 0xa3, 0xa3, 0x2d, 0x00, 0x66, 0x20, 0x10, 0x10, 0xcb, - 0xb2, 0xb4, 0xaf, 0xa8, 0xd6, 0xa7, 0x6a, 0x7d, 0xcb, 0x0f, 0x60, 0xef, 0xde, 0xbd, 0x78, 0x9e, - 0x87, 0xeb, 0xba, 0xd8, 0xb6, 0x5d, 0xb5, 0x1b, 0xa5, 0x14, 0x97, 0x2e, 0xfd, 0x4d, 0xd8, 0xd6, - 0xd6, 0x46, 0xa5, 0x52, 0xe1, 0xe0, 0xc1, 0x83, 0x4c, 0x4d, 0x4d, 0xcd, 0x1f, 0x39, 0x72, 0x64, - 0x9f, 0x02, 0x92, 0x63, 0x63, 0x63, 0x3f, 0x2a, 0xa5, 0xf6, 0xfb, 0x2f, 0xd5, 0xda, 0xbd, 0x3f, - 0xf7, 0x3c, 0xaf, 0xee, 0xea, 0xc3, 0x3f, 0x0e, 0x6a, 0x8f, 0x86, 0x43, 0x87, 0x0e, 0xe9, 0xde, - 0xde, 0x5e, 0x5a, 0x5a, 0x5a, 0x48, 0xa5, 0x52, 0x9c, 0x3a, 0x75, 0xea, 0xa2, 0x09, 0x78, 0x17, - 0x2e, 0x5c, 0xf8, 0x38, 0x16, 0x8b, 0xf5, 0x2a, 0xa5, 0xa2, 0x7e, 0x83, 0x00, 0x0a, 0x10, 0x40, - 0x89, 0x88, 0x29, 0x22, 0x06, 0x60, 0x88, 0x88, 0x21, 0x22, 0xda, 0x9f, 0x6f, 0xa4, 0x5f, 0x01, - 0x9e, 0x52, 0xca, 0x03, 0xec, 0x1b, 0x37, 0x6e, 0xc4, 0x8e, 0x1f, 0x3f, 0xfe, 0xf9, 0xd8, 0xd8, - 0x58, 0x3c, 0x1a, 0x8d, 0x12, 0x0c, 0x06, 0x5d, 0xb5, 0x11, 0x8d, 0x06, 0xc2, 0x1b, 0x08, 0x6e, - 0xf5, 0x73, 0xb3, 0x11, 0x84, 0xb1, 0x01, 0x5d, 0x43, 0xc2, 0x46, 0x50, 0x02, 0xb8, 0xc0, 0x7a, - 0x2a, 0x95, 0xf2, 0xb2, 0xd9, 0xec, 0x47, 0xf1, 0x78, 0x3c, 0xb9, 0xbc, 0xbc, 0xfc, 0xf5, 0x5f, - 0x8c, 0x86, 0xc8, 0x61, 0x09, 0x89, 0x45, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, - 0xae, 0x42, 0x60, 0x82, + 0xce, 0x00, 0x00, 0x05, 0x7d, 0x49, 0x44, 0x41, 0x54, 0x48, 0x4b, 0xbd, 0x95, 0xd9, 0x4f, 0x54, + 0x67, 0x18, 0xc6, 0x69, 0xaf, 0x9a, 0x36, 0x05, 0xda, 0x9b, 0x36, 0xbd, 0xed, 0x45, 0xfb, 0x87, + 0x34, 0xe9, 0x0d, 0x91, 0x75, 0x2c, 0xbb, 0x06, 0x4c, 0x34, 0x46, 0x22, 0x2d, 0x09, 0x04, 0x90, + 0xcd, 0x85, 0x04, 0x8b, 0x28, 0x16, 0x94, 0x4d, 0x36, 0x45, 0x10, 0x18, 0x86, 0x75, 0x70, 0x1a, + 0xa2, 0xec, 0xc8, 0x80, 0xc8, 0x3e, 0x08, 0x38, 0x1b, 0x30, 0x2c, 0xb3, 0x00, 0x0e, 0xe8, 0x08, + 0xd2, 0xa7, 0xdf, 0xfb, 0xea, 0x39, 0x72, 0xac, 0x4d, 0xd3, 0x34, 0xe9, 0x24, 0xcf, 0xcc, 0x9c, + 0x93, 0x73, 0xbe, 0xdf, 0xf7, 0xbc, 0xdb, 0xe7, 0x05, 0xc0, 0xeb, 0xff, 0x10, 0x7f, 0x15, 0x17, + 0x17, 0xd7, 0x96, 0x94, 0x94, 0xa0, 0xbc, 0xbc, 0x1c, 0x55, 0x55, 0x55, 0xa8, 0xac, 0xac, 0x44, + 0x59, 0x59, 0x19, 0xc4, 0x7d, 0x14, 0x16, 0x16, 0x22, 0x3f, 0x3f, 0x1f, 0x57, 0xae, 0x5c, 0xc1, + 0xe5, 0xcb, 0x97, 0x91, 0x9d, 0x9d, 0x8d, 0xf3, 0xe7, 0xcf, 0x23, 0x3d, 0x3d, 0x1d, 0xa9, 0xa9, + 0xa9, 0x48, 0x4a, 0x4a, 0x42, 0x42, 0x42, 0x02, 0xce, 0x9e, 0x3d, 0x8b, 0x33, 0x67, 0xce, 0xe0, + 0xd4, 0xa9, 0x53, 0x38, 0x71, 0xe2, 0x04, 0x8e, 0x1f, 0x3f, 0x8e, 0x98, 0x98, 0x98, 0x9b, 0x32, + 0xe8, 0xfa, 0xf5, 0xeb, 0xde, 0x62, 0xc1, 0xbd, 0xfd, 0xfd, 0x7d, 0x1c, 0x1c, 0x1c, 0x7c, 0x50, + 0xaf, 0x5f, 0xbf, 0x96, 0x45, 0xcf, 0x1d, 0xd6, 0xde, 0xde, 0x9e, 0xac, 0x57, 0xaf, 0x5e, 0xc9, + 0x7a, 0xfe, 0xfc, 0x39, 0xa2, 0xa2, 0xa2, 0xfe, 0x90, 0x41, 0x57, 0xaf, 0x5e, 0xf5, 0x2d, 0x2d, + 0x2d, 0xf5, 0xd0, 0x22, 0x26, 0x93, 0x09, 0x66, 0xb3, 0x99, 0x65, 0xb1, 0x58, 0x60, 0xb5, 0x5a, + 0x59, 0x4b, 0x4b, 0x4b, 0x18, 0x1e, 0x1e, 0x46, 0x7b, 0x7b, 0x3b, 0x6e, 0xdf, 0xbe, 0xcd, 0xce, + 0x6b, 0x6b, 0x6b, 0xa1, 0xd3, 0xe9, 0x30, 0x3d, 0x3d, 0x8d, 0x95, 0x95, 0x15, 0x85, 0x56, 0x57, + 0x57, 0xf1, 0xf2, 0xe5, 0x4b, 0x44, 0x46, 0x46, 0x42, 0x01, 0x12, 0x8e, 0x18, 0x24, 0x01, 0x24, + 0x08, 0x01, 0xe6, 0xe7, 0xe7, 0x51, 0x53, 0x53, 0x83, 0xb1, 0xb1, 0x31, 0x38, 0x1c, 0x0e, 0x6c, + 0x6f, 0x6f, 0xc3, 0xe1, 0xda, 0xc4, 0xd6, 0xd6, 0x16, 0xd6, 0xd6, 0xd6, 0xa0, 0x56, 0xab, 0x79, + 0x03, 0xf4, 0xac, 0xcd, 0x66, 0x63, 0xd1, 0xfd, 0x0f, 0x82, 0x6e, 0xdc, 0xb8, 0xc1, 0xa0, 0xc9, + 0xc9, 0x49, 0xf4, 0xf4, 0xf4, 0xb0, 0x33, 0x82, 0x69, 0xb5, 0x5a, 0xdc, 0xbd, 0x7b, 0x17, 0x9b, + 0x9b, 0x9b, 0x68, 0xed, 0x99, 0x46, 0x58, 0x66, 0x33, 0x82, 0x52, 0x9b, 0xa0, 0x4a, 0xd7, 0x20, + 0xe4, 0x5c, 0x13, 0x7e, 0xc9, 0xd7, 0xc1, 0xb6, 0xe1, 0xe2, 0xcd, 0x88, 0x35, 0xd0, 0xd5, 0xd5, + 0xc5, 0x8e, 0xd6, 0xd7, 0xd7, 0x19, 0x14, 0x11, 0x11, 0xa1, 0x04, 0x15, 0x14, 0x14, 0x30, 0x68, + 0x6a, 0x6a, 0x8a, 0x1f, 0xa4, 0x9d, 0x93, 0x3b, 0x2a, 0x0c, 0x72, 0x10, 0x2f, 0x16, 0x8c, 0xc9, + 0xe9, 0x84, 0x76, 0xc4, 0x8a, 0x09, 0xa3, 0x13, 0xa6, 0x75, 0x37, 0x9e, 0x2e, 0x6f, 0xa1, 0xee, + 0xe1, 0x02, 0x02, 0x52, 0xd4, 0xe8, 0x7d, 0xbc, 0x88, 0xd9, 0xd9, 0x59, 0xb4, 0xb4, 0xb4, 0x30, + 0xc4, 0x6e, 0xb7, 0x33, 0x28, 0x3c, 0x3c, 0xfc, 0x1d, 0x28, 0x33, 0x33, 0xd3, 0xf7, 0xda, 0xb5, + 0x6b, 0x0c, 0x92, 0xec, 0x13, 0x4c, 0xa3, 0xd1, 0xc0, 0x68, 0x34, 0xa2, 0xac, 0x59, 0x8f, 0x58, + 0x01, 0x69, 0x1b, 0x5a, 0xc4, 0xe3, 0xf9, 0x35, 0xcc, 0x5a, 0x1c, 0x30, 0xad, 0x8a, 0xb0, 0xb9, + 0x76, 0x61, 0x73, 0xb8, 0xd1, 0x33, 0xb5, 0x0a, 0xff, 0x64, 0x35, 0xec, 0xae, 0x6d, 0x34, 0x34, + 0x34, 0x70, 0x54, 0x68, 0xa3, 0x04, 0x0a, 0x0b, 0x0b, 0x53, 0x82, 0x44, 0xe9, 0x7a, 0xa8, 0x82, + 0x96, 0x97, 0x97, 0xe5, 0x84, 0x8a, 0xfb, 0x70, 0x8a, 0x5c, 0xd0, 0x22, 0x45, 0x5a, 0x03, 0x3a, + 0x47, 0x97, 0xd8, 0xcd, 0x9c, 0x70, 0x62, 0x5a, 0x73, 0x63, 0xc9, 0xbe, 0xc3, 0x32, 0x0b, 0x77, + 0x85, 0x2d, 0x93, 0xb8, 0x54, 0xd9, 0x83, 0xb9, 0xb9, 0x39, 0xb4, 0xb6, 0xb6, 0xc2, 0xe9, 0x74, + 0xc2, 0xe3, 0xf1, 0x20, 0x34, 0x34, 0x54, 0x09, 0xca, 0xc9, 0xc9, 0x51, 0x80, 0x9e, 0x3d, 0x7b, + 0xc6, 0xa0, 0xc1, 0x27, 0x0b, 0x88, 0xbe, 0xd8, 0x86, 0x5f, 0xef, 0xe9, 0x51, 0xdc, 0x36, 0x8e, + 0xc1, 0x99, 0x15, 0x8c, 0x0a, 0x57, 0x93, 0x46, 0x3b, 0x66, 0xcd, 0x76, 0x18, 0x2c, 0x76, 0xcc, + 0x98, 0xd6, 0xd1, 0x31, 0x60, 0x40, 0x44, 0x96, 0x86, 0x0b, 0xe8, 0xd6, 0xad, 0x5b, 0x32, 0xe8, + 0xe8, 0xd1, 0xa3, 0x4a, 0x90, 0x68, 0x42, 0x06, 0x11, 0x84, 0x42, 0xd7, 0xdb, 0xdb, 0x8b, 0xdc, + 0xdc, 0x5c, 0xdc, 0xd1, 0x8e, 0x22, 0xee, 0xb7, 0x07, 0x28, 0xee, 0x9c, 0x63, 0xb5, 0xe9, 0xad, + 0x18, 0x59, 0xb0, 0x63, 0x5c, 0x38, 0x9b, 0xb5, 0x8a, 0x22, 0x58, 0xd9, 0xc2, 0xa2, 0xd0, 0xe3, + 0xf9, 0x75, 0x84, 0x65, 0x68, 0x38, 0xf4, 0xa2, 0x2f, 0xe1, 0x72, 0xb9, 0x18, 0x14, 0x12, 0x12, + 0xa2, 0x04, 0x65, 0x65, 0x65, 0x79, 0xa8, 0xe1, 0x08, 0x42, 0x3d, 0x40, 0x89, 0x8d, 0x8b, 0x8b, + 0xc3, 0x83, 0x47, 0xd3, 0x88, 0xbc, 0xd0, 0x82, 0xdc, 0xfa, 0x11, 0x59, 0xd5, 0xbf, 0xcf, 0xe0, + 0xe1, 0x13, 0x33, 0x06, 0xa6, 0x2c, 0x18, 0x9e, 0xb6, 0x60, 0x64, 0xc6, 0x8c, 0xd6, 0xee, 0x31, + 0x44, 0xbe, 0x75, 0x54, 0x54, 0x54, 0xc4, 0xa5, 0x4f, 0xa0, 0xa0, 0xa0, 0xa0, 0x77, 0xa0, 0xf8, + 0xf8, 0x78, 0x5f, 0x31, 0x4e, 0x64, 0x10, 0xf5, 0x00, 0x55, 0x0e, 0x55, 0x8c, 0x75, 0x69, 0x19, + 0x7e, 0x49, 0x0d, 0xec, 0xa6, 0xe4, 0xfe, 0x53, 0x59, 0x77, 0x1e, 0x2c, 0xa2, 0x5d, 0x6f, 0x41, + 0xef, 0xe4, 0x0a, 0x1e, 0x19, 0x6c, 0xa8, 0xd2, 0x4d, 0xe1, 0x62, 0xf9, 0x43, 0xce, 0x51, 0x63, + 0x63, 0xa3, 0x0c, 0x0a, 0x08, 0x08, 0x50, 0x82, 0x52, 0x52, 0x52, 0x38, 0x74, 0xe4, 0x46, 0x02, + 0xd1, 0x2c, 0x1b, 0x1a, 0x1a, 0x42, 0x91, 0xfa, 0x91, 0xa8, 0x3a, 0xad, 0xc2, 0x55, 0xbe, 0x5a, + 0x8f, 0xa2, 0xe6, 0x61, 0x54, 0xb4, 0x0d, 0xa3, 0xe6, 0xfe, 0x08, 0x54, 0x69, 0x1a, 0xac, 0x6e, + 0x38, 0x51, 0x5f, 0x5f, 0x8f, 0xf1, 0xf1, 0x71, 0x6e, 0x09, 0x02, 0x1d, 0x39, 0x72, 0x44, 0x09, + 0x12, 0x83, 0x91, 0x1d, 0x49, 0x90, 0x8d, 0x8d, 0x0d, 0x18, 0x0c, 0x06, 0x1c, 0x3b, 0x76, 0x8c, + 0x9b, 0x35, 0x2e, 0x4f, 0x8b, 0xa8, 0x4b, 0x5a, 0xdc, 0xd4, 0xce, 0xa1, 0x54, 0x37, 0x8f, 0x8a, + 0xae, 0x05, 0xdc, 0xeb, 0x33, 0xa2, 0x40, 0x54, 0x1b, 0x35, 0x70, 0xff, 0xb8, 0x91, 0x1b, 0x5c, + 0xb4, 0x09, 0xfa, 0xfb, 0xfb, 0x79, 0xce, 0x51, 0x79, 0xfb, 0xf9, 0xf9, 0x29, 0x41, 0x62, 0xfa, + 0xfe, 0x05, 0x44, 0xbf, 0x34, 0xb9, 0xd3, 0xd2, 0xd2, 0xde, 0x4c, 0x86, 0xde, 0x19, 0xa8, 0xce, + 0xa9, 0x45, 0xb9, 0x37, 0x20, 0x38, 0x55, 0xcd, 0xfa, 0x39, 0xff, 0x3e, 0xd6, 0x1c, 0x5b, 0xfc, + 0xbc, 0x5e, 0xaf, 0xe7, 0x86, 0xad, 0xae, 0xae, 0xe6, 0x89, 0xf2, 0xe2, 0xc5, 0x0b, 0x25, 0x48, + 0x8c, 0x73, 0x5f, 0x01, 0x53, 0x80, 0xa8, 0xb3, 0xe9, 0x65, 0x6a, 0xbc, 0xe6, 0xe6, 0x66, 0x9e, + 0x59, 0xb4, 0x53, 0x8a, 0xbd, 0x7b, 0x67, 0x87, 0x9b, 0x73, 0x77, 0x77, 0x97, 0x9f, 0xa3, 0xbe, + 0xa1, 0xbc, 0xd0, 0xa0, 0xcd, 0xc8, 0xc8, 0xe0, 0x69, 0x42, 0x21, 0x24, 0xf9, 0xfb, 0xfb, 0x2b, + 0x41, 0xe2, 0x1c, 0xf1, 0xd0, 0x68, 0x97, 0xdc, 0x48, 0x20, 0x5a, 0x9c, 0x4a, 0xbd, 0xb3, 0xb3, + 0x13, 0x89, 0x89, 0x89, 0x5c, 0x20, 0xd1, 0xd1, 0xd1, 0x7c, 0xf6, 0x9c, 0x3c, 0x79, 0x12, 0xc9, + 0xc9, 0xc9, 0xa8, 0xab, 0xab, 0x63, 0xe7, 0x4d, 0x4d, 0x4d, 0x5c, 0x71, 0x14, 0x01, 0x3a, 0xc7, + 0xe8, 0x9a, 0x7a, 0x51, 0x9c, 0x61, 0xdf, 0xc8, 0x20, 0xf1, 0x12, 0x83, 0x28, 0x2f, 0xdd, 0xdd, + 0xdd, 0xdc, 0xb8, 0x92, 0x23, 0xea, 0x09, 0x0a, 0x1d, 0xb9, 0xa1, 0x24, 0x93, 0x6b, 0x2a, 0x7f, + 0xba, 0xa6, 0xf0, 0x50, 0x2e, 0xe8, 0x3f, 0x0d, 0x5f, 0x1a, 0x41, 0x15, 0x15, 0x15, 0x5c, 0x48, + 0xd4, 0x4f, 0x14, 0x4a, 0x31, 0x75, 0x6c, 0x02, 0xf6, 0x3d, 0x83, 0x62, 0x63, 0x63, 0x19, 0x44, + 0x53, 0x98, 0x9a, 0x96, 0x5e, 0x94, 0x1c, 0xf5, 0xf5, 0xf5, 0xc9, 0xa2, 0xeb, 0x81, 0x81, 0x01, + 0xd6, 0xe0, 0xe0, 0x20, 0x9f, 0x45, 0x54, 0x5d, 0x14, 0x76, 0x02, 0xd2, 0x71, 0x41, 0x47, 0x0a, + 0x41, 0xc9, 0x0d, 0x9d, 0xd4, 0xa3, 0xa3, 0xa3, 0xe4, 0x4a, 0xe7, 0x25, 0x6a, 0xdd, 0x57, 0x54, + 0x97, 0x87, 0x5e, 0x90, 0xf2, 0x23, 0x85, 0x8e, 0x7e, 0xdf, 0x77, 0x44, 0x15, 0xb5, 0x23, 0xf2, + 0x44, 0x39, 0x22, 0x47, 0xf4, 0x9e, 0x74, 0xaa, 0xd2, 0x7f, 0xda, 0x10, 0xe5, 0x8b, 0xf2, 0x46, + 0x7d, 0x45, 0xbd, 0x99, 0x97, 0x97, 0xe7, 0x64, 0x90, 0x38, 0x37, 0x64, 0xd0, 0xe1, 0x1c, 0xd1, + 0xcc, 0x22, 0xd0, 0x61, 0x88, 0xdb, 0xed, 0x56, 0x80, 0xc8, 0xc9, 0x61, 0xd1, 0xbd, 0x89, 0x89, + 0x09, 0xce, 0x17, 0xb9, 0xee, 0xe8, 0xe8, 0x20, 0x47, 0x85, 0x5e, 0x2a, 0x95, 0xca, 0x47, 0xcc, + 0xa4, 0x3d, 0x7a, 0x88, 0x60, 0x92, 0xa4, 0xdd, 0x4a, 0x7a, 0x7f, 0xc1, 0x7f, 0x12, 0x39, 0x39, + 0x7d, 0xfa, 0x34, 0x41, 0x02, 0x85, 0x3e, 0xf2, 0x12, 0x9f, 0x2f, 0x85, 0xab, 0xbe, 0xc0, 0xc0, + 0xc0, 0x03, 0x01, 0x94, 0x15, 0x1c, 0x1c, 0xac, 0xb8, 0xfe, 0x3b, 0x89, 0x8d, 0x2a, 0x24, 0xdd, + 0x17, 0x53, 0x81, 0xd4, 0x26, 0xd6, 0xff, 0x9c, 0xab, 0x4e, 0x7c, 0x7c, 0x85, 0xbe, 0xf3, 0xf6, + 0xf6, 0xfe, 0xd1, 0xc7, 0xc7, 0x27, 0x58, 0xe8, 0xa7, 0xb7, 0x0a, 0x3d, 0xf4, 0xff, 0xdf, 0x48, + 0xe5, 0xf3, 0x66, 0x9d, 0x1f, 0xc4, 0xba, 0xdf, 0x0a, 0x7d, 0xc6, 0xa0, 0xb7, 0xb4, 0x8f, 0x85, + 0x3e, 0x25, 0x77, 0x42, 0x5f, 0xff, 0x47, 0x7d, 0x25, 0xf4, 0x85, 0xd0, 0x27, 0x52, 0xb3, 0x92, + 0xfe, 0x04, 0xe6, 0x65, 0xc3, 0xbb, 0x89, 0x46, 0xb5, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE find_xpm[1] = {{ png, sizeof( png ), "find_xpm" }}; diff --git a/bitmaps_png/cpp_26/new_pcb.cpp b/bitmaps_png/cpp_26/new_pcb.cpp index 93e658d06f..9859d0419b 100644 --- a/bitmaps_png/cpp_26/new_pcb.cpp +++ b/bitmaps_png/cpp_26/new_pcb.cpp @@ -8,85 +8,52 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, - 0xce, 0x00, 0x00, 0x04, 0xd4, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0x49, 0x4f, 0x5d, - 0x75, 0x18, 0x87, 0x31, 0x6a, 0xe2, 0xc2, 0x98, 0xe8, 0x86, 0x8d, 0x89, 0x71, 0xa3, 0x18, 0x1a, - 0x59, 0x6a, 0x5c, 0xba, 0xe0, 0xdb, 0x98, 0x7e, 0x08, 0x16, 0x5d, 0xb0, 0x64, 0x86, 0x96, 0x05, - 0x94, 0x36, 0x1d, 0x80, 0x96, 0x99, 0x36, 0x05, 0x0a, 0x65, 0x86, 0x32, 0xcf, 0x73, 0x69, 0x65, - 0x86, 0x0b, 0x1c, 0xc6, 0x0b, 0xbc, 0xfe, 0x9e, 0x57, 0xcf, 0xe5, 0x5c, 0x5b, 0x63, 0x62, 0xe2, - 0x49, 0xde, 0x1c, 0xee, 0xff, 0x9c, 0xfb, 0x7b, 0xde, 0xf9, 0x92, 0x92, 0x92, 0x92, 0xf2, 0x45, - 0x5a, 0x5a, 0xda, 0x77, 0x19, 0x19, 0x19, 0x37, 0xfe, 0x0f, 0x4b, 0x4f, 0x4f, 0xff, 0x41, 0x8c, - 0x2f, 0x65, 0x29, 0xe9, 0xbf, 0xaf, 0xad, 0xc5, 0x36, 0xb7, 0xb6, 0x6c, 0x6b, 0x7b, 0xdb, 0xb6, - 0x77, 0x76, 0x6c, 0x71, 0x69, 0xc9, 0x76, 0xf7, 0xf6, 0x6c, 0x2f, 0x16, 0xb3, 0x2d, 0x9d, 0x2f, - 0x2e, 0x2e, 0x5a, 0x6c, 0x7f, 0x3f, 0x61, 0x73, 0xf3, 0xf3, 0x76, 0x70, 0x78, 0xe8, 0xb6, 0xba, - 0xba, 0x6a, 0x87, 0x41, 0x60, 0x83, 0xaf, 0x5f, 0x5b, 0x4d, 0x6d, 0xad, 0xad, 0xbe, 0x7d, 0xeb, - 0x9f, 0x03, 0x99, 0xdf, 0x8f, 0x8e, 0xe2, 0x62, 0xfc, 0x04, 0xe8, 0xc7, 0xb5, 0xb5, 0xb5, 0x60, - 0x71, 0x69, 0xd9, 0xd6, 0x37, 0x36, 0xdd, 0x9e, 0x3c, 0x7d, 0x6a, 0x23, 0xa3, 0xa3, 0x0e, 0xdd, - 0xd8, 0xd4, 0xe7, 0x27, 0x4f, 0x6c, 0x6a, 0x7a, 0xda, 0xc1, 0x38, 0xc0, 0xf3, 0xf5, 0xf5, 0x75, - 0xdb, 0x17, 0xf4, 0xa9, 0xfe, 0xde, 0x3f, 0x38, 0xb0, 0x87, 0x0f, 0x1f, 0x5a, 0x5e, 0x5e, 0x9e, - 0x03, 0x43, 0x27, 0x30, 0x81, 0x2e, 0xc5, 0xf8, 0xc5, 0x41, 0xeb, 0x1b, 0x1b, 0xc1, 0xca, 0x9b, - 0x37, 0xb6, 0xb4, 0xbc, 0x6c, 0x43, 0xc3, 0xc3, 0x46, 0x74, 0x2e, 0x3e, 0x35, 0xe5, 0xc2, 0x3b, - 0xbb, 0xbb, 0x56, 0x5f, 0x5f, 0xef, 0x91, 0x22, 0xfe, 0xa2, 0xa5, 0xc5, 0xe4, 0x9c, 0x0b, 0xd5, - 0xd4, 0xd4, 0xd8, 0xa1, 0xee, 0x8f, 0x1e, 0x3d, 0xb2, 0xfc, 0xfc, 0x7c, 0x1b, 0x1a, 0x1a, 0xf2, - 0x68, 0x42, 0x3b, 0x8a, 0x82, 0x36, 0x04, 0xea, 0xed, 0xeb, 0xb3, 0xb1, 0xf1, 0x71, 0x2b, 0x2c, - 0x2c, 0x74, 0x20, 0x69, 0xc4, 0xf3, 0xb9, 0xb9, 0x39, 0x4f, 0x17, 0x11, 0x8e, 0xca, 0x10, 0x6f, - 0x6d, 0x6d, 0x55, 0xe4, 0x1b, 0x2e, 0x54, 0x5b, 0x57, 0x87, 0x98, 0x3d, 0x7e, 0xfc, 0xd8, 0x0a, - 0x0a, 0x0a, 0x6c, 0x58, 0x8e, 0x1e, 0x1d, 0x1f, 0x27, 0xec, 0xf8, 0xe4, 0xe4, 0x1a, 0xb4, 0xb9, - 0xb9, 0x19, 0x90, 0xa6, 0x49, 0x45, 0x90, 0x93, 0x93, 0x63, 0xe5, 0x77, 0xef, 0x7a, 0x54, 0x6f, - 0xdf, 0xbd, 0x73, 0xef, 0x0f, 0x94, 0x9a, 0xd1, 0xb1, 0x31, 0x1b, 0x93, 0x21, 0xde, 0xda, 0xd6, - 0x66, 0x72, 0xce, 0x85, 0xea, 0x04, 0x3a, 0xd6, 0xbd, 0xb2, 0xb2, 0xd2, 0x9d, 0x1c, 0x19, 0x19, - 0xb1, 0x93, 0x93, 0x93, 0xa8, 0x45, 0x40, 0x5b, 0x5b, 0x01, 0x29, 0xa3, 0x0e, 0x39, 0xb9, 0xb9, - 0x96, 0x2b, 0x7b, 0xf9, 0xf2, 0xa5, 0xa9, 0x49, 0xac, 0x45, 0xde, 0x53, 0x54, 0x20, 0xe3, 0x8a, - 0x18, 0x71, 0x9e, 0xe1, 0x08, 0x42, 0xa4, 0xf4, 0xf4, 0xf4, 0xd4, 0xaa, 0xaa, 0xaa, 0xac, 0xa8, - 0xa8, 0xc8, 0xa3, 0x3e, 0x3d, 0x3b, 0xb3, 0x33, 0x19, 0x77, 0x3d, 0xbb, 0x06, 0xa9, 0xb3, 0x02, - 0xea, 0x30, 0x2d, 0x10, 0x90, 0x5c, 0x15, 0x15, 0x31, 0x0a, 0x4e, 0x9a, 0x54, 0x50, 0x1b, 0x9f, - 0x98, 0xb0, 0x09, 0x19, 0xe2, 0xed, 0xed, 0xed, 0xb6, 0xad, 0xd4, 0x02, 0x68, 0x6c, 0x6c, 0x74, - 0xd1, 0xea, 0xea, 0x6a, 0x2b, 0x2e, 0x2e, 0x76, 0x67, 0xce, 0xcf, 0xcf, 0xa3, 0x16, 0x01, 0x6d, - 0x6f, 0x07, 0x0b, 0x6a, 0xe1, 0xe9, 0x99, 0x19, 0x87, 0xe4, 0xa9, 0xa8, 0x80, 0x48, 0x4f, 0x9b, - 0xd2, 0x44, 0x6a, 0x26, 0x27, 0x27, 0xdd, 0x10, 0xef, 0xe8, 0xe8, 0xb0, 0x1d, 0xa5, 0x1a, 0x21, - 0x40, 0xdc, 0x01, 0x95, 0x94, 0x94, 0xb8, 0x33, 0xf1, 0x78, 0x3c, 0x61, 0x49, 0x20, 0xd5, 0x27, - 0x98, 0x90, 0x08, 0x20, 0x20, 0x74, 0x4f, 0xc7, 0xab, 0x57, 0x0e, 0x02, 0x48, 0x14, 0x74, 0x20, - 0x11, 0xe3, 0xfd, 0x2b, 0x3d, 0xdb, 0x55, 0x06, 0x10, 0x6a, 0x6a, 0x6a, 0xf2, 0x7b, 0x43, 0x43, - 0x43, 0x12, 0xe8, 0xe2, 0xe2, 0xe2, 0x7d, 0x90, 0xbc, 0x0b, 0x68, 0xe3, 0x59, 0x75, 0x18, 0x90, - 0x7c, 0x75, 0x4f, 0x67, 0x57, 0x97, 0xd7, 0x81, 0x88, 0x88, 0x82, 0x68, 0x00, 0xe1, 0x3d, 0x11, - 0xed, 0xe9, 0x7d, 0x84, 0x88, 0x08, 0x51, 0x3a, 0x2f, 0x04, 0xf1, 0x39, 0x34, 0xbd, 0x93, 0x0c, - 0x1a, 0x18, 0x18, 0xf0, 0x89, 0x07, 0x42, 0x9b, 0x76, 0x75, 0x77, 0x5b, 0xbf, 0xce, 0x00, 0x13, - 0x05, 0x83, 0x49, 0xe1, 0x11, 0xe7, 0x79, 0xd8, 0x81, 0xb7, 0x6e, 0xdd, 0xf2, 0xe8, 0x2e, 0x2f, - 0x2f, 0xed, 0xf6, 0xed, 0xdb, 0xee, 0x10, 0x7f, 0x87, 0x26, 0xd8, 0x35, 0x48, 0x2f, 0x06, 0x0c, - 0xdd, 0xbc, 0x40, 0x88, 0x14, 0xa8, 0x4d, 0x7b, 0x7a, 0x7a, 0x6c, 0x60, 0x70, 0xd0, 0xca, 0xcb, - 0xcb, 0x3d, 0x8a, 0xe6, 0xe6, 0x66, 0x7b, 0xfe, 0xfc, 0xb9, 0x83, 0x2a, 0x2a, 0x2a, 0xbc, 0xbb, - 0x18, 0x5e, 0xc4, 0x19, 0xde, 0x10, 0x44, 0x8a, 0xaf, 0xae, 0xae, 0x12, 0xf6, 0x1e, 0x68, 0x76, - 0x76, 0xd6, 0x16, 0x16, 0x16, 0x1c, 0xc4, 0x3c, 0xf4, 0xf6, 0xf6, 0xba, 0xa7, 0x9c, 0x21, 0x8e, - 0x18, 0x5d, 0x48, 0x3a, 0x38, 0x63, 0xb6, 0x10, 0x47, 0x98, 0xe7, 0x88, 0xfe, 0x3b, 0x68, 0x6f, - 0x2f, 0x60, 0x66, 0x58, 0x9e, 0x40, 0x98, 0x87, 0x3e, 0x6d, 0x0a, 0x22, 0x09, 0xbb, 0x27, 0xcc, - 0x79, 0x34, 0x2d, 0x51, 0x41, 0xae, 0x3b, 0x77, 0xee, 0x78, 0x1d, 0xa3, 0xe7, 0x7a, 0xef, 0x1a, - 0xa4, 0xc2, 0x06, 0x74, 0x18, 0xbb, 0x0c, 0x08, 0x46, 0xcd, 0xfe, 0x09, 0xf2, 0x77, 0x00, 0x17, - 0xe7, 0xd1, 0xae, 0x0b, 0x9d, 0x4c, 0xea, 0x3a, 0x40, 0xaf, 0xb5, 0x75, 0x89, 0x08, 0x08, 0x83, - 0x37, 0xa8, 0xfa, 0xd0, 0x04, 0xd4, 0x01, 0x08, 0xb3, 0x44, 0x9b, 0x23, 0x4e, 0x13, 0x20, 0xcc, - 0x15, 0xd3, 0x46, 0x47, 0x90, 0x77, 0xc9, 0x06, 0xbb, 0x2e, 0xba, 0x54, 0xf5, 0xbd, 0x64, 0x90, - 0x96, 0x9f, 0x2d, 0x6b, 0x99, 0x86, 0x20, 0xc0, 0xec, 0xad, 0x07, 0x0f, 0x1e, 0x38, 0xa8, 0x45, - 0x3b, 0x8f, 0x99, 0x02, 0xc4, 0xd9, 0x8c, 0x66, 0x8e, 0x06, 0xe2, 0x5d, 0xea, 0xc7, 0xdf, 0x6c, - 0x15, 0x52, 0xce, 0x30, 0x87, 0x26, 0x47, 0x2f, 0xc4, 0xf8, 0xf9, 0x4f, 0x50, 0x2c, 0x16, 0xd0, - 0x96, 0x51, 0x10, 0xeb, 0x1e, 0x18, 0xe9, 0xc0, 0x7b, 0x06, 0x92, 0x99, 0x01, 0x54, 0x5a, 0x5a, - 0xea, 0x9e, 0x13, 0x4d, 0x76, 0x76, 0xb6, 0xd7, 0x05, 0xd1, 0xce, 0xce, 0x4e, 0xdf, 0xf6, 0x2b, - 0x2b, 0x2b, 0x6e, 0x4b, 0x2a, 0x85, 0x96, 0xed, 0x0b, 0x31, 0xbe, 0x71, 0x90, 0xbe, 0xe0, 0xed, - 0xbd, 0xac, 0x87, 0x40, 0xe8, 0x1e, 0xa2, 0xa1, 0x6e, 0x00, 0x00, 0xf1, 0x19, 0xe3, 0xe2, 0x8c, - 0x67, 0xa4, 0xb3, 0x5b, 0xf3, 0x46, 0x84, 0x6c, 0x88, 0x67, 0xcf, 0x9e, 0xf9, 0x1c, 0x01, 0x60, - 0xe7, 0x49, 0xab, 0x49, 0xfa, 0xdf, 0xca, 0x3e, 0x4d, 0x80, 0xf8, 0x49, 0x7e, 0xa3, 0x1f, 0xbf, - 0xb2, 0xb2, 0x32, 0x5f, 0x9a, 0xe4, 0x1c, 0x8f, 0xbb, 0xb4, 0x21, 0x00, 0x31, 0x63, 0x18, 0x17, - 0x67, 0x2c, 0x55, 0x9c, 0x23, 0x12, 0xc4, 0xef, 0xdd, 0xbf, 0xef, 0xcf, 0x38, 0xc7, 0xa1, 0xac, - 0xac, 0xac, 0x7b, 0x7f, 0x45, 0xf2, 0x89, 0x8e, 0x53, 0x12, 0x20, 0xc2, 0xa7, 0xd8, 0x14, 0x3f, - 0xec, 0x36, 0xd2, 0xc3, 0x5c, 0x84, 0x20, 0xe6, 0x87, 0xd4, 0x21, 0xdc, 0xdf, 0xdf, 0xef, 0x8e, - 0xe8, 0xb7, 0xcc, 0xcf, 0x59, 0x4b, 0x44, 0xa9, 0x26, 0xba, 0xba, 0x79, 0xf3, 0x66, 0xbe, 0x74, - 0xbf, 0x0e, 0x21, 0x49, 0x20, 0x3a, 0x84, 0x28, 0x80, 0x91, 0x12, 0x06, 0x16, 0x50, 0xd8, 0xd2, - 0x51, 0x10, 0xad, 0x4b, 0xd1, 0xf9, 0x09, 0x21, 0x0b, 0x44, 0x40, 0x5b, 0x2b, 0x8d, 0xf1, 0xcc, - 0xcc, 0xcc, 0xdf, 0xa4, 0x99, 0x2a, 0xfb, 0x38, 0x84, 0x24, 0x81, 0x78, 0x19, 0x10, 0xf3, 0x43, - 0x87, 0x11, 0x61, 0x74, 0x76, 0x58, 0x9a, 0x38, 0x10, 0x82, 0xf8, 0xcc, 0x08, 0xf0, 0xf3, 0xc0, - 0xff, 0x0d, 0x5a, 0x51, 0xfb, 0xa9, 0xa9, 0xa9, 0xbf, 0x4a, 0xef, 0x73, 0xd9, 0x47, 0x51, 0x48, - 0x08, 0xba, 0xa1, 0xf6, 0x5c, 0x93, 0x48, 0x5c, 0xd1, 0xc4, 0xb5, 0xa9, 0x13, 0x26, 0x70, 0x5c, - 0xa2, 0x09, 0xe3, 0xe2, 0xce, 0x33, 0x65, 0x20, 0xae, 0x34, 0xc7, 0x55, 0x93, 0xb8, 0x20, 0xbd, - 0xd2, 0xf9, 0x5e, 0xf6, 0xd9, 0x87, 0x20, 0x21, 0x88, 0x7f, 0xee, 0xd2, 0x65, 0x19, 0xff, 0xd1, - 0xf8, 0xee, 0x57, 0xd1, 0x7a, 0x7c, 0xc8, 0xfe, 0x00, 0x0a, 0x0d, 0x10, 0x76, 0xc6, 0x00, 0x96, - 0x87, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0xce, 0x00, 0x00, 0x02, 0xbc, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0xb1, 0x6e, 0x1b, + 0x47, 0x10, 0x86, 0xbf, 0x99, 0x3b, 0x16, 0x76, 0xc3, 0xe8, 0x00, 0x35, 0x24, 0x61, 0x50, 0x4f, + 0xe2, 0x56, 0x2f, 0xa1, 0x57, 0x48, 0xa0, 0x52, 0x11, 0x54, 0x07, 0x10, 0x90, 0x56, 0xb0, 0xe1, + 0xca, 0xae, 0xf8, 0x00, 0x2e, 0xd9, 0xa4, 0x15, 0x60, 0x40, 0x10, 0xd2, 0xa4, 0x10, 0xa1, 0x44, + 0xe1, 0x11, 0x48, 0x63, 0x8b, 0x80, 0x62, 0x92, 0xb7, 0xb7, 0xeb, 0xc2, 0xdc, 0xe3, 0xde, 0xf2, + 0x8e, 0xb4, 0x81, 0x64, 0x81, 0xc5, 0xce, 0x2d, 0xee, 0xf6, 0x9f, 0x6f, 0x66, 0x67, 0x70, 0x02, + 0x0c, 0x81, 0x01, 0x90, 0xf2, 0xff, 0x0c, 0x03, 0xfc, 0x9d, 0x02, 0x2f, 0x3e, 0x7e, 0xfc, 0xf4, + 0x9b, 0x31, 0x06, 0x51, 0x41, 0x64, 0x3d, 0x01, 0xc2, 0x55, 0x04, 0xe0, 0xeb, 0xf3, 0x7a, 0xaf, + 0x7a, 0x16, 0x69, 0x55, 0x49, 0x92, 0x84, 0xe7, 0xcf, 0x9e, 0xbd, 0x4c, 0x01, 0x2d, 0x8a, 0x15, + 0x77, 0x77, 0x13, 0x86, 0x47, 0x47, 0xa8, 0x2a, 0xaa, 0xeb, 0x43, 0x62, 0x51, 0xd9, 0xec, 0xe3, + 0x1c, 0x02, 0xb8, 0xc0, 0xa6, 0x41, 0xd4, 0x59, 0x0b, 0xa0, 0x29, 0x80, 0x26, 0x09, 0xfd, 0x7e, + 0x8f, 0x24, 0xd1, 0xcd, 0xe1, 0x91, 0xc0, 0x16, 0x61, 0xb8, 0xc6, 0x84, 0xc1, 0xf0, 0xce, 0xa9, + 0xdf, 0xc8, 0xf3, 0xbc, 0x4e, 0x21, 0x82, 0xa8, 0xa2, 0xb1, 0xdd, 0xb4, 0xae, 0xed, 0xf0, 0xdd, + 0x6a, 0xae, 0x85, 0x52, 0x1f, 0xc7, 0xfe, 0x60, 0x40, 0x92, 0x24, 0x88, 0xf7, 0xe2, 0x7b, 0xc8, + 0x62, 0x3b, 0x18, 0xaa, 0x1a, 0x10, 0x39, 0x47, 0x3e, 0x9d, 0x7e, 0x7d, 0x7f, 0xed, 0x85, 0x36, + 0x90, 0x35, 0x12, 0x89, 0x54, 0x44, 0xb2, 0x8f, 0x48, 0x54, 0xe9, 0xf7, 0xfb, 0xa8, 0x6a, 0x8d, + 0xc2, 0xdb, 0x44, 0x7b, 0xec, 0x58, 0xd9, 0x9b, 0xa3, 0xd9, 0xac, 0x9e, 0xa3, 0x40, 0x54, 0x23, + 0x42, 0xef, 0x50, 0xe8, 0xd8, 0x56, 0x7e, 0x83, 0x59, 0x11, 0xa9, 0x2a, 0xfd, 0x5e, 0xaf, 0x4e, + 0x14, 0x51, 0xc5, 0x07, 0xee, 0xa2, 0x68, 0x1a, 0x7b, 0x6f, 0x5d, 0x9b, 0x97, 0xfb, 0x28, 0x9a, + 0x89, 0x44, 0xb6, 0x73, 0xd4, 0x42, 0x16, 0xc7, 0xbe, 0xed, 0xb9, 0x91, 0xc8, 0x39, 0xc7, 0x74, + 0x3a, 0xad, 0x2a, 0x3c, 0x14, 0xd1, 0x16, 0x82, 0x98, 0x26, 0x14, 0x6c, 0x25, 0x12, 0x55, 0x06, + 0x83, 0xc1, 0x86, 0x68, 0x5d, 0xe1, 0x12, 0x79, 0xdb, 0x46, 0xf4, 0x2d, 0xb9, 0xaa, 0x72, 0x34, + 0xf5, 0x75, 0xb4, 0x23, 0x17, 0x6d, 0x44, 0x6d, 0x74, 0xe1, 0x77, 0xb5, 0x1c, 0x35, 0x25, 0x7f, + 0x5f, 0xcd, 0x78, 0xdb, 0x5a, 0x8b, 0x73, 0x0e, 0xe7, 0x1c, 0x3e, 0x1d, 0x5b, 0xa1, 0x73, 0xeb, + 0x5b, 0xd7, 0xed, 0x76, 0x6b, 0x5d, 0xba, 0xc9, 0xb3, 0x78, 0xb5, 0xd6, 0x6e, 0x4d, 0x2f, 0x06, + 0x90, 0xa6, 0x69, 0x9d, 0xa8, 0x17, 0xdc, 0xba, 0x7d, 0xb5, 0xe2, 0xf7, 0xca, 0xb2, 0xc4, 0x5a, + 0x4b, 0x59, 0x96, 0x18, 0x63, 0xb6, 0xc4, 0x54, 0x95, 0xc5, 0x62, 0x61, 0x00, 0x57, 0x11, 0xcd, + 0xf2, 0x9c, 0x1f, 0xba, 0xdd, 0xc6, 0xb0, 0x34, 0x89, 0xfa, 0x03, 0x8b, 0xa2, 0xc0, 0x18, 0xc3, + 0x6a, 0xb5, 0x62, 0xb1, 0x58, 0xb0, 0x5c, 0x2e, 0x29, 0x8a, 0x82, 0x4e, 0xa7, 0x83, 0xb5, 0xd6, + 0x5e, 0x5d, 0x5d, 0xbd, 0x03, 0xe6, 0x1b, 0xa2, 0xa8, 0x33, 0xec, 0x0a, 0x9d, 0x17, 0x31, 0xc6, + 0x60, 0x8c, 0xe1, 0xe9, 0xe9, 0x89, 0x9b, 0x9b, 0x1b, 0x44, 0x84, 0x2c, 0xcb, 0xc8, 0xb2, 0x8c, + 0xf9, 0x7c, 0xee, 0x2e, 0x2f, 0x2f, 0x5f, 0x8d, 0x46, 0xa3, 0xb7, 0xc0, 0x1f, 0x55, 0x1d, 0xe5, + 0x79, 0x5e, 0x8b, 0xed, 0xae, 0xab, 0xeb, 0x9c, 0xa3, 0x2c, 0xcb, 0x2a, 0x64, 0x45, 0x51, 0x20, + 0x22, 0x1c, 0x1f, 0x1f, 0x33, 0x1c, 0x0e, 0x79, 0x7c, 0x7c, 0x74, 0x17, 0x17, 0x17, 0xbf, 0x8e, + 0x46, 0xa3, 0xd7, 0xc0, 0x2d, 0xf0, 0x39, 0xf5, 0x87, 0xf5, 0x7a, 0xbd, 0xbd, 0xf5, 0x20, 0x22, + 0xd5, 0xcd, 0xf2, 0xb9, 0x29, 0xcb, 0x92, 0xe5, 0x6a, 0xc5, 0xc1, 0xc1, 0x01, 0xb3, 0xd9, 0x8c, + 0x87, 0x87, 0x07, 0x7b, 0x7e, 0x7e, 0xfe, 0xcb, 0x78, 0x3c, 0x7e, 0x07, 0xfc, 0xe9, 0x9c, 0x5b, + 0xd6, 0x3a, 0x43, 0x4c, 0xb4, 0x4b, 0xd4, 0x8b, 0x79, 0xb2, 0xe5, 0x62, 0xc1, 0xe1, 0xe1, 0x21, + 0x93, 0xc9, 0xc4, 0x9c, 0x9e, 0x9e, 0xfe, 0x3c, 0x1e, 0x8f, 0xdf, 0x00, 0x13, 0x2f, 0xb2, 0xe9, + 0x0c, 0xdf, 0x48, 0xe4, 0x45, 0x42, 0xb1, 0xb2, 0x2c, 0x49, 0x92, 0x84, 0xfb, 0xfb, 0xfb, 0xf9, + 0xd9, 0xd9, 0xd9, 0x8f, 0xd7, 0xd7, 0xd7, 0xef, 0x81, 0x4f, 0xce, 0xb9, 0x32, 0xfc, 0x2e, 0x05, + 0xac, 0x26, 0x09, 0x59, 0x96, 0xed, 0xec, 0x02, 0x71, 0x2f, 0x4b, 0xd3, 0x14, 0xe7, 0x1c, 0x69, + 0xa7, 0x63, 0x6e, 0x6f, 0x6f, 0x3f, 0x9c, 0x9c, 0x9c, 0xfc, 0x54, 0x14, 0xc5, 0xef, 0xc0, 0xbf, + 0xae, 0x21, 0xd9, 0xf2, 0x1f, 0xfc, 0x40, 0x16, 0xc0, 0x5f, 0xc0, 0x3f, 0x61, 0xa8, 0xe2, 0xf1, + 0x05, 0x95, 0x9b, 0x4e, 0x78, 0x5f, 0x66, 0xb8, 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, + 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE new_pcb_xpm[1] = {{ png, sizeof( png ), "new_pcb_xpm" }}; diff --git a/bitmaps_png/cpp_48/icon_bitmap2component.cpp b/bitmaps_png/cpp_48/icon_bitmap2component.cpp index e96ff04481..e831592b8e 100644 --- a/bitmaps_png/cpp_48/icon_bitmap2component.cpp +++ b/bitmaps_png/cpp_48/icon_bitmap2component.cpp @@ -8,89 +8,88 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, - 0x87, 0x00, 0x00, 0x05, 0x10, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xdd, 0x59, 0x5d, 0x4c, 0x14, - 0x57, 0x14, 0xde, 0x76, 0x85, 0xb6, 0x01, 0x1a, 0x1b, 0x94, 0x07, 0x9f, 0x0c, 0xb6, 0x94, 0xd2, - 0x16, 0x69, 0xf1, 0xc1, 0x6a, 0x6d, 0x35, 0x2d, 0xd4, 0x57, 0x53, 0xd3, 0x8a, 0x11, 0x94, 0x28, - 0xb1, 0x89, 0x09, 0xb1, 0x21, 0xc6, 0x18, 0xfb, 0x47, 0xda, 0x26, 0xc6, 0x57, 0x63, 0x7c, 0x30, - 0x3e, 0x98, 0x5a, 0xda, 0x25, 0x4d, 0x30, 0x08, 0xd6, 0x52, 0x96, 0xa2, 0x82, 0xeb, 0xee, 0xec, - 0x32, 0xf1, 0xa7, 0x69, 0x8c, 0x35, 0x90, 0x22, 0xd4, 0x34, 0xa2, 0x24, 0x12, 0x81, 0x65, 0x96, - 0xd3, 0x73, 0xc6, 0x19, 0x32, 0xcc, 0xde, 0xb9, 0xf7, 0xce, 0xec, 0x6c, 0xd1, 0x6e, 0xf2, 0x65, - 0xf8, 0x96, 0xbd, 0x3f, 0xdf, 0xcc, 0x77, 0xee, 0x39, 0xf7, 0x4e, 0x00, 0x00, 0x02, 0x4e, 0xc0, - 0x4f, 0x1e, 0xa2, 0x9c, 0xf7, 0x1b, 0x2f, 0xc0, 0xcf, 0x53, 0x88, 0x4a, 0xea, 0x3f, 0xe3, 0xbe, - 0x18, 0x9d, 0x2f, 0x42, 0xbc, 0x86, 0xa8, 0x45, 0x7c, 0x8d, 0x78, 0xd7, 0x6f, 0x01, 0xc6, 0x38, - 0xef, 0x19, 0xfd, 0xd3, 0x38, 0xaf, 0x22, 0x82, 0x19, 0x09, 0x30, 0x3a, 0xd9, 0x82, 0xf8, 0x02, - 0xf1, 0xad, 0x05, 0x65, 0x88, 0xa5, 0x59, 0xc0, 0xeb, 0xb6, 0x71, 0x3e, 0x47, 0x7c, 0x8c, 0x28, - 0x75, 0x79, 0x23, 0x02, 0xf9, 0x88, 0x7a, 0x5b, 0x67, 0x0b, 0x8d, 0x6d, 0x88, 0xe7, 0xa4, 0x9f, - 0x80, 0xe1, 0x49, 0xb2, 0xcd, 0x56, 0xc4, 0x97, 0x0b, 0xf4, 0x04, 0x3e, 0x43, 0x7c, 0x84, 0x78, - 0x39, 0xd3, 0x18, 0xc8, 0xa1, 0xc0, 0x45, 0xec, 0x30, 0x3c, 0xfa, 0x4e, 0x96, 0x62, 0xe0, 0x7d, - 0x44, 0xb3, 0x71, 0xd3, 0x5e, 0xc9, 0x38, 0x06, 0x1c, 0x06, 0x79, 0x1e, 0xf1, 0x66, 0x96, 0x56, - 0xa1, 0x95, 0xb2, 0x36, 0xf1, 0x2c, 0xe0, 0x49, 0xc0, 0xff, 0x42, 0xc0, 0x22, 0xc4, 0x16, 0xc4, - 0x6f, 0x88, 0xf1, 0x05, 0xc6, 0x7d, 0x44, 0x17, 0x62, 0x33, 0x22, 0xc8, 0xb0, 0xde, 0xb3, 0x2c, - 0x01, 0xf5, 0xf1, 0x78, 0x1c, 0x1e, 0x37, 0x24, 0x93, 0xc9, 0x3a, 0x86, 0x80, 0x1a, 0x96, 0x00, - 0x95, 0x1a, 0x58, 0x3f, 0xd9, 0xe6, 0x89, 0x44, 0x22, 0x8d, 0xa7, 0x52, 0xa9, 0x79, 0x5c, 0xd3, - 0xb4, 0x8b, 0xb6, 0xc9, 0xbf, 0x68, 0x2c, 0xb7, 0x25, 0x76, 0x01, 0x9e, 0x27, 0xa4, 0xcd, 0x6a, - 0x70, 0xed, 0xfe, 0x35, 0x9d, 0x37, 0x5f, 0x6d, 0x86, 0xa6, 0x78, 0x13, 0x34, 0x44, 0x1a, 0x74, - 0xbe, 0x7f, 0x60, 0x3f, 0x1c, 0xba, 0x7e, 0x08, 0x3a, 0x6f, 0x77, 0x7a, 0x12, 0x30, 0x3b, 0x3b, - 0x3b, 0x6e, 0x13, 0xf0, 0xa1, 0x21, 0x60, 0xb3, 0x2f, 0x02, 0x76, 0x45, 0x76, 0xc1, 0xe2, 0xd0, - 0x62, 0x08, 0x7c, 0x17, 0xd0, 0x39, 0x5d, 0x4d, 0xb0, 0x78, 0x65, 0x67, 0x25, 0x1c, 0xbd, 0x71, - 0x14, 0x26, 0x66, 0x26, 0x5c, 0x0b, 0xa0, 0x1c, 0x61, 0x24, 0x3a, 0x33, 0xe1, 0x05, 0xd3, 0x04, - 0x3c, 0x6e, 0x40, 0x41, 0x56, 0x01, 0xa5, 0xb6, 0xac, 0x5d, 0x9a, 0x26, 0x80, 0xee, 0x80, 0x09, - 0x16, 0x3f, 0x3b, 0x7c, 0x16, 0x0a, 0x43, 0x85, 0x90, 0x7b, 0x2a, 0x57, 0xe7, 0x74, 0x35, 0xe1, - 0x96, 0x47, 0x94, 0x08, 0x84, 0x47, 0xc3, 0x73, 0xfd, 0xd3, 0x1d, 0x9f, 0x99, 0x99, 0x99, 0xc7, - 0x6d, 0x4f, 0xa0, 0xc6, 0x26, 0xa0, 0xc6, 0xb5, 0x85, 0x82, 0xa7, 0x82, 0x5c, 0x8b, 0xb8, 0xe1, - 0x97, 0x94, 0x4b, 0x50, 0xf0, 0x63, 0x01, 0x0c, 0x4d, 0x0c, 0x09, 0x2d, 0x44, 0xd9, 0xda, 0x28, - 0x39, 0xac, 0x02, 0x9a, 0xcd, 0x2c, 0x2e, 0x14, 0x10, 0xbb, 0x1b, 0xcb, 0x78, 0xc2, 0x2c, 0x01, - 0x74, 0xdd, 0xd4, 0xbb, 0x49, 0x46, 0x00, 0x95, 0x1c, 0x1f, 0x58, 0x8a, 0xbf, 0x0a, 0x44, 0x35, - 0x7d, 0xff, 0x44, 0xc4, 0x00, 0xd5, 0x4d, 0xc6, 0xf5, 0x05, 0x43, 0xc0, 0xd2, 0x79, 0xdf, 0xf3, - 0x62, 0xe0, 0xf0, 0xf5, 0xc3, 0x42, 0x4f, 0x57, 0x74, 0x54, 0x30, 0xdb, 0x9f, 0xbf, 0x73, 0x1e, - 0x56, 0x75, 0xae, 0x72, 0x8c, 0x01, 0xf3, 0xef, 0x13, 0x37, 0x4f, 0x08, 0x63, 0x80, 0x25, 0x40, - 0x18, 0x03, 0xb4, 0xc6, 0x2f, 0xfb, 0x69, 0x19, 0xd7, 0x12, 0x65, 0xed, 0x65, 0x30, 0x36, 0x3d, - 0xe6, 0x68, 0xc1, 0xd1, 0x87, 0xa3, 0x50, 0xd8, 0x5a, 0xe8, 0x68, 0x21, 0xc2, 0x41, 0xf5, 0xa0, - 0x6c, 0x1e, 0x70, 0x27, 0x40, 0xb9, 0xab, 0x40, 0x71, 0x5b, 0x31, 0xe4, 0xfd, 0x90, 0xe7, 0x28, - 0x20, 0xfc, 0x77, 0x58, 0x98, 0x37, 0x6a, 0xfb, 0x6b, 0xb9, 0x02, 0x1a, 0x95, 0x46, 0x7f, 0x04, - 0x50, 0x23, 0x13, 0x2c, 0x1e, 0x4f, 0x3c, 0x82, 0x92, 0x50, 0x74, 0x1e, 0x8b, 0xc7, 0xb8, 0xbf, - 0x37, 0xff, 0x8e, 0xc6, 0xa3, 0x3a, 0xa7, 0x49, 0x9b, 0xb0, 0x72, 0xea, 0x87, 0xd5, 0xde, 0x9a, - 0x07, 0xa4, 0x04, 0x88, 0xf2, 0x80, 0x57, 0x5e, 0xf5, 0x6b, 0x15, 0x37, 0x06, 0x8e, 0xdd, 0x38, - 0x96, 0x9d, 0x18, 0xf0, 0x8b, 0x2f, 0x69, 0x5d, 0xc2, 0xb5, 0x50, 0xdb, 0x5f, 0x6d, 0xd9, 0x89, - 0x01, 0x2f, 0x7c, 0x3a, 0x35, 0x0d, 0xb7, 0x1e, 0xdc, 0xd2, 0xf9, 0xbe, 0xc4, 0x3e, 0x58, 0x73, - 0x6e, 0x0d, 0x37, 0x0f, 0x10, 0x06, 0x1f, 0x0c, 0xfe, 0x37, 0x31, 0x60, 0xe7, 0x4a, 0x5c, 0xd1, - 0xfd, 0x6b, 0x7a, 0x9c, 0x6c, 0xc1, 0xf2, 0x38, 0x8f, 0x53, 0x1b, 0xa7, 0xfe, 0x7d, 0x8f, 0x81, - 0xdd, 0x91, 0xdd, 0x50, 0x72, 0xba, 0xc4, 0xb7, 0x5a, 0x88, 0xae, 0x1b, 0xc3, 0x1b, 0xa5, 0x6a, - 0x21, 0xcf, 0x16, 0x6a, 0x1f, 0x6e, 0x87, 0xf2, 0x8e, 0xf2, 0xac, 0x95, 0x12, 0xb4, 0x67, 0x70, - 0xb1, 0x1f, 0x70, 0x27, 0x60, 0xaf, 0xb2, 0xd7, 0xb7, 0x09, 0x3b, 0x09, 0x08, 0x0d, 0x85, 0xfc, - 0x13, 0x60, 0xf7, 0xa0, 0x8c, 0x87, 0x79, 0x5c, 0x26, 0x26, 0x28, 0xaf, 0xf8, 0x1e, 0x03, 0x54, - 0xa7, 0xbb, 0xf1, 0x74, 0x7e, 0x4b, 0xbe, 0xce, 0xf7, 0x44, 0xf7, 0xc0, 0x91, 0x3f, 0x8e, 0x40, - 0xf7, 0x48, 0xb7, 0xce, 0x3b, 0x86, 0x3b, 0xb8, 0x31, 0x50, 0xd4, 0x5a, 0x04, 0x5a, 0x4a, 0xf3, - 0x3f, 0x06, 0x56, 0xff, 0xbc, 0x5a, 0xca, 0x12, 0x3b, 0x23, 0x3b, 0xa1, 0xe7, 0x4e, 0x0f, 0x4c, - 0x6a, 0x93, 0x4c, 0x0b, 0x1e, 0x50, 0x0f, 0x70, 0x2d, 0xb4, 0xa1, 0x6b, 0x83, 0xdb, 0x3d, 0xb1, - 0x58, 0x80, 0x7a, 0x4f, 0x15, 0x7a, 0x98, 0x6a, 0x78, 0x99, 0xbc, 0xb0, 0xf6, 0xdc, 0x5a, 0xae, - 0x00, 0x3a, 0x00, 0xf0, 0x55, 0x00, 0x35, 0xa2, 0x75, 0x9d, 0xe7, 0xd9, 0xcb, 0xca, 0x65, 0xe9, - 0x3c, 0x21, 0x8a, 0x01, 0xca, 0x23, 0xbc, 0xf6, 0x9e, 0x62, 0xa0, 0xee, 0x62, 0x1d, 0xd7, 0xf3, - 0x27, 0xff, 0x3c, 0x29, 0x5d, 0x0b, 0x89, 0xf2, 0x80, 0x3a, 0xa6, 0x4a, 0xef, 0x89, 0xa5, 0x2d, - 0x44, 0x89, 0x85, 0x67, 0xa1, 0x2b, 0xf7, 0xae, 0x48, 0x97, 0x16, 0xbc, 0x18, 0x22, 0x01, 0x54, - 0x76, 0xf8, 0x1e, 0x03, 0xeb, 0x7e, 0x59, 0xc7, 0x15, 0x70, 0xe6, 0xf6, 0x19, 0xa1, 0x80, 0xe3, - 0x37, 0x8f, 0x0b, 0x05, 0x90, 0x15, 0x3d, 0x1c, 0x6c, 0x89, 0x63, 0x80, 0xea, 0x1a, 0x5e, 0x0c, - 0xd0, 0xff, 0x79, 0x31, 0x40, 0x7b, 0x05, 0xba, 0xbb, 0x32, 0x79, 0x42, 0x14, 0x43, 0x9e, 0x62, - 0x80, 0xd6, 0x72, 0xd1, 0xba, 0xdf, 0xa4, 0x34, 0x31, 0x3d, 0xbf, 0xbd, 0x6f, 0xbb, 0x74, 0x2d, - 0x44, 0x37, 0xc2, 0xda, 0x9e, 0x17, 0x03, 0xc6, 0xcb, 0xc7, 0xb7, 0x11, 0xc5, 0xe6, 0xd9, 0x28, - 0xe2, 0x2d, 0xc4, 0x1b, 0x69, 0x16, 0x6a, 0x19, 0x6c, 0x91, 0x2e, 0x0d, 0xd6, 0x77, 0xad, 0x87, - 0xea, 0xee, 0x6a, 0x58, 0x71, 0x7a, 0x85, 0xeb, 0x52, 0x82, 0x56, 0x3b, 0x59, 0x0b, 0xd1, 0x91, - 0x3a, 0xe3, 0x5c, 0xe8, 0x1b, 0x7a, 0x7b, 0x94, 0x26, 0x80, 0x36, 0xe8, 0xbc, 0x3d, 0xb0, 0x5f, - 0x9c, 0x96, 0x50, 0x97, 0x67, 0xa3, 0xf6, 0x93, 0xb9, 0x7a, 0xc7, 0x5a, 0xc8, 0xdc, 0xa3, 0x7a, - 0xad, 0x85, 0xb2, 0x11, 0x03, 0x8c, 0xb3, 0xd1, 0x8a, 0x34, 0x01, 0x9a, 0xa6, 0xe9, 0x18, 0x9f, - 0x1c, 0xd7, 0x79, 0x41, 0x4b, 0xc1, 0x1c, 0x64, 0x79, 0x51, 0xa8, 0x08, 0x7a, 0x46, 0x7a, 0x84, - 0xbf, 0xa7, 0x9b, 0x64, 0x8e, 0x47, 0xa0, 0x49, 0x27, 0x93, 0xc9, 0x79, 0xdc, 0xf6, 0x04, 0x9e, - 0xb6, 0x9c, 0x4e, 0x7f, 0x85, 0xc8, 0x15, 0x96, 0xd3, 0xe6, 0x99, 0x90, 0xac, 0x45, 0x96, 0xb7, - 0x2d, 0x87, 0xfe, 0x7f, 0xfa, 0xa5, 0xf2, 0x00, 0x05, 0x71, 0x06, 0xef, 0x07, 0xb6, 0xd9, 0x57, - 0xa1, 0xdf, 0x59, 0x02, 0x46, 0x1e, 0x8e, 0x40, 0x55, 0x77, 0x95, 0x50, 0x40, 0xce, 0xf7, 0x39, - 0x3a, 0xa7, 0x73, 0x7f, 0x37, 0x89, 0x4c, 0xe2, 0x0d, 0x4d, 0xd4, 0x26, 0xe0, 0x25, 0x43, 0xc0, - 0x4a, 0xbb, 0x80, 0x4f, 0x68, 0x00, 0x55, 0x55, 0xe7, 0x60, 0xe5, 0xca, 0xc0, 0xa3, 0x73, 0xa0, - 0x0b, 0xb1, 0x0b, 0xd0, 0x1b, 0xeb, 0xd5, 0x41, 0x41, 0xd8, 0xa7, 0xf4, 0x41, 0x34, 0x11, 0x85, - 0x01, 0x75, 0x00, 0x58, 0xed, 0xa9, 0x9d, 0x09, 0x16, 0x77, 0x1a, 0xcf, 0xe4, 0x68, 0xa9, 0x06, - 0xc6, 0x3b, 0xb2, 0x1d, 0xe6, 0x99, 0xa8, 0x55, 0xc0, 0x33, 0x53, 0x53, 0x53, 0x9f, 0xe2, 0x3a, - 0x7c, 0xd5, 0xea, 0xcb, 0x85, 0x02, 0xce, 0x23, 0x81, 0xf3, 0x69, 0xc4, 0x79, 0xe5, 0x30, 0x04, - 0xe4, 0xdb, 0xbf, 0xfb, 0x17, 0xa9, 0xb6, 0x0a, 0x59, 0x1b, 0xa7, 0xa9, 0x98, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0x87, 0x00, 0x00, 0x05, 0x02, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xdd, 0x59, 0x5b, 0x6c, 0x14, + 0x55, 0x18, 0x5e, 0xdd, 0x52, 0x15, 0xcb, 0x92, 0x72, 0x79, 0xe0, 0x09, 0xd2, 0x68, 0x2f, 0x5a, + 0x7b, 0xd1, 0x07, 0x22, 0x18, 0x25, 0xb1, 0x69, 0x79, 0x81, 0x07, 0x4a, 0x94, 0x9a, 0x6a, 0xe8, + 0x83, 0x49, 0x81, 0xc4, 0xc4, 0x07, 0x78, 0xb2, 0x17, 0x62, 0x4d, 0x78, 0xe0, 0x85, 0x47, 0x08, + 0xf0, 0x80, 0xbd, 0x28, 0xb1, 0xb6, 0x15, 0xbc, 0xd4, 0x00, 0x2b, 0x6d, 0x43, 0xbb, 0x97, 0xd9, + 0xad, 0xc4, 0xc6, 0xb4, 0x6b, 0x43, 0x8a, 0x10, 0xaa, 0xc1, 0x42, 0xd5, 0xa5, 0xed, 0x76, 0xb6, + 0xbf, 0xff, 0x7f, 0x3a, 0x67, 0x33, 0x3b, 0x3d, 0xbb, 0x7b, 0x66, 0x76, 0x26, 0x05, 0x37, 0xf9, + 0x32, 0xf3, 0xcd, 0xce, 0x9c, 0x39, 0xdf, 0x9c, 0xef, 0x3f, 0xff, 0x3f, 0x67, 0x5c, 0x00, 0xe0, + 0x4a, 0x05, 0xfc, 0x3d, 0x8f, 0x28, 0x4b, 0x77, 0x8e, 0x15, 0xe0, 0xef, 0x29, 0xc4, 0x6b, 0xd4, + 0x7e, 0xd6, 0x6d, 0x09, 0x1a, 0xcf, 0x41, 0x94, 0x22, 0xde, 0x47, 0x7c, 0x8a, 0x78, 0xcb, 0x6e, + 0x01, 0xda, 0x7d, 0xde, 0xd6, 0xda, 0xa7, 0xfb, 0xbc, 0x8c, 0x70, 0x67, 0x25, 0x40, 0x6b, 0xe4, + 0x00, 0xa2, 0x19, 0xf1, 0x99, 0x0e, 0x2f, 0x21, 0x36, 0x3b, 0x80, 0x57, 0x0c, 0xf7, 0x69, 0x42, + 0xbc, 0x8b, 0x28, 0x36, 0xf9, 0x20, 0x5c, 0x79, 0x88, 0x06, 0x43, 0x63, 0xab, 0x8d, 0x7a, 0xc4, + 0x73, 0xd2, 0x23, 0xa0, 0x79, 0x92, 0x6c, 0xf3, 0x1e, 0xa2, 0x65, 0x95, 0x46, 0xe0, 0x13, 0xc4, + 0x3b, 0x88, 0xa2, 0x6c, 0x63, 0x60, 0x0d, 0x05, 0x2e, 0xe2, 0xa0, 0xe6, 0xd1, 0x37, 0x1d, 0x8a, + 0x81, 0x2a, 0xc4, 0x71, 0xed, 0xa1, 0x95, 0x64, 0x1d, 0x03, 0x29, 0x6e, 0xe2, 0x41, 0xbc, 0xea, + 0xd0, 0x2c, 0x54, 0x2e, 0x6b, 0x13, 0xcb, 0x02, 0x9e, 0x04, 0xfc, 0x2f, 0x04, 0xe4, 0x20, 0x0e, + 0x20, 0xbc, 0x88, 0x87, 0xab, 0x8c, 0x07, 0x88, 0x1f, 0x11, 0xfb, 0x11, 0x6e, 0x81, 0xf5, 0x9e, + 0x15, 0x09, 0x68, 0x08, 0x06, 0x83, 0xf0, 0xb8, 0x21, 0x16, 0x8b, 0x7d, 0x20, 0x10, 0x50, 0x27, + 0x12, 0x10, 0xa6, 0x0b, 0xf4, 0x3f, 0x11, 0x1f, 0x9f, 0x1d, 0x87, 0xae, 0x5b, 0x5d, 0x70, 0x54, + 0x39, 0xca, 0xf8, 0x86, 0x2f, 0x37, 0x80, 0xeb, 0x73, 0x17, 0x03, 0x71, 0xbe, 0x2f, 0xc3, 0x47, + 0x02, 0x23, 0x70, 0x7a, 0xe2, 0x34, 0x3c, 0x52, 0x1f, 0xb1, 0xf6, 0x15, 0x45, 0x81, 0x78, 0x3c, + 0x9e, 0xb8, 0x1f, 0x71, 0x55, 0x55, 0x07, 0x0d, 0x9d, 0x7f, 0x41, 0x9b, 0x6e, 0x0b, 0x8d, 0x02, + 0x20, 0x9d, 0x80, 0xa9, 0x7f, 0xa7, 0x4c, 0x77, 0x30, 0x13, 0xbf, 0x11, 0xb8, 0xc1, 0xb6, 0x9b, + 0x2e, 0x6e, 0x82, 0xa6, 0xd1, 0x26, 0xa1, 0x80, 0xa5, 0xa5, 0xa5, 0x87, 0x06, 0x01, 0xb5, 0x9a, + 0x80, 0xfd, 0xa6, 0x04, 0xf4, 0xdc, 0xee, 0x71, 0x4c, 0x00, 0xc7, 0x70, 0x60, 0x18, 0xae, 0xdd, + 0xbb, 0x96, 0x52, 0x00, 0xe5, 0x08, 0x2d, 0xd1, 0xf1, 0x84, 0xe7, 0x5e, 0x21, 0xe0, 0x71, 0x03, + 0x8e, 0x88, 0x5e, 0x40, 0xb1, 0x21, 0x6b, 0x17, 0xaf, 0x10, 0x40, 0x43, 0xc8, 0xa1, 0xe7, 0xb5, + 0x3f, 0xd5, 0x32, 0x9e, 0xdb, 0x9e, 0x9b, 0x40, 0xb6, 0x9c, 0x9e, 0xb8, 0x91, 0xe7, 0x75, 0xe4, + 0x41, 0xc5, 0xe5, 0x0a, 0x88, 0xa9, 0x31, 0xd1, 0x08, 0xd4, 0x19, 0x04, 0xd4, 0x49, 0x5b, 0x68, + 0xeb, 0xd7, 0x5b, 0x1d, 0xb7, 0x10, 0x71, 0x12, 0x42, 0xfb, 0xe7, 0x7f, 0x3b, 0x9f, 0x24, 0x80, + 0xb2, 0xb5, 0x56, 0x72, 0xe8, 0x05, 0x1c, 0xe7, 0x59, 0x3c, 0xad, 0x80, 0x99, 0x85, 0x19, 0xe9, + 0x0e, 0x6e, 0xf9, 0x6a, 0x0b, 0x54, 0x7e, 0x5b, 0x09, 0x05, 0x3d, 0x05, 0x59, 0x09, 0xa8, 0xb9, + 0x5a, 0x63, 0x14, 0x40, 0x25, 0x47, 0x8d, 0xae, 0xf8, 0xab, 0x40, 0x54, 0xd3, 0xf1, 0x27, 0x22, + 0x06, 0xa8, 0x6e, 0xd2, 0xb6, 0xf9, 0x9a, 0x80, 0xcd, 0x49, 0xc7, 0xd3, 0xc5, 0xc0, 0xa9, 0x5f, + 0x4f, 0x25, 0x3c, 0xdc, 0x3a, 0xda, 0x0a, 0x91, 0xd9, 0xc8, 0x8a, 0x18, 0x91, 0xe5, 0x9e, 0x2e, + 0x4f, 0xc6, 0x18, 0x48, 0xc4, 0x8c, 0x12, 0x14, 0x4d, 0xa3, 0x49, 0x02, 0xa4, 0x62, 0xa0, 0xf7, + 0x76, 0x2f, 0x0c, 0xfd, 0x39, 0x04, 0x32, 0x89, 0x2e, 0x13, 0x6f, 0xf9, 0xb9, 0x45, 0xca, 0x42, + 0xcc, 0x72, 0x76, 0x09, 0xb0, 0x93, 0x0f, 0xfc, 0x31, 0xe0, 0xac, 0x00, 0x0a, 0x1c, 0x0e, 0x27, + 0x38, 0x75, 0x8a, 0x3a, 0x4a, 0x20, 0xce, 0xf7, 0x53, 0x71, 0x7d, 0x1e, 0x90, 0x12, 0x60, 0xd6, + 0xd3, 0x46, 0x1e, 0x8d, 0x45, 0x61, 0x62, 0x76, 0x02, 0x06, 0xa6, 0x07, 0x18, 0xf7, 0xde, 0xf3, + 0x26, 0x40, 0xbc, 0xed, 0x66, 0x9b, 0x74, 0x0c, 0xa4, 0x28, 0x25, 0xb2, 0xb7, 0xd0, 0xfd, 0xf9, + 0xfb, 0xd0, 0x79, 0xab, 0x93, 0xf1, 0xc3, 0xbe, 0xc3, 0xb0, 0xc7, 0xbb, 0x87, 0x25, 0x1f, 0x3b, + 0xf3, 0x40, 0x6e, 0x87, 0xcd, 0x02, 0xe6, 0xd4, 0x39, 0xc6, 0xab, 0xaf, 0x54, 0x43, 0x4e, 0x7b, + 0x8e, 0xe3, 0x89, 0xac, 0xa8, 0xaf, 0xc8, 0x9a, 0x00, 0x91, 0x87, 0x03, 0x4a, 0x80, 0x0d, 0xaf, + 0x8c, 0x67, 0xed, 0xe2, 0xbe, 0xa0, 0xcf, 0x9e, 0x18, 0xd8, 0x7d, 0x75, 0xb7, 0x6d, 0xb5, 0x8f, + 0x6c, 0x2d, 0x44, 0xfb, 0x94, 0x6f, 0xb2, 0xb2, 0xd0, 0xf4, 0xdc, 0xb4, 0xed, 0xb5, 0x8f, 0x19, + 0x0b, 0x75, 0x4f, 0x75, 0x5b, 0x17, 0x40, 0x7e, 0x2f, 0xf9, 0xa6, 0x64, 0x55, 0x05, 0x4c, 0xfe, + 0x33, 0x69, 0x3d, 0x06, 0xfc, 0x41, 0xbf, 0x69, 0xcf, 0xf2, 0x18, 0x21, 0xef, 0xd2, 0xf5, 0x81, + 0x60, 0x80, 0x71, 0xda, 0x72, 0xc8, 0xb6, 0x47, 0x6d, 0xf1, 0x18, 0x34, 0x1d, 0x03, 0x63, 0x0f, + 0xc6, 0x60, 0x6d, 0xc7, 0x5a, 0x69, 0x4f, 0xef, 0xf3, 0xee, 0x63, 0x6f, 0x51, 0x6a, 0x5c, 0x95, + 0xca, 0x13, 0x32, 0x31, 0xb0, 0xab, 0x7f, 0x17, 0x3b, 0xdf, 0xd2, 0x08, 0x1c, 0x0b, 0x1d, 0x33, + 0x65, 0x09, 0xd9, 0x52, 0x22, 0xf2, 0x77, 0x44, 0xda, 0x42, 0x47, 0xfc, 0x47, 0xd2, 0xbd, 0x13, + 0xa7, 0x17, 0x40, 0x75, 0xbc, 0x8c, 0x80, 0xd2, 0x4b, 0xa5, 0xa6, 0x04, 0x9c, 0xf8, 0xe5, 0x84, + 0xb4, 0x80, 0x33, 0x91, 0x33, 0xd6, 0x05, 0x98, 0x9d, 0xa7, 0x65, 0x6b, 0x21, 0x5a, 0x42, 0x91, + 0x6d, 0x9f, 0xea, 0x25, 0xcb, 0x31, 0x20, 0x3b, 0x8f, 0x9f, 0x8b, 0x9c, 0x93, 0xae, 0x95, 0xfa, + 0xa6, 0xfa, 0xa4, 0xf3, 0xc0, 0xfa, 0xce, 0xf5, 0xac, 0x9e, 0xb2, 0x1c, 0x03, 0xb2, 0xd3, 0x60, + 0xf3, 0x68, 0xb3, 0x94, 0x85, 0xee, 0x44, 0xef, 0xc0, 0xc6, 0x8b, 0x1b, 0xa5, 0xa7, 0xd1, 0xb2, + 0x4b, 0x65, 0x99, 0xd6, 0x85, 0xec, 0x11, 0x50, 0x7e, 0xb9, 0x5c, 0x4a, 0xc0, 0xce, 0x1f, 0x76, + 0x9a, 0xca, 0x03, 0xf5, 0x83, 0xf5, 0xd9, 0x09, 0x30, 0x5b, 0xbb, 0xa4, 0xf2, 0xbc, 0x99, 0x79, + 0x5f, 0xcf, 0x29, 0x87, 0xe8, 0xdb, 0x73, 0x2c, 0x06, 0x38, 0xdf, 0xd6, 0xbd, 0x0d, 0x1a, 0x87, + 0x1b, 0xe1, 0xe4, 0xd8, 0x49, 0xc6, 0x69, 0xfd, 0xa8, 0xb0, 0xb7, 0xd0, 0x72, 0x2d, 0xd4, 0xff, + 0x7b, 0x7f, 0x22, 0x86, 0x0c, 0xab, 0x12, 0xf4, 0xf1, 0xf1, 0x0d, 0x44, 0x01, 0x5f, 0x1b, 0x45, + 0xbc, 0x8e, 0xa8, 0x4c, 0x12, 0xe0, 0xf9, 0xc2, 0xe3, 0x58, 0xe9, 0x20, 0x63, 0xa1, 0xbb, 0xd1, + 0xbb, 0x42, 0x0b, 0xd1, 0x92, 0xba, 0x60, 0x5d, 0xa8, 0x8d, 0xbe, 0x1e, 0x25, 0x09, 0xd8, 0xeb, + 0xdd, 0x6b, 0x6b, 0x87, 0x29, 0x56, 0xaa, 0xae, 0x54, 0x49, 0xaf, 0x8d, 0xa6, 0x5b, 0xdc, 0x15, + 0xac, 0xcc, 0x35, 0x08, 0x6b, 0x21, 0x6a, 0xc8, 0xae, 0xfa, 0x9e, 0xe7, 0x00, 0xab, 0x31, 0x95, + 0x61, 0x6d, 0xb4, 0x62, 0x85, 0x00, 0x55, 0x55, 0xe1, 0xec, 0xf8, 0x59, 0x58, 0xd7, 0xb9, 0x8e, + 0x71, 0xda, 0x72, 0x98, 0xe1, 0x3b, 0xbe, 0xdb, 0xb1, 0xfc, 0x8e, 0xbc, 0x10, 0x85, 0xfc, 0xae, + 0x7c, 0xe1, 0xf9, 0xf4, 0xa0, 0xf4, 0x9c, 0x02, 0x38, 0x16, 0x8b, 0xb1, 0x3e, 0x10, 0x04, 0x23, + 0xf0, 0xb4, 0x6e, 0x75, 0xba, 0x15, 0x91, 0x9b, 0xf2, 0x7d, 0xe0, 0x90, 0xef, 0x90, 0x25, 0xcb, + 0xd0, 0xeb, 0x26, 0xad, 0xf5, 0x2f, 0xc4, 0x17, 0x18, 0x0f, 0xcf, 0x84, 0xa5, 0x63, 0x80, 0x66, + 0x2e, 0x13, 0xdf, 0x07, 0xea, 0x8d, 0xb3, 0xd0, 0x98, 0x68, 0x1e, 0xdf, 0xfe, 0xfd, 0x76, 0x29, + 0x01, 0xee, 0x76, 0xf7, 0xb2, 0x05, 0xfe, 0x52, 0x92, 0xae, 0xbf, 0x30, 0x79, 0x41, 0x5a, 0x00, + 0x95, 0x10, 0x82, 0x2f, 0x34, 0x3e, 0x83, 0x80, 0x17, 0x35, 0x01, 0xe5, 0x46, 0x01, 0x8d, 0xec, + 0x89, 0x85, 0xc3, 0x09, 0x70, 0xee, 0x57, 0xfc, 0x30, 0x1c, 0x5c, 0xae, 0xf7, 0x07, 0x03, 0x83, + 0x70, 0xdd, 0x7f, 0x9d, 0x81, 0x9e, 0xd8, 0x50, 0x60, 0x08, 0x46, 0x94, 0x11, 0x08, 0x85, 0x42, + 0x20, 0xba, 0x3e, 0x14, 0x0e, 0xb1, 0xff, 0xf8, 0xff, 0x7c, 0x3f, 0x15, 0x37, 0x5e, 0x8f, 0x96, + 0xfa, 0x50, 0xf0, 0x8d, 0xec, 0x20, 0x5f, 0x13, 0xd5, 0x0b, 0x78, 0x66, 0x7e, 0x7e, 0xfe, 0xe3, + 0xc5, 0xc5, 0xc5, 0x9b, 0xdc, 0x83, 0xab, 0x09, 0xec, 0x87, 0x82, 0xfd, 0xf9, 0x08, 0xfb, 0xb5, + 0x46, 0x20, 0x20, 0xcf, 0x78, 0xec, 0x3f, 0x1b, 0x75, 0xce, 0x5d, 0xf3, 0xcf, 0xc0, 0x5f, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE icon_bitmap2component_xpm[1] = {{ png, sizeof( png ), "icon_bitmap2component_xpm" }}; diff --git a/bitmaps_png/sources/find.svg b/bitmaps_png/sources/find.svg index 47623cf7c1..f5901fee87 100644 --- a/bitmaps_png/sources/find.svg +++ b/bitmaps_png/sources/find.svg @@ -13,8 +13,8 @@ inkscape:export-ydpi="90.000000" inkscape:export-xdpi="90.000000" inkscape:export-filename="/home/steven/edit-find-48.png" - sodipodi:docname="find.svg.BASE" - inkscape:version="0.48.2 r9819" + sodipodi:docname="find.svg" + inkscape:version="0.48.3.1 r9886" sodipodi:version="0.32" id="svg249" height="26" @@ -59,18 +59,6 @@ offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.24761905;" /> - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -611,66 +800,74 @@ id="rect15686-03" style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> - + id="g3976" + transform="translate(25.279068,-0.44194166)"> + id="path2844-9-9" + d="m -11.906647,26.457898 c -3.713666,0 -6.727656,2.978546 -6.727656,6.64854 0,3.669995 3.01399,6.648541 6.727656,6.648541 1.587627,0 2.9890449,-0.624233 4.140095,-1.534279 -0.093708,0.45401 -0.035603,0.917763 0.3450081,1.244471 l 5.0026161,4.29598 c 0.5627744,0.48307 1.4087257,0.419777 1.89754376,-0.13638 0.4888181,-0.556158 0.42477151,-1.39216 -0.13800297,-1.87523 l -5.00261609,-4.29598 c -0.3063996,-0.263005 -0.68116,-0.340872 -1.0522742,-0.289808 0.9064777,-1.13287 1.5352853,-2.501996 1.5352853,-4.057315 0,-3.669994 -3.0139896,-6.64854 -6.727655,-6.64854 z m -0.0345,0.552895 c 3.4856796,0 6.0646791,2.159374 6.0646791,5.99336 0,3.911673 -2.6539989,5.99336 -6.0646791,5.99336 -3.332138,0 -6.064678,-2.470112 -6.064678,-5.99336 0,-3.600093 2.657626,-5.99336 6.064678,-5.99336 z" + style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3985);stroke-width:1.80999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + d="m -11.917901,26.429401 c -3.72567,0 -6.749403,2.988174 -6.749403,6.670032 0,3.681857 3.023733,6.670031 6.749403,6.670031 1.59276,0 2.9987074,-0.62625 4.1534789,-1.539237 -0.094011,0.455477 -0.035722,0.920729 0.3461228,1.248493 l 5.0187873,4.309866 c 0.5645936,0.484632 1.41327926,0.421134 1.90367743,-0.136821 0.49039817,-0.557954 0.42614443,-1.396659 -0.13844921,-1.881291 L -5.6530706,37.460607 c -0.3073902,-0.263854 -0.683362,-0.341974 -1.0556758,-0.290744 0.9094079,-1.136532 1.5402483,-2.510085 1.5402483,-4.07043 0,-3.681858 -3.0237325,-6.670032 -6.7494029,-6.670032 z m -0.03461,1.436622 c 2.8659006,0 5.1918483,2.298596 5.1918483,5.130794 0,2.832198 -2.3259477,5.130793 -5.1918483,5.130793 -2.8659,0 -5.191848,-2.298595 -5.191848,-5.130793 0,-2.832198 2.325948,-5.130794 5.191848,-5.130794 z" + id="path4430-3-6" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + inkscape:connector-curvature="0" + style="color:#000000;fill:url(#linearGradient3987);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -2.3799238,43.788135 c -0.2184051,-1.024997 0.637564,-2.169506 1.63530681,-2.159114 0,0 -4.90966551,-4.174551 -4.90966551,-4.174551 -1.3436287,-0.02557 -1.9480587,1.02474 -1.7232584,2.074139 l 4.9976171,4.259526 z" + id="path4438-0-4" + sodipodi:nodetypes="ccccc" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + transform="matrix(0.56839909,0,0,0.56171489,-21.968801,22.255175)" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + style="opacity:0.43315507;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.70510882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect4495-7-3" + width="8.6471872" + height="2.0123112" + x="19.239033" + y="32.352734" + rx="1.5078329" + ry="1.3300102" + transform="matrix(0.75682702,0.65361522,-0.65333777,0.75706655,0,0)" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + transform="matrix(0.63815043,0,0,0.63064598,-23.245907,21.298384)" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + inkscape:connector-curvature="0" + style="opacity:0.83422457;color:#000000;fill:url(#radialGradient3993);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -11.921206,28.37567 c 2.3760829,0 4.3001667,1.901457 4.3001667,4.249598 0,0.678154 -0.1917749,1.302119 -0.4777963,1.871222 -0.5714273,0.208145 -1.1784425,0.349762 -1.8227046,0.349762 -2.8156408,0 -5.0643028,-2.192149 -5.2380628,-4.931633 0.789792,-0.922345 1.920927,-1.538949 3.238397,-1.538949 z" + id="path4462-9-8" + inkscape:r_cx="true" + inkscape:r_cy="true" /> diff --git a/bitmaps_png/sources/icon_bitmap2component.svg b/bitmaps_png/sources/icon_bitmap2component.svg index 01324ffd40..c5446344d4 100644 --- a/bitmaps_png/sources/icon_bitmap2component.svg +++ b/bitmaps_png/sources/icon_bitmap2component.svg @@ -5,7 +5,6 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" height="48" @@ -25,7 +24,7 @@ image/svg+xml - + @@ -43,8 +42,8 @@ id="namedview345" showgrid="true" inkscape:zoom="18.178537" - inkscape:cx="20.737894" - inkscape:cy="23.730717" + inkscape:cx="11.963811" + inkscape:cy="27.182846" inkscape:window-x="0" inkscape:window-y="29" inkscape:window-maximized="1" @@ -61,45 +60,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a + + + + sodipodi:docname="new_sch.svg"> @@ -22,7 +22,7 @@ image/svg+xml - + @@ -39,22 +39,24 @@ inkscape:window-height="849" id="namedview356" showgrid="true" - inkscape:zoom="8.146395" - inkscape:cx="33.460702" - inkscape:cy="37.915782" + inkscape:zoom="22.961538" + inkscape:cx="13.043551" + inkscape:cy="13" inkscape:window-x="0" inkscape:window-y="29" inkscape:window-maximized="1" inkscape:current-layer="svg2" - inkscape:snap-grids="false" + inkscape:snap-grids="true" inkscape:snap-to-guides="false"> + snapvisiblegridlinesonly="true" + spacingx="0.5px" + spacingy="0.5px" /> @@ -120,448 +122,6 @@ stdDeviation="1.9447689" id="feGaussianBlur13" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="opacity:0.5;filter:url(#bb)" + sodipodi:nodetypes="cccccccc" /> + style="fill:#ffffff" + sodipodi:nodetypes="cccccc" /> + style="fill:url(#radialGradient3371)" + sodipodi:nodetypes="cssssccssscc" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="opacity:0.4;filter:url(#bc)" + sodipodi:nodetypes="ccccc" /> + style="fill:url(#linearGradient3327)" + sodipodi:nodetypes="ccccc" /> + + + + + + + + + + + + + + + + + + + + From 4da4a558a9632c09ae834f7f4e14b9c4e8eedf0b Mon Sep 17 00:00:00 2001 From: Miguel Angel Ajo Date: Wed, 12 Feb 2014 22:17:19 +0100 Subject: [PATCH 06/11] Enforces python2.6 / 2.7, thanks to orsonmmz --- CMakeLists.txt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 84ec69197f..44e56d5c72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -513,18 +513,24 @@ set( INC_AFTER # Find Python and other scripting resources if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) - if( NOT APPLE ) - set( PythonInterp_FIND_VERSION ) - else() + if( APPLE ) set( PYTHON_LIBRARY /System/Library/Frameworks/Python.framework/Versions/2.6/Python ) set( PYTHON_INCLUDE_DIR /System/Library/Frameworks/Python.framework/Versions//2.6/include/python2.6 ) set( PythonInterp_FIND_VERSION 2.6 ) set( PythonLibs_FIND_VERSION 2.6 ) endif() + + # force a python version < 3.0 + set( PythonInterp_FIND_VERSION 2.6) + set( PythonLibs_FIND_VERSION 2.6 ) find_package( PythonInterp ) + check_find_package_result( PYTHONINTERP_FOUND "Python Interpreter" ) - + + if( NOT PYTHON_VERSION_MAJOR EQUAL 2 ) + message( FATAL_ERROR "Python 2.x is required." ) + endif() # Get the correct Python site package install path from the Python interpreter found by # FindPythonInterp unless the user specifically defined a custom path. if( NOT PYTHON_SITE_PACKAGE_PATH ) @@ -542,7 +548,7 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) mark_as_advanced( PYTHON_DEST ) message( STATUS "Python module install path: ${PYTHON_DEST}" ) - find_package( PythonLibs ) + find_package( PythonLibs 2.6 ) #message( STATUS "PYTHON_INCLUDE_DIRS:${PYTHON_INCLUDE_DIRS}" ) From 3329ed26f3ab8f32443999cc50474cd55c5e260f Mon Sep 17 00:00:00 2001 From: Miguel Angel Ajo Date: Wed, 12 Feb 2014 22:19:12 +0100 Subject: [PATCH 07/11] switching to the new python scripting console icon --- pcbnew/tool_pcb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcbnew/tool_pcb.cpp b/pcbnew/tool_pcb.cpp index d57011f534..e0f4647a2e 100644 --- a/pcbnew/tool_pcb.cpp +++ b/pcbnew/tool_pcb.cpp @@ -307,7 +307,7 @@ void PCB_EDIT_FRAME::ReCreateHToolbar() // Access to the scripting console #ifdef KICAD_SCRIPTING_WXPYTHON m_mainToolBar->AddTool( ID_TOOLBARH_PCB_SCRIPTING_CONSOLE, wxEmptyString, - KiBitmap( book_xpm ), + KiBitmap( py_script_xpm ), _( "Show/Hide the Scripting console" ) ); m_mainToolBar->AddSeparator(); From 63eac42d07ebb4a25c9aaf1da55a5495e85f2c29 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 13 Feb 2014 18:27:48 +0100 Subject: [PATCH 08/11] Fix a minor error in class D_PAD: void D_PAD::Flip( int Y ) changed to virtual void D_PAD::Flip( const wxPoint& aCentre ) (as defined in BOARD_ITEM) Scripting: fix compatibility current pcbnew version in 2 examples and the default extension of board files in board.i (was .kicad_brd, now is .kicad_pcb) --- Documentation/compiling/COMPILING.txt | 8 ++++++ pcbnew/class_module.cpp | 2 +- pcbnew/class_pad.cpp | 6 ++--- pcbnew/class_pad.h | 2 +- pcbnew/scripting/board.i | 34 ++++++++++++------------ pcbnew/scripting/examples/createFPC40.py | 9 ++++--- pcbnew/scripting/examples/createPcb.py | 8 +++--- 7 files changed, 39 insertions(+), 30 deletions(-) diff --git a/Documentation/compiling/COMPILING.txt b/Documentation/compiling/COMPILING.txt index fde596fa3a..8457885384 100644 --- a/Documentation/compiling/COMPILING.txt +++ b/Documentation/compiling/COMPILING.txt @@ -138,9 +138,17 @@ bzr branch lp:kicad/stable kicad_src Components and Footprints libraries all (schematic libs, 3D shapes ...) but new footprints libraries (use Download zip tool) https://github.com/KiCad/kicad-library/ + New footprints libraries (use Download zip tool for each lib you want) https://github.com/KiCad/ for footprint libs (*.pretty folders) +A mirror of github is available, using bzr: +(schematic libs, 3D shapes ... all but new footprints libraries) +bzr checkout lp:~kicad-product-committers/kicad/library + +Old legacy libraries: +bzr checkout lp:~dickelbeck/kicad/library-read-only + Note also Kicad is able to read on github.com/KiCad/ the *.pretty folders without download, using github plugin. (however the time to read them can be long) diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 11f14217fe..95db2ce46f 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -799,7 +799,7 @@ void MODULE::Flip( const wxPoint& aCentre ) // Mirror pads to other side of board about the x axis, i.e. vertically. for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) - pad->Flip( m_Pos.y ); + pad->Flip( m_Pos ); // Mirror reference. text = m_Reference; diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 5a48ac461a..7ebcc376b9 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -214,13 +214,13 @@ void D_PAD::SetOrientation( double aAngle ) } -void D_PAD::Flip( int aTranslationY ) +void D_PAD::Flip( const wxPoint& aCentre ) { - int y = GetPosition().y - aTranslationY; + int y = GetPosition().y - aCentre.y; y = -y; // invert about x axis. - y += aTranslationY; + y += aCentre.y; SetY( y ); diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 0391d92b4b..a32bb06acf 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -167,7 +167,7 @@ public: void SetOffset( const wxPoint& aOffset ) { m_Offset = aOffset; } const wxPoint& GetOffset() const { return m_Offset; } - void Flip( int aTranslationY ); + void Flip( const wxPoint& aCentre ); // Virtual function /** * Function SetOrientation diff --git a/pcbnew/scripting/board.i b/pcbnew/scripting/board.i index e5b51cdef3..7c6f8e1985 100644 --- a/pcbnew/scripting/board.i +++ b/pcbnew/scripting/board.i @@ -29,7 +29,7 @@ %extend BOARD -{ +{ %pythoncode { def GetModules(self): return self.m_Modules @@ -42,35 +42,35 @@ def GetCurrentNetClassName(self): return self.m_CurrentNetClassName def GetViasDimensionsList(self): return self.m_ViasDimensionsList def GetTrackWidthList(self): return self.m_TrackWidthList - + def Save(self,filename,format = None): if format is None: str_filename = str(filename) if str_filename.endswith(".brd"): format = IO_MGR.LEGACY - if str_filename.endswith(".kicad_brd"): - format = IO_MGR.KICAD + if str_filename.endswith(".kicad_pcb"): + format = IO_MGR.KICAD return SaveBoard(filename,self,format) - + # # add function, clears the thisown to avoid python from deleting # the object in the garbage collector # - - def Add(self,item): + + def Add(self,item): item.thisown=0 self.AddNative(item) } - + } -// this is to help python with the * accessor of DLIST templates +// this is to help python with the * accessor of DLIST templates -%rename(Get) operator BOARD_ITEM*; -%rename(Get) operator TRACK*; -%rename(Get) operator D_PAD*; -%rename(Get) operator MODULE*; -%rename(Get) operator SEGZONE*; +%rename(Get) operator BOARD_ITEM*; +%rename(Get) operator TRACK*; +%rename(Get) operator D_PAD*; +%rename(Get) operator MODULE*; +%rename(Get) operator SEGZONE*; // we must translate C++ templates to scripting languages @@ -81,14 +81,14 @@ %template(TRACK_List) DLIST; %template(PAD_List) DLIST; -// std::vector templates +// std::vector templates %template(VIA_DIMENSION_Vector) std::vector; %template (RASTNET_Vector) std::vector; %extend DRAWSEGMENT { - %pythoncode + %pythoncode { def GetShapeStr(self): return self.ShowShape(self.GetShape()) @@ -102,7 +102,7 @@ def SetPos(self,p): self.SetPosition(p) self.SetPos0(p) - + def SetStartEnd(self,start,end): self.SetStart(start) self.SetStart0(start) diff --git a/pcbnew/scripting/examples/createFPC40.py b/pcbnew/scripting/examples/createFPC40.py index 95f4678e7c..7c6568e730 100755 --- a/pcbnew/scripting/examples/createFPC40.py +++ b/pcbnew/scripting/examples/createFPC40.py @@ -34,10 +34,10 @@ def smdRectPad(module,size,pos,name): for n in range (0,pads): pad = smdRectPad(module,size_025_160mm,wxPointMM(0.5*n,0),str(n+1)) module.Add(pad) - + pad_s0 = smdRectPad(module,size_150_200mm,wxPointMM(-1.6,1.3),"0") -pad_s1 = smdRectPad(module,size_150_200mm,wxPointMM((pads-1)*0.5+1.6,1.3),"0") +pad_s1 = smdRectPad(module,size_150_200mm,wxPointMM((pads-1)*0.5+1.6,1.3),"0") module.Add(pad_s0) module.Add(pad_s1) @@ -50,10 +50,11 @@ e.SetShape(S_SEGMENT) module.Add(e) # save the PCB to disk -module.SetLibRef("FPC"+str(pads)) +fpid = FPID("FPC"+str(pads)) #the name in library +module.SetFPID( fpid ) + try: FootprintLibCreate("fpc40.mod") except: pass # we try to create, but may be it exists already FootprintSave("fpc40.mod",module) - diff --git a/pcbnew/scripting/examples/createPcb.py b/pcbnew/scripting/examples/createPcb.py index b3c977d24e..21c38036c6 100755 --- a/pcbnew/scripting/examples/createPcb.py +++ b/pcbnew/scripting/examples/createPcb.py @@ -30,13 +30,13 @@ for y in range (0,10): pad.SetPadName(str(n)) module.Add(pad) n+=1 - + # save the PCB to disk -pcb.Save("/tmp/my2.kicad_brd") -pcb.Save("/tmp/my2.brd") +pcb.Save("my2.kicad_pcb") +pcb.Save("my2.brd") -pcb = LoadBoard("/tmp/my2.brd") +pcb = LoadBoard("my2.kicad_pcb") print map( lambda x: x.GetReference() , list(pcb.GetModules())) From 4340ceeb8beec3c35e31187d44d543b9d08f63ad Mon Sep 17 00:00:00 2001 From: Henner Zeller Date: Fri, 14 Feb 2014 09:05:04 +0100 Subject: [PATCH 09/11] PATCH: making component choosing (much!) more usable --- eeschema/CMakeLists.txt | 3 + eeschema/component_tree_search_container.cpp | 356 +++++++++ eeschema/component_tree_search_container.h | 108 +++ eeschema/dialogs/dialog_choose_component.cpp | 275 +++++++ eeschema/dialogs/dialog_choose_component.h | 69 ++ .../dialogs/dialog_choose_component_base.cpp | 109 +++ .../dialogs/dialog_choose_component_base.fbp | 710 ++++++++++++++++++ .../dialogs/dialog_choose_component_base.h | 67 ++ eeschema/getpart.cpp | 111 +-- 9 files changed, 1728 insertions(+), 80 deletions(-) create mode 100644 eeschema/component_tree_search_container.cpp create mode 100644 eeschema/component_tree_search_container.h create mode 100644 eeschema/dialogs/dialog_choose_component.cpp create mode 100644 eeschema/dialogs/dialog_choose_component.h create mode 100644 eeschema/dialogs/dialog_choose_component_base.cpp create mode 100644 eeschema/dialogs/dialog_choose_component_base.fbp create mode 100644 eeschema/dialogs/dialog_choose_component_base.h diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 05dd30bf82..45411d8fae 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -19,6 +19,8 @@ set( EESCHEMA_DLGS dialogs/dialog_bom.cpp dialogs/dialog_bom_base.cpp dialogs/dialog_bom_cfg_keywords.cpp + dialogs/dialog_choose_component.cpp + dialogs/dialog_choose_component_base.cpp dialogs/dialog_lib_edit_text.cpp dialogs/dialog_lib_edit_text_base.cpp dialogs/dialog_edit_component_in_lib.cpp @@ -88,6 +90,7 @@ set( EESCHEMA_SRCS files-io.cpp find.cpp getpart.cpp + component_tree_search_container.cpp hierarch.cpp hotkeys.cpp libarch.cpp diff --git a/eeschema/component_tree_search_container.cpp b/eeschema/component_tree_search_container.cpp new file mode 100644 index 0000000000..6972ff1956 --- /dev/null +++ b/eeschema/component_tree_search_container.cpp @@ -0,0 +1,356 @@ +/* -*- c++ -*- + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2014 Henner Zeller + * Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +// Each node gets this lowest score initially, without any matches applied. Matches +// will then increase this score depending on match quality. +// This way, an empty search string will result in all components being displayed as they +// have the minimum score. However, in that case, we avoid expanding all the nodes asd the +// result is very unspecific. +static const unsigned kLowestDefaultScore = 1; + +struct COMPONENT_TREE_SEARCH_CONTAINER::TREE_NODE +{ + TREE_NODE(TREE_NODE* aParent, CMP_LIBRARY* aOwningLib, + const wxString& aName, const wxString& aDisplayInfo, + const wxString& aSearchText, + bool aNormallyExpanded = false) + : parent( aParent ), + lib( aOwningLib ), + normally_expanded( aNormallyExpanded ), + name( aName ), + display_info( aDisplayInfo ), + match_name( aName.Lower() ), + search_text( aSearchText.Lower() ), + match_score( 0 ), previous_score( 0 ) + { + } + + TREE_NODE* parent; // NULL if library, pointer to lib when component. + CMP_LIBRARY* lib; // Owning library of this component. + bool normally_expanded; // If this is a parent node, should it be unfolded ? + wxString name; // Exact name as displayed to the user. + wxString display_info; // Additional info displayed in the tree (description..) + + wxString match_name; // Preprocessed: lowercased display name. + wxString search_text; // Other lowercase text (keywords, description..) to search in. + + unsigned match_score; // Result-Score after UpdateSearchTerm() + unsigned previous_score; // Optimization: used to see if we need any tree update. + wxTreeItemId tree_id; // Tree-ID if stored in the tree (if match_score > 0). +}; + + +// Sort tree nodes by reverse match-score (bigger is first), then alphabetically. +// Library nodes (i.e. the ones that don't have a parent) are always sorted before any +// leaf nodes. +bool COMPONENT_TREE_SEARCH_CONTAINER::scoreComparator( const TREE_NODE* a1, const TREE_NODE* a2 ) +{ + if ( a1->parent == NULL && a2->parent != NULL ) + return true; + + if ( a1->parent != NULL && a2->parent == NULL ) + return false; + + if ( a1->match_score != a2->match_score ) + return a1->match_score > a2->match_score; // biggest first. + + if (a1->parent != a2->parent) + return a1->parent->match_name.Cmp(a2->parent->match_name) < 0; + + return a1->match_name.Cmp( a2->match_name ) < 0; +} + +COMPONENT_TREE_SEARCH_CONTAINER::COMPONENT_TREE_SEARCH_CONTAINER() + : tree( NULL ) +{ +} + + +COMPONENT_TREE_SEARCH_CONTAINER::~COMPONENT_TREE_SEARCH_CONTAINER() +{ + BOOST_FOREACH( TREE_NODE* node, nodes ) + delete node; + nodes.clear(); +} + + +void COMPONENT_TREE_SEARCH_CONTAINER::SetPreselectNode( const wxString& aComponentName ) +{ + preselect_node_name = aComponentName.Lower(); +} + + +void COMPONENT_TREE_SEARCH_CONTAINER::SetTree( wxTreeCtrl* aTree ) +{ + tree = aTree; + UpdateSearchTerm( wxEmptyString ); +} + + +void COMPONENT_TREE_SEARCH_CONTAINER::AddLibrary( CMP_LIBRARY& aLib ) +{ + wxArrayString all_comp; + + aLib.GetEntryNames( all_comp ); + AddComponentList( aLib.GetName(), all_comp, &aLib, false ); +} + + +void COMPONENT_TREE_SEARCH_CONTAINER::AddComponentList( const wxString& aNodeName, + const wxArrayString& aComponentNameList, + CMP_LIBRARY* aOptionalLib, + bool aNormallyExpanded ) +{ + TREE_NODE* parent_node = new TREE_NODE( NULL, NULL, aNodeName, wxEmptyString, wxEmptyString, + aNormallyExpanded ); + + nodes.push_back( parent_node ); + + BOOST_FOREACH( const wxString& cName, aComponentNameList ) + { + LIB_COMPONENT *c; + + if (aOptionalLib) + c = aOptionalLib->FindComponent( cName ); + else + c = CMP_LIBRARY::FindLibraryComponent( cName, wxEmptyString ); + + if (c == NULL) + continue; + + wxString keywords, descriptions; + wxString display_info; + + for ( size_t i = 0; i < c->GetAliasCount(); ++i ) + { + LIB_ALIAS *a = c->GetAlias( i ); + keywords += a->GetKeyWords(); + descriptions += a->GetDescription(); + + if ( display_info.empty() && !a->GetDescription().empty() ) + { + // Preformatting. Unfortunately, the tree widget doesn't have columns + display_info.Printf( wxT(" %s[ %s ]"), + ( cName.length() <= 8 ) ? wxT("\t\t") : wxT("\t"), + GetChars( a->GetDescription() ) ); + } + } + + // If there are no keywords, we give a couple of characters whitespace penalty. We want + // a component with a search-term found in the keywords score slightly higher than another + // component without keywords, but that term in the descriptions. + wxString search_text = ( !keywords.empty() ) ? keywords : wxT(" "); + search_text += descriptions; + nodes.push_back( new TREE_NODE( parent_node, c->GetLibrary(), + cName, display_info, search_text ) ); + } +} + + +LIB_COMPONENT* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedComponent() +{ + const wxTreeItemId& select_id = tree->GetSelection(); + BOOST_FOREACH( TREE_NODE* node, nodes ) + { + if ( node->match_score > 0 && node->tree_id == select_id && node->lib ) + return node->lib->FindComponent( node->name ); + } + return NULL; +} + + +// Creates a score depending on the position of a string match. If the position +// is 0 (= prefix match), this returns the maximum score. This degrades until +// pos == max, which returns a score of 0; +// Evertyhing else beyond that is just 0. Only values >= 0 allowed for position and max. +// +// @param aPosition is the position a string has been found in a substring. +// @param aMaximum is the maximum score this function returns. +// @return position dependent score. +static int matchPosScore(int aPosition, int aMaximum) +{ + return ( aPosition < aMaximum ) ? aMaximum - aPosition : 0; +} + + +void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch ) +{ + if ( tree == NULL ) + return; + + // We score the list by going through it several time, essentially with a complexity + // of O(n). For the default library of 2000+ items, this typically takes less than 5ms + // on an i5. Good enough, no index needed. + + // Initial AND condition: Leaf nodes are considered to match initially. + BOOST_FOREACH( TREE_NODE* node, nodes ) + { + node->previous_score = node->match_score; + node->match_score = node->parent ? kLowestDefaultScore : 0; // start-match for leafs. + } + + // Create match scores for each node for all the terms, that come space-separated. + // Scoring adds up values for each term according to importance of the match. If a term does + // not match at all, the result is thrown out of the results (AND semantics). + // From high to low + // - Exact match for a ccmponent name gives the highest score, trumping all. + // - A positional score depending of where a term is found as substring; prefix-match: high. + // - substring-match in library name. + // - substring match in keywords and descriptions with positional score. Keywords come + // first so contribute more to the score. + // + // This is of course subject to tweaking. + wxStringTokenizer tokenizer( aSearch ); + + while ( tokenizer.HasMoreTokens() ) + { + const wxString term = tokenizer.GetNextToken().Lower(); + BOOST_FOREACH( TREE_NODE* node, nodes ) + { + if ( node->parent == NULL) + continue; // Library nodes are not scored here. + + if ( node->match_score == 0) + continue; // Leaf node without score are out of the game. + + // Keywords and description we only count if the match string is at + // least two characters long. That avoids spurious, low quality + // matches. Most abbreviations are at three characters long. + int found_pos; + + if ( term == node->match_name ) + node->match_score += 1000; // exact match. High score :) + else if ( (found_pos = node->match_name.Find( term ) ) != wxNOT_FOUND ) + { + // Substring match. The earlier in the string the better. score += 20..40 + node->match_score += matchPosScore( found_pos, 20 ) + 20; + } + else if ( node->parent->match_name.Find( term ) != wxNOT_FOUND ) + node->match_score += 19; // parent name matches. score += 19 + else if ( ( found_pos = node->search_text.Find( term ) ) != wxNOT_FOUND ) + { + // If we have a very short string (like one or two letters), we don't want + // to accumulate scores if they just happen to be in keywords or description. + // For longer terms, we add scores 1..18 for positional match (higher in the + // front, where the keywords are). score += 0..18 + node->match_score += ( ( term.length() >= 2 ) + ? matchPosScore( found_pos, 17 ) + 1 + : 0 ); + } + else + node->match_score = 0; // No match. That's it for this item. + } + } + + // Parent nodes have the maximum score seen in any of their children. + unsigned highest_score_seen = 0; + bool any_change = false; + BOOST_FOREACH( TREE_NODE* node, nodes ) + { + if ( node->parent == NULL ) + continue; + + any_change |= (node->previous_score != node->match_score); + node->parent->match_score = std::max( node->parent->match_score, node->match_score ); + highest_score_seen = std::max( highest_score_seen, node->match_score ); + } + + + // The tree update might be slow, so we want to bail out if there is no change. + if ( !any_change ) + return; + + // Now: sort all items according to match score, libraries first. + std::sort( nodes.begin(), nodes.end(), scoreComparator ); + + // Fill the tree with all items that have a match. Re-arranging, adding and removing changed + // items is pretty complex, so we just re-build the whole tree. + tree->Freeze(); + tree->DeleteAllItems(); + wxTreeItemId root = tree->AddRoot( wxEmptyString ); + const TREE_NODE* first_match = NULL; + const TREE_NODE* preselected_node = NULL; + BOOST_FOREACH( TREE_NODE* node, nodes ) + { + if ( node->match_score == 0 ) + continue; + + // If we have nodes that go beyond the default score, suppress nodes that + // have the default score. That can happen if they have an honary += 0 score due to + // some one-letter match in the keyword or description. In this case, we prefer matches + // that just have higher scores. Improves confusion (and performance as the tree has to + // display less items). + if ( highest_score_seen > kLowestDefaultScore && node->match_score == kLowestDefaultScore ) + continue; + + wxString node_text; +#if 0 + // Node text with scoring information for debugging + node_text.Printf( wxT("%s (s=%u)%s"), GetChars(node->name), + node->match_score, GetChars(node->display_info)); +#else + node_text = node->name + node->display_info; +#endif + node->tree_id = tree->AppendItem( ( node->parent == NULL ) ? root : node->parent->tree_id, + node_text); + + // If we are a child node, we might need to expand. + if ( node->parent != NULL ) + { + if ( node->match_score > kLowestDefaultScore ) + { + tree->EnsureVisible( node->tree_id ); + + if ( first_match == NULL ) + first_match = node; // The "I am feeling lucky" element. + } + + if ( preselected_node == NULL && node->match_name == preselect_node_name ) + preselected_node = node; + } + + if ( node->parent == NULL && node->normally_expanded ) + tree->Expand( node->tree_id ); + } + + if ( first_match ) // Highest score search match pre-selected. + tree->SelectItem( first_match->tree_id ); + else if ( preselected_node ) // No search, so history item preselected. + tree->SelectItem( preselected_node->tree_id ); + + tree->Thaw(); +} diff --git a/eeschema/component_tree_search_container.h b/eeschema/component_tree_search_container.h new file mode 100644 index 0000000000..b89d1b2c6b --- /dev/null +++ b/eeschema/component_tree_search_container.h @@ -0,0 +1,108 @@ +/* -*- c++ -*- + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2014 Henner Zeller + * Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http: *www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http: *www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +class LIB_COMPONENT; +class CMP_LIBRARY; +class wxTreeCtrl; +class wxArrayString; + +// class COMPONENT_TREE_SEARCH_CONTAINER +// A container for components that allows to search them matching their name, keywords +// and descripotions, updating a wxTreeCtrl with the results (toplevel nodes: +// libraries, leafs: components), scored by relevance. +// +// The scored result list is adpated on each update on the search-term: this allows +// to have a search-as-you-type experience. +class COMPONENT_TREE_SEARCH_CONTAINER +{ +public: + COMPONENT_TREE_SEARCH_CONTAINER(); + ~COMPONENT_TREE_SEARCH_CONTAINER(); + + /** Function AddLibrary + * Add the components of this library to be searched. + * To be called in the setup phase to fill this container. + * + * @param aLib containting all the components to be added. + */ + void AddLibrary( CMP_LIBRARY& aLib ); + + /** Function AddComponentList + * Add the given list of components, given by name, to be searched. + * To be called in the setup phase to fill this container. + * + * @param aNodeName The parent node name the components will show up as leaf. + * @param aComponentNameList List of component names. + * @param aOptionalLib Library to look up the component names (if NULL: global lookup) + * @param aNormallyExpanded Should the node in the tree be expanded by default. + */ + void AddComponentList( const wxString& aNodeName, const wxArrayString& aComponentNameList, + CMP_LIBRARY* aOptionalLib, bool aNormallyExpanded ); + + /** Function SetPreselectNode + * Set the component name to be selected in absence of any search-result. + * + * @param aComponentName the component name to be selected. + */ + void SetPreselectNode( const wxString& aComponentName ); + + /** Function SetTree + * Set the tree to be manipulated. + * Each update of the search term will update the tree, with the most + * scoring component at the top and selected. If a preselect node is set, this + * is displayed. Does not take ownership of the tree. + * + * @param aTree that is to be modified on search updates. + */ + void SetTree( wxTreeCtrl* aTree ); + + /** Function UpdateSearchTerm + * Update the search string provided by the user and narrow down the result list. + * + * This string is a space-separated list of terms, each of which + * is applied to the components list to narrow it down. Results are scored by + * relevancy (e.g. exact match scores higher than prefix-match which in turn scores + * higher than substring match). This updates the search and tree on each call. + * + * @param aSearch is the user-provided search string. + */ + void UpdateSearchTerm( const wxString& aSearch ); + + /** Function GetSelectedComponent + * + * @return the selected component or NULL if there is none. + */ + LIB_COMPONENT* GetSelectedComponent(); + +private: + struct TREE_NODE; + static bool scoreComparator( const TREE_NODE* a1, const TREE_NODE* a2 ); + + std::vector nodes; + wxString preselect_node_name; + wxTreeCtrl* tree; +}; diff --git a/eeschema/dialogs/dialog_choose_component.cpp b/eeschema/dialogs/dialog_choose_component.cpp new file mode 100644 index 0000000000..9d5ad8cd64 --- /dev/null +++ b/eeschema/dialogs/dialog_choose_component.cpp @@ -0,0 +1,275 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2014 Henner Zeller + * Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +#include + +#include +#include +#include + +#include +#include +#include + +// Work-around broken implementation in wxWidgets <=2.8 tree. +static wxTreeItemId fixedGetPrevVisible( const wxTreeCtrl& tree, const wxTreeItemId& item ); + +// Combine descriptions of all aliases from given component. +static wxString combineDescriptions( LIB_COMPONENT* aComponent ) +{ + std::set descriptions; + + for( size_t i = 0; i < aComponent->GetAliasCount(); ++i ) + { + LIB_ALIAS* a = aComponent->GetAlias( i ); + + if ( !a->GetDescription().empty() ) + descriptions.insert( a->GetDescription() ); + } + + wxString result; + BOOST_FOREACH( const wxString& s, descriptions ) + result += s + wxT("\n"); + return result; +} + + +// Combine keywords. Keywords come as a string, but are considered space-separated +// individual words. Return a string with a unique set of these. +static wxString combineKeywords( LIB_COMPONENT* aComponent ) +{ + std::set keywords; + + for( size_t i = 0; i < aComponent->GetAliasCount(); ++i ) + { + LIB_ALIAS* a = aComponent->GetAlias( i ); + wxStringTokenizer tokenizer( a->GetKeyWords() ); + + while ( tokenizer.HasMoreTokens() ) + keywords.insert( tokenizer.GetNextToken() ); + } + + wxString result; + BOOST_FOREACH( const wxString& s, keywords ) + result += s + wxT(" "); + return result; +} + + +DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, + COMPONENT_TREE_SEARCH_CONTAINER* aContainer ) + : DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ), + m_search_container( aContainer ), + m_selected_component( NULL ), + m_external_browser_requested( false ), + m_received_doubleclick_in_tree( false ) +{ + // TODO: restore last size user was choosing. + m_search_container->SetTree( m_libraryComponentTree ); + m_searchBox->SetFocus(); + m_componentDetails->SetEditable( false ); +} + + +// After this dialog is done: return the component that has been selected, or an +// empty string if there is none. +wxString DIALOG_CHOOSE_COMPONENT::GetSelectedComponentName() const +{ + if ( m_selected_component == NULL ) + return wxEmptyString; + + return m_selected_component->GetName(); +} + + +void DIALOG_CHOOSE_COMPONENT::OnSearchBoxChange( wxCommandEvent& aEvent ) +{ + m_selected_component = NULL; + m_search_container->UpdateSearchTerm( m_searchBox->GetLineText(0) ); + updateSelection(); +} + + +void DIALOG_CHOOSE_COMPONENT::OnSearchBoxEnter( wxCommandEvent& aEvent ) +{ + EndModal( wxID_OK ); // We are done. +} + + +void DIALOG_CHOOSE_COMPONENT::SelectIfValid( const wxTreeItemId& aTreeId ) +{ + if ( aTreeId.IsOk() && aTreeId != m_libraryComponentTree->GetRootItem() ) + m_libraryComponentTree->SelectItem( aTreeId ); +} + + +void DIALOG_CHOOSE_COMPONENT::OnInterceptSearchBoxKey( wxKeyEvent& aKeyStroke ) +{ + // Cursor up/down are forwarded to the tree. This is done by intercepting some navigational + // keystrokes that normally would go to the text search box (which has the focus by default). + const wxTreeItemId sel = m_libraryComponentTree->GetSelection(); + + switch ( aKeyStroke.GetKeyCode() ) + { + case WXK_UP: + SelectIfValid( fixedGetPrevVisible( *m_libraryComponentTree, sel ) ); + break; + + case WXK_DOWN: + SelectIfValid( m_libraryComponentTree->GetNextVisible( sel ) ); + break; + + default: + aKeyStroke.Skip(); // Pass on to search box. + break; + } +} + + +void DIALOG_CHOOSE_COMPONENT::OnTreeSelect( wxTreeEvent& aEvent ) +{ + updateSelection(); +} + + +void DIALOG_CHOOSE_COMPONENT::OnDoubleClickTreeSelect( wxTreeEvent& aEvent ) +{ + updateSelection(); + + if ( m_selected_component == NULL ) + return; + + // Ok, got selection. We don't just end the modal dialog here, but + // wait for the MouseUp event to occur. Otherwise something (broken?) + // happens: the dialog will close and will deliver the 'MouseUp' event + // to the eeschema canvas, that will immediately place the component. + m_received_doubleclick_in_tree = true; +} + + +void DIALOG_CHOOSE_COMPONENT::OnTreeMouseUp( wxMouseEvent& aMouseEvent ) +{ + if ( m_received_doubleclick_in_tree ) + EndModal( wxID_OK ); // We are done (see OnDoubleClickTreeSelect) + else + aMouseEvent.Skip(); // Let upstream handle it. +} + + +void DIALOG_CHOOSE_COMPONENT::OnStartComponentBrowser( wxMouseEvent& aEvent ) +{ + m_external_browser_requested = true; + EndModal( wxID_OK ); // We are done. +} + + +void DIALOG_CHOOSE_COMPONENT::updateSelection() +{ + LIB_COMPONENT* selection = m_search_container->GetSelectedComponent(); + + if ( selection == m_selected_component ) + return; // no change. + + m_selected_component = selection; + + m_componentDetails->Clear(); + + if ( m_selected_component == NULL ) + return; + + wxFont font_normal = m_componentDetails->GetFont(); + wxFont font_bold = m_componentDetails->GetFont(); + font_bold.SetWeight( wxFONTWEIGHT_BOLD ); + + wxTextAttr headline_attribute; + headline_attribute.SetFont(font_bold); + wxTextAttr text_attribute; + text_attribute.SetFont(font_normal); + + const wxString description = combineDescriptions( selection ); + + if ( !description.empty() ) + { + m_componentDetails->SetDefaultStyle( headline_attribute ); + m_componentDetails->AppendText( _("Description\n") ); + m_componentDetails->SetDefaultStyle( text_attribute ); + m_componentDetails->AppendText( description ); + m_componentDetails->AppendText( wxT("\n") ); + } + + const wxString keywords = combineKeywords( selection ); + + if ( !keywords.empty() ) + { + m_componentDetails->SetDefaultStyle( headline_attribute ); + m_componentDetails->AppendText( _("Keywords\n") ); + m_componentDetails->SetDefaultStyle( text_attribute ); + m_componentDetails->AppendText( keywords ); + } + + m_componentDetails->SetInsertionPoint( 0 ); // scroll up. +} + + +// The GetPrevVisible() method is broken in at least 2.8 wxWidgets. This is mostly copied +// verbatim from the latest 3.x source in which this is fixed. +// ( wxWidgets/src/generic/treectlg.cpp ) +static wxTreeItemId fixedGetPrevVisible( const wxTreeCtrl& tree, const wxTreeItemId& item ) +{ +#if wxCHECK_VERSION( 3, 0, 0 ) + return tree.GetPrevVisible(item); +#else + // find out the starting point + wxTreeItemId prevItem = tree.GetPrevSibling(item); + + if ( !prevItem.IsOk() ) + { + prevItem = tree.GetItemParent(item); + } + + // find the first visible item after it + while ( prevItem.IsOk() && !tree.IsVisible(prevItem) ) + { + prevItem = tree.GetNext(prevItem); + + if ( !prevItem.IsOk() || prevItem == item ) + { + // there are no visible items before item + return wxTreeItemId(); + } + } + + // from there we must be able to navigate until this item + while ( prevItem.IsOk() ) + { + const wxTreeItemId nextItem = tree.GetNextVisible(prevItem); + + if ( !nextItem.IsOk() || nextItem == item ) + break; + + prevItem = nextItem; + } + + return prevItem; +#endif +} diff --git a/eeschema/dialogs/dialog_choose_component.h b/eeschema/dialogs/dialog_choose_component.h new file mode 100644 index 0000000000..3f02b74ef6 --- /dev/null +++ b/eeschema/dialogs/dialog_choose_component.h @@ -0,0 +1,69 @@ +/* -*- c++ -*- + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2014 Henner Zeller + * Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +class COMPONENT_TREE_SEARCH_CONTAINER; +class LIB_COMPONENT; +class wxTreeItemId; + +class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE +{ +public: + DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, + COMPONENT_TREE_SEARCH_CONTAINER* aSearch_container ); + + /** Function GetSelectedComponentName + * To be called after this dialog returns from ShowModal(). + * + * @return the component that has been selected, or an empty string if there is none. + */ + wxString GetSelectedComponentName() const; + + /** Function IsExternalBrowserSelected + * + * @return true, iff the browser pressed the browsing button. + */ + bool IsExternalBrowserSelected() const { return m_external_browser_requested; } + +protected: + virtual void OnSearchBoxChange( wxCommandEvent& aEvent ); + virtual void OnSearchBoxEnter( wxCommandEvent& aEvent ); + virtual void OnInterceptSearchBoxKey( wxKeyEvent& aEvent ); + + virtual void OnTreeSelect( wxTreeEvent& aEvent ); + virtual void OnDoubleClickTreeSelect( wxTreeEvent& aEvent ); + virtual void OnTreeMouseUp( wxMouseEvent& aMouseEvent ); + + virtual void OnStartComponentBrowser( wxMouseEvent& aEvent ); + +private: + void updateSelection(); + void SelectIfValid( const wxTreeItemId& aTreeId ); + + COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container; + LIB_COMPONENT* m_selected_component; + bool m_external_browser_requested; + bool m_received_doubleclick_in_tree; +}; diff --git a/eeschema/dialogs/dialog_choose_component_base.cpp b/eeschema/dialogs/dialog_choose_component_base.cpp new file mode 100644 index 0000000000..a9334549ba --- /dev/null +++ b/eeschema/dialogs/dialog_choose_component_base.cpp @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Nov 6 2013) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_choose_component_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_CHOOSE_COMPONENT_BASE::DIALOG_CHOOSE_COMPONENT_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( 450,-1 ), wxDefaultSize ); + + wxBoxSizer* bSizer1; + bSizer1 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSearchSizer; + bSearchSizer = new wxBoxSizer( wxHORIZONTAL ); + + m_searchLabel = new wxStaticText( this, wxID_ANY, wxT("Search"), wxDefaultPosition, wxDefaultSize, 0 ); + m_searchLabel->Wrap( -1 ); + bSearchSizer->Add( m_searchLabel, 0, wxALL, 5 ); + + m_searchBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); + bSearchSizer->Add( m_searchBox, 1, wxALL, 5 ); + + + bSizer1->Add( bSearchSizer, 0, wxEXPAND, 5 ); + + m_libraryComponentTree = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT ); + m_libraryComponentTree->SetMinSize( wxSize( -1,50 ) ); + + bSizer1->Add( m_libraryComponentTree, 2, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer3; + bSizer3 = new wxBoxSizer( wxHORIZONTAL ); + + m_componentView = new wxStaticText( this, wxID_ANY, wxT("TODO\n(mini. comp image)"), wxDefaultPosition, wxSize( 100,100 ), 0 ); + m_componentView->Wrap( -1 ); + m_componentView->SetMinSize( wxSize( 100,100 ) ); + + bSizer3->Add( m_componentView, 0, wxALL, 5 ); + + wxBoxSizer* bSizer6; + bSizer6 = new wxBoxSizer( wxVERTICAL ); + + m_componentDetails = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,100 ), wxTE_MULTILINE ); + bSizer6->Add( m_componentDetails, 1, wxALL|wxEXPAND, 5 ); + + m_unitChoice = new wxComboBox( this, wxID_ANY, wxT("Unit A"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + m_unitChoice->Enable( false ); + m_unitChoice->Hide(); + + bSizer6->Add( m_unitChoice, 0, wxALL, 5 ); + + + bSizer3->Add( bSizer6, 2, wxEXPAND, 5 ); + + + bSizer1->Add( bSizer3, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer5->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_button = new wxStdDialogButtonSizer(); + m_buttonOK = new wxButton( this, wxID_OK ); + m_button->AddButton( m_buttonOK ); + m_buttonCancel = new wxButton( this, wxID_CANCEL ); + m_button->AddButton( m_buttonCancel ); + m_button->Realize(); + + bSizer5->Add( m_button, 0, wxEXPAND, 5 ); + + + bSizer1->Add( bSizer5, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizer1 ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + m_searchBox->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this ); + m_searchBox->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this ); + m_searchBox->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this ); + m_libraryComponentTree->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this ); + m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeSelect ), NULL, this ); + m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this ); + m_componentView->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this ); +} + +DIALOG_CHOOSE_COMPONENT_BASE::~DIALOG_CHOOSE_COMPONENT_BASE() +{ + // Disconnect Events + m_searchBox->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this ); + m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this ); + m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this ); + m_libraryComponentTree->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this ); + m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeSelect ), NULL, this ); + m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this ); + m_componentView->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this ); + +} diff --git a/eeschema/dialogs/dialog_choose_component_base.fbp b/eeschema/dialogs/dialog_choose_component_base.fbp new file mode 100644 index 0000000000..73cdcb2f83 --- /dev/null +++ b/eeschema/dialogs/dialog_choose_component_base.fbp @@ -0,0 +1,710 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + dialog_choose_component_base + 1000 + none + 0 + dialog_choose_component_base + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + 450,-1 + DIALOG_CHOOSE_COMPONENT_BASE + + 450,500 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + DIALOG_SHIM; dialog_shim.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer1 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + + bSearchSizer + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Search + + 0 + + + 0 + + 1 + m_searchLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + -1,-1 + + + 0 + + 1 + m_searchBox + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + OnInterceptSearchBoxKey + + + + + + + + + + + + + + + + + + + OnSearchBoxChange + OnSearchBoxEnter + + + + + + + + + 5 + wxALL|wxEXPAND + 2 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + -1,50 + 1 + m_libraryComponentTree + 1 + + + protected + 1 + + Resizable + 1 + + wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT + + 0 + + + + + + + + + + + + + + OnTreeMouseUp + + + + + + + + + + + + + + + + + + + + OnDoubleClickTreeSelect + + + + + + + + + + OnTreeSelect + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer3 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + TODO (mini. comp image) + + 0 + + + 0 + 100,100 + 1 + m_componentView + 1 + + + protected + 1 + + Resizable + 1 + 100,100 + + + 0 + + + + + -1 + + + + + + + + + + OnStartComponentBrowser + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 2 + + + bSizer6 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + -1,100 + 1 + m_componentDetails + 1 + + + protected + 1 + + Resizable + 1 + -1,-1 + wxTE_MULTILINE + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + m_unitChoice + 1 + + + protected + 1 + + Resizable + -1 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + Unit A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT + 0 + + + bSizer5 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_button + protected + + + + + + + + + + + + + + + + diff --git a/eeschema/dialogs/dialog_choose_component_base.h b/eeschema/dialogs/dialog_choose_component_base.h new file mode 100644 index 0000000000..005aceb9cd --- /dev/null +++ b/eeschema/dialogs/dialog_choose_component_base.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Nov 6 2013) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __DIALOG_CHOOSE_COMPONENT_BASE_H__ +#define __DIALOG_CHOOSE_COMPONENT_BASE_H__ + +#include +#include +class DIALOG_SHIM; + +#include "dialog_shim.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_CHOOSE_COMPONENT_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_CHOOSE_COMPONENT_BASE : public DIALOG_SHIM +{ + private: + + protected: + wxStaticText* m_searchLabel; + wxTextCtrl* m_searchBox; + wxTreeCtrl* m_libraryComponentTree; + wxStaticText* m_componentView; + wxTextCtrl* m_componentDetails; + wxComboBox* m_unitChoice; + wxStdDialogButtonSizer* m_button; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnInterceptSearchBoxKey( wxKeyEvent& event ) { event.Skip(); } + virtual void OnSearchBoxChange( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSearchBoxEnter( wxCommandEvent& event ) { event.Skip(); } + virtual void OnTreeMouseUp( wxMouseEvent& event ) { event.Skip(); } + virtual void OnDoubleClickTreeSelect( wxTreeEvent& event ) { event.Skip(); } + virtual void OnTreeSelect( wxTreeEvent& event ) { event.Skip(); } + virtual void OnStartComponentBrowser( wxMouseEvent& event ) { event.Skip(); } + + + public: + + DIALOG_CHOOSE_COMPONENT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 450,500 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_CHOOSE_COMPONENT_BASE(); + +}; + +#endif //__DIALOG_CHOOSE_COMPONENT_BASE_H__ diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp index a423d2ea72..4554e4f4be 100644 --- a/eeschema/getpart.cpp +++ b/eeschema/getpart.cpp @@ -45,11 +45,14 @@ #include #include +#include +#include #include #include +// TODO(hzeller): would be good if we could give a pre-selected component. wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) { wxSemaphore semaphore( 0, 1 ); @@ -76,118 +79,66 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) return cmpname; } - wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, wxArrayString& aHistoryList, bool aUseLibBrowser, int* aUnit, int* aConvert ) { - int CmpCount = 0; - LIB_COMPONENT* libEntry = NULL; - CMP_LIBRARY* currLibrary = NULL; - wxString cmpName, keys, msg; - bool allowWildSeach = true; + int cmpCount = 0; + wxString dialogTitle; + + COMPONENT_TREE_SEARCH_CONTAINER search_container; // Container doing search-as-you-type if( !aLibname.IsEmpty() ) { - currLibrary = CMP_LIBRARY::FindLibrary( aLibname ); + CMP_LIBRARY* currLibrary = CMP_LIBRARY::FindLibrary( aLibname ); if( currLibrary != NULL ) - CmpCount = currLibrary->GetCount(); + { + cmpCount = currLibrary->GetCount(); + search_container.AddLibrary( *currLibrary ); + } } else { BOOST_FOREACH( CMP_LIBRARY& lib, CMP_LIBRARY::GetLibraryList() ) { - CmpCount += lib.GetCount(); + cmpCount += lib.GetCount(); + search_container.AddLibrary( lib ); } } - // Ask for a component name or key words - msg.Printf( _( "Component selection (%d items loaded):" ), CmpCount ); + if( !aHistoryList.empty() ) + { + // This is good for a transition for experineced users: giving them a History. Ideally, + // we actually make this part even faster to access with a popup on ALT-a or something. + search_container.AddComponentList( _("-- History --"), aHistoryList, NULL, true ); + search_container.SetPreselectNode( aHistoryList[0] ); + } - DIALOG_GET_COMPONENT dlg( this, aHistoryList, msg, aUseLibBrowser ); - - if( aHistoryList.GetCount() ) - dlg.SetComponentName( aHistoryList[0] ); + dialogTitle.Printf( _( "Choose Component (%d items loaded)" ), cmpCount ); + DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, &search_container ); if( dlg.ShowModal() == wxID_CANCEL ) return wxEmptyString; - if( dlg.m_GetExtraFunction ) + wxString cmpName = dlg.GetSelectedComponentName(); + + if( dlg.IsExternalBrowserSelected() ) { - cmpName = SelectComponentFromLibBrowser(); + cmpName = SelectComponentFromLibBrowser(); // Would be good if we could pre-select. + if( aUnit ) *aUnit = LIB_VIEW_FRAME::GetUnit(); + if( aConvert ) *aConvert = LIB_VIEW_FRAME::GetConvert(); - if( !cmpName.IsEmpty() ) - AddHistoryComponentName( aHistoryList, cmpName ); - return cmpName; - } - else - cmpName = dlg.GetComponentName(); - - if( cmpName.IsEmpty() ) - return wxEmptyString; - - // Here, cmpName contains the component name, - // or "*" if the Select All dialog button was pressed - -#ifndef KICAD_KEEPCASE - cmpName.MakeUpper(); -#endif - - if( dlg.IsKeyword() ) - { - allowWildSeach = false; - keys = cmpName; - cmpName = DataBaseGetName( this, keys, cmpName ); - - if( cmpName.IsEmpty() ) - return wxEmptyString; - } - else if( cmpName == wxT( "*" ) ) - { - allowWildSeach = false; - - if( GetNameOfPartToLoad( this, currLibrary, cmpName ) == 0 ) - return wxEmptyString; - } - else if( cmpName.Contains( wxT( "?" ) ) || cmpName.Contains( wxT( "*" ) ) ) - { - allowWildSeach = false; - cmpName = DataBaseGetName( this, keys, cmpName ); - - if( cmpName.IsEmpty() ) - return wxEmptyString; } - libEntry = CMP_LIBRARY::FindLibraryComponent( cmpName, aLibname ); + if ( !cmpName.empty() ) + AddHistoryComponentName( aHistoryList, cmpName ); - if( !libEntry && allowWildSeach ) // Search with wildcard - { - allowWildSeach = false; - wxString wildname = wxChar( '*' ) + cmpName + wxChar( '*' ); - cmpName = wildname; - cmpName = DataBaseGetName( this, keys, cmpName ); - - if( !cmpName.IsEmpty() ) - libEntry = CMP_LIBRARY::FindLibraryComponent( cmpName, aLibname ); - - if( !libEntry ) - return wxEmptyString; - } - - if( !libEntry ) - { - msg.Printf( _( "Failed to find part <%s> in library" ), GetChars( cmpName ) ); - DisplayError( this, msg ); - return wxEmptyString; - } - - AddHistoryComponentName( aHistoryList, cmpName ); return cmpName; } From 60b167148508c77bea62a1ace4d795c2d6ea13e4 Mon Sep 17 00:00:00 2001 From: Henner Zeller Date: Fri, 14 Feb 2014 18:16:59 +0100 Subject: [PATCH 10/11] Eeschema: Better naming for private struct: public fields uppercase. * make some more fields 'const' that can. * Instead of previous/next _visible_ element, Go through previous and next element. Otherwise the cursor stops moving if the item is only partially visible. --- eeschema/component_tree_search_container.cpp | 131 ++++++++++--------- eeschema/dialogs/dialog_choose_component.cpp | 62 ++++----- 2 files changed, 89 insertions(+), 104 deletions(-) diff --git a/eeschema/component_tree_search_container.cpp b/eeschema/component_tree_search_container.cpp index 6972ff1956..f0d9a2ffb1 100644 --- a/eeschema/component_tree_search_container.cpp +++ b/eeschema/component_tree_search_container.cpp @@ -48,29 +48,29 @@ struct COMPONENT_TREE_SEARCH_CONTAINER::TREE_NODE const wxString& aName, const wxString& aDisplayInfo, const wxString& aSearchText, bool aNormallyExpanded = false) - : parent( aParent ), - lib( aOwningLib ), - normally_expanded( aNormallyExpanded ), - name( aName ), - display_info( aDisplayInfo ), - match_name( aName.Lower() ), - search_text( aSearchText.Lower() ), - match_score( 0 ), previous_score( 0 ) + : Parent( aParent ), + Lib( aOwningLib ), + NormallyExpanded( aNormallyExpanded ), + Name( aName ), + DisplayInfo( aDisplayInfo ), + MatchName( aName.Lower() ), + SearchText( aSearchText.Lower() ), + MatchScore( 0 ), PreviousScore( 0 ) { } - TREE_NODE* parent; // NULL if library, pointer to lib when component. - CMP_LIBRARY* lib; // Owning library of this component. - bool normally_expanded; // If this is a parent node, should it be unfolded ? - wxString name; // Exact name as displayed to the user. - wxString display_info; // Additional info displayed in the tree (description..) + TREE_NODE* const Parent; ///< NULL if library, pointer to lib-node when component. + CMP_LIBRARY* const Lib; ///< Owning library of this component. + const bool NormallyExpanded; ///< If this is a parent node, should it be unfolded ? + const wxString Name; ///< Exact name as displayed to the user. + const wxString DisplayInfo; ///< Additional info displayed in the tree (description..) - wxString match_name; // Preprocessed: lowercased display name. - wxString search_text; // Other lowercase text (keywords, description..) to search in. + const wxString MatchName; ///< Preprocessed: lowercased display name. + const wxString SearchText; ///< Other text (keywords, description..) to search in. - unsigned match_score; // Result-Score after UpdateSearchTerm() - unsigned previous_score; // Optimization: used to see if we need any tree update. - wxTreeItemId tree_id; // Tree-ID if stored in the tree (if match_score > 0). + unsigned MatchScore; ///< Result-Score after UpdateSearchTerm() + unsigned PreviousScore; ///< Optimization: used to see if we need any tree update. + wxTreeItemId TreeId; ///< Tree-ID if stored in the tree (if MatchScore > 0). }; @@ -79,19 +79,19 @@ struct COMPONENT_TREE_SEARCH_CONTAINER::TREE_NODE // leaf nodes. bool COMPONENT_TREE_SEARCH_CONTAINER::scoreComparator( const TREE_NODE* a1, const TREE_NODE* a2 ) { - if ( a1->parent == NULL && a2->parent != NULL ) + if ( a1->Parent == NULL && a2->Parent != NULL ) return true; - if ( a1->parent != NULL && a2->parent == NULL ) + if ( a1->Parent != NULL && a2->Parent == NULL ) return false; - if ( a1->match_score != a2->match_score ) - return a1->match_score > a2->match_score; // biggest first. + if ( a1->MatchScore != a2->MatchScore ) + return a1->MatchScore > a2->MatchScore; // biggest first. - if (a1->parent != a2->parent) - return a1->parent->match_name.Cmp(a2->parent->match_name) < 0; + if (a1->Parent != a2->Parent) + return a1->Parent->MatchName.Cmp(a2->Parent->MatchName) < 0; - return a1->match_name.Cmp( a2->match_name ) < 0; + return a1->MatchName.Cmp( a2->MatchName ) < 0; } COMPONENT_TREE_SEARCH_CONTAINER::COMPONENT_TREE_SEARCH_CONTAINER() @@ -186,8 +186,8 @@ LIB_COMPONENT* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedComponent() const wxTreeItemId& select_id = tree->GetSelection(); BOOST_FOREACH( TREE_NODE* node, nodes ) { - if ( node->match_score > 0 && node->tree_id == select_id && node->lib ) - return node->lib->FindComponent( node->name ); + if ( node->MatchScore > 0 && node->TreeId == select_id && node->Lib ) + return node->Lib->FindComponent( node->Name ); } return NULL; } @@ -219,8 +219,8 @@ void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch // Initial AND condition: Leaf nodes are considered to match initially. BOOST_FOREACH( TREE_NODE* node, nodes ) { - node->previous_score = node->match_score; - node->match_score = node->parent ? kLowestDefaultScore : 0; // start-match for leafs. + node->PreviousScore = node->MatchScore; + node->MatchScore = node->Parent ? kLowestDefaultScore : 0; // start-match for leafs. } // Create match scores for each node for all the terms, that come space-separated. @@ -241,10 +241,10 @@ void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch const wxString term = tokenizer.GetNextToken().Lower(); BOOST_FOREACH( TREE_NODE* node, nodes ) { - if ( node->parent == NULL) + if ( node->Parent == NULL) continue; // Library nodes are not scored here. - if ( node->match_score == 0) + if ( node->MatchScore == 0) continue; // Leaf node without score are out of the game. // Keywords and description we only count if the match string is at @@ -252,27 +252,28 @@ void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch // matches. Most abbreviations are at three characters long. int found_pos; - if ( term == node->match_name ) - node->match_score += 1000; // exact match. High score :) - else if ( (found_pos = node->match_name.Find( term ) ) != wxNOT_FOUND ) + if ( term == node->MatchName ) + node->MatchScore += 1000; // exact match. High score :) + else if ( (found_pos = node->MatchName.Find( term ) ) != wxNOT_FOUND ) { // Substring match. The earlier in the string the better. score += 20..40 - node->match_score += matchPosScore( found_pos, 20 ) + 20; + node->MatchScore += matchPosScore( found_pos, 20 ) + 20; } - else if ( node->parent->match_name.Find( term ) != wxNOT_FOUND ) - node->match_score += 19; // parent name matches. score += 19 - else if ( ( found_pos = node->search_text.Find( term ) ) != wxNOT_FOUND ) + else if ( node->Parent->MatchName.Find( term ) != wxNOT_FOUND ) + node->MatchScore += 19; // parent name matches. score += 19 + else if ( ( found_pos = node->SearchText.Find( term ) ) != wxNOT_FOUND ) { - // If we have a very short string (like one or two letters), we don't want - // to accumulate scores if they just happen to be in keywords or description. + // If we have a very short search term (like one or two letters), we don't want + // to accumulate scores if they just happen to be in keywords or description as + // almost any one or two-letter combination shows up in there. // For longer terms, we add scores 1..18 for positional match (higher in the // front, where the keywords are). score += 0..18 - node->match_score += ( ( term.length() >= 2 ) + node->MatchScore += ( ( term.length() >= 2 ) ? matchPosScore( found_pos, 17 ) + 1 : 0 ); } else - node->match_score = 0; // No match. That's it for this item. + node->MatchScore = 0; // No match. That's it for this item. } } @@ -281,12 +282,12 @@ void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch bool any_change = false; BOOST_FOREACH( TREE_NODE* node, nodes ) { - if ( node->parent == NULL ) + if ( node->Parent == NULL ) continue; - any_change |= (node->previous_score != node->match_score); - node->parent->match_score = std::max( node->parent->match_score, node->match_score ); - highest_score_seen = std::max( highest_score_seen, node->match_score ); + any_change |= (node->PreviousScore != node->MatchScore); + node->Parent->MatchScore = std::max( node->Parent->MatchScore, node->MatchScore ); + highest_score_seen = std::max( highest_score_seen, node->MatchScore ); } @@ -301,56 +302,56 @@ void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch // items is pretty complex, so we just re-build the whole tree. tree->Freeze(); tree->DeleteAllItems(); - wxTreeItemId root = tree->AddRoot( wxEmptyString ); + const wxTreeItemId root_id = tree->AddRoot( wxEmptyString ); const TREE_NODE* first_match = NULL; const TREE_NODE* preselected_node = NULL; BOOST_FOREACH( TREE_NODE* node, nodes ) { - if ( node->match_score == 0 ) + if ( node->MatchScore == 0 ) continue; // If we have nodes that go beyond the default score, suppress nodes that // have the default score. That can happen if they have an honary += 0 score due to // some one-letter match in the keyword or description. In this case, we prefer matches - // that just have higher scores. Improves confusion (and performance as the tree has to - // display less items). - if ( highest_score_seen > kLowestDefaultScore && node->match_score == kLowestDefaultScore ) + // that just have higher scores. Improves relevancy and performance as the tree has to + // display less items. + if ( highest_score_seen > kLowestDefaultScore && node->MatchScore == kLowestDefaultScore ) continue; + const bool isLeaf = ( node->Parent != NULL ); wxString node_text; #if 0 // Node text with scoring information for debugging - node_text.Printf( wxT("%s (s=%u)%s"), GetChars(node->name), - node->match_score, GetChars(node->display_info)); + node_text.Printf( wxT("%s (s=%u)%s"), GetChars(node->Name), + node->MatchScore, GetChars(node->DisplayInfo)); #else - node_text = node->name + node->display_info; + node_text = node->Name + node->DisplayInfo; #endif - node->tree_id = tree->AppendItem( ( node->parent == NULL ) ? root : node->parent->tree_id, - node_text); + node->TreeId = tree->AppendItem( !isLeaf ? root_id : node->Parent->TreeId, node_text ); - // If we are a child node, we might need to expand. - if ( node->parent != NULL ) + // If we are a leaf node, we might need to expand. + if ( isLeaf ) { - if ( node->match_score > kLowestDefaultScore ) + if ( node->MatchScore > kLowestDefaultScore ) { - tree->EnsureVisible( node->tree_id ); + tree->EnsureVisible( node->TreeId ); if ( first_match == NULL ) first_match = node; // The "I am feeling lucky" element. } - if ( preselected_node == NULL && node->match_name == preselect_node_name ) + if ( preselected_node == NULL && node->MatchName == preselect_node_name ) preselected_node = node; } - if ( node->parent == NULL && node->normally_expanded ) - tree->Expand( node->tree_id ); + if ( !isLeaf && node->NormallyExpanded ) + tree->Expand( node->TreeId ); } if ( first_match ) // Highest score search match pre-selected. - tree->SelectItem( first_match->tree_id ); + tree->SelectItem( first_match->TreeId ); else if ( preselected_node ) // No search, so history item preselected. - tree->SelectItem( preselected_node->tree_id ); + tree->SelectItem( preselected_node->TreeId ); tree->Thaw(); } diff --git a/eeschema/dialogs/dialog_choose_component.cpp b/eeschema/dialogs/dialog_choose_component.cpp index 9d5ad8cd64..604c9cb94a 100644 --- a/eeschema/dialogs/dialog_choose_component.cpp +++ b/eeschema/dialogs/dialog_choose_component.cpp @@ -31,8 +31,9 @@ #include #include -// Work-around broken implementation in wxWidgets <=2.8 tree. -static wxTreeItemId fixedGetPrevVisible( const wxTreeCtrl& tree, const wxTreeItemId& item ); +// Tree navigation helpers. +static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); +static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); // Combine descriptions of all aliases from given component. static wxString combineDescriptions( LIB_COMPONENT* aComponent ) @@ -132,11 +133,11 @@ void DIALOG_CHOOSE_COMPONENT::OnInterceptSearchBoxKey( wxKeyEvent& aKeyStroke ) switch ( aKeyStroke.GetKeyCode() ) { case WXK_UP: - SelectIfValid( fixedGetPrevVisible( *m_libraryComponentTree, sel ) ); + SelectIfValid( GetPrevItem( *m_libraryComponentTree, sel ) ); break; case WXK_DOWN: - SelectIfValid( m_libraryComponentTree->GetNextVisible( sel ) ); + SelectIfValid( GetNextItem( *m_libraryComponentTree, sel ) ); break; default: @@ -230,46 +231,29 @@ void DIALOG_CHOOSE_COMPONENT::updateSelection() m_componentDetails->SetInsertionPoint( 0 ); // scroll up. } - -// The GetPrevVisible() method is broken in at least 2.8 wxWidgets. This is mostly copied -// verbatim from the latest 3.x source in which this is fixed. -// ( wxWidgets/src/generic/treectlg.cpp ) -static wxTreeItemId fixedGetPrevVisible( const wxTreeCtrl& tree, const wxTreeItemId& item ) +static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item ) { -#if wxCHECK_VERSION( 3, 0, 0 ) - return tree.GetPrevVisible(item); -#else - // find out the starting point - wxTreeItemId prevItem = tree.GetPrevSibling(item); + wxTreeItemId prevItem = tree.GetPrevSibling( item ); if ( !prevItem.IsOk() ) { - prevItem = tree.GetItemParent(item); - } - - // find the first visible item after it - while ( prevItem.IsOk() && !tree.IsVisible(prevItem) ) - { - prevItem = tree.GetNext(prevItem); - - if ( !prevItem.IsOk() || prevItem == item ) - { - // there are no visible items before item - return wxTreeItemId(); - } - } - - // from there we must be able to navigate until this item - while ( prevItem.IsOk() ) - { - const wxTreeItemId nextItem = tree.GetNextVisible(prevItem); - - if ( !nextItem.IsOk() || nextItem == item ) - break; - - prevItem = nextItem; + const wxTreeItemId parent = tree.GetItemParent( item ); + prevItem = tree.GetLastChild( tree.GetPrevSibling( parent ) ); } return prevItem; -#endif +} + +static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item ) +{ + wxTreeItemId nextItem = tree.GetNextSibling( item ); + + if ( !nextItem.IsOk() ) + { + const wxTreeItemId parent = tree.GetItemParent( item ); + wxTreeItemIdValue dummy; + nextItem = tree.GetFirstChild( tree.GetNextSibling( parent ), dummy ); + } + + return nextItem; } From 1c5a997f824d0081b239f3c86bcd5c05b5deac8e Mon Sep 17 00:00:00 2001 From: Marco Serantoni Date: Fri, 14 Feb 2014 22:09:48 +0100 Subject: [PATCH 11/11] [MacOSX] Reorg and preparation to include scripts into Bundles --- CMakeLists.txt | 12 ++++++------ pcbnew/pcbnew.cpp | 10 +++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44e56d5c72..87bdd4efee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -347,6 +347,12 @@ check_find_package_result( OPENGL_FOUND "OpenGL" ) if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) add_custom_target( lib-wxpython ) + include( download_pcre ) + include( download_swig ) + include( download_wxpython ) + add_dependencies( lib-wxpython pcre ) + add_dependencies( lib-wxpython swig ) + add_dependencies( lib-wxpython libwxpython ) #set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so;.dylib;.dll") @@ -394,12 +400,6 @@ add_custom_target( lib-wxpython ) set(wxWidgets_INCLUDE_DIRS ${LIBWXPYTHON_ROOT}/include/wx-3.0 ) set(wxWidgets_LIBRARY_DIRS ${LIBWXPYTHON_ROOT}/lib ) - include( download_pcre ) - include( download_swig ) - include( download_wxpython ) - add_dependencies( lib-wxpython pcre ) - add_dependencies( lib-wxpython swig ) - add_dependencies( lib-wxpython libwxpython ) add_dependencies( lib-dependencies libwxpython ) else() include( download_wxwidgets ) diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index 49cae3dea4..d070e1825f 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -169,9 +169,13 @@ bool EDA_APP::OnInit() bundledir.RemoveLastDir(); // Prepend in PYTHONPATH the content of the bundle libraries ! - wxSetEnv("PYTHONPATH",((wxGetenv("PYTHONPATH") != NULL ) ? (wxString(wxGetenv("PYTHONPATH")) + ":") : wxString("")) - + bundledir.GetPath() + - "/Frameworks/wxPython/lib/python2.6/site-packages/wx-3.0-osx_cocoa" ); + wxSetEnv("PYTHONPATH",((wxGetenv("PYTHONPATH") != NULL ) ? (wxString(wxGetenv("PYTHONPATH")) + ":") : wxString("")) + + "/Library/Application Support/kicad/scripting" + ":" + + bundledir.GetPath() + "/PlugIns" + ":" + + wxString( wxGetenv("HOME") ) + "/Library/Application Support/kicad/scripting" + + bundledir.GetPath() + + "/Frameworks/wxPython/lib/python2.6/site-packages/wx-3.0-osx_cocoa" + ); #endif #endif // On linux and osx, 2 others paths are