]> Creatis software - creaMaracasVisu.git/commitdiff
creaMaracasVisu Library
authorcasallas <casallas>
Fri, 31 Oct 2008 16:31:30 +0000 (16:31 +0000)
committercasallas <casallas>
Fri, 31 Oct 2008 16:31:30 +0000 (16:31 +0000)
576 files changed:
CMakeLists.txt [new file with mode: 0644]
appli/template_appli/CMakeLists.txt [new file with mode: 0644]
appli/template_wx_appli/CMakeLists.txt [new file with mode: 0644]
lib/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/include/Maracas.iss [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindCrea.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindGDCM.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindGLIB.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindGSL.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindGSLobj.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindGTK.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindGTK2.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindKGFO.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindLibido.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindMySQL.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindwxGlade.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/FindwxW.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/GDCMConfig.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/MARACAS_Find_GDCM.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/MARACAS_Find_ITK.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/MARACAS_Find_LIBIDO.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/MARACAS_Find_VTK.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/MARACAS_Find_WXWIDGETS.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/Modules/UseGDCM.cmake [new file with mode: 0644]
lib/maracasVisuLib/include/mathdefs.h [new file with mode: 0644]
lib/maracasVisuLib/include/matrix.h [new file with mode: 0644]
lib/maracasVisuLib/include/vector.h [new file with mode: 0644]
lib/maracasVisuLib/include/vmfuncs.h [new file with mode: 0644]
lib/maracasVisuLib/src/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/src/CMakeListsWorking.txt [new file with mode: 0644]
lib/maracasVisuLib/src/interface/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/Makefile.am [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/Makefile.in [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/general.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/3D.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/add.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/area.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/back.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/bright.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/clear.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/connect.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/continue.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/del_axis.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/excel.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/extract.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/help.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/imagebrowser.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/intensity.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/linear.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/loadexp.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/pan.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/params.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/plans.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/quant.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/redblue.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/redgreen.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/rotate.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/save.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/subtract.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/wizard.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/icons/zoom.gif [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/marTcl.dsp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/marTclInterface.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/maracas_start.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/string_table.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tclexe.dsp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tkwidgets/Makefile.am [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tkwidgets/Makefile.in [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tkwidgets/combobox.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tkwidgets/ibrowser.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tkwidgets/imagepp.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/tkwidgets/mclistbox.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/Makefile.am [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/Makefile.in [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/TkImageViewerInteractor.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/TkInteractor.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/WidgetObject.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/ev_userzoom.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/volTkInteractor.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/to_change/vtkInt.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/Makefile.am [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/Makefile.in [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/choose_direction.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/data_browser.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/dlg_name_axis.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/dlg_params.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/global_window.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/help_wnd.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/image_browser.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/planes_window.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/subtract.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/u_3D.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/u_mip.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/u_mpr.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/windows/u_surf.tcl [new file with mode: 0644]
lib/maracasVisuLib/src/interface/tcl/wrap_maracas.i [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/AutoControlPoints.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/AutoControlPoints.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourCrownWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourCrownWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourPropagation.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourPropagation.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourVOIWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourVOIWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ExtractControlPoints2D.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/ExtractControlPoints2D.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/Propagation.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/Propagation.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/contoursIntersection.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/contoursIntersection.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/vectorFunctions.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/Contour/vectorFunctions.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/MaracasDll.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/MaracasDll.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/StdAfx.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/StdAfx.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/manualContour.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/manualContour.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/manualContourContainer.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/manualContourContainer.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/marDict.txt [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/marDictionary.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/marDictionary.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo2.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logocreatis.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_01.xcf [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_02.xcf [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.bmp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/marDiagParameters.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/marDiagParameters.wxr [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/ressource.wxg [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.ico [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/res/wxInterface.rc [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/tools/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/tools/MaracasTools.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/tools/MaracasTools.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/ContourView.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/ContourView.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/LineView.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/LineView.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/PointView.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/PointView.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/README [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/chart.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/chart.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/Histogram.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/Histogram.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mBarRange.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mBarRange.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mathplot.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mathplot.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorBar.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorBar.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorPoint.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorPoint.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFigure.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFigure.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pHistogram.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pHistogram.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotter.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotter.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/res/area.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/res/bright.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/res/cine_loop.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/res/clear.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/res/intensity.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/res/linear.xpm [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk2DQuantSliceWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk2DQuantSliceWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DQuantSurfaceWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DQuantSurfaceWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceSTLWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceSTLWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkClosePolyData.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkClosePolyData.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkImagePolyDataSeedConnectivity.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkImagePolyDataSeedConnectivity.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkInteractorStyleCutter.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkInteractorStyleCutter.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxChart.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxChart.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget_2.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget_2.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanel_3_Widget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanel_3_Widget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageViewerWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageViewerWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRBaseData.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRBaseData.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualRegistration3D.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualRegistration3D.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualTree_MPRWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualTree_MPRWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxParametersDialog.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxParametersDialog.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxPathologyWidget_01.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxPathologyWidget_01.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxProcessingCTWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxProcessingCTWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidgetCT.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidgetCT.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget_base.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget_base.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxReadingPriorityPanel.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxReadingPriorityPanel.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_02.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_02.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_03.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_03.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceMPR.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceMPR.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceSTLWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceSTLWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceWidget.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceWidget.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractorEditContour.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractorEditContour.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkBaseView.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkBaseView.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxILPDwithImage.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxILPDwithImage.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas3DBrowser.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas3DBrowser.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp02.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp02.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasDataBrowser.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasDataBrowser.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_2.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_2.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_3.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_3.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame02.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame02.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasHelpDialog.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasHelpDialog.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser02.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser02.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasMPR.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasMPR.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasParametersDialog.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasParametersDialog.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasPathology_01.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasPathology_01.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasProcessingCT.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasProcessingCT.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantification.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantification.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantificationCT.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantificationCT.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualContour_Panel.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualContour_Panel.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualSegmentation_MPR.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualSegmentation_MPR.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPR.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPR.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPRDlg.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPRDlg.h [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_SegmentationFM3D.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_SegmentationFM3D.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/CMakeLists.txt [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/README [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/axisExtractor.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/axisExtractor.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/axisExtractor02.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/axisExtractor02.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/carotidaBifurcacion.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/carotidaBifurcacion.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/curve.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/curve.hxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/gslobj.hxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/itkFM3D.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/itkFM3D.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/itkImageToVTKImageFilter.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/itkImageToVTKImageFilter.txx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/itkVTKImageToImageFilter.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/itkVTKImageToImageFilter.txx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marAxis.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marAxis.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marAxisCT.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marAxisCT.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marAxisContours.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marAxisContours.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marContour.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marContour.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marContourVO.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marContourVO.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marDicom.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marDicom.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marDicomBase.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marDicomBase.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marDynData.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marDynData.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marExperiment.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marExperiment.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marExperimentCT.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marExperimentCT.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marGdcmDicom.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marGdcmDicom.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marImageData.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marImageData.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marInterface.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marInterface.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marInterfaceCT.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marInterfaceCT.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marIsocontour.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marIsocontour.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marKVolume.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marKVolume.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marLine.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marLine.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marMathConst.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marMatrix.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marMatrix.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marObject.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marObject.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marParameters.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marParameters.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marPoint.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marPoint.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marSimpleDicom.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marSimpleDicom.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marTypes.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marUtils.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marUtils.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marVector.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/marVector.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/matrix.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vector.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/volume.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/volume.hxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkDijkstraImageData.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkDijkstraImageData.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkJoiner.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkJoiner.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkOtsu.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkOtsu.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkOtsuImageData.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkOtsuImageData.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkOtsuSphereSource.cxx [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkOtsuSphereSource.h [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkSTLExtractor.cpp [new file with mode: 0644]
lib/maracasVisuLib/src/kernel/vtkSTLExtractor.h [new file with mode: 0644]

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f4f1ace
--- /dev/null
@@ -0,0 +1,34 @@
+PROJECT(creaMaracasVisu)
+
+SET(PROJECT_MAJOR_VERSION 1)
+SET(PROJECT_MINOR_VERSION 0)
+SET(PROJECT_BUILD_VERSION 0)
+
+SET(CREA_VERBOSE_CMAKE TRUE)
+
+FIND_PACKAGE(crea REQUIRED)
+IF (crea_FOUND)
+  INCLUDE(${crea_USE_FILE})
+ENDIF(crea_FOUND)
+CREA_PREVENT_IN_SOURCE_BUILD()
+
+SET(USE_GDCM ON)
+SET(USE_GDCM_VTK ON)
+SET(USE_WXWIDGETS ON)
+SET(USE_VTK ON)
+SET(USE_ITK ON)
+SET(USE_BOOST OFF)
+
+CREA_FIND_AND_USE_LIBRARIES()
+
+SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
+SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
+MARK_AS_ADVANCED(
+  CMAKE_BACKWARDS_COMPATIBILITY
+  EXECUTABLE_OUTPUT_PATH 
+  LIBRARY_OUTPUT_PATH
+  )
+
+#SUBDIRS(appli)
+#SUBDIRS(lib)
+SUBDIRS(lib)
diff --git a/appli/template_appli/CMakeLists.txt b/appli/template_appli/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3b02804
--- /dev/null
@@ -0,0 +1,33 @@
+#----------------------------------------------------------------------------
+# SET THE NAME OF YOUR EXECUTABLE
+SET ( EXE_NAME   MyExe  )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# EXECUTABLE SOURCES (TO BE COMPILED)
+# EITHER LIST ALL .cxx, *.cpp, *.cc IN CURRENT DIR USING NEXT LINE:
+FILE(GLOB ${EXE_NAME}_SOURCES *.cxx *.cpp *.cc)
+# OR MANUALLY LIST YOUR FILES WITH NEXT COMMAND (WITHOUT EXTENSION)
+#  SET ( ${EXE_NAME}_SOURCES 
+#   
+#    )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# DEPENDENCIES (LIBRARIES TO LINK WITH)
+SET ( ${EXE_NAME}_LINK_LIBRARIES
+  ${crea_LIBRARIES}
+  #    ${WXWIDGETS_LIBRARIES}
+  #    ${VTK_LIBRARIES}
+  #    ${ITK_LIBRARIES}
+  #    ${GDCM_LIBRARIES}
+  #    ${BOOST_LIBRARIES}
+  )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# CREATES AND INSTALLS THE EXE
+CREA_ADD_EXECUTABLE( ${EXE_NAME} )
+#----------------------------------------------------------------------------
+
+
diff --git a/appli/template_wx_appli/CMakeLists.txt b/appli/template_wx_appli/CMakeLists.txt
new file mode 100644 (file)
index 0000000..fd728c2
--- /dev/null
@@ -0,0 +1,40 @@
+#----------------------------------------------------------------------------
+# SET THE NAME OF YOUR EXECUTABLE
+SET ( EXE_NAME   MyExe  )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# EXECUTABLE SOURCES (TO BE COMPILED)
+# EITHER LIST ALL .cxx, *.cpp, *.cc IN CURRENT DIR USING NEXT LINE:
+FILE(GLOB ${EXE_NAME}_SOURCES *.cxx *.cpp *.cc)
+# OR MANUALLY LIST YOUR FILES WITH NEXT COMMAND (WITHOUT EXTENSION)
+#  SET ( ${EXE_NAME}_SOURCES 
+#   
+#    )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# DEPENDENCIES (LIBRARIES TO LINK WITH)
+SET ( ${EXE_NAME}_LINK_LIBRARIES
+  ${crea_LIBRARIES}
+  #    ${WXWIDGETS_LIBRARIES}
+  #    ${VTK_LIBRARIES}
+  #    ${ITK_LIBRARIES}
+  #    ${GDCM_LIBRARIES}
+  #    ${BOOST_LIBRARIES}
+  )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# UNCOMMENT NEXT LINE IF YOU WANT A CONSOLE ON WINDOWS
+# NB : YOUR MAIN MUST BE ADAPTED ALSO
+#      SEE THE MACRO CREA_WXMAIN_WITH_CONSOLE IN creaWx.h
+#SET(${EXE_NAME}_CONSOLE TRUE)
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# CREATES AND INSTALLS THE EXE
+CREA_ADD_WX_EXECUTABLE( ${EXE_NAME} )
+#----------------------------------------------------------------------------
+
+
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
new file mode 100644 (file)
index 0000000..0aca18d
--- /dev/null
@@ -0,0 +1,2 @@
+# Add a SUBDIRS command for each of your libraries
+SUBDIRS(maracasVisuLib)
diff --git a/lib/maracasVisuLib/CMakeLists.txt b/lib/maracasVisuLib/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c9ea732
--- /dev/null
@@ -0,0 +1,276 @@
+#----------------------------------------------------------------------------
+# SET THE NAME OF YOUR LIBRARY
+SET ( LIBRARY_NAME   maracasVisuLib  )
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# CREATES A USER OPTION IN CMAKE
+OPTION ( BUILD_${LIBRARY_NAME}  "Build ${LIBRARY_NAME} library ?" ON)
+
+#OPTION ( EXPORTS_MaracasKernel  "Build ${LIBRARY_NAME} library ?" ON)
+#IF (EXPORTS_MaracasKernel)
+#      SET(MaracasKernel_EXPORTS)
+#      ADD_DEFINITIONS (-DMaracasKernel_EXPORTS)
+#ENDIF(EXPORTS_MaracasKernel)
+
+#----------------------------------------------------------------------------
+IF ( BUILD_${LIBRARY_NAME} )
+#----------------------------------------------------------------------------
+
+  #----------------------------------------------------------------------------
+  # BUILD LIBRARY
+  #----------------------------------------------------------------------------
+#jhcl-Start===========================================================================
+  INCLUDE_DIRECTORIES(
+    include
+    src
+       #${MARACAS_SOURCE_DIR}/src/axe3DVTK
+       #  ${MARACAS_SOURCE_DIR}/src/interface
+    src/kernel
+       #${MARACAS_SOURCE_DIR}/src/SnakeIsoContour+Deriche
+    src/interface/wxWindows
+    src/interface/wxWindows/widgets
+    src/interface/wxWindows/widgets/pPlotter
+       ../../../
+)
+       #message(jhcl\n\n ${crea_LIBRARIES})
+       INCLUDE(include/Modules/MARACAS_Find_LIBIDO.cmake)
+       SET(CREA_LIBRARIES C:/creaBin/Debug/crea.lib)
+       FIND_PACKAGE(crea)
+#jhcl-End===========================================================================
+  #----------------------------------------------------------------------------
+  # LIBRARY HEADERS (TO BE INSTALLED)
+  # EITHER LIST ALL .h IN CURRENT DIR USING NEXT LINE:
+  #FILE(GLOB ${LIBRARY_NAME}_HEADERS "*.h")
+  # OR MANUALLY LIST YOUR HEADERS WITH NEXT COMMAND
+  SET ( ${LIBRARY_NAME}_HEADERS
+       src/interface/wxWindows/manualContour.h
+       src/interface/wxWindows/Contour/ContourCrownWidget.h
+       src/interface/wxWindows/Contour/ContourVOIWidget.h  
+    src/interface/wxWindows/Contour/Propagation.h
+    src/interface/wxWindows/Contour/ExtractControlPoints2D.h
+    src/interface/wxWindows/Contour/AutoControlPoints.h
+    src/interface/wxWindows/Contour/ContourPropagation.h
+    src/interface/wxWindows/Contour/contoursIntersection.h
+    src/interface/wxWindows/Contour/vectorFunctions.h
+    src/interface/wxWindows/wxMaracasImageBrowser02.h
+    src/interface/wxWindows/widgets/wxReadingPriorityPanel.h
+    src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.h
+    src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.h
+    src/interface/wxWindows/widgets/vtkClosePolyData.h
+    src/interface/wxWindows/wxMaracasMPR.h
+    src/interface/wxWindows/widgets/wxMPRWidget.h
+    src/interface/wxWindows/widgets/wxMPRBaseData.h
+    src/interface/wxWindows/widgets/wxVtkBaseView.h
+    src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.h 
+    src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.h
+    src/interface/wxWindows/wxMaracas_ManualTree_MPR.h
+    src/interface/wxWindows/widgets/wxManualTree_MPRWidget.h
+    src/interface/wxWindows/widgets/ContourView.h
+    src/interface/wxWindows/widgets/PointView.h
+    src/interface/wxWindows/widgets/LineView.h
+    src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.h
+    src/interface/wxWindows/widgets/pPlotter/HistogramDialog.h
+    src/interface/wxWindows/widgets/pPlotter/HistogramWidget.h
+    src/interface/wxWindows/widgets/pPlotter/pHistogram.h
+    src/interface/wxWindows/widgets/pPlotter/mBarRange.h
+    src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.h
+    src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.h
+    src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.h
+    src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.h
+    src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.h
+    src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.h
+    src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.h
+    src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.h
+    src/interface/wxWindows/widgets/pPlotter/pColorBar.h
+    src/interface/wxWindows/widgets/pPlotter/pFigure.h
+    src/interface/wxWindows/widgets/pPlotter/pColorPoint.h
+    src/interface/wxWindows/widgets/pPlotter/pPlotter.h
+    src/interface/wxWindows/widgets/pPlotter/mathplot.h
+    src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.h
+    src/interface/wxWindows/widgets/pPlotter/Histogram.h
+    /../include/matrix.h
+    src/kernel/marImageData.h
+    src/kernel/marDicomBase.h
+    src/kernel/marGdcmDicom.h
+    src/kernel/marObject.h
+    src/kernel/volume.hxx
+    src/kernel/marTypes.h
+    src/kernel/marParameters.h
+    src/kernel/marDynData.h
+  )
+  #----------------------------------------------------------------------------
+
+  #----------------------------------------------------------------------------
+  # LIBRARY SOURCES (TO BE COMPILED)
+  # EITHER LIST ALL .cxx, *.cpp, *.cc IN CURRENT DIR USING NEXT LINE:
+  #FILE(GLOB ${LIBRARY_NAME}_SOURCES *.cxx *.cpp *.cc)
+  # OR MANUALLY LIST YOUR FILES WITH NEXT COMMAND (WITHOUT EXTENSION)
+  SET ( ${LIBRARY_NAME}_SOURCES 
+       src/interface/wxWindows/manualContour.cpp
+       src/interface/wxWindows/Contour/ContourCrownWidget.cxx
+       src/interface/wxWindows/Contour/ContourExtractData.cxx
+    src/interface/wxWindows/Contour/ContourVOIWidget.cxx
+    src/interface/wxWindows/Contour/Propagation.cxx
+    src/interface/wxWindows/Contour/ExtractControlPoints2D.cxx
+    src/interface/wxWindows/Contour/AutoControlPoints.cxx
+    src/interface/wxWindows/Contour/ContourPropagation.cxx
+    src/interface/wxWindows/Contour/contoursIntersection.cxx
+    src/interface/wxWindows/Contour/vectorFunctions.cxx
+    src/interface/wxWindows/wxMaracasImageBrowser02.cxx
+    src/interface/wxWindows/widgets/wxReadingPriorityPanel.cpp
+    src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.cxx
+    src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.cxx
+    src/interface/wxWindows/widgets/vtkClosePolyData.cxx
+    src/interface/wxWindows/wxMaracasMPR.cxx
+    src/interface/wxWindows/widgets/wxMPRWidget.cxx
+    src/interface/wxWindows/widgets/wxMPRBaseData.cxx
+    src/interface/wxWindows/widgets/wxVtkBaseView.cxx
+    src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.cxx
+    src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.cxx
+    src/interface/wxWindows/wxMaracas_ManualTree_MPR.cxx
+    src/interface/wxWindows/widgets/wxManualTree_MPRWidget.cxx
+    src/interface/wxWindows/res/wxInterface.rc
+    src/interface/wxWindows/widgets/ContourView.cxx
+    src/interface/wxWindows/widgets/PointView.cxx
+    src/interface/wxWindows/widgets/LineView.cxx
+    src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.cxx
+#####pPlotter classes
+    src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx
+    src/interface/wxWindows/widgets/pPlotter/HistogramWidget.cxx
+    src/interface/wxWindows/widgets/pPlotter/pHistogram.cxx
+    src/interface/wxWindows/widgets/pPlotter/mBarRange.cxx
+    src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.cxx
+    src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.cxx
+    src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.cxx
+    src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.cxx
+    src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.cxx
+    src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.cxx
+    src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.cxx
+    src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.cxx
+    src/interface/wxWindows/widgets/pPlotter/pColorBar.cxx
+    src/interface/wxWindows/widgets/pPlotter/pFigure.cxx
+    src/interface/wxWindows/widgets/pPlotter/pColorPoint.cxx
+    src/interface/wxWindows/widgets/pPlotter/pPlotter.cxx
+    src/interface/wxWindows/widgets/pPlotter/mathplot.cxx
+    src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.cxx
+    src/interface/wxWindows/widgets/pPlotter/Histogram.cxx
+###
+       src/kernel/marImageData.cpp
+       src/kernel/marDicomBase.cpp
+       src/kernel/marGdcmDicom.cpp
+       src/kernel/marObject.cpp
+       src/kernel/volume.cxx
+       src/kernel/marParameters.cpp
+       src/kernel/marDynData.cpp       
+  )
+  #----------------------------------------------------------------------------
+#jhcl-Start===========================================================================
+#message(jhcl4${LIBIDO_LIBRARIES})
+#jhcl-End===========================================================================
+         
+  #----------------------------------------------------------------------------
+  # LIBRARY DEPENDENCIES (LIBRARIES TO LINK WITH)
+  SET ( ${LIBRARY_NAME}_LINK_LIBRARIES
+               ${crea_LIBRARIES}
+        ${WXWIDGETS_LIBRARIES}
+        ${VTK_LIBRARIES}
+        ${ITK_LIBRARIES}
+        ${GDCM_LIBRARIES}
+    #    ${BOOST_LIBRARIES}
+       #jhcl-Start===========================================================================
+               
+               ${LIBIDO_LIBRARIES}
+               ${CREA_LIBRARIES}
+       #${BOOST_LIBRARIES}
+       #jhcl-End===========================================================================
+    )
+  #----------------------------------------------------------------------------
+
+  
+  #----------------------------------------------------------------------------
+  # MACRO WHICH DOES ALL THE JOB : BUILD AND INSTALL
+#JHCL 
+  #CREA_ADD_LIBRARY( ${LIBRARY_NAME} )
+#JHCL
+
+# Ya esta hecho arriba
+# SET(LIBRARY_NAME ******NOMBRE*******)
+
+  IF(CREA_VERBOSE_CMAKE)
+    MESSAGE(STATUS "** Creating library ${LIBRARY_NAME}")
+    MESSAGE(STATUS "   Headers  : ${${LIBRARY_NAME}_HEADERS}")
+    MESSAGE(STATUS "   Sources  : ${${LIBRARY_NAME}_SOURCES}")
+    MESSAGE(STATUS "   Link libs: ${${LIBRARY_NAME}_LINK_LIBRARIES}")
+  ENDIF(CREA_VERBOSE_CMAKE)
+
+
+  # MANAGE SHARED LIB
+  CREA_MANAGE_SHARED_LIBRARY(${LIBRARY_NAME})
+
+  # CREATE THE TARGET
+  ADD_LIBRARY(${LIBRARY_NAME} ${${LIBRARY_NAME}_SHARED} ${${LIBRARY_NAME}_SOURCES})
+
+  # LINK
+  TARGET_LINK_LIBRARIES(${LIBRARY_NAME} ${${LIBRARY_NAME}_LINK_LIBRARIES})
+
+ # Sets the settings for macro CREA_ADVANCED_INSTALL_LIBRARY_FOR_CMAKE
+  SET(${LIBRARY_NAME}_INSTALL_FOLDER ${LIBRARY_NAME})
+  SET(${LIBRARY_NAME}_LIBRARIES ${LIBRARY_NAME})
+#  FILE(RELATIVE_PATH
+ #   ${LIBRARY_NAME}_BUILD_TREE_RELATIVE_INCLUDE_PATHS
+ #   ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+ #   )
+
+SET(${LIBRARY_NAME}_BUILD_TREE_RELATIVE_INCLUDE_PATHS
+#lib/THIS_DIR/toto
+#lib/THIS_DIR/other_headers
+    lib/maracasVisuLib/src
+       #${MARACAS_SOURCE_DIR}/src/axe3DVTK
+       #  ${MARACAS_SOURCE_DIR}/src/interface
+    lib/maracasVisuLib/src/kernel
+       #${MARACAS_SOURCE_DIR}/src/SnakeIsoContour+Deriche
+    lib/maracasVisuLib/src/interface/wxWindows
+    lib/maracasVisuLib/src/interface/wxWindows/widgets
+    lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter
+       lib/maracasVisuLib/../../../
+)
+
+IF(UNIX)
+  SET(${LIBRARY_NAME}_BUILD_TREE_RELATIVE_LIBRARY_PATHS
+    ${EXECUTABLE_OUTPUT_REL_PATH})
+  SET(${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_LIBRARY_PATHS lib)
+ELSE(UNIX)
+  SET(${LIBRARY_NAME}_BUILD_TREE_RELATIVE_LIBRARY_PATHS
+    ${EXECUTABLE_OUTPUT_REL_PATH}/Debug
+    ${EXECUTABLE_OUTPUT_REL_PATH}/Release)
+  SET(${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_LIBRARY_PATHS bin)
+ENDIF(UNIX)
+  SET(${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_INCLUDE_PATHS include/${LIBRARY_NAME})
+  SET(${LIBRARY_NAME}_HAS_ADDITIONAL_CONFIG_FILE FALSE)
+# SET(${LIBRARY_NAME}_ADDITIONAL_CONFIG_FILE
+#   ${PROJECT_SOURCE_DIR}/src/AdditionalcreaImageIOConfig.cmake.in)
+# SET(${LIBRARY_NAME}_ADDITIONAL_USE_FILE
+#  ${PROJECT_SOURCE_DIR}/src/AdditionalUsecreaImageIO.cmake.in)
+
+# Invoke the advanced macro
+CREA_ADVANCED_INSTALL_LIBRARY_FOR_CMAKE(${LIBRARY_NAME})
+
+# INSTALLS LIBRARY
+INSTALL(
+  FILES ${${LIBRARY_NAME}_HEADERS}
+  DESTINATION ${${LIBRARY_NAME}_INSTALL_TREE_RELATIVE_INCLUDE_PATHS}
+  ) 
+INSTALL(
+  TARGETS ${LIBRARY_NAME}
+  DESTINATION lib)
+
+  
+  
+  
+  #----------------------------------------------------------------------------
+
+
+  #---------------------------------------------------------------------------
+ENDIF ( BUILD_${LIBRARY_NAME} )
diff --git a/lib/maracasVisuLib/include/Maracas.iss b/lib/maracasVisuLib/include/Maracas.iss
new file mode 100644 (file)
index 0000000..ff1e12e
--- /dev/null
@@ -0,0 +1,48 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+[Setup]
+AppName=Maracas
+AppVerName=Maracas 2.0
+AppPublisher=CREATIS
+AppPublisherURL=http://www.creatis.insa-lyon.fr/maracas
+AppSupportURL=http://www.creatis.insa-lyon.fr/maracas
+AppUpdatesURL=http://www.creatis.insa-lyon.fr/maracas
+DefaultDirName={pf}\Maracas
+DefaultGroupName=Maracas
+AllowNoIcons=yes
+
+[Tasks]
+; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
+Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
+; NOTE: The following entry contains English phrases ("Create a Quick Launch icon" and "Additional icons"). You are free to translate them into another language if required.
+Name: "quicklaunchicon"; Description: "Create a &Quick Launch icon"; GroupDescription: "Additional icons:"; Flags: unchecked
+
+[Files]
+Source: "C:\Mathieu\Maracas\bin\Release\maracas.exe"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Mathieu\Maracas\bin\Release\gsl.dll"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Mathieu\Maracas\bin\Release\gslcblas.dll"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Mathieu\Maracas\bin\Release\idodllvc.dll"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Mathieu\Maracas\bin\Release\glib-1.3.dll"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Mathieu\gdcm\Dicts\dicomV3.dic"; DestDir: "{app}"; Flags: ignoreversion
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[INI]
+Filename: "{app}\maracas.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.creatis.insa-lyon.fr/maracas"
+
+[Icons]
+Name: "{group}\Maracas"; Filename: "{app}\maracas.exe"
+; NOTE: The following entry contains an English phrase ("on the Web"). You are free to translate it into another language if required.
+Name: "{group}\Maracas on the Web"; Filename: "{app}\maracas.url"
+; NOTE: The following entry contains an English phrase ("Uninstall"). You are free to translate it into another language if required.
+Name: "{group}\Uninstall Maracas"; Filename: "{uninstallexe}"
+Name: "{userdesktop}\Maracas"; Filename: "{app}\maracas.exe"; Tasks: desktopicon
+Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Maracas"; Filename: "{app}\maracas.exe"; Tasks: quicklaunchicon
+
+[Run]
+; NOTE: The following entry contains an English phrase ("Launch"). You are free to translate it into another language if required.
+Filename: "{app}\maracas.exe"; Description: "Launch Maracas"; Flags: nowait postinstall skipifsilent
+
+[UninstallDelete]
+Type: files; Name: "{app}\maracas.url"
+
diff --git a/lib/maracasVisuLib/include/Modules/FindCrea.cmake b/lib/maracasVisuLib/include/Modules/FindCrea.cmake
new file mode 100644 (file)
index 0000000..5782e21
--- /dev/null
@@ -0,0 +1,3 @@
+FIND_PATH( crea_DIR creabin $ENV{CREA_PATH} )
+FIND_PACKAGE(crea)
+INCLUDE_DIRECTORIES(${CREA_INCLUDE_PATH})
\ No newline at end of file
diff --git a/lib/maracasVisuLib/include/Modules/FindGDCM.cmake b/lib/maracasVisuLib/include/Modules/FindGDCM.cmake
new file mode 100644 (file)
index 0000000..4920ff7
--- /dev/null
@@ -0,0 +1,104 @@
+# - Find a GDCM installation or build tree.
+# The following variables are set if GDCM is found.  If GDCM is not
+# found, GDCM_FOUND is set to false.
+#  GDCM_FOUND         - Set to true when GDCM is found.
+#  GDCM_USE_FILE      - CMake file to use GDCM.
+#  GDCM_MAJOR_VERSION - The GDCM major version number.
+#  GDCM_MINOR_VERSION - The GDCM minor version number 
+#                       (odd non-release).
+#  GDCM_BUILD_VERSION - The GDCM patch level 
+#                       (meaningless for odd minor).
+#  GDCM_INCLUDE_DIRS  - Include directories for GDCM
+#  GDCM_LIBRARY_DIRS  - Link directories for GDCM libraries
+#  GDCM_KITS          - List of GDCM kits, in CAPS 
+#                      (COMMON,IO,) etc.
+#  GDCM_LANGUAGES     - List of wrapped languages, in CAPS
+#                      (TCL, PYHTON,) etc.
+# The following cache entries must be set by the user to locate GDCM:
+#  GDCM_DIR  - The directory containing GDCMConfig.cmake.  
+#             This is either the root of the build tree,
+#             or the lib/vtk directory.  This is the 
+#             only cache entry.
+
+
+# Construct consitent error messages for use below.
+SET(GDCM_DIR_DESCRIPTION "directory containing GDCMConfig.cmake.  This is either the root of the build tree, or PREFIX/lib/GDCM for an installation.")
+SET(GDCM_DIR_MESSAGE "GDCM not found.  Set the GDCM_DIR cmake cache entry to the ${GDCM_DIR_DESCRIPTION}")
+
+# Search only if the location is not already known.
+IF(NOT GDCM_DIR)
+  # Get the system search path as a list.
+  IF(UNIX)
+    STRING(REGEX MATCHALL "[^:]+" GDCM_DIR_SEARCH1 "$ENV{PATH}")
+  ELSE(UNIX)
+    STRING(REGEX REPLACE "\\\\" "/" GDCM_DIR_SEARCH1 "$ENV{PATH}")
+  ENDIF(UNIX)
+  STRING(REGEX REPLACE "/;" ";" GDCM_DIR_SEARCH2 "${GDCM_DIR_SEARCH1}")
+
+  # Construct a set of paths relative to the system search path.
+  SET(GDCM_DIR_SEARCH "")
+  FOREACH(dir ${GDCM_DIR_SEARCH2})
+    SET(GDCM_DIR_SEARCH ${GDCM_DIR_SEARCH}
+      ${dir}/../lib/GDCM
+      )
+  ENDFOREACH(dir)
+
+  #
+  # Look for an installation or build tree.
+  #
+  FIND_PATH(GDCM_DIR GDCMConfig.cmake
+    # Look for an environment variable GDCM_DIR.
+    $ENV{GDCM_DIR}
+
+    # Look in places relative to the system executable search path.
+    ${GDCM_DIR_SEARCH}
+
+    # Look in standard UNIX install locations.
+    /usr/local/lib/GDCM
+    /usr/lib/GDCM
+
+    # Read from the CMakeSetup registry entries.  It is likely that
+    # GDCM will have been recently built.
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild1]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild2]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild3]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild4]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild5]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild6]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild7]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild8]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild9]
+    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild10]
+
+    # Help the user find it if we cannot.
+    DOC "The ${GDCM_DIR_DESCRIPTION}"
+  )
+ENDIF(NOT GDCM_DIR)
+
+# If GDCM was found, load the configuration file to get the rest of the
+# settings.
+IF(GDCM_DIR)
+  # Make sure the GDCMConfig.cmake file exists in the directory provided.
+  IF(EXISTS ${GDCM_DIR}/GDCMConfig.cmake)
+
+    # We found GDCM.  Load the settings.
+    SET(GDCM_FOUND 1)
+    INCLUDE(${GDCM_DIR}/GDCMConfig.cmake)
+
+  ENDIF(EXISTS ${GDCM_DIR}/GDCMConfig.cmake)
+ELSE(GDCM_DIR)
+  # We did not find GDCM.
+  SET(GDCM_FOUND 0)
+ENDIF(GDCM_DIR)
+
+#-----------------------------------------------------------------------------
+IF(NOT GDCM_FOUND)
+  # GDCM not found, explain to the user how to specify its location.
+  IF(NOT GDCM_FIND_QUIETLY)
+    MESSAGE(FATAL_ERROR ${GDCM_DIR_MESSAGE})
+  ELSE(NOT GDCM_FIND_QUIETLY)
+    IF(GDCM_FIND_REQUIRED)
+      MESSAGE(FATAL_ERROR ${GDCM_DIR_MESSAGE})
+    ENDIF(GDCM_FIND_REQUIRED)
+  ENDIF(NOT GDCM_FIND_QUIETLY)
+ENDIF(NOT GDCM_FOUND)
diff --git a/lib/maracasVisuLib/include/Modules/FindGLIB.cmake b/lib/maracasVisuLib/include/Modules/FindGLIB.cmake
new file mode 100644 (file)
index 0000000..392833c
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# This module finds if GLIB is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  GLIB_FOUND           = system has GLIB and it should be used
+#  GLIB_LIBRARIES       = full path to the GLIB library and linker flags on unix
+#  CMAKE_GLIB_CXX_FLAGS = compiler flags for building GLIB 
+#  GLIB_INCLUDE_DIR     = include path of GLIB
+
+IF(WIN32)
+  IF(CYGWIN)
+
+    FIND_PROGRAM(CMAKE_GLIB_CONFIG glib-config ../glib/bin ../../glib/bin)
+    SET(CMAKE_GLIB_CXX_FLAGS "`${CMAKE_GLIB_CONFIG} --cflags`")
+    SET(GLIB_LIBRARIES "`${CMAKE_GLIB_CONFIG} --libs`")
+
+  ELSE(CYGWIN)
+
+    SET (GLIB_POSSIBLE_PATHS
+      $ENV{GLIB}/src/glib
+      $ENV{CREATIS}/glib-1.3/src/glib
+      "C:/glib-1.3/src/glib"
+    )
+    FIND_LIBRARY(GLIB_SHARED_LIBRARY
+      NAMES glib-1.3
+      PATHS ${GLIB_POSSIBLE_PATHS} 
+    )
+
+    FIND_PATH(GLIB_INCLUDE_DIR
+      glib.h
+      ${GLIB_POSSIBLE_PATHS} 
+    )
+
+  ENDIF(CYGWIN)
+ELSE(WIN32)
+
+  FIND_PROGRAM(CMAKE_GLIB_CONFIG glib-config ../glib/bin ../../glib/bin)
+  SET(CMAKE_GLIB_CXX_FLAGS "`${CMAKE_GLIB_CONFIG} --cflags`")
+  SET(GLIB_LIBRARIES "`${CMAKE_GLIB_CONFIG} --libs`")
+
+ENDIF(WIN32)
+
+MARK_AS_ADVANCED(
+  GLIB_SHARED_LIBRARY
+  CMAKE_GLIB_CONFIG
+  CMAKE_GLIB_CXX_FLAGS
+  GLIB_INCLUDE_DIR
+)
+
+IF(GLIB_LIBRARIES)
+  IF(GLIB_INCLUDE_DIR OR CMAKE_GLIB_CXX_FLAGS)
+    SET(CMAKE_GLIB_CAN_COMPILE 1)
+    SET(GLIB_FOUND 1)
+  ENDIF(GLIB_INCLUDE_DIR OR CMAKE_GLIB_CXX_FLAGS)
+ENDIF(GLIB_LIBRARIES)
+
diff --git a/lib/maracasVisuLib/include/Modules/FindGSL.cmake b/lib/maracasVisuLib/include/Modules/FindGSL.cmake
new file mode 100644 (file)
index 0000000..145ec92
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# This module finds if GSL is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  GSL_FOUND        = system has GSL and it should be used
+#  GSL_LIBRARIES         = full path to the GSL library and linker flags on unix
+#  CMAKE_GSL_CXX_FLAGS        = compiler flags for building GSL 
+#  GSL_INCLUDE_DIR    = include path of GSL
+
+IF(WIN32)
+  IF(CYGWIN)
+
+    FIND_PROGRAM(CMAKE_GSL_CONFIG gsl-config ../GSL/bin ../../GSL/bin)
+    SET(CMAKE_GSL_CXX_FLAGS "`${CMAKE_GSL_CONFIG} --cflags`")
+    SET(GSL_LIBRARIES "`${CMAKE_GSL_CONFIG} --libs`")
+
+  ELSE(CYGWIN)
+
+    SET (GSL_POSSIBLE_LIB_PATHS
+      $ENV{GSL}/lib
+      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\GNU Scientific Library_is1;Inno Setup: App Path]/lib"
+    )
+
+    FIND_LIBRARY(GSL_STATIC_LIBRARY
+      NAMES gsl
+      PATHS ${GSL_POSSIBLE_LIB_PATHS} 
+    )
+
+    FIND_LIBRARY(GSL_SHARED_LIBRARY
+      NAMES gsl
+      PATHS ${GSL_POSSIBLE_LIB_PATHS} 
+    )
+
+    SET (GSL_POSSIBLE_INCLUDE_PATHS
+      $ENV{GSL}/include
+      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\GNU Scientific Library_is1;Inno Setup: App Path]/include"
+    )
+
+    FIND_PATH(GSL_INCLUDE_DIR
+      gsl/gsl_version.h
+      ${GSL_POSSIBLE_INCLUDE_PATHS} 
+    )
+
+    IF(GSL_SHARED_LIBRARY)
+      OPTION(GSL_USE_SHARED_LIBS 
+             "Use shared versions of GSL libraries" ON)
+      MARK_AS_ADVANCED(GSL_USE_SHARED_LIBS)
+    ENDIF(GSL_SHARED_LIBRARY)
+
+    SET(CMAKE_GSL_LIBRARIES ${CMAKE_GSL_LIBRARIES}) # comctl32 ctl3d32 wsock32 rpcrt4)
+
+    IF(GSL_USE_SHARED_LIBS)
+      SET(GSL_LIBRARIES ${GSL_SHARED_LIBRARY} ${CMAKE_GSL_LIBRARIES})
+    ELSE(GSL_USE_SHARED_LIBS)
+      SET(GSL_LIBRARIES ${GSL_STATIC_LIBRARY} ${CMAKE_GSL_LIBRARIES})
+    ENDIF(GSL_USE_SHARED_LIBS)
+
+    MARK_AS_ADVANCED(
+      GSL_STATIC_LIBRARY
+      GSL_SHARED_LIBRARY
+      GSL_INCLUDE_DIR
+    )
+  ENDIF(CYGWIN)
+ELSE(WIN32)
+
+  FIND_PROGRAM(CMAKE_GSL_CONFIG gsl-config ../GSL/bin ../../GSL/bin)
+  SET(CMAKE_GSL_CXX_FLAGS "`${CMAKE_GSL_CONFIG} --cflags`")
+  SET(GSL_LIBRARIES "`${CMAKE_GSL_CONFIG} --libs`")
+
+ENDIF(WIN32)  
+
+MARK_AS_ADVANCED(
+  CMAKE_GSL_CONFIG 
+  CMAKE_GSL_CXX_FLAGS
+  GSL_INCLUDE_DIR
+)
+
+IF(GSL_LIBRARIES)
+  IF(GSL_INCLUDE_DIR OR CMAKE_GSL_CXX_FLAGS)
+    SET(CMAKE_GSL_CAN_COMPILE 1)
+    SET(GSL_FOUND 1)
+  ENDIF(GSL_INCLUDE_DIR OR CMAKE_GSL_CXX_FLAGS)
+ENDIF(GSL_LIBRARIES)
+
diff --git a/lib/maracasVisuLib/include/Modules/FindGSLobj.cmake b/lib/maracasVisuLib/include/Modules/FindGSLobj.cmake
new file mode 100644 (file)
index 0000000..a129ca9
--- /dev/null
@@ -0,0 +1,62 @@
+#
+# This module finds if GSLOBJ is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  GSLOBJ_FOUND        = system has GSLOBJ and it should be used
+#  GSLOBJ_LIBRARIES         = full path to the GSLOBJ library and linker flags on unix
+#  CMAKE_GSLOBJ_CXX_FLAGS        = compiler flags for building GSLOBJ 
+#  GSLOBJ_INCLUDE_DIR    = include path of GSLOBJ
+
+IF(WIN32)
+IF(NOT UNIX)
+  SET (GSLOBJ_POSSIBLE_LIB_PATHS
+    $ENV{GSLOBJ}/lib
+    $ENV{CREATIS}/gslobj/win32inst/lib
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\GSLobj_is1;Inno Setup: App Path]/lib"
+  )
+
+  FIND_LIBRARY(GSLOBJ_STATIC_LIBRARY
+    NAMES gslobj
+    PATHS ${GSLOBJ_POSSIBLE_LIB_PATHS} 
+  )
+
+  SET (GSLOBJ_POSSIBLE_INCLUDE_PATHS
+    $ENV{GSLOBJ}/include
+    $ENV{CREATIS}/gslobj/win32inst/include
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\GSLobj_is1;Inno Setup: App Path]/include"
+  )
+
+  FIND_PATH(GSLOBJ_INCLUDE_DIR
+    gslobj/gslobj.hxx
+    ${GSLOBJ_POSSIBLE_INCLUDE_PATHS} 
+  )
+
+  SET(GSLOBJ_LIBRARIES ${GSLOBJ_STATIC_LIBRARY} ${CMAKE_GSLOBJ_LIBRARIES})
+
+  MARK_AS_ADVANCED(
+    GSLOBJ_STATIC_LIBRARY
+    GSLOBJ_INCLUDE_DIR
+  )
+ENDIF(NOT UNIX)
+ENDIF(WIN32)
+
+IF(UNIX)
+
+  FIND_PROGRAM(CMAKE_GSLOBJ_CONFIG gslobj-config ../gslobj/bin ../../gslobj/bin)
+  SET(CMAKE_GSLOBJ_CXX_FLAGS "`${CMAKE_GSLOBJ_CONFIG} --cflags`")
+  SET(GSLOBJ_LIBRARIES "`${CMAKE_GSLOBJ_CONFIG} --libs`")
+
+ENDIF(UNIX)  
+
+MARK_AS_ADVANCED(
+  CMAKE_GSLOBJ_CXX_FLAGS
+  GSLOBJ_INCLUDE_DIR
+)
+
+IF(GSLOBJ_LIBRARIES)
+  IF(GSLOBJ_INCLUDE_DIR OR CMAKE_GSLOBJ_CXX_FLAGS)
+    SET(CMAKE_GSLOBJ_CAN_COMPILE 1)
+    SET(GSLOBJ_FOUND 1)
+  ENDIF(GSLOBJ_INCLUDE_DIR OR CMAKE_GSLOBJ_CXX_FLAGS)
+ENDIF(GSLOBJ_LIBRARIES)
diff --git a/lib/maracasVisuLib/include/Modules/FindGTK.cmake b/lib/maracasVisuLib/include/Modules/FindGTK.cmake
new file mode 100644 (file)
index 0000000..334c138
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# try to find GTK (and glib) and GTKGLArea
+#
+
+# GTK_INCLUDE_DIR   - Directories to include to use GTK
+# GTK_LIBRARIES     - Files to link against to use GTK
+# GTK_VERSION_2     - Use this Version
+# GTK_VERSION_1     - Use this Version
+# GTK_FOUND         - If false, don't try to use GTK
+
+OPTION(GTK_VERSION_1    "Use GTK version 1.x"   1)
+OPTION(GTK_VERSION_2    "Use GTK version 2.x"   2)
+
+# Exclusion between the two version
+
+IF(GTK_VERSION_2)
+  SET(GTK_VERSION_1 0)
+ENDIF(GTK_VERSION_2)
+
+IF(WIN32)
+  #win sucks !
+
+ELSE(WIN32)
+
+  #Find new pkg-config
+  #FIND_PACKAGE(PKG) #don't know how to register !
+  FIND_PROGRAM(CMAKE_PKG_CONFIG pkg-config ../gtk2/bin ../../gtk2/bin)
+
+  #if PKG is found
+  IF(CMAKE_PKG_CONFIG)
+
+    SET(CMAKE_GTK1_CXX_FLAGS "`${CMAKE_PKG_CONFIG} --cflags gtk`")
+    SET(GTK1_LIBRARIES "`${CMAKE_PKG_CONFIG} --libs gtk`")
+
+    SET(CMAKE_GTK2_CXX_FLAGS "`${CMAKE_PKG_CONFIG} --cflags gtk+-2.0`")
+    SET(GTK2_LIBRARIES "`${CMAKE_PKG_CONFIG} --libs gtk+-2.0`")
+    
+  ELSE(CMAKE_PKG_CONFIG)
+    #we were not able to find to, lets try with:
+    #old gtk-config
+    FIND_PROGRAM(CMAKE_GTK_CONFIG gtk-config ../gtk/bin ../../gtk/bin)
+
+    SET(CMAKE_GTK1_CXX_FLAGS "`${CMAKE_GTK_CONFIG} --cflags`")
+    SET(GTK1_LIBRARIES "`${CMAKE_GTK_CONFIG} --libs`")
+
+    MESSAGE(FATAL_ERROR "GTK2.x was not found but GTK1.x was, please set GTK_VERSION_1
+    to ON")
+  ENDIF(CMAKE_PKG_CONFIG)
+  
+ENDIF(WIN32)  
+
+MARK_AS_ADVANCED(
+  CMAKE_GTK_CXX_FLAGS
+  CMAKE_GTK2_CXX_FLAGS
+  GTK_INCLUDE_DIR
+)
+
+#IF(GTK_LIBRARIES OR GTK2_LIBRARIES)
+  #only one gtk version was found !
+  #default GTK to this one (even if it GTK2)
+#  OPTION()
+#ENDIF(GTK_LIBRARIES OR GTK2_LIBRARIES)
+
+#IF(GTK_LIBRARIES)
+#  IF((GTK_INCLUDE_DIR OR CMAKE_GTK_CXX_FLAGS) AND GTK_VERSION_2)
+#    SET(GTK_FOUND 1)
+#    SET (GTK_LIBRARIES ${GTK1_LIBRARIES})
+#    SET(CMAKE_GTK_CXX_FLAGS ${CMAKE_GTK2_CXX_FLAGS})
+#  ENDIF((GTK_INCLUDE_DIR OR CMAKE_GTK_CXX_FLAGS) AND GTK_VERSION_2)
+#
+#  IF(GTK2_INCLUDE_DIR OR CMAKE_GTK2_CXX_FLAGS)
+#    SET(GTK2_FOUND 1)
+#  ENDIF(GTK2_INCLUDE_DIR OR CMAKE_GTK2_CXX_FLAGS)
+#  
+#ENDIF(GTK_LIBRARIES)
+
+
+
+
+IF(GTK1_LIBRARIES OR GTK2_LIBRARIES)
+
+  IF(GTK_VERSION_2)
+    #looking for GTK2.x
+    IF(CMAKE_GTK2_CXX_FLAGS)
+      SET(GTK_FOUND 1)
+      SET (GTK_LIBRARIES ${GTK2_LIBRARIES})
+      SET(CMAKE_GTK_CXX_FLAGS ${CMAKE_GTK2_CXX_FLAGS})
+    ENDIF(CMAKE_GTK2_CXX_FLAGS)
+  ELSE(GTK_VERSION_2)
+    #looking for GTK1.x
+    IF(CMAKE_GTK1_CXX_FLAGS)
+      SET(GTK_FOUND 1)
+      SET (GTK_LIBRARIES ${GTK1_LIBRARIES})
+      SET(CMAKE_GTK_CXX_FLAGS ${CMAKE_GTK1_CXX_FLAGS})
+    ENDIF(CMAKE_GTK1_CXX_FLAGS)
+  ENDIF(GTK_VERSION_2)
+ENDIF(GTK1_LIBRARIES OR GTK2_LIBRARIES)
diff --git a/lib/maracasVisuLib/include/Modules/FindGTK2.cmake b/lib/maracasVisuLib/include/Modules/FindGTK2.cmake
new file mode 100644 (file)
index 0000000..468702b
--- /dev/null
@@ -0,0 +1,328 @@
+
+IF (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS)
+  # in cache already
+  SET(GTK2_FOUND TRUE)
+ELSE (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS)
+  IF(UNIX)
+    # use pkg-config to get the directories and then use these values
+    # in the FIND_PATH() and FIND_LIBRARY() calls
+    INCLUDE(UsePkgConfig)
+
+    PKGCONFIG(gtk-2.0 _GTK22IncDir _GTK22LinkDir _GTK22LinkFlags _GTK22Cflags)
+
+    FIND_PATH(GTK2_GTK_INCLUDE_PATH gtk/gtk.h
+      $ENV{GTK2_HOME}
+      ${_GTK22IncDir}
+      /usr/include/gtk-2.0
+      /usr/local/include/gtk-2.0
+      /opt/include/gtk-2.0
+      /opt/gnome/include/gtk-2.0
+      /sw/include/gtk-2.0
+    )
+
+    # Some Linux distributions (e.g. Red Hat) have glibconfig.h
+    # and glib.h in different directories, so we need to look
+    # for both.
+    #  - Atanas Georgiev <atanas@cs.columbia.edu>
+    PKGCONFIG(glib-2.0 _GLIB2IncDir _GLIB2inkDir _GLIB2LinkFlags _GLIB2Cflags)
+    PKGCONFIG(gmodule-2.0 _GMODULE2IncDir _GMODULE2inkDir _GMODULE2LinkFlags _GMODULE2Cflags)
+    SET(GDIR /opt/gnome/lib/glib-2.0/include)
+
+    FIND_PATH(GTK2_GLIBCONFIG_INCLUDE_PATH glibconfig.h
+      ${_GLIB2IncDir}
+      /opt/gnome/lib64/glib-2.0/include
+      /opt/gnome/lib/glib-2.0/include
+      /opt/lib/glib-2.0/include
+      /usr/lib64/glib-2.0/include
+      /usr/lib/glib-2.0/include
+      /sw/lib/glib-2.0/include
+    )
+    #MESSAGE(STATUS "DEBUG: GTK2_GLIBCONFIG_INCLUDE_PATH = ${GTK2_GLIBCONFIG_INCLUDE_PATH}")
+
+    FIND_PATH(GTK2_GLIB_INCLUDE_PATH glib.h
+      ${_GLIB2IncDir}
+      /opt/include/glib-2.0
+      /opt/gnome/include/glib-2.0
+      /usr/include/glib-2.0
+      /sw/include/glib-2.0
+    )
+    #MESSAGE(STATUS "DEBUG: GTK2_GLIBCONFIG_INCLUDE_PATH = ${GTK2_GLIBCONFIG_INCLUDE_PATH}")
+
+    FIND_PATH(GTK2_GTKGL_INCLUDE_PATH gtkgl/gtkglarea.h
+      ${_GLIB2IncDir}
+      /usr/include
+      /usr/local/include
+      /usr/openwin/share/include
+      /opt/gnome/include
+      /opt/include
+      /sw/include
+    )
+
+    PKGCONFIG(pango _PANGOIncDir _PANGOinkDir _PANGOLinkFlags _PANGOCflags)
+
+    FIND_PATH(GTK2_PANGO_INCLUDE_PATH pango/pango.h
+      ${_PANGOIncDir}
+      /opt/gnome/include/pango-1.0
+      /opt/include/pango-1.0
+      /usr/include/pango-1.0
+      /sw/include/pango-1.0
+    )
+
+    PKGCONFIG(gdk-2.0 _GDK2IncDir _GDK2inkDir _GDK2LinkFlags _GDK2Cflags)
+
+    FIND_PATH(GTK2_GDKCONFIG_INCLUDE_PATH gdkconfig.h
+      ${_GDK2IncDir}
+      /opt/gnome/lib/gtk-2.0/include
+      /opt/gnome/lib64/gtk-2.0/include
+      /opt/lib/gtk-2.0/include
+      /usr/lib/gtk-2.0/include
+      /usr/lib64/gtk-2.0/include
+      /sw/lib/gtk-2.0/include
+    )
+
+    # Dave:
+    FIND_PATH(GTK2_GDK_INCLUDE_PATH gdk.h
+      ${_GDK2IncDir}
+      /usr/include/gtk-2.0
+      /usr/include/gtk-2.0/gdk
+    )
+    #MESSAGE(STATUS "DEBUG: GTK2_GLIBCONFIG_INCLUDE_PATH = ${GTK2_GLIBCONFIG_INCLUDE_PATH}")
+
+    PKGCONFIG(cairo _CAIROIncDir _CAIROinkDir _CAIROLinkFlags _CAIROCflags)
+
+    FIND_PATH(GTK2_CAIRO_INCLUDE_PATH cairo.h
+      ${_CAIROIncDir}
+      /opt/gnome/include/cairo
+      /usr/include
+      /usr/include/cairo
+      /opt/include
+      /opt/include/cairo
+      /sw/include
+      /sw/include/cairo
+    )
+    #MESSAGE(STATUS "DEBUG: GTK2_CAIRO_INCLUDE_PATH = ${GTK2_CAIRO_INCLUDE_PATH}")
+
+    PKGCONFIG(atk _ATKIncDir _ATKinkDir _ATKLinkFlags _ATKCflags)
+
+    FIND_PATH(GTK2_ATK_INCLUDE_PATH atk/atk.h
+      ${_ATKIncDir}
+      /opt/gnome/include/atk-1.0
+      /usr/include/atk-1.0
+      /opt/include/atk-1.0
+      /sw/include/atk-1.0
+    )
+    #MESSAGE(STATUS "DEBUG: GTK2_ATK_INCLUDE_PATH = ${GTK2_ATK_INCLUDE_PATH}")
+
+    FIND_LIBRARY(GTK2_GTKGL_LIBRARY
+      NAMES
+        gtkgl
+      PATHS
+        ${_GTK22IncDir}
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    FIND_LIBRARY(GTK2_GTK_LIBRARY
+      NAMES
+        gtk-x11-2.0
+      PATHS
+        ${_GTK22LinkDir}
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    FIND_LIBRARY(GTK2_GDK_LIBRARY
+      NAMES
+        gdk-x11-2.0
+      PATHS
+        ${_GDK2LinkDir}
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    FIND_LIBRARY(GTK2_GMODULE_LIBRARY
+      NAMES
+        gmodule-2.0
+      PATHS
+        ${_GMODULE2inkDir}
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    FIND_LIBRARY(GTK2_GLIB_LIBRARY
+      NAMES
+        glib-2.0
+      PATHS
+        ${_GLIB2inkDir}
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    FIND_LIBRARY(GTK2_Xi_LIBRARY 
+      NAMES
+        Xi
+      PATHS 
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    FIND_LIBRARY(GTK2_GTHREAD_LIBRARY
+      NAMES
+        gthread-2.0
+      PATHS
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+
+    FIND_LIBRARY(GTK2_GOBJECT_LIBRARY
+      NAMES
+        gobject-2.0
+      PATHS
+        /usr/lib
+        /usr/local/lib
+        /usr/openwin/lib
+        /usr/X11R6/lib
+        /opt/gnome/lib
+        /opt/lib
+        /sw/lib
+    )
+
+    IF(GTK2_GTK_INCLUDE_PATH)
+      IF(GTK2_GLIBCONFIG_INCLUDE_PATH)
+        IF(GTK2_GLIB_INCLUDE_PATH)
+          IF(GTK2_GTK_LIBRARY)
+            IF(GTK2_GLIB_LIBRARY)
+              IF(GTK2_PANGO_INCLUDE_PATH)
+                IF(GTK2_ATK_INCLUDE_PATH)
+                  IF(GTK2_CAIRO_INCLUDE_PATH)
+                    # Assume that if gtk and glib were found, the other
+                    # supporting libraries have also been found.
+
+                    SET(GTK2_FOUND TRUE)
+
+                    SET(GTK2_INCLUDE_DIRS
+                      ${GTK2_GTK_INCLUDE_PATH}
+                      ${GTK2_GLIBCONFIG_INCLUDE_PATH}
+                      ${GTK2_GLIB_INCLUDE_PATH}
+                      ${GTK2_PANGO_INCLUDE_PATH}
+                      ${GTK2_GDKCONFIG_INCLUDE_PATH}
+                      # Dave:
+                      ${GTK2_GDK_INCLUDE_PATH}
+                      ${GTK2_ATK_INCLUDE_PATH}
+                      ${GTK2_CAIRO_INCLUDE_PATH}
+                    )
+
+                    SET(GTK2_LIBRARIES
+                      ${GTK2_GTK_LIBRARY}
+                      ${GTK2_GDK_LIBRARY}
+                      ${GTK2_GLIB_LIBRARY}
+                    )
+                    #${GTK2_GOBJECT_LIBRARY})
+
+                    IF(GTK2_GMODULE_LIBRARY)
+                      SET(GTK2_LIBRARIES
+                        ${GTK2_LIBRARIES}
+                        ${GTK2_GMODULE_LIBRARY}
+                      )
+                    ENDIF(GTK2_GMODULE_LIBRARY)
+
+                    IF(GTK2_GTHREAD_LIBRARY)
+                      SET(GTK2_LIBRARIES
+                        ${GTK2_LIBRARIES}
+                        ${GTK2_GTHREAD_LIBRARY}
+                      )
+                    SET(GTK2_LIBRARIES ${GTK2_LIBRARIES})
+                    ENDIF(GTK2_GTHREAD_LIBRARY)
+                  ELSE(GTK2_CAIRO_INCLUDE_PATH)
+                    MESSAGE(STATUS "Can not find cairo")
+                  ENDIF(GTK2_CAIRO_INCLUDE_PATH)
+                ELSE(GTK2_ATK_INCLUDE_PATH)
+                  MESSAGE(STATUS "Can not find atk")
+                ENDIF(GTK2_ATK_INCLUDE_PATH)
+              ELSE(GTK2_PANGO_INCLUDE_PATH)
+                MESSAGE(STATUS "Can not find pango includes")
+              ENDIF(GTK2_PANGO_INCLUDE_PATH)
+            ELSE(GTK2_GLIB_LIBRARY)
+              MESSAGE(STATUS "Can not find glib lib")
+            ENDIF(GTK2_GLIB_LIBRARY)
+          ELSE(GTK2_GTK_LIBRARY)
+            MESSAGE(STATUS "Can not find gtk lib")
+          ENDIF(GTK2_GTK_LIBRARY)
+        ELSE(GTK2_GLIB_INCLUDE_PATH)
+          MESSAGE(STATUS "Can not find glib includes")
+        ENDIF(GTK2_GLIB_INCLUDE_PATH)
+      ELSE(GTK2_GLIBCONFIG_INCLUDE_PATH)
+        MESSAGE(STATUS "Can not find glibconfig")
+      ENDIF(GTK2_GLIBCONFIG_INCLUDE_PATH)
+    ELSE (GTK2_GTK_INCLUDE_PATH)
+      MESSAGE(STATUS "Can not find gtk includes")
+    ENDIF (GTK2_GTK_INCLUDE_PATH)
+
+    IF (GTK2_FOUND)
+      IF (NOT GTK2_FIND_QUIETLY)
+        MESSAGE(STATUS "Found GTK2: ${GTK2_LIBRARIES}")
+      ENDIF (NOT GTK2_FIND_QUIETLY)
+    ELSE (GTK2_FOUND)
+      IF (GTK2_FIND_REQUIRED)
+        MESSAGE(SEND_ERROR "Could NOT find GTK2")
+      ENDIF (GTK2_FIND_REQUIRED)
+    ENDIF (GTK2_FOUND)
+
+    MARK_AS_ADVANCED(
+      GTK2_GDK_LIBRARY
+      GTK2_GLIB_INCLUDE_PATH
+      GTK2_GLIB_LIBRARY
+      GTK2_GLIBCONFIG_INCLUDE_PATH
+      GTK2_GMODULE_LIBRARY
+      GTK2_GTHREAD_LIBRARY
+      GTK2_Xi_LIBRARY
+      GTK2_GTK_INCLUDE_PATH
+      GTK2_GTK_LIBRARY
+      GTK2_GTKGL_INCLUDE_PATH
+      GTK2_GTKGL_LIBRARY
+      GTK2_ATK_INCLUDE_PATH
+      GTK2_GDKCONFIG_INCLUDE_PATH
+      # Dave:
+      GTK2_GDK_INCLUDE_PATH
+      #GTK2_GOBJECT_LIBRARY
+      GTK2_PANGO_INCLUDE_PATH
+    )
+  ENDIF(UNIX)
+ENDIF (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS)
+
diff --git a/lib/maracasVisuLib/include/Modules/FindKGFO.cmake b/lib/maracasVisuLib/include/Modules/FindKGFO.cmake
new file mode 100644 (file)
index 0000000..2f4d3d9
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# This module finds if kgfo is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  KGFO_FOUND        = system has kgfo and it should be used
+#  KGFO_LIBRARIES         = full path to the kgfo library and linker flags on unix
+#  CMAKE_KGFO_CXX_FLAGS        = compiler flags for building kgfo 
+#  KGFO_INCLUDE_DIR    = include path of kgfo
+
+IF(WIN32)
+  IF(NOT UNIX)
+
+    SET (KGFO_POSSIBLE_LIB_PATHS
+      $ENV{KGFO}/lib
+      $ENV{CREATIS}/kgfo/win32inst/lib
+      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\kgfo_is1;Inno Setup: App Path]/lib"
+    )
+
+    FIND_LIBRARY(KGFO_STATIC_LIBRARY
+      NAMES kgfo
+      PATHS ${KGFO_POSSIBLE_LIB_PATHS} 
+    )
+
+    FIND_LIBRARY(KGFO_SHARED_LIBRARY
+      NAMES kgfo
+      PATHS ${KGFO_POSSIBLE_LIB_PATHS} 
+    )
+
+    SET (KGFO_POSSIBLE_INCLUDE_PATHS
+      $ENV{KGFO}/include
+      $ENV{CREATIS}/kgfo/win32inst/include
+      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\kgfo_is1;Inno Setup: App Path]/include"
+    )
+
+    FIND_PATH(KGFO_INCLUDE_DIR
+      kgfo/kgfo-setup.hxx
+      ${KGFO_POSSIBLE_INCLUDE_PATHS} 
+    )
+
+    IF(KGFO_SHARED_LIBRARY)
+      OPTION(KGFO_USE_SHARED_LIBS 
+             "Use shared versions of kgfo libraries" ON)
+      MARK_AS_ADVANCED(KGFO_USE_SHARED_LIBS)
+    ENDIF(KGFO_SHARED_LIBRARY)
+
+    SET(CMAKE_KGFO_LIBRARIES ${CMAKE_KGFO_LIBRARIES}) # comctl32 ctl3d32 wsock32 rpcrt4)
+
+    IF(KGFO_USE_SHARED_LIBS)
+      SET(KGFO_LIBRARIES ${KGFO_SHARED_LIBRARY} ${CMAKE_KGFO_LIBRARIES})
+      ADD_DEFINITIONS(-DKGFO_USING_DLL)
+    ELSE(KGFO_USE_SHARED_LIBS)
+      SET(KGFO_LIBRARIES ${KGFO_STATIC_LIBRARY} ${CMAKE_KGFO_LIBRARIES})
+    ENDIF(KGFO_USE_SHARED_LIBS)
+
+    MARK_AS_ADVANCED(
+      KGFO_STATIC_LIBRARY
+      KGFO_SHARED_LIBRARY
+      KGFO_INCLUDE_DIR
+    )
+
+  ENDIF(NOT UNIX)
+ENDIF(WIN32)
+
+IF(UNIX)
+
+  FIND_PROGRAM(CMAKE_KGFO_CONFIG kgfo-config ../kgfo/bin ../../kgfo/bin)
+  SET(CMAKE_KGFO_CXX_FLAGS "`${CMAKE_KGFO_CONFIG} --cflags`")
+  SET(KGFO_LIBRARIES "`${CMAKE_KGFO_CONFIG} --libs`")
+
+ENDIF(UNIX)  
+
+MARK_AS_ADVANCED(
+  CMAKE_KGFO_CONFIG
+  CMAKE_KGFO_CXX_FLAGS
+  KGFO_INCLUDE_DIR
+)
+
+IF(KGFO_LIBRARIES)
+  IF(KGFO_INCLUDE_DIR OR CMAKE_KGFO_CXX_FLAGS)
+    SET(CMAKE_KGFO_CAN_COMPILE 1)
+    SET(KGFO_FOUND 1)
+  ENDIF(KGFO_INCLUDE_DIR OR CMAKE_KGFO_CXX_FLAGS)
+ENDIF(KGFO_LIBRARIES)
+
diff --git a/lib/maracasVisuLib/include/Modules/FindLibido.cmake b/lib/maracasVisuLib/include/Modules/FindLibido.cmake
new file mode 100644 (file)
index 0000000..047eb69
--- /dev/null
@@ -0,0 +1,71 @@
+#
+# This module finds if Python is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  LIBIDO_SOURCE_DIR      = the full path containing the sources
+#  LIBIDO_BINARY_DIR      = the full path containing the binaries
+#  LIBIDO_INCLUDE_PATHS   = the paths to where .h files can be found
+#  LIBIDO_LIBRARIES       = the full path to the library found
+#  LIBIDO_DEBUG_LIBRARIES = the full path to the debug library found
+#
+
+#-----------------------------------------------------------------------------
+INCLUDE(${CMAKE_ROOT}/Modules/CMakeFindFrameworks.cmake)
+
+#-----------------------------------------------------------------------------
+IF(${libIdo_DIR})
+   SET(LIBIDO_SOURCE_DIR ${libIdo_DIR} CACHE PATH "libIdo source directory")
+   SET(LIBIDO_BINARY_DIR ${libIdo_DIR} CACHE PATH "libIdo binary directory")
+ENDIF(${libIdo_DIR})
+
+IF(NOT LIBIDO_SOURCE_DIR)
+   FIND_PATH( LIBIDO_SOURCE_DIR  libido.spec.in  $ENV{LIBIDO_SRC} )
+   SET(LIBIDO_SOURCE_DIR  ${LIBIDO_SOURCE_DIR}  CACHE PATH "libIdo source directory")
+ELSE(NOT LIBIDO_SOURCE_DIR)
+       INCLUDE_DIRECTORIES(${LIBIDO_SOURCE_DIR})
+ENDIF(NOT LIBIDO_SOURCE_DIR)
+
+
+
+IF(NOT LIBIDO_BINARY_DIR)
+   FIND_PATH( LIBIDO_BINARY_DIR  libIdoConfig.cmake paths  $ENV{LIBIDO_PATH} )
+   SET(LIBIDO_BINARY_DIR ${LIBIDO_BINARY_DIR}  CACHE PATH "libIdo binary directory")
+ENDIF(NOT LIBIDO_BINARY_DIR)
+
+
+#-----------------------------------------------------------------------------
+# Set libIdo compilation variables
+FIND_PATH(LIBIDO_INCLUDE_PATH NAME idima.h
+   PATHS ${LIBIDO_SOURCE_DIR}/src
+   DOC "libIdo include path"
+)
+FIND_LIBRARY(LIBIDO_LIBRARY name Ido libIdo
+   PATHS ${LIBIDO_BINARY_DIR}/lib/release
+   ${LIBIDO_BINARY_DIR}/lib
+   DOC "libIdo library"
+)
+FIND_LIBRARY(LIBIDO_DEBUG_LIBRARY name Ido libIdo
+   PATHS ${LIBIDO_BINARY_DIR}/lib/debug
+   ${LIBIDO_BINARY_DIR}/lib
+   DOC "libIdo debug library"
+)
+
+IF(WIN32)
+   MARK_AS_ADVANCED(FORCE
+      GLIB_INCLUDE_PATH
+      GLIB_LIBRARY
+   )
+ENDIF(WIN32)
+MARK_AS_ADVANCED(FORCE
+   LIBIDO_SOURCE_DIR
+   LIBIDO_BINARY_DIR
+   LIBIDO_INCLUDE_PATH
+   LIBIDO_LIBRARY
+   LIBIDO_DEBUG_LIBRARY
+)
+
+SET(LIBIDO_INCLUDE_PATHS   "${LIBIDO_INCLUDE_PATH}")
+SET(LIBIDO_LIBRARIES       "${LIBIDO_LIBRARY}")
+SET(LIBIDO_DEBUG_LIBRARIES "${LIBIDO_DEBUG_LIBRARY}")
+
diff --git a/lib/maracasVisuLib/include/Modules/FindMySQL.cmake b/lib/maracasVisuLib/include/Modules/FindMySQL.cmake
new file mode 100644 (file)
index 0000000..1492482
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find MySQL
+# Find the MySQL includes and client library
+# This module defines
+#  MYSQL_INCLUDE_DIR, where to find mysql.h
+#  MYSQL_LIBRARIES, the libraries needed to use MySQL.
+#  MYSQL_FOUND, If false, do not try to use MySQL.
+#
+# Copyright (c) 2006, Jaroslaw Staniek, <js@iidea.pl>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+if(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+   set(MYSQL_FOUND TRUE)
+
+else(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+
+  find_path(MYSQL_INCLUDE_DIR mysql.h
+      /usr/include/mysql
+      /usr/local/include/mysql
+      $ENV{ProgramFiles}/MySQL/*/include
+      $ENV{SystemDrive}/MySQL/*/include
+      )
+
+if(WIN32 AND MSVC)
+  find_library(MYSQL_LIBRARIES NAMES libmysql
+      PATHS
+      $ENV{ProgramFiles}/MySQL/*/lib/opt
+      $ENV{SystemDrive}/MySQL/*/lib/opt
+      )
+else(WIN32 AND MSVC)
+  find_library(MYSQL_LIBRARIES NAMES mysqlclient
+      PATHS
+      /usr/lib/mysql
+      /usr/local/lib/mysql
+      )
+endif(WIN32 AND MSVC)
+
+  if(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+    set(MYSQL_FOUND TRUE)
+    message(STATUS "Found MySQL: ${MYSQL_INCLUDE_DIR}, ${MYSQL_LIBRARIES}")
+  else(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+    set(MYSQL_FOUND FALSE)
+    message(STATUS "MySQL not found.")
+  endif(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+
+  mark_as_advanced(MYSQL_INCLUDE_DIR MYSQL_LIBRARIES)
+
+endif(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
diff --git a/lib/maracasVisuLib/include/Modules/FindwxGlade.cmake b/lib/maracasVisuLib/include/Modules/FindwxGlade.cmake
new file mode 100644 (file)
index 0000000..68789b5
--- /dev/null
@@ -0,0 +1,54 @@
+#
+# This module finds if WXGLADE is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  WXGLADE_FOUND        = system has WXGLADE and it should be used
+#  WXGLADE_EXECUTABLE  =  path to the program itself
+
+IF(WIN32)
+IF(NOT UNIX)
+  SET (WXGLADE_POSSIBLE_LIB_PATHS
+    $ENV{WXGLADE}
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxGlade_is1;Inno Setup: App Path]"
+  )
+
+  FIND_PROGRAM(WXGLADE_EXECUTABLE 
+    wxglade
+    ${WXGLADE_POSSIBLE_LIB_PATHS}
+  )
+
+ENDIF(NOT UNIX)
+ENDIF(WIN32)
+
+IF(UNIX)
+
+  #rpm put a /usr/bin/wxglade which link to:
+  #/usr/lib/wxGlade/wxglade.py
+
+#  FIND_PROGRAM(WXGLADE_EXECUTABLE 
+#    wxglade
+#    /usr/bin
+#  )
+
+  FIND_PROGRAM(WXGLADE_EXECUTABLE 
+    wxglade.py
+    /usr/lib/wxGlade
+    /usr/local/lib/wxGlade
+  )
+
+  FIND_PROGRAM(XRC2WXG_EXECUTABLE 
+    xrc2wxg.py
+    /usr/lib/wxGlade
+    /usr/local/lib/wxGlade
+  )
+
+ENDIF(UNIX)  
+
+MARK_AS_ADVANCED(
+  WXGLADE_EXECUTABLE 
+)
+
+IF(WXGLADE_EXECUTABLE)
+    SET(WXGLADE_FOUND 1)
+ENDIF(WXGLADE_EXECUTABLE)
diff --git a/lib/maracasVisuLib/include/Modules/FindwxW.cmake b/lib/maracasVisuLib/include/Modules/FindwxW.cmake
new file mode 100644 (file)
index 0000000..a03d731
--- /dev/null
@@ -0,0 +1,573 @@
+#
+# FindwxW.cmake
+# v1.06 2006-03-27
+# Jerry Fath 2005
+# Based on work by Jorgen Bodde
+#
+# This module finds if wxWindows is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+#
+#  WXWIDGETS_FOUND =     wxWidgets was found
+#  WXWIDGETS_ROOT_DIR =  base wxWidgets directory
+#  WXWIDGETS_LINK_DIRECTORIES = link directories, useful for rpath on Unix
+#  WXWIDGETS_LIBRARIES       = all the wxWindows libraries ( and  linker flags on unix )
+#  WXWIDGETS_CXX_FLAGS        = compiler flags for building wxWindows
+#  WXWIDGETS_EXE_LINKER_FLAGS  = compiler flags for building wxWindows
+#  WXWIDGETS_INCLUDE_DIR    = all include path of wxWindows
+#  WXWIDGETS_DEFINITIONS  = all flags of wxWindows
+#
+#  WXWIDGETS_RELEASE_LIBRARIES       = release wxWindows libraries (Win32 only)
+#  WXWIDGETS_DEBUG_LIBRARIES       = debug wxWindows libraries (Win32 only)
+#  WXWIDGETS_COMMON_LIBRARIES  = libraries common to Release and Debug (Win32 only)
+
+# NOTE: This module REQUIRES that an environment variable named WXWIN
+# be set to the base wxWidgets installation directory.
+# Under Unix, you must also set and environment variable named WXWINCFG
+# to the name of the active build subdirectory (eg buildgtk).  As an alternative
+# to the WXWINCFG environment variable, you can set a sym link in the wxWidgets
+# root directory called wx-config which points to the active build subdirectory.
+#
+
+# These variable should be set before including this module
+#
+# WXWIDGETS_FILE_VERSION (26)
+# WXWIDGETS_VERSION (2.6)
+#
+#
+
+####################### EXAMPLE CMakeLists.txt ###################
+#
+##Required project specific settings
+#PROJECT( myprojectname )
+#SET(PROJECT_SOURCE_FILES  myfile.cpp myfile2.cpp)
+#IF( WIN32)
+#    SET(PROJECT_RC_FILE myresfile.rc)
+#ELSE( WIN32)
+#    SET(PROJECT_RC_FILE "")
+#ENDIF( WIN32)
+#
+##Optional project specific settings
+#SET(PROJECT_DEFINITIONS -D_MYPROJECT_ -D_MYPROJECT2_)
+#SET(PROJECT_INCLUDE_PATH e:/myproject/include e:/myproject2/include)
+#SET(PROJECT_LINK_DIRECTORIES e:/myproject/lib e:/myproject2/lib)
+#SET(PROJECT_LIBRARIES myprojectlib myproject2lib)
+#
+##wxWidgets build related stuff
+#SET(WXW_USE_DEBUG OFF)
+#SET(WXW_USE_UNICODE OFF)
+#SET(WXW_USE_SHARED OFF)
+#SET(WXW_USE_UNIV OFF)
+#SET(WXW_USE_MONO OFF)
+#SET(WXW_FILE_VERSION "26")
+#SET(WXW_VERSION "2.6")
+#
+#INCLUDE (FindwxW)
+#INCLUDE (UsewxW)
+#
+####################### END EXAMPLE CMakeLists.txt ###################
+
+#
+# Set WX_USE vars in CMakeLists if you don't want to default to all off
+#
+SET(WXWIDGETS_USE_DEBUG ${WXW_USE_DEBUG} CACHE BOOL "Use Debug versions of wxWindows libraries")
+SET(WXWIDGETS_USE_UNICODE ${WXW_USE_UNICODE} CACHE BOOL "Use Unicode versions of wxWindows libraries")
+SET(WXWIDGETS_USE_SHARED ${WXW_USE_SHARED} CACHE BOOL "Use shared versions of wxWindows libraries")
+SET(WXWIDGETS_USE_UNIV ${WXW_USE_UNIV} CACHE BOOL "Use Universal versions of wxWindows libraries")
+SET(WXWIDGETS_USE_MONO ${WXW_USE_MONO} CACHE BOOL "Use monolithic versions of wxWindows libraries")
+
+#
+# Style can be non-Win32 even under Windows when using MinGW
+#
+IF(WIN32)
+  SET(WIN32_STYLE_FIND 1)
+ENDIF(WIN32)
+IF(MINGW)
+  SET(WIN32_STYLE_FIND 0)
+  SET(UNIX_STYLE_FIND 1)
+ENDIF(MINGW)
+IF(UNIX)
+  SET(UNIX_STYLE_FIND 1)
+ENDIF(UNIX)
+
+#
+# Versions should be set before this file is included.  If not,
+# default to 2.6
+#
+IF(WXW_FILE_VERSION)
+  SET( WXVERSIONSUFFIX ${WXW_FILE_VERSION})
+ELSE(WXW_FILE_VERSION)
+  SET( WXVERSIONSUFFIX "26")
+ENDIF(WXW_FILE_VERSION)
+
+IF(WXW_VERSION)
+  SET( WXVERSION ${WXW_VERSION})
+ELSE(WXW_VERSION)
+  SET( WXVERSION "2.6")
+ENDIF(WXW_VERSION)
+
+#
+# Find the base wxWidgets install path
+# NOTE: WXWIN must be set
+#
+FIND_PATH( WXWIDGETS_ROOT_DIR
+   wx-config.in
+   $ENV{WXWIN}
+)
+IF(WXWIDGETS_ROOT_DIR STREQUAL "WXWIDGETS_ROOT_DIR-NOTFOUND")
+    MESSAGE( FATAL_ERROR "FATAL_ERROR: wx-config.in NOT found.  Set WXWIN")
+ENDIF(WXWIDGETS_ROOT_DIR STREQUAL "WXWIDGETS_ROOT_DIR-NOTFOUND")
+SET(WXWIDGETS_CONFIG_PATH ${WXWIDGETS_ROOT_DIR})
+
+#
+# Find library path (platform specific)
+#
+IF( WIN32_STYLE_FIND )
+
+    IF( WXWIDGETS_USE_SHARED )
+        SET(WXWIDGETS_LIB_PATH "${WXWIDGETS_ROOT_DIR}/lib/vc_dll" )
+    ELSE( WXWIDGETS_USE_SHARED )
+        SET(WXWIDGETS_LIB_PATH "${WXWIDGETS_ROOT_DIR}/lib/vc_lib" )
+    ENDIF( WXWIDGETS_USE_SHARED )
+    SET( WXWIDGETS_LINK_DIRECTORIES ${WXWIDGETS_LIB_PATH} )
+
+ELSE( WIN32_STYLE_FIND )
+  IF (UNIX_STYLE_FIND) 
+
+    #
+    # Unix uses a config specific directory under the install path
+    # specified in the WXWINCFG environment variable.
+    # If the WXWINCFG variable isn't set, we try a sym link within
+    # the WX root dir called wx-config, or the current PATH
+    #
+    FIND_PROGRAM( WX_WXCONFIG_EXECUTABLE
+                    wx-config
+                    "${WXWIDGETS_ROOT_DIR}/$ENV{WXWINCFG}"
+                    "${WXWIDGETS_ROOT_DIR}/wx-config" )
+    #
+    # Check wether wx-config can be found
+    #
+    IF(NOT EXISTS ${WX_WXCONFIG_EXECUTABLE})    
+      # we really need wx-config...
+      MESSAGE(FATAL_ERROR "FATAL_ERROR: Cannot find wx-config. Set WXWIN and WXWINCFG environment variables.")
+    ENDIF(NOT EXISTS ${WX_WXCONFIG_EXECUTABLE})    
+
+    GET_FILENAME_COMPONENT( WXWIDGETS_CONFIG_PATH
+                            WX_WXCONFIG_EXECUTABLE
+                            PATH )
+
+    SET(WXWIDGETS_LIB_PATH "${WXWIDGETS_CONFIG_PATH}/lib" )
+    SET( WXWIDGETS_LINK_DIRECTORIES ${WXWIDGETS_LIB_PATH} )
+
+  ELSE(UNIX_STYLE_FIND)
+    MESSAGE(FATAL_ERROR "FATAL_ERROR: FindwxWindows.cmake:  Platform unsupported by FindwxW.cmake. It's neither WIN32 nor UNIX")
+  ENDIF(UNIX_STYLE_FIND)
+ENDIF( WIN32_STYLE_FIND )
+
+#
+# Check options against installed libraries
+#
+SET(WX_CONFIG_ARGS "")
+SET( LIBRARYWANT  "${WXWIDGETS_LIB_PATH}/msw" )
+
+IF( WXWIDGETS_USE_UNIV )
+    SET( LIBRARYWANT "${LIBRARYWANT}univ")
+    SET( PFUNIV  "univ" )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --universal=yes")
+ELSE( WXWIDGETS_USE_UNIV )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --universal=no")
+ENDIF( WXWIDGETS_USE_UNIV )
+
+IF( WXWIDGETS_USE_UNICODE )
+    SET( LIBRARYWANT "${LIBRARYWANT}u" )
+    SET( PFUNICODE "u" )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --unicode=yes")
+ELSE( WXWIDGETS_USE_UNICODE )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --unicode=no")
+ENDIF( WXWIDGETS_USE_UNICODE )
+
+IF( WXWIDGETS_USE_DEBUG )
+    SET( PFDEBUG "d" )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --debug=yes")
+ELSE( WXWIDGETS_USE_DEBUG )
+    SET( PFDEBUG "" )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --debug=no")
+ENDIF( WXWIDGETS_USE_DEBUG )
+
+IF( WXWIDGETS_USE_SHARED )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --static=no")
+ELSE( WXWIDGETS_USE_SHARED )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS} --static=yes")
+ENDIF( WXWIDGETS_USE_SHARED )
+
+# Not sure how to check this yet!!!!!
+IF( WXWIDGETS_USE_MONO )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS}")
+ELSE( WXWIDGETS_USE_MONO )
+    SET(WX_CONFIG_ARGS "${WX_CONFIG_ARGS}")
+ENDIF( WXWIDGETS_USE_MONO )
+
+SET(WX_CONFIG_ARGS_LIBS "${WX_CONFIG_ARGS} --libs")
+
+#
+# Platform specific method for testing installed wx Builds
+#
+IF( WIN32_STYLE_FIND )
+
+    #
+    # See if we have both release and debug wx versions
+    #
+    SET ( WX_DEBUGANDRELEASE FALSE )
+    IF( EXISTS "${LIBRARYWANT}/wx/setup.h" )
+        IF( EXISTS "${LIBRARYWANT}d/wx/setup.h" )
+            SET ( WX_DEBUGANDRELEASE TRUE )
+        ENDIF( EXISTS "${LIBRARYWANT}d/wx/setup.h" )
+    ENDIF( EXISTS "${LIBRARYWANT}/wx/setup.h" )
+
+    SET( LIBRARYWANT "${LIBRARYWANT}${PFDEBUG}" )
+    IF( NOT EXISTS "${LIBRARYWANT}/wx/setup.h" )
+        MESSAGE( SEND_ERROR "ERROR: WXWidgets config NOT found ${WX_CONFIG_ARGS}")
+    ENDIF( NOT EXISTS "${LIBRARYWANT}/wx/setup.h" )
+
+ELSE( WIN32_STYLE_FIND )
+
+    EXEC_PROGRAM(${WX_WXCONFIG_EXECUTABLE}
+        ARGS ${WX_CONFIG_ARGS_LIBS}
+        OUTPUT_VARIABLE WXWIDGETS_LIBRARIES
+        RETURN_VALUE BAD_WXCONFIG )
+    IF(BAD_WXCONFIG)
+        MESSAGE( SEND_ERROR "ERROR: WXWidgets config NOT found ${WX_CONFIG_ARGS}")
+    ENDIF(BAD_WXCONFIG)
+
+ENDIF( WIN32_STYLE_FIND )
+
+#
+#  Get compiler flags
+#
+IF( WIN32_STYLE_FIND )
+    # Not used for Windows
+    SET( WXWIDGETS_CXX_FLAGS "" )
+ELSE( WIN32_STYLE_FIND )
+    #
+    # Get CXXFLAGS from wx-config
+    #
+    EXEC_PROGRAM(${WX_WXCONFIG_EXECUTABLE}
+      ARGS "--cxxflags"
+      OUTPUT_VARIABLE WXWIDGETS_CXX_FLAGS
+      RETURN_VALUE BAD_WXCONFIG )
+    IF (BAD_WXCONFIG)
+      MESSAGE( SEND_ERROR "ERROR: wx-config --cxxflags returned an error")
+    ENDIF (BAD_WXCONFIG)
+ENDIF( WIN32_STYLE_FIND )
+
+#
+# Find include directories (platform specific)
+#
+IF( WIN32_STYLE_FIND )
+    #
+    # Set non-build specific include directories
+    #
+    SET ( WX_INCLUDE_PATH ${WXWIDGETS_ROOT_DIR}/include )
+    SET ( WXWIDGETS_INCLUDE_DIR ${WX_INCLUDE_PATH} )
+    SET( WXWIDGETS_INCLUDE_DIR ${WXWIDGETS_INCLUDE_DIR} ${WXWIDGETS_INCLUDE_DIR}/../contrib/include )
+    #
+    # Append the build specific include dir for wx/setup.h:
+    #
+    IF ( EXISTS ${LIBRARYWANT}/wx/setup.h )
+        SET( WX_INCLUDE_LIB_PATH ${LIBRARYWANT})
+        SET( WXWIDGETS_INCLUDE_DIR  ${WXWIDGETS_INCLUDE_DIR}  ${LIBRARYWANT} )
+    ELSE ( EXISTS ${LIBRARYWANT}/wx/setup.h )
+        SET( WX_INCLUDE_LIB_PATH, "")
+        MESSAGE(SEND_ERROR "ERROR: Can't find ${LIBRARYWANT}/wx/setup.h")
+    ENDIF ( EXISTS ${LIBRARYWANT}/wx/setup.h )
+
+ELSE( WIN32_STYLE_FIND )
+
+    # Pull out -I options
+    # evaluate wx-config output to separate include dirs
+    SET(WX_INCLUDE_DIR ${WXWIDGETS_CXX_FLAGS})
+    # extract include dirs (-I)
+    # use regular expression to match wildcard equivalent "-I*<endchar>"
+    # with <endchar> is a space or a semicolon
+    STRING(REGEX MATCHALL "[-][I]([^ ;])+" WX_INCLUDE_DIRS_WITH_PREFIX "${WX_INCLUDE_DIR}" )
+    # remove prefix -I because we need the pure directory
+    IF(WX_INCLUDE_DIRS_WITH_PREFIX)
+      STRING(REGEX REPLACE "[-][I]" ";" WXWIDGETS_INCLUDE_DIR ${WX_INCLUDE_DIRS_WITH_PREFIX} )
+    ENDIF(WX_INCLUDE_DIRS_WITH_PREFIX)
+    # replace space separated string by semicolon separated vector
+    SEPARATE_ARGUMENTS(WXWIDGETS_INCLUDE_DIR)
+    # Remove the -I options from the CXX_FLAGS no need to duplicate
+    STRING(REGEX REPLACE "[-][I]([^ ;])+" "" WXWIDGETS_CXX_FLAGS ${WXWIDGETS_CXX_FLAGS} )
+
+    #
+    # Find XWindows
+    #
+    IF( NOT CYGWIN OR MINGW )
+        INCLUDE( ${CMAKE_ROOT}/Modules/FindX11.cmake )
+        SET( WXWIDGETS_INCLUDE_DIR ${WXWIDGETS_INCLUDE_DIR}  ${X11_INCLUDE_DIR} )
+    ENDIF( NOT CYGWIN OR MINGW )
+ENDIF( WIN32_STYLE_FIND )
+
+#
+# Find library list (platform specific)
+#
+IF( WIN32_STYLE_FIND )
+    #
+    #Misc vars used to build lib names
+    #
+    SET( PFLIBEXT ${CMAKE_STATIC_LIBRARY_SUFFIX} )
+    SET( WXPF "${WXPF}${WXVERSIONSUFFIX}" )
+    SET( PFVERSION ${WXVERSIONSUFFIX} )
+    SET( PFCOMPILER "" )
+
+    #
+    # Build the libraries list
+    #
+    SET( WX_TOKEN_LIBS "" )
+    SET( WX_MULTI_LIBRARIES "" )
+    SET( WX_MONO_LIBRARIES "" )
+    SET( WX_DEBUG_TOKEN "@1" )
+
+    #start filling library string with needed libraries for the choosen configuration.
+    #note we use tokens for debug/release and the debug suffix so we can replace later
+    SET( WXPF "${PFVERSION}${PFUNICODE}${WX_DEBUG_TOKEN}" )
+    SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+        wxbase${WXPF}${PFCOMPILER}${PFLIBEXT}
+        wxbase${WXPF}_net${PFCOMPILER}${PFLIBEXT}
+        wxbase${WXPF}_xml${PFCOMPILER}${PFLIBEXT}
+    )
+
+    SET( WXPF "${PFVERSION}${PFUNICODE}${WX_DEBUG_TOKEN}" )
+    SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+        wxmsw${WXPF}_adv${PFCOMPILER}${PFLIBEXT}
+        wxmsw${WXPF}_core${PFCOMPILER}${PFLIBEXT}
+        wxmsw${WXPF}_html${PFCOMPILER}${PFLIBEXT}
+        wxmsw${WXPF}_xrc${PFCOMPILER}${PFLIBEXT}
+    )
+    IF (WXWIDGETS_USE_MEDIA)
+        SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+            wxmsw${WXPF}_media${PFCOMPILER}${PFLIBEXT}
+        )
+    ENDIF (WXWIDGETS_USE_MEDIA)
+
+    IF( NOT WXWIDGETS_USE_SHARED )
+        SET( WXPF "${PFVERSION}${PFUNICODE}${WX_DEBUG_TOKEN}" )
+        IF (WXWIDGETS_USE_ODBC)
+            SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+                wxbase${WXPF}_odbc${PFCOMPILER}${PFLIBEXT}
+             )
+        ENDIF (WXWIDGETS_USE_ODBC)
+
+        SET( WXPF "${PFVERSION}${PFUNICODE}${WX_DEBUG_TOKEN}" )
+        IF (WXWIDGETS_USE_DBGRID)
+            SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+                wxmsw${WXPF}_dbgrid${PFLIBEXT}
+            )
+        ENDIF (WXWIDGETS_USE_DBGRID)
+        IF (WXWIDGETS_USE_GL)
+            SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+                wxmsw${WXPF}_gl${PFCOMPILER}${PFLIBEXT}
+            )
+        ENDIF (WXWIDGETS_USE_GL)
+    ENDIF( NOT WXWIDGETS_USE_SHARED )
+
+    IF ( WXWIDGETS_USE_UNIV )
+        SET( WXPF "${PFUNIV}${PFVERSION}${PFUNICODE}${WX_DEBUG_TOKEN}" )
+        SET(WX_MULTI_LIBRARIES ${WX_MULTI_LIBRARIES}
+            wxmsw${WXPF}_core${PFCOMPILER}${PFLIBEXT}
+        )
+    ENDIF ( WXWIDGETS_USE_UNIV )
+
+    SET(WX_MONO_LIBRARIES ${WX_MONO_LIBRARIES}
+        wxmsw${WXPF}${PFCOMPILER}${PFLIBEXT}
+    )
+
+    IF ( WXWIDGETS_USE_MONO )
+        SET(WX_TOKEN_LIBS ${WX_TOKEN_LIBS} ${WX_MONO_LIBRARIES})
+    ELSE ( WXWIDGETS_USE_MONO )
+        SET(WX_TOKEN_LIBS ${WX_TOKEN_LIBS} ${WX_MULTI_LIBRARIES})
+    ENDIF ( WXWIDGETS_USE_MONO )
+
+    SET( WXPF "${PFUNICODE}${WX_DEBUG_TOKEN}" )
+    SET(WX_TOKEN_LIBS ${WX_TOKEN_LIBS}
+        wxregex${WXPF}.lib
+    )
+
+    SET( WXPF "${WX_DEBUG_TOKEN}" )
+    SET(WX_TOKEN_LIBS ${WX_TOKEN_LIBS}
+            wxexpat${WXPF}.lib
+            wxpng${WXPF}.lib
+            wxtiff${WXPF}.lib
+            wxjpeg${WXPF}.lib
+            wxzlib${WXPF}.lib
+    )
+
+
+    SET( WXWIDGETS_COMMON_LIBRARIES 
+        comctl32${PFLIBEXT} wsock32${PFLIBEXT} rpcrt4${PFLIBEXT}
+    )
+    #
+    #Build release/debug lists by replacing tokens
+    #
+    SET( WXWIDGETS_RELEASE_LIBRARIES "" )
+    FOREACH(LOOPLIB ${WX_TOKEN_LIBS})
+        SET(WX_TMPLIB ${LOOPLIB})
+        STRING(REGEX REPLACE "[@][1]" "" WX_TMPLIB ${WX_TMPLIB} )
+        SET( WXWIDGETS_RELEASE_LIBRARIES ${WXWIDGETS_RELEASE_LIBRARIES}
+            ${WX_TMPLIB}
+        ) 
+    ENDFOREACH(LOOPLIB ${WX_TOKEN_LIBS})
+    SET( WXWIDGETS_DEBUG_LIBRARIES "" )
+    FOREACH(LOOPLIB ${WX_TOKEN_LIBS})
+        SET(WX_TMPLIB ${LOOPLIB})
+        STRING(REGEX REPLACE "[@][1]" "d" WX_TMPLIB ${WX_TMPLIB} )
+        SET( WXWIDGETS_DEBUG_LIBRARIES ${WXWIDGETS_DEBUG_LIBRARIES}
+            ${WX_TMPLIB}
+        ) 
+    ENDFOREACH(LOOPLIB ${WX_TOKEN_LIBS})
+
+    #
+    # Set full lib list to requested type
+    #
+    IF( WXWIDGETS_USE_DEBUG )
+        SET( WXWIDGETS_LIBRARIES ${WXWIDGETS_COMMON_LIBRARIES}
+            ${WXWIDGETS_DEBUG_LIBRARIES}
+        ) 
+    ELSE( WXWIDGETS_USE_DEBUG )
+        SET( WXWIDGETS_LIBRARIES ${WXWIDGETS_COMMON_LIBRARIES}
+            ${WXWIDGETS_RELEASE_LIBRARIES}
+        ) 
+    ENDIF( WXWIDGETS_USE_DEBUG )
+
+    #Not used under Windows
+    SET( WXWIDGETS_EXE_LINKER_FLAGS "" )
+
+ELSE( WIN32_STYLE_FIND )
+    #
+    # Get Library list from wx-config
+    #
+    # do we need additionial wx GL stuff like GLCanvas ?
+    IF(WXWIDGETS_USE_GL)
+      SET(WX_CONFIG_ARGS_LIBS "${WX_CONFIG_ARGS_LIBS} --gl-libs" )
+    ENDIF(WXWIDGETS_USE_GL)
+      
+    EXEC_PROGRAM(${WX_WXCONFIG_EXECUTABLE}
+      ARGS ${WX_CONFIG_ARGS_LIBS}
+      OUTPUT_VARIABLE WX_CONFIGARGS
+      RETURN_VALUE BAD_WXCONFIG )
+    IF (BAD_WXCONFIG)
+      MESSAGE( SEND_ERROR "ERROR: Specified WXWidgets config NOT found")
+    ENDIF (BAD_WXCONFIG)
+      
+    #Pull lib dirs, linker opts, and libs from wx-config --libs return
+    SET(WXWIDGETS_LINK_DIRECTORIES "")
+    SET(WXWIDGETS_EXE_LINKER_FLAGS "")
+    SET(WXWIDGETS_LIBRARIES "")
+    SEPARATE_ARGUMENTS(WX_CONFIGARGS)
+    FILE( WRITE "${PROJECT_BINARY_DIR}/findwxw-args.log" "WXWIDGETS ARGS\n" )
+    FOREACH(WXARG ${WX_CONFIGARGS})
+      FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw-args.log" "WXARG: ${WXARG}\n" )
+      IF(WXARG MATCHES "^-L")
+        SET(WXWIDGETS_LINK_DIRECTORIES ${WXWIDGETS_LINK_DIRECTORIES} ${WXARG})
+      ELSE(WXARG MATCHES "^-L")
+        IF(WXARG MATCHES "^-l")
+          SET(WXWIDGETS_LIBRARIES "${WXWIDGETS_LIBRARIES} ${WXARG}")
+        ELSE(WXARG MATCHES "^-l")
+          IF(WXARG MATCHES "^-")
+            SET(WXWIDGETS_EXE_LINKER_FLAGS "${WXWIDGETS_EXE_LINKER_FLAGS} ${WXARG}")
+          ELSE(WXARG MATCHES "^-")
+            SET(WXWIDGETS_LIBRARIES "${WXWIDGETS_LIBRARIES} ${WXARG}")
+          ENDIF(WXARG MATCHES "^-")
+        ENDIF(WXARG MATCHES "^-l")
+      ENDIF(WXARG MATCHES "^-L")
+    ENDFOREACH(WXARG ${WX_CONFIGARGS})
+
+    #Separate library names with ;
+    SEPARATE_ARGUMENTS(WXWIDGETS_LIBRARIES)
+
+    # remove prefix -L because we need the pure directory for LINK_DIRECTORIES
+    # replace -L by ; because the separator seems to be lost otherwise (bug or
+    # feature?)
+    SET(WX_LINK_DIRECTORIES_WITH_PREFIX ${WXWIDGETS_LINK_DIRECTORIES})
+    IF(WX_LINK_DIRECTORIES_WITH_PREFIX)
+      STRING(REGEX REPLACE "[-][L]" ";" WXWIDGETS_LINK_DIRECTORIES ${WX_LINK_DIRECTORIES_WITH_PREFIX} )
+      #MESSAGE("DBG  WXWIDGETS_LINK_DIRECTORIES=${WXWIDGETS_LINK_DIRECTORIES}")
+    ENDIF(WX_LINK_DIRECTORIES_WITH_PREFIX)
+    # replace space separated string by semicolon separated vector to make it
+    # work with LINK_DIRECTORIES
+    SEPARATE_ARGUMENTS(WXWIDGETS_LINK_DIRECTORIES)
+
+
+    #
+    # Unix puts all the libs in the WXWIDGETS_LIBRARIES var
+    # We don't know debug/release libs under unix, so we set the
+    # common var to full set as well and leave debug/release sets blank
+    #
+    SET( WXWIDGETS_RELEASE_LIBRARIES "" )
+    SET( WXWIDGETS_DEBUG_LIBRARIES "" )
+    SET(WXWIDGETS_COMMON_LIBRARIES ${WXWIDGETS_LIBRARIES})
+
+ENDIF( WIN32_STYLE_FIND )
+
+
+#
+# Find wx.rc
+#
+SET( WXWIDGETS_RC ${WXWIDGETS_ROOT_DIR}/include/wx/msw/wx.rc )
+IF( NOT WIN32_STYLE_FIND )
+    IF( NOT CYGWIN OR MINGW )
+        SET( WXWIDGETS_RC "" )
+    ENDIF( NOT CYGWIN OR MINGW )
+ENDIF( NOT WIN32_STYLE_FIND )
+
+#
+# Set preprocessor defs
+#
+STRING(TOUPPER ${CMAKE_SYSTEM_NAME} WX_SYSNAME)
+SET( WXWIDGETS_DEFINITIONS ${WXWIDGETS_DEFINITIONS} "-D${WX_SYSNAME}" )
+
+IF(WIN32_STYLE_FIND)
+    SET( WXWIDGETS_DEFINITIONS ${WXWIDGETS_DEFINITIONS} -DWIN32 -D__WXMSW__  )
+ELSE(WIN32_STYLE_FIND)
+    IF( CYGWIN )
+        SET( WXWIDGETS_DEFINITIONS ${WXWIDGETS_DEFINITIONS} -D__GNUWIN32__  -O2 -D_WIN32_IE=0x400 -MMD -Wall  )
+    ENDIF( CYGWIN )
+ENDIF(WIN32_STYLE_FIND)
+
+IF( WXWIDGETS_USE_SHARED )
+    SET( WXWIDGETS_DEFINITIONS ${WXWIDGETS_DEFINITIONS} -DWXUSINGDLL  )
+ENDIF( WXWIDGETS_USE_SHARED )
+
+IF( WXWIDGETS_USE_DEBUG )
+    SET( WXWIDGETS_DEFINITIONS ${WXWIDGETS_DEFINITIONS} -D_DEBUG_  -D__WXDEBUG__  -DWXDEBUG=1 )
+ENDIF( WXWIDGETS_USE_DEBUG )
+
+IF ( WXWIDGETS_USE_UNICODE )
+    SET( WXWIDGETS_DEFINITIONS ${WXWIDGETS_DEFINITIONS} -DwxUSE_UNICODE  )
+ENDIF ( WXWIDGETS_USE_UNICODE )
+
+#
+# Set the WXWIDGETS_FOUND var
+#
+IF(WXWIDGETS_LIBRARIES AND WXWIDGETS_INCLUDE_DIR)
+    SET(WXWIDGETS_FOUND 1)
+ENDIF(WXWIDGETS_LIBRARIES AND WXWIDGETS_INCLUDE_DIR)
+
+#
+# Mark advanced vars
+#
+MARK_AS_ADVANCED(WXWIDGETS_ROOT_DIR)
+
+#
+# Log results
+#
+FILE( WRITE "${PROJECT_BINARY_DIR}/findwxw.log" "FindwxW.cmake version 1.06\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_FOUND: ${WXWIDGETS_FOUND}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_LINK_DIRECTORIES: ${WXWIDGETS_LINK_DIRECTORIES}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_LIBRARIES: ${WXWIDGETS_LIBRARIES}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_RELEASE_LIBRARIES: ${WXWIDGETS_RELEASE_LIBRARIES}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_DEBUG_LIBRARIES: ${WXWIDGETS_DEBUG_LIBRARIES}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_CXX_FLAGS: ${WXWIDGETS_CXX_FLAGS}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_EXE_LINKER_FLAGS: ${WXWIDGETS_EXE_LINKER_FLAGS}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_INCLUDE_DIR: ${WXWIDGETS_INCLUDE_DIR}\n" )
+FILE( APPEND "${PROJECT_BINARY_DIR}/findwxw.log" "WXWIDGETS_DEFINITIONS: ${WXWIDGETS_DEFINITIONS}\n" )
diff --git a/lib/maracasVisuLib/include/Modules/GDCMConfig.cmake b/lib/maracasVisuLib/include/Modules/GDCMConfig.cmake
new file mode 100644 (file)
index 0000000..ed36f84
--- /dev/null
@@ -0,0 +1,113 @@
+#-----------------------------------------------------------------------------
+#
+# GDCMConfig.cmake - CMake configuration file for external projects.
+#
+# This file is configured by GDCM and used by the UseGDCM.cmake 
+# module to load GDCM's settings for an external project.
+
+# Compute the installation prefix from GDCM_DIR.
+SET(GDCM_INSTALL_PREFIX "${GDCM_DIR}")
+GET_FILENAME_COMPONENT(GDCM_INSTALL_PREFIX "${GDCM_INSTALL_PREFIX}" PATH)
+GET_FILENAME_COMPONENT(GDCM_INSTALL_PREFIX "${GDCM_INSTALL_PREFIX}" PATH)
+
+# The GDCM version number.
+SET(GDCM_MAJOR_VERSION "1")
+SET(GDCM_MINOR_VERSION "3")
+SET(GDCM_BUILD_VERSION "1")
+SET(GDCM_VERSION       "1.3.1")
+
+# The libraries.
+SET(GDCM_LIBRARIES "gdcm")
+
+# The list of available languages.
+#SET(GDCM_LANGUAGES "Python")
+
+# The CMake macros dir.
+SET(GDCM_CMAKE_DIR "${GDCM_INSTALL_PREFIX}/lib/gdcm/CMake")
+
+# The configuration options.
+SET(GDCM_BUILD_SHARED_LIBS "")
+#SET(GDCM_USE_HTML_HELP "")
+
+# The C and C++ flags added to the cmake-configured flags.
+SET(GDCM_REQUIRED_C_FLAGS 
+  "")
+SET(GDCM_REQUIRED_CXX_FLAGS 
+  "")
+SET(GDCM_REQUIRED_EXE_LINKER_FLAGS 
+  "")
+SET(GDCM_REQUIRED_SHARED_LINKER_FLAGS 
+  "")
+SET(GDCM_REQUIRED_MODULE_LINKER_FLAGS 
+  "")
+
+# The "use" file.
+SET(GDCM_USE_FILE "${GDCM_INSTALL_PREFIX}/lib/gdcm/UseGDCM.cmake")
+
+# The build settings file.
+SET(GDCM_BUILD_SETTINGS_FILE "${GDCM_INSTALL_PREFIX}/lib/gdcm/GDCMBuildSettings.cmake")
+
+# The library directories.
+SET(GDCM_LIBRARY_DIRS "${GDCM_INSTALL_PREFIX}/lib/gdcm")
+
+# The runtime directories.
+# Note that if GDCM_CONFIGURATION_TYPES is set (see below) then
+# these directories will be the parent directories under which there will
+# be a directory of runtime binaries for each configuration type.
+SET(GDCM_RUNTIME_DIRS "${GDCM_INSTALL_PREFIX}/bin")
+
+# The include directories.
+SET(GDCM_INCLUDE_DIRS "${GDCM_INSTALL_PREFIX}/include/gdcm")
+
+# The library dependencies file.
+IF(NOT GDCM_NO_LIBRARY_DEPENDS)
+  INCLUDE("${GDCM_INSTALL_PREFIX}/lib/gdcm/GDCMLibraryDepends.cmake")
+ENDIF(NOT GDCM_NO_LIBRARY_DEPENDS)
+
+# The data dir.
+SET(GDCM_DATA_DIR "${GDCM_INSTALL_PREFIX}/share/gdcm/Data")
+
+# The examples dir.
+SET(GDCM_EXAMPLES_DIR "${GDCM_INSTALL_PREFIX}/share/gdcm/Examples")
+
+# The resources dir.
+SET(GDCM_RESOURCES_DIR "")
+SET(GDCM_RESOURCE_MAJOR_VERSION 
+  "")
+SET(GDCM_RESOURCE_MINOR_VERSION 
+  "")
+SET(GDCM_RESOURCE_APPLICATION_NAME 
+  "")
+SET(GDCM_RESOURCE_FILE_NAME 
+  "")
+SET(GDCM_RESOURCE_COMPANY_NAME 
+  "")
+
+# The Tcl/Tk options.
+#SET(GDCM_TCL_PACKAGE_INDEX_DIR 
+#  "")
+
+# The Python options.
+SET(GDCM_PYTHON_MODULE_DIR
+  "")
+
+# The Doxygen options.
+SET(GDCM_DOXYGEN_DIR "${GDCM_INSTALL_PREFIX}")
+
+# The VTK options.
+SET(GDCM_VTK_DIR "C:/Creatis/VTKBin")
+
+# An install tree always provides one build configuration.
+# A build tree may provide either one or multiple build
+# configurations depending on the CMake generator used. Since
+# this project can be used either from a build tree or an install tree it
+# is useful for outside projects to know the configurations available.
+# If this GDCMConfig.cmake is in an install tree
+# GDCM_CONFIGURATION_TYPES will be empty and GDCM_BUILD_TYPE
+# will be set to the value of CMAKE_BUILD_TYPE used to build
+# GDCM. If GDCMConfig.cmake is in a build tree
+# then GDCM_CONFIGURATION_TYPES and GDCM_BUILD_TYPE will
+# have values matching CMAKE_CONFIGURATION_TYPES and CMAKE_BUILD_TYPE
+# for that build tree (only one will ever be set).
+SET(GDCM_CONFIGURATION_TYPES )
+SET(GDCM_BUILD_TYPE Release)
diff --git a/lib/maracasVisuLib/include/Modules/MARACAS_Find_GDCM.cmake b/lib/maracasVisuLib/include/Modules/MARACAS_Find_GDCM.cmake
new file mode 100644 (file)
index 0000000..f2fdb7d
--- /dev/null
@@ -0,0 +1,16 @@
+#Interface02Wx need gdcm
+OPTION(GDCM "GDCM." ON )
+IF(GDCM)
+  FIND_PACKAGE(GDCM)
+# 4 Juin 2007
+#  INCLUDE_DIRECTORIES(${GDCM_INCLUDE_DIR})
+  IF(GDCM_FOUND)
+    INCLUDE(${GDCM_USE_FILE})
+    set(GDCM_LIBRARIES 
+       ${GDCM_LIBRARIES} 
+       " vtkgdcm" 
+    )
+
+  ENDIF(GDCM_FOUND)
+
+ENDIF(GDCM)
diff --git a/lib/maracasVisuLib/include/Modules/MARACAS_Find_ITK.cmake b/lib/maracasVisuLib/include/Modules/MARACAS_Find_ITK.cmake
new file mode 100644 (file)
index 0000000..3d1d4c6
--- /dev/null
@@ -0,0 +1,71 @@
+#-----------------------------------------------------------------------------
+OPTION(USE_ITK "Build ITK-based " ON)
+IF(USE_ITK)
+  # Search ITK
+  FIND_PACKAGE(ITK)
+  # If itk found
+  IF(ITK_FOUND)
+    INCLUDE(${ITK_USE_FILE})
+#    ADD_DEF( _USE_ITK_ )
+    SET(MARACAS_ITK_LIBRARIES
+      ${MARACAS_ITK_LIBRARIES}
+      ITKCommon 
+      ITKBasicFilters
+      ITKIO
+      ITKNumerics
+      ITKAlgorithms
+      #      itkvnl
+      )  
+    MARK_AS_ADVANCED(ITK_DIR)
+
+    # images compilation option 
+    OPTION ( itk_IMAGE_DIM_2 "itk : Compile 2D images" ON)
+    OPTION ( itk_IMAGE_DIM_3 "itk : Compile 3D images" ON)
+    OPTION ( itk_IMAGE_TYPE_UCHAR "itk : Compile unsigned char images" ON)
+    OPTION ( itk_IMAGE_TYPE_SHORT "itk : Compile short images" ON)
+    OPTION ( itk_IMAGE_TYPE_USHORT "itk : Compile unsigned short images" ON)
+    OPTION ( itk_IMAGE_TYPE_INT "itk : Compile int images" ON)
+    OPTION ( itk_IMAGE_TYPE_FLOAT "itk : Compile float images" ON)
+    
+#    IF ( itk_IMAGE_DIM_2 ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_DIM_2 )
+#    ENDIF ( itk_IMAGE_DIM_2 )
+    
+#    IF ( itk_IMAGE_DIM_3 ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_DIM_3 )
+#    ENDIF ( itk_IMAGE_DIM_3 )
+    
+#    IF ( itk_IMAGE_TYPE_UCHAR ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_TYPE_UCHAR )
+#    ENDIF ( itk_IMAGE_TYPE_UCHAR )
+    
+#    IF ( itk_IMAGE_TYPE_SHORT ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_TYPE_SHORT )
+#    ENDIF ( itk_IMAGE_TYPE_SHORT )
+    
+#    IF ( itk_IMAGE_TYPE_USHORT ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_TYPE_USHORT )
+#    ENDIF ( itk_IMAGE_TYPE_USHORT )
+    
+#    IF ( itk_IMAGE_TYPE_INT ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_TYPE_INT )
+#    ENDIF ( itk_IMAGE_TYPE_INT )
+    
+#    IF ( itk_IMAGE_TYPE_FLOAT ) 
+#      ADD_DEF( BBTK_ITK_IMAGE_TYPE_FLOAT )
+#    ENDIF ( itk_IMAGE_TYPE_FLOAT )
+    
+
+  ELSE(ITK_FOUND)
+    MESSAGE(FATAL_ERROR
+           "Cannot build MARACAS without ITK.  Please set ITK_DIR.")
+  ENDIF(ITK_FOUND)
+
+
+
+
+
+
+ENDIF(USE_ITK)
+MARK_AS_ADVANCED(USE_ITK)
+#-----------------------------------------------------------------------------
diff --git a/lib/maracasVisuLib/include/Modules/MARACAS_Find_LIBIDO.cmake b/lib/maracasVisuLib/include/Modules/MARACAS_Find_LIBIDO.cmake
new file mode 100644 (file)
index 0000000..4ffc57e
--- /dev/null
@@ -0,0 +1,4 @@
+
+FIND_PATH( libIdo_DIR libidobin $ENV{LIBIDO_PATH} )
+FIND_PACKAGE(libIdo)
+INCLUDE_DIRECTORIES(${LIBIDO_INCLUDE_PATH})
\ No newline at end of file
diff --git a/lib/maracasVisuLib/include/Modules/MARACAS_Find_VTK.cmake b/lib/maracasVisuLib/include/Modules/MARACAS_Find_VTK.cmake
new file mode 100644 (file)
index 0000000..0cf3c62
--- /dev/null
@@ -0,0 +1,16 @@
+FIND_PATH( VTK_DIR vtkbin $ENV{VTK_PATH} )
+
+FIND_PACKAGE(VTK)
+IF(VTK_FOUND)
+  INCLUDE(${VTK_USE_FILE})       
+  INCLUDE_DIRECTORIES(${VTK_INCLUDE_DIRS})
+   set ( maracas_VTK_LIBRARIES 
+             vtkCommon  vtkFiltering  vtkGraphics   vtkIO   vtkImaging  
+            vtkRendering  vtkHybrid  vtkWidgets  vtkVolumeRendering
+   )
+
+ELSE(VTK_FOUND)
+  MESSAGE(FATAL_ERROR
+          "Cannot build MARACAS without VTK.  Please set VTK_DIR.")
+ENDIF(VTK_FOUND)
+
diff --git a/lib/maracasVisuLib/include/Modules/MARACAS_Find_WXWIDGETS.cmake b/lib/maracasVisuLib/include/Modules/MARACAS_Find_WXWIDGETS.cmake
new file mode 100644 (file)
index 0000000..9ab329a
--- /dev/null
@@ -0,0 +1,51 @@
+
+
+IF(WIN32)
+
+  #  WXWINDOWS_LIBRARY         = full path to the wxWindows library and linker flags on unix  
+  #  CMAKE_WX_CXX_FLAGS        = compiler flags for building wxWindows 
+  #  WXWINDOWS_INCLUDE_PATH    = include path of wxWindows
+  SET(WXWINDOWS_USE_GL 1)   #wxWidgets build related stuff
+  SET(WXW_USE_DEBUG ON )
+  SET(WXW_USE_UNICODE OFF )
+  SET(WXW_USE_SHARED ON )
+  SET(WXW_USE_UNIV OFF )
+  SET(WXW_USE_MONO OFF )
+  SET(WXW_FILE_VERSION "28" )
+  SET(WXW_VERSION "2.8" )
+
+  #CMake Options
+  SET(CMAKE_VERBOSE_MAKEFILE TRUE)
+
+  INCLUDE (FindwxW)
+  #
+  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}${WXWIDGETS_CXX_FLAGS}")
+  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}${WXWIDGETS_EXE_LINKER_FLAGS}")
+  ADD_DEFINITIONS( ${WXWIDGETS_DEFINITIONS}  ) 
+  #
+  INCLUDE_DIRECTORIES(${WXWIDGETS_INCLUDE_DIR})
+  LINK_DIRECTORIES( ${WXWIDGETS_LINK_DIRECTORIES} )
+  SET(maracas_WXWIDGETS_LIBRARIES
+    ${WXWIDGETS_LIBRARIES}     
+    wxmsw28d_aui
+  )
+
+
+ENDIF(WIN32)
+IF(UNIX)
+  # GTK2
+  FIND_PACKAGE(GTK2)
+  INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS})
+  LINK_DIRECTORIES(${GTK2_LIBRARY_DIRS})
+#  LINK_LIBRARIES(${GTK2_LIBRARIES})
+  # WX
+  SET(wxWidgets_USE_LIBS base core gl)
+  FIND_PACKAGE( wxWidgets REQUIRED) 
+  INCLUDE( ${wxWidgets_USE_FILE} )
+  SET(maracas_WXWIDGETS_LIBRARIES
+    ${wxWidgets_LIBRARIES}
+    ${GTK2_LIBRARIES}
+   )
+
+ENDIF(UNIX)
+
diff --git a/lib/maracasVisuLib/include/Modules/UseGDCM.cmake b/lib/maracasVisuLib/include/Modules/UseGDCM.cmake
new file mode 100644 (file)
index 0000000..c673e9c
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# This module is provided as GDCM_USE_FILE by GDCMConfig.cmake.
+# It can be INCLUDEd in a project to load the needed compiler and linker
+# settings to use GDCM:
+#   FIND_PACKAGE(GDCM REQUIRED)
+#   INCLUDE(${GDCM_USE_FILE})
+#
+
+IF(NOT GDCM_USE_FILE_INCLUDED)
+  SET(GDCM_USE_FILE_INCLUDED 1)
+
+  # Load the compiler settings used for GDCM.
+  IF(GDCM_BUILD_SETTINGS_FILE)
+    INCLUDE(${CMAKE_ROOT}/Modules/CMakeImportBuildSettings.cmake)
+    CMAKE_IMPORT_BUILD_SETTINGS(${GDCM_BUILD_SETTINGS_FILE})
+  ENDIF(GDCM_BUILD_SETTINGS_FILE)
+
+  # Add compiler flags needed to use GDCM.
+  SET(CMAKE_C_FLAGS
+    "${CMAKE_C_FLAGS} ${GDCM_REQUIRED_C_FLAGS}")
+  SET(CMAKE_CXX_FLAGS
+    "${CMAKE_CXX_FLAGS} ${GDCM_REQUIRED_CXX_FLAGS}")
+  SET(CMAKE_EXE_LINKER_FLAGS
+    "${CMAKE_EXE_LINKER_FLAGS} ${GDCM_REQUIRED_EXE_LINKER_FLAGS}")
+  SET(CMAKE_SHARED_LINKER_FLAGS
+    "${CMAKE_SHARED_LINKER_FLAGS} ${GDCM_REQUIRED_SHARED_LINKER_FLAGS}")
+  SET(CMAKE_MODULE_LINKER_FLAGS
+    "${CMAKE_MODULE_LINKER_FLAGS} ${GDCM_REQUIRED_MODULE_LINKER_FLAGS}")
+
+  # Add include directories needed to use GDCM.
+  INCLUDE_DIRECTORIES( BEFORE ${GDCM_INCLUDE_DIRS})
+
+  # Add link directories needed to use GDCM.
+  LINK_DIRECTORIES(${GDCM_LIBRARY_DIRS})
+
+  # Add cmake module path.
+  SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${GDCM_CMAKE_DIR}")
+
+  # Use VTK.
+  IF(GDCM_VTK)
+    SET(VTK_DIR ${GDCM_VTK_DIR})
+    FIND_PACKAGE(VTK)
+    IF(VTK_FOUND)
+      INCLUDE(${VTK_USE_FILE})
+      set(GDCM_LIBRARIES  ${GDCM_LIBRARIES}  " vtkgdcm"  )
+    ELSE(VTK_FOUND)
+      MESSAGE("VTK not found in GDCM_VTK_DIR=\"${GDCM_VTK_DIR}\".")
+    ENDIF(VTK_FOUND)
+  ENDIF(GDCM_VTK)
+
+ENDIF(NOT GDCM_USE_FILE_INCLUDED)
diff --git a/lib/maracasVisuLib/include/mathdefs.h b/lib/maracasVisuLib/include/mathdefs.h
new file mode 100644 (file)
index 0000000..47c9f5f
--- /dev/null
@@ -0,0 +1,70 @@
+////////////////////////////////////////////////////////////////////////////////
+// matrix.h
+// Creation : 20/01/2000
+// Author   : Leonardo FLOREZ VALENCIA
+//               l-florez@uniandes.edu.co
+//               lflorez@creatis.insa-lyon.fr
+// Copyright (C) 2000-2002 Leonardo FLOREZ VALENCIA
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GTMLIB__MATH__MATHDEFS__HXX
+#define GTMLIB__MATH__MATHDEFS__HXX
+
+#include <math.h>
+
+/// PI constant.
+#define GTM_PI  3.14159265359
+/// 2 * PI constant.
+#define GTM_PI2 6.28318530717
+/// ln1 constant.
+#define GTM_NE  2.71828182846
+
+/// Minimum.
+#define GTM_MIN( a, b ) ( ( ( a ) < ( b ) )? ( a ): ( b ) )
+/// Maximum.
+#define GTM_MAX( a, b ) ( ( ( a ) > ( b ) )? ( a ): ( b ) )
+#define GTM_POW2( a ) ( ( a ) * ( a ) )
+
+// Useful typedefs.
+typedef unsigned char  uchar;
+typedef unsigned short ushort;
+typedef unsigned int   uint;
+
+namespace gtm
+{
+
+    /** Rounds a double number.
+     *
+     *  @param n Number.
+     */
+    inline
+    double round( double n )
+    {
+       double tmp;
+       tmp = floor( n );
+       if ( ( n - tmp ) < 0.5 )
+           return( tmp );
+       else
+           return( ceil( n ) );
+
+    }
+
+}
+
+#endif // GTMLIB__MATH__MATHDEFS__HXX
+
+// EOF - mathdefs.h
diff --git a/lib/maracasVisuLib/include/matrix.h b/lib/maracasVisuLib/include/matrix.h
new file mode 100644 (file)
index 0000000..9689f59
--- /dev/null
@@ -0,0 +1,431 @@
+////////////////////////////////////////////////////////////////////////////////
+// matrix.h
+// Creation : 19/03/2000
+// Author   : Leonardo FLOREZ VALENCIA
+//               l-florez@uniandes.edu.co
+//               lflorez@creatis.insa-lyon.fr
+// Copyright (C) 2000-2002 Leonardo FLOREZ VALENCIA
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GTMLIB__MATH__MATRIX__HXX
+#define GTMLIB__MATH__MATRIX__HXX
+
+#include "mathdefs.h"
+#include "vmfuncs.h"
+#include "vector.h"
+
+namespace gtm
+{
+    /** TMatrix class.
+     *
+     *  This class defines a C++ template to use mathematical matrices of NxM.
+     *  @see TVector
+     */
+    template< class T >
+    class TMatrix
+    {
+    public:
+       
+       /** Constructors.
+        *
+        *  @param N Columns.
+        *  @param M Rows.
+        *  @param data Initial data.
+        *  @param r Copy object (matrix or vector).
+        *  @param block Memory block.
+        */
+       //@{
+       /// Default constructor.
+       TMatrix( uint N = 3, uint M = 3, T data = ( T )0 );
+       /// Copy constructor.
+       TMatrix( const TMatrix< T >& r );
+       /// ANSI casting constructor.
+       TMatrix( T** block, uint N, uint M );
+       //@}
+
+       /// Destructor.
+       ~TMatrix( ) {
+           MatrixFreeMemory< T >( _matrix, _N );
+       };
+
+       /** Assignation operators.
+        *
+        *  @param r Right object (matrix, vector or scalar).
+        */
+       //@{
+       /// Natural assignation.
+       TMatrix< T >& operator=( const TMatrix< T >& r );
+       /// Vector assignation.
+       TMatrix< T >& operator=( TVector< T >& r );
+       /// Scalar assignation.
+       TMatrix< T >& operator=( T r );
+       //@}
+       
+       /** Comparation operators.
+        *
+        *  @param Right matrix.
+        */
+       //@{
+       /// Equality.
+       bool operator==( const TMatrix< T >& r );
+       /// Inequality.
+       bool operator!=( const TMatrix< T >& r );
+       //@}
+
+       /// Reference operator.
+       T& operator()( uint i, uint j ) {
+           return( _matrix[ i ][ j ] );
+       };
+       /// Columns
+       uint GetN( ) {
+           return( _N );
+       };
+       /// Rows
+       uint GetM( ) {
+           return( _M );
+       };
+       /// Returns the ANSI (C/C++) reference.
+       T** GetAnsiRef( ) {
+           return( _matrix );
+       };
+       /// Determinant.
+       T Det( ) {
+           return( MatrixDeterminant< T >( _matrix, _N ) );
+       };
+       /// Loads identity.
+       void LoadIdentity( ) {
+           MatrixLoadIdentity< T >( _matrix, GTM_MIN( _N, _M ) );
+       };
+
+       /** Binary operators.
+        *
+        *  @param r Right objet (matrix, vector or scalar).
+        */
+       //@{
+       /// Addition.
+       TMatrix< T > operator+( const TMatrix< T >& r );
+       /// Substraction.
+       TMatrix< T > operator-( const TMatrix< T >& r );
+       /// Product.
+       TMatrix< T > operator*( const TMatrix< T >& r );
+       /// Product (vector).
+       TMatrix< T > operator*( TVector< T >& r );
+       /// Scalar product
+       TMatrix< T > operator*( T r );
+       //@}
+
+       /** Self-assignation binary operators.
+        *
+        *  @param r Right object (matrix, vector or scalar).
+        */
+       //@{
+       /// Addition.
+       TMatrix< T >& operator+=( const TMatrix< T >& r ) {
+           *this = *this + r;
+           return( *this );
+       };
+       /// Substraction.
+       TMatrix< T >& operator-=( const TMatrix< T >& r ) {
+           *this = *this - r;
+           return( *this );
+       };
+       /// Product.
+       TMatrix< T >& operator*=( const TMatrix< T >& r ) {
+           *this = *this * r;
+           return( *this );
+       };
+       /// Product (vector).
+       TMatrix< T >& operator*=( TVector< T >& r ) {
+           *this = *this * r;
+           return( *this );
+       };
+       /// Scalar product.
+       TMatrix< T >& operator*=( T r ) {
+           *this = *this * r;
+           return( *this );
+       };
+       //@}
+
+       /** Unary operators.
+        */
+       //@{
+       /// Additive inverse.
+       TMatrix< T > operator-( );
+       /// Matrix inverse.
+       TMatrix< T > operator!( );
+       /// Matrix transpose.
+       TMatrix< T > operator~( );
+       //@}
+
+    private:
+
+       /// Matrix' internal state.
+       //@{
+       /// Memory block.
+       T** _matrix;
+       /// Columns.
+       uint _N;
+       /// Rows.
+       uint _M;
+       //@}
+
+    };
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T >& TVector< T >::operator=( TMatrix< T >& r )
+    {
+       uint i, j, k, min;
+
+       // This min calc. avoids to reserve temporary memory, so, be careful.
+       min = GTM_MIN( r.GetN( ) * r.GetM( ), _N );
+       _type = ( r.GetN( ) == 1 )? COL_VECTOR: ROW_VECTOR;
+       for( i = 0, k = 0; i < r.GetN( ) && k < min; i++ )
+           for( j = 0; j < r.GetM( ) && k < min; _vector[ k++ ] = r( i, j ), j++ );
+       return( *this );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TVector< T >::operator*( TMatrix< T >& r )
+    {
+       TMatrix< T > m = *this;
+       return( m * r );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T >::TMatrix( uint N, uint M, T data )
+    {
+       _N = N;
+       _M = M;
+       _matrix = MatrixAllocateMemory< T >( _N, _M );
+       MatrixAssignScalar< T >( _matrix, data, _N, _M );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T >::TMatrix( const TMatrix< T >& r )
+    {
+       _N = r._N;
+       _M = r._M;
+       _matrix = MatrixCopyMemory< T >( r._matrix, _N, _M );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T >::TMatrix( T** block, uint N, uint M )
+    {
+       _N = N;
+       _M = M;
+       _matrix = MatrixCopyMemory< T >( block, N, M );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T >& TMatrix< T >::operator=( const TMatrix< T >& r )
+    {
+       if( _N != r._N || _M != r._M ) {
+
+           MatrixFreeMemory< T >( _matrix, _N );
+           _N = r._N;
+           _M = r._M;
+           _matrix = MatrixCopyMemory< T >( r._matrix, _N, _M );
+
+       } else MatrixAssignMemory< T >( _matrix, r._matrix, _N, _M );
+       return( *this );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T >& TMatrix< T >::operator=( TVector< T >& r )
+    {
+       uint i;
+       uint n = r.GetN( );
+       bool column = ( r.GetType( ) == COL_VECTOR );
+
+       MatrixFreeMemory< T >( _matrix, _N );
+       _N = ( column )? 1: n;
+       _M = ( column )? n: 1;
+       _matrix = MatrixAllocateMemory< T >( _N, _M );
+       for( i = 0; i < n; _matrix[ ( column )? 0: i ][ ( column )? i: 0 ] = r( i ), i++ );
+       return( *this );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T >& TMatrix< T >::operator=( T r )
+    {
+       MatrixAssignScalar< T >( _matrix, r, _N, _M );
+       return( *this );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    bool TMatrix< T >::operator==( const TMatrix< T >& r )
+    {
+       uint i, j;
+       bool ret;
+
+       for(
+           i = 0, ret = ( _N == r._N && _M == r._M );
+           i < _N && ret;
+           i++
+           ) for(
+               j = 0;
+               j < _M && ret;
+               ret &= ( _matrix[ i ][ j ] == r._matrix[ i ][ j ] ), j++
+               );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    bool TMatrix< T >::operator!=( const TMatrix< T >& r )
+    {
+       uint i, j;
+       bool ret;
+
+       for(
+           i = 0, ret = ( _N != r._N || _M != r._M );
+           i < _N && !ret;
+           i++
+           ) for(
+               j = 0;
+               j < _M && !ret;
+               ret |= ( _matrix[ i ][ j ] != r._matrix[ i ][ j ] ), j++
+               );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator+( const TMatrix< T >& r )
+    {
+       TMatrix< T > ret( _N, _M );
+
+       MatrixAdd< T >(
+           ret._matrix,
+           _matrix,
+           r._matrix,
+           GTM_MIN( _N, r._N ),
+           GTM_MIN( _M, r._M )
+           );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator-( const TMatrix< T >& r )
+    {
+       TMatrix< T > ret( _N, _M );
+  
+       MatrixSubtract< T >(
+           ret._matrix,
+           _matrix,
+           r._matrix,
+           GTM_MIN( _N, r._N ),
+           GTM_MIN( _M, r._M )
+           );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator*( const TMatrix< T >& r )
+    {
+       TMatrix< T > ret( r._N, _M );
+
+       MatrixProduct< T >( ret._matrix, _matrix, r._matrix, _N, _M, r._N );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator*( T r )
+    {
+       TMatrix< T > ret( _N, _M );
+
+       MatrixScalarProduct< T >( ret._matrix, _matrix, r, _N, _M );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator*( TVector< T >& r )
+    {
+       TMatrix< T > m;
+       m = r;
+       return( *this * m );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator-( )
+    {
+       TMatrix< T > ret( _N, _M );
+       uint i, j;
+  
+       for( i = 0; i < _N; i++ )
+           for( j = 0; j < _M; ret._matrix[ i ][ j ] = ( T )0 - _matrix[ i ][ j ], j++ );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator!( )
+    {
+       TMatrix< T > ret( _N, _N );
+
+       if( _N <= 4 ) MatrixInverseAdjoint< T >( ret._matrix, _matrix, _N );
+       else          MatrixInverseGauss< T >( ret._matrix, _matrix, _N );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TMatrix< T > TMatrix< T >::operator~( )
+    {
+       TMatrix< T > ret( _M, _N );
+
+       MatrixTranspose< T >( ret._matrix, _matrix, _N, _M );
+       return( ret );
+
+    }
+
+} // namespace
+
+#endif // GTMLIB__MATH__MATRIX__HXX
+
+// EOF - matrix.h
diff --git a/lib/maracasVisuLib/include/vector.h b/lib/maracasVisuLib/include/vector.h
new file mode 100644 (file)
index 0000000..edadd11
--- /dev/null
@@ -0,0 +1,382 @@
+////////////////////////////////////////////////////////////////////////////////
+// vector.h
+// Creation : 24/02/2000
+// Author   : Leonardo FLOREZ VALENCIA
+//               l-florez@uniandes.edu.co
+//               lflorez@creatis.insa-lyon.fr
+// Copyright (C) 2000-2002 Leonardo FLOREZ VALENCIA
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GTMLIB__MATH__VECTOR__HXX
+#define GTMLIB__MATH__VECTOR__HXX
+
+#include "mathdefs.h"
+#include "vmfuncs.h"
+
+/// Vector type IDs
+//@{
+#define ROW_VECTOR 0x01
+#define COL_VECTOR 0x02
+//@}
+
+namespace gtm
+{
+    template< class T >
+    class TMatrix;
+
+    /** TVector class.
+     *
+     *  This class defines a C++ template to use mathematical vectors
+     *  in a N space.
+     *  @see TMatrix
+     */
+    template< class T >
+    class TVector
+    {
+    public:
+
+       /** Contructors.
+        *
+        *  @param N Cardinality.
+        *  @param data Initial data.
+        *  @param type Vector type (ROW_VECTOR/COL_VECTOR).
+        *  @param r Right object (vector or matrix).
+        *  @param block ANSI array.
+        *  @param copy Make a copy of given array?
+        */
+       //@{
+       /// Default constructor.
+       TVector( uint N = 3, T data = ( T )0, int type = COL_VECTOR  );
+       /// Copy constructor.
+       TVector( const TVector< T >& r );
+       /// Use this to treat an ANSI array as a TVector.
+       TVector( T* block, uint N, bool copy = true, int type = COL_VECTOR );
+       //@}
+
+       /// Destructor.
+       ~TVector( ) {
+           if( _myMemory ) VectorFreeMemory< T >( _vector );
+       };
+
+       /// Size change
+       void SetN( uint N );
+
+       /** Assignation operators.
+        *
+        *  @param r Right object (vector or matrix).
+        */
+       //@{
+       /// Vector assignation.
+       TVector< T >& operator=( const TVector< T >& r );
+       /// Matrix assignation (defined in class TMatrix).
+       TVector< T >& operator=( TMatrix< T >& r );
+       /// ANSI assignation (r size must be, at least, N).
+       TVector< T >& operator=( T* r ) {
+           VectorAssignMemory< T >( _vector, r, _N );
+           return( *this );
+       };
+       /// Scalar assignation.
+       TVector< T >& operator=( T r ) {
+           VectorAssignScalar< T >( _vector, r, _N );
+           return( *this );
+       };
+       //@}
+
+       /** Comparation operators.
+        *
+        *  @param r Right object.
+        */
+       //@{
+       /// Equality.
+       bool operator==( const TVector< T >& r );
+       /// Inequality.
+       bool operator!=( const TVector< T >& r );
+       //@}
+
+       /// Reference operator.
+       T& operator()( uint i ) {
+           return( _vector[ i ] );
+       };
+       /// ANSI (C/C++ array) reference.
+       T* GetAnsiRef( ) {
+           return( _vector );
+       };
+       /// Vector's cardinality.
+       uint GetN( ) {
+           return( _N );
+       };
+       /// Vector's type (ROW_VECTOR/COL_VECTOR).
+       int GetType( ) {
+           return( _type );
+       };
+       /// Mathematical norm (L2).
+       T GetNorm( ) {
+           return( VectorNorm< T >( _vector, _N ) );
+       };
+       /// Normalizes the vector.
+       void Normalize( ) {
+           VectorNormalize< T >( _vector, _vector, _N );
+       };
+       /// Dot product.
+       T Dot( const TVector< T >& r ) {
+           return( VectorDotProduct< T >( _vector, r._vector, GTM_MIN( _N, r._N ) ) );
+       };
+
+       /** Binary operators.
+        *
+        *  @param r Right object (vector, matrix or scalar).
+        */
+       //@{
+       /// Addition.
+       TVector< T > operator+( const TVector< T >& r );
+       /// Substraction.
+       TVector< T > operator-( const TVector< T >& r );
+       /// Cross product.
+       TVector< T > operator*( const TVector< T >& r );
+       /// Matrix product (defined in class TMatrix).
+       TMatrix< T > operator*( TMatrix< T >& r );
+       /// Scalar product.
+       TVector< T > operator*( T r );
+       //@}
+
+       /** Self-assignation binary operators.
+        *
+        *  @param r Right object (vector, matrix or scalar).
+        */
+       //@{
+       /// Addition.
+       TVector< T >& operator+=( const TVector< T >& r ) {
+           *this = *this + r;
+           return( *this );
+       };
+       /// Substraction.
+       TVector< T >& operator-=( const TVector< T >& r ) {
+           *this = *this - r;
+           return( *this );
+       };
+       /// Cross product.
+       TVector< T >& operator*=( const TVector< T >& r ) {
+           *this = *this * r;
+           return( *this );
+       };
+       /// Scalar product.
+       TVector< T >& operator*=( T r ) {
+           *this = *this * r;
+           return( *this );
+       };
+       //@}
+
+       /// Unary operators.
+       //@{
+       /// Additive inverse.
+       TVector< T > operator-( );
+       /// Normalized vector.
+       TVector< T > operator!( );
+       /// Transposed vector.
+       TVector< T > operator~( );
+       //@}
+
+    private:
+
+       /// Vector's internal state.
+       //@{
+       /// Memory block.
+       T* _vector;
+       /// Cardinality.
+       uint _N;
+       /// Type (ROW_VECTOR/COL_VECTOR).
+       int _type;
+       /// Have I created _vector?
+       bool _myMemory;
+       //@}
+
+    };
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T >::TVector( uint N, T data, int type )
+    {
+       _N        = N;
+       _type     = type;
+       _vector   = VectorAllocateMemory< T >( _N );
+       _myMemory = true;
+       VectorAssignScalar< T >( _vector, data, _N );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T >::TVector( const TVector< T >& r )
+    {
+       _N        = r._N;
+       _type     = r._type;
+       _myMemory = true;
+       _vector   = VectorCopyMemory< T >( r._vector, _N );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T >::TVector( T* block, uint N, bool copy, int type )
+    {
+       _N        = N;
+       _type     = type;
+       _myMemory = copy;
+       _vector   = ( copy )? VectorCopyMemory< T >( block, _N ): block;
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    void TVector< T >::SetN( uint N )
+    {
+       if( _myMemory ) VectorFreeMemory< T >( _vector );
+       _N        = N;
+       _vector   = VectorAllocateMemory< T >( _N );
+       _myMemory = true;
+       VectorAssignScalar< T >( _vector, ( T )0, _N );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T >& TVector< T >::operator=( const TVector< T >& r )
+    {
+       /*
+        * Only assigns the minimum cardinality (WARNING WITH NON-LOCAL MEMORY).
+        */
+       _type = r._type;
+       VectorAssignMemory< T >( _vector, r._vector, GTM_MIN( _N, r._N ) );
+       return( *this );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    bool TVector< T >::operator==( const TVector< T >& r )
+    {
+       uint i;
+       bool ret;
+
+       for(
+           i = 0, ret = ( _N == r._N );
+           i < _N && ret;
+           ret &= ( _vector[ i ] == r._vector[ i ] ), i++
+           );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    bool TVector< T >::operator!=( const TVector< T >& r )
+    {
+       uint i;
+       bool ret;
+
+       for(
+           i = 0, ret = ( _N != r._N );
+           i < _N && !ret;
+           ret |= ( _vector[ i ] != r._vector[ i ] ), i++
+           );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator+( const TVector< T >& r )
+    {
+       TVector< T > ret( GTM_MIN( _N, r._N ) );
+  
+       VectorAdd< T >( ret._vector, _vector, r._vector, GTM_MIN( _N, r._N ) );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator-( const TVector< T >& r )
+    {
+       TVector< T > ret( GTM_MIN( _N, r._N ) );
+  
+       VectorSubtract< T >( ret._vector, _vector, r._vector, GTM_MIN( _N, r._N ) );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator*( const TVector< T >& r )
+    {
+       TVector< T > ret( GTM_MIN( _N, r._N ) );
+  
+       VectorCrossProduct< T >( ret._vector, _vector, r._vector );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator*( T r )
+    {
+       TVector< T > ret( _N );
+  
+       VectorScalarProduct< T >( ret._vector, _vector, r, _N );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator-( )
+    {
+       TVector< T > ret( _N );
+       uint i;
+  
+       for( i = 0; i < _N; ret._vector[ i ] = ( T )0 - _vector[ i ], i++ );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator!( )
+    {
+       TVector< T > ret( _N );
+  
+       VectorNormalize< T >( ret._vector, _vector, _N );
+       return( ret );
+  
+    }
+
+// -----------------------------------------------------------------------------
+    template< class T >
+    TVector< T > TVector< T >::operator~( )
+    {
+       TVector< T > ret = *this;
+  
+       ret._type = ( _type == COL_VECTOR )? ROW_VECTOR: COL_VECTOR;
+       return( ret );
+  
+    }
+
+} // namespace
+
+#endif // GTMLIB__MATH__VECTOR__HXX
+
+// EOF - vector.h
diff --git a/lib/maracasVisuLib/include/vmfuncs.h b/lib/maracasVisuLib/include/vmfuncs.h
new file mode 100644 (file)
index 0000000..976cd2c
--- /dev/null
@@ -0,0 +1,733 @@
+////////////////////////////////////////////////////////////////////////////////
+// vmfuncs.h
+// Creation : 02/02/2000
+// Author   : Leonardo FLOREZ VALENCIA
+//               l-florez@uniandes.edu.co
+//               lflorez@creatis.insa-lyon.fr
+// Copyright (C) 2000-2002 Leonardo FLOREZ VALENCIA
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GTMLIB__MATH__VMFUNCS__HXX
+#define GTMLIB__MATH__VMFUNCS__HXX
+
+#include <iostream>
+#include <math.h>
+#include <memory.h>
+#include "mathdefs.h"
+
+using namespace std;
+
+namespace gtm
+{
+// -----------------------------------------------------------------------------
+//
+/// Functions for vectors.
+//@{
+// -----------------------------------------------------------------------------
+    /** Stream out function for vectors.
+     *
+     *  @param o Output stream.
+     *  @param v ANSI array.
+     *  @param n Cardinality.
+     *  @param col Should I print it in column format?
+     */
+    template< class T >
+    inline
+    void VectorPrint( std::ostream& o, T* v, uint n, bool col )
+    {
+       uint i;
+       
+       o << n << ": [";
+       if( col ) o << endl;
+       else      o << " ";
+       for( uint i = 0; i < n; i++ ) {
+           
+           o << v[ i ];
+           if( col ) o << endl;
+           else      o << " ";
+           
+       } // rof
+       o << "]" << endl;
+       
+    }
+    
+// -----------------------------------------------------------------------------
+    /** Allocation function.
+     *
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    T* VectorAllocateMemory( uint n )
+    {
+       T* v = new T[ n ];
+
+       memset( v, 0, sizeof( T ) * n );
+       return( v );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Frees vector's memory.
+     *
+     *  @param v Vector.
+     */
+    template< class T >
+    inline
+    void VectorFreeMemory( T* v )
+    {
+       if( v ) delete [] v;
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Copy.
+     *
+     *  @param v Target vector.
+     *  @param v_o Source vector.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    void VectorAssignMemory( T* v, T* v_o, uint n )
+    {
+       memcpy( v, v_o, sizeof( T ) * n );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Allocation & copy.
+     *
+     *  @param v Vector to be copied.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    T* VectorCopyMemory( T* v, uint n )
+    {
+       T* n_v = VectorAllocateMemory< T >( n );
+       VectorAssignMemory< T >( n_v, v, n );
+       return( n_v );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Scalar assignation.
+     *
+     *  @param v Vector.
+     *  @param s Scalar value.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    void VectorAssignScalar( T* v, T s, uint n )
+    {
+       uint i;
+
+       for( i = 0; i < n; v[ i ] = s, i++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Convert a vector in a matrix.
+     *
+     *  @param ma Matrix.
+     *  @param v Vector.
+     *  @param n Columns.
+     *  @param m Rows.
+     *  @param col Is it a column vector?
+     */
+    template< class T >
+    inline
+    void VectorMatrixCast( T** ma, T* v, uint n, uint m, bool col )
+    {
+       uint i;
+
+       for( i = 0; i < ( ( col )? m: n ); i++ )
+           ma[ ( col )? n: i ][ ( col )? i: m ] = v[ i ];
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a vectorial addition.
+     *
+     *  @param v Result.
+     *  @param v_l Left operand.
+     *  @param v_r Right operand.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    void VectorAdd( T* v, T* v_l, T* v_r, uint n )
+    {
+       uint i;
+
+       for( i = 0; i < n; v[ i ] = v_l[ i ] + v_r[ i ], i++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a vectorial substraction.
+     *
+     *  @param v Result.
+     *  @param v_l Left operand.
+     *  @param v_r Right operand.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    void VectorSubtract( T* v, T* v_l, T* v_r, uint n )
+    {
+       uint i;
+
+       for( i = 0; i < n; v[ i ] = v_l[ i ] - v_r[ i ], i++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a vectorial cross product.
+     *
+     *  @param v Result.
+     *  @param v_l Left operand.
+     *  @param v_r Right operand.
+     */
+    template< class T >
+    inline
+    void VectorCrossProduct( T* v, T* v_l, T* v_r )
+    {
+       v[ 0 ] = ( v_l[ 1 ] * v_r[ 2 ] ) - ( v_l[ 2 ] * v_r[ 1 ] );
+       v[ 1 ] = ( v_l[ 2 ] * v_r[ 0 ] ) - ( v_l[ 0 ] * v_r[ 2 ] );
+       v[ 2 ] = ( v_l[ 0 ] * v_r[ 1 ] ) - ( v_l[ 1 ] * v_r[ 0 ] );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a vectorial dot product.
+     *
+     *  @param v_l Left operand.
+     *  @param v_r Right operand.
+     *  @param n Cardinality.
+     *  @return Dot product.
+     */
+    template< class T >
+    inline
+    T VectorDotProduct( T* v_l, T* v_r, uint n )
+    {
+       T ret;
+       uint i;
+
+       for( i = 0, ret = ( T )0; i < n; ret = ret + ( v_l[ i ] * v_r[ i ] ), i++ );
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a vector-scalar product.
+     *
+     *  @param v Result.
+     *  @param v_l Left operand.
+     *  @param s Scalar.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    void VectorScalarProduct( T* v, T* v_l, T s, uint n )
+    {
+       uint i;
+
+       for( i = 0; i < n; v[ i ] = v_l[ i ] * s, i++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Calculates vectorial L2 norm.
+     *
+     *  @param v Vector.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    T VectorNorm( T* v, uint n )
+    {
+       return( ( T )( sqrt( ( double )( VectorDotProduct< T >( v, v, n ) ) ) ) );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Calculates a normal vector, usign the L2 norm.
+     *
+     *  @param v Result.
+     *  @param v_o Original vector.
+     *  @param n Cardinality.
+     */
+    template< class T >
+    inline
+    void VectorNormalize( T* v, T* v_o, uint n )
+    {
+       uint i;
+       T norm = VectorNorm< T >( v_o, n );
+
+       norm = ( norm == ( T )0 )? ( T )1: norm;
+       for( i = 0; i < n; v[ i ] = v_o[ i ] / norm, i++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+//@}
+/// Functions for matrices.
+//@{
+// -----------------------------------------------------------------------------
+    /** Stream out function for matrices.
+     *
+     *  @param o Output stream.
+     *  @param ma Matrix.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixPrint( std::ostream& o, T** ma, uint n, uint m )
+    {
+       uint i, j;
+
+       o << n << " x " << m << endl;
+       for( j = 0; j < m; j++ ) {
+
+           for( i = 0; i < n; o << ma[ i ][ j ] << " ", i++ );
+           o << endl;
+
+       } // rof
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Allocates memory for a matrix.
+     *
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    T** MatrixAllocateMemory( uint n, uint m )
+    {
+       uint i;
+       T** ma = new T*[ n ];
+
+       for( i = 0; i < n; i++ ) {
+
+           ma[ i ] = new T[ m ];
+           memset( ma[ i ], 0, sizeof( T ) * m );
+
+       } // rof
+       return( ma );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Copies.
+     *
+     *  @param ma Target matrix.
+     *  @param ma_o Source matrix.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixAssignMemory( T** ma, T** ma_o, uint n, uint m )
+    {
+       uint i;
+
+       for( i = 0; i < n; i++ )
+           memcpy( ma[ i ], ma_o[ i ], sizeof( T ) * m );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Allocates & copies.
+     *
+     *  @param ma Matrix.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    T** MatrixCopyMemory( T** ma, uint n, uint m )
+    {
+       T** n_ma = MatrixAllocateMemory< T >( n, m );
+       MatrixAssignMemory< T >( n_ma, ma, n, m );
+       return( n_ma );
+       
+    }
+    
+// -----------------------------------------------------------------------------
+    /** Scalar assignation.
+     *
+     *  @param ma Matrix.
+     *  @param s Scalar.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixAssignScalar( T** ma, T s, uint n, uint m )
+    {
+       uint i, j;
+
+       for( i = 0; i < n; i++ )
+           for( j = 0; j < m; j++ )
+               ma[ i ][ j ] = s;
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Converts a matrix in a vector.
+     *
+     *  @param v Vector.
+     *  @param ma Matrix.
+     *  @param n Columns.
+     *  @param m Rows.
+     *  @param col Convert to a column vector?
+     */
+    template< class T >
+    inline
+    void MatrixVectorCast( T* v, T** ma, uint n, uint m, bool col )
+    {
+       uint i;
+
+       for( i = 0; i < ( ( col )? m: n ); i++ )
+           v[ i ] = ma[ ( col )? n: i ][ ( col )? i: m ];
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Frees matrix memory.
+     *
+     *  @param ma Matrix.
+     *  @param n Columns.
+     */
+    template< class T >
+    inline
+    void MatrixFreeMemory( T** ma, uint n )
+    {
+       uint i;
+
+       if( ma ) {
+
+           for( i = 0; i < n; i++ )
+               if( ma[ i ] ) delete [] ma[ i ];
+           delete [] ma;
+
+       } // fi
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a matricial addition.
+     *
+     *  @param ma Result.
+     *  @param ma_l Left operand.
+     *  @param ma_r Right operand.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixAdd( T** ma, T** ma_l, T** ma_r, uint n, uint m )
+    {
+       uint i, j;
+
+       for( i = 0; i < n; i++ )
+           for( j = 0; j < m; ma[ i ][ j ] = ma_l[ i ][ j ] + ma_r[ i ][ j ], j++ );
+       
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a matricial substraction.
+     *
+     *  @param ma Result.
+     *  @param ma_l Left operand.
+     *  @param ma_r Right operand.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixSubtract( T** ma, T** ma_l, T** ma_r, uint n, uint m )
+    {
+       uint i, j;
+
+       for( i = 0; i < n; i++ )
+           for( j = 0; j < m; ma[ i ][ j ] = ma_l[ i ][ j ] - ma_r[ i ][ j ], j++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a matricial product.
+     *
+     *  @param ma Result.
+     *  @param ma_l Left operand.
+     *  @param ma_r Right operand.
+     *  @param n Left columns.
+     *  @param m Left rows/right columns.
+     *  @param nr Right columns.
+     */
+    template< class T >
+    inline
+    void MatrixProduct( T** ma, T** ma_l, T** ma_r, uint n, uint m, uint nr )
+    {
+       unsigned i, j, k;
+
+       for( i = 0; i < nr; i++ )
+           for( j = 0; j < m; j++ )
+               for(
+                   k = 0, ma[ i ][ j ] = ( T )0;
+                   k < n;
+                   ma[ i ][ j ] = ma[ i ][ j ] + ( ma_l[ k ][ j ] * ma_r[ i ][ k ] ), k++
+                   );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Performs a scalar-matrix product.
+     *
+     *  @param ma Result.
+     *  @param ma_l Left operand.
+     *  @param s Scalar.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixScalarProduct( T** ma, T** ma_l, T s, uint n, uint m )
+    {
+       uint i, j;
+
+       for( i = 0; i < n; i++ )
+           for( j = 0; j < m; ma[ i ][ j ] = ma_l[ i ][ j ] * s, j++ );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Gets the matrix cofactor.
+     *
+     *  @param ma Result.
+     *  @param ma_o Matrix.
+     *  @param i Column index.
+     *  @param j Row index.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixCofactor( T** ma, T** ma_o, uint i, uint j, uint n, uint m )
+    {
+       uint k, l;
+       
+       for( k = 0; k < i; k++ ) {
+           
+           for( l = 0;     l < j; l++ ) ma[ k ][ l ]     = ma_o[ k ][ l ];
+           for( l = j + 1; l < m; l++ ) ma[ k ][ l - 1 ] = ma_o[ k ][ l ];
+           
+       } // rof
+       
+       for( k = i + 1; k < n; k++ ) {
+           
+           for( l = 0;     l < j; l++ ) ma[ k - 1 ][ l ]     = ma_o[ k ][ l ];
+           for( l = j + 1; l < m; l++ ) ma[ k - 1 ][ l - 1 ] = ma_o[ k ][ l ];
+           
+       } // rof
+       
+    }
+    
+// -----------------------------------------------------------------------------
+    /** Gets the matrix determinant (square matrices only).
+     *
+     *  @param ma Matrix.
+     *  @param n Dimension.
+     */
+    template< class T >
+    inline
+    T MatrixDeterminant( T** ma, uint n )
+    {
+       uint k;
+       T** tmp = NULL;
+       T ret = ( T )0, c;
+       
+       //  All these cases are for speed-up calculations.
+       if( n == 1 ) {
+
+           ret = ma[ 0 ][ 0 ];
+
+       } else if( n == 2 ) {
+
+           ret =
+               ( ma[ 0 ][ 0 ] * ma[ 1 ][ 1 ] ) -
+               ( ma[ 1 ][ 0 ] * ma[ 0 ][ 1 ] );
+
+       } else if( n == 3 ) {
+
+           ret =
+               ( ma[ 0 ][ 0 ] * ma[ 1 ][ 1 ] * ma[ 2 ][ 2 ] ) -
+               ( ma[ 0 ][ 0 ] * ma[ 2 ][ 1 ] * ma[ 1 ][ 2 ] ) -
+               ( ma[ 1 ][ 0 ] * ma[ 0 ][ 1 ] * ma[ 2 ][ 2 ] ) +
+               ( ma[ 1 ][ 0 ] * ma[ 2 ][ 1 ] * ma[ 0 ][ 2 ] ) +
+               ( ma[ 2 ][ 0 ] * ma[ 0 ][ 1 ] * ma[ 1 ][ 2 ] ) -
+               ( ma[ 2 ][ 0 ] * ma[ 1 ][ 1 ] * ma[ 0 ][ 2 ] );
+
+       } else {
+           
+           tmp = MatrixAllocateMemory< T >( n - 1, n - 1 );
+           for( k = 0, c = ( T )1, ret = ( T )0; k < n; k++ ) {
+
+               MatrixCofactor< T >( tmp, ma, k, 0, n, n );
+               ret = ret + ( c * ( ma[ k ][ 0 ] * MatrixDeterminant< T >( tmp, n - 1 ) ) );
+               c = c * ( T )( 0 - 1 );
+
+           } // rof
+           MatrixFreeMemory< T >( tmp, n - 1 );
+
+       } // fi
+       return( ret );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Calculates the inverse using the adjoint method (only square matrices).
+     *
+     *  @param ma Result.
+     *  @param ma_o Matrix.
+     *  @param n Dimension.
+     */
+    template< class T >
+    inline
+    void MatrixInverseAdjoint( T** ma, T** ma_o, uint n )
+    {
+       uint i, j;
+       T** tmp;
+       T c;
+
+       tmp = MatrixAllocateMemory< T >( n - 1, n - 1 );
+       for( i = 0; i < n; i++ ) {
+
+           for( j = 0; j < n; j++ ) {
+
+               c = ( ( i + j ) % 2 == 0 )? ( T )1: ( T )( 0 - 1 );
+               MatrixCofactor< T >( tmp, ma_o, i, j, n, n );
+               ma[ j ][ i ] = c * MatrixDeterminant< T >( tmp, n - 1 );
+
+           } // rof
+
+       } // rof
+       MatrixFreeMemory< T >( tmp, n - 1 );
+
+       c = ( T )1 / MatrixDeterminant< T >( ma_o, n );
+       MatrixScalarProduct< T >( ma, ma, c, n, n );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Calculates the inverse using the gauss method (only square matrices).
+     *
+     *  @param ma Result.
+     *  @param ma_o Matrix.
+     *  @param n Dimension.
+     *  @warning Adapted from a java-implementation: http://www.nauticom.net/www/jdtaft/JavaMatrix.htm
+     */
+    template< class T >
+    inline
+    void MatrixInverseGauss( T** ma, T** ma_o, uint n )
+    {
+       uint i, j, k, n2 = 2 * n;
+       T** ma_a = MatrixAllocateMemory< T >( n2, n );
+       T a, b;
+
+       //  Augmented matrix initialization
+       for( i = 0; i < n; i++ )
+           for( j = 0; j < n; ma_a[ i ][ j ] = ma_o[ i ][ j ], j++ );
+       for( i = n; i < n2; i++ )
+           for( j = 0; j < n; ma_a[ i ][ j ] = ( i - n == j )? ( T )1: ( T )0, j++ );
+
+       //  Reduction
+       for( j = 0; j < n; j++ ) {
+
+           a = ma_a[ j ][ j ];
+           if( a != 0 ) for( i = 0; i < n2; ma_a[ i ][ j ] = ma_a[ i ][ j ] / a, i++ );
+           for( k = 0; k < n; k++ ) {
+
+               if( ( k - j ) != 0 ) {
+
+                   b = ma_a[ j ][ k ];
+                   for(
+                       i = 0;
+                       i < n2;
+                       ma_a[ i ][ k ] = ma_a[ i ][ k ] - ( b * ma_a[ i ][ j ] ), i++
+                       );
+
+               } // fi
+
+           } // rof
+
+       } // rof
+
+       //  Result assignation
+       MatrixAssignMemory< T >( ma, ma_a, n, n );
+       MatrixFreeMemory< T >( ma_a, n2 );
+
+    }
+
+// -----------------------------------------------------------------------------
+    /** Gets the transpose matrix.
+     *
+     *  @param ma Matrix result.
+     *  @param ma_o Matrix.
+     *  @param n Columns.
+     *  @param m Rows.
+     */
+    template< class T >
+    inline
+    void MatrixTranspose( T** ma, T** ma_o, uint n, uint m )
+    {
+       uint i, j;
+
+       for( i = 0; i < m; i++ )
+           for( j = 0; j < n; ma[ i ][ j ] = ma_o[ j ][ i ], j++ );
+       
+    }
+
+// -----------------------------------------------------------------------------
+    /** Load a square matrix with the identity.
+     *
+     *  @param ma Matrix.
+     *  @param n Dimension.
+     */
+    template< class T >
+    inline
+    void MatrixLoadIdentity( T** ma, uint n )
+    {
+       uint i, j;
+
+       for( i = 0; i < n; i++ )
+           for( j = 0; j < n; ma[ i ][ j ] = ( i == j )? ( T )1: ( T )0, j++ );
+
+    }
+
+}
+//@}
+
+#endif // GTMLIB__MATH__VMFUNCS__HXX
+
+// EOF - vmfuncs.h
diff --git a/lib/maracasVisuLib/src/CMakeLists.txt b/lib/maracasVisuLib/src/CMakeLists.txt
new file mode 100644 (file)
index 0000000..d3ac9a1
--- /dev/null
@@ -0,0 +1,5 @@
+SUBDIRS(
+#SnakeIsoContour+Deriche
+#kernel
+#interface
+)
diff --git a/lib/maracasVisuLib/src/CMakeListsWorking.txt b/lib/maracasVisuLib/src/CMakeListsWorking.txt
new file mode 100644 (file)
index 0000000..9e8488a
--- /dev/null
@@ -0,0 +1,5 @@
+SUBDIRS(
+SnakeIsoContour+Deriche
+kernel
+interface
+)
diff --git a/lib/maracasVisuLib/src/interface/CMakeLists.txt b/lib/maracasVisuLib/src/interface/CMakeLists.txt
new file mode 100644 (file)
index 0000000..be0a96d
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS(wxWindows)
diff --git a/lib/maracasVisuLib/src/interface/tcl/Makefile.am b/lib/maracasVisuLib/src/interface/tcl/Makefile.am
new file mode 100644 (file)
index 0000000..4e7d439
--- /dev/null
@@ -0,0 +1,43 @@
+## Makefile.am -- Process this file with automake to produce Makefile.in
+
+SUBDIRS = tkwidgets to_change windows
+
+lib_LTLIBRARIES = libmarTcl.la
+
+INCLUDES = \
+       $(VTK_CFLAGS) $(IDO_CFLAGS) \
+       $(WX_CFLAGS) $(GSL_CFLAGS) $(KGFO_CFLAGS) \
+       -I$(TCL_INC_DIR) -I$(TK_INC_DIR) \
+       -I../include
+libmarTcl_la_SOURCES = marTclInterface.h wrap_maracas.cxx
+libmarTcl_la_LDFLAGS = \
+       -version-info $(MARACAS_TCL_VER) \
+       $(VTK_LIBS) -lvtkCommonTCL \
+       $(IDO_LIBS) $(WX_LIBS) \
+       $(TCLTK_LIBS) \
+       $(GSL_LIBS) $(KGFO_LIBS)
+
+libmarTcl_la_LIBADD = ../kernel/libmarKernel.la
+
+EXTRA_DIST = tclexe.dsp \
+       wrap_maracas.i \
+       maracas_start.tcl \
+       general.tcl \
+       string_table.tcl
+
+# Special compilation commands
+wrap_maracas.cxx: wrap_maracas.i
+       swig -tcl8 -c++ -o wrap_maracas.cxx wrap_maracas.i
+
+# Special targets
+maracas.tcl :
+       echo "#!/usr/bin/wish" > maracas.tcl
+       echo "" >> maracas.tcl
+       echo "load $(libdir)/libmarTcl.so maracas" >> maracas.tcl
+       echo "source ./maracas_start.tcl" >> maracas.tcl
+       echo "" >> maracas.tcl
+       echo "# eof - maracas.tcl" >> maracas.tcl
+       echo "" >> maracas.tcl
+       chmod +x maracas.tcl
+
+## eof - Makefile.am
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/tcl/Makefile.in b/lib/maracasVisuLib/src/interface/tcl/Makefile.in
new file mode 100644 (file)
index 0000000..a8f0538
--- /dev/null
@@ -0,0 +1,517 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CFLAGS_DEBUG = @CFLAGS_DEBUG@
+CFLAGS_OPTIMIZE = @CFLAGS_OPTIMIZE@
+CFLAGS_WARNING = @CFLAGS_WARNING@
+CPP = @CPP@
+CXX = @CXX@
+DLLTOOL = @DLLTOOL@
+DL_LIBS = @DL_LIBS@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_CONFIG = @GSL_CONFIG@
+GSL_LIBS = @GSL_LIBS@
+IDO_CFLAGS = @IDO_CFLAGS@
+IDO_LIBS = @IDO_LIBS@
+KGFO_CFLAGS = @KGFO_CFLAGS@
+KGFO_CONFIG = @KGFO_CONFIG@
+KGFO_LIBS = @KGFO_LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+MARACAS_ALGORITHM_VER = @MARACAS_ALGORITHM_VER@
+MARACAS_ALGORITHM_VER_STR = @MARACAS_ALGORITHM_VER_STR@
+MARACAS_KERNEL_VER = @MARACAS_KERNEL_VER@
+MARACAS_KERNEL_VER_STR = @MARACAS_KERNEL_VER_STR@
+MARACAS_TCL_VER = @MARACAS_TCL_VER@
+MARACAS_TCL_VER_STR = @MARACAS_TCL_VER_STR@
+MARACAS_VER = @MARACAS_VER@
+MARACAS_VER_STR = @MARACAS_VER_STR@
+MATH_LIBS = @MATH_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+TCLTK_LIBS = @TCLTK_LIBS@
+TCL_BIN_DIR = @TCL_BIN_DIR@
+TCL_INC_DIR = @TCL_INC_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_LIB_FILE = @TCL_LIB_FILE@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TK_BIN_DIR = @TK_BIN_DIR@
+TK_INC_DIR = @TK_INC_DIR@
+TK_LIB_FILE = @TK_LIB_FILE@
+TK_SRC_DIR = @TK_SRC_DIR@
+VERSION = @VERSION@
+VTK_CFLAGS = @VTK_CFLAGS@
+VTK_LIBS = @VTK_LIBS@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CONFIG = @WX_CONFIG@
+WX_LIBS = @WX_LIBS@
+
+SUBDIRS = tkwidgets to_change windows
+
+lib_LTLIBRARIES = libmarTcl.la
+
+INCLUDES =     $(VTK_CFLAGS) $(IDO_CFLAGS)     $(WX_CFLAGS) $(GSL_CFLAGS) $(KGFO_CFLAGS)       -I$(TCL_INC_DIR) -I$(TK_INC_DIR)        -I../include
+
+libmarTcl_la_SOURCES = marTclInterface.h wrap_maracas.cxx
+libmarTcl_la_LDFLAGS =         -version-info $(MARACAS_TCL_VER)        $(VTK_LIBS) -lvtkCommonTCL      $(IDO_LIBS) $(WX_LIBS)  $(TCLTK_LIBS)   $(GSL_LIBS) $(KGFO_LIBS)
+
+
+libmarTcl_la_LIBADD = ../kernel/libmarKernel.la
+
+EXTRA_DIST = tclexe.dsp        wrap_maracas.i  maracas_start.tcl       general.tcl     string_table.tcl
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LTLIBRARIES =  $(lib_LTLIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libmarTcl_la_DEPENDENCIES =  ../kernel/libmarKernel.la
+libmarTcl_la_OBJECTS =  wrap_maracas.lo
+CXXFLAGS = @CXXFLAGS@
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+DEP_FILES =  .deps/wrap_maracas.P
+SOURCES = $(libmarTcl_la_SOURCES)
+OBJECTS = $(libmarTcl_la_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cxx .lo .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu tcl/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-libLTLIBRARIES:
+
+clean-libLTLIBRARIES:
+       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+
+distclean-libLTLIBRARIES:
+
+maintainer-clean-libLTLIBRARIES:
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(libdir)
+       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "$(LIBTOOL)  --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \
+           $(LIBTOOL)  --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \
+         else :; fi; \
+       done
+
+uninstall-libLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+         $(LIBTOOL)  --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
+       done
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+       $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+       -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+       $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+       $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libmarTcl.la: $(libmarTcl_la_OBJECTS) $(libmarTcl_la_DEPENDENCIES)
+       $(CXXLINK) -rpath $(libdir) $(libmarTcl_la_LDFLAGS) $(libmarTcl_la_OBJECTS) $(libmarTcl_la_LIBADD) $(LIBS)
+.cxx.o:
+       $(CXXCOMPILE) -c $<
+.cxx.obj:
+       $(CXXCOMPILE) -c `cygpath -w $<`
+.cxx.lo:
+       $(LTCXXCOMPILE) -c $<
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" = "." && dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tcl
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tcl/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+
+%.o: %.cxx
+       @echo '$(CXXCOMPILE) -c $<'; \
+       $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.cxx
+       @echo '$(LTCXXCOMPILE) -c $<'; \
+       $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am: install-libLTLIBRARIES
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-libLTLIBRARIES
+uninstall: uninstall-recursive
+all-am: Makefile $(LTLIBRARIES)
+all-redirect: all-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+       $(mkinstalldirs)  $(DESTDIR)$(libdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-libLTLIBRARIES mostlyclean-compile \
+               mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+               mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-libLTLIBRARIES clean-compile clean-libtool clean-tags \
+               clean-depend clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-libLTLIBRARIES distclean-compile \
+               distclean-libtool distclean-tags distclean-depend \
+               distclean-generic clean-am
+       -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am:  maintainer-clean-libLTLIBRARIES \
+               maintainer-clean-compile maintainer-clean-libtool \
+               maintainer-clean-tags maintainer-clean-depend \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \
+clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \
+uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \
+distclean-compile clean-compile maintainer-clean-compile \
+mostlyclean-libtool distclean-libtool clean-libtool \
+maintainer-clean-libtool install-data-recursive \
+uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs-am installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Special compilation commands
+wrap_maracas.cxx: wrap_maracas.i
+       swig -tcl8 -c++ -o wrap_maracas.cxx wrap_maracas.i
+
+# Special targets
+maracas.tcl :
+       echo "#!/usr/bin/wish" > maracas.tcl
+       echo "" >> maracas.tcl
+       echo "load $(libdir)/libmarTcl.so maracas" >> maracas.tcl
+       echo "source ./maracas_start.tcl" >> maracas.tcl
+       echo "" >> maracas.tcl
+       echo "# eof - maracas.tcl" >> maracas.tcl
+       echo "" >> maracas.tcl
+       chmod +x maracas.tcl
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/maracasVisuLib/src/interface/tcl/general.tcl b/lib/maracasVisuLib/src/interface/tcl/general.tcl
new file mode 100644 (file)
index 0000000..7c6c1c4
--- /dev/null
@@ -0,0 +1,135 @@
+proc swig_cast { pointer newType } {
+
+    set pt [ split $pointer "_"]
+    return "_[ lindex $pt 1 ]_$newType"
+
+}
+
+proc DistPoints { x1 y1 z1 x2 y2 z2 } {
+  
+  set carre [ expr ( ( $x2 - $x1 ) * ( $x2 - $x1 ) ) + ( ( $y2 - $y1 ) * ( $y2 - $y1 ) ) + ( ( $z2 - $z1 ) * ( $z2 - $z1 ) ) ]
+  set carre [ expr sqrt( $carre ) ]
+  return $carre
+
+}
+
+proc VoxelCoord { xPto yPto zPto xOrig yOrig zOrig dimXVoxel dimYVoxel dimZVoxel } {
+
+  set d [ expr $xPto - $xOrig ]
+  set d [ expr $d + 0.0 ]
+  set floatLoc [ expr $d / $dimXVoxel ]
+  set xVoxel [ expr round( $floatLoc ) ]
+
+  set d [ expr $yPto - $yOrig ]
+  set d [ expr $d + 0.0 ]
+  set floatLoc [ expr $d / $dimYVoxel ]
+  set yVoxel [ expr round( $floatLoc ) ]
+
+  set d [ expr $zPto - $zOrig ]
+  set d [ expr $d + 0.0 ]
+  set floatLoc [ expr $d / $dimZVoxel ]
+  set zVoxel [ expr round( $floatLoc ) ]
+  return "$xVoxel $yVoxel $zVoxel"
+
+}
+
+proc PointCoord { xVoxel yVoxel zVoxel xOrig yOrig zOrig dimXVoxel dimYVoxel dimZVoxel } {
+
+
+  set floatLoc [ expr $xVoxel * $dimXVoxel ]
+  set xPto [ expr $floatLoc + $xOrig ]
+
+  set floatLoc [ expr $yVoxel * $dimYVoxel ]
+  set yPto [ expr $floatLoc + $yOrig ]
+
+  set floatLoc [ expr $zVoxel * $dimZVoxel ]
+  set zPto [ expr $floatLoc + $zOrig ]
+
+  return "$xPto $yPto $zPto"
+}
+
+proc DrawSphere { name radius xc yc zc r g b } {
+
+    vtkSphereSource $name
+        $name SetRadius $radius
+        $name SetCenter $xc $yc $zc
+    vtkPolyDataMapper mapper_sphere_$name
+        mapper_sphere_$name SetInput [ $name GetOutput ]
+        mapper_sphere_$name ImmediateModeRenderingOn
+    vtkActor actor_sphere_$name
+        actor_sphere_$name SetMapper mapper_sphere_$name
+        [ actor_sphere_$name GetProperty ] SetColor  $r $g $b
+
+    return "actor_sphere_$name"
+
+}
+
+proc GetSphereActorName { name } {
+
+    return "actor_sphere_$name"
+
+}
+
+proc DeleteSphere { name } {
+
+    catch { actor_sphere_$name  Delete }
+    catch { mapper_sphere_$name Delete }
+    catch { $name               Delete }
+
+}
+
+proc pick_point_local_actor { x y renderer actor { tol 0.025 } } {
+
+#    catch { pick_point_local_cell_picker Delete }
+#
+#    vtkWorldPointPicker pick_point_local_cell_picker
+#        pick_point_local_cell_picker Pick $x $y 0 $renderer
+#        set pickWPPos [ pick_point_local_cell_picker GetPickPosition ]
+#
+#    catch { pick_point_local_cell_picker Delete }
+#    return $pickWPPos
+#
+    catch { pick_point_local_cell_picker Delete }
+
+    set actors [ $renderer GetActors ]
+    vtkCellPicker pick_point_local_cell_picker
+        pick_point_local_cell_picker SetTolerance $tol
+        pick_point_local_cell_picker Pick $x $y 0 $renderer
+        set positions [ pick_point_local_cell_picker GetPickedPositions ]
+
+    set ret {}
+    for { set i 0 } { $i < [ $actors GetNumberOfItems ] } { incr i } {
+
+        set act [ $actors GetItemAsObject $i ]
+        if { [ string compare $act $actor ] == 0 } {
+
+            set ret [ $positions GetPoint $i ]
+            break
+
+        }
+
+    }
+    catch { pick_point_local_cell_picker Delete }
+    return $ret
+
+}
+
+proc change_float_precision { number decimals } {
+
+    set l [ split $number . ]
+    set ret $number
+    if { [ llength $l ] == 2 } {
+
+        set ret "[ lindex $l 0 ]."
+        for { set i 0 } { $i < $decimals } { incr i } {
+
+            set ret "$ret[ string index [ lindex $l 1 ] $i ]"
+
+        }
+
+    }
+    return $ret
+
+}
+
+# EOF - general.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/3D.gif b/lib/maracasVisuLib/src/interface/tcl/icons/3D.gif
new file mode 100644 (file)
index 0000000..df0ac92
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/3D.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/add.gif b/lib/maracasVisuLib/src/interface/tcl/icons/add.gif
new file mode 100644 (file)
index 0000000..b46a8e6
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/add.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/area.gif b/lib/maracasVisuLib/src/interface/tcl/icons/area.gif
new file mode 100644 (file)
index 0000000..7e27d0c
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/area.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/back.gif b/lib/maracasVisuLib/src/interface/tcl/icons/back.gif
new file mode 100644 (file)
index 0000000..3df3b36
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/back.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/bright.gif b/lib/maracasVisuLib/src/interface/tcl/icons/bright.gif
new file mode 100644 (file)
index 0000000..ed07e5b
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/bright.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/clear.gif b/lib/maracasVisuLib/src/interface/tcl/icons/clear.gif
new file mode 100644 (file)
index 0000000..e63a2d1
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/clear.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/connect.gif b/lib/maracasVisuLib/src/interface/tcl/icons/connect.gif
new file mode 100644 (file)
index 0000000..eeeb6ff
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/connect.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/continue.gif b/lib/maracasVisuLib/src/interface/tcl/icons/continue.gif
new file mode 100644 (file)
index 0000000..eb992d8
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/continue.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/del_axis.gif b/lib/maracasVisuLib/src/interface/tcl/icons/del_axis.gif
new file mode 100644 (file)
index 0000000..3809984
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/del_axis.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/excel.gif b/lib/maracasVisuLib/src/interface/tcl/icons/excel.gif
new file mode 100644 (file)
index 0000000..4c46834
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/excel.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/extract.gif b/lib/maracasVisuLib/src/interface/tcl/icons/extract.gif
new file mode 100644 (file)
index 0000000..cb3733c
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/extract.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/help.gif b/lib/maracasVisuLib/src/interface/tcl/icons/help.gif
new file mode 100644 (file)
index 0000000..0f51e1e
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/help.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/imagebrowser.gif b/lib/maracasVisuLib/src/interface/tcl/icons/imagebrowser.gif
new file mode 100644 (file)
index 0000000..c20d9bc
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/imagebrowser.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/intensity.gif b/lib/maracasVisuLib/src/interface/tcl/icons/intensity.gif
new file mode 100644 (file)
index 0000000..2a963cc
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/intensity.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/linear.gif b/lib/maracasVisuLib/src/interface/tcl/icons/linear.gif
new file mode 100644 (file)
index 0000000..0b5c79c
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/linear.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/loadexp.gif b/lib/maracasVisuLib/src/interface/tcl/icons/loadexp.gif
new file mode 100644 (file)
index 0000000..aa96031
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/loadexp.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/pan.gif b/lib/maracasVisuLib/src/interface/tcl/icons/pan.gif
new file mode 100644 (file)
index 0000000..eb65bfd
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/pan.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/params.gif b/lib/maracasVisuLib/src/interface/tcl/icons/params.gif
new file mode 100644 (file)
index 0000000..bcea0bb
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/params.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/plans.gif b/lib/maracasVisuLib/src/interface/tcl/icons/plans.gif
new file mode 100644 (file)
index 0000000..f7a5a29
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/plans.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/quant.gif b/lib/maracasVisuLib/src/interface/tcl/icons/quant.gif
new file mode 100644 (file)
index 0000000..af0c071
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/quant.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/redblue.gif b/lib/maracasVisuLib/src/interface/tcl/icons/redblue.gif
new file mode 100644 (file)
index 0000000..2d5c80d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/redblue.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/redgreen.gif b/lib/maracasVisuLib/src/interface/tcl/icons/redgreen.gif
new file mode 100644 (file)
index 0000000..003e98e
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/redgreen.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/rotate.gif b/lib/maracasVisuLib/src/interface/tcl/icons/rotate.gif
new file mode 100644 (file)
index 0000000..da9c2b6
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/rotate.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/save.gif b/lib/maracasVisuLib/src/interface/tcl/icons/save.gif
new file mode 100644 (file)
index 0000000..605ffd6
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/save.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/subtract.gif b/lib/maracasVisuLib/src/interface/tcl/icons/subtract.gif
new file mode 100644 (file)
index 0000000..00a8e52
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/subtract.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/wizard.gif b/lib/maracasVisuLib/src/interface/tcl/icons/wizard.gif
new file mode 100644 (file)
index 0000000..69b1603
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/wizard.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/icons/zoom.gif b/lib/maracasVisuLib/src/interface/tcl/icons/zoom.gif
new file mode 100644 (file)
index 0000000..9211b1f
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/tcl/icons/zoom.gif differ
diff --git a/lib/maracasVisuLib/src/interface/tcl/marTcl.dsp b/lib/maracasVisuLib/src/interface/tcl/marTcl.dsp
new file mode 100644 (file)
index 0000000..99ba8a0
--- /dev/null
@@ -0,0 +1,142 @@
+# Microsoft Developer Studio Project File - Name="marTcl" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=marTcl - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "marTcl.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "marTcl.mak" CFG="marTcl - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "marTcl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "marTcl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "marTcl - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "../lib"
+# PROP Intermediate_Dir "tmp"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MARTCL_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MARTCL_EXPORTS" /D "MAR_KERNEL_USING_DLL" /D "KGFO_USING_DLL" /D "__WIN95__" /D "__WXMSW__" /D WXUSINGDLL=1 /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kgfo.lib tcl83.lib tk83.lib wxmsw240.lib vtkCommon.lib vtkCommonTCL.lib /nologo /dll /machine:I386
+
+!ELSEIF  "$(CFG)" == "marTcl - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "../lib"
+# PROP Intermediate_Dir "tmp"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MARTCL_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "__WIN95__" /D "__WXMSW__" /D WXUSINGDLL=1 /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MARTCL_EXPORTS" /D "MAR_KERNEL_USING_DLL" /D "KGFO_USING_DLL" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40c /d "_DEBUG"
+# ADD RSC /l 0x40c /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kgfo.lib tcl83.lib tk83.lib wxmsw240d.lib vtkCommon.lib vtkCommonTCL.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "marTcl - Win32 Release"
+# Name "marTcl - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\wrap_maracas.cxx
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=..\lib\marKernel.lib
+# End Source File
+# End Group
+# Begin Group "Swig Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\wrap_maracas.i
+
+!IF  "$(CFG)" == "marTcl - Win32 Release"
+
+# Begin Custom Build
+InputPath=.\wrap_maracas.i
+
+"wrap_maracas.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       C:\Swig1.1\swig.exe -tcl8 -c++ -o wrap_maracas.cxx wrap_maracas.i
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "marTcl - Win32 Debug"
+
+# Begin Custom Build
+InputPath=.\wrap_maracas.i
+
+"wrap_maracas.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       C:\Swig1.1\swig.exe -tcl8 -c++ -o wrap_maracas.cxx wrap_maracas.i
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/lib/maracasVisuLib/src/interface/tcl/marTclInterface.h b/lib/maracasVisuLib/src/interface/tcl/marTclInterface.h
new file mode 100644 (file)
index 0000000..6291206
--- /dev/null
@@ -0,0 +1,469 @@
+#ifndef MAR__INTERFACE__TCL__HXX
+#define MAR__INTERFACE__TCL__HXX
+
+#include "../kernel/marInterface.h"
+#include <kgfo/volstat.hxx>
+#include <tcl.h>
+#include <tk.h>
+#include <wx/list.h>
+#include <wx/string.h>
+#include <vtkCellArray.h>
+#include <vtkCellLocator.h>
+#include <vtkImageData.h>
+#include <vtkMath.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include <vtkTclUtil.h>
+
+// ----------------------------------------------------------------------------
+static marInterface MyMaracasData;
+static kVolume* _ucharVol = NULL;
+
+// ----------------------------------------------------------------------------
+void freeAllMaracasInterfaces_dll( )
+{
+       MyMaracasData.reset( );
+       if( _ucharVol ) delete _ucharVol;
+       _ucharVol = NULL;
+}
+
+// ----------------------------------------------------------------------------
+wxStringList params_dll( )
+{
+    return( MyMaracasData._parameters->getRelationalArray( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+void setParams_dll( wxStringList& raParams )
+{
+    MyMaracasData._parameters->setRelationalArray( raParams );
+
+}
+
+// ----------------------------------------------------------------------------
+bool saveParams_dll( std::string& fName )
+{
+    return( MyMaracasData.saveParameters( std::string( fName ) ) );
+
+}
+
+// ----------------------------------------------------------------------------
+bool loadParams_dll( std::string& fName )
+{
+    return( MyMaracasData.loadParameters( std::string( fName ) ) );
+
+}
+
+// ----------------------------------------------------------------------------
+void SetROIStep_dll( double vWidth )
+{
+    MyMaracasData._parameters->setROIStep( vWidth );
+
+}
+
+// ----------------------------------------------------------------------------
+double GetActualVoxelSize_dll( ) {
+
+    return( MyMaracasData._parameters->getVoxelSize( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+wxStringList studies_dll( )
+{
+    return( MyMaracasData._dicom->getStudies( ) );
+}
+
+// ----------------------------------------------------------------------------
+wxStringList studyData_dll( std::string& study )
+{
+    MyMaracasData._dicom->setActualStudy( study );
+    return( MyMaracasData._dicom->getRelationalArrayStudyData( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+wxStringList series_dll( std::string& study )
+{
+    MyMaracasData._dicom->setActualStudy( study );
+    return( MyMaracasData._dicom->getSeries( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+wxStringList serieData_dll( std::string& study, std::string& serie )
+{
+    MyMaracasData._dicom->setActualStudy( study );
+    MyMaracasData._dicom->setActualSerie( serie );
+    return( MyMaracasData._dicom->getRelationalArraySerieData( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+void SubtractSeries_dll( std::string& sl, std::string& sr, std::string& ss, std::string& description )
+{/*
+   marDicom::SubtractSeries(
+   MyMaracasData._parameters,
+   MyMaracasData._dicom->getActualStudy( ),
+   sl, sr,
+   ss, description
+   );
+ */
+}
+
+// ----------------------------------------------------------------------------
+bool LoadImages_dll( )
+{
+    MyMaracasData._dicom->loadActualSerie( );
+    return( true );
+
+}
+
+// ----------------------------------------------------------------------------
+void CastVolume_dummy( )
+{
+       if( _ucharVol ) delete _ucharVol;
+       _ucharVol = new kVolume( *( MyMaracasData._dicom->getVolume( ) ) );
+
+       _ucharVol->convertScale( kVolume::UCHAR, 0, 255 );
+
+}
+
+// ----------------------------------------------------------------------------
+void LoadTkImage_dummy( uchar** image, int w, int h,
+                                               std::string& tkName, Tcl_Interp* interp )
+{
+    Tk_PhotoHandle hnd;
+    Tk_PhotoImageBlock bl;
+
+    hnd = Tk_FindPhoto( interp, ( char* )tkName.c_str( ) );
+    if( hnd != NULL ) {
+
+        // Image size
+        bl.width  = w;
+        bl.height = h;
+
+        // One pixel is represented with one unsigned short value
+        bl.pixelSize = sizeof( uchar );
+
+        // We're working on intensity images i.e. no RGB
+        bl.offset[ 0 ] = 0;
+        bl.offset[ 1 ] = 0;
+        bl.offset[ 2 ] = 0;
+        bl.offset[ 3 ] = 0;
+
+        // To go to next in vertical value
+        bl.pitch = bl.pixelSize * bl.width;
+
+        // Menory block
+        bl.pixelPtr = ( uchar* )image[ 0 ];
+
+        // Ok, lets do it!
+        Tk_PhotoPutBlock( hnd, &bl, 0, 0, bl.width, bl.height );
+
+    } // fi
+
+}
+
+// ----------------------------------------------------------------------------
+void LoadTkImages_dll( wxStringList& tkNames, Tcl_Interp* interp )
+{
+    int k, w, h, d;
+       std::string tmp;
+
+    w = MyMaracasData._dicom->getVolume( )->getXdim( );
+    h = MyMaracasData._dicom->getVolume( )->getYdim( );
+    d = MyMaracasData._dicom->getVolume( )->getZdim( );
+
+    CastVolume_dummy( );
+       uchar*** vol = ( uchar*** )( _ucharVol->getData3D( ) );
+    for( k = 0; k < d; k++ ) {
+
+               tmp = tkNames[ k ];
+        LoadTkImage_dummy( vol[ k ],
+                                                  w, h, tmp, interp );
+
+    } // rof
+
+}
+
+// ----------------------------------------------------------------------------
+int GetNumberOfImages_dll( )
+{
+    return( MyMaracasData._dicom->getVolume( )->getZdim( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+wxStringList GetImagesNumbers_dll( )
+{
+    return( MyMaracasData._dicom->getImageNumbers( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+double GetImageIntensity_dll( int x, int y, int z )
+{
+    return( MyMaracasData._dicom->getVolume( )->getPixel( x, y, z ) );
+
+}
+
+// ----------------------------------------------------------------------------
+ushort* GetProfilFromTotalVolume_dll( int xO, int yO, int zO,
+                                                                                int xF, int yF, int zF )
+{
+    int i;
+       kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->
+                                                                                 getVolume( ) );
+
+       stats->profile( xO, yO, zO, xF, yF, zF );
+
+    ushort* r = new ushort[ stats->getSize( ) + 6 ];
+
+    r[ 0 ] = stats->getSize( ) + 6;
+    r[ 1 ] = ( ushort )stats->getMin( );
+    r[ 2 ] = ( ushort )stats->getMax( );
+    r[ 3 ] = ( ushort )stats->getAvg( );
+    r[ 4 ] = ( ushort )stats->getSD( );
+    r[ 5 ] = ( ushort )stats->getSize( );
+    for( i = 0; i < stats->getSize( ); i++ )
+               r[ i + 6 ] = ( ushort )( stats->getValues( ) )[ i ];
+    return( r );
+
+}
+
+// ----------------------------------------------------------------------------
+void GetAreaValuesFromTotalVolume_dll( int xO, int yO, int zO,
+                                                                          int xF, int yF, int zF,
+                                                                          int* min, int* max, int* avg,
+                                                                          int* sd, int* size )
+{
+       kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->getVolume( ) );
+
+       stats->stats( xO, yO, zO, xF, yF, zF );
+
+    *min = ( int )stats->getMin( );
+    *max = ( int )stats->getMax( );
+    *avg = ( int )stats->getAvg( );
+    *sd = ( int )stats->getSD( );
+    *size = stats->getSize( );
+
+}
+
+// ----------------------------------------------------------------------------
+bool SaveExperiment_dll ( std::string& fName )
+{
+    return( MyMaracasData.saveExperiment( fName ) );
+
+}
+
+// ----------------------------------------------------------------------------
+bool LoadExperiment_dll ( std::string& fName )
+{
+    return( MyMaracasData.loadExperiment( fName ) );
+
+}
+
+// ----------------------------------------------------------------------------
+void InitExperiment_dll ( int* voi )
+{
+    MyMaracasData._experiment->setVOI( voi );
+    MyMaracasData._experiment->initExperiment( MyMaracasData._dicom->
+                                                                                          getVolume( ) );
+       //if( _ucharVol ) delete _ucharVol;
+       //_ucharVol = NULL;
+       MyMaracasData._dicom->freeVolume( );
+}
+
+// ----------------------------------------------------------------------------
+void SetStartPoint_dll( int x, int y, int z )
+{
+    MyMaracasData._experiment->setStartPoint( x, y, z );
+}
+
+// ----------------------------------------------------------------------------
+void ExtractAxes_dll( )
+{
+    MyMaracasData._experiment->extractVascularTree( );
+}
+
+// ----------------------------------------------------------------------------
+int GetNumberOfAxes_dll( )
+{
+    return( MyMaracasData._experiment->getNumberOfAxes( ) );
+}
+
+// ----------------------------------------------------------------------------
+vtkPolyData* GetAllAxes_dll( )
+{
+    int i, n, j;
+    double p[ marAxis::INDX_count ];
+    marAxis* tmp;
+
+    vtkPoints* allPoints = vtkPoints::New( );
+    vtkCellArray* allTopology = vtkCellArray::New( );
+
+    j = 0;
+    for( n = 0; n < MyMaracasData._experiment->getNumberOfAxes( ); n++ ) {
+
+        tmp = MyMaracasData._experiment->getAxis( );
+        allTopology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
+        for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
+
+            tmp->getControlPoint( i, p, p + 3 );
+            allPoints->InsertNextPoint( p[ 0 ], p[ 1 ], p[ 2 ] );
+            allTopology->InsertCellPoint( j );
+                       j++;
+
+        } // rof
+
+    } // rof
+
+    vtkPolyData* allData = vtkPolyData::New( );
+    allData->SetPoints( allPoints );
+    allData->SetLines( allTopology );
+    
+    allPoints->Delete();
+    allTopology->Delete();
+
+    return( allData );
+
+}
+
+// ----------------------------------------------------------------------------
+vtkPolyData* GetActualAxis_dll( )
+{
+    int i, j, h;
+    double p[ marAxis::INDX_count ];
+    marAxis* tmp;
+
+    vtkPoints* points = vtkPoints::New( );
+    vtkCellArray* topology = vtkCellArray::New( );
+
+    j = 0;
+    h = MyMaracasData._experiment->getDynData( )->getVolume( )->getYdim( );
+    tmp = MyMaracasData._experiment->getAxis( );
+    topology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
+    for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
+
+               tmp->getControlPoint( i, p, p + 3 );
+               topology->InsertCellPoint( j++ );
+               points->InsertNextPoint( p[ 0 ], h - 1 - p[ 1 ], p[ 2 ] );
+
+    } // rof
+
+    vtkPolyData* data = vtkPolyData::New( );
+    data->SetPoints( points );
+    data->SetLines( topology );
+    
+    points->Delete();
+    topology->Delete();
+
+    return( data );
+}
+
+// ----------------------------------------------------------------------------
+int GetActualAxisNumberOfPoints_dll( )
+{
+    return( MyMaracasData._experiment->getAxis( )->getNumberOfControlPoints( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+double* GetActualAxisPoint_dll( int i )
+{
+    double* ret = new double[ marAxis::INDX_count + 1 ];
+
+    ret[ 0 ] = marAxis::INDX_count;
+    MyMaracasData._experiment->getAxis( )->getControlPoint( i, ret + 1, ret + 4 );
+    return( ret );
+}
+
+// ----------------------------------------------------------------------------
+vtkImageData* GetActualAxisSlice_dll( int i )
+{
+       //    return( MyMaracasData._experiment->GetSliceImage( i ) );
+       return( NULL );
+
+}
+
+// ----------------------------------------------------------------------------
+void PrepareQuantification_dll( int i )
+{
+       /*
+         MyMaracasData._experiment->SetAxis( i );
+         MyMaracasData._experiment->PrepareQuantification( );
+       */
+}
+
+// ----------------------------------------------------------------------------
+double GetAxisLength_dll( )
+{
+    return( MyMaracasData._experiment->getAxis( )->length( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+void GetImageRange_dll( int* min, int* max )
+{
+    double m, M;
+
+    MyMaracasData._experiment->getDynData( )->getVolume( )->getMinMax( m, M );
+    *min = ( int )m;
+    *max = ( int )M;
+
+}
+
+// ----------------------------------------------------------------------------
+vtkImageData* GetVTKVolume_dll( )
+{
+    return( MyMaracasData._experiment->getDynData( )->getVolume( )->castVtk( ) );
+
+}
+
+// ----------------------------------------------------------------------------
+int IntersectWithLine_dll(
+                                                 vtkCellLocator* iCellLocator,
+                                                 double x1, double y1, double z1, 
+                                                 double x2, double y2, double z2,
+                                                 double tol, double *xI, double *yI, double *zI
+                                                 )
+{
+    float a0[ 3 ], a1[ 3 ], x[ 3 ], t, pcoords[ 3 ];
+    int subId; 
+
+    int returnVal;
+    iCellLocator->Update( );
+
+    a0[ 0 ] = x1; a0[ 1 ] = y1; a0[ 2 ] = z1;
+    a1[ 0 ] = x2; a1[ 1 ] = y2; a1[ 2 ] = z2;
+
+    returnVal = iCellLocator->IntersectWithLine( a0, a1, tol, t, x, pcoords, subId );
+    ( *xI ) = x[ 0 ]; ( *yI ) = x[ 1 ]; ( *zI ) = x[ 2 ];
+
+    return( returnVal );
+}
+
+// ----------------------------------------------------------------------------
+void TclPerpendiculars_dll(
+                                                  double xN, double yN, double zN, double angle,
+                                                  double *xP1, double *yP1, double *zP1,
+                                                  double *xP2, double *yP2, double *zP2
+                                                  )
+{
+    double x[ 3 ], y[ 3 ], z[ 3 ];
+    vtkMath* math;
+
+    x[ 0 ] = xN; x[ 1 ] = yN; x[ 2 ] = zN;
+    math = vtkMath::New( );
+    math->Perpendiculars( x, y, z,angle );
+    ( *xP1 ) = y[ 0 ]; ( *yP1 ) = y[ 1 ]; ( *zP1 ) = y[ 2 ];
+    ( *xP2 ) = z[ 0 ]; ( *yP2 ) = z[ 1 ]; ( *zP2 ) = z[ 2 ];
+    math->Delete( );
+}
+
+#endif // MAR__INTERFACE__TCL__HXX
+
+// EOF - interfaceTCL.hxx
diff --git a/lib/maracasVisuLib/src/interface/tcl/maracas_start.tcl b/lib/maracasVisuLib/src/interface/tcl/maracas_start.tcl
new file mode 100644 (file)
index 0000000..bf46cde
--- /dev/null
@@ -0,0 +1,42 @@
+# Tcl/Tk code loading
+source ./general.tcl
+source ./string_table.tcl
+source ./tkwidgets/combobox.tcl
+source ./tkwidgets/mclistbox.tcl
+source ./tkwidgets/ibrowser.tcl
+source ./tkwidgets/imagepp.tcl
+#source ./to_change/vtkInt.tcl
+source ./to_change/WidgetObject.tcl
+source ./to_change/volTkInteractor.tcl
+source ./to_change/TkImageViewerInteractor.tcl
+source ./to_change/ev_userzoom.tcl
+source ./windows/to_change/wizardpostcontour.tcl
+source ./windows/to_change/wizardpostaxis.tcl
+source ./windows/dlg_name_axis.tcl
+source ./windows/help_wnd.tcl
+source ./windows/subtract.tcl
+source ./windows/choose_direction.tcl
+source ./windows/dlg_params.tcl
+source ./windows/global_window.tcl
+source ./windows/data_browser.tcl
+source ./windows/image_browser.tcl
+source ./windows/u_3D.tcl
+source ./windows/u_mpr.tcl
+source ./windows/u_mip.tcl
+source ./windows/u_surf.tcl
+source ./windows/planes_window.tcl
+
+# Package invocation
+package require vtk
+package require BLT
+
+# Namespace includes
+catch { namespace import blt::* }
+catch { namespace import data_model::* }
+catch { namespace import data_browser::* }
+catch { namespace import global_window::* }
+
+# Start maracas
+global_window::show ../icons
+
+# eof - maracas_start.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/string_table.tcl b/lib/maracasVisuLib/src/interface/tcl/string_table.tcl
new file mode 100644 (file)
index 0000000..19b7191
--- /dev/null
@@ -0,0 +1,185 @@
+
+namespace eval string_table {
+
+    variable str_3D_back_color                   {3D world background color:}
+    variable str_accept_changes                  {Accept changes?}
+    variable str_algorithm                       {Algorithm}
+    variable str_all_slices_selected             {All slices selected by default?}
+    variable str_area                            {Area}
+    variable str_avg                             {Average}
+    variable str_axial                           {Axial}
+    variable str_axis                            {Axis}
+    variable str_axis_color                      {Axis color:}
+    variable str_axis_step                       {Axis discret step (1/N):}
+    variable str_bright                          {bright}
+    variable str_browse                          {Browse...}
+    variable str_calculate_mip_default           {Calculate MIP default?}
+    variable str_calculated                      {Contour calculated}
+    variable str_cancel                          {Cancel}
+    variable str_choose_a_file                   {Choose a file}
+    variable str_choose_order                    {Choose order}
+    variable str_chooseadirectory                {chooseadirectory}
+    variable str_choose_a_name                   {Choose a name...}
+    variable str_clean                           {clean}
+    variable str_clean_contours                  {Recalculate contours}
+    variable str_coef_ballon                     {Ballon coeficient:}
+    variable str_coef_cell                       {Cell coeficient:}
+    variable str_coef_flex                       {Flexion coeficient:}
+    variable str_coef_extern                     {Extern coeficient:}
+    variable str_coef_grad                       {Gradient coeficient:}
+    variable str_coef_pas                        {Step coeficient (1/N):}
+    variable str_coef_tension                    {Tension coeficient:}
+    variable str_color                           {Color}
+    variable str_colormap                        {Colormap}
+    variable str_console_window_visible          {Console window visible?}
+    variable str_contour                         {Contour}
+    variable str_coronal                         {Coronal}
+    variable str_data_types                      {data types}
+    variable str_debug                           {Debug}
+    variable str_debug_window_visible            {Debug window visible?}
+    variable str_delta                           {Delta:}
+    variable str_description                     {Description}
+    variable str_diam_area                       {Diameter from area}
+    variable str_diam_avg                        {Average diameter}
+    variable str_diam_max                        {Maximum diameter}
+    variable str_diam_min                        {Minimum diameter}
+    variable str_diam_peri                       {Diameter from perimeter}
+    variable str_diameters                       {Diameters}
+    variable str_dim_voxel_x                     {Dimension VXx:}
+    variable str_dim_voxel_y                     {Dimension VXy:}
+    variable str_dim_voxel_z                     {Dimension VXz:}
+    variable str_directories                     {Configure Directories}
+    variable str_dist_int                        {Distance max. int:}
+    variable str_distance                        {Distance:}
+    variable str_distance_cdg                    {Distance cdg:}
+    variable str_edge                            {edge}
+    variable str_edge_points                     {Edge points}
+    variable str_erase_extracted_contours        {Delete extracted contours?}
+    variable str_erase_quant                     {Delete quantification}
+    variable str_erase_quant_q                   {Delete all quantification?}
+    variable str_filled_contour                  {Filled contour}
+    variable str_general                         {General}
+    variable str_generate_new_axis               {Generate a new axis?}
+    variable str_green_red                       {green red}
+    variable str_greyscale                       {Greyscale}
+    variable str_healthy_slice                   {Healthy slice}
+    variable str_if_name_exists_will_erase       {This name already exists. Remplace it?}
+    variable str_images_directory                {DICOM Images Directory:}
+    variable str_institution                     {Institution}
+    variable str_int                             {Intensity}
+    variable str_interpolation_type              {Interpolation type}
+    variable str_isocontour                      {IsoContour}
+    variable str_isocontours                     {IsoContours}
+    variable str_isoval                          {isoval}
+    variable str_isovalue                        {isovalue}
+    variable str_iter                            {No. iterations:}
+    variable str_maracas_title                   {MARACAS - MAgnetic Resonance Angiography Computer ASsisted analysis}
+    variable str_mask_size                       {Mask size:}
+    variable str_mass_power                      {Mass power:}
+    variable str_max                             {Maximum}
+    variable str_min                             {Minimum}
+    variable str_mip                             {MIP}
+    variable str_mip_controls                    {MIP controls}
+    variable str_mm_length                       {Length(mm)}
+    variable str_mpr_controls                    {MPR controls}
+    variable str_mpr_type                        {MPR type}
+    variable str_near_neighbor                   {Near neighbor}
+    variable str_new_axis_name                   {New axis name:}
+    variable str_no_name_choose_yet              {No name choose yet!}
+    variable str_nro_pix                         {Number of pixels}
+    variable str_ok                              {Ok}
+    variable str_opacity                         {Opacity}
+    variable str_opaque                          {Opaque}
+    variable str_partial_axis_delete             {partial axis delete}
+    variable str_patient_id                      {Patient ID}
+    variable str_patient_name                    {Patient Name}
+    variable str_pause                           {Pause}
+    variable str_peri                            {Perimeter}
+    variable str_perpendicular_section           {Perpendicular section}
+    variable str_play                            {Play}
+    variable str_please_select_a_different_point {please select a different point}
+    variable str_please_select_a_point           {please select a point}
+    variable str_quantification                  {Quantification}
+    variable str_quant_will_be_erased            {Quantification will be erased}
+    variable str_rec_surface                     {Reconstructed surface}
+    variable str_recalculate_contours            {Recalculate any contour?}
+    variable str_red_blue                        {red blue}
+    variable str_refresh                         {Refresh}
+    variable str_rings_visible                   {Visible rings}
+    variable str_roi_dim                         {ROI dimension:}
+    variable str_sagital                         {Sagital}
+    variable str_sample                          {Sample:}
+    variable str_scale                           {Scale:}
+    variable str_select_the_segment_to_delete    {select the segment to delete}
+    variable str_serie                           {Serie}
+    variable str_serie_bodypart                  {Body Part}
+    variable str_serie_date                      {Date}
+    variable str_serie_description               {Description}
+    variable str_serie_diagnostic                {Diagnostic}
+    variable str_serie_modality                  {Modality}
+    variable str_serie_name                      {Name}
+    variable str_serie_number                    {Number}
+    variable str_serie_time                      {Time}
+    variable str_series                          {Series}
+    variable str_showtype                        {Show type:}
+    variable str_show_surf                       {Show surface}
+    variable str_sigma                           {Sigma:}
+    variable str_slice                           {Slice}
+    variable str_slices                          {Slices}
+    variable str_snake                           {Snake}
+    variable str_snake_der                       {Snake + Deriche}
+    variable str_snake_iso                       {Snake + IsoContour}
+    variable str_std                             {Standard deviation}
+    variable str_stenosis_type                   {Stenosis type}
+    variable str_stenosis                        {Stenosis}
+    variable str_step                            {Step:}
+    variable str_stop_quantification             {Stop quantification?}
+    variable str_study_date                      {Study Date}
+    variable str_study_id                        {Study ID}
+    variable str_study_name                      {Study Name}
+    variable str_study_time                      {Study Time}
+    variable str_subtract_series                 {subtract series}
+    variable str_sure_to_stop                    {sure to stop \n(stop/pause/continue)}
+    variable str_surface                         {Surface}
+    variable str_surface_color                   {Surface color:}
+    variable str_surface_values                  {Surface values}
+    variable str_threshold                       {Threshold:}
+    variable str_title_params                    {Parameters for MARACAS...}
+    variable str_transparent                     {Transparent}
+    variable str_trilinear                       {Trilinear}
+    variable str_user_defined                    {User configuration}
+    variable str_work_directory                  {Work Directory:}
+    variable str_renal                           {Renal}
+    variable str_aorta                           {Aorta}
+    variable str_carotid                         {Carotid}
+    variable str_llimbs                          {Lower Limbs}
+    variable str_yes                             {Yes}
+    variable str_no                              {No}
+
+    variable str_postcontour_wizard              {Post-Contour Wizard...}
+
+    variable str_postaxis_wizard                 {Post-Axis Wizard...}
+    variable str_artery_types                    {Artery types}
+    variable str_questions                       {Questions}
+    variable str_other                           {Other}
+    variable str_correct_result                  {Correct results?}
+    variable str_out_of_lumen                    {Out of lumen?}
+    variable str_not_centered                    {Not centered?}
+    variable str_zig_zag_axis                    {Zig-zag axis?}
+    variable str_out_of_bifurcation              {Out of bifurcation?}
+    variable str_out_of_curve                    {Out of curve?}
+    variable str_jump_to_vein                    {Jump to vein?}
+    variable str_overestimated                   {Over-estimated?}
+    variable str_underestimated                  {Under-estimated?}
+    variable str_extraconcave                    {Extraconcave?}
+    variable str_more_than_one_artery            {More than one artery?}
+    variable str_minimum_voxel                   {Minimum voxel}
+    variable str_normal_voxel                    {Normal voxel}
+
+    variable str_coef_cell_max_int               {Cell Max. Int. Coef (1/N):}
+    variable str_show_cell                       {Show cell?}
+    variable str_show_i_cell                     {Show intensity cell?}
+
+}
+
+# EOF - string_table.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/tclexe.dsp b/lib/maracasVisuLib/src/interface/tcl/tclexe.dsp
new file mode 100644 (file)
index 0000000..1ad8785
--- /dev/null
@@ -0,0 +1,241 @@
+# Microsoft Developer Studio Project File - Name="tclexe" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=tclexe - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "tclexe.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "tclexe.mak" CFG="tclexe - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "tclexe - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "tclexe - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "tclexe - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "../bin"
+# PROP Intermediate_Dir "tmp"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /u /D "NDEBUG" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 /nologo /subsystem:windows /machine:I386 /nodefaultlib /out:"./maracas.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Installing...
+PostBuild_Cmds=copy *.exe C:\Users\Florez\local\bin
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "tclexe - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "../bin"
+# PROP Intermediate_Dir "tmp"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /u /D "_DEBUG" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40c /d "_DEBUG"
+# ADD RSC /l 0x40c /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib /out:"./maracas.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Installing...
+PostBuild_Cmds=copy *.exe C:\Users\Florez\local\bin
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "tclexe - Win32 Release"
+# Name "tclexe - Win32 Debug"
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Group "Tcl Files"
+
+# PROP Default_Filter ""
+# Begin Group "tkwidgets"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\tkwidgets\combobox.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\tkwidgets\ibrowser.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\tkwidgets\imagepp.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\tkwidgets\mclistbox.tcl
+# End Source File
+# End Group
+# Begin Group "to_change"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\to_change\ev_userzoom.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\to_change\TkImageViewerInteractor.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\to_change\TkInteractor.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\to_change\volTkInteractor.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\to_change\vtkInt.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\to_change\WidgetObject.tcl
+# End Source File
+# End Group
+# Begin Group "windows"
+
+# PROP Default_Filter ""
+# Begin Group "to_change No. 1"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\windows\to_change\wizardpostaxis.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\to_change\wizardpostcontour.tcl
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\windows\choose_direction.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\data_browser.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\dlg_name_axis.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\dlg_params.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\global_window.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\help_wnd.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\image_browser.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\planes_window.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\subtract.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\u_3D.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\u_mip.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\u_mpr.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\windows\u_surf.tcl
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\general.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\maracas_start.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\maracas_w32.tcl
+# End Source File
+# Begin Source File
+
+SOURCE=.\string_table.tcl
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/lib/maracasVisuLib/src/interface/tcl/tkwidgets/Makefile.am b/lib/maracasVisuLib/src/interface/tcl/tkwidgets/Makefile.am
new file mode 100644 (file)
index 0000000..4809fb3
--- /dev/null
@@ -0,0 +1,9 @@
+## Makefile.am -- Process this file with automake to produce Makefile.in
+
+EXTRA_DIST = \
+       combobox.tcl \
+       ibrowser.tcl \
+       imagepp.tcl \
+       mclistbox.tcl
+
+## eof - Makefile.am
diff --git a/lib/maracasVisuLib/src/interface/tcl/tkwidgets/Makefile.in b/lib/maracasVisuLib/src/interface/tcl/tkwidgets/Makefile.in
new file mode 100644 (file)
index 0000000..6705062
--- /dev/null
@@ -0,0 +1,224 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CFLAGS_DEBUG = @CFLAGS_DEBUG@
+CFLAGS_OPTIMIZE = @CFLAGS_OPTIMIZE@
+CFLAGS_WARNING = @CFLAGS_WARNING@
+CPP = @CPP@
+CXX = @CXX@
+DLLTOOL = @DLLTOOL@
+DL_LIBS = @DL_LIBS@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_CONFIG = @GSL_CONFIG@
+GSL_LIBS = @GSL_LIBS@
+IDO_CFLAGS = @IDO_CFLAGS@
+IDO_LIBS = @IDO_LIBS@
+KGFO_CFLAGS = @KGFO_CFLAGS@
+KGFO_CONFIG = @KGFO_CONFIG@
+KGFO_LIBS = @KGFO_LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+MARACAS_ALGORITHM_VER = @MARACAS_ALGORITHM_VER@
+MARACAS_ALGORITHM_VER_STR = @MARACAS_ALGORITHM_VER_STR@
+MARACAS_KERNEL_VER = @MARACAS_KERNEL_VER@
+MARACAS_KERNEL_VER_STR = @MARACAS_KERNEL_VER_STR@
+MARACAS_TCL_VER = @MARACAS_TCL_VER@
+MARACAS_TCL_VER_STR = @MARACAS_TCL_VER_STR@
+MARACAS_VER = @MARACAS_VER@
+MARACAS_VER_STR = @MARACAS_VER_STR@
+MATH_LIBS = @MATH_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+TCLTK_LIBS = @TCLTK_LIBS@
+TCL_BIN_DIR = @TCL_BIN_DIR@
+TCL_INC_DIR = @TCL_INC_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_LIB_FILE = @TCL_LIB_FILE@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TK_BIN_DIR = @TK_BIN_DIR@
+TK_INC_DIR = @TK_INC_DIR@
+TK_LIB_FILE = @TK_LIB_FILE@
+TK_SRC_DIR = @TK_SRC_DIR@
+VERSION = @VERSION@
+VTK_CFLAGS = @VTK_CFLAGS@
+VTK_LIBS = @VTK_LIBS@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CONFIG = @WX_CONFIG@
+WX_LIBS = @WX_LIBS@
+
+EXTRA_DIST =   combobox.tcl    ibrowser.tcl    imagepp.tcl     mclistbox.tcl
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu tcl/tkwidgets/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tcl/tkwidgets
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tcl/tkwidgets/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+       -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/maracasVisuLib/src/interface/tcl/tkwidgets/combobox.tcl b/lib/maracasVisuLib/src/interface/tcl/tkwidgets/combobox.tcl
new file mode 100644 (file)
index 0000000..4f008e3
--- /dev/null
@@ -0,0 +1,1989 @@
+# Copyright (c) 1998-1999, Bryan Oakley
+# All Rights Reservered
+#
+# Bryan Oakley
+# oakley@channelpoint.com
+#
+# combobox v2.0b2 April 14, 1999
+#
+# a combobox / dropdown listbox (pick your favorite name) widget 
+# written in pure tcl
+#
+# this code is freely distributable without restriction, but is 
+# provided as-is with no waranty expressed or implied. 
+#
+# thanks to the following people who provided beta test support or
+# patches to the code (in no particular order):
+#
+# Scott Beasley     Alexandre Ferrieux     Todd Helfter
+# Matt Gushee      Laurent Duperval        John Jackson
+# Fred Rapp        Christopher Nelson
+# Eric Galluzzo     Jean-Francois Moine
+
+# A special thanks to Martin M. Hunt who provided several good ideas, 
+# and always with a patch to implement them. Jean-Francois Moine, 
+# Todd Helfter and John Jackson were also kind enough to send in some 
+# code patches.
+
+package require Tk 8.0
+package provide combobox 2.0
+
+namespace eval ::combobox {
+
+    # this is the public interface
+    namespace export combobox
+
+    # these contain references to available options
+    variable widgetOptions
+
+    # these contain references to available commands and subcommands
+    variable widgetCommands
+    variable scanCommands
+    variable listCommands
+
+}
+
+# ::combobox::combobox --
+#
+#     This is the command that gets exported. It creates a new
+#     combobox widget.
+#
+# Arguments:
+#
+#     w        path of new widget to create
+#     args     additional option/value pairs (eg: -background white, etc.)
+#
+# Results:
+#
+#     It creates the widget and sets up all of the default bindings
+#
+# Returns:
+#
+#     The name of the newly create widget
+
+proc ::combobox::combobox {w args} {
+    variable widgetOptions
+    variable widgetCommands
+    variable scanCommands
+    variable listCommands
+
+    # perform a one time initialization
+    if {![info exists widgetOptions]} {
+       Init
+    }
+
+    # build it...
+    eval Build $w $args
+
+    # set some bindings...
+    SetBindings $w
+
+    # and we are done!
+    return $w
+}
+
+
+# ::combobox::Init --
+#
+#     Initialize the global (well, namespace) variables. This should
+#     only be called once, immediately prior to creating the first
+#     instance of the widget
+#
+# Arguments:
+#
+#    none
+#
+# Results:
+#
+#     All state variables are set to their default values; all of 
+#     the option database entries will exist.
+#
+# Returns:
+# 
+#     empty string
+
+proc ::combobox::Init {} {
+    variable widgetOptions
+    variable widgetCommands
+    variable scanCommands
+    variable listCommands
+    variable defaultEntryCursor
+
+    array set widgetOptions [list \
+           -background          {background          Background} \
+           -bd                  -borderwidth \
+           -bg                  -background \
+           -borderwidth         {borderWidth         BorderWidth} \
+           -command             {command             Command} \
+           -commandstate        {commandState        State} \
+           -cursor              {cursor              Cursor} \
+           -editable            {editable            Editable} \
+           -fg                  -foreground \
+           -font                {font                Font} \
+           -foreground          {foreground          Foreground} \
+           -height              {height              Height} \
+           -highlightbackground {highlightBackground HighlightBackground} \
+           -highlightcolor      {highlightColor      HighlightColor} \
+           -highlightthickness  {highlightThickness  HighlightThickness} \
+           -image               {image               Image} \
+           -maxheight           {maxHeight           Height} \
+           -relief              {relief              Relief} \
+           -selectbackground    {selectBackground    Foreground} \
+           -selectborderwidth   {selectBorderWidth   BorderWidth} \
+           -selectforeground    {selectForeground    Background} \
+           -state               {state               State} \
+           -takefocus           {takeFocus           TakeFocus} \
+           -textvariable        {textVariable        Variable} \
+           -value               {value               Value} \
+           -width               {width               Width} \
+           -xscrollcommand      {xScrollCommand      ScrollCommand} \
+    ]
+
+
+    set widgetCommands [list \
+           bbox      cget     configure    curselection \
+           delete    get      icursor      index        \
+           insert    list     scan         selection    \
+           xview     select   toggle       open         \
+           close \
+    ]
+
+    set listCommands [list \
+           delete       get      \
+           index        insert       size \
+    ]
+
+    set scanCommands [list mark dragto]
+
+    # why check for the Tk package? This lets us be sourced into 
+    # an interpreter that doesn't have Tk loaded, such as the slave
+    # interpreter used by pkg_mkIndex. In theory it should have no
+    # side effects when run 
+    if {[lsearch -exact [package names] "Tk"] != -1} {
+
+       ##################################################################
+       #- this initializes the option database. Kinda gross, but it works
+       #- (I think). 
+       ##################################################################
+
+       # the image used for the button...
+       if {$::tcl_platform(platform) == "windows"} {
+           image create bitmap ::combobox::bimage -data {
+               #define down_arrow_width 12
+               #define down_arrow_height 12
+               static char down_arrow_bits[] = {
+                   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+                   0xfc,0xf1,0xf8,0xf0,0x70,0xf0,0x20,0xf0,
+                   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
+               }
+           }
+       } else {
+           image create bitmap ::combobox::bimage -data  {
+               #define down_arrow_width 15
+               #define down_arrow_height 15
+               static char down_arrow_bits[] = {
+                   0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
+                   0x00,0x80,0xf8,0x8f,0xf0,0x87,0xe0,0x83,
+                   0xc0,0x81,0x80,0x80,0x00,0x80,0x00,0x80,
+                   0x00,0x80,0x00,0x80,0x00,0x80
+               }
+           }
+       }
+
+       # compute a widget name we can use to create a temporary widget
+       set tmpWidget ".__tmp__"
+       set count 0
+       while {[winfo exists $tmpWidget] == 1} {
+           set tmpWidget ".__tmp__$count"
+           incr count
+       }
+
+       # get the scrollbar width. Because we try to be clever and draw our
+       # own button instead of using a tk widget, we need to know what size
+       # button to create. This little hack tells us the width of a scroll
+       # bar.
+       #
+       # NB: we need to be sure and pick a window  that doesn't already
+       # exist... 
+       scrollbar $tmpWidget
+       set sb_width [winfo reqwidth $tmpWidget]
+       destroy $tmpWidget
+
+       # steal options from the entry widget
+       # we want darn near all options, so we'll go ahead and do
+       # them all. No harm done in adding the one or two that we
+       # don't use.
+       entry $tmpWidget 
+       foreach foo [$tmpWidget configure] {
+           # the cursor option is special, so we'll save it in
+           # a special way
+           if {[lindex $foo 0] == "-cursor"} {
+               set defaultEntryCursor [lindex $foo 4]
+           }
+           if {[llength $foo] == 5} {
+               set option [lindex $foo 1]
+               set value [lindex $foo 4]
+               option add *Combobox.$option $value widgetDefault
+
+               # these options also apply to the dropdown listbox
+               if {[string compare $option "foreground"] == 0 \
+                       || [string compare $option "background"] == 0 \
+                       || [string compare $option "font"] == 0} {
+                   option add *Combobox*ComboboxListbox.$option $value \
+                           widgetDefault
+               }
+           }
+       }
+       destroy $tmpWidget
+
+       # these are unique to us...
+       option add *Combobox.cursor              {}
+       option add *Combobox.commandState        normal widgetDefault
+       option add *Combobox.editable            1      widgetDefault
+       option add *Combobox.maxHeight           10     widgetDefault
+       option add *Combobox.height              0
+    }
+
+    # set class bindings
+    SetClassBindings
+}
+
+# ::combobox::SetClassBindings --
+#
+#    Sets up the default bindings for the widget class
+#
+#    this proc exists since it's The Right Thing To Do, but
+#    I haven't had the time to figure out how to do all the
+#    binding stuff on a class level. The main problem is that
+#    the entry widget must have focus for the insertion cursor
+#    to be visible. So, I either have to have the entry widget
+#    have the Combobox bindtag, or do some fancy juggling of
+#    events or some such. What a pain.
+#
+# Arguments:
+#
+#    none
+#
+# Returns:
+#
+#    empty string
+
+proc ::combobox::SetClassBindings {} {
+
+    # make sure we clean up after ourselves...
+    bind Combobox <Destroy> [list ::combobox::DestroyHandler %W]
+
+    # this will (hopefully) close (and lose the grab on) the
+    # listbox if the user clicks anywhere outside of it. Note
+    # that on Windows, you can click on some other app and
+    # the listbox will still be there, because tcl won't see
+    # that button click
+    set this {[::combobox::convert %W -W]}
+    bind Combobox <Any-ButtonPress>   "$this close"
+    bind Combobox <Any-ButtonRelease> "$this close"
+
+    # this helps (but doesn't fully solve) focus issues. The general
+    # idea is, whenever the frame gets focus it gets passed on to
+    # the entry widget
+    bind Combobox <FocusIn> {tkTabToWindow [::combobox::convert %W -W].entry}
+
+    # this closes the listbox if we get hidden
+    bind Combobox <Unmap> {[::combobox::convert %W -W] close}
+
+    return ""
+}
+
+# ::combobox::SetBindings --
+#
+#    here's where we do most of the binding foo. I think there's probably
+#    a few bindings I ought to add that I just haven't thought
+#    about...
+#
+#    I'm not convinced these are the proper bindings. Ideally all
+#    bindings should be on "Combobox", but because of my juggling of
+#    bindtags I'm not convinced thats what I want to do. But, it all
+#    seems to work, its just not as robust as it could be.
+#
+# Arguments:
+#
+#    w   widget pathname
+#
+# Returns:
+#
+#    empty string
+
+proc ::combobox::SetBindings {w} {
+    upvar ::combobox::${w}::widgets  widgets
+    upvar ::combobox::${w}::options  options
+
+    # juggle the bindtags. The basic idea here is to associate the
+    # widget name with the entry widget, so if a user does a bind
+    # on the combobox it will get handled properly since it is
+    # the entry widget that has keyboard focus.
+    bindtags $widgets(entry) \
+           [concat $widgets(this) [bindtags $widgets(entry)]]
+
+    bindtags $widgets(button) \
+           [concat $widgets(this) [bindtags $widgets(button)]]
+
+    # override the default bindings for tab and shift-tab. The
+    # focus procs take a widget as their only parameter and we
+    # want to make sure the right window gets used (for shift-
+    # tab we want it to appear as if the event was generated
+    # on the frame rather than the entry. I
+
+    bind $widgets(entry) <Tab> \
+           "tkTabToWindow \[tk_focusNext $widgets(entry)\]; break"
+    bind $widgets(entry) <Shift-Tab> \
+           "tkTabToWindow \[tk_focusPrev $widgets(this)\]; break"
+    
+    # this makes our "button" (which is actually a label)
+    # do the right thing
+    bind $widgets(button) <ButtonPress-1> [list $widgets(this) toggle]
+
+    # this lets the autoscan of the listbox work, even if they
+    # move the cursor over the entry widget.
+    bind $widgets(entry) <B1-Enter> "break"
+
+    bind $widgets(listbox) <ButtonRelease-1> \
+           "::combobox::Select $widgets(this) \[$widgets(listbox) nearest %y\]; break"
+
+    bind $widgets(vsb) <ButtonPress-1>  {continue}
+    bind $widgets(vsb) <ButtonRelease-1> {continue}
+
+    bind $widgets(listbox) <Any-Motion> {
+       %W selection clear 0 end
+       %W activate @%x,%y
+       %W selection anchor @%x,%y
+       %W selection set @%x,%y @%x,%y
+       # need to do a yview if the cursor goes off the top
+       # or bottom of the window... (or do we?)
+    }
+
+    # these events need to be passed from the entry
+    # widget to the listbox, or need some sort of special
+    # handling....
+    foreach event [list <Up> <Down> <Tab> <Return> <Escape> \
+           <Next> <Prior> <Double-1> <1> <Any-KeyPress> \
+           <FocusIn> <FocusOut>] {
+       bind $widgets(entry) $event \
+               "::combobox::HandleEvent $widgets(this) $event"
+    }
+
+}
+
+# ::combobox::Build --
+#
+#    This does all of the work necessary to create the basic
+#    combobox. 
+#
+# Arguments:
+#
+#    w       widget name
+#    args     additional option/value pairs
+#
+# Results:
+#
+#    Creates a new widget with the given name. Also creates a new
+#    namespace patterened after the widget name, as a child namespace
+#    to ::combobox
+#
+# Returns:
+#
+#    the name of the widget
+
+proc ::combobox::Build {w args } {
+    variable widgetOptions
+
+    if {[winfo exists $w]} {
+       error "window name \"$w\" already exists"
+    }
+
+    # create the namespace for this instance, and define a few
+    # variables
+    namespace eval ::combobox::$w {
+
+       variable ignoreTrace 0
+       variable oldFocus    {}
+       variable oldGrab     {}
+       variable oldValue    {}
+       variable options
+       variable this
+       variable widgets
+
+       set widgets(foo) foo  ;# coerce into an array
+       set options(foo) foo  ;# coerce into an array
+
+       unset widgets(foo)
+       unset options(foo)
+    }
+
+    # import the widgets and options arrays into this proc so
+    # we don't have to use fully qualified names, which is a
+    # pain.
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+
+    # this is our widget -- a frame of class Combobox. Naturally,
+    # it will contain other widgets. We create it here because
+    # we need it to be able to set our default options.
+    set widgets(this)  [frame  $w -class Combobox -takefocus 0]
+    set widgets(entry) [entry  $w.entry -takefocus 1]
+    set widgets(button) [label $w.button -takefocus 0] 
+
+    # this defines all of the default options. We get the
+    # values from the option database. Note that if an array
+    # value is a list of length one it is an alias to another
+    # option, so we just ignore it
+    foreach name [array names widgetOptions] {
+       if {[llength $widgetOptions($name)] == 1} continue
+       set optName  [lindex $widgetOptions($name) 0]
+       set optClass [lindex $widgetOptions($name) 1]
+       set value [option get $w $optName $optClass]
+       set options($name) $value
+    }
+
+    # if -value is set to null, we'll remove it from our
+    # local array. The assumption is, if the user sets it from
+    # the option database, they will set it to something other
+    # than null (since it's impossible to determine the difference
+    # between a null value and no value at all).
+    if {[info exists options(-value)] \
+           && [string length $options(-value)] == 0} {
+       unset options(-value)
+    }
+
+    # we will later rename the frame's widget proc to be our
+    # own custom widget proc. We need to keep track of this
+    # new name, so we'll define and store it here...
+    set widgets(frame) ::combobox::${w}::$w
+
+    # gotta do this sooner or later. Might as well do it now
+    pack $widgets(entry)  -side left  -fill both -expand yes
+    pack $widgets(button) -side right -fill y   -expand no
+
+    # I should probably do this in a catch, but for now it's
+    # good enough... What it does, obviously, is put all of
+    # the option/values pairs into an array. Make them easier
+    # to handle later on...
+    array set options $args
+
+    # now, the dropdown list... the same renaming nonsense
+    # must go on here as well...
+    set widgets(popup)  [toplevel  $w.top]
+    set widgets(listbox) [listbox   $w.top.list]
+    set widgets(vsb)    [scrollbar $w.top.vsb]
+
+    pack $widgets(listbox) -side left -fill both -expand y
+
+    # fine tune the widgets based on the options (and a few
+    # arbitrary values...)
+
+    # NB: we are going to use the frame to handle the relief
+    # of the widget as a whole, so the entry widget will be 
+    # flat. This makes the button which drops down the list
+    # to appear "inside" the entry widget.
+
+    $widgets(vsb) configure \
+           -command "$widgets(listbox) yview" \
+           -highlightthickness 0
+
+    $widgets(button) configure \
+           -highlightthickness 0 \
+           -borderwidth 1 \
+           -relief raised \
+           -width [expr {[winfo reqwidth $widgets(vsb)] - 2}]
+
+    $widgets(entry) configure \
+           -borderwidth 0 \
+           -relief flat \
+           -highlightthickness 0 
+
+    $widgets(popup) configure \
+           -borderwidth 1 \
+           -relief sunken
+
+    $widgets(listbox) configure \
+           -selectmode browse \
+           -background [$widgets(entry) cget -bg] \
+           -yscrollcommand "$widgets(vsb) set" \
+           -exportselection false \
+           -borderwidth 0
+
+
+#    trace variable ::combobox::${w}::entryTextVariable w \
+#          [list ::combobox::EntryTrace $w]
+       
+    # do some window management foo on the dropdown window
+    wm overrideredirect $widgets(popup) 1
+    wm transient       $widgets(popup) [winfo toplevel $w]
+    wm group           $widgets(popup) [winfo parent $w]
+    wm resizable       $widgets(popup) 0 0
+    wm withdraw        $widgets(popup)
+    
+    # this moves the original frame widget proc into our
+    # namespace and gives it a handy name
+    rename ::$w $widgets(frame)
+
+    # now, create our widget proc. Obviously (?) it goes in
+    # the global namespace. All combobox widgets will actually
+    # share the same widget proc to cut down on the amount of
+    # bloat. 
+    proc ::$w {command args} \
+           "eval ::combobox::WidgetProc $w \$command \$args"
+
+
+    # ok, the thing exists... let's do a bit more configuration. 
+    if {[catch "::combobox::Configure $widgets(this) [array get options]" error]} {
+       catch {destroy $w}
+       error $error
+    }
+
+    return ""
+
+}
+
+# ::combobox::HandleEvent --
+#
+#    this proc handles events from the entry widget that we want
+#    handled specially (typically, to allow navigation of the list
+#    even though the focus is in the entry widget)
+#
+# Arguments:
+#
+#    w      widget pathname
+#    event   a string representing the event (not necessarily an
+#           actual event)
+
+proc ::combobox::HandleEvent {w event} {
+    upvar ::combobox::${w}::widgets  widgets
+    upvar ::combobox::${w}::options  options
+    upvar ::combobox::${w}::oldValue oldValue
+
+    # for all of these events, if we have a special action we'll
+    # do that and do a "return -code break" to keep additional 
+    # bindings from firing. Otherwise we'll let the event fall
+    # on through. 
+    switch $event {
+
+       "<Any-KeyPress>" {
+           # if the widget is editable, clear the selection. 
+           # this makes it more obvious what will happen if the 
+           # user presses <Return> (and helps our code know what
+           # to do if the user presses return)
+           if {$options(-editable)} {
+               $widgets(listbox) see 0
+               $widgets(listbox) selection clear 0 end
+               $widgets(listbox) selection anchor 0
+               $widgets(listbox) activate 0
+           }
+       }
+
+       "<FocusIn>" {
+           set oldValue [$widgets(entry) get]
+       }
+
+       "<FocusOut>" {
+           if {![winfo ismapped $widgets(popup)]} {
+               # did the value change?
+#              set newValue [set ::combobox::${w}::entryTextVariable]
+               set newValue [$widgets(entry) get]
+               if {$oldValue != $newValue} {
+                   CallCommand $widgets(this) $newValue
+               }
+           }
+       }
+
+       "<1>" {
+           set editable [::combobox::GetBoolean $options(-editable)]
+           if {!$editable} {
+               if {[winfo ismapped $widgets(popup)]} {
+                   $widgets(this) close
+                   return -code break;
+
+               } else {
+                   if {$options(-state) != "disabled"} {
+                       $widgets(this) open
+                       return -code break;
+                   }
+               }
+           }
+       }
+
+       "<Double-1>" {
+           if {$options(-state) != "disabled"} {
+               $widgets(this) toggle
+               return -code break;
+           }
+       }
+
+       "<Tab>" {
+           if {[winfo ismapped $widgets(popup)]} {
+               ::combobox::Find $widgets(this) 0
+               return -code break;
+           } else {
+               ::combobox::SetValue $widgets(this) [$widgets(this) get]
+           }
+       }
+
+       "<Escape>" {
+#          $widgets(entry) delete 0 end
+#          $widgets(entry) insert 0 $oldValue
+           if {[winfo ismapped $widgets(popup)]} {
+               $widgets(this) close
+               return -code break;
+           }
+       }
+
+       "<Return>" {
+           # did the value change?
+#          set newValue [set ::combobox::${w}::entryTextVariable]
+           set newValue [$widgets(entry) get]
+           if {$oldValue != $newValue} {
+               CallCommand $widgets(this) $newValue
+           }
+
+           if {[winfo ismapped $widgets(popup)]} {
+               ::combobox::Select $widgets(this) \
+                       [$widgets(listbox) curselection]
+               return -code break;
+           } 
+
+       }
+
+       "<Next>" {
+           $widgets(listbox) yview scroll 1 pages
+           set index [$widgets(listbox) index @0,0]
+           $widgets(listbox) see $index
+           $widgets(listbox) activate $index
+           $widgets(listbox) selection clear 0 end
+           $widgets(listbox) selection anchor $index
+           $widgets(listbox) selection set $index
+
+       }
+
+       "<Prior>" {
+           $widgets(listbox) yview scroll -1 pages
+           set index [$widgets(listbox) index @0,0]
+           $widgets(listbox) activate $index
+           $widgets(listbox) see $index
+           $widgets(listbox) selection clear 0 end
+           $widgets(listbox) selection anchor $index
+           $widgets(listbox) selection set $index
+       }
+
+       "<Down>" {
+           if {[winfo ismapped $widgets(popup)]} {
+               tkListboxUpDown $widgets(listbox) 1
+               return -code break;
+
+           } else {
+               if {$options(-state) != "disabled"} {
+                   $widgets(this) open
+                   return -code break;
+               }
+           }
+       }
+       "<Up>" {
+           if {[winfo ismapped $widgets(popup)]} {
+               tkListboxUpDown $widgets(listbox) -1
+               return -code break;
+
+           } else {
+               if {$options(-state) != "disabled"} {
+                   $widgets(this) open
+                   return -code break;
+               }
+           }
+       }
+    }
+
+    return ""
+}
+
+# ::combobox::DestroyHandler {w} --
+# 
+#    Cleans up after a combobox widget is destroyed
+#
+# Arguments:
+#
+#    w   widget pathname
+#
+# Results:
+#
+#    The namespace that was created for the widget is deleted,
+#    and the widget proc is removed.
+
+proc ::combobox::DestroyHandler {w} {
+
+    # if the widget actually being destroyed is of class Combobox,
+    # crush the namespace and kill the proc. Get it? Crush. Kill. 
+    # Destroy. Heh. Danger Will Robinson! Oh, man! I'm so funny it
+    # brings tears to my eyes.
+    if {[string compare [winfo class $w] "Combobox"] == 0} {
+       upvar ::combobox::${w}::widgets  widgets
+       upvar ::combobox::${w}::options  options
+
+       # delete the namespace and the proc which represents
+       # our widget
+       namespace delete ::combobox::$w
+       rename $w {}
+    }  
+
+    return ""
+}
+
+# ::combobox::Find
+#
+#    finds something in the listbox that matches the pattern in the
+#    entry widget and selects it
+#
+#    N.B. I'm not convinced this is working the way it ought to. It
+#    works, but is the behavior what is expected? I've also got a gut
+#    feeling that there's a better way to do this, but I'm too lazy to
+#    figure it out...
+#
+# Arguments:
+#
+#    w     widget pathname
+#    exact  boolean; if true an exact match is desired
+#
+# Returns:
+#
+#    Empty string
+
+proc ::combobox::Find {w {exact 0}} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+
+    ## *sigh* this logic is rather gross and convoluted. Surely
+    ## there is a more simple, straight-forward way to implement
+    ## all this. As the saying goes, I lack the time to make it
+    ## shorter...
+
+    # use what is already in the entry widget as a pattern
+    set pattern [$widgets(entry) get]
+
+    if {[string length $pattern] == 0} {
+       # clear the current selection
+       $widgets(listbox) see 0
+       $widgets(listbox) selection clear 0 end
+       $widgets(listbox) selection anchor 0
+       $widgets(listbox) activate 0
+       return
+    }
+
+    # we're going to be searching this list...
+    set list [$widgets(listbox) get 0 end]
+
+    # if we are doing an exact match, try to find,
+    # well, an exact match
+    set exactMatch -1
+    if {$exact} {
+       set exactMatch [lsearch -exact $list $pattern]
+    }
+
+    # search for it. We'll try to be clever and not only
+    # search for a match for what they typed, but a match for
+    # something close to what they typed. We'll keep removing one
+    # character at a time from the pattern until we find a match
+    # of some sort.
+    set index -1
+    while {$index == -1 && [string length $pattern]} {
+       set index [lsearch -glob $list "$pattern*"]
+       if {$index == -1} {
+           regsub {.$} $pattern {} pattern
+       }
+    }
+
+    # this is the item that most closely matches...
+    set thisItem [lindex $list $index]
+
+    # did we find a match? If so, do some additional munging...
+    if {$index != -1} {
+
+       # we need to find the part of the first item that is 
+       # unique WRT the second... I know there's probably a
+       # simpler way to do this... 
+
+       set nextIndex [expr {$index + 1}]
+       set nextItem [lindex $list $nextIndex]
+
+       # we don't really need to do much if the next
+       # item doesn't match our pattern...
+       if {[string match $pattern* $nextItem]} {
+           # ok, the next item matches our pattern, too
+           # now the trick is to find the first character
+           # where they *don't* match...
+           set marker [string length $pattern]
+           while {$marker <= [string length $pattern]} {
+               set a [string index $thisItem $marker]
+               set b [string index $nextItem $marker]
+               if {[string compare $a $b] == 0} {
+                   append pattern $a
+                   incr marker
+               } else {
+                   break
+               }
+           }
+       } else {
+           set marker [string length $pattern]
+       }
+       
+    } else {
+       set marker end
+       set index 0
+    }
+
+    # ok, we know the pattern and what part is unique;
+    # update the entry widget and listbox appropriately
+    if {$exact && $exactMatch == -1} {
+       # this means we didn't find an exact match
+       $widgets(listbox) selection clear 0 end
+       $widgets(listbox) see $index
+
+    } elseif {!$exact} {
+       # this means we found something, but it isn't an exact
+       # match. If we find something that *is* an exact match we
+       # don't need to do the following, since it would merely 
+       # be replacing the data in the entry widget with itself
+       set oldstate [$widgets(entry) cget -state]
+       $widgets(entry) configure -state normal
+       $widgets(entry) delete 0 end
+       $widgets(entry) insert end $thisItem
+       $widgets(entry) selection clear
+       $widgets(entry) selection range $marker end
+       $widgets(listbox) activate $index
+       $widgets(listbox) selection clear 0 end
+       $widgets(listbox) selection anchor $index
+       $widgets(listbox) selection set $index
+       $widgets(listbox) see $index
+       $widgets(entry) configure -state $oldstate
+    }
+}
+
+# ::combobox::Select --
+#
+#    selects an item from the list and sets the value of the combobox
+#    to that value
+#
+# Arguments:
+#
+#    w     widget pathname
+#    index  listbox index of item to be selected
+#
+# Returns:
+#
+#    empty string
+
+proc ::combobox::Select {w index} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+
+    catch {
+       set data [$widgets(listbox) get [lindex $index 0]]
+       ::combobox::SetValue $widgets(this) $data
+
+       $widgets(listbox) selection clear 0 end
+       $widgets(listbox) selection anchor $index
+       $widgets(listbox) selection set $index
+
+       $widgets(entry) selection range 0 end
+    }
+
+    $widgets(this) close
+
+    return ""
+}
+
+# ::combobox::HandleScrollbar --
+# 
+#    causes the scrollbar of the dropdown list to appear or disappear
+#    based on the contents of the dropdown listbox
+#
+# Arguments:
+#
+#    w      widget pathname
+#    action  the action to perform on the scrollbar
+#
+# Returns:
+#
+#    an empty string
+
+proc ::combobox::HandleScrollbar {w {action "unknown"}} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+
+    if {$options(-height) == 0} {
+       set hlimit $options(-maxheight)
+    } else {
+       set hlimit $options(-height)
+    }              
+
+    switch $action {
+       "grow" {
+           if {$hlimit > 0 && [$widgets(listbox) size] > $hlimit} {
+               pack $widgets(vsb) -side right -fill y -expand n
+           }
+       }
+
+       "shrink" {
+           if {$hlimit > 0 && [$widgets(listbox) size] <= $hlimit} {
+               pack forget $widgets(vsb)
+           }
+       }
+
+       "crop" {
+           # this means the window was cropped and we definitely 
+           # need a scrollbar no matter what the user wants
+           pack $widgets(vsb) -side right -fill y -expand n
+       }
+
+       default {
+           if {$hlimit > 0 && [$widgets(listbox) size] > $hlimit} {
+               pack $widgets(vsb) -side right -fill y -expand n
+           } else {
+               pack forget $widgets(vsb)
+           }
+       }
+    }
+
+    return ""
+}
+
+# ::combobox::ComputeGeometry --
+#
+#    computes the geometry of the popup list based on the size of the
+#    combobox...
+#
+# Arguments:
+#
+#    w    widget pathname
+#
+# Returns:
+#
+#    the desired geometry of the listbox
+
+proc ::combobox::ComputeGeometry {w} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+    
+    if {$options(-height) == 0 && $options(-maxheight) != "0"} {
+       # if this is the case, count the items and see if
+       # it exceeds our maxheight. If so, set the listbox
+       # size to maxheight...
+       set nitems [$widgets(listbox) size]
+       if {$nitems > $options(-maxheight)} {
+           # tweak the height of the listbox
+           $widgets(listbox) configure -height $options(-maxheight)
+       } else {
+           # un-tweak the height of the listbox
+           $widgets(listbox) configure -height 0
+       }
+       update idletasks
+    }
+
+    # compute height and width of the dropdown list
+    set bd [$widgets(popup) cget -borderwidth]
+    set height [expr {[winfo reqheight $widgets(popup)] + $bd + $bd}]
+    set width [winfo width $widgets(this)]
+
+    # figure out where to place it on the screen, trying to take into
+    # account we may be running under some virtual window manager
+    set screenWidth  [winfo screenwidth $widgets(this)]
+    set screenHeight [winfo screenheight $widgets(this)]
+    set rootx       [winfo rootx $widgets(this)]
+    set rooty       [winfo rooty $widgets(this)]
+    set vrootx      [winfo vrootx $widgets(this)]
+    set vrooty      [winfo vrooty $widgets(this)]
+
+    # the x coordinate is simply the rootx of our widget, adjusted for
+    # the virtual window. We won't worry about whether the window will
+    # be offscreen to the left or right -- we want the illusion that it
+    # is part of the entry widget, so if part of the entry widget is off-
+    # screen, so will the list. If you want to change the behavior,
+    # simply change the if statement... (and be sure to update this
+    # comment!)
+    set x  [expr {$rootx + $vrootx}]
+    if {0} { 
+       set rightEdge [expr {$x + $width}]
+       if {$rightEdge > $screenWidth} {
+           set x [expr {$screenWidth - $width}]
+       }
+       if {$x < 0} {set x 0}
+    }
+
+    # the y coordinate is the rooty plus vrooty offset plus 
+    # the height of the static part of the widget plus 1 for a 
+    # tiny bit of visual separation...
+    set y [expr {$rooty + $vrooty + [winfo reqheight $widgets(this)] + 1}]
+    set bottomEdge [expr {$y + $height}]
+
+    if {$bottomEdge >= $screenHeight} {
+       # ok. Fine. Pop it up above the entry widget isntead of
+       # below.
+       set y [expr {($rooty - $height - 1) + $vrooty}]
+
+       if {$y < 0} {
+           # this means it extends beyond our screen. How annoying.
+           # Now we'll try to be real clever and either pop it up or
+           # down, depending on which way gives us the biggest list. 
+           # then, we'll trim the list to fit and force the use of
+           # a scrollbar
+
+           # (sadly, for windows users this measurement doesn't
+           # take into consideration the height of the taskbar,
+           # but don't blame me -- there isn't any way to detect
+           # it or figure out its dimensions. The same probably
+           # applies to any window manager with some magic windows
+           # glued to the top or bottom of the screen)
+
+           if {$rooty > [expr {$screenHeight / 2}]} {
+               # we are in the lower half of the screen -- 
+               # pop it up. Y is zero; that parts easy. The height
+               # is simply the y coordinate of our widget, minus
+               # a pixel for some visual separation. The y coordinate
+               # will be the topof the screen.
+               set y 1
+               set height [expr {$rooty - 1 - $y}]
+
+           } else {
+               # we are in the upper half of the screen --
+               # pop it down
+               set y [expr {$rooty + $vrooty + \
+                       [winfo reqheight $widgets(this)] + 1}]
+               set height [expr {$screenHeight - $y}]
+
+           }
+
+           # force a scrollbar
+           HandleScrollbar $widgets(this) crop
+       }          
+    }
+
+    if {$y < 0} {
+       # hmmm. Bummer.
+       set y 0
+       set height $screenheight
+    }
+
+    set geometry [format "=%dx%d+%d+%d" $width $height $x $y]
+
+    return $geometry
+}
+
+# ::combobox::DoInternalWidgetCommand --
+#
+#    perform an internal widget command, then mung any error results
+#    to look like it came from our megawidget. A lot of work just to
+#    give the illusion that our megawidget is an atomic widget
+#
+# Arguments:
+#
+#    w          widget pathname
+#    subwidget  pathname of the subwidget 
+#    command    subwidget command to be executed
+#    args       arguments to the command
+#
+# Returns:
+#
+#    The result of the subwidget command, or an error
+
+proc ::combobox::DoInternalWidgetCommand {w subwidget command args} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+
+    set subcommand $command
+    set command [concat $widgets($subwidget) $command $args]
+    if {[catch $command result]} {
+       # replace the subwidget name with the megawidget name
+       regsub $widgets($subwidget) $result $widgets(this) result
+
+       # replace specific instances of the subwidget command
+       # with out megawidget command
+       switch $subwidget,$subcommand {
+           listbox,index  {regsub "index"  $result "list index"  result}
+           listbox,insert {regsub "insert" $result "list insert" result}
+           listbox,delete {regsub "delete" $result "list delete" result}
+           listbox,get    {regsub "get"    $result "list get"    result}
+           listbox,size   {regsub "size"   $result "list size"   result}
+       }
+       error $result
+
+    } else {
+       return $result
+    }
+}
+
+
+# ::combobox::WidgetProc --
+#
+#    This gets uses as the widgetproc for an combobox widget. 
+#    Notice where the widget is created and you'll see that the
+#    actual widget proc merely evals this proc with all of the
+#    arguments intact.
+#
+#    Note that some widget commands are defined "inline" (ie:
+#    within this proc), and some do most of their work in 
+#    separate procs. This is merely because sometimes it was
+#    easier to do it one way or the other.
+#
+# Arguments:
+#
+#    w        widget pathname
+#    command   widget subcommand
+#    args      additional arguments; varies with the subcommand
+#
+# Results:
+#
+#    Performs the requested widget command
+
+proc ::combobox::WidgetProc {w command args} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+    upvar ::combobox::${w}::oldFocus oldFocus
+    upvar ::combobox::${w}::oldFocus oldGrab
+
+    set command [::combobox::Canonize $w command $command]
+
+    # this is just shorthand notation...
+    set doWidgetCommand \
+           [list ::combobox::DoInternalWidgetCommand $widgets(this)]
+
+    if {$command == "list"} {
+       # ok, the next argument is a list command; we'll 
+       # rip it from args and append it to command to
+       # create a unique internal command
+       #
+       # NB: because of the sloppy way we are doing this,
+       # we'll also let the user enter our secret command
+       # directly (eg: listinsert, listdelete), but we
+       # won't document that fact
+       set command "list-[lindex $args 0]"
+       set args [lrange $args 1 end]
+    }
+
+    set result ""
+
+    # many of these commands are just synonyms for specific
+    # commands in one of the subwidgets. We'll get them out
+    # of the way first, then do the custom commands.
+    switch $command {
+       bbox -
+       delete -
+       get -
+       icursor -
+       index -
+       insert -
+       scan -
+       selection -
+       xview {
+           set result [eval $doWidgetCommand entry $command $args]
+       }
+       list-get        {set result [eval $doWidgetCommand listbox get $args]}
+       list-index      {set result [eval $doWidgetCommand listbox index $args]}
+       list-size       {set result [eval $doWidgetCommand listbox size $args]}
+
+       select {
+           if {[llength $args] == 1} {
+               set index [lindex $args 0]
+               set result [Select $widgets(this) $index]
+           } else {
+               error "usage: $w select index"
+           }
+       }
+
+       subwidget {
+           set knownWidgets [list button entry listbox popup vsb]
+           if {[llength $args] == 0} {
+               return $knownWidgets
+           }
+
+           set name [lindex $args 0]
+           if {[lsearch $knownWidgets $name] != -1} {
+               set result $widgets($name)
+           } else {
+               error "unknown subwidget $name"
+           }
+       }
+
+       curselection {
+           set result [eval $doWidgetCommand listbox curselection]
+       }
+
+       list-insert {
+           eval $doWidgetCommand listbox insert $args
+           set result [HandleScrollbar $w "grow"]
+       }
+
+       list-delete {
+           eval $doWidgetCommand listbox delete $args
+           set result [HandleScrollbar $w "shrink"]
+       }
+
+       toggle {
+           # ignore this command if the widget is disabled...
+           if {$options(-state) == "disabled"} return
+
+           # pops down the list if it is not, hides it
+           # if it is...
+           if {[winfo ismapped $widgets(popup)]} {
+               set result [$widgets(this) close]
+           } else {
+               set result [$widgets(this) open]
+           }
+       }
+
+       open {
+
+           # if this is an editable combobox, the focus should
+           # be set to the entry widget
+           if {$options(-editable)} {
+               focus $widgets(entry)
+               $widgets(entry) select range 0 end
+               $widgets(entry) icur end
+           }
+
+           # if we are disabled, we won't allow this to happen
+           if {$options(-state) == "disabled"} {
+               return 0
+           }
+
+           # compute the geometry of the window to pop up, and set
+           # it, and force the window manager to take notice
+           # (even if it is not presently visible).
+           #
+           # this isn't strictly necessary if the window is already
+           # mapped, but we'll go ahead and set the geometry here
+           # since its harmless and *may* actually reset the geometry
+           # to something better in some weird case.
+           set geometry [::combobox::ComputeGeometry $widgets(this)]
+           wm geometry $widgets(popup) $geometry
+           update idletasks
+
+           # if we are already open, there's nothing else to do
+           if {[winfo ismapped $widgets(popup)]} {
+               return 0
+           }
+
+           # save the widget that currently has the focus; we'll restore
+           # the focus there when we're done
+           set oldFocus [focus]
+
+           # ok, tweak the visual appearance of things and 
+           # make the list pop up
+           $widgets(button) configure -relief sunken
+           raise $widgets(popup) [winfo parent $widgets(this)]
+           wm deiconify $widgets(popup) 
+
+           # force focus to the entry widget so we can handle keypress
+           # events for traversal
+           focus -force $widgets(entry)
+
+           # select something by default, but only if its an
+           # exact match...
+           ::combobox::Find $widgets(this) 1
+
+           # save the current grab state for the display containing
+           # this widget. We'll restore it when we close the dropdown
+           # list
+           set status "none"
+           set grab [grab current $widgets(this)]
+           if {$grab != ""} {set status [grab status $grab]}
+           set oldGrab [list $grab $status]
+           unset grab status
+
+           # *gasp* do a global grab!!! Mom always told not to
+           # do things like this, but these are desparate times.
+           grab -global $widgets(this)
+
+           # fake the listbox into thinking it has focus. This is 
+           # necessary to get scanning initialized properly in the
+           # listbox.
+           event generate $widgets(listbox) <B1-Enter>
+
+           return 1
+       }
+
+       close {
+           # if we are already closed, don't do anything...
+           if {![winfo ismapped $widgets(popup)]} {
+               return 0
+           }
+
+           # restore the focus and grab, but ignore any errors...
+           # we're going to be paranoid and release the grab before
+           # trying to set any other grab because we really really
+           # really want to make sure the grab is released.
+           catch {focus $oldFocus} result
+           catch {grab release $widgets(this)}
+           catch {
+               set status [lindex $oldGrab 1]
+               if {$status == "global"} {
+                   grab -global [lindex $oldGrab 0]
+               } elseif {$status == "local"} {
+                   grab [lindex $oldGrab 0]
+               }
+               unset status
+           }
+
+           # hides the listbox
+           $widgets(button) configure -relief raised
+           wm withdraw $widgets(popup) 
+
+           # select the data in the entry widget. Not sure
+           # why, other than observation seems to suggest that's
+           # what windows widgets do.
+           set editable [::combobox::GetBoolean $options(-editable)]
+           if {$editable} {
+               $widgets(entry) selection range 0 end
+               $widgets(button) configure -relief raised
+           }
+
+
+           # magic tcl stuff (see tk.tcl in the distribution 
+           # lib directory)
+           tkCancelRepeat
+
+           return 1
+       }
+
+       cget {
+           if {[llength $args] != 1} {
+               error "wrong # args: should be $w cget option"
+           }
+           set opt [::combobox::Canonize $w option [lindex $args 0]]
+
+           if {$opt == "-value"} {
+               set result [$widget(entry) get]
+           } else {
+               set result $options($opt)
+           }
+       }
+
+       configure {
+           set result [eval ::combobox::Configure {$w} $args]
+       }
+
+       default {
+           error "bad option \"$command\""
+       }
+    }
+
+    return $result
+}
+
+# ::combobox::Configure --
+#
+#    Implements the "configure" widget subcommand
+#
+# Arguments:
+#
+#    w     widget pathname
+#    args   zero or more option/value pairs (or a single option)
+#
+# Results:
+#    
+#    Performs typcial "configure" type requests on the widget
+
+proc ::combobox::Configure {w args} {
+    variable widgetOptions
+    variable defaultEntryCursor
+
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+
+    if {[llength $args] == 0} {
+       # hmmm. User must be wanting all configuration information
+       # note that if the value of an array element is of length
+       # one it is an alias, which needs to be handled slightly
+       # differently
+       set results {}
+       foreach opt [lsort [array names widgetOptions]] {
+           if {[llength $widgetOptions($opt)] == 1} {
+               set alias $widgetOptions($opt)
+               set optName $widgetOptions($alias)
+               lappend results [list $opt $optName]
+           } else {
+               set optName  [lindex $widgetOptions($opt) 0]
+               set optClass [lindex $widgetOptions($opt) 1]
+               set default [option get $w $optName $optClass]
+               lappend results [list $opt $optName $optClass \
+                       $default $options($opt)]
+           }
+       }
+
+       return $results
+    }
+    
+    # one argument means we are looking for configuration
+    # information on a single option
+    if {[llength $args] == 1} {
+       set opt [::combobox::Canonize $w option [lindex $args 0]]
+
+       set optName  [lindex $widgetOptions($opt) 0]
+       set optClass [lindex $widgetOptions($opt) 1]
+       set default [option get $w $optName $optClass]
+       set results [list $opt $optName $optClass \
+               $default $options($opt)]
+       return $results
+    }
+
+    # if we have an odd number of values, bail. 
+    if {[expr {[llength $args]%2}] == 1} {
+       # hmmm. An odd number of elements in args
+       error "value for \"[lindex $args end]\" missing"
+    }
+    
+    # Great. An even number of options. Let's make sure they 
+    # are all valid before we do anything. Note that Canonize
+    # will generate an error if it finds a bogus option; otherwise
+    # it returns the canonical option name
+    foreach {name value} $args {
+       set name [::combobox::Canonize $w option $name]
+       set opts($name) $value
+    }
+
+    # process all of the configuration options
+    # some (actually, most) options require us to
+    # do something, like change the attributes of
+    # a widget or two. Here's where we do that...
+    foreach option [array names opts] {
+       set newValue $opts($option)
+       if {[info exists options($option)]} {
+           set oldValue $options($option)
+       }
+
+       switch -- $option {
+           -background {
+               $widgets(frame)   configure -background $newValue
+               $widgets(entry)   configure -background $newValue
+               $widgets(listbox) configure -background $newValue
+               $widgets(vsb)     configure -background $newValue
+               $widgets(vsb)     configure -troughcolor $newValue
+               set options($option) $newValue
+           }
+
+           -borderwidth {
+               $widgets(frame) configure -borderwidth $newValue
+               set options($option) $newValue
+           }
+
+           -command {
+               # nothing else to do...
+               set options($option) $newValue
+           }
+
+           -commandstate {
+               # do some value checking...
+               if {$newValue != "normal" && $newValue != "disabled"} {
+                   set options($option) $oldValue
+                   set message "bad state value \"$newValue\";"
+                   append message " must be normal or disabled"
+                   error $message
+               }
+               set options($option) $newValue
+           }
+
+           -cursor {
+               $widgets(frame) configure -cursor $newValue
+               $widgets(entry) configure -cursor $newValue
+               $widgets(listbox) configure -cursor $newValue
+               set options($option) $newValue
+           }
+
+           -editable {
+               if {$newValue} {
+                   # it's editable...
+                   $widgets(entry) configure \
+                           -state normal \
+                           -cursor $defaultEntryCursor
+               } else {
+                   $widgets(entry) configure \
+                           -state disabled \
+                           -cursor $options(-cursor)
+               }
+               set options($option) $newValue
+           }
+
+           -font {
+               $widgets(entry) configure -font $newValue
+               $widgets(listbox) configure -font $newValue
+               set options($option) $newValue
+           }
+
+           -foreground {
+               $widgets(entry)   configure -foreground $newValue
+               $widgets(button)  configure -foreground $newValue
+               $widgets(listbox) configure -foreground $newValue
+               set options($option) $newValue
+           }
+
+           -height {
+               $widgets(listbox) configure -height $newValue
+               HandleScrollbar $w
+               set options($option) $newValue
+           }
+
+           -highlightbackground {
+               $widgets(frame) configure -highlightbackground $newValue
+               set options($option) $newValue
+           }
+
+           -highlightcolor {
+               $widgets(frame) configure -highlightcolor $newValue
+               set options($option) $newValue
+           }
+
+           -highlightthickness {
+               $widgets(frame) configure -highlightthickness $newValue
+               set options($option) $newValue
+           }
+           
+           -image {
+               if {[string length $newValue] > 0} {
+                   $widgets(button) configure -image $newValue
+               } else {
+                   $widgets(button) configure -image ::combobox::bimage
+               }
+               set options($option) $newValue
+           }
+
+           -maxheight {
+               # ComputeGeometry may dork with the actual height
+               # of the listbox, so let's undork it
+               $widgets(listbox) configure -height $options(-height)
+               HandleScrollbar $w
+               set options($option) $newValue
+           }
+
+           -relief {
+               $widgets(frame) configure -relief $newValue
+               set options($option) $newValue
+           }
+
+           -selectbackground {
+               $widgets(entry) configure -selectbackground $newValue
+               $widgets(listbox) configure -selectbackground $newValue
+               set options($option) $newValue
+           }
+
+           -selectborderwidth {
+               $widgets(entry) configure -selectborderwidth $newValue
+               $widgets(listbox) configure -selectborderwidth $newValue
+               set options($option) $newValue
+           }
+
+           -selectforeground {
+               $widgets(entry) configure -selectforeground $newValue
+               $widgets(listbox) configure -selectforeground $newValue
+               set options($option) $newValue
+           }
+
+           -state {
+               if {$newValue == "normal"} {
+                   # it's enabled
+                   set editable [::combobox::GetBoolean \
+                           $options(-editable)]
+                   if {$editable} {
+                       $widgets(entry) configure -state normal
+                       $widgets(entry) configure -takefocus 1
+                   }
+               } elseif {$newValue == "disabled"}  {
+                   # it's disabled
+                   $widgets(entry) configure -state disabled
+                   $widgets(entry) configure -takefocus 0
+
+               } else {
+                   set options($option) $oldValue
+                   set message "bad state value \"$newValue\";"
+                   append message " must be normal or disabled"
+                   error $message
+               }
+
+               set options($option) $newValue
+           }
+
+           -takefocus {
+               $widgets(entry) configure -takefocus $newValue
+               set options($option) $newValue
+           }
+
+           -textvariable {
+               $widgets(entry) configure -textvariable $newValue
+               set options($option) $newValue
+           }
+
+           -value {
+               ::combobox::SetValue $widgets(this) $newValue
+               set options($option) $newValue
+           }
+
+           -width {
+               $widgets(entry) configure -width $newValue
+               $widgets(listbox) configure -width $newValue
+               set options($option) $newValue
+           }
+
+           -xscrollcommand {
+               $widgets(entry) configure -xscrollcommand $newValue
+               set options($option) $newValue
+           }
+
+       }
+    }
+}
+
+# ::combobox::VTrace --
+#
+#    this proc is called whenever the user changes the value of 
+#    the -textvariable associated with a widget
+#
+# Arguments:
+#
+#    w         widget pathname
+#    args      standard stuff from a variable trace
+#
+# Returns:
+#
+#    Empty String
+
+proc ::combobox::VTrace {w args} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+    upvar ::combobox::${w}::ignoreTrace ignoreTrace
+
+    if {[info exists ignoreTrace]} return
+    ::combobox::SetValue $widgets(this) [set ::$options(-textvariable)]
+
+    return ""
+}
+
+# ::combobox::SetValue --
+#
+#    sets the value of the combobox and calls the -command, 
+#    if defined
+#
+# Arguments:
+#
+#    w         widget pathname
+#    newValue  the new value of the combobox
+#
+# Returns
+#
+#    Empty string
+
+proc ::combobox::SetValue {w newValue} {
+
+    upvar ::combobox::${w}::widgets    widgets
+    upvar ::combobox::${w}::options    options
+    upvar ::combobox::${w}::ignoreTrace ignoreTrace
+    upvar ::combobox::${w}::oldValue   oldValue
+
+    if {[info exists options(-textvariable)] \
+           && [string length $options(-textvariable)] > 0} {
+       set variable ::$options(-textvariable)
+       set $variable $newValue
+    } else {
+       set oldstate [$widgets(entry) cget -state]
+       $widgets(entry) configure -state normal
+       $widgets(entry) delete 0 end
+       $widgets(entry) insert 0 $newValue
+       $widgets(entry) configure -state $oldstate
+    }
+
+    # set our internal textvariable; this will cause any public
+    # textvariable (ie: defined by the user) to be updated as
+    # well
+#    set ::combobox::${w}::entryTextVariable $newValue
+
+    # redefine our concept of the "old value". Do it before running
+    # any associated command so we can be sure it happens even
+    # if the command somehow fails.
+    set oldValue $newValue
+
+
+    # call the associated command. The proc will handle whether or 
+    # not to actually call it, and with what args
+    CallCommand $w $newValue
+
+    return ""
+}
+
+# ::combobox::CallCommand --
+#
+#   calls the associated command, if any, appending the new
+#   value to the command to be called.
+#
+# Arguments:
+#
+#    w        widget pathname
+#    newValue  the new value of the combobox
+#
+# Returns
+#
+#    empty string
+
+proc ::combobox::CallCommand {w newValue} {
+    upvar ::combobox::${w}::widgets widgets
+    upvar ::combobox::${w}::options options
+    
+    # call the associated command, if defined and -commandstate is
+    # set to "normal"
+    if {$options(-commandstate) == "normal" && \
+           [string length $options(-command)] > 0} {
+       set args [list $widgets(this) $newValue]
+       uplevel \#0 $options(-command) $args
+    }
+}
+
+
+# ::combobox::GetBoolean --
+#
+#     returns the value of a (presumably) boolean string (ie: it should
+#     do the right thing if the string is "yes", "no", "true", 1, etc
+#
+# Arguments:
+#
+#     value      value to be converted 
+#     errorValue  a default value to be returned in case of an error
+#
+# Returns:
+#
+#     a 1 or zero, or the value of errorValue if the string isn't
+#     a proper boolean value
+
+proc ::combobox::GetBoolean {value {errorValue 1}} {
+    if {[catch {expr {([string trim $value])?1:0}} res]} {
+       return $errorValue
+    } else {
+       return $res
+    }
+}
+
+# ::combobox::convert --
+#
+#     public routine to convert %x, %y and %W binding substitutions.
+#     Given an x, y and or %W value relative to a given widget, this
+#     routine will convert the values to be relative to the combobox
+#     widget. For example, it could be used in a binding like this:
+#
+#     bind .combobox <blah> {doSomething [::combobox::convert %W -x %x]}
+#
+#     Note that this procedure is *not* exported, but is indented for
+#     public use. It is not exported because the name could easily 
+#     clash with existing commands. 
+#
+# Arguments:
+#
+#     w     a widget path; typically the actual result of a %W 
+#          substitution in a binding. It should be either a
+#          combobox widget or one of its subwidgets
+#
+#     args  should one or more of the following arguments or 
+#          pairs of arguments:
+#
+#          -x <x>      will convert the value <x>; typically <x> will
+#                      be the result of a %x substitution
+#          -y <y>      will convert the value <y>; typically <y> will
+#                      be the result of a %y substitution
+#          -W (or -w)  will return the name of the combobox widget
+#                      which is the parent of $w
+#
+# Returns:
+#
+#     a list of the requested values. For example, a single -w will
+#     result in a list of one items, the name of the combobox widget.
+#     Supplying "-x 10 -y 20 -W" (in any order) will return a list of
+#     three values: the converted x and y values, and the name of 
+#     the combobox widget.
+
+proc ::combobox::convert {w args} {
+    set result {}
+    if {![winfo exists $w]} {
+       error "window \"$w\" doesn't exist"
+    }
+
+    while {[llength $args] > 0} {
+       set option [lindex $args 0]
+       set args [lrange $args 1 end]
+
+       switch -exact -- $option {
+           -x {
+               set value [lindex $args 0]
+               set args [lrange $args 1 end]
+               set win $w
+               while {[winfo class $win] != "Combobox"} {
+                   incr value [winfo x $win]
+                   set win [winfo parent $win]
+                   if {$win == "."} break
+               }
+               lappend result $value
+           }
+
+           -y {
+               set value [lindex $args 0]
+               set args [lrange $args 1 end]
+               set win $w
+               while {[winfo class $win] != "Combobox"} {
+                   incr value [winfo y $win]
+                   set win [winfo parent $win]
+                   if {$win == "."} break
+               }
+               lappend result $value
+           }
+
+           -w -
+           -W {
+               set win $w
+               while {[winfo class $win] != "Combobox"} {
+                   set win [winfo parent $win]
+                   if {$win == "."} break;
+               }
+               lappend result $win
+           }
+       }
+    }
+    return $result
+}
+
+# ::combobox::Canonize --
+#
+#    takes a (possibly abbreviated) option or command name and either 
+#    returns the canonical name or an error
+#
+# Arguments:
+#
+#    w       widget pathname
+#    object   type of object to canonize; must be one of "command",
+#            "option", "scan command" or "list command"
+#    opt      the option (or command) to be canonized
+#
+# Returns:
+#
+#    Returns either the canonical form of an option or command,
+#    or raises an error if the option or command is unknown or
+#    ambiguous.
+
+proc ::combobox::Canonize {w object opt} {
+    variable widgetOptions
+    variable columnOptions
+    variable widgetCommands
+    variable listCommands
+    variable scanCommands
+
+    switch $object {
+       command {
+           if {[lsearch -exact $widgetCommands $opt] >= 0} {
+               return $opt
+           }
+
+           # command names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the commands in a temporary array so
+           # we can use [array names]
+           set list $widgetCommands
+           foreach element $list {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+
+       {list command} {
+           if {[lsearch -exact $listCommands $opt] >= 0} {
+               return $opt
+           }
+
+           # command names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the commands in a temporary array so
+           # we can use [array names]
+           set list $listCommands
+           foreach element $list {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+
+       {scan command} {
+           if {[lsearch -exact $scanCommands $opt] >= 0} {
+               return $opt
+           }
+
+           # command names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the commands in a temporary array so
+           # we can use [array names]
+           set list $scanCommands
+           foreach element $list {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+
+       option {
+           if {[info exists widgetOptions($opt)] \
+                   && [llength $widgetOptions($opt)] == 2} {
+               return $opt
+           }
+           set list [array names widgetOptions]
+           set matches [array names widgetOptions ${opt}*]
+       }
+
+    }
+
+    if {[llength $matches] == 0} {
+       set choices [HumanizeList $list]
+       error "unknown $object \"$opt\"; must be one of $choices"
+
+    } elseif {[llength $matches] == 1} {
+       set opt [lindex $matches 0]
+
+       # deal with option aliases
+       switch $object {
+           option {
+               set opt [lindex $matches 0]
+               if {[llength $widgetOptions($opt)] == 1} {
+                   set opt $widgetOptions($opt)
+               }
+           }
+       }
+
+       return $opt
+
+    } else {
+       set choices [HumanizeList $list]
+       error "ambiguous $object \"$opt\"; must be one of $choices"
+    }
+}
+
+# ::combobox::HumanizeList --
+#
+#    Returns a human-readable form of a list by separating items
+#    by columns, but separating the last two elements with "or"
+#    (eg: foo, bar or baz)
+#
+# Arguments:
+#
+#    list    a valid tcl list
+#
+# Results:
+#
+#    A string which as all of the elements joined with ", " or 
+#    the word " or "
+
+proc ::combobox::HumanizeList {list} {
+
+    if {[llength $list] == 1} {
+       return [lindex $list 0]
+    } else {
+       set list [lsort $list]
+       set secondToLast [expr {[llength $list] -2}]
+       set most [lrange $list 0 $secondToLast]
+       set last [lindex $list end]
+
+       return "[join $most {, }] or $last"
+    }
+}
+
+# end of combobox.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/tkwidgets/ibrowser.tcl b/lib/maracasVisuLib/src/interface/tcl/tkwidgets/ibrowser.tcl
new file mode 100644 (file)
index 0000000..a373a56
--- /dev/null
@@ -0,0 +1,1453 @@
+#*************************************************************************
+#*                                  *                                    *
+#* NAME     : ibrowser.tcl          * PROJECT  : MARACAS                 *
+#* AUTHOR   : Leonardo Flórez/Kyron * TYPE     : TCL/TK widget def.      *
+#* VERSION  : v2.0                  * CREATION : 06/05/2001              *
+#* LANGUAGE : TCL                   * REVISION : 16/07/2001              *
+#*                                  *                                    *
+#*************************************************************************
+#*                                                                       *
+#*  Description : This file defines a new TCL/TK widget that allows the  *
+#*                user to browse a serie of image thumbnails. It has a   *
+#*                dinamical scroll bar, so, don't worry about use one.   *
+#*                                                                       *
+#*  The basic use of this widget is:                                     *
+#*                                                                       *
+#*      1. Create a new widget: "ibrowser <name> <options>"              *
+#*         Options given are a list of '-<option> <value>' pairs.        *
+#*         Supported options are:                                        *
+#*         +-----------------+--------------------------------------+    *
+#*         | OPTION          | DESCRIPTION                          |    *
+#*         +-----------------+--------------------------------------+    *
+#*         | -background     | Background color                     |    *
+#*         | -borderwidth    | Border width                         |    *
+#*         | -closeenough    | Proximity value                      |    *
+#*         +-----------------+--------------------------------------+    *
+#*         | -cache          | Indicates if ibrowser must save real |    *
+#*         |                 | images.                              |    *
+#*         | -cursor         | Cursor value                         |    *
+#*         | -fontcolor      | Font color                           |    *
+#*         +-----------------+--------------------------------------+    *
+#*         | -gap            | Distance between thumbnails          |    *
+#*         | -height         | Height of widget                     |    *
+#*         | -multisel       | Allows multiselection                |    *
+#*         +-----------------+--------------------------------------+    *
+#*         | -primarycolor   | Primary selection color              |    *
+#*         | -relief         | Type of border                       |    *
+#*         | -secondarycolor | Secondary selection color            |    *
+#*         +-----------------+--------------------------------------+    *
+#*         | -takefocus      | Indicates if widget have focus       |    *
+#*         | -thumbheight    | Height of thumbnails                 |    *
+#*         | -thumbwidth     | Width of thumbnails                  |    *
+#*         +-----------------+--------------------------------------+    *
+#*         | -width          | Width of widget                      |    *
+#*         +-----------------+--------------------------------------+    *
+#*                                                                       *
+#*      2. Pack this new widget in your hierarchy:                       *
+#*         (pack/place/grid) <name> <pack options>                       *
+#*                                                                       *
+#*      3. Interact with the new widget by using their sub-commands      *
+#*         interface. Sub-commands defined are:                          *
+#*         add, cget, configure, curselection, delete, find, lastimage,  *
+#*         select, size.                                                 *
+#*                                                                       *
+#*      4. Optional: use the <<AfterSelectImage>> event definition to    *
+#*         grab mouse interaction. Mouse events supported are:           *
+#*          Button1       = Basic single selection                       *
+#*          Button2       = Multiple selection                           *
+#*          Button3       = Multiple selection                           *
+#*          Shift+Button1 = Multiple selection                           *
+#*                                                                       *
+#*************************************************************************
+#*                                                                       *
+#*  USED MODULES :                                                       *
+#*                     TK >= v8.0                                        *
+#*                                                                       *
+#*************************************************************************
+#*                                                                       *
+#* REVISIONS :                                                           *
+#* (NOTE: Please, don't let this file became a mess. ;-) )               *
+#*                                                                       *
+#* +------------+----------------+-------------------------------------+ *
+#* | DATE       | AUTHOR         | DESCRIPTION                         | *
+#* +------------+----------------+-------------------------------------+ *
+#* | 06/05/2001 | Kyron          | Initial implementation.             | *
+#* +------------+----------------+-------------------------------------+ *
+#* | 16/07/2001 | Kyron          | Documentation & conflicts revision. | *
+#* +------------+----------------+-------------------------------------+ *
+#*                                                                       *
+#*************************************************************************
+
+package require Tk 8.0
+
+#* NAMESPACE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser (namespace)                                                *
+#*                                                                       *
+#* DESCRIPTION : Global namespace that contains all ibrowser widgets in  *
+#*               current interpreter (actual TCL work instance).         *
+#*                                                                       *
+#* SYNTAX : -NONE-                                                       *
+#*                                                                       *
+#* RETURN :                                                              *
+#*        EXPORTS : proc ibrowser { name options }                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*            Namespace components :                                     *
+#*              widgetOptions  : list. List of supported options.        *
+#*              widgetCommands : list. List of supported sub-commands.   *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+package provide ibrowser 2.0
+namespace eval ::ibrowser {
+
+    # public interface
+    namespace export ibrowser
+    
+    # variables
+    variable widgetOptions
+    variable widgetCommands
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::ibrowser (procedure)                                      *
+#*                                                                       *
+#* DESCRIPTION : Creator of new widgets. Call it in an TK hierarchy      *
+#*               creation process.                                       *
+#*                                                                       *
+#* SYNTAX : ibrowser <name> -<option1> <value1> ... -<optionn> <valuen>  *
+#*                                                                       *
+#* RETURN : New widget name, if success.                                 *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      name : string. Name for the new widget. To use it in a TK widget *
+#*                     hierarchy, this name should be ".<f1>.<f2>...<n>" *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::ibrowser { name args } {
+
+    # Namespace variables used in this procedure
+    upvar ::ibrowser::widgetOptions widgetOptions
+
+    # If global namespace doesn't exists yet then initialize it
+    if { ![ info exists widgetOptions ] } { ::ibrowser::initIbrowser }
+
+    # Given name exists?. If so, raise an error and finish
+    if { [ winfo exists $name ] } {
+        error "Widget \"$name\" already exists."
+    }
+
+    # Create the new command and return success
+    set name [ eval ::ibrowser::buildIbrowser $name $args ]
+    return $name
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::initIbrowser (procedure)                                  *
+#*                                                                       *
+#* DESCRIPTION : Initializes the class manager, i.e., creates the global *
+#*               namespace.                                              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::initIbrowser                                     *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      -NONE-                                                           *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::initIbrowser { } {
+
+    # Namespace variables used in this procedure
+    upvar ::ibrowser::widgetOptions  widgetOptions
+    upvar ::ibrowser::widgetCommands widgetCommands
+
+    # All posible options for the widget
+    array set widgetOptions [ list                     \
+        -background     { background     Background  } \
+        -borderwidth    { borderWidth    BorderWidth } \
+        -closeenough    { closeEnough    CloseEnough } \
+        -cache          { cache          Thumbnails  } \
+        -cursor         { cursor         Cursor      } \
+        -fontcolor      { fontColor      Thumbnails  } \
+        -gap            { gap            Thumbnails  } \
+        -height         { height         Height      } \
+        -multisel       { multiSel       Thumbnails  } \
+        -primarycolor   { primaryColor   Thumbnails  } \
+        -relief         { relief         Relief      } \
+        -secondarycolor { secondaryColor Thumbnails  } \
+        -takefocus      { takeFocus      TakeFocus   } \
+        -thumbheight    { thumbHeight    Thumbnails  } \
+        -thumbwidth     { thumbWidth     Thumbnails  } \
+        -width          { width          Width       } \
+    ]
+
+    # All posible commands for the widget
+    set widgetCommands [ list                    \
+        add     cget    configure   curselection \
+        delete  find    lastimage   select       \
+        size                                     \
+    ]
+
+    # New event definition
+    event add <<AfterSelectImage>> \
+        <ButtonPress-1>            \
+        <ButtonPress-2>            \
+        <ButtonPress-3>            \
+        <Shift-ButtonPress-1>
+
+    # Default initialization... only if Tk exists
+    if { [ lsearch -exact [ package names ] "Tk" ] != -1 } {
+
+        option add *Ibrowser.background      #c0c0c0 widgetDefault
+        option add *Ibrowser.borderWidth     0       widgetDefault
+        option add *Ibrowser.closeEnough     1.0     widgetDefault
+        option add *Ibrowser.cache           0       widgetDefault
+        option add *Ibrowser.cursor          {}      widgetDefault
+        option add *Ibrowser.fontColor       #ffff00 widgetDefault
+        option add *Ibrowser.gap             5       widgetDefault
+        option add *Ibrowser.height          100     widgetDefault
+        option add *Ibrowser.multiSel        0       widgetDefault
+        option add *Ibrowser.primaryColor    #ff0000 widgetDefault
+        option add *Ibrowser.relief          flat    widgetDefault
+        option add *Ibrowser.secondaryColor  #00ff00 widgetDefault
+        option add *Ibrowser.takeFocus       0       widgetDefault
+        option add *Ibrowser.thumbHeight     50      widgetDefault
+        option add *Ibrowser.thumbWidth      50      widgetDefault
+        option add *Ibrowser.width           100     widgetDefault
+
+    }
+
+    # set global bindings
+    ::ibrowser::setClassIbrowserBindings
+
+}                                                   
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::setClassIbrowserBindings (procedure)                      *
+#*                                                                       *
+#* DESCRIPTION : Default namespace bindings.                             *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::setClassIbrowserBindings                         *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      -NONE-                                                           *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::setClassIbrowserBindings { } {
+
+    bind Ibrowser <Destroy> [ list ::ibrowser::ibrowserDestroyHandler %W ]
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::buildIbrowser (procedure)                                 *
+#*                                                                       *
+#* DESCRIPTION : This does all of the work necessary to create a basic   *
+#*               ibrowser widget. Creates a new command (widget) with    *
+#*               the given name. Also creates a new namespace as a child *
+#*               namespace of ::ibrowser.                                *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : set wname [ ::ibrowser::buildIbrowser $name $options ]       *
+#*                                                                       *
+#* RETURN : New widget hierarchy name                                    *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. New widget name.                                  *
+#*      args : list. Option/value pairs list.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::buildIbrowser { w args } {
+
+    # Namespace variables used in this procedure
+    upvar ::ibrowser::widgetOptions widgetOptions
+
+    # Child namespace. There's one for each defined widget.
+    namespace eval ::ibrowser::$w {
+
+        variable this
+        variable options
+        variable widgets
+        variable currsel {}
+        variable lastsel {}
+        variable images  {}
+        variable nMaxX   0
+
+    }
+
+    # import variables, for programming facilities
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::options options
+
+    # Main frame that contains an ibrowser
+    set widgets(this) [     \
+        frame $w            \
+            -class Ibrowser \
+            -takefocus 0    \
+            -relief flat    \
+            -borderwidth 0  \
+    ]
+
+    # Canvas that contains all graphical data
+    set widgets(canvas) [ canvas $w.canvas -takefocus 1 ]
+
+    # Dinamical vertical scroll
+    set widgets(scroll) ""
+
+    # Set default values
+    foreach name [ array names widgetOptions ] {
+
+        set optName  [ lindex $widgetOptions($name) 0 ]
+        set optClass [ lindex $widgetOptions($name) 1 ]
+        set value [ option get $w $optName $optClass ]
+        set options($name) $value
+
+    }
+
+    # set user values...
+    if { [ llength $args ] > 0 } { array set options $args }
+
+    # move the name to ibrowser class' namespace...
+    set widgets(frame) ::ibrowser::${w}::$w
+    rename ::$w $widgets(frame)
+
+    # set canvas options...
+    $widgets(canvas) configure -background  $options(-background)
+    $widgets(canvas) configure -borderwidth $options(-borderwidth)
+    $widgets(canvas) configure -closeenough $options(-closeenough)
+    $widgets(canvas) configure -cursor      $options(-cursor)
+    $widgets(canvas) configure -height      $options(-height)
+    $widgets(canvas) configure -relief      $options(-relief)
+    $widgets(canvas) configure -takefocus   $options(-takefocus)
+    $widgets(canvas) configure -width       $options(-width)
+
+    # pack the canvas...
+    pack $widgets(canvas) -fill both -expand 1
+
+    # local event binding stuff...
+    bind $widgets(canvas) <ButtonPress-1>       "::ibrowser::sFImage $widgets(this) %x %y"
+    bind $widgets(canvas) <Shift-ButtonPress-1> "::ibrowser::sLImage $widgets(this) %x %y"
+    bind $widgets(canvas) <ButtonPress-2>       "::ibrowser::sLImage $widgets(this) %x %y"
+    bind $widgets(canvas) <ButtonPress-3>       "::ibrowser::sLImage $widgets(this) %x %y"
+    bind $widgets(canvas) <Configure>           "::ibrowser::resize  $widgets(this) %w %h"
+
+    # >>>>>>>>>>>>>>>>>>> HERE, AT LAST, THE NEW COMMAND IS CREATED <<<<<<<<<<<<<<<<<< #
+    proc ::$w { command args } "eval ::ibrowser::ibrowserWidgetProc $w \$command \$args"
+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
+
+    # Last configuration stuff
+    if { [ catch "::ibrowser::configureIbrowser $widgets(this) [ array get options ]" error ] } {
+
+        catch { destroy $w }
+        error $error
+
+    }
+
+    # have fun ;-)
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::configureIbrowser (procedure)                             *
+#*                                                                       *
+#* DESCRIPTION : This does the configuration process, i.e., change of    *
+#*               any option.                                             *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::configureIbrowser $widget $options ]   *
+#*                                                                       *
+#* RETURN : All options, if args is empty. If length args == 1 then      *
+#*          returns current value. Empty string otherwise.               *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Option/value pairs list.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::configureIbrowser { w args } {
+
+    # For namespace access
+    upvar ::ibrowser::widgetOptions widgetOptions
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    # Sends all information to the user...
+    if { [ llength $args ] == 0 } {
+
+        set results {}
+        foreach opt [ lsort [ array names widgetOptions ] ] {
+
+            if { [ llength $widgetOptions($opt) ] == 1 } {
+
+                set alias $widgetOptions($opt)
+                set optName $widgetOptions($alias)
+                lappend results [ list $opt $optName ]
+
+            } else {
+
+                set optName     [ lindex $widgetOptions($opt) 0 ]
+                set optClass    [ lindex $widgetOptions($opt) 1 ]
+                set default     [ option get $w $optName $optClass ]
+                lappend results [ list $opt $optName $optClass $default $options($opt) ]
+
+            }
+
+        }
+        return $results
+
+    }
+
+    # or single information...
+    if { [ llength $args ] == 1 } {
+
+        set opt      [ ::ibrowser::canonizeIbrowser $w option [ lindex $args 0 ] ]
+        set optName  [ lindex $widgetOptions($opt) 0 ]
+        set optClass [ lindex $widgetOptions($opt) 1 ]
+        set default  [ option get $w $optName $optClass ]
+        set results  [ list $opt $optName $optClass $default $options($opt) ]
+        return $results
+
+    }
+
+    # check if the list is given in pairs
+    if { [ expr { [ llength $args ] % 2 } ] == 1 } {
+        error "some values for \"$args\" are missing"
+    }
+
+    # check if all given options exists...
+    foreach { name value } $args {
+
+        set name [ ::ibrowser::canonizeIbrowser $w option $name ]
+        set opts($name) $value
+
+    }
+
+    # and set values...
+    foreach option [ array names opts ] {
+
+        set newValue $opts($option)
+        switch -- $option {
+
+            -cache {
+
+                if { $newValue == 0 || $newValue == 1 } {
+                    set options(-cache) $newValue
+                } else { error "\"-cache\" option must be: 0/1" }
+
+            }
+            -multisel {
+
+                if { $newValue == 0 || $newValue == 1 } {
+                    set options(-multisel) $newValue
+                } else { error "\"-multisel\" option must be: 0/1" }
+
+            }
+            -gap {
+
+                set options(-gap) $newValue
+                set nMaxX [ expr int( floor ( $options(-width) / ( $options(-gap) + \
+                                                                   $options(-thumbwidth) \
+                                                                 ) \
+                                            ) \
+                                    ) \
+                ]
+                if { $nMaxX == 0 } {
+
+                    set options(-width) [ expr $options(-thumbwidth) + $options(-gap) ]
+                    set nMaxX [ expr int( floor ( $options(-width) / ( $options(-gap) + \
+                                                                       $options(-thumbwidth) \
+                                                                     ) \
+                                                ) \
+                                        ) \
+                    ]
+                    $widgets(canvas) configure -width $options(-width)
+
+                }
+
+            }
+            -thumbwidth {
+
+                set options(-thumbwidth) $newValue
+                set nMaxX [ expr int( floor ( $options(-width) / ( $options(-gap) + \
+                                                                   $options(-thumbwidth) \
+                                                                 ) \
+                                            ) \
+                                    ) \
+                ]
+                if { $nMaxX == 0 } {
+
+                    set options(-width) [ expr $options(-thumbwidth) + $options(-gap) ]
+                    set nMaxX [ expr int( floor ( $options(-width) / ( $options(-gap) + \
+                                                                       $options(-thumbwidth) \
+                                                                     ) \
+                                                ) \
+                                        ) \
+                    ]
+                    $widgets(canvas) configure -width $options(-width)
+
+                }
+
+            }
+            -fontcolor      { set options(-fontcolor)      $newValue }
+            -primarycolor   { set options(-primarycolor)   $newValue }
+            -secondarycolor { set options(-secondarycolor) $newValue }
+            -thumbheight    { set options(-thumbheight)    $newValue }
+            default         { eval "$widgets(canvas) configure $option $newValue" }
+
+        }
+
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::canonizeIbrowser (procedure)                              *
+#*                                                                       *
+#* DESCRIPTION : Takes a option or command and canonizes it. Returns     *
+#*               either the canonical form of an option or command, or   *
+#*               raises an error if the option or command is unknown or  *
+#*               ambiguous.                                              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : set c [ ::ibrowser::canonizeIbrowser $w option $args ]       *
+#*                                                                       *
+#* RETURN : Option or command canonical form                             *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*      object : string. option/command id.                              *
+#*      opt    : string. Option/command value.                           *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::canonizeIbrowser { w object opt } {
+
+    # Namespace variables used in this procedure
+    upvar ::ibrowser::widgetOptions  widgetOptions
+    upvar ::ibrowser::widgetCommands widgetCommands
+
+    switch $object {
+    
+        command {
+
+            if { [ lsearch -exact $widgetCommands $opt ] >= 0 } { return $opt }
+            set list $widgetCommands
+            foreach element $list { set tmp($element) "" }
+            set matches [ array names tmp ${opt}* ]
+
+        }
+        option {
+
+            if { [ info exists widgetOptions($opt) ] && \
+                 [ llength $widgetOptions($opt) ] == 2 \
+            } { return $opt }
+            set list [ array names widgetOptions ]
+            set matches [ array names widgetOptions ${opt}* ]
+
+        }
+
+    }
+    if { [ llength $matches ] == 0 } {
+        error "unknown $object \"$opt\"; must be one of $list"
+    } elseif { [ llength $matches ] == 1 } {
+
+        set opt [ lindex $matches 0 ]
+
+        switch $object {
+
+            option {
+
+                set opt [ lindex $matches 0 ]
+                if { [ llength $widgetOptions($opt) ] == 1 } { set opt $widgetOptions($opt) }
+
+            }
+
+        }
+        return $opt
+
+    } else { error "ambiguous $object \"$opt\"; must be one of $list" }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::ibrowserDestroyHandler (procedure)                        *
+#*                                                                       *
+#* DESCRIPTION : Handles the destroy event.                              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::ibrowserDestroyHandler $w                        *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::ibrowserDestroyHandler { w } {
+
+    if { [ string compare [ winfo class $w ] "Ibrowser" ] == 0 } {
+        # Namespace variables used in this procedure
+        upvar ::ibrowser::${w}::options options
+        upvar ::ibrowser::${w}::widgets widgets
+        upvar ::ibrowser::${w}::currsel currsel
+        upvar ::ibrowser::${w}::lastsel lastsel
+        upvar ::ibrowser::${w}::images  images
+        upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+        # Deletes all images... if any
+        foreach img $images {
+        
+            if { [ lindex $img 1 ] != "" } { image delete [ lindex $img 1 ] }
+
+        }
+        namespace delete ::ibrowser::$w
+        rename $w {}
+
+    }
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::ibrowserWidgetProc (procedure)                            *
+#*                                                                       *
+#* DESCRIPTION : Main procedure. This executes all sub-commands for the  *
+#*               actual widget.                                          *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::ibrowserWidgetProc $widget $command $args        *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* RETURN : Depends on each sub-command                                  *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w       : string. Widget name.                                   *
+#*      command : string. Sub-command name.                              *
+#*      args    : list. Arguments for sub-command.                       *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::ibrowserWidgetProc { w command args } {
+
+    # guess... ;-)
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    # given command exists?
+    set command [ ::ibrowser::canonizeIbrowser $w command $command ]
+
+    set result {}
+
+    # execute subcommands
+    switch $command {
+
+        add          { set result [ eval ::ibrowser::addImageIbrowser     {$w} $args ] }
+        cget         { set result [ eval ::ibrowser::cgetIbrowser         {$w} $args ] }
+        configure    { set result [ eval ::ibrowser::configureIbrowser    {$w} $args ] }
+        curselection { set result [ eval ::ibrowser::curSelectionIbrowser {$w} $args ] }
+        delete       { set result [ eval ::ibrowser::deleteImageIbrowser  {$w} $args ] }
+        find         { set result [ eval ::ibrowser::findImageIbrowser    {$w} $args ] }
+        lastimage    { set result $lastsel }
+        select       { set result [ eval ::ibrowser::selectImageIbrowser  {$w} $args ] }
+        size         { set result [ llength $images ] }
+
+    }
+    return $result;
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::addImageIbrowser (procedure)                              *
+#*                                                                       *
+#* DESCRIPTION : Executes the "add" sub-command. This can add a tkimage, *
+#*               load an image from disk, make references with tags, and *
+#*               gives a title to show with the image.                   *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::addImageIbrowser $w $args ]            *
+#*          <widget> add                                                 *
+#*                       ?-image <tkimage>?                              *
+#*                       ?-file <filename> -format <fileformat>?         *
+#*                       ?-tags <tags>?                                  *
+#*                       ?-title <title>?                                *
+#*                                                                       *
+#* RETURN : 0/1 Error/Success                                            *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::addImageIbrowser { w args } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    set ret -1
+    if { [ llength $args ] % 2 == 0 } {
+
+        # an associative array is easier...
+        array set opt $args
+
+        # look at options...
+        set inds [ array names opt ]
+        foreach ind $inds {
+
+            if { $ind != "-image"  && \
+                 $ind != "-file"   && \
+                 $ind != "-format" && \
+                 $ind != "-tags"   && \
+                 $ind != "-title"     \
+            } { error "unknown add option \"$ind\"" }
+
+        }
+
+        # set up title...
+        if { [ lsearch -exact $inds "-title" ] != -1 } {
+        set txt $opt(-title)
+        } else { set txt "NO_TITLE" }
+
+        # extract real image...
+        set img_erase 0
+        if { [ lsearch -exact $inds "-image" ] != -1 } {
+        set img $opt(-image)
+        } elseif { [ lsearch -exact $inds "-file" ] != -1 && \
+                   [ lsearch -exact $inds "-format" ] != -1  \
+        } {
+
+            set img [ image create photo -file $opt(-file) -format $opt(-format) ]
+            set img_erase 1
+
+        } else { error "no image to add" }
+
+        # get tags...
+        if { [ lsearch -exact $inds "-tags" ] != -1 } {
+        set tags $opt(-tags)
+        } else { error "\"-tags\" options not found" }
+
+        # subsample real image and generate thumbnail...
+        set dimX [ image width $img ]
+        set dimY [ image height $img ]
+        set rx [ expr $dimX / $options(-thumbwidth) ]
+        set ry [ expr $dimY / $options(-thumbheight) ]
+        set thumb [ image create photo     \
+            -width $options(-thumbwidth)   \
+            -height $options(-thumbheight) \
+        ]
+        if { $rx == 0 || $ry == 0 } {
+        $thumb copy $img
+        } else { $thumb copy $img -subsample $rx $ry }
+
+        # add nImg to canvas...
+        set pos [ llength $images ]
+        set px  [ expr ( ( $pos % $nMaxX ) * ( $options(-gap) + $options(-thumbwidth) ) ) + \
+                         $options(-gap)
+        ]
+        set py  [ expr ( ( $pos / $nMaxX ) * ( $options(-gap) + $options(-thumbheight) ) ) + \
+                         $options(-gap)
+        ]
+
+        set id [ $widgets(canvas) create image $px $py \
+            -image $thumb \
+            -anchor nw \
+            -tags "image"
+        ]
+        $widgets(canvas) create text $px $py \
+            -text $txt \
+            -fill $options(-fontcolor) \
+            -anchor nw \
+            -tags "text_$id text"
+
+        # add image data...
+        if { $options(-cache) == 0 } {
+
+            lappend images [ list $id {} $tags ]
+            if { $img_erase == 1 } { image delete $img }
+
+        } else { lappend images [ list $id $img $tags ] }
+        repos $w
+
+    } else { error "\"add\" command with incorrect number of arguments \"$args\"" }
+
+    return "1"
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::cgetIbrowser (procedure)                                  *
+#*                                                                       *
+#* DESCRIPTION : Executes the "cget" sub-command. Returns information    *
+#*               about certain widget option.                            *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::cgetIbrowser $w $args ]                *
+#*          <widget> cget ?-<option>?                                    *
+#*                                                                       *
+#* RETURN : Option value.                                                *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::cgetIbrowser { w args } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    set ret {}
+    if { [ llength $args ] == 1 } {
+
+        set opt [ ::ibrowser::canonizeIbrowser $w option $args ]
+        set ret $options($opt)
+
+    } else { error "\"cget\" command only accepts one argument" }
+    return $ret
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::curSelectionIbrowser (procedure)                          *
+#*                                                                       *
+#* DESCRIPTION : Executes the "curselection" sub-command. Returns a list *
+#*               with all selected thumbnails. This list has the format: *
+#*                [ <id tkimage <tags>> ].                               *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::curSelectionIbrowser $w $args ]        *
+#*          <widget> curselection                                        *
+#*                                                                       *
+#* RETURN : Selected images.                                             *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::curSelectionIbrowser { w args } {
+
+    # again, guess!
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    # Get range. To manage this range, the widget uses two rectangles to
+    # show the selection, the range is defined as the first rentangle
+    # (frect) to the last (lrect).
+    set f_id [ $widgets(canvas) find withtag "frect" ]
+    set l_id [ $widgets(canvas) find withtag "lrect" ]
+    if { $f_id != "" } {
+        set f_id [ lindex [ $widgets(canvas) gettags $f_id ] 1 ]
+    } else { set f_id [ llength $images ] }
+    if { $l_id != "" } {
+        set l_id [ lindex [ $widgets(canvas) gettags $l_id ] 1 ]
+    } else { set l_id -1 }
+    set f $f_id
+    set l $l_id
+    set i 0
+    foreach img $images {
+
+        if { [ lindex $img 0 ] == $f } { set f $i }
+        if { [ lindex $img 0 ] == $l } { set l $i }
+        incr i
+
+    }
+
+    # f > l? avoid it!
+    set f [ expr ( $f == [ llength $images ] )? $l: $f ]
+    set l [ expr ( $l == -1 )? $f: $l ]
+    set min [ expr ( $f < $l )? $f: $l ]
+    set max [ expr ( $f >= $l )? $f: $l ]
+
+    # set return variable...
+    set ret [ list ]
+    for { set i $min } { $i <= $max && $i >= 0 } { incr i } {
+
+        lappend ret [ lindex $images $i ]
+        
+    }
+
+    # end
+    return $ret
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::deleteImageIbrowser (procedure)                           *
+#*                                                                       *
+#* DESCRIPTION : Executes the "delete" sub-command. Starting from a tag, *
+#*               delete one thumbnail.                                   *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::deleteImageIbrowser $w $args ]         *
+#*          <widget> delete -tags <tags>                                 *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::deleteImageIbrowser { w args } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    if { [ llength $args ] % 2 == 0 } {
+
+        # an associative array is easier...
+        array set opt $args
+
+        # look at options...
+        set inds [ array names opt ]
+        foreach ind $inds {
+
+            if { $ind != "-tags" } { error "unknown delete option \"$ind\"" }
+
+        }
+
+        # select images to delete
+        set del [ list ]
+        if { [ lsearch -exact $inds "-tags" ] != -1 } {
+
+            set tags $opt(-tags)
+            foreach img $images {
+
+                set itags [ lindex $img 2 ]
+                set c 0
+                foreach t $itags { if { [ lsearch -exact $tags $t ] != -1 } { incr c } }
+                if { $c == [ llength $tags ] } { lappend del $img }
+
+            }
+
+        } else { error "\"delete\" subcommand without \"-tags\" option" }
+
+        # real delete process
+        $widgets(canvas) delete "frect"
+        $widgets(canvas) delete "lrect"
+        foreach d $del {
+
+            # delete from canvas...
+            set ind [ lindex $d 0 ]
+            $widgets(canvas) delete $ind
+            $widgets(canvas) delete "text_$ind"
+
+            # from memory...
+            if { [ lindex $d 1 ] != "" } { image delete [ lindex $d 1 ] }
+
+            # from list...
+            set i [ lsearch -exact $images $d ]
+            set images [ lreplace $images $i $i ]
+
+        }
+
+        # Re-arrange widget
+        ::ibrowser::repos $w
+
+    } else { error "wrong number of arguments in \"delete\" command" }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::findImageIbrowser (procedure)                             *
+#*                                                                       *
+#* DESCRIPTION : Executes the "find" sub-command. Starting from a tag,   *
+#*               searchs for thumbnails. Returns a list with images.     *
+#*                [ <id tkimage <tags>> ].                               *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::findImageIbrowser $w $args ]           *
+#*          <widget> find -tags <tags>                                   *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::findImageIbrowser { w args } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    set ret {}
+    set tags [ lindex $args 1 ]
+    if { [ llength $tags ] > 0 } {
+
+        foreach img $images {
+
+            set itags [ lindex $img 2 ]
+
+            # if counter c, equals the number of given tags, then
+            # actual image is of our interest
+            set c 0
+            foreach t $itags { if { [ lsearch -exact $tags $t ] != -1 } { incr c } }
+            if { $c == [ llength $tags ] } { lappend ret $img }
+
+        }
+
+    }
+    return $ret
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::selectImageIbrowser (procedure)                           *
+#*                                                                       *
+#* DESCRIPTION : Executes the "select" sub-command. Starting from a tag, *
+#*               selects the first thumbnail. If the -secondary option   *
+#*               is specified, then do a secondary selection             *
+#*               (right mouse button).                                   *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::ibrowser::selectImageIbrowser $w $args ]         *
+#*          <widget> select -tags <tags> ?-secondary?                    *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::selectImageIbrowser { w args } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    # arguments verif...
+    set ind -1
+    set l [ llength $args ]
+    if { $l == 2 || $l == 3 } {
+
+        set tind [ lsearch -exact $args "-tags" ]
+        set prim [ expr ( [ lsearch -exact $args "-secondary" ] != -1 )? 0: 1 ]
+        if { $tind != -1 } {
+
+            set tags [ lindex $args [ expr $tind + 1 ] ]
+            if { $tags != "" } {
+
+                foreach img $images {
+
+                    set itags [ lindex $img 2 ]
+
+                    # if counter c, equals the number of given tags, then
+                    # actual image is of our interest
+                    set c 0
+                    foreach t $itags { if { [ lsearch -exact $tags $t ] != -1 } { incr c } }
+                    if { $c == [ llength $tags ] } {
+
+                        set ind [ lindex $img 0 ]
+                        break
+
+                    }
+
+                }
+                if { $prim == 1 } { sFImage $w 0 0 $ind } else { sLImage $w 0 0 $ind }
+
+            }
+
+        }
+
+    } else { error "Wrong number of arguments for \"select\" subcommand." }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::sFImage (procedure)                                       *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Mouse left button action.               *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::sFImage %W %x %y $i                              *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w : string. Widget name.                                         *
+#*      x : string. x-coordinate.                                        *
+#*      y : string. y-coordinate.                                        *
+#*      i : string. (optional) Image index to select.                    *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::sFImage { w x y { i -1 } } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    # is manual selection?
+    if { $i == -1 } {
+
+        set ima [ $widgets(canvas) gettags current ]
+        set i [ $widgets(canvas) find withtag current ]
+
+    } else { set ima [ $widgets(canvas) gettags $i ] }
+
+    $widgets(canvas) delete "frect"
+
+    # ok, select thumb
+    if { [ string compare [ lindex $ima 0 ] "image" ] == 0 } {
+
+        set co [ $widgets(canvas) coords $i ]
+        set x [ lindex $co 0 ]
+        set y [ lindex $co 1 ]
+        set px [ expr $x - $options(-gap) / 2 ]
+        set py [ expr $y - $options(-gap) / 2 ]
+        set fx [ expr $px + $options(-thumbwidth) + $options(-gap) / 2 ]
+        set fy [ expr $py + $options(-thumbheight) + $options(-gap) / 2 ]
+        $widgets(canvas) create rect  $px $py $fx $fy \
+            -outline $options(-primarycolor) \
+            -width 2 \
+            -tags "frect $i rects"
+
+        set lastsel [ list -1 "" {} ]
+        foreach img $images {
+
+            if { [ lindex $img 0 ] == $i } {
+
+                set lastsel $img
+                break
+
+            }
+
+        }
+
+        # fire selection event
+        event generate $widgets(this) <<AfterSelectImage>>
+
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::sLImage (procedure)                                       *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Mouse right button action.              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::sLImage %W %x %y $i                              *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w : string. Widget name.                                         *
+#*      x : string. x-coordinate.                                        *
+#*      y : string. y-coordinate.                                        *
+#*      i : string. (optional) Image index to select.                    *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::sLImage { w x y { i -1 } } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    if { $options(-multisel) == 1 } {
+
+        # is manual selection?
+        if { $i == -1 } {
+
+            set ima [ $widgets(canvas) gettags current ]
+            set i [ $widgets(canvas) find withtag current ]
+
+        } else { set ima [ $widgets(canvas) gettags $i ] }
+
+        # ok, select thumb
+        $widgets(canvas) delete "lrect"
+
+        if { [ string compare [ lindex $ima 0 ] "image" ] == 0 } {
+
+            set co [ $widgets(canvas) coords $i ]
+            set x [ lindex $co 0 ]
+            set y [ lindex $co 1 ]
+            set px [ expr $x - $options(-gap) / 2 ]
+            set py [ expr $y - $options(-gap) / 2 ]
+            set fx [ expr $px + $options(-thumbwidth) + $options(-gap) / 2 ]
+            set fy [ expr $py + $options(-thumbheight) + $options(-gap) / 2 ]
+            $widgets(canvas) create rect  $px $py $fx $fy \
+                -outline $options(-secondarycolor) \
+                -width 2 \
+                -tags "lrect $i rects"
+
+            set lastsel [ list -1 "" {} ]
+            foreach img $images {
+
+                if { [ lindex $img 0 ] == $i } {
+
+                    set lastsel $img
+                    break
+
+                }
+
+            }
+
+            # fire selection event
+            event generate $widgets(this) <<AfterSelectImage>>
+
+        }
+
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::repos (procedure)                                         *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Repositionate images.                   *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::repos %W                                         *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w : string. Widget name.                                         *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::repos { w } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    set itms [ $widgets(canvas) find withtag "image" ]
+    set pos 0
+    foreach itm $itms {
+
+        set px [ expr ( ( $pos % $nMaxX ) * ( $options(-gap) + $options(-thumbwidth) ) ) + \
+                        $options(-gap) \
+        ]
+        set py [ expr ( ( $pos / $nMaxX ) * ( $options(-gap) + $options(-thumbheight) ) ) + \
+                        $options(-gap) \
+        ]
+        $widgets(canvas) coords $itm $px $py
+        incr pos
+
+    }
+
+    set itms [ $widgets(canvas) find withtag "text" ]
+    set pos 0
+    foreach itm $itms {
+
+        set px [ expr ( ( $pos % $nMaxX ) * ( $options(-gap) + $options(-thumbwidth) ) ) + \
+                        $options(-gap) \
+        ]
+        set py [ expr ( ( $pos / $nMaxX ) * ( $options(-gap) + $options(-thumbheight) ) ) + \
+                        $options(-gap) \
+        ]
+        $widgets(canvas) coords $itm $px $py
+        incr pos
+
+    }
+
+    set rects [ $widgets(canvas) find withtag "rects" ]
+    foreach r $rects {
+
+        set info [ $widgets(canvas) gettags $r ]
+        set co   [ $widgets(canvas) coords [ lindex $info 1 ] ]
+        set x [ lindex $co 0 ]
+        set y [ lindex $co 1 ]
+        set px [ expr $x - $options(-gap) / 2 ]
+        set py [ expr $y - $options(-gap) / 2 ]
+        set fx [ expr $px + $options(-thumbwidth) + $options(-gap) / 2 ]
+        set fy [ expr $py + $options(-thumbheight) + $options(-gap) / 2 ]
+        $widgets(canvas) coords $r $px $py $fx $fy
+
+    }
+    ::ibrowser::configureSlider $w
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::resize (procedure)                                        *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Resize widget.                          *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::resize %W %w %h                                  *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*      width  : string. Widget width.                                   *
+#*      height : string. Widget height.                                  *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::resize { w width height } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    if { $options(-width) != $width || $options(-height) != $height } {
+
+        set options(-width)  $width
+        set options(-height) $height
+        set nMaxX [ expr int( floor ( $options(-width) / ( $options(-gap) + \
+                                                           $options(-thumbwidth) \
+                                                         ) \
+                                    ) \
+                            ) \
+        ]
+        if { $nMaxX == 0 } {
+
+            set options(-width) [ expr $options(-thumbwidth) + $options(-gap) ]
+            set nMaxX [ expr int( floor ( $options(-width) / ( $options(-gap) + \
+                                                               $options(-thumbwidth) \
+                                                             ) \
+                                        ) \
+                                ) \
+            ]
+            $widgets(canvas) configure -width $options(-width)
+
+        }
+        ::ibrowser::repos $w
+
+    }
+    
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::ibrowser::configureSlider (procedure)                               *
+#*                                                                       *
+#* DESCRIPTION : Puts or erases a slider, if necessary.                  *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::ibrowser::configureSlider $widget                          *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::ibrowser::configureSlider { w } {
+
+    # For namespace access
+    upvar ::ibrowser::${w}::options options
+    upvar ::ibrowser::${w}::widgets widgets
+    upvar ::ibrowser::${w}::currsel currsel
+    upvar ::ibrowser::${w}::lastsel lastsel
+    upvar ::ibrowser::${w}::images  images
+    upvar ::ibrowser::${w}::nMaxX   nMaxX
+
+    set s    [ llength $images ]
+    set y    [ expr ceil ( $s.0 / $nMaxX.0 ) ]
+    set need [ expr $y * ( $options(-thumbheight) + $options(-gap) ) + $options(-gap) ]
+    set rh   $options(-height)
+
+    $widgets(canvas) configure -scrollregion "0 0 $options(-width) $need"
+    if { $need >= $rh && ! [ winfo exists $w.scroll ] } {
+
+        set widgets(scroll) [ scrollbar $w.scroll -command "$widgets(canvas) yview" ]
+        $widgets(canvas) configure -yscrollcommand "$widgets(scroll) set"
+        grid $widgets(canvas)  \
+            -in $widgets(this) \
+            -row 0             \
+            -column 0          \
+            -rowspan 1         \
+            -columnspan 1      \
+            -sticky news
+        grid $widgets(scroll) -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
+        grid rowconfig    $widgets(this) 0 -weight 1 -minsize 0
+        grid columnconfig $widgets(this) 0 -weight 1 -minsize 0
+
+    } elseif { $need < $rh && [ winfo exists $w.scroll ] } {
+    
+        $widgets(canvas) configure -yscrollcommand ""
+        destroy $w.scroll
+        set widgets(scroll) ""
+
+    }
+
+}
+
+# EOF - ibrowser.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/tkwidgets/imagepp.tcl b/lib/maracasVisuLib/src/interface/tcl/tkwidgets/imagepp.tcl
new file mode 100644 (file)
index 0000000..1ea35a1
--- /dev/null
@@ -0,0 +1,1697 @@
+#*************************************************************************
+#*                                  *                                    *
+#* NAME     : imagepp.tcl           * PROJECT  : MARACAS                 *
+#* AUTHOR   : Leonardo Flórez/Kyron * TYPE     : TCL/TK widget def.      *
+#* VERSION  : v1.0                  * CREATION : 06/05/2001              *
+#* LANGUAGE : TCL                   * REVISION : 16/07/2001              *
+#*                                  *                                    *
+#*************************************************************************
+#*                                                                       *
+#*  Description : This file defines a new TCL/TK widget that allows the  *
+#*                user to work with an image, it's a viewer. It has a    *
+#*                dinamical scroll bar, so, don't worry about use one.   *
+#*                                                                       *
+#*  The basic use of this widget is:                                     *
+#*                                                                       *
+#*      1. Create a new widget: "imagepp <name> <options>"               *
+#*         Options given are a list of '-<option> <value>' pairs.        *
+#*         Supported options are:                                        *
+#*         +-----------------+--------------------------------------+    *
+#*         | OPTION          | DESCRIPTION                          |    *
+#*         +-----------------+--------------------------------------+    *
+#*         |  -background    | Background color.                    |    *
+#*         |  -borderwidth   | Border width.                        |    *
+#*         |  -height        | Height.                              |    *
+#*         +-----------------+--------------------------------------+    *
+#*         |  -initialroi    | Initial Region Of Interest.          |    *
+#*         |  -relief        | Relief.                              |    *
+#*         |  -takefocus     | Take focus?                          |    *
+#*         +-----------------+--------------------------------------+    *
+#*         |  -width         | Width                                |    *
+#*         +-----------------+--------------------------------------+    *
+#*                                                                       *
+#*      2. Pack this new widget in your hierarchy:                       *
+#*         (pack/place/grid) <name> <pack options>                       *
+#*                                                                       *
+#*      3. Interact with the new widget by using their sub-commands      *
+#*         interface. Sub-commands defined are:                          *
+#*         add , addtext, cget, clean, configure, delete,                *
+#*         find, getprofildata, resetroi, roi, show,                     *
+#*         setlinear, setarea, setnone.                                  *
+#*                                                                       *
+#*      4. Optional: use the <<AfterProfil>> event definition to         *
+#*         grab mouse interaction. Mouse events supported are:           *
+#*         Button1, Button3                                              *
+#*                                                                       *
+#*************************************************************************
+#*                                                                       *
+#*  USED MODULES :                                                       *
+#*                     TK >= v8.0                                        *
+#*                                                                       *
+#*************************************************************************
+#*                                                                       *
+#* REVISIONS :                                                           *
+#* (NOTE: Please, don't let this file became a mess. ;-) )               *
+#*                                                                       *
+#* +------------+----------------+-------------------------------------+ *
+#* | DATE       | AUTHOR         | DESCRIPTION                         | *
+#* +------------+----------------+-------------------------------------+ *
+#* | 06/05/2001 | Kyron          | Initial implementation.             | *
+#* +------------+----------------+-------------------------------------+ *
+#* | 16/07/2001 | Kyron          | Documentation & conflicts revision. | *
+#* +------------+----------------+-------------------------------------+ *
+#*                                                                       *
+#*************************************************************************
+
+package require Tk 8.0
+
+#* NAMESPACE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp (namespace)                                                 *
+#*                                                                       *
+#* DESCRIPTION : Global namespace that contains all imagepp widgets in   *
+#*               current interpreter (actual TCL work instance).         *
+#*                                                                       *
+#* SYNTAX : -NONE-                                                       *
+#*                                                                       *
+#* RETURN :                                                              *
+#*        EXPORTS : proc imagepp { name options }                        *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*            Namespace components :                                     *
+#*              widgetOptions  : list. List of supported options.        *
+#*              widgetCommands : list. List of supported sub-commands.   *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+package provide imagepp 1.0
+namespace eval ::imagepp {
+
+    # public interface
+    namespace export imagepp
+    
+    # variables
+    variable widgetOptions
+    variable widgetCommands
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::imagepp (procedure)                                        *
+#*                                                                       *
+#* DESCRIPTION : Creator of new widgets. Call it in an TK hierarchy      *
+#*               creation process.                                       *
+#*                                                                       *
+#* SYNTAX : imagepp <name> -<option1> <value1> ... -<optionn> <valuen>   *
+#*                                                                       *
+#* RETURN : New widget name, if success.                                 *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      name : string. Name for the new widget. To use it in a TK widget *
+#*                     hierarchy, this name should be ".<f1>.<f2>...<n>" *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::imagepp { name args } {
+
+    # Namespace variables used in this procedure
+    upvar ::imagepp::widgetOptions widgetOptions
+    
+    # If global namespace doesn't exists yet then initialize it
+    if { ![ info exists widgetOptions ] } initImagePP
+
+    # Given name exists?. If so, raise an error and finish
+    if { [ winfo exists $name ] } {
+        error "Widget \"$name\" already exists."
+    }
+
+    # Create the new command and return success
+    set name [ eval ::imagepp::buildImagePP $name $args ]
+    return $name
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::initImagePP (procedure)                                    *
+#*                                                                       *
+#* DESCRIPTION : Initializes the class manager, i.e., creates the global *
+#*               namespace.                                              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::initImagePP                                       *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      -NONE-                                                           *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::initImagePP { } {
+
+    # Namespace variables used in this procedure
+    upvar ::imagepp::widgetOptions  widgetOptions
+    upvar ::imagepp::widgetCommands widgetCommands
+
+    # All posible options for the widget
+    array set widgetOptions [ list               \
+        -background  { background Background }   \
+        -borderwidth { borderWidth BorderWidth } \
+        -height      { height Height }           \
+        -initialroi  { initialROI InitialROI }   \
+        -relief      { relief Relief }           \
+        -takefocus   { takeFocus TakeFocus }     \
+        -width       { width Width }             \
+    ]
+
+    # All posible commands for the widget
+    set widgetCommands [ list                     \
+        add         addtext cget    clean         \
+        configure   delete  find    getprofildata \
+        resetroi    roi     show    setlinear     \
+        setarea     setnone                       \
+    ]
+
+    event add <<AfterProfil>> \
+        <ButtonRelease-1> \
+        <ButtonRelease-3>
+
+    # Default initialization... only if Tk exists
+    if { [ lsearch -exact [ package names ] "Tk" ] != -1 } {
+
+        option add *ImagePP.background  #c0c0c0       widgetDefault
+        option add *ImagePP.borderWidth 0             widgetDefault
+        option add *ImagePP.height      100           widgetDefault
+        option add *ImagePP.initialROI  "-1 -1 -1 -1" widgetDefault
+        option add *ImagePP.relief      flat          widgetDefault
+        option add *ImagePP.takeFocus   0             widgetDefault
+        option add *ImagePP.width       100           widgetDefault
+
+    }
+
+    # set global bindings
+    ::imagepp::setClassImagePPBindings
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::setClassImagePPBindings (procedure)                        *
+#*                                                                       *
+#* DESCRIPTION : Default namespace bindings.                             *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::setClassImagePPBindings                           *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      -NONE-                                                           *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::setClassImagePPBindings { } {
+
+    bind ImagePP <Destroy> [ list ::imagepp::imagePPDestroyHandler %W ]
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::buildImagePP (procedure)                                   *
+#*                                                                       *
+#* DESCRIPTION : This does all of the work necessary to create a basic   *
+#*               imagepp widget. Creates a new command (widget) with     *
+#*               the given name. Also creates a new namespace as a child *
+#*               namespace of ::imagepp.                                 *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : set wname [ ::imagepp::buildImagePP $name $options ]         *
+#*                                                                       *
+#* RETURN : New widget hierarchy name                                    *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. New widget name.                                  *
+#*      args : list. Option/value pairs list.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::buildImagePP { w args } {
+
+    variable widgetOptions
+    
+    # New namespace...
+    namespace eval ::imagepp::$w {
+
+        variable this
+        variable options
+        variable widgets
+        variable localIds {}
+        variable hNeed    0
+        variable vNeed    0
+        variable actROI   {}
+        variable lastX    -1
+        variable lastY    -1
+        variable s_width  0
+        variable s_height 0
+
+    }
+
+    # import variables, for programming facilities
+    upvar ::imagepp::${w}::widgets widgets
+    upvar ::imagepp::${w}::options options
+
+    # definition of TK widgets...
+    set widgets(this)   [ frame  $w -class ImagePP \
+                                    -takefocus 0   \
+                                    -relief flat   \
+                                    -borderwidth 0 \
+    ]
+    set widgets(canvas) [ canvas $w.canvas -takefocus 1 ]
+    set widgets(hs) ""
+    set widgets(vs) ""
+    set widgets(profildata) ""
+    set widgets(movingroi) 0
+    
+    # set all the default values...
+    foreach name [ array names widgetOptions ] {
+
+        set optName  [ lindex $widgetOptions($name) 0 ]
+        set optClass [ lindex $widgetOptions($name) 1 ]
+        set value [ option get $w $optName $optClass ]
+        set options($name) $value
+
+    }
+
+    # set user values...
+    if { [ llength $args ] > 0 } { array set options $args }
+
+    # move the name to imagepp class' namespace...
+    set widgets(frame) ::imagepp::${w}::$w
+    rename ::$w $widgets(frame)
+
+    # set canvas options...
+    $widgets(canvas) configure -background  $options(-background)
+    $widgets(canvas) configure -borderwidth $options(-borderwidth)
+    $widgets(canvas) configure -height      $options(-height)
+    $widgets(canvas) configure -relief      $options(-relief)
+    $widgets(canvas) configure -takefocus   $options(-takefocus)
+    $widgets(canvas) configure -width       $options(-width)
+
+    # pack the canvas...
+    pack $widgets(canvas) -fill both -expand 1
+
+    # local event stuff...
+    bind $widgets(canvas) <Configure> "::imagepp::resize  $widgets(this) %w %h"
+
+    # >>>>>>>>>>>>>>>>>>> HERE, AT LAST, THE NEW COMMAND IS DEFINED <<<<<<<<<<<<<<<<<< #
+    proc ::$w { command args } "eval ::imagepp::imagePPWidgetProc $w \$command \$args"
+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
+
+    # Last configuration stuff
+    if { [ catch "::imagepp::configureImagePP $widgets(this) [ array get options ]" \
+           error \
+    ] } {
+
+        catch { destroy $w }
+        error $error
+
+    }
+
+    # have fun ;-)
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::configureImagePP (procedure)                               *
+#*                                                                       *
+#* DESCRIPTION : This does the configuration process, i.e., change of    *
+#*               any option.                                             *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::configureImagePP $widget $options ]     *
+#*                                                                       *
+#* RETURN : All options, if args is empty. If length args == 1 then      *
+#*          returns current value. Empty string otherwise.               *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Option/value pairs list.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::configureImagePP { w args } {
+
+    variable widgetOptions
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    # Sends all information to the user...
+    if { [ llength $args ] == 0 } {
+
+        set results {}
+        foreach opt [ lsort [ array names widgetOptions ] ] {
+
+            if { [ llength $widgetOptions($opt) ] == 1 } {
+
+                set alias $widgetOptions($opt)
+                set optName $widgetOptions($alias)
+                lappend results [ list $opt $optName ]
+
+            } else {
+
+                set optName     [ lindex $widgetOptions($opt) 0 ]
+                set optClass    [ lindex $widgetOptions($opt) 1 ]
+                set default     [ option get $w $optName $optClass ]
+                lappend results [ list $opt $optName $optClass $default $options($opt) ]
+
+            }
+
+        }
+        return $results
+
+    }
+
+    # or single information...
+    if { [ llength $args ] == 1 } {
+
+        set opt      [ ::imagepp::canonizeImagePP $w option [ lindex $args 0 ] ]
+        set optName  [ lindex $widgetOptions($opt) 0 ]
+        set optClass [ lindex $widgetOptions($opt) 1 ]
+        set default  [ option get $w $optName $optClass ]
+        set results  [ list $opt $optName $optClass $default $options($opt) ]
+        return $results
+
+    }
+    
+    if { [ expr { [ llength $args ] % 2 } ] == 1 } {
+    error "some values for \"$args\" are missing"
+    }
+
+    # check if all given options exists...
+    foreach { name value } $args {
+
+        set name [ ::imagepp::canonizeImagePP $w option $name ]
+        set opts($name) $value
+
+    }
+
+    # and set values...
+    foreach option [ array names opts ] {
+
+        set newValue $opts($option)
+        switch -- $option {
+
+            -initialroi {
+            
+                if { [ llength $newValue ] == 4 } {
+                set options(-initialroi) $newValue
+                } else { error "wrong ROI value" }
+            
+            }
+            default  { eval "$widgets(canvas) configure $option $newValue" }
+
+        }
+        
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::canonizeImagePP (procedure)                                *
+#*                                                                       *
+#* DESCRIPTION : Takes a option or command and canonizes it. Returns     *
+#*               either the canonical form of an option or command, or   *
+#*               raises an error if the option or command is unknown or  *
+#*               ambiguous.                                              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : set c [ ::imagepp::canonizeImagePP $w option $args ]         *
+#*                                                                       *
+#* RETURN : Option or command canonical form                             *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*      object : string. option/command id.                              *
+#*      opt    : string. Option/command value.                           *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::canonizeImagePP { w object opt } {
+
+    variable widgetOptions
+    variable widgetCommands
+
+    switch $object {
+    
+        command {
+
+            if { [ lsearch -exact $widgetCommands $opt ] >= 0 } { return $opt }
+            set list $widgetCommands
+            foreach element $list { set tmp($element) "" }
+            set matches [ array names tmp ${opt}* ]
+
+        }
+        option {
+
+            if { [ info exists widgetOptions($opt) ] && \
+                 [ llength $widgetOptions($opt) ] == 2 \
+            } { return $opt }
+            set list [ array names widgetOptions ]
+            set matches [ array names widgetOptions ${opt}* ]
+
+        }
+    
+    }
+    if { [ llength $matches ] == 0 } {
+    error "unknown $object \"$opt\"; must be one of $list"
+    } elseif { [ llength $matches ] == 1 } {
+
+        set opt [ lindex $matches 0 ]
+
+        switch $object {
+
+            option {
+
+                set opt [ lindex $matches 0 ]
+                if { [ llength $widgetOptions($opt) ] == 1 } { set opt $widgetOptions($opt) }
+
+            }
+
+        }
+        return $opt
+
+    } else { error "ambiguous $object \"$opt\"; must be one of $list" }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::imagePPDestroyHandler (procedure)                          *
+#*                                                                       *
+#* DESCRIPTION : Handles the destroy event.                              *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::imagePPDestroyHandler $w                          *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::imagePPDestroyHandler { w } {
+
+    if { [ string compare [ winfo class $w ] "ImagePP" ] == 0 } {
+        # For namespace access
+        upvar ::imagepp::${w}::options  options
+        upvar ::imagepp::${w}::widgets  widgets
+        upvar ::imagepp::${w}::localIds localIds
+        upvar ::imagepp::${w}::hNeed    hNeed
+        upvar ::imagepp::${w}::vNeed    vNeed
+        upvar ::imagepp::${w}::actROI   actROI
+        upvar ::imagepp::${w}::lastX    lastX
+        upvar ::imagepp::${w}::lastY    lastY
+
+
+        namespace delete ::imagepp::$w
+        rename $w {}
+    }
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::imagePPWidgetProc (procedure)                              *
+#*                                                                       *
+#* DESCRIPTION : Main procedure. This executes all sub-commands for the  *
+#*               actual widget.                                          *
+#*                                                                       *
+#* SYNTAX : ::imagepp::imagePPWidgetProc $widget $command $args          *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* RETURN : Depends on each sub-command                                  *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w       : string. Widget name.                                   *
+#*      command : string. Sub-command name.                              *
+#*      args    : list. Arguments for sub-command.                       *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::imagePPWidgetProc { w command args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    # given command exists?
+    set command [ ::imagepp::canonizeImagePP $w command $command ]
+
+    set result {}
+
+    # execute subcommands
+    switch $command {
+
+        add           { set result [ eval ::imagepp::addImagePP           {$w} $args ] }
+        addtext       { set result [ eval ::imagepp::addTextImagePP       {$w} $args ] }
+        cget          { set result [ eval ::imagepp::cgetImagePP          {$w} $args ] }
+        clean         { set result [ eval ::imagepp::cleanImagePP         {$w} $args ] }
+        configure     { set result [ eval ::imagepp::configureImagePP     {$w} $args ] }
+        delete        { set result [ eval ::imagepp::deleteImagePP        {$w} $args ] }
+        find          { set result [ eval ::imagepp::findImagePP          {$w} $args ] }
+        getprofildata { set result [ eval ::imagepp::getprofildataImagePP {$w} $args ] }
+        resetroi      { set result [ eval ::imagepp::resetROIImagePP      {$w} $args ] }
+        roi           { set result [ eval ::imagepp::ROIImagePP           {$w} $args ] }
+        setroi        { set result [ eval ::imagepp::setROIImagePP        {$w} $args ] }
+        show          { set result [ eval ::imagepp::showImagePP          {$w} $args ] }
+        setlinear     { set result [ eval ::imagepp::setlinearImagePP     {$w} $args ] }
+        setarea       { set result [ eval ::imagepp::setareaImagePP       {$w} $args ] }
+        setnone       { set result [ eval ::imagepp::setnoneImagePP       {$w} $args ] }
+
+    }
+    return $result
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::addImagePP (procedure)                                     *
+#*                                                                       *
+#* DESCRIPTION : Executes the "add" sub-command. This can add a tkimage, *
+#*               load an image from disk, make references with id's.     *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::addImagePP $w $args ]                   *
+#*          <widget> add                                                 *
+#*                       ?-image <tkimage>?                              *
+#*                       ?-file <filename> -format <fileformat>?         *
+#*                       ?-id <id>?                                      *
+#*                                                                       *
+#* RETURN : Empty string on error.                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::addImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+    upvar ::imagepp::${w}::s_width  s_width
+    upvar ::imagepp::${w}::s_height s_height
+
+    # arguments parsing...
+    if { [ llength $args ] == 4 } {
+
+        array set opc $args
+        set l_opc [ array names opc ]
+        if { [ lsearch -exact $l_opc "-image" ] != -1 && \
+             [ lsearch -exact $l_opc "-id" ] != -1       \
+        } {
+
+            set new_img $opc(-image)
+            set new_id $opc(-id)
+
+        } else { error "error in \"add\" command arguments" }
+
+    } elseif { [ llength $args ] == 6 } {
+
+        array set opc $args
+        set l_opc [ array names opc ]
+        if { [ lsearch -exact $l_opc "-file" ] != -1 &&   \
+             [ lsearch -exact $l_opc "-format" ] != -1 && \
+             [ lsearch -exact $l_opc "-id" ] != -1        \
+        } {
+
+            set new_img [ image create photo -file $opc(-file) -format $opc(-format) ]
+            set new_id $opc(-id)
+
+        } else { error "error in \"add\" command arguments" }
+
+    } else { error "error in \"add\" command arguments" }
+
+    # given id already exists?
+    array set ids $localIds
+    set l_localIds [ array names ids ]
+    if { [ lsearch -exact $l_localIds $new_id ] == -1 } {
+
+        # ok, do it
+        set s_width  [ image width  $new_img ]
+        set s_height [ image height $new_img ]
+        set canvas_id [ \
+            $widgets(canvas) create image 0 0 \
+            -image $new_img \
+            -anchor nw \
+            -tags "id_$new_id"
+        ]
+        lappend localIds $new_id
+        lappend localIds $canvas_id
+        set hNeed [ expr ( $s_width  > $hNeed )? $s_width : $hNeed ]
+        set vNeed [ expr ( $s_height > $vNeed )? $s_height: $vNeed ]
+        $widgets(canvas) configure -scrollregion "0 0 $hNeed $vNeed"
+        foreach e $actROI { $widgets(canvas) raise $e }
+
+    } else {
+    
+        set item [ $widgets(canvas) find withtag "id_$new_id" ]
+        $widgets(canvas) itemconfigure $item -image $new_img
+        $widgets(canvas) raise $item
+        foreach e $actROI { $widgets(canvas) raise $e }
+
+    }
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::addTextImagePP (procedure)                                 *
+#*                                                                       *
+#* DESCRIPTION : Executes the "addtext" sub-command.                     *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::addTextImagePP $w $args ]               *
+#*          <widget> addtext <text> <x> <y>                              *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::addTextImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    catch { $widgets(canvas) delete "textErase" }
+    $widgets(canvas) create text     \
+        [ lindex $args 1 ]           \
+        [ lindex $args 2 ]           \
+        -text [ lindex $args 0 ]     \
+        -tags "textErase"            \
+        -fill yellow                 \
+        -justify left                \
+        -anchor nw                   \
+        -font { Helvetica -12 bold }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::cgetImagePP (procedure)                                    *
+#*                                                                       *
+#* DESCRIPTION : Executes the "cget" sub-command. Returns information    *
+#*               about certain widget option.                            *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::cgetImagePP $w $args ]                  *
+#*          <widget> cget ?-<option>?                                    *
+#*                                                                       *
+#* RETURN : Option value.                                                *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::cgetImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+    
+    set ret {}
+    if { [ llength $args ] == 1 } {
+
+        set opt [ ::imagepp::canonizeImagePP $w option $args ]
+        set ret $options($opt)
+
+    } else { error "\"cget\" command only accepts one argument" }
+    return $ret
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::cleanImagePP (procedure)                                   *
+#*                                                                       *
+#* DESCRIPTION : Executes the "clean" sub-command.                       *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::cleanImagePP $w $args ]                 *
+#*          <widget> clean                                               *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::cleanImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    catch { $widgets(canvas) delete $widgets(actual_line) }
+    catch { $widgets(canvas) delete "textErase" }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::deleteImagePP (procedure)                                  *
+#*                                                                       *
+#* DESCRIPTION : Executes the "delete" sub-command.                      *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::deleteImagePP $w $args ]                *
+#*          <widget> delete -id <id/all>                                 *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::deleteImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    set ret -1
+
+    # arguments parsing...
+    if { [ llength $args ] == 2 } {
+
+        if { [ string compare [ lindex $args 0 ] "-id" ] == 0 } {
+
+            if { [ string compare [ lindex $args 1 ] "all" ] == 0 } {
+
+                set all_items [ $widgets(canvas) find withtag all ]
+                foreach item $all_items { $widgets(canvas) delete $item }
+
+            } else {
+            }
+
+        } else { error "wrong argument for \"delete\" command" }
+
+    } else { error "wrong number of arguments for \"delete\" command" }
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::findImagePP (procedure)                                    *
+#*                                                                       *
+#* DESCRIPTION : Executes the "find" sub-command.                        *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::findImagePP $w $args ]                  *
+#*          <widget> delete -id <id>                                     *
+#*                                                                       *
+#* RETURN : Index.                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::findImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    set ret -1
+
+    # arguments parsing...
+    if { [ llength $args ] == 2 } {
+
+        if { [ string compare [ lindex $args 0 ] "-id" ] == 0 } {
+
+            array set ids $localIds
+            set l_localIds [ array names ids ]
+            set ret [ lsearch -exact $l_localIds [ lindex $args 1 ] ]
+
+        } else { error "wrong argument for \"find\" command" }
+
+    } else { error "wrong number of arguments for \"find\" command" }
+    return $ret
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::getprofildataImagePP (procedure)                           *
+#*                                                                       *
+#* DESCRIPTION : Executes the "find" sub-command.                        *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::getprofildataImagePP $w $args ]         *
+#*          <widget> getprofildata -id <id>                              *
+#*                                                                       *
+#* RETURN : Limits for a profil measure.                                 *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::getprofildataImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    return $widgets(profildata)
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::resetROIImagePP (procedure)                                *
+#*                                                                       *
+#* DESCRIPTION : Executes the "resetroi" sub-command.                    *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::resetROIImagePP $w $args ]              *
+#*          <widget> resetroi                                            *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::resetROIImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    # erase
+    foreach e $actROI { $widgets(canvas) delete $e }
+
+    # coordinates
+    set ux [ lindex $options(-initialroi) 0 ]
+    set uy [ lindex $options(-initialroi) 1 ]
+    set bx [ lindex $options(-initialroi) 2 ]
+    set by [ lindex $options(-initialroi) 3 ]
+
+    # four rectangles...
+    set actROI [ list ]
+
+    # 1) ux, uy
+    lappend actROI [ $widgets(canvas) create rectangle \
+        [ expr $ux - 6 ] [ expr $uy - 6 ]      \
+        [ expr $ux + 0 ] [ expr $uy + 0 ]      \
+        -fill #ffff00                          \
+        -tags "rect_fill"                      \
+    ]
+
+    # 2) bx, uy
+    lappend actROI [ $widgets(canvas) create rectangle \
+        [ expr $bx - 0 ] [ expr $uy - 6 ]      \
+        [ expr $bx + 6 ] [ expr $uy + 0 ]      \
+        -fill #ffff00                          \
+        -tags "rect_fill"                      \
+    ]
+
+    # 3) bx, by
+    lappend actROI [ $widgets(canvas) create rectangle \
+        [ expr $bx - 0 ] [ expr $by - 0 ]      \
+        [ expr $bx + 6 ] [ expr $by + 6 ]      \
+        -fill #ffff00                          \
+        -tags "rect_fill"                      \
+    ]
+
+    # 4) ux, by
+    lappend actROI [ $widgets(canvas) create rectangle \
+        [ expr $ux - 6 ] [ expr $by - 0 ]      \
+        [ expr $ux + 0 ] [ expr $by + 6 ]      \
+        -fill #ffff00                          \
+        -tags "rect_fill"                      \
+    ]
+
+    # rectangle for area
+    lappend actROI [ $widgets(canvas) create rectangle \
+        [ expr $ux ] [ expr $uy ]      \
+        [ expr $bx ] [ expr $by ]      \
+        -outline #ffff00               \
+        -width 2                       \
+        -tags "rect_area"              \
+    ]
+
+    # item binds
+    $widgets(canvas) bind [ lindex $actROI 0 ] <Enter>     "$widgets(canvas) itemconfigure current -fill #ff0000"
+    $widgets(canvas) bind [ lindex $actROI 0 ] <Leave>     "$widgets(canvas) itemconfigure current -fill #ffff00"
+    $widgets(canvas) bind [ lindex $actROI 0 ] <Button-1>  "::imagepp::startMotion $w %x %y"
+    $widgets(canvas) bind [ lindex $actROI 0 ] <B1-Motion> "::imagepp::moveCorner $w %x %y 0"
+
+    $widgets(canvas) bind [ lindex $actROI 1 ] <Enter>     "$widgets(canvas) itemconfigure current -fill #ff0000"
+    $widgets(canvas) bind [ lindex $actROI 1 ] <Leave>     "$widgets(canvas) itemconfigure current -fill #ffff00"
+    $widgets(canvas) bind [ lindex $actROI 1 ] <Button-1>  "::imagepp::startMotion $w %x %y"
+    $widgets(canvas) bind [ lindex $actROI 1 ] <B1-Motion> "::imagepp::moveCorner $w %x %y 1"
+
+    $widgets(canvas) bind [ lindex $actROI 2 ] <Enter>     "$widgets(canvas) itemconfigure current -fill #ff0000"
+    $widgets(canvas) bind [ lindex $actROI 2 ] <Leave>     "$widgets(canvas) itemconfigure current -fill #ffff00"
+    $widgets(canvas) bind [ lindex $actROI 2 ] <Button-1>  "::imagepp::startMotion $w %x %y"
+    $widgets(canvas) bind [ lindex $actROI 2 ] <B1-Motion> "::imagepp::moveCorner $w %x %y 2"
+
+    $widgets(canvas) bind [ lindex $actROI 3 ] <Enter>     "$widgets(canvas) itemconfigure current -fill #ff0000"
+    $widgets(canvas) bind [ lindex $actROI 3 ] <Leave>     "$widgets(canvas) itemconfigure current -fill #ffff00"
+    $widgets(canvas) bind [ lindex $actROI 3 ] <Button-1>  "::imagepp::startMotion $w %x %y"
+    $widgets(canvas) bind [ lindex $actROI 3 ] <B1-Motion> "::imagepp::moveCorner $w %x %y 3"
+
+    $widgets(canvas) bind [ lindex $actROI 4 ] <Enter>     "$widgets(canvas) itemconfigure current -outline #ff0000"
+    $widgets(canvas) bind [ lindex $actROI 4 ] <Leave>     "$widgets(canvas) itemconfigure current -outline #ffff00"
+    $widgets(canvas) bind [ lindex $actROI 4 ] <Button-1>  "::imagepp::startMotion $w %x %y"
+    $widgets(canvas) bind [ lindex $actROI 4 ] <B1-Motion> "::imagepp::moveRect $w %x %y"
+
+    foreach e $actROI { $widgets(canvas) raise $e }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::ROIImagePP (procedure)                                     *
+#*                                                                       *
+#* DESCRIPTION : Executes the "roi" sub-command.                         *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::ROIImagePP $w $args ]                   *
+#*          <widget> roi                                                 *
+#*                                                                       *
+#* RETURN : Actual Region Of Interest.                                   *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::ROIImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+    upvar ::imagepp::${w}::s_width  s_width
+    upvar ::imagepp::${w}::s_height s_height
+
+    set ux $s_width; set uy $s_height
+    set bx -1; set by -1
+       set c  [ $widgets(canvas) coords [ lindex $actROI 4 ] ]
+    set ux [ expr ( [ lindex $c 0 ] < $ux )? [ lindex $c 0 ]: $ux ]
+    set uy [ expr ( [ lindex $c 1 ] < $uy )? [ lindex $c 1 ]: $uy ]
+    set bx [ expr ( [ lindex $c 2 ] > $bx )? [ lindex $c 2 ]: $bx ]
+    set by [ expr ( [ lindex $c 3 ] > $by )? [ lindex $c 3 ]: $by ]
+
+    set ux [ expr ( $ux < 0 )? 0: $ux ]
+    set uy [ expr ( $uy < 0 )? 0: $uy ]
+    set bx [ expr ( $bx > $s_width )? $s_width - 1: $bx ]
+    set by [ expr ( $by > $s_height )? $s_height - 1: $by ]
+
+    set ret [ list $ux $uy $bx $by ]
+    return $ret
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::showImagePP (procedure)                                    *
+#*                                                                       *
+#* DESCRIPTION : Executes the "show" sub-command.                        *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::showImagePP $w $args ]                  *
+#*          <widget> roi                                                 *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::showImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    # arguments parsing...
+    if { [ llength $args ] == 2 } {
+
+        if { [ string compare [ lindex $args 0 ] "-id" ] == 0 } {
+
+            array set ids $localIds
+            set l_localIds [ array names ids ]
+            set local_id [ lindex $args 1 ]
+            if { [ lsearch -exact $l_localIds $local_id ] != -1 } {
+
+                $widgets(canvas) raise $ids($local_id)
+                foreach e $actROI { $widgets(canvas) raise $e }
+
+            }
+
+        } else { error "wrong argument for \"show\" command" }
+
+    } else { error "wrong number of arguments for \"show\" command" }
+    return ""
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::setlinearImagePP (procedure)                               *
+#*                                                                       *
+#* DESCRIPTION : Executes the "setlinear" sub-command.                   *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::setlinearImagePP $w $args ]             *
+#*          <widget> setlinear                                           *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::setlinearImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    catch { $widgets(canvas) delete $widgets(actual_line) }
+    catch { $widgets(canvas) delete "textErase" }
+    bind $widgets(canvas) <ButtonPress-3>   "::imagepp::startMotion $widgets(this) %x %y 1"
+    bind $widgets(canvas) <B3-Motion>       "::imagepp::goMotion $widgets(this) %x %y 1"
+    bind $widgets(canvas) <ButtonRelease-3> "::imagepp::finishMotion $widgets(this) %x %y 1"
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::setareaImagePP (procedure)                                 *
+#*                                                                       *
+#* DESCRIPTION : Executes the "setarea" sub-command.                     *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::setareaImagePP $w $args ]               *
+#*          <widget> setarea                                             *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::setareaImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    catch { $widgets(canvas) delete $widgets(actual_line) }
+    catch { $widgets(canvas) delete "textErase" }
+    bind $widgets(canvas) <ButtonPress-3>   "::imagepp::startMotion $widgets(this) %x %y 2"
+    bind $widgets(canvas) <B3-Motion>       "::imagepp::goMotion $widgets(this) %x %y 2"
+    bind $widgets(canvas) <ButtonRelease-3> "::imagepp::finishMotion $widgets(this) %x %y 2"
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::setnoneImagePP (procedure)                                 *
+#*                                                                       *
+#* DESCRIPTION : Executes the "setnone" sub-command.                     *
+#*               This is a dummy proc, don't call it in your code.       *
+#*               Use your widget definition and the sub-command.         *
+#*                                                                       *
+#* SYNTAX : set ret [ ::imagepp::setnoneImagePP $w $args ]               *
+#*          <widget> setnone                                             *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w    : string. Widget name.                                      *
+#*      args : list. Arguments for sub-command.                          *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::setnoneImagePP { w args } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    catch { $widgets(canvas) delete $widgets(actual_line) }
+    catch { $widgets(canvas) delete "textErase" }
+    bind $widgets(canvas) <ButtonPress-1>   "::imagepp::startMotion $widgets(this) %x %y 3"
+    bind $widgets(canvas) <B1-Motion>       "::imagepp::goMotion $widgets(this) %x %y 3"
+    bind $widgets(canvas) <ButtonRelease-1> "::imagepp::finishMotion $widgets(this) %x %y 3"
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::resize (procedure)                                         *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Resize widget.                          *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::resize %W %w %h                                   *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*      width  : string. Widget width.                                   *
+#*      height : string. Widget height.                                  *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::resize { w width height } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    if { $options(-width) != $width || $options(-height) != $height } {
+
+        set options(-width)  $width
+        set options(-height) $height
+        $widgets(canvas) configure -width $options(-width)
+        ::imagepp::configureSlider $w
+
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::configureSlider (procedure)                                *
+#*                                                                       *
+#* DESCRIPTION : Puts or erases a slider, if necessary.                  *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::configureSlider $widget                           *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w      : string. Widget name.                                    *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::configureSlider { w } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    set rh $options(-height)
+    set rw $options(-width)
+
+    if { $vNeed >= $rh && ! [ winfo exists $w.vs ] } {
+
+        set widgets(vs) [ scrollbar $w.vs -command "$widgets(canvas) yview" ]
+        $widgets(canvas) configure -yscrollcommand "$widgets(vs) set"
+        grid $widgets(canvas) \
+            -in $widgets(this) \
+            -row 0 \
+            -column 0 \
+            -rowspan 1 \
+            -columnspan 1 \
+            -sticky news
+        grid $widgets(vs) -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
+        grid rowconfig    $widgets(this) 0 -weight 1 -minsize 0
+        grid columnconfig $widgets(this) 0 -weight 1 -minsize 0
+    
+    } elseif { $vNeed < $rh && [ winfo exists $w.vs ] } {
+    
+        $widgets(canvas) configure -yscrollcommand ""
+        destroy $w.vs
+        set widgets(vs) ""
+    
+    }
+
+    if { $hNeed >= $rw && ! [ winfo exists $w.hs ] } {
+
+        set widgets(hs) [ scrollbar $w.hs -orient horizontal -command "$widgets(canvas) xview" ]
+        $widgets(canvas) configure -xscrollcommand "$widgets(hs) set"
+        grid $widgets(canvas) \
+            -in $widgets(this) \
+            -row 0 \
+            -column 0 \
+            -rowspan 1 \
+            -columnspan 1 \
+            -sticky news
+        grid $widgets(hs) -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
+        grid rowconfig    $widgets(this) 0 -weight 1 -minsize 0
+        grid columnconfig $widgets(this) 0 -weight 1 -minsize 0
+    
+    } elseif { $hNeed < $rw && [ winfo exists $w.hs ] } {
+    
+        $widgets(canvas) configure -xscrollcommand ""
+        destroy $w.hs
+        set widgets(hs) ""
+    
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::startMotion (procedure)                                    *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Start mouse motion.                     *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::startMotion %W %x %y $typ                         *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w   : string. Widget name.                                       *
+#*      x   : string. x-coordinate.                                      *
+#*      y   : string. y-coordinate.                                      *
+#*      typ : string. (optional) Motion type.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::startMotion { w x y { typ 0 } } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    set lastX $x
+    set lastY $y
+
+    catch { $widgets(canvas) delete $widgets(actual_line) }
+    catch { $widgets(canvas) delete "textErase" }
+    if { $widgets(movingroi) == 0 } {
+
+        if { $typ == 1 } {
+
+            set widgets(actual_line) [ \
+                $widgets(canvas) create line $lastX $lastY $lastX $lastY \
+                    -arrow both   \
+                    -fill #0000ff \
+                    -width 1 \
+            ]
+
+        } elseif { $typ == 2 } {
+
+            set widgets(actual_line) [ \
+                $widgets(canvas) create rectangle \
+                    $lastX $lastY $lastX $lastY   \
+                    -outline #0000ff              \
+                    -width 1                      \
+            ]
+    
+        }
+
+    }
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::goMotion (procedure)                                       *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Do mouse motion.                        *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::goMotion %W %x %y $typ                            *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w   : string. Widget name.                                       *
+#*      x   : string. x-coordinate.                                      *
+#*      y   : string. y-coordinate.                                      *
+#*      typ : string. (optional) Motion type.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::goMotion { w x y typ } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    if { $widgets(movingroi) == 0 } {
+
+        if { $typ == 1 || $typ == 2 } {
+
+            $widgets(canvas) coords \
+                $widgets(actual_line) \
+                $lastX $lastY $x $y
+
+        } elseif { $typ == 3 } {
+
+            set widgets(profildata) [ list 3 $lastX $lastY $x $y ]
+            event generate $widgets(this) <<AfterProfil>>
+
+        }
+
+    }
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::finishMotion (procedure)                                   *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Finish mouse motion.                    *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::finishMotion %W %x %y $typ                        *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w   : string. Widget name.                                       *
+#*      x   : string. x-coordinate.                                      *
+#*      y   : string. y-coordinate.                                      *
+#*      typ : string. (optional) Motion type.                            *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::finishMotion { w x y typ } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    if { $widgets(movingroi) == 0 } {
+
+        if { $typ == 3 } { incr typ }
+        set widgets(profildata) [ list $typ $lastX $lastY $x $y ]
+
+        event generate $widgets(this) <<AfterProfil>>
+
+    }
+    set widgets(movingroi) 0
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::moveRect (procedure)                                       *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Move a rectangle.                       *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::moveRect %W %x %y                                 *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w   : string. Widget name.                                       *
+#*      x   : string. x-coordinate.                                      *
+#*      y   : string. y-coordinate.                                      *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::moveRect { w x y } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    set widgets(movingroi) 1
+    $widgets(canvas) move [ lindex $actROI 4 ] \
+        [ expr $x - $lastX ] \
+        [ expr $y - $lastY ]
+    $widgets(canvas) move [ lindex $actROI 0 ] \
+        [ expr $x - $lastX ] \
+        [ expr $y - $lastY ]
+    $widgets(canvas) move [ lindex $actROI 1 ] \
+        [ expr $x - $lastX ] \
+        [ expr $y - $lastY ]
+    $widgets(canvas) move [ lindex $actROI 2 ] \
+        [ expr $x - $lastX ] \
+        [ expr $y - $lastY ]
+    $widgets(canvas) move [ lindex $actROI 3 ] \
+        [ expr $x - $lastX ] \
+        [ expr $y - $lastY ]
+
+    set lastX $x
+    set lastY $y
+
+}
+
+#* PROCEDURE DESCRIPTION *************************************************
+#*                                                                       *
+#* ::imagepp::moveCorner (procedure)                                     *
+#*                                                                       *
+#* DESCRIPTION : Event callback. Move a rectangle corner.                *
+#*               This is a dummy proc, don't call it in your code.       *
+#*                                                                       *
+#* SYNTAX : ::imagepp::moveCorner %W %x %y $i                            *
+#*                                                                       *
+#* RETURN : -NONE-                                                       *
+#*                                                                       *
+#* PARAMETERS :                                                          *
+#*      w   : string. Widget name.                                       *
+#*      x   : string. x-coordinate.                                      *
+#*      y   : string. y-coordinate.                                      *
+#*      i   : string. Corner index.                                      *
+#*                                                                       *
+#******************************************************* END DESCRIPTION *
+proc ::imagepp::moveCorner { w x y i } {
+
+    # For namespace access
+    upvar ::imagepp::${w}::options  options
+    upvar ::imagepp::${w}::widgets  widgets
+    upvar ::imagepp::${w}::localIds localIds
+    upvar ::imagepp::${w}::hNeed    hNeed
+    upvar ::imagepp::${w}::vNeed    vNeed
+    upvar ::imagepp::${w}::actROI   actROI
+    upvar ::imagepp::${w}::lastX    lastX
+    upvar ::imagepp::${w}::lastY    lastY
+
+    set widgets(movingroi) 1
+
+    $widgets(canvas) move [ lindex $actROI $i ] \
+        [ expr $x - $lastX ] \
+        [ expr $y - $lastY ]
+
+    if { $i == 0 } {
+
+        $widgets(canvas) move [ lindex $actROI 1 ] \
+            0 [ expr $y - $lastY ]
+
+        $widgets(canvas) move [ lindex $actROI 3 ] \
+            [ expr $x - $lastX ] 0
+
+    } elseif { $i == 1 } {
+
+        $widgets(canvas) move [ lindex $actROI 0 ] \
+            0 [ expr $y - $lastY ]
+
+        $widgets(canvas) move [ lindex $actROI 2 ] \
+            [ expr $x - $lastX ] 0
+
+    } elseif { $i == 2 } {
+
+        $widgets(canvas) move [ lindex $actROI 3 ] \
+            0 [ expr $y - $lastY ]
+
+        $widgets(canvas) move [ lindex $actROI 1 ] \
+            [ expr $x - $lastX ] 0
+
+    } elseif { $i == 3 } {
+
+        $widgets(canvas) move [ lindex $actROI 2 ] \
+            0 [ expr $y - $lastY ]
+
+        $widgets(canvas) move [ lindex $actROI 0 ] \
+            [ expr $x - $lastX ] 0
+
+    }
+
+    # set area
+    set c0 [ $widgets(canvas) coords [ lindex $actROI 0 ] ]
+    set ux [ lindex $c0 0 ]; set uy [ lindex $c0 1 ]
+    set bx [ lindex $c0 2 ]; set by [ lindex $c0 3 ]
+
+    set c0 [ $widgets(canvas) coords [ lindex $actROI 1 ] ]
+    set ux [ expr ( [ lindex $c0 0 ] < $ux )? [ lindex $c0 0 ]: $ux ]
+    set uy [ expr ( [ lindex $c0 1 ] < $uy )? [ lindex $c0 1 ]: $uy ]
+    set bx [ expr ( [ lindex $c0 2 ] > $bx )? [ lindex $c0 2 ]: $bx ]
+    set by [ expr ( [ lindex $c0 3 ] > $by )? [ lindex $c0 3 ]: $by ]
+
+    set c0 [ $widgets(canvas) coords [ lindex $actROI 2 ] ]
+    set ux [ expr ( [ lindex $c0 0 ] < $ux )? [ lindex $c0 0 ]: $ux ]
+    set uy [ expr ( [ lindex $c0 1 ] < $uy )? [ lindex $c0 1 ]: $uy ]
+    set bx [ expr ( [ lindex $c0 2 ] > $bx )? [ lindex $c0 2 ]: $bx ]
+    set by [ expr ( [ lindex $c0 3 ] > $by )? [ lindex $c0 3 ]: $by ]
+
+    set c0 [ $widgets(canvas) coords [ lindex $actROI 3 ] ]
+    set ux [ expr ( [ lindex $c0 0 ] < $ux )? [ lindex $c0 0 ]: $ux ]
+    set uy [ expr ( [ lindex $c0 1 ] < $uy )? [ lindex $c0 1 ]: $uy ]
+    set bx [ expr ( [ lindex $c0 2 ] > $bx )? [ lindex $c0 2 ]: $bx ]
+    set by [ expr ( [ lindex $c0 3 ] > $by )? [ lindex $c0 3 ]: $by ]
+
+    $widgets(canvas) coords [ lindex $actROI 4 ] \
+        [ expr $ux + 6 ] \
+        [ expr $uy + 6 ] \
+        [ expr $bx - 6 ] \
+        [ expr $by - 6 ]
+
+    set lastX $x
+    set lastY $y
+
+}
+
+# EOF - imagepp.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/tkwidgets/mclistbox.tcl b/lib/maracasVisuLib/src/interface/tcl/tkwidgets/mclistbox.tcl
new file mode 100644 (file)
index 0000000..18a45a2
--- /dev/null
@@ -0,0 +1,2604 @@
+# Copyright (c) 1999, Bryan Oakley
+# All Rights Reservered
+#
+# Bryan Oakley
+# oakley@channelpoint.com
+#
+# mclistbox v1.02 March 30, 1999
+#
+# a multicolumn listbox written in pure tcl
+#
+# this code is freely distributable without restriction, but is 
+# provided as-is with no waranty expressed or implied. 
+#
+# basic usage: 
+#    
+#    mclistbox::mclistbox .listbox
+#    .listbox column add col1 -label "Column 1"
+#    .listbox column add col2 -label "Column 2"
+#    .listbox insert end [list "some stuff" "some more stuff"]
+#    .listbox insert end [list "a second row of stuff" "blah blah blah"]
+#
+# see the documentation for more, uh, documentation.
+#
+# Something to think about: implement a "-optimize" option, with two 
+# values: speed and memory. If set to speed, keep a copy of the data
+# in our hidden listbox so retrieval of data doesn't require us to
+# do all the getting and splitting and so forth. If set to "memory",
+# bag saving a duplicate copy of the data, which means data retrieval
+# will be slower, but memory requirements will be reduced. 
+
+package require Tk 8.0
+package provide mclistbox 1.02
+
+namespace eval ::mclistbox {
+
+    # this is the public interface
+    namespace export mclistbox
+
+    # these contain references to available options
+    variable widgetOptions
+    variable columnOptions
+
+    # these contain references to available commands and subcommands
+    variable widgetCommands
+    variable columnCommands
+    variable labelCommands
+}
+
+# ::mclistbox::Init --
+#
+#     Initialize the global (well, namespace) variables. This should
+#     only be called once, immediately prior to creating the first
+#     instance of the widget
+#
+# Results:
+#
+#     All state variables are set to their default values; all of 
+#     the option database entries will exist.
+#
+# Returns:
+# 
+#     empty string
+
+proc ::mclistbox::Init {} {
+    variable widgetOptions
+    variable columnOptions
+    variable widgetCommands
+    variable columnCommands
+    variable labelCommands
+
+    # here we match up command line options with option database names
+    # and classes. As it turns out, this is a handy reference of all of the
+    # available options. Note that if an item has a value with only one
+    # item (like -bd, for example) it is a synonym and the value is the
+    # actual item.
+
+    array set widgetOptions [list \
+           -background          {background          Background} \
+           -bd                  -borderwidth \
+           -bg                  -background \
+           -borderwidth         {borderWidth         BorderWidth} \
+           -columnbd            -columnborderwidth \
+           -columnborderwidth   {columnBorderWidth   BorderWidth} \
+           -columnrelief        {columnRelief        Relief} \
+           -cursor              {cursor              Cursor} \
+           -exportselection     {exportSelection     ExportSelection} \
+           -fg                  -foreground \
+           -fillcolumn          {fillColumn          FillColumn} \
+           -font                {font                Font} \
+           -foreground          {foreground          Foreground} \
+           -height              {height              Height} \
+           -highlightbackground {highlightBackground HighlightBackground} \
+           -highlightcolor      {highlightColor      HighlightColor} \
+           -highlightthickness  {highlightThickness  HighlightThickness} \
+           -labelanchor         {labelAnchor         Anchor} \
+           -labelbackground     {labelBackground     Background} \
+           -labelbd             -labelborderwidth \
+           -labelbg             -labelbackground \
+           -labelborderwidth    {labelBorderWidth    BorderWidth} \
+           -labelfg             -labelforeground \
+           -labelfont           {labelFont           Font} \
+           -labelforeground     {labelForeground     Foreground} \
+           -labelheight         {labelHeight         Height} \
+           -labelimage          {labelImage          Image} \
+           -labelrelief         {labelRelief         Relief} \
+           -labels              {labels              Labels} \
+           -relief              {relief              Relief} \
+           -resizablecolumns    {resizableColumns    ResizableColumns} \
+           -selectbackground    {selectBackground    Foreground} \
+           -selectborderwidth   {selectBorderWidth   BorderWidth} \
+           -selectcommand       {selectCommand       Command} \
+           -selectforeground    {selectForeground    Background} \
+           -selectmode          {selectMode          SelectMode} \
+           -setgrid             {setGrid             SetGrid} \
+           -takefocus           {takeFocus           TakeFocus} \
+           -width               {width               Width} \
+           -xscrollcommand      {xScrollCommand      ScrollCommand} \
+           -yscrollcommand      {yScrollCommand      ScrollCommand} \
+           ]
+
+    # and likewise for column-specific stuff. 
+    array set columnOptions [list \
+           -background         {background           Background} \
+           -bitmap             {bitmap               Bitmap} \
+           -font               {font                 Font} \
+           -foreground         {foreground           Foreground} \
+           -image              {image                Image} \
+           -label              {label                Label} \
+           -position           {position             Position} \
+           -resizable          {resizable            Resizable} \
+           -visible            {visible              Visible} \
+           -width              {width                Width} \
+            ]
+
+    # this defines the valid widget commands. It's important to
+    # list them here; we use this list to validate commands and
+    # expand abbreviations.
+    set widgetCommands [list \
+           activate     bbox       cget     column    configure  \
+           curselection delete     get      index     insert \
+           label        nearest    scan     see       selection  \
+           size         xview      yview
+    ]
+
+    set columnCommands [list add cget configure delete names nearest]
+    set labelCommands  [list bind]
+
+    ######################################################################
+    #- this initializes the option database. Kinda gross, but it works
+    #- (I think). 
+    ######################################################################
+
+    set packages [package names]
+
+    # why check for the Tk package? This lets us be sourced into 
+    # an interpreter that doesn't have Tk loaded, such as the slave
+    # interpreter used by pkg_mkIndex. In theory it should have no
+    # side effects when run 
+    if {[lsearch -exact [package names] "Tk"] != -1} {
+
+       # compute a widget name we can use to create a temporary widget
+       set tmpWidget ".__tmp__"
+       set count 0
+       while {[winfo exists $tmpWidget] == 1} {
+           set tmpWidget ".__tmp__$count"
+           incr count
+       }
+
+       # steal options from the listbox
+       # we want darn near all options, so we'll go ahead and do
+       # them all. No harm done in adding the one or two that we
+       # don't use.
+       listbox $tmpWidget 
+       foreach foo [$tmpWidget configure] {
+           if {[llength $foo] == 5} {
+               set option [lindex $foo 1]
+               set value [lindex $foo 4]
+               option add *Mclistbox.$option $value widgetDefault
+
+               # these options also apply to the individual columns...
+               if {[string compare $option "foreground"] == 0 \
+                       || [string compare $option "background"] == 0 \
+                       || [string compare $option "font"] == 0} {
+                   option add *Mclistbox*MclistboxColumn.$option $value \
+                           widgetDefault
+               }
+           }
+       }
+       destroy $tmpWidget
+
+       # steal some options from label widgets; we only want a subset
+       # so we'll use a slightly different method. No harm in *not*
+       # adding in the one or two that we don't use... :-)
+       label $tmpWidget
+       foreach option [list Anchor Background Font \
+               Foreground Height Image  ] {
+           set values [$tmpWidget configure -[string tolower $option]]
+           option add *Mclistbox.label$option [lindex $values 3]
+       }
+       destroy $tmpWidget
+
+       # these are unique to us...
+       option add *Mclistbox.columnBorderWidth   0      widgetDefault
+       option add *Mclistbox.columnRelief        flat   widgetDefault
+       option add *Mclistbox.labelBorderWidth    1      widgetDefault
+       option add *Mclistbox.labelRelief         raised widgetDefault
+       option add *Mclistbox.labels              1      widgetDefault
+       option add *Mclistbox.resizableColumns    1      widgetDefault
+       option add *Mclistbox.selectcommand       {}     widgetDefault
+       option add *Mclistbox.fillcolumn          {}     widgetDefault
+
+       # column options
+       option add *Mclistbox*MclistboxColumn.visible       1      widgetDefault
+       option add *Mclistbox*MclistboxColumn.resizable     1      widgetDefault
+       option add *Mclistbox*MclistboxColumn.position      end    widgetDefault
+       option add *Mclistbox*MclistboxColumn.label         ""     widgetDefault
+       option add *Mclistbox*MclistboxColumn.width         0      widgetDefault
+       option add *Mclistbox*MclistboxColumn.bitmap        ""     widgetDefault
+       option add *Mclistbox*MclistboxColumn.image         ""     widgetDefault
+    }
+
+    ######################################################################
+    # define the class bindings
+    ######################################################################
+    
+    SetClassBindings
+
+}
+
+# ::mclistbox::mclistbox --
+#
+#     This is the command that gets exported. It creates a new
+#     mclistbox widget.
+#
+# Arguments:
+#
+#     w        path of new widget to create
+#     args     additional option/value pairs (eg: -background white, etc.)
+#
+# Results:
+#
+#     It creates the widget and sets up all of the default bindings
+#
+# Returns:
+#
+#     The name of the newly create widget
+
+proc ::mclistbox::mclistbox {args} {
+    variable widgetOptions
+
+    # perform a one time initialization
+    if {![info exists widgetOptions]} {
+       Init
+    }
+
+    # make sure we at least have a widget name
+    if {[llength $args] == 0} {
+       error "wrong # args: should be \"mclistbox pathName ?options?\""
+    }
+
+    # ... and make sure a widget doesn't already exist by that name
+    if {[winfo exists [lindex $args 0]]} {
+       error "window name \"[lindex $args 0]\" already exists"
+    }
+
+    # and check that all of the args are valid
+    foreach {name value} [lrange $args 1 end] {
+       Canonize [lindex $args 0] option $name
+    }
+
+    # build it...
+    set w [eval Build $args]
+
+    # set some bindings...
+    SetBindings $w
+
+    # and we are done!
+    return $w
+}
+
+# ::mclistbox::Build --
+#
+#    This does all of the work necessary to create the basic
+#    mclistbox. 
+#
+# Arguments:
+#
+#    w        widget name
+#    args     additional option/value pairs
+#
+# Results:
+#
+#    Creates a new widget with the given name. Also creates a new
+#    namespace patterened after the widget name, as a child namespace
+#    to ::mclistbox
+#
+# Returns:
+#
+#    the name of the widget
+
+proc ::mclistbox::Build {w args} {
+    variable widgetOptions
+
+    # create the namespace for this instance, and define a few
+    # variables
+    namespace eval ::mclistbox::$w {
+
+       variable options
+       variable widgets
+       variable misc 
+    }
+
+    # this gives us access to the namespace variables within
+    # this proc
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    # initially we start out with no columns
+    set misc(columns) {}
+
+    # this is our widget -- a frame of class Mclistbox. Naturally,
+    # it will contain other widgets. We create it here because
+    # we need it to be able to set our default options.
+    set widgets(this)   [frame  $w -class Mclistbox -takefocus 1]
+
+    # this defines all of the default options. We get the
+    # values from the option database. Note that if an array
+    # value is a list of length one it is an alias to another
+    # option, so we just ignore it
+    foreach name [array names widgetOptions] {
+       if {[llength $widgetOptions($name)] == 1} continue
+       set optName  [lindex $widgetOptions($name) 0]
+       set optClass [lindex $widgetOptions($name) 1]
+       set options($name) [option get $w $optName $optClass]
+    }
+
+    # now apply any of the options supplied on the command
+    # line. This may overwrite our defaults, which is OK
+    if {[llength $args] > 0} {
+       array set options $args
+    }
+    
+    # the columns all go into a text widget since it has the 
+    # ability to scroll.
+    set widgets(text) [text $w.text \
+           -width 0 \
+           -height 0 \
+           -padx 0 \
+           -pady 0 \
+           -wrap none \
+           -borderwidth 0 \
+           -highlightthickness 0 \
+           -takefocus 0 \
+           -cursor {} \
+           ]
+
+    $widgets(text) configure -state disabled
+
+    # here's the tricky part (shhhh... don't tell anybody!)
+    # we are going to create column that completely fills 
+    # the base frame. We will use it to control the sizing
+    # of the widget. The trick is, we'll pack it in the frame 
+    # and then place the text widget over it so it is never
+    # seen.
+
+    set columnWidgets [NewColumn $w {__hidden__}]
+    set widgets(hiddenFrame)   [lindex $columnWidgets 0]
+    set widgets(hiddenListbox) [lindex $columnWidgets 1]
+    set widgets(hiddenLabel)   [lindex $columnWidgets 2]
+
+    # by default geometry propagation is turned off, but for this
+    # super-secret widget we want it turned on. The idea is, we 
+    # resize the listbox which resizes the frame which resizes the 
+    # whole shibang.
+    pack propagate $widgets(hiddenFrame) on
+
+    pack $widgets(hiddenFrame) -side top -fill both -expand y
+    place $widgets(text) -x 0 -y 0 -relwidth 1.0 -relheight 1.0
+    raise $widgets(text)
+
+    # we will later rename the frame's widget proc to be our
+    # own custom widget proc. We need to keep track of this
+    # new name, so we'll define and store it here...
+    set widgets(frame) ::mclistbox::${w}::$w
+
+    # this moves the original frame widget proc into our
+    # namespace and gives it a handy name
+    rename ::$w $widgets(frame)
+
+    # now, create our widget proc. Obviously (?) it goes in
+    # the global namespace. All mclistbox widgets will actually
+    # share the same widget proc to cut down on the amount of
+    # bloat. 
+    proc ::$w {command args} \
+           "eval ::mclistbox::WidgetProc {$w} \$command \$args"
+
+    # ok, the thing exists... let's do a bit more configuration. 
+    if {[catch "Configure $widgets(this) [array get options]" error]} {
+       catch {destroy $w}
+    }
+
+    # and be prepared to handle selections.. (this, for -exportselection
+    # support)
+    selection handle $w [list ::mclistbox::SelectionHandler $w get]
+
+    return $w
+}
+
+# ::mclistbox::SelectionHandler --
+#
+#    handle reqests to set or retrieve the primary selection. This is
+#    the "guts" of the implementation of the -exportselection option.
+#    What a pain! Note that this command is *not* called as a result
+#    of the widget's "selection" command, but rather as a result of
+#    the global selection being set or cleared.
+#
+#    If I read the ICCCM correctly (which is doubtful; who has time to
+#    read that thing thoroughly?), this should return each row as a tab
+#    separated list of values, and the whole as a newline separated
+#    list of rows.
+#
+# Arguments:
+#
+#    w       pathname of the widget
+#    type    one of "own", "lose" or "get"
+#    offset  only used if type is "get"; offset into the selection
+#            buffer where the returned data should begin
+#    length  number of bytes to return
+#
+
+proc ::mclistbox::SelectionHandler {w type {offset ""} {length ""}} {
+    upvar ::mclistbox::${w}::options   options
+    upvar ::mclistbox::${w}::misc      misc
+    upvar ::mclistbox::${w}::widgets   widgets
+
+    switch -exact $type {
+
+       own {
+           selection own \
+                   -command [list ::mclistbox::SelectionHandler $w lose] \
+                   -selection PRIMARY \
+                   $w
+       }
+
+       lose {
+           if {$options(-exportselection)} {
+               foreach id $misc(columns) {
+                   $widgets(listbox$id) selection clear 0 end
+               }
+           }
+       }
+
+       get {
+           set end [expr {$length + $offset - 1}]
+
+           set column [lindex $misc(columns) 0]
+           set curselection [$widgets(listbox$column) curselection]
+
+           # this is really, really slow (relatively speaking).
+           # but the only way I can think of to speed this up
+           # is to duplicate all the data in our hidden listbox,
+           # which I really don't want to do because of memory
+           # considerations.
+           set data ""
+           foreach index $curselection {
+               set rowdata [join [::mclistbox::WidgetProc-get $w $index]  "\t"]
+               lappend data $rowdata
+           }
+           set data [join $data "\n"]
+           return [string range $data $offset $end]
+       }
+
+    }
+}
+
+# ::mclistbox::convert --
+#
+#     public routine to convert %x, %y and %W binding substitutions.
+#     Given an x, y and or %W value relative to a given widget, this
+#     routine will convert the values to be relative to the mclistbox
+#     widget. For example, it could be used in a binding like this:
+#
+#     bind .mclistbox <blah> {doSomething [::mclistbox::convert %W -x %x]}
+#
+#     Note that this procedure is *not* exported, but is indented for
+#     public use. It is not exported because the name could easily 
+#     clash with existing commands. 
+#
+# Arguments:
+#
+#     w     a widget path; typically the actual result of a %W 
+#           substitution in a binding. It should be either a
+#           mclistbox widget or one of its subwidgets
+#
+#     args  should one or more of the following arguments or 
+#           pairs of arguments:
+#
+#           -x <x>      will convert the value <x>; typically <x> will
+#                       be the result of a %x substitution
+#           -y <y>      will convert the value <y>; typically <y> will
+#                       be the result of a %y substitution
+#           -W (or -w)  will return the name of the mclistbox widget
+#                       which is the parent of $w
+#
+# Returns:
+#
+#     a list of the requested values. For example, a single -w will
+#     result in a list of one items, the name of the mclistbox widget.
+#     Supplying "-x 10 -y 20 -W" (in any order) will return a list of
+#     three values: the converted x and y values, and the name of 
+#     the mclistbox widget.
+
+proc ::mclistbox::convert {w args} {
+    set result {}
+    if {![winfo exists $w]} {
+       error "window \"$w\" doesn't exist"
+    }
+
+    while {[llength $args] > 0} {
+       set option [lindex $args 0]
+       set args [lrange $args 1 end]
+
+       switch -exact -- $option {
+           -x {
+               set value [lindex $args 0]
+               set args [lrange $args 1 end]
+               set win $w
+               while {[winfo class $win] != "Mclistbox"} {
+                   incr value [winfo x $win]
+                   set win [winfo parent $win]
+                   if {$win == "."} break
+               }
+               lappend result $value
+           }
+
+           -y {
+               set value [lindex $args 0]
+               set args [lrange $args 1 end]
+               set win $w
+               while {[winfo class $win] != "Mclistbox"} {
+                   incr value [winfo y $win]
+                   set win [winfo parent $win]
+                   if {$win == "."} break
+               }
+               lappend result $value
+           }
+
+           -w -
+           -W {
+               set win $w
+               while {[winfo class $win] != "Mclistbox"} {
+                   set win [winfo parent $win]
+                   if {$win == "."} break;
+               }
+               lappend result $win
+           }
+       }
+    }
+    return $result
+}
+
+# ::mclistbox::SetBindings --
+#
+#    Sets up the default bindings for the named widget
+#
+# Arguments:
+#
+#    w   the widget pathname for which the bindings should be assigned
+#
+# Results:
+#
+#    The named widget will inheirit all of the default Mclistbox
+#    bindings.
+
+proc ::mclistbox::SetBindings {w} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    # we must do this so that the columns fill the text widget in
+    # the y direction
+    bind $widgets(text) <Configure> \
+           [list ::mclistbox::AdjustColumns $w %h]
+
+}
+
+# ::mclistbox::SetClassBindings --
+#
+#    Sets up the default bindings for the widget class
+#
+# Arguments:
+#
+#    none
+#
+
+proc ::mclistbox::SetClassBindings {} {
+    # this allows us to clean up some things when we go away
+    bind Mclistbox <Destroy> [list ::mclistbox::DestroyHandler %W]
+
+    # steal all of the standard listbox bindings. Note that if a user
+    # clicks in a column, %W will return that column. This is bad,
+    # so we have to make a substitution in all of the bindings to
+    # compute the real widget name (ie: the name of the topmost 
+    # frame)
+    foreach event [bind Listbox] {
+       set binding [bind Listbox $event]
+       regsub -all {%W} $binding {[::mclistbox::convert %W -W]} binding
+       regsub -all {%x} $binding {[::mclistbox::convert %W -x %x]} binding
+       regsub -all {%y} $binding {[::mclistbox::convert %W -y %y]} binding
+       bind Mclistbox $event $binding
+    }
+
+    # these define bindings for the column labels for resizing. Note
+    # that we need both the name of this widget (calculated by $this)
+    # as well as the specific widget that the event occured over.
+    # Also note that $this is a constant string that gets evaluated
+    # when the binding fires.
+    # What a pain.
+    set this {[::mclistbox::convert %W -W]}
+    bind MclistboxMouseBindings <ButtonPress-1> \
+           "::mclistbox::ResizeEvent $this buttonpress %W %x %X %Y"
+    bind MclistboxMouseBindings <ButtonRelease-1> \
+           "::mclistbox::ResizeEvent $this buttonrelease %W %x %X %Y"
+    bind MclistboxMouseBindings <Enter> \
+           "::mclistbox::ResizeEvent $this motion %W %x %X %Y"
+    bind MclistboxMouseBindings <Motion> \
+           "::mclistbox::ResizeEvent $this motion %W %x %X %Y"
+    bind MclistboxMouseBindings <B1-Motion> \
+           "::mclistbox::ResizeEvent $this drag %W %x %X %Y"
+}
+
+# ::mclistbox::NewColumn --
+#
+#    Adds a new column to the mclistbox widget
+#
+# Arguments:
+#
+#    w     the widget pathname
+#    id    the id for the new column
+#
+# Results:
+#
+#    Creates a set of widgets which defines the column. Adds 
+#    appropriate entries to the global array widgets for the
+#    new column. 
+#
+#    Note that this column is not added to the listbox by 
+#    this proc.
+#
+# Returns:
+#
+#    A list of three elements: the path to the column frame, 
+#    the path to the column listbox, and the path to the column
+#    label, in that order.
+
+proc ::mclistbox::NewColumn {w id} {
+    upvar ::mclistbox::${w}::widgets   widgets
+    upvar ::mclistbox::${w}::options   options
+    upvar ::mclistbox::${w}::misc      misc
+    upvar ::mclistbox::${w}::columnID  columnID
+
+    # the columns are all children of the text widget we created... 
+    set frame     \
+           [frame $w.frame$id \
+           -takefocus 0 \
+           -highlightthickness 0 \
+           -class MclistboxColumn \
+           -background $options(-background) \
+           ]
+
+    set listbox   \
+           [listbox $frame.listbox \
+           -takefocus 0 \
+           -bd 0 \
+           -setgrid $options(-setgrid) \
+           -exportselection false \
+           -selectmode $options(-selectmode) \
+           -highlightthickness 0 \
+           ]
+
+    set label     \
+           [label $frame.label \
+           -takefocus 0 \
+           -relief raised \
+           -bd 1 \
+           -highlightthickness 0 \
+           ]
+
+    # define mappings from widgets to columns
+    set columnID($label) $id
+    set columnID($frame) $id
+    set columnID($listbox) $id
+
+    # we're going to associate a new bindtag for the label to
+    # handle our resize bindings. Why? We want the bindings to
+    # be specific to this widget but we don't want to use the
+    # widget name. If we use the widget name then the bindings
+    # could get mixed up with user-supplied bindigs (via the 
+    # "label bind" command). 
+    set tag MclistboxLabel
+    bindtags $label  [list MclistboxMouseBindings $label]
+
+    # reconfigure the label based on global options
+    foreach option [list bd image height relief font anchor \
+           background foreground borderwidth] {
+       if {[info exists options(-label$option)] \
+               && $options(-label$option) != ""} {
+           $label configure -$option $options(-label$option)
+       }
+    }
+
+    # reconfigure the column based on global options
+    foreach option [list borderwidth relief] {
+       if {[info exists options(-column$option)] \
+               && $options(-column$option) != ""} {
+           $frame configure -$option $options(-column$option)
+       }
+    }
+
+    # geometry propagation must be off so we can control the size
+    # of the listbox by setting the size of the containing frame
+    pack propagate $frame off
+
+    pack $label   -side top -fill x -expand n
+    pack $listbox -side top -fill both -expand y -pady 2
+
+    # any events that happen in the listbox gets handled by the class
+    # bindings. This has the unfortunate side effect 
+    bindtags $listbox [list $w Mclistbox all]
+
+    # return a list of the widgets we created.
+    return [list $frame $listbox $label]
+}
+
+# ::mclistbox::Column-add --
+#
+#    Implements the "column add" widget command
+#
+# Arguments:
+#
+#    w      the widget pathname
+#    args   additional option/value pairs which define the column
+#
+# Results:
+#
+#    A column gets created and added to the listbox
+
+proc ::mclistbox::Column-add {w args} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    variable widgetOptions
+
+    set id "column-[llength $misc(columns)]" ;# a suitable default
+
+    # if the first argument doesn't have a "-" as the first
+    # character, it is an id to associate with this column
+    if {![string match {-*} [lindex $args 0]]} {
+       # the first arg must be an id. 
+       set id [lindex $args 0]
+       set args [lrange $args 1 end]
+       if {[lsearch -exact $misc(columns) $id] != -1} {
+           error "column \"$id\" already exists"
+       }
+    }
+
+    # define some reasonable defaults, then add any specific
+    # values supplied by the user
+    set opts(-bitmap)     {}
+    set opts(-image)      {}
+    set opts(-visible)    1
+    set opts(-resizable)  1
+    set opts(-position)   "end"
+    set opts(-width)      20
+    set opts(-background) $options(-background)
+    set opts(-foreground) $options(-foreground)
+    set opts(-font)       $options(-font)
+    set opts(-label)      $id
+
+    if {[expr {[llength $args]%2}] == 1} {
+       # hmmm. An odd number of elements in args
+       # if the last item is a valid option we'll give a different
+       # error than if its not
+       set option [::mclistbox::Canonize $w "column option" [lindex $args end]]
+       error "value for \"[lindex $args end]\" missing"
+    }
+    array set opts $args
+
+    # figure out if we have any data in the listbox yet; we'll need
+    # this information in a minute...
+    if {[llength $misc(columns)] > 0} {
+       set col0 [lindex $misc(columns) 0]
+       set existingRows [$widgets(listbox$col0) size]
+    } else {
+       set existingRows 0
+    }
+
+    # create the widget and assign the associated paths to our array
+    set widgetlist [NewColumn $w $id]
+
+    set widgets(frame$id)   [lindex $widgetlist 0]
+    set widgets(listbox$id) [lindex $widgetlist 1]
+    set widgets(label$id)   [lindex $widgetlist 2]
+    
+    # add this column to the list of known columns
+    lappend misc(columns) $id
+
+    # configure the options. As a side effect, it will be inserted
+    # in the text widget
+    eval ::mclistbox::Column-configure {$w} {$id} [array get opts]
+
+    # now, if there is any data already in the listbox, we need to
+    # add a corresponding number of blank items. At least, I *think*
+    # that's the right thing to do.
+    if {$existingRows > 0} {
+       set blanks {}
+       for {set i 0} {$i < $existingRows} {incr i} {
+           lappend blanks {}
+       }
+       eval {$widgets(listbox$id)} insert end $blanks
+    }
+
+    InvalidateScrollbars $w
+    return $id
+}
+
+# ::mclistbox::Column-configure --
+#
+#    Implements the "column configure" widget command
+#
+# Arguments:
+#
+#    w     widget pathname
+#    id    column identifier
+#    args  list of option/value pairs
+
+proc ::mclistbox::Column-configure {w id args} {
+    variable widgetOptions
+    variable columnOptions
+
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    # bail if they gave us a bogus id
+    set index [CheckColumnID $w $id]
+
+    # define some shorthand
+    set listbox $widgets(listbox$id)
+    set frame   $widgets(frame$id)
+    set label   $widgets(label$id)
+
+    if {[llength $args] == 0} {
+       # hmmm. User must be wanting all configuration information
+       # note that if the value of an array element is of length
+       # one it is an alias, which needs to be handled slightly
+       # differently
+       set results {}
+       foreach opt [lsort [array names columnOptions]] {
+           if {[llength $columnOptions($opt)] == 1} {
+               set alias $columnOptions($opt)
+               set optName $columnOptions($alias)
+               lappend results [list $opt $optName]
+           } else {
+               set optName  [lindex $columnOptions($opt) 0]
+               set optClass [lindex $columnOptions($opt) 1]
+               set default [option get $frame $optName $optClass]
+               lappend results [list $opt $optName $optClass \
+                       $default $options($id:$opt)]
+           }
+       }
+
+       return $results
+
+
+    } elseif {[llength $args] == 1} {
+
+       # the user must be querying something... I need to get this
+       # to return a bona fide list like the "real" configure 
+       # command, but it's not a priority at the moment. I still
+       # have to work on the option database support foo.
+       set option [::mclistbox::Canonize $w "column option" [lindex $args 0]]
+
+       set value $options($id:$option)
+       set optName  [lindex $columnOptions($option) 0]
+       set optClass [lindex $columnOptions($option) 1]
+       set default  [option get $frame $optName $optClass]
+       set results  [list $option $optName $optClass $default $value]
+       return $results
+
+    }
+
+    # if we have an odd number of values, bail. 
+    if {[expr {[llength $args]%2}] == 1} {
+       # hmmm. An odd number of elements in args
+       error "value for \"[lindex $args end]\" missing"
+    }
+    
+    # Great. An even number of options. Let's make sure they 
+    # are all valid before we do anything. Note that Canonize
+    # will generate an error if it finds a bogus option; otherwise
+    # it returns the canonical option name
+    foreach {name value} $args {
+       set name [::mclistbox::Canonize $w "column option" $name]
+       set opts($name) $value
+    }
+
+    # if we get to here, the user is wanting to set some options
+    foreach option [array names opts] {
+       set value $opts($option)
+       set options($id:$option) $value
+
+       switch -- $option {
+           -label {
+               $label configure -text $value
+           }
+           
+           -image -
+           -bitmap {
+               $label configure $option $value
+           }
+
+           -width {
+               set font [$listbox cget -font]
+               set factor [font measure $options(-font) "0"]
+               set width [expr {$value * $factor}]
+
+               $widgets(frame$id) configure -width $width
+               set misc(min-$widgets(frame$id)) $width
+               AdjustColumns $w
+           }
+           -font -
+           -foreground -
+           -background {
+               if {[string length $value] == 0} {set value $options($option)}
+               $listbox configure $option $value
+           }
+
+           -resizable {
+               if {[catch {
+                   if {$value} {
+                       set options($id:-resizable) 1
+                   } else {
+                       set options($id:-resizable) 0
+                   }
+               } msg]} {
+                   error "expected boolean but got \"$value\""
+               }
+           }
+
+           -visible {
+               if {[catch {
+                   if {$value} {
+                       set options($id:-visible) 1
+                       $widgets(text) configure -state normal
+                       $widgets(text) window configure 1.$index -window $frame
+                       $widgets(text) configure -state disabled
+
+                   } else {
+                       set options($id:-visible) 0
+                       $widgets(text) configure -state normal
+                       $widgets(text) window configure 1.$index -window {}
+                       $widgets(text) configure -state disabled
+                   }
+                   InvalidateScrollbars $w
+               } msg]} {
+                   error "expected boolean but got \"$value\""
+               }
+
+           }
+
+           -position {
+               if {[string compare $value "start"] == 0} {
+                   set position 0
+
+               } elseif {[string compare $value "end"] == 0} {
+
+                   set position [expr {[llength $misc(columns)] -1}]
+               } else {
+
+                   # ought to check for a legal value here, but I'm 
+                   # lazy
+                   set position $value
+               }
+
+               if {$position >= [llength $misc(columns)]} {
+                   set max [expr {[llength $misc(columns)] -1}]
+                   error "bad position; must be in the range of 0-$max"
+               }
+
+               # rearrange misc(columns) to reflect the new ordering
+               set current [lsearch -exact $misc(columns) $id]
+               set misc(columns) [lreplace $misc(columns) $current $current]
+               set misc(columns) [linsert $misc(columns) $position $id]
+               
+               set frame $widgets(frame$id)
+               $widgets(text) configure -state normal
+               $widgets(text) window create 1.$position \
+                       -window $frame -stretch 1
+               $widgets(text) configure -state disabled
+           }
+
+       }
+    }
+}
+
+
+# ::mclistbox::DestroyHandler {w} --
+# 
+#    Cleans up after a mclistbox widget is destroyed
+#
+# Arguments:
+#
+#    w    widget pathname
+#
+# Results:
+#
+#    The namespace that was created for the widget is deleted,
+#    and the widget proc is removed.
+
+proc ::mclistbox::DestroyHandler {w} {
+
+    # kill off any idle event we might have pending
+    if {[info exists ::mclistbox::${w}::misc(afterid)]} {
+       catch {
+           after cancel $::mclistbox::${w}::misc(afterid)
+           unset ::mclistbox::${w}::misc(afterid)
+       }
+    }
+
+    # if the widget actually being destroyed is of class Mclistbox,
+    # crush the namespace and kill the proc. Get it? Crush. Kill. 
+    # Destroy. Heh. Danger Will Robinson! Oh, man! I'm so funny it
+    # brings tears to my eyes.
+    if {[string compare [winfo class $w] "Mclistbox"] == 0} {
+       namespace delete ::mclistbox::$w
+       rename $w {}
+    }
+
+}
+
+# ::mclistbox::MassageIndex --
+#
+#    this proc massages indicies of the form @x,y such that 
+#    the coordinates are relative to the first listbox rather 
+#    than relative to the topmost frame. 
+#
+# Arguments:
+#
+#    w       widget pathname
+#    index   an index of the form @x,y
+#
+# Results:
+#
+#    Returns a new index with translated coordinates. This index
+#    may be used directly by an internal listbox.
+
+proc ::mclistbox::MassageIndex {w index} {
+    upvar ::mclistbox::${w}::widgets   widgets
+    upvar ::mclistbox::${w}::misc      misc
+
+    if {[regexp {@([0-9]+),([0-9]+)} $index matchvar x y]} {
+       set id [lindex $misc(columns) 0]
+       
+       incr y -[winfo y $widgets(listbox$id)]
+       incr y -[winfo y $widgets(frame$id)]
+       incr x [winfo x $widgets(listbox$id)]
+       incr x [winfo x $widgets(frame$id)]
+
+       set index @${x},${y}
+    }
+
+    return $index
+}
+
+# ::mclistbox::WidgetProc --
+#
+#    This gets uses as the widgetproc for an mclistbox widget. 
+#    Notice where the widget is created and you'll see that the
+#    actual widget proc merely evals this proc with all of the
+#    arguments intact.
+#
+#    Note that some widget commands are defined "inline" (ie:
+#    within this proc), and some do most of their work in 
+#    separate procs. This is merely because sometimes it was
+#    easier to do it one way or the other.
+#
+# Arguments:
+#
+#    w         widget pathname
+#    command   widget subcommand
+#    args      additional arguments; varies with the subcommand
+#
+# Results:
+#
+#    Performs the requested widget command
+
+proc ::mclistbox::WidgetProc {w command args} {
+    variable widgetOptions
+
+    upvar ::mclistbox::${w}::widgets   widgets
+    upvar ::mclistbox::${w}::options   options
+    upvar ::mclistbox::${w}::misc      misc
+    upvar ::mclistbox::${w}::columnID  columnID
+
+    set command [::mclistbox::Canonize $w command $command]
+
+    # some commands have subcommands. We'll check for that here 
+    # and mung the command and args so that we can treat them as 
+    # distinct commands in the following switch statement
+    if {[string compare $command "column"] == 0} {
+       set subcommand [::mclistbox::Canonize $w "column command" \
+               [lindex $args 0]]
+       set command "$command-$subcommand"
+       set args [lrange $args 1 end]
+
+    } elseif {[string compare $command "label"] == 0} {
+       set subcommand [::mclistbox::Canonize $w "label command" \
+               [lindex $args 0]]
+       set command "$command-$subcommand"
+       set args [lrange $args 1 end]
+    }
+
+    set result ""
+    catch {unset priorSelection}
+
+    # here we go. Error checking be damned!
+    switch $command {
+       xview {
+           # note that at present, "xview <index>" is broken. I'm
+           # not even sure how to do it. Unless I attach our hidden
+           # listbox to the scrollbar and use it. Hmmm..... I'll
+           # try that later. (FIXME)
+           set result [eval {$widgets(text)} xview $args]
+           InvalidateScrollbars $w
+       }
+
+       yview {
+           if {[llength $args] == 0} {
+               # length of zero means to fetch the yview; we can
+               # get this from a single listbox
+               set result [$widgets(hiddenListbox) yview]
+
+           } else {
+
+               # if it's one argument, it's an index. We'll pass that 
+               # index through the index command to properly translate
+               # @x,y indicies, and place the value back in args
+               if {[llength $args] == 1} {
+                   set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+                   set args [list $index]
+               }
+
+               # run the yview command on every column.
+               foreach id $misc(columns) {
+                   eval {$widgets(listbox$id)} yview $args
+               }
+               eval {$widgets(hiddenListbox)} yview $args
+
+               InvalidateScrollbars $w
+
+               set result ""
+           }
+       }
+
+       activate {
+           if {[llength $args] != 1} {
+               error "wrong \# of args: should be $w activate index"
+           }
+           set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+
+           foreach id $misc(columns) {
+               $widgets(listbox$id) activate $index
+           }
+           set result ""
+       }
+
+       bbox {
+           if {[llength $args] != 1} {
+               error "wrong \# of args: should be $w bbox index"
+           }
+           # get a real index. This will adjust @x,y indicies
+           # to account for the label, if any.
+           set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+
+           set id [lindex $misc(columns) 0]
+
+           # we can get the x, y, and height from the first 
+           # column.
+           set bbox [$widgets(listbox$id) bbox $index]
+           if {[string length $bbox] == 0} {return ""}
+
+           foreach {x y w h} $bbox {}
+           
+           # the x and y coordinates have to be adjusted for the
+           # fact that the listbox is inside a frame, and the 
+           # frame is inside a text widget. All of those add tiny
+           # offsets. Feh.
+           incr y [winfo y $widgets(listbox$id)]
+           incr y [winfo y $widgets(frame$id)]
+           incr x [winfo x $widgets(listbox$id)]
+           incr x [winfo x $widgets(frame$id)]
+
+           # we can get the width by looking at the relative x 
+           # coordinate of the right edge of the last column
+           set id [lindex $misc(columns) end]
+           set w [expr {[winfo width $widgets(frame$id)] + \
+                   [winfo x $widgets(frame$id)]}]
+           set bbox [list $x $y [expr {$x + $w}] $h]
+           set result $bbox
+       }
+
+       label-bind {
+           # we are just too clever for our own good. (that's a 
+           # polite way of saying this is more complex than it
+           # needs to be)
+
+           set id [lindex $args 0]
+           set index [CheckColumnID $w $id]
+
+           set args [lrange $args 1 end]
+           if {[llength $args] == 0} {
+               set result [bind $widgets(label$id)]
+           } else {
+
+               # when we create a binding, we'll actually have the 
+               # binding run our own command with the user's command
+               # as an argument. This way we can do some sanity checks
+               # before running the command. So, when querying a binding
+               # we need to only return the user's code
+               set sequence [lindex $args 0]
+               if {[llength $args] == 1} {
+                   set result [lindex [bind $widgets(label$id) $sequence] end]
+               } else {
+               
+                   # replace %W with our toplevel frame, then
+                   # do the binding
+                   set code [lindex $args 1]
+                   regsub -all {%W} $code $w code
+                   
+                   set result [bind $widgets(label$id) $sequence \
+                           [list ::mclistbox::LabelEvent $w $id $code]]
+               }
+           }
+       }
+
+       column-add {
+           eval ::mclistbox::Column-add {$w} $args
+           AdjustColumns $w
+           set result ""
+       }
+
+       column-delete {
+           foreach id $args {
+               set index [CheckColumnID $w $id]
+
+               # remove the reference from our list of columns
+               set misc(columns) [lreplace $misc(columns) $index $index]
+
+               # whack the widget
+               destroy $widgets(frame$id)
+
+               # clear out references to the individual widgets
+               unset widgets(frame$id)
+               unset widgets(listbox$id)
+               unset widgets(label$id)
+           }
+           InvalidateScrollbars $w
+           set result ""
+       }
+
+       column-cget {
+           if {[llength $args] != 2} {
+               error "wrong # of args: should be \"$w column cget name option\""
+           }
+           set id [::mclistbox::Canonize $w column [lindex $args 0]]
+           set option [lindex $args 1]
+           set data [::mclistbox::Column-configure $w $id $option]
+           set result [lindex $data 4]
+       }
+
+       column-configure {
+           set id [::mclistbox::Canonize $w column [lindex $args 0]]
+           set args [lrange $args 1 end]
+           set result [eval ::mclistbox::Column-configure {$w} {$id} $args]
+       }
+
+       column-names {
+           if {[llength $args] != 0} {
+               error "wrong # of args: should be \"$w column names\""
+           }
+           set result $misc(columns)
+       }
+
+       column-nearest {
+           if {[llength $args] != 1} {
+               error "wrong # of args: should be \"$w column nearest x\""
+           }
+
+           set x [lindex $args 0]
+           set tmp [$widgets(text) index @$x,0]
+           set tmp [split $tmp "."]
+           set index [lindex $tmp 1]
+
+           set result [lindex $misc(columns) $index]
+       }
+
+       cget {
+           if {[llength $args] != 1} {
+               error "wrong # args: should be $w cget option"
+           }
+           set opt [::mclistbox::Canonize $w option [lindex $args 0]]
+
+           set result $options($opt)
+       }
+
+
+       configure {
+           set result [eval ::mclistbox::Configure {$w} $args]
+
+       }
+
+       curselection {
+           set id [lindex $misc(columns) 0]
+           set result [$widgets(listbox$id) curselection]
+       }
+
+       delete {
+           if {[llength $args] < 1 || [llength $args] > 2} {
+               error "wrong \# of args: should be $w delete first ?last?"
+           }
+
+           # it's possible that the selection will change because
+           # of something we do. So, grab the current selection before
+           # we do anything. Just before returning we'll see if the
+           # selection has changed. If so, we'll call our selectcommand
+           if {$options(-selectcommand) != ""} {
+               set col0 [lindex $misc(columns) 0]
+               set priorSelection [$widgets(listbox$col0) curselection]
+           }
+
+           set index1 [::mclistbox::MassageIndex $w [lindex $args 0]]
+           if {[llength $args] == 2} {
+               set index2 [::mclistbox::MassageIndex $w [lindex $args 1]]
+           } else {
+               set index2 ""
+           }
+
+           # note we do an eval here to make index2 "disappear" if it
+           # is set to an empty string.
+           foreach id $misc(columns) {
+               eval {$widgets(listbox$id)} delete $index1 $index2
+           }
+           eval {$widgets(hiddenListbox)} delete $index1 $index2
+
+           InvalidateScrollbars $w
+
+           set result ""
+       }
+
+       get {
+           if {[llength $args] < 1 || [llength $args] > 2} {
+               error "wrong \# of args: should be $w get first ?last?"
+           }
+           set index1 [::mclistbox::MassageIndex $w [lindex $args 0]]
+           if {[llength $args] == 2} {
+               set index2 [::mclistbox::MassageIndex $w [lindex $args 1]]
+           } else {
+               set index2 ""
+           }
+
+           set result [eval ::mclistbox::WidgetProc-get {$w} $index1 $index2]
+
+       }
+
+       index {
+
+           if {[llength $args] != 1} {
+               error "wrong \# of args: should be $w index index"
+           }
+
+           set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+           set id [lindex $misc(columns) 0]
+
+           set result [$widgets(listbox$id) index $index]
+       }
+
+       insert {
+           if {[llength $args] < 1} {
+               error "wrong \# of args: should be $w insert ?element \
+                     element...?"
+           }
+
+           # it's possible that the selection will change because
+           # of something we do. So, grab the current selection before
+           # we do anything. Just before returning we'll see if the
+           # selection has changed. If so, we'll call our selectcommand
+           if {$options(-selectcommand) != ""} {
+               set col0 [lindex $misc(columns) 0]
+               set priorSelection [$widgets(listbox$col0) curselection]
+           }
+
+           set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+
+           ::mclistbox::Insert $w $index [lrange $args 1 end]
+
+           InvalidateScrollbars $w
+           set result ""
+       }
+
+       nearest {
+           if {[llength $args] != 1} {
+               error "wrong \# of args: should be $w nearest y"
+           }
+
+           # translate the y coordinate into listbox space
+           set id [lindex $misc(columns) 0]
+           set y [lindex $args 0]
+           incr y -[winfo y $widgets(listbox$id)]
+           incr y -[winfo y $widgets(frame$id)]
+
+           set col0 [lindex $misc(columns) 0]
+
+           set result [$widgets(listbox$col0) nearest $y]
+       }
+
+       scan {
+           foreach {subcommand x y} $args {}
+           switch $subcommand {
+               mark {
+                   # we have to treat scrolling in x and y differently;
+                   # scrolling in the y direction affects listboxes and
+                   # scrolling in the x direction affects the text widget.
+                   # to facilitate that, we need to keep a local copy
+                   # of the scan mark.
+                   set misc(scanmarkx) $x
+                   set misc(scanmarky) $y
+                   
+                   # set the scan mark for each column
+                   foreach id $misc(columns) {
+                       $widgets(listbox$id) scan mark $x $y
+                   }
+
+                   # we can't use the x coordinate given us, since it 
+                   # is relative to whatever column we are over. So,
+                   # we'll just usr the results of [winfo pointerx].
+                   $widgets(text) scan mark [winfo pointerx $w]  $y
+               }
+               dragto {
+                   # we want the columns to only scan in the y direction,
+                   # so we'll force the x componant to remain constant
+                   foreach id $misc(columns) {
+                       $widgets(listbox$id) scan dragto $misc(scanmarkx) $y
+                   }
+
+                   # since the scan mark of the text widget was based
+                   # on the pointer location, so must be the x
+                   # coordinate to the dragto command. And since we
+                   # want the text widget to only scan in the x
+                   # direction, the y componant will remain constant
+                   $widgets(text) scan dragto \
+                           [winfo pointerx $w] $misc(scanmarky)
+
+                   # make sure the scrollbars reflect the changes.
+                   InvalidateScrollbars $w
+               }
+
+               set result ""
+           }
+       }
+
+       see {
+           if {[llength $args] != 1} {
+               error "wrong \# of args: should be $w see index"
+           }
+           set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+
+           foreach id $misc(columns) {
+               $widgets(listbox$id) see $index
+           }
+           InvalidateScrollbars $w
+           set result {}
+       }
+
+       selection {
+           # it's possible that the selection will change because
+           # of something we do. So, grab the current selection before
+           # we do anything. Just before returning we'll see if the
+           # selection has changed. If so, we'll call our selectcommand
+           if {$options(-selectcommand) != ""} {
+               set col0 [lindex $misc(columns) 0]
+               set priorSelection [$widgets(listbox$col0) curselection]
+           }
+
+           set subcommand [lindex $args 0]
+           set args [lrange $args 1 end]
+
+           set prefix "wrong \# of args: should be $w"
+           switch $subcommand {
+               includes {
+                   if {[llength $args] != 1} {
+                       error "$prefix selection $subcommand index"
+                   }
+                   set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+                   set id [lindex $misc(columns) 0]
+                   set result [$widgets(listbox$id) selection includes $index]
+               }
+
+               set {
+                   switch [llength $args] {
+                       1 {
+                           set index1 [::mclistbox::MassageIndex $w \
+                                   [lindex $args 0]]
+                           set index2 ""
+                       }
+                       2 {
+                           set index1 [::mclistbox::MassageIndex $w \
+                                   [lindex $args 0]]
+                           set index2 [::mclistbox::MassageIndex $w \
+                                   [lindex $args 1]]
+                       }
+                       default {
+                           error "$prefix selection clear first ?last?"
+                       }
+                   }
+
+                   if {$options(-exportselection)} {
+                       SelectionHandler $w own
+                   }
+                   if {$index1 != ""} {
+                       foreach id $misc(columns) {
+                           eval {$widgets(listbox$id)} selection set \
+                                   $index1 $index2
+                       }
+                   }
+
+                   set result ""
+               }
+
+               anchor {
+                   if {[llength $args] != 1} {
+                       error "$prefix selection $subcommand index"
+                   }
+                   set index [::mclistbox::MassageIndex $w [lindex $args 0]]
+
+                   if {$options(-exportselection)} {
+                       SelectionHandler $w own
+                   }
+                   foreach id $misc(columns) {
+                       $widgets(listbox$id) selection anchor $index
+                   }
+                   set result ""
+               }
+
+               clear {
+                   switch [llength $args] {
+                       1 {
+                           set index1 [::mclistbox::MassageIndex $w \
+                                   [lindex $args 0]]
+                           set index2 ""
+                       }
+                       2 {
+                           set index1 [::mclistbox::MassageIndex $w \
+                                   [lindex $args 0]]
+                           set index2 [::mclistbox::MassageIndex $w \
+                                   [lindex $args 1]]
+                       }
+                       default {
+                           error "$prefix selection clear first ?last?"
+                       }
+                   }
+
+                   if {$options(-exportselection)} {
+                       SelectionHandler $w own
+                   }
+                   foreach id $misc(columns) {
+                       eval {$widgets(listbox$id)} selection clear \
+                               $index1 $index2
+                   }
+                   set result ""
+               }
+           }
+       }
+
+       size {
+           set id [lindex $misc(columns) 0]
+           set result [$widgets(listbox$id) size]
+       }
+    }
+
+    # if the user has a selectcommand defined and the selection changed,
+    # run the selectcommand
+    if {[info exists priorSelection] && $options(-selectcommand) != ""} {
+       set column [lindex $misc(columns) 0]
+       set currentSelection [$widgets(listbox$column) curselection]
+       if {[string compare $priorSelection $currentSelection] != 0} {
+           # this logic keeps us from getting into some sort of
+           # infinite loop of the selectcommand changes the selection
+           # (not particularly well tested, but it seems like the
+           # right thing to do...)
+           if {![info exists misc(skipRecursiveCall)]} {
+               set misc(skipRecursiveCall) 1
+               uplevel \#0 $options(-selectcommand) $currentSelection
+               catch {unset misc(skipRecursiveCall)}
+           }
+       }
+    }
+
+    return $result
+}
+
+# ::mclistbox::WidgetProc-get --
+#
+#    Implements the "get" widget command
+#
+# Arguments:
+#
+#    w      widget path
+#    args   additional arguments to the get command
+
+proc ::mclistbox::WidgetProc-get {w args} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    set returnType "list"
+    # the listbox "get" command returns different things
+    # depending on whether it has one or two args. Internally
+    # we *always* want a valid list, so we'll force a second
+    # arg which in turn forces the listbox to return a list,
+    # even if its a list of one element
+    if {[llength $args] == 1} {
+       lappend args [lindex $args 0]
+       set returnType "listOfLists"
+    }
+
+    # get all the data from each column
+    foreach id $misc(columns) {
+       set data($id) [eval {$widgets(listbox$id)} get $args]
+    }
+
+    # now join the data together one row at a time. Ugh.
+    set result {}
+    set rows [llength $data($id)]
+    for {set i 0} {$i < $rows} {incr i} {
+       set this {}
+       foreach column $misc(columns) {
+           lappend this [lindex $data($column) $i]
+       }
+       lappend result $this
+    }
+    
+    # now to unroll the list if necessary. If the user gave
+    # us only one indicie we want to return a single list
+    # of values. If they gave use two indicies we want to return
+    # a list of lists.
+    if {[string compare $returnType "list"] == 0} {
+       return $result
+    } else {
+       return [lindex $result 0]
+    }
+}
+
+# ::mclistbox::CheckColumnID --
+#
+#    returns the index of the id within our list of columns, or 
+#    reports an error if the id is invalid
+#
+# Arguments:
+#
+#    w    widget pathname
+#    id   a column id
+#
+# Results:
+#
+#   Will compute and return the index of the column within the
+#   list of columns (which happens to be it's -position, as it
+#   turns out) or returns an error if the named column doesn't
+#   exist.
+
+proc ::mclistbox::CheckColumnID {w id} {
+    upvar ::mclistbox::${w}::misc    misc
+
+    set id [::mclistbox::Canonize $w column $id]
+    set index [lsearch -exact $misc(columns) $id]
+    return $index
+}
+
+# ::mclistbox::LabelEvent --
+#
+#    Handle user events on the column labels for the Mclistbox
+#    class. 
+#
+# Arguments:
+#
+#    w        widget pathname
+#    id       a column identifier
+#    code     tcl code to be evaluated.
+#
+# Results:
+#
+#    Executes the code associate with an event, but only if the
+#    event wouldn't otherwise potentially trigger a resize event.
+#
+#    We use the cursor of the label to let us know whether the
+#    code should be executed. If it is set to the cursor of the
+#    mclistbox widget, the code will be executed. It is assumed
+#    that if it is not the same cursor, it is the resize cursor
+#    which should only be set if the cursor is very near a border
+#    of a label and the column is resizable.
+
+proc ::mclistbox::LabelEvent {w id code} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+
+    # only fire the binding if the cursor is our default cursor
+    # (ie: if we aren't in a "resize zone")
+    set cursor [$widgets(label$id) cget -cursor]
+    if {[string compare $cursor $options(-cursor)] == 0} {
+       uplevel \#0 $code
+    }
+}
+
+# ::mclistbox::HumanizeList --
+#
+#    Returns a human-readable form of a list by separating items
+#    by columns, but separating the last two elements with "or"
+#    (eg: foo, bar or baz)
+#
+# Arguments:
+#
+#    list    a valid tcl list
+#
+# Results:
+#
+#    A string which as all of the elements joined with ", " or 
+#    the word " or "
+
+proc ::mclistbox::HumanizeList {list} {
+
+    if {[llength $list] == 1} {
+       return [lindex $list 0]
+    } else {
+       set list [lsort $list]
+       set secondToLast [expr {[llength $list] -2}]
+       set most [lrange $list 0 $secondToLast]
+       set last [lindex $list end]
+
+       return "[join $most {, }] or $last"
+    }
+}
+
+# ::mclistbox::Canonize --
+#
+#    takes a (possibly abbreviated) option or command name and either 
+#    returns the canonical name or an error
+#
+# Arguments:
+#
+#    w        widget pathname
+#    object   type of object to canonize; must be one of "command",
+#             "option", "column" or "column option".
+#    opt      the option (or command) to be canonized
+#
+# Returns:
+#
+#    Returns either the canonical form of an option or command,
+#    or raises an error if the option or command is unknown or
+#    ambiguous.
+
+proc ::mclistbox::Canonize {w object opt} {
+    variable widgetOptions
+    variable columnOptions
+    variable widgetCommands
+    variable columnCommands
+    variable labelCommands
+
+    switch $object {
+       command {
+           if {[lsearch -exact $widgetCommands $opt] >= 0} {
+               return $opt
+           }
+
+           # command names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the columns in a temporary array so
+           # we can use [array names]
+           set list $widgetCommands
+           foreach element $list {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+
+       {label command} {
+           if {[lsearch -exact $labelCommands $opt] >= 0} {
+               return $opt
+           }
+
+           # command names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the columns in a temporary array so
+           # we can use [array names]
+           set list $labelCommands
+           foreach element $list {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+
+       {column command} {
+           if {[lsearch -exact $columnCommands $opt] >= 0} {
+               return $opt
+           }
+
+           # command names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the columns in a temporary array so
+           # we can use [array names]
+           set list $columnCommands
+           foreach element $list {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+
+       option {
+           if {[info exists widgetOptions($opt)] \
+                   && [llength $widgetOptions($opt)] == 3} {
+               return $opt
+           }
+           set list [array names widgetOptions]
+           set matches [array names widgetOptions ${opt}*]
+       }
+
+       {column option} {
+           if {[info exists columnOptions($opt)]} {
+               return $opt
+           }
+           set list [array names columnOptions]
+           set matches [array names columnOptions ${opt}*]
+       }
+
+       column {
+           upvar ::mclistbox::${w}::misc    misc
+
+           if {[lsearch -exact $misc(columns) $opt] != -1} {
+               return $opt
+           }
+           
+           # column names aren't stored in an array, and there
+           # isn't a way to get all the matches in a list, so
+           # we'll stuff the columns in a temporary array so
+           # we can use [array names]
+           set list $misc(columns)
+           foreach element $misc(columns) {
+               set tmp($element) ""
+           }
+           set matches [array names tmp ${opt}*]
+       }
+    }
+    if {[llength $matches] == 0} {
+       set choices [HumanizeList $list]
+       error "unknown $object \"$opt\"; must be one of $choices"
+
+    } elseif {[llength $matches] == 1} {
+       # deal with option aliases
+       set opt [lindex $matches 0]
+       switch $object {
+           option {
+               if {[llength $widgetOptions($opt)] == 1} {
+                   set opt $widgetOptions($opt)
+               }
+           }
+
+           {column option} {
+               if {[llength $columnOptions($opt)] == 1} {
+                   set opt $columnOptions($opt)
+               }
+           }
+       }
+
+       return $opt
+
+    } else {
+       set choices [HumanizeList $list]
+       error "ambiguous $object \"$opt\"; must be one of $choices"
+    }
+}
+
+# ::mclistbox::Configure --
+#
+#    Implements the "configure" widget subcommand
+#
+# Arguments:
+#
+#    w      widget pathname
+#    args   zero or more option/value pairs (or a single option)
+#
+# Results:
+#    
+#    Performs typcial "configure" type requests on the widget
+proc ::mclistbox::Configure {w args} {
+    variable widgetOptions
+
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+    
+    if {[llength $args] == 0} {
+       # hmmm. User must be wanting all configuration information
+       # note that if the value of an array element is of length
+       # one it is an alias, which needs to be handled slightly
+       # differently
+       set results {}
+       foreach opt [lsort [array names widgetOptions]] {
+           if {[llength $widgetOptions($opt)] == 1} {
+               set alias $widgetOptions($opt)
+               set optName $widgetOptions($alias)
+               lappend results [list $opt $optName]
+           } else {
+               set optName  [lindex $widgetOptions($opt) 0]
+               set optClass [lindex $widgetOptions($opt) 1]
+               set default [option get $w $optName $optClass]
+               lappend results [list $opt $optName $optClass \
+                       $default $options($opt)]
+           }
+       }
+
+       return $results
+    }
+    
+    # one argument means we are looking for configuration
+    # information on a single option
+    if {[llength $args] == 1} {
+       set opt [::mclistbox::Canonize $w option [lindex $args 0]]
+
+       set optName  [lindex $widgetOptions($opt) 0]
+       set optClass [lindex $widgetOptions($opt) 1]
+       set default [option get $w $optName $optClass]
+       set results [list $opt $optName $optClass \
+               $default $options($opt)]
+       return $results
+    }
+
+    # if we have an odd number of values, bail. 
+    if {[expr {[llength $args]%2}] == 1} {
+       # hmmm. An odd number of elements in args
+       error "value for \"[lindex $args end]\" missing"
+    }
+    
+    # Great. An even number of options. Let's make sure they 
+    # are all valid before we do anything. Note that Canonize
+    # will generate an error if it finds a bogus option; otherwise
+    # it returns the canonical option name
+    foreach {name value} $args {
+       set name [::mclistbox::Canonize $w option $name]
+       set opts($name) $value
+    }
+
+    # process all of the configuration options
+    foreach option [array names opts] {
+
+       set newValue $opts($option)
+       if {[info exists options($option)]} {
+           set oldValue $options($option)
+#          set options($option) $newValue
+       }
+
+       switch -- $option {
+           -exportselection {
+               if {$newValue} {
+                   SelectionHandler $w own
+                   set options($option) 1
+               } else {
+                   set options($option) 0
+               }
+           }
+
+           -fillcolumn {
+               # if the fill column changed, we need to adjust
+               # the columns.
+               AdjustColumns $w
+               set options($option) $newValue
+           }
+
+           -takefocus {
+               $widgets(frame) configure -takefocus $newValue
+               set options($option) [$widgets(frame) cget $option]
+           }
+
+           -background {
+               foreach id $misc(columns) {
+                   $widgets(listbox$id) configure -background $newValue
+                   $widgets(frame$id) configure   -background $newValue
+               }
+               $widgets(frame) configure -background $newValue
+
+               $widgets(text) configure -background $newValue
+               set options($option) [$widgets(frame) cget $option]
+           }
+
+           # { the following all must be applied to each listbox }
+           -foreground -
+           -font -
+           -selectborderwidth -
+           -selectforeground -
+           -selectbackground -
+           -setgrid {
+               foreach id $misc(columns) {
+                   $widgets(listbox$id) configure $option $newValue
+               }
+               $widgets(hiddenListbox) configure $option $newValue
+               set options($option) [$widgets(hiddenListbox) cget $option]
+           }
+
+           # { the following all must be applied to each listbox and frame }
+           -cursor {
+               foreach id $misc(columns) {
+                   $widgets(listbox$id) configure $option $newValue
+                   $widgets(frame$id) configure -cursor $newValue
+               }
+
+               # -cursor also needs to be applied to the 
+               # frames of each column
+               foreach id $misc(columns) {
+                   $widgets(frame$id) configure -cursor $newValue
+               }
+
+               $widgets(hiddenListbox) configure $option $newValue
+               set options($option) [$widgets(hiddenListbox) cget $option]
+           }
+
+           # { this just requires to pack or unpack the labels }
+           -labels {
+               if {$newValue} {
+                   set newValue 1
+                   foreach id $misc(columns) {
+                       pack $widgets(label$id) \
+                               -side top -fill x -expand n \
+                               -before $widgets(listbox$id)
+                   }
+                   pack $widgets(hiddenLabel) \
+                           -side top -fill x -expand n \
+                           -before $widgets(hiddenListbox)
+
+               } else {
+                   set newValue 
+                   foreach id $misc(columns) {
+                       pack forget $widgets(label$id)
+                   }
+                   pack forget $widgets(hiddenLabel)
+               }
+               set options($option) $newValue
+           }
+
+           -height {
+               $widgets(hiddenListbox) configure -height $newValue
+               InvalidateScrollbars $w
+               set options($option) [$widgets(hiddenListbox) cget $option]
+           }
+
+           -width {
+               if {$newValue == 0} {
+                   error "a -width of zero is not supported. "
+               }
+
+               $widgets(hiddenListbox) configure -width $newValue
+               InvalidateScrollbars $w
+               set options($option) [$widgets(hiddenListbox) cget $option]
+           }
+
+           # { the following all must be applied to each column frame }
+           -columnborderwidth -
+           -columnrelief {
+               regsub {column} $option {} listboxoption
+               foreach id $misc(columns) {
+                   $widgets(listbox$id) configure $listboxoption $newValue
+               }
+               $widgets(hiddenListbox) configure $listboxoption $newValue
+               set options($option) [$widgets(hiddenListbox) cget \
+                       $listboxoption]
+           }
+
+           -resizablecolumns {
+               if {$newValue} {
+                   set options($option) 1
+               } else {
+                   set options($option) 0
+               }
+           }
+           
+           # { the following all must be applied to each column header }
+           -labelimage -
+           -labelheight -
+           -labelrelief -
+           -labelfont -
+           -labelanchor -
+           -labelbackground -
+           -labelforeground -
+           -labelborderwidth {
+               regsub {label} $option {} labeloption
+               foreach id $misc(columns) {
+                   $widgets(label$id) configure $labeloption $newValue
+               }
+               $widgets(hiddenLabel) configure $labeloption $newValue
+               set options($option) [$widgets(hiddenLabel) cget $labeloption]
+           }
+
+           # { the following apply only to the topmost frame}
+           -borderwidth -
+           -highlightthickness -
+           -highlightcolor -
+           -highlightbackground -
+           -relief {
+               $widgets(frame) configure $option $newValue
+               set options($option) [$widgets(frame) cget $option]
+           }
+
+           -selectmode {
+               set options($option) $newValue
+           }
+
+           -selectcommand {
+               set options($option) $newValue
+           }
+
+           -xscrollcommand {
+               InvalidateScrollbars $w
+               set options($option) $newValue
+           }
+
+           -yscrollcommand {
+               InvalidateScrollbars $w
+               set options($option) $newValue
+           }
+       }
+    }
+}
+
+# ::mclistbox::UpdateScrollbars --
+#
+#    This proc does the work of actually update the scrollbars to
+#    reflect the current view
+#
+# Arguments:
+#
+#    w      widget pathname
+#
+# Results:
+#
+#    Potentially changes the size or placement of the scrollbars
+#    (if any) based on changes to the widget
+
+proc ::mclistbox::UpdateScrollbars {w} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    if {![winfo ismapped $w]} {
+       catch {unset misc(afterid)}
+       return
+    }
+
+    update idletasks
+    if {[llength $misc(columns)] > 0} {
+       if {[string length $options(-yscrollcommand)] != 0} {
+           set col0 [lindex $misc(columns) 0]
+           set yview [$widgets(listbox$col0) yview]
+           eval $options(-yscrollcommand) $yview
+       }
+
+       if {[string length $options(-xscrollcommand)] != 0} {
+           set col0 [lindex $misc(columns) 0]
+           set xview [$widgets(text) xview]
+           eval $options(-xscrollcommand) $xview
+       }
+    }
+    catch {unset misc(afterid)}
+}
+
+# ::mclistbox::InvalidateScrollbars --
+#
+#    Schedules the scrollbars to be updated the next time 
+#    we are idle.
+#
+# Arguments:
+#
+#    w     widget pathname
+#
+# Results:
+#
+#    sets up a proc to be run in the idle event handler
+
+proc ::mclistbox::InvalidateScrollbars {w} {
+
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    if {![info exists misc(afterid)]} {
+       set misc(afterid) \
+               [after idle "catch {::mclistbox::UpdateScrollbars $w}"]
+    }
+}
+
+# ::mclistbox::Insert --
+#
+#    This implements the "insert" widget command; it arranges for 
+#    one or more elements to be inserted into the listbox.
+#
+# Arguments:
+#
+#    w         widget pathname
+#    index     a valid listbox index to designate where the data is
+#              to be inserted
+#    arglist   A list of values to be inserted. Each element of the
+#              list will itself be treated as a list, one element for
+#              each column.
+#
+# Results:
+#
+#    Inserts the data into the list and updates the scrollbars
+
+proc ::mclistbox::Insert {w index arglist} {
+
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    foreach list $arglist {
+       # make sure we have enough elements for each column
+       for {set i [llength $list]} {$i < [llength $misc(columns)]} {incr i} {
+           lappend list {}
+       }
+
+       set column 0
+       foreach id $misc(columns) {
+           $widgets(listbox$id) insert $index [lindex $list $column]
+           incr column
+       }
+
+       # we also want to add a bogus item to the hidden listbox. Why?
+       # For standard listboxes, if you specify a height of zero the
+       # listbox will resize to be just big enough to hold all the lines.
+       # Since we use a hidden listbox to regulate the size of the widget
+       # and we want this same behavior, this listbox needs the same number
+       # of elements as the visible listboxes
+       #
+       # (NB: we might want to make this listbox contain the contents
+       # of all columns as a properly formatted list; then the get 
+       # command can query this listbox instead of having to query
+       # each individual listbox. The disadvantage is that it doubles
+       # the memory required to hold all the data)
+       $widgets(hiddenListbox) insert $index "x"
+    }
+    return ""
+}
+
+# ::mclistbox::ColumnIsHidden --
+#
+#    Returns a boolean representing whether a column is visible or
+#    not
+#
+# Arguments:
+#
+#    w     widget pathname
+#    id    a column identifier
+#
+# Results:
+#
+#    returns 1 if the column is visible (ie: not hidden), or 0
+#    if invisible. Note that the result doesn't consider whether
+#    the column is actually viewable. Even if it has been scrolled
+#    off screen, 1 will be returned as long as the column hasn't
+#    been hidden by turning the visibility off.
+
+proc ::mclistbox::ColumnIsHidden {w id} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::misc    misc
+    
+    set retval 1
+    set col [lsearch -exact $misc(columns) $id]
+
+    if {$col != ""} {
+       set index "1.$col"
+       catch {
+           set window [$widgets(text) window cget $index -window]
+           if {[string length $window] > 0 && [winfo exists $window]} {
+               set retval 0
+           }
+       }
+    }
+    return $retval
+}
+
+# ::mclistbox::AdjustColumns --
+#
+#    Adjusts the height and width of the individual columns.
+#
+# Arguments:
+#
+#    w       widget pathname
+#    height  height, in pixels, that the columns should be adjusted
+#            to. If null, the height will be the height of the text
+#            widget that underlies our columns.
+#
+# Results:
+#
+#    All columns will be adjusted to fill the text widget in the y
+#    direction. Also, if a -fillcolumn is defined, that column will
+#    be grown, if necessary, to fill the widget in the x direction.
+
+proc ::mclistbox::AdjustColumns {w {height ""}} {
+    upvar ::mclistbox::${w}::widgets widgets
+    upvar ::mclistbox::${w}::options options
+    upvar ::mclistbox::${w}::misc    misc
+
+    if {[string length $height] == 0} {
+       set height [winfo height $widgets(text)]
+    }
+
+    # resize the height of each column so it matches the height
+    # of the text widget, minus a few pixels. 
+    incr height -4
+    foreach id $misc(columns) {
+       $widgets(frame$id) configure -height $height
+    }
+    
+    # if we have a fillcolumn, change its width accordingly
+    if {$options(-fillcolumn) != ""} {
+
+       # make sure the column has been defined. If not, bail (?)
+       if {![info exists widgets(frame$options(-fillcolumn))]} {
+           return
+       }
+       set frame $widgets(frame$options(-fillcolumn))
+       set minwidth $misc(min-$frame)
+
+       # compute current width of all columns
+       set colwidth 0
+       set col 0
+       foreach id $misc(columns) {
+           if {![ColumnIsHidden $w $id] && $id != $options(-fillcolumn)} {
+               incr colwidth [winfo reqwidth $widgets(frame$id)]
+           }
+       }
+
+       # this is just shorthand for later use...
+       set id $options(-fillcolumn)
+
+       # compute optimal width
+       set optwidth [expr {[winfo width $widgets(text)] - \
+               (2 * [$widgets(text) cget -padx])}]
+
+       # compute the width of our fill column
+       set newwidth [expr {$optwidth - $colwidth}]
+
+       if {$newwidth < $minwidth} {
+           set newwidth $minwidth
+       }
+
+       # adjust the width of our fill column frame
+       $widgets(frame$id) configure -width $newwidth
+           
+    }
+    InvalidateScrollbars $w
+}
+
+# ::mclistbox::FindResizableNeighbor --
+#
+#    Returns the nearest resizable column to the left or right
+#    of the named column. 
+#
+# Arguments:
+#
+#    w          widget pathname
+#    id         column identifier
+#    direction  should be one of "right" or "left". Actually, anything
+#               that doesn't match "right" will be treated as "left"
+#
+# Results:
+#
+#    Will return the column identifier of the nearest resizable
+#    column, or an empty string if none exists. 
+
+proc ::mclistbox::FindResizableNeighbor {w id {direction right}} {
+    upvar ::mclistbox::${w}::widgets       widgets
+    upvar ::mclistbox::${w}::options       options
+    upvar ::mclistbox::${w}::misc          misc
+
+
+    if {$direction == "right"} {
+       set incr 1
+       set stop [llength $misc(columns)]
+       set start [expr {[lsearch -exact $misc(columns) $id] + 1}]
+    } else {
+       set incr -1
+       set stop -1
+       set start [expr {[lsearch -exact $misc(columns) $id] - 1}]
+    } 
+
+    for {set i $start} {$i != $stop} {incr i $incr} {
+       set col [lindex $misc(columns) $i]
+       if {![ColumnIsHidden $w $col] && $options($col:-resizable)} {
+           return $col
+       }
+    }
+    return ""
+}
+
+# ::mclistbox::ResizeEvent --
+#
+#    Handles the events which implement interactive column resizing
+#    using the mouse.
+#
+# Arguments:
+#
+#    w        widget pathname
+#    type     type of event; must be one of "buttonpress", "drag",
+#             "motion", or "buttonrelease"
+#    widget   the actual widget that the event occured over
+#    x        the x coordinate of the mouse, relative to $widget
+#    X        the root x coordinate of the mouse
+#    Y        the root y coordinate of the mouse
+#
+# The basic idea is this:
+#
+# whenever the cursor moves over the label, we examine it's x
+# coordinate to determine if its within a fixed amount of
+# pixels from the left or right edge. If it is, we reconfigure
+# the cursor to be a suitable "this thing is resizable" cursor.
+#
+# On a buttonclick, if the cursor is not the default cursor 
+# (and thus, presumably the resize cursor), we set up some
+# state for an eventual resize. We figure out which columns
+# are to the left and right and base a maximum resize amount
+# for each direction. We also define the absolute X coordinate
+# of the buttonpress as a reference point for the drag.
+#
+# on a b1-motion, if the drag state exists, we look at the 
+# absolute X value and use it to compute a delta value from
+# the reference (the X of the button press). We then resize the
+# left and right column frames by the delta amount.
+#
+# on a button release, we unset the state and the cursor, which
+# cancels all of the above.
+
+proc ::mclistbox::ResizeEvent {w type widget x X Y} {
+
+    upvar ::mclistbox::${w}::widgets       widgets
+    upvar ::mclistbox::${w}::options       options
+    upvar ::mclistbox::${w}::misc          misc
+    upvar ::mclistbox::${w}::columnID      columnID
+
+    # if the widget doesn't allow resizable cursors, there's
+    # nothing here to do...
+    if {!$options(-resizablecolumns)} {
+       return
+    }
+
+    # this lets us keep track of some internal state while
+    # the user is dragging the mouse
+    variable drag
+
+    # this lets us define a small window around the edges of
+    # the column. 
+    set threshold [expr {$options(-labelborderwidth) + 4}]
+
+    # this is what we use for the "this is resizable" cursor
+    set resizeCursor sb_h_double_arrow
+
+    # if we aren't over an area that we care about, bail.
+    if {![info exists columnID($widget)]} {
+       return
+    }
+
+    # id refers to the column name
+    set id $columnID($widget)
+
+    switch $type {
+
+       buttonpress {
+           # we will do all the work of initiating a drag only if
+           # the cursor is not the defined cursor. In theory this
+           # will only be the case if the mouse moves over the area
+           # in which a drag can happen.
+           if {[$widgets(label$id) cget -cursor] == $resizeCursor} {
+               if {$x <= $threshold} {
+                   set lid [::mclistbox::FindResizableNeighbor $w $id left]
+                   if {$lid == ""} return
+                   set drag(leftFrame)  $widgets(frame$lid)
+                   set drag(rightFrame) $widgets(frame$id)
+
+                   set drag(leftListbox)  $widgets(listbox$lid)
+                   set drag(rightListbox) $widgets(listbox$id)
+
+               } else {
+                   set rid [::mclistbox::FindResizableNeighbor $w $id right]
+                   if {$rid == ""} return
+                   set drag(leftFrame)  $widgets(frame$id)
+                   set drag(rightFrame) $widgets(frame$rid)
+
+                   set drag(leftListbox)  $widgets(listbox$id)
+                   set drag(rightListbox) $widgets(listbox$rid)
+
+               }
+               
+
+               set drag(leftWidth)  [winfo width $drag(leftFrame)]
+               set drag(rightWidth) [winfo width $drag(rightFrame)]
+
+               # it seems to be a fact that windows can never be 
+               # less than one pixel wide. So subtract that one pixel
+               # from our max deltas...
+               set drag(maxDelta)   [expr {$drag(rightWidth) - 1}]
+               set drag(minDelta)  -[expr {$drag(leftWidth) - 1}]
+
+               set drag(x) $X
+           }
+       }
+
+       motion {
+           if {[info exists drag(x)]} {return}
+
+           # this is just waaaaay too much work for a motion 
+           # event, IMO.
+
+           set resizable 0
+
+           # is the column the user is over resizable?
+           if {!$options($id:-resizable)} {return}
+
+           # did the user click on the left of a column? 
+           if {$x < $threshold} {
+               set leftColumn [::mclistbox::FindResizableNeighbor $w $id left]
+               if {$leftColumn != ""} {
+                   set resizable 1
+               }
+
+           } elseif {$x > [winfo width $widget] - $threshold} {
+               set rightColumn [::mclistbox::FindResizableNeighbor $w $id \
+                       right]
+               if {$rightColumn != ""} {
+                   set resizable 1
+               }
+           }
+
+           # if it's resizable, change the cursor 
+           set cursor [$widgets(label$id) cget -cursor]
+           if {$resizable && $cursor != $resizeCursor} {
+               $widgets(label$id) configure -cursor $resizeCursor
+
+           } elseif {!$resizable && $cursor == $resizeCursor} {
+               $widgets(label$id) configure -cursor $options(-cursor)
+           }
+       }
+
+       drag {
+           # if the state is set up, do the drag...
+           if {[info exists drag(x)]} {
+
+               set delta [expr {$X - $drag(x)}]
+               if {$delta >= $drag(maxDelta)} {
+                   set delta $drag(maxDelta)
+
+               } elseif {$delta <= $drag(minDelta)} {
+                   set delta $drag(minDelta)
+               }
+
+               set lwidth [expr {$drag(leftWidth) + $delta}]
+               set rwidth [expr {$drag(rightWidth) - $delta}]
+
+               $drag(leftFrame)   configure -width $lwidth
+               $drag(rightFrame)  configure -width $rwidth
+
+           }
+       }
+
+       buttonrelease {
+           set fillColumnID $options(-fillcolumn)
+           if {[info exists drag(x)] && $fillColumnID != {}} {
+               set fillColumnFrame $widgets(frame$fillColumnID)
+               if {[string compare $drag(leftFrame) $fillColumnFrame] == 0 \
+                       || [string compare $drag(rightFrame) $fillColumnFrame] == 0} {
+                   set width [$fillColumnFrame cget -width]
+                   set misc(minFillColumnSize) $width
+               }
+               set misc(min-$drag(leftFrame))  [$drag(leftFrame) cget -width]
+               set misc(min-$drag(rightFrame)) [$drag(rightFrame) cget -width]
+           }
+
+           # reset the state and the cursor
+           catch {unset drag}
+           $widgets(label$id) configure -cursor $options(-cursor)
+
+       }
+    }
+}
+
+# end of mclistbox.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/Makefile.am b/lib/maracasVisuLib/src/interface/tcl/to_change/Makefile.am
new file mode 100644 (file)
index 0000000..55344f1
--- /dev/null
@@ -0,0 +1,11 @@
+## Makefile.am -- Process this file with automake to produce Makefile.in
+
+EXTRA_DIST = \
+       ev_userzoom.tcl \
+       TkImageViewerInteractor.tcl \
+       TkInteractor.tcl \
+       volTkInteractor.tcl \
+       vtkInt.tcl \
+       WidgetObject.tcl
+
+## eof - Makefile.am
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/Makefile.in b/lib/maracasVisuLib/src/interface/tcl/to_change/Makefile.in
new file mode 100644 (file)
index 0000000..2d3333e
--- /dev/null
@@ -0,0 +1,224 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CFLAGS_DEBUG = @CFLAGS_DEBUG@
+CFLAGS_OPTIMIZE = @CFLAGS_OPTIMIZE@
+CFLAGS_WARNING = @CFLAGS_WARNING@
+CPP = @CPP@
+CXX = @CXX@
+DLLTOOL = @DLLTOOL@
+DL_LIBS = @DL_LIBS@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_CONFIG = @GSL_CONFIG@
+GSL_LIBS = @GSL_LIBS@
+IDO_CFLAGS = @IDO_CFLAGS@
+IDO_LIBS = @IDO_LIBS@
+KGFO_CFLAGS = @KGFO_CFLAGS@
+KGFO_CONFIG = @KGFO_CONFIG@
+KGFO_LIBS = @KGFO_LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+MARACAS_ALGORITHM_VER = @MARACAS_ALGORITHM_VER@
+MARACAS_ALGORITHM_VER_STR = @MARACAS_ALGORITHM_VER_STR@
+MARACAS_KERNEL_VER = @MARACAS_KERNEL_VER@
+MARACAS_KERNEL_VER_STR = @MARACAS_KERNEL_VER_STR@
+MARACAS_TCL_VER = @MARACAS_TCL_VER@
+MARACAS_TCL_VER_STR = @MARACAS_TCL_VER_STR@
+MARACAS_VER = @MARACAS_VER@
+MARACAS_VER_STR = @MARACAS_VER_STR@
+MATH_LIBS = @MATH_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+TCLTK_LIBS = @TCLTK_LIBS@
+TCL_BIN_DIR = @TCL_BIN_DIR@
+TCL_INC_DIR = @TCL_INC_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_LIB_FILE = @TCL_LIB_FILE@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TK_BIN_DIR = @TK_BIN_DIR@
+TK_INC_DIR = @TK_INC_DIR@
+TK_LIB_FILE = @TK_LIB_FILE@
+TK_SRC_DIR = @TK_SRC_DIR@
+VERSION = @VERSION@
+VTK_CFLAGS = @VTK_CFLAGS@
+VTK_LIBS = @VTK_LIBS@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CONFIG = @WX_CONFIG@
+WX_LIBS = @WX_LIBS@
+
+EXTRA_DIST =   ev_userzoom.tcl         TkImageViewerInteractor.tcl     TkInteractor.tcl        volTkInteractor.tcl     vtkInt.tcl      WidgetObject.tcl
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu tcl/to_change/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tcl/to_change
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tcl/to_change/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+       -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/TkImageViewerInteractor.tcl b/lib/maracasVisuLib/src/interface/tcl/to_change/TkImageViewerInteractor.tcl
new file mode 100644 (file)
index 0000000..ecf08d3
--- /dev/null
@@ -0,0 +1,258 @@
+
+proc BindTkImageViewer {widget} {
+   # to avoid queing up multple expose events.
+   SetWidgetVariableValue $widget Rendering 0
+
+   set imager [[$widget GetImageViewer] GetImager]
+
+   # stuff for window level text.
+   set mapper [NewWidgetObject $widget vtkTextMapper Mapper1]
+     $mapper SetInput "none"
+     $mapper SetFontFamilyToTimes
+     $mapper SetFontSize 18
+     $mapper BoldOn
+     $mapper ShadowOn
+   set actor [NewWidgetObject $widget vtkActor2D Actor1]
+     $actor SetMapper $mapper
+     $actor SetLayerNumber 1
+     [$actor GetPositionCoordinate] SetValue 4 22
+     [$actor GetProperty] SetColor 1 1 0.5
+     $actor SetVisibility 0
+   $imager AddActor2D $actor
+   
+   # stuff for window level text.
+   set mapper [NewWidgetObject $widget vtkTextMapper Mapper2]
+     $mapper SetInput "none"
+     $mapper SetFontFamilyToTimes
+     $mapper SetFontSize 18
+     $mapper BoldOn
+     $mapper ShadowOn
+   set actor [NewWidgetObject $widget vtkActor2D Actor2]
+     $actor SetMapper $mapper
+     $actor SetLayerNumber 1
+     [$actor GetPositionCoordinate] SetValue 4 4
+     [$actor GetProperty] SetColor 1 1 0.5
+     $actor SetVisibility 0
+   $imager AddActor2D $actor
+   
+   # bindings
+   # window level
+   bind $widget <ButtonPress-1> {StartWindowLevelInteraction %W %x %y}
+   bind $widget <B1-Motion> {UpdateWindowLevelInteraction %W %x %y}
+   bind $widget <ButtonRelease-1> {EndWindowLevelInteraction %W}
+
+   # Get the value
+   bind $widget <ButtonPress-3> {StartQueryInteraction %W %x %y}
+   bind $widget <B3-Motion> {UpdateQueryInteraction %W %x %y}
+   bind $widget <ButtonRelease-3> {EndQueryInteraction %W}
+
+   bind $widget <Expose> {ExposeTkImageViewer %W %x %y %w %h}
+   bind $widget <Enter> {EnterTkViewer %W}
+   bind $widget <Leave> {LeaveTkViewer %W}
+   bind $widget <KeyPress-e> {exit}
+   bind $widget <KeyPress-u> {wm deiconify .vtkInteract}
+   bind $widget <KeyPress-r> {ResetTkImageViewer %W}
+}
+
+
+proc EnterTkViewer {widget} {
+   SetWidgetVariableValue $widget OldFocus [focus]
+   focus $widget
+}
+
+proc LeaveTkViewer {widget} {
+   set old [GetWidgetVariableValue $widget OldFocus]
+   if {$old != ""} {
+      focus $old
+   }
+}
+
+proc ExposeTkImageViewer {widget x y w h} {
+   # Do not render if we are already rendering
+   if {[GetWidgetVariableValue $widget Rendering] == 1} {
+      #puts "Abort Expose: x = $x,  y = $y"
+      return
+   }
+
+   # empty the que of any other expose events
+   SetWidgetVariableValue $widget Rendering 1
+   update
+   SetWidgetVariableValue $widget Rendering 0
+
+   # ignore the region to redraw for now.
+   #puts "Expose: x = $x,  y = $y"
+   $widget Render
+}
+
+proc StartWindowLevelInteraction {widget x y} {
+   set viewer [$widget GetImageViewer]
+
+   # save the starting mouse position and the corresponding window/level
+   SetWidgetVariableValue $widget X $x
+   SetWidgetVariableValue $widget Y $y
+   SetWidgetVariableValue $widget Window [$viewer GetColorWindow]
+   SetWidgetVariableValue $widget Level [$viewer GetColorLevel]
+
+   #puts "------------------------------------"
+   #puts "start: ($x, $y), w = [$viewer GetColorWindow], l =[$viewer GetColorLevel] "
+
+   # make the window level text visible
+   set actor [GetWidgetVariableValue $widget Actor1]
+   $actor SetVisibility 1
+   set actor [GetWidgetVariableValue $widget Actor2]
+   $actor SetVisibility 1
+
+   UpdateWindowLevelInteraction $widget $x $y
+}
+
+
+proc EndWindowLevelInteraction {widget} {
+   set actor [GetWidgetVariableValue $widget Actor1]
+   $actor SetVisibility 0
+   set actor [GetWidgetVariableValue $widget Actor2]
+   $actor SetVisibility 0
+   $widget Render
+}
+
+
+# clicking on the window sets up sliders with current value at mouse,
+# and scaled so that the whole window represents x4 change.
+proc UpdateWindowLevelInteraction {widget x y} {
+   set viewer [$widget GetImageViewer]
+
+   # get the widgets dimensions
+   set width [lindex [$widget configure -width] 4]
+   set height [lindex [$widget configure -height] 4]
+
+   # get the old window level values
+   set window [GetWidgetVariableValue $widget Window]
+   set level [GetWidgetVariableValue $widget Level]
+
+   # get starting x, y and window/level values to compute delta
+   set start_x [GetWidgetVariableValue $widget X]
+   set start_y [GetWidgetVariableValue $widget Y]
+
+   # compute normalized delta
+   set dx [expr 4.0 * ($x - $start_x) / $width]
+   set dy [expr 4.0 * ($start_y - $y) / $height]
+
+   # scale by current values 
+   set dx [expr $dx * $window]
+   set dy [expr $dy * $window]
+
+   #puts "   update: ($x, $y), dx = $dx, dy = $dy"
+
+   # abs so that direction does not flip
+   if {$window < 0.0} {
+      set dx [expr -$dx]
+      set dy [expr -$dy]
+   }
+
+   # compute new window level
+   set new_window [expr $dx + $window]
+   if {$new_window < 0.0} {
+      set new_level [expr $dy + $level]
+   } else {
+      set new_level [expr $level - $dy]
+   }
+
+   # zero window or level can trap the value.
+   # put a limit of 1 / 100 value
+
+
+   # if window is negative, then delta level should flip (down is dark).
+   if {$new_window < 0.0} {set dy [expr -$dy]}
+
+
+   $viewer SetColorWindow $new_window
+   $viewer SetColorLevel $new_level
+
+   set mapper [GetWidgetVariableValue $widget Mapper1]
+   $mapper SetInput "Window: $new_window"
+
+   set mapper [GetWidgetVariableValue $widget Mapper2]
+   $mapper SetInput "Level: $new_level"
+
+   $widget Render
+}
+
+# ----------- Reset: Set window level to show all values ---------------
+
+proc ResetTkImageViewer {widget} {
+   set viewer [$widget GetImageViewer]
+   set input [$viewer GetInput]
+   if {$input == ""} {
+      return
+   }
+   # Get the extent in viewer
+   set z [$viewer GetZSlice]
+   # x, y????
+   $input UpdateInformation
+   set whole [$input GetWholeExtent]
+   $input SetUpdateExtent [lindex $whole 0] [lindex $whole 1] \
+          [lindex $whole 2] [lindex $whole 3] $z $z
+   $input Update
+
+   set range [$input GetScalarRange]
+   set low [lindex $range 0]
+   set high [lindex $range 1]
+   
+   $viewer SetColorWindow [expr $high - $low]
+   $viewer SetColorLevel [expr ($high + $low) * 0.5]
+
+   $widget Render
+}
+   
+
+
+
+# ----------- Query PixleValue stuff ---------------
+
+proc StartQueryInteraction {widget x y} {
+   set actor [GetWidgetVariableValue $widget Actor2]
+   $actor SetVisibility 1
+
+   UpdateQueryInteraction $widget $x $y
+}
+
+
+proc EndQueryInteraction {widget} {
+   set actor [GetWidgetVariableValue $widget Actor2]
+   $actor SetVisibility 0
+   $widget Render
+}
+
+
+proc UpdateQueryInteraction {widget x y} {
+   set viewer [$widget GetImageViewer]
+   set input [$viewer GetInput]
+   set z [$viewer GetZSlice]
+
+   # y is flipped upside down
+   set height [lindex [$widget configure -height] 4]
+   set y [expr $height - $y]
+
+   # make sure point is in the whole extent of the image.
+   scan [$input GetWholeExtent] "%d %d %d %d %d %d" \
+     xMin xMax yMin yMax zMin zMax
+   if {$x < $xMin || $x > $xMax || $y < $yMin || $y > $yMax || \
+       $z < $zMin || $z > $zMax} {
+      return
+   }
+
+   $input SetUpdateExtent $x $x $y $y $z $z
+   $input Update
+   set data $input
+   set numComps [$data GetNumberOfScalarComponents]
+   set str ""
+   for {set idx 0} {$idx < $numComps} {incr idx} {
+      set val [$data GetScalarComponentAsFloat $x $y $z $idx]
+      set str [format "%s  %.1f" $str $val]
+   }
+
+   set mapper [GetWidgetVariableValue $widget Mapper2]
+   $mapper SetInput "($x, $y): $str"
+
+   $widget Render
+}
+
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/TkInteractor.tcl b/lib/maracasVisuLib/src/interface/tcl/to_change/TkInteractor.tcl
new file mode 100644 (file)
index 0000000..3df67a3
--- /dev/null
@@ -0,0 +1,580 @@
+set TkInteractor_StartRenderMethod ""
+set TkInteractor_EndRenderMethod ""
+set TkInteractor_InteractiveUpdateRate 15.0
+set TkInteractor_StillUpdateRate 0.1
+
+proc BindTkRenderWidget {widget} {
+    bind $widget <Any-ButtonPress> {StartMotion %W %x %y}
+    bind $widget <Any-ButtonRelease> {EndMotion %W %x %y}
+    bind $widget <B1-Motion> {Rotate %W %x %y}
+    bind $widget <B2-Motion> {Pan %W %x %y}
+    bind $widget <B3-Motion> {Zoom %W %x %y}
+    bind $widget <Shift-B1-Motion> {Pan %W %x %y}
+    bind $widget <Shift-B3-Motion> {RubberZoom %W %x %y}
+    bind $widget <KeyPress-r> {Reset %W %x %y}
+    bind $widget <KeyPress-u> {wm deiconify .vtkInteract}
+    bind $widget <KeyPress-w> {Wireframe %W}
+    bind $widget <KeyPress-s> {Surface %W}
+    bind $widget <KeyPress-p> {PickActor %W %x %y}
+    bind $widget <Enter> {Enter %W %x %y}
+    bind $widget <Leave> {focus $oldFocus}
+    bind $widget <Expose> {Expose %W}
+}
+
+# a litle more complex than just "bind $widget <Expose> {%W Render}"
+# we have to handle all pending expose events otherwise they que up.
+proc Expose {widget} {
+    global TkInteractor_StillUpdateRate
+    if {[GetWidgetVariableValue $widget InExpose] == 1} {
+       return
+    }
+    SetWidgetVariableValue $widget InExpose 1    
+    [$widget GetRenderWindow] SetDesiredUpdateRate $TkInteractor_StillUpdateRate
+    update
+    [$widget GetRenderWindow] Render
+    SetWidgetVariableValue $widget InExpose 0
+}
+
+# Global variable keeps track of whether active renderer was found
+set RendererFound 0
+
+# Create event bindings
+#
+proc Render {widget} {
+    global CurrentCamera CurrentLight
+    global TkInteractor_StartRenderMethod
+    global TkInteractor_EndRenderMethod
+
+    if { $TkInteractor_StartRenderMethod != "" } {
+       $TkInteractor_StartRenderMethod
+    }
+
+    eval $CurrentLight SetPosition [$CurrentCamera GetPosition]
+    eval $CurrentLight SetFocalPoint [$CurrentCamera GetFocalPoint]
+
+    $widget Render
+
+    if { $TkInteractor_EndRenderMethod != "" } {
+       $TkInteractor_EndRenderMethod
+    }
+}
+
+proc UpdateRenderer {widget x y} {
+    global CurrentCamera CurrentLight 
+    global CurrentRenderWindow CurrentRenderer
+    global RendererFound LastX LastY
+    global WindowCenterX WindowCenterY
+
+    # Get the renderer window dimensions
+    set WindowX [lindex [$widget configure -width] 4]
+    set WindowY [lindex [$widget configure -height] 4]
+
+    # Find which renderer event has occurred in
+    set CurrentRenderWindow [$widget GetRenderWindow]
+    set renderers [$CurrentRenderWindow GetRenderers]
+    set numRenderers [$renderers GetNumberOfItems]
+
+    $renderers InitTraversal; set RendererFound 0
+    for {set i 0} {$i < $numRenderers} {incr i} {
+        set CurrentRenderer [$renderers GetNextItem]
+        set vx [expr double($x) / $WindowX]
+        set vy [expr ($WindowY - double($y)) / $WindowY]
+        set viewport [$CurrentRenderer GetViewport]
+        set vpxmin [lindex $viewport 0]
+        set vpymin [lindex $viewport 1]
+        set vpxmax [lindex $viewport 2]
+        set vpymax [lindex $viewport 3]
+        if { $vx >= $vpxmin && $vx <= $vpxmax && \
+        $vy >= $vpymin && $vy <= $vpymax} {
+            set RendererFound 1
+            set WindowCenterX [expr double($WindowX)*(($vpxmax - $vpxmin)/2.0\
+                                + $vpxmin)]
+            set WindowCenterY [expr double($WindowY)*(($vpymax - $vpymin)/2.0\
+                                + $vpymin)]
+            break
+        }
+    }
+    
+    set CurrentCamera [$CurrentRenderer GetActiveCamera]
+    set lights [$CurrentRenderer GetLights]
+    $lights InitTraversal; set CurrentLight [$lights GetNextItem]
+   
+    set LastX $x
+    set LastY $y
+}
+
+proc Enter {widget x y} {
+    global oldFocus
+
+    set oldFocus [focus]
+    focus $widget
+    UpdateRenderer $widget $x $y
+}
+
+proc StartMotion {widget x y} {
+    global CurrentCamera CurrentLight 
+    global CurrentRenderWindow CurrentRenderer
+    global LastX LastY
+    global RendererFound
+    global TkInteractor_InteractiveUpdateRate
+    global RubberZoomPerformed
+
+    UpdateRenderer $widget $x $y
+    if { ! $RendererFound } { return }
+
+    set RubberZoomPerformed 0
+
+    $CurrentRenderWindow SetDesiredUpdateRate $TkInteractor_InteractiveUpdateRate
+}
+
+proc EndMotion {widget x y} {
+    global CurrentRenderWindow
+    global RendererFound
+    global TkInteractor_StillUpdateRate
+    global RubberZoomPerformed
+    global CurrentRenderer
+
+    if { ! $RendererFound } {return}
+    $CurrentRenderWindow SetDesiredUpdateRate $TkInteractor_StillUpdateRate
+
+
+    if { $RubberZoomPerformed } {
+       $CurrentRenderer RemoveProp RubberBandActor
+       DoRubberZoom $widget
+    }
+
+    Render $widget
+}
+
+# Objects used to display rubberband
+vtkPoints            RubberBandPoints
+vtkCellArray         RubberBandLines
+vtkScalars           RubberBandScalars
+vtkPolyData          RubberBandPolyData
+vtkPolyDataMapper2D  RubberBandMapper
+vtkActor2D           RubberBandActor
+vtkLookupTable       RubberBandColors
+
+RubberBandPolyData SetPoints      RubberBandPoints
+RubberBandPolyData SetLines       RubberBandLines
+RubberBandMapper   SetInput       RubberBandPolyData
+RubberBandMapper   SetLookupTable RubberBandColors
+RubberBandActor    SetMapper      RubberBandMapper
+
+RubberBandColors SetNumberOfTableValues 2
+RubberBandColors SetNumberOfColors 2
+RubberBandColors SetTableValue 0 1.0 0.0 0.0 1.0
+RubberBandColors SetTableValue 1 1.0 1.0 1.0 1.0
+
+[RubberBandPolyData GetPointData] SetScalars RubberBandScalars
+
+RubberBandMapper SetScalarRange 0 1
+
+RubberBandPoints InsertPoint 0  0  0  0
+RubberBandPoints InsertPoint 1  0 10  0
+RubberBandPoints InsertPoint 2 10 10  0
+RubberBandPoints InsertPoint 3 10  0  0
+
+RubberBandLines  InsertNextCell 5
+RubberBandLines  InsertCellPoint 0
+RubberBandLines  InsertCellPoint 1
+RubberBandLines  InsertCellPoint 2
+RubberBandLines  InsertCellPoint 3
+RubberBandLines  InsertCellPoint 0
+
+RubberBandScalars InsertNextScalar 0
+RubberBandScalars InsertNextScalar 1
+RubberBandScalars InsertNextScalar 0
+RubberBandScalars InsertNextScalar 1
+
+RubberBandMapper ScalarVisibilityOn
+
+# Called when the mouse button is release - do the zoom
+proc DoRubberZoom { widget } {
+    global CurrentCamera CurrentRenderer
+    global RendererFound
+    global StartRubberZoomX StartRubberZoomY
+    global EndRubberZoomX EndRubberZoomY
+
+    # Return if there is no renderer, or the rubber band is less
+    # that 5 pixels in either direction
+    if { ! $RendererFound } { return }
+    if { [expr $StartRubberZoomX - $EndRubberZoomX] < 5 && \
+           [expr $StartRubberZoomX - $EndRubberZoomX] > -5 } { return }
+    if { [expr $StartRubberZoomY - $EndRubberZoomY] < 5 && \
+           [expr $StartRubberZoomY - $EndRubberZoomY] > -5 } { return }
+    
+    # We'll need the window height later
+    set WindowY [lindex [$widget configure -height] 4]
+
+    # What is the center of the rubber band box in pixels?
+    set centerX [expr ($StartRubberZoomX + $EndRubberZoomX)/2.0]
+    set centerY [expr ($StartRubberZoomY + $EndRubberZoomY)/2.0]
+
+    # Convert the focal point to a display coordinate in order to get the
+    # depth of the focal point in display units
+    set FPoint [$CurrentCamera GetFocalPoint]
+        set FPoint0 [lindex $FPoint 0]
+        set FPoint1 [lindex $FPoint 1]
+        set FPoint2 [lindex $FPoint 2]
+    $CurrentRenderer SetWorldPoint $FPoint0 $FPoint1 $FPoint2 1.0
+    $CurrentRenderer WorldToDisplay
+    set DPoint [$CurrentRenderer GetDisplayPoint]
+    set focalDepth [lindex $DPoint 2]
+
+    # Convert the position of the camera to a display coordinate in order
+    # to get the depth of the camera in display coordinates. Note this is
+    # a negative number (behind the near clipping plane of 0) but it works
+    # ok anyway
+    set PPoint [$CurrentCamera GetPosition]
+        set PPoint0 [lindex $PPoint 0]
+        set PPoint1 [lindex $PPoint 1]
+        set PPoint2 [lindex $PPoint 2]
+    $CurrentRenderer SetWorldPoint $PPoint0 $PPoint1 $PPoint2 1.0
+    $CurrentRenderer WorldToDisplay
+    set DPoint [$CurrentRenderer GetDisplayPoint]
+    set positionDepth [lindex $DPoint 2]
+
+    # Find out the world position of where our new focal point should
+    # be - it will be at the center of the box, back at the same focal depth
+    # Don't actually set it now - we need to do all our computations before
+    # we modify the camera
+    $CurrentRenderer SetDisplayPoint $centerX $centerY $focalDepth
+    $CurrentRenderer DisplayToWorld
+    set newFocalPoint [$CurrentRenderer GetWorldPoint]
+    set newFocalPoint0 [lindex $newFocalPoint 0]
+    set newFocalPoint1 [lindex $newFocalPoint 1]
+    set newFocalPoint2 [lindex $newFocalPoint 2]
+    set newFocalPoint3 [lindex $newFocalPoint 3]
+    if { $newFocalPoint3 != 0.0 } {
+        set newFocalPoint0 [expr $newFocalPoint0 / $newFocalPoint3]
+        set newFocalPoint1 [expr $newFocalPoint1 / $newFocalPoint3]
+        set newFocalPoint2 [expr $newFocalPoint2 / $newFocalPoint3]
+    }
+
+    # Find out where the new camera position will be - at the center of
+    # the rubber band box at the position depth. Don't set it yet...
+    $CurrentRenderer SetDisplayPoint $centerX $centerY $positionDepth
+    $CurrentRenderer DisplayToWorld
+    set newPosition [$CurrentRenderer GetWorldPoint]
+    set newPosition0 [lindex $newPosition 0]
+    set newPosition1 [lindex $newPosition 1]
+    set newPosition2 [lindex $newPosition 2]
+    set newPosition3 [lindex $newPosition 3]
+    if { $newPosition3 != 0.0 } {
+        set newPosition0 [expr $newPosition0 / $newPosition3]
+        set newPosition1 [expr $newPosition1 / $newPosition3]
+        set newPosition2 [expr $newPosition2 / $newPosition3]
+    }
+
+    # We figured out how to position the camera to be centered, now we
+    # need to "zoom". In parallel, this is simple since we only need to
+    # change our parallel scale to encompass the entire y range of the
+    # rubber band box. In perspective, we assume the box is drawn on the
+    # near plane - this means that it is not possible that someone can
+    # draw a rubber band box around a nearby object and dolly past it. It 
+    # also means that you won't get very close to distance objects - but that
+    # seems better than getting lost.
+    if {[$CurrentCamera GetParallelProjection]} {
+       # the new scale is just based on the y size of the rubber band box
+       # compared to the y size of the window
+       set ydiff [expr ($StartRubberZoomX - $EndRubberZoomX)]
+       if { $ydiff < 0.0 } { set ydiff [expr $ydiff * -1.0] }
+       set newScale [$CurrentCamera GetParallelScale]
+       set newScale [expr $newScale * $ydiff / $WindowY]
+
+       # now we can actually modify the camera
+       $CurrentCamera SetFocalPoint $newFocalPoint0 $newFocalPoint1 $newFocalPoint2
+       $CurrentCamera SetPosition $newPosition0 $newPosition1 $newPosition2
+       $CurrentCamera SetParallelScale $newScale
+
+    } else {
+       # find out the center of the rubber band box on the near plane
+       $CurrentRenderer SetDisplayPoint $centerX $centerY 0.0
+       $CurrentRenderer DisplayToWorld
+       set nearFocalPoint [$CurrentRenderer GetWorldPoint]
+       set nearFocalPoint0 [lindex $nearFocalPoint 0]
+       set nearFocalPoint1 [lindex $nearFocalPoint 1]
+       set nearFocalPoint2 [lindex $nearFocalPoint 2]
+       set nearFocalPoint3 [lindex $nearFocalPoint 3]
+       if { $nearFocalPoint3 != 0.0 } {
+           set nearFocalPoint0 [expr $nearFocalPoint0 / $nearFocalPoint3]
+           set nearFocalPoint1 [expr $nearFocalPoint1 / $nearFocalPoint3]
+           set nearFocalPoint2 [expr $nearFocalPoint2 / $nearFocalPoint3]
+       }
+
+       # find the world coordinates of the point centered on the rubber band box
+       # in x, on the border in y, and at the near plane depth.
+       $CurrentRenderer SetDisplayPoint $centerX $StartRubberZoomY  0.0
+       $CurrentRenderer DisplayToWorld
+       set focalEdge [$CurrentRenderer GetWorldPoint]
+        set focalEdge0 [lindex $focalEdge 0]
+        set focalEdge1 [lindex $focalEdge 1]
+        set focalEdge2 [lindex $focalEdge 2]
+        set focalEdge3 [lindex $focalEdge 3]
+       if { $focalEdge3 != 0.0 } {
+           set focalEdge0 [expr $focalEdge0 / $focalEdge3]
+           set focalEdge1 [expr $focalEdge1 / $focalEdge3]
+           set focalEdge2 [expr $focalEdge2 / $focalEdge3]
+       }
+
+       # how far is this "rubberband edge point" from the focal point?
+       set ydist [expr \
+               sqrt( \
+               ($nearFocalPoint0 - $focalEdge0)*($nearFocalPoint0 - $focalEdge0) + \
+               ($nearFocalPoint1 - $focalEdge1)*($nearFocalPoint1 - $focalEdge1) + \
+               ($nearFocalPoint2 - $focalEdge2)*($nearFocalPoint2 - $focalEdge2) )]
+
+       # We need to know how far back we must be so that when we view the scene
+       # with the current view angle, we see all of the y range of the rubber
+       # band box. Use a simple tangent equation - opposite / adjacent = tan theta
+       # where opposite is half the y height of the rubber band box on the near
+       # plane, adjacent is the distance we are solving for, and theta is half
+       # the viewing angle. This distance that we solve for is the new distance
+       # to the near plane - to find the new distance to the focal plane we
+       # must take the old distance to the focal plane, subtract the near plane
+       # distance, and add in the distance we solved for.
+       set angle [expr 0.5 * (3.141592 / 180.0) * [$CurrentCamera GetViewAngle]]
+       set d [expr $ydist/tan($angle)]
+       set range [$CurrentCamera GetClippingRange]
+       set nearplane [lindex $range 0]
+       set factor [expr [$CurrentCamera GetDistance] / \
+               ([$CurrentCamera GetDistance] - $nearplane + $d)]
+
+       # now we can actually modify the camera
+       $CurrentCamera SetFocalPoint $newFocalPoint0 $newFocalPoint1 $newFocalPoint2
+       $CurrentCamera SetPosition $newPosition0 $newPosition1 $newPosition2
+       $CurrentCamera Dolly $factor
+       $CurrentRenderer ResetCameraClippingRange
+    }    
+}
+
+proc Rotate {widget x y} {
+    global CurrentCamera 
+    global LastX LastY
+    global RendererFound
+
+    if { ! $RendererFound } { return }
+
+    $CurrentCamera Azimuth [expr ($LastX - $x)]
+    $CurrentCamera Elevation [expr ($y - $LastY)]
+    $CurrentCamera OrthogonalizeViewUp
+
+    set LastX $x
+    set LastY $y
+
+    Render $widget
+}
+
+proc RubberZoom {widget x y} {
+    global RendererFound
+    global CurrentRenderer
+    global RubberZoomPerformed
+    global LastX LastY
+    global StartRubberZoomX StartRubberZoomY
+    global EndRubberZoomX EndRubberZoomY
+
+    if { ! $RendererFound } { return }
+
+    set WindowY [lindex [$widget configure -height] 4]
+
+    if { ! $RubberZoomPerformed } {
+       $CurrentRenderer AddProp RubberBandActor
+
+       set StartRubberZoomX $x
+       set StartRubberZoomY [expr $WindowY - $y - 1]
+       
+       set RubberZoomPerformed 1
+    }
+
+    set EndRubberZoomX $x
+    set EndRubberZoomY [expr $WindowY - $y - 1]
+
+    RubberBandPoints SetPoint 0 $StartRubberZoomX $StartRubberZoomY  0
+    RubberBandPoints SetPoint 1 $StartRubberZoomX $EndRubberZoomY    0
+    RubberBandPoints SetPoint 2 $EndRubberZoomX   $EndRubberZoomY    0
+    RubberBandPoints SetPoint 3 $EndRubberZoomX   $StartRubberZoomY  0
+
+    Render $widget
+}
+
+
+proc Pan {widget x y} {
+    global CurrentRenderer CurrentCamera
+    global WindowCenterX WindowCenterY LastX LastY
+    global RendererFound
+
+    if { ! $RendererFound } { return }
+
+    set FPoint [$CurrentCamera GetFocalPoint]
+        set FPoint0 [lindex $FPoint 0]
+        set FPoint1 [lindex $FPoint 1]
+        set FPoint2 [lindex $FPoint 2]
+
+    set PPoint [$CurrentCamera GetPosition]
+        set PPoint0 [lindex $PPoint 0]
+        set PPoint1 [lindex $PPoint 1]
+        set PPoint2 [lindex $PPoint 2]
+
+    $CurrentRenderer SetWorldPoint $FPoint0 $FPoint1 $FPoint2 1.0
+    $CurrentRenderer WorldToDisplay
+    set DPoint [$CurrentRenderer GetDisplayPoint]
+    set focalDepth [lindex $DPoint 2]
+
+    set APoint0 [expr $WindowCenterX + ($x - $LastX)]
+    set APoint1 [expr $WindowCenterY - ($y - $LastY)]
+
+    $CurrentRenderer SetDisplayPoint $APoint0 $APoint1 $focalDepth
+    $CurrentRenderer DisplayToWorld
+    set RPoint [$CurrentRenderer GetWorldPoint]
+        set RPoint0 [lindex $RPoint 0]
+        set RPoint1 [lindex $RPoint 1]
+        set RPoint2 [lindex $RPoint 2]
+        set RPoint3 [lindex $RPoint 3]
+    if { $RPoint3 != 0.0 } {
+        set RPoint0 [expr $RPoint0 / $RPoint3]
+        set RPoint1 [expr $RPoint1 / $RPoint3]
+        set RPoint2 [expr $RPoint2 / $RPoint3]
+    }
+
+    $CurrentCamera SetFocalPoint \
+      [expr ($FPoint0 - $RPoint0)/2.0 + $FPoint0] \
+      [expr ($FPoint1 - $RPoint1)/2.0 + $FPoint1] \
+      [expr ($FPoint2 - $RPoint2)/2.0 + $FPoint2]
+
+    $CurrentCamera SetPosition \
+      [expr ($FPoint0 - $RPoint0)/2.0 + $PPoint0] \
+      [expr ($FPoint1 - $RPoint1)/2.0 + $PPoint1] \
+      [expr ($FPoint2 - $RPoint2)/2.0 + $PPoint2]
+
+    set LastX $x
+    set LastY $y
+
+    Render $widget
+}
+
+proc Zoom {widget x y} {
+    global CurrentCamera CurrentRenderer
+    global LastX LastY
+    global RendererFound
+
+    if { ! $RendererFound } { return }
+
+    set zoomFactor [expr pow(1.02,(0.5*($y - $LastY)))]
+
+    if {[$CurrentCamera GetParallelProjection]} {
+       set parallelScale [expr [$CurrentCamera GetParallelScale] * $zoomFactor];
+       $CurrentCamera SetParallelScale $parallelScale;
+    } else {
+       $CurrentCamera Dolly $zoomFactor
+       $CurrentRenderer ResetCameraClippingRange
+    }
+
+    set LastX $x
+    set LastY $y
+
+    Render $widget
+}
+
+proc Reset {widget x y} {
+    global CurrentRenderWindow
+    global RendererFound
+    global CurrentRenderer
+
+    # Get the renderer window dimensions
+    set WindowX [lindex [$widget configure -width] 4]
+    set WindowY [lindex [$widget configure -height] 4]
+
+    # Find which renderer event has occurred in
+    set CurrentRenderWindow [$widget GetRenderWindow]
+    set renderers [$CurrentRenderWindow GetRenderers]
+    set numRenderers [$renderers GetNumberOfItems]
+
+    $renderers InitTraversal; set RendererFound 0
+    for {set i 0} {$i < $numRenderers} {incr i} {
+        set CurrentRenderer [$renderers GetNextItem]
+        set vx [expr double($x) / $WindowX]
+        set vy [expr ($WindowY - double($y)) / $WindowY]
+
+        set viewport [$CurrentRenderer GetViewport]
+        set vpxmin [lindex $viewport 0]
+        set vpymin [lindex $viewport 1]
+        set vpxmax [lindex $viewport 2]
+        set vpymax [lindex $viewport 3]
+        if { $vx >= $vpxmin && $vx <= $vpxmax && \
+        $vy >= $vpymin && $vy <= $vpymax} {
+            set RendererFound 1
+            break
+        }
+    }
+
+    if { $RendererFound } {$CurrentRenderer ResetCamera}
+
+    Render $widget
+}
+
+proc Wireframe {widget} {
+    global CurrentRenderer
+
+    set actors [$CurrentRenderer GetActors]
+
+    $actors InitTraversal
+    set actor [$actors GetNextItem]
+    while { $actor != "" } {
+        [$actor GetProperty] SetRepresentationToWireframe
+        set actor [$actors GetNextItem]
+    }
+
+    Render $widget
+}
+
+proc Surface {widget} {
+    global CurrentRenderer
+
+    set actors [$CurrentRenderer GetActors]
+
+    $actors InitTraversal
+    set actor [$actors GetNextItem]
+    while { $actor != "" } {
+        [$actor GetProperty] SetRepresentationToSurface
+        set actor [$actors GetNextItem]
+    }
+
+    Render $widget
+}
+
+# Used to support picking operations
+#
+set PickedAssembly ""
+vtkCellPicker ActorPicker
+vtkProperty PickedProperty
+    PickedProperty SetColor 1 0 0
+set PrePickedProperty ""
+
+proc PickActor {widget x y} {
+    global CurrentRenderer RendererFound
+    global PickedAssembly PrePickedProperty WindowY
+
+    set WindowY [lindex [$widget configure -height] 4]
+
+    if { ! $RendererFound } { return }
+    ActorPicker Pick $x [expr $WindowY - $y - 1] 0.0 $CurrentRenderer
+    set assembly [ActorPicker GetAssembly]
+
+    if { $PickedAssembly != "" && $PrePickedProperty != "" } {
+        $PickedAssembly SetProperty $PrePickedProperty
+        # release hold on the property
+        $PrePickedProperty UnRegister $PrePickedProperty
+        set PrePickedProperty ""
+    }
+
+    if { $assembly != "" } {
+        set PickedAssembly $assembly
+        set PrePickedProperty [$PickedAssembly GetProperty]
+        # hold onto the property
+        $PrePickedProperty Register $PrePickedProperty
+        $PickedAssembly SetProperty PickedProperty
+    }
+
+    Render $widget
+}
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/WidgetObject.tcl b/lib/maracasVisuLib/src/interface/tcl/to_change/WidgetObject.tcl
new file mode 100644 (file)
index 0000000..3356e20
--- /dev/null
@@ -0,0 +1,52 @@
+# These procs allow widgets to behave like objects with their own
+# state variables of processing objects.
+
+
+# generate a "unique" name for a widget variable
+proc GetWidgetVariable {widget varName} {
+   regsub -all {\.} $widget "_" base
+
+   return "$varName$base"
+}
+
+# returns an object which will be associated with a widget
+# A convienience method that creates a name for you  
+# based on the widget name and varible value/
+proc NewWidgetObject {widget type varName} {
+   set var "[GetWidgetVariable $widget $varName]_Object"
+   # create the vtk object
+   $type $var
+
+   # It is better to keep interface consistent
+   # setting objects as variable values, and NewWidgetObject.
+   SetWidgetVariableValue $widget $varName $var
+
+   return $var
+}
+
+# obsolete!!!!!!!
+# returns the same thing as GetWidgetVariableValue
+proc GetWidgetObject {widget varName} {
+   puts "Warning: obsolete call: GetWidgetObject"
+   puts "Please use GetWidgetVariableValue"
+   return "[GetWidgetVariable $widget $varName]_Object"
+}
+
+# sets the value of a widget variable
+proc SetWidgetVariableValue {widget varName value} {
+   set var [GetWidgetVariable $widget $varName]
+   global $var
+   set $var $value
+}
+
+# This proc has alway eluded me.
+proc GetWidgetVariableValue {widget varName} {
+   set var [GetWidgetVariable $widget $varName]
+   global $var
+   set temp ""
+   catch {eval "set temp [format {$%s} $var]"}
+
+   return $temp
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/ev_userzoom.tcl b/lib/maracasVisuLib/src/interface/tcl/to_change/ev_userzoom.tcl
new file mode 100644 (file)
index 0000000..eb1fc44
--- /dev/null
@@ -0,0 +1,496 @@
+# ev_userzoom.tcl
+# ====================================================================================================
+# User interface events for a vtkTkRenderWidget widget. Based on TkInteractor.tcl
+# ====================================================================================================
+# Author  : Leonardo Florez-Valencia (lflorez@creatis.insa-lyon.fr)
+# Created : 02/03/2001
+# ====================================================================================================
+# Log :
+#      02/03/2001 ==> Initial implementation.
+# ====================================================================================================
+
+set gv_rendererFound 0;
+set gv_deltaStep 0.001;
+set gv_alfa 0.1;
+set gv_actualPoint -1;
+
+# -- PROCEDURE "bindBasicEvents { widget }" -----------------------------------------------------------
+# -- Binds basic behavior the graphical VTK-widget.
+# --
+# -- IN  : widget = vtkTkRenderWidget
+# -- OUT :
+proc bindBasicEvents { widget } {
+
+       bind $widget <w>      { evb_wireframe %W }
+       bind $widget <s>      { evb_surface %W }
+       bind $widget <Enter>  { evb_enter %W %x %y }
+       bind $widget <Expose> { evb_expose %W }
+
+}; # proc bindBasicEvents { widget } {
+# ----------------------------------------------------------------------------------------------------
+
+# -- PROCEDURE "bindUserEvents { widget }" -----------------------------------------------------------
+# -- Binds mouse and some keyboard interaction to the graphical VTK-widget.
+# --
+# -- Mouse motion :
+# --               Left button + motion         = Rotates
+# --               Middle button + motion or 
+# --               Shift + Left button + motion = Side moves camera
+# --               Right button + motion        = Moves
+# --
+# -- Keyboard :
+# --           UpArrow             = Forward
+# --           DownArrow           = Backward
+# --           LeftArrow           = Rotate left
+# --           RightArrow          = Rotate right
+# --           Shift + UpArrow     = Rotate up
+# --           Shift + DownArrow   = Rotate down
+# --           Shift + LeftArrow   = Side move left
+# --           Shift + RightArrow  = Side move right
+# --           Control + UpArrow   = Side move up
+# --           Control + DownArrow = Side move down
+# --
+# -- IN  : widget = vtkTkRenderWidget
+# -- OUT :
+proc bindUserEvents { widget { rot 1 } } {
+
+       bind $widget <Any-ButtonPress>   { ev_startMotion %W %x %y}
+       bind $widget <Any-ButtonRelease> { ev_endMotion %W %x %y}
+       if { $rot == 1 } { bind $widget <B1-Motion>      { evu_rotate %W %x %y } }
+       bind $widget <Shift-B1-Motion>   { evu_sideMove %W %x %y }
+       bind $widget <B2-Motion>         { evu_sideMove %W %x %y }
+       bind $widget <B3-Motion>         { evu_move %W %x %y }
+       bind $widget <Up>                { evu_forward %W }
+       bind $widget <Down>              { evu_backward %W }
+       bind $widget <Left>              { evu_rotateLeft %W }
+       bind $widget <Right>             { evu_rotateRight %W }
+       bind $widget <Shift-Up>          { evu_rotateUp %W }
+       bind $widget <Shift-Down>        { evu_rotateDown %W }
+       bind $widget <Shift-Left>        { evu_sideMoveLeft %W }
+       bind $widget <Shift-Right>       { evu_sideMoveRight %W }
+       bind $widget <Control-Up>        { evu_sideMoveUp %W }
+       bind $widget <Control-Down>      { evu_sideMoveDown %W }
+
+}; # proc bindUserEvents { widget } {
+# ----------------------------------------------------------------------------------------------------
+
+# -- PROCEDURE "bindZoomEvents { widget }" -----------------------------------------------------------
+# -- Binds mouse and some keyboard interaction to the camera zoom on a VTK-widget.
+# --
+# -- Mouse motion :
+# --               Left button + motion         = Rotates
+# --               Middle button + motion or 
+# --               Shift + Left button + motion = Pan
+# --               Right button + motion        = Zoom
+# --
+# -- IN  : widget = vtkTkRenderWidget
+# -- OUT :
+proc bindZoomEvents { widget { rot 1 } } {
+
+       bind $widget <Any-ButtonPress>   { ev_startMotion %W %x %y}
+       bind $widget <Any-ButtonRelease> { ev_endMotion %W %x %y}
+    bind $widget <B1-Motion>
+       if { $rot == 1 } { bind $widget <B1-Motion>      { evz_rotate %W %x %y } }
+       bind $widget <B2-Motion>         { evz_pan %W %x %y }
+       bind $widget <B3-Motion>         { evz_zoom %W %x %y }
+
+}; # proc bindZoomEvents { widget } {
+# ----------------------------------------------------------------------------------------------------
+
+proc updateRenderer { widget x y } {
+
+       global gv_currentCamera gv_currentLight;
+       global gv_currentRenderWindow gv_currentRenderer;
+       global gv_rendererFound gv_initX gv_initY gv_moving;
+       global gv_windowCenterX gv_windowCenterY;
+
+       # Get the renderer window dimensions
+       set WindowX [ lindex [ $widget configure -width ] 4 ];
+       set WindowY [ lindex [ $widget configure -height ] 4 ];
+
+       # Find which renderer event has occurred in
+       set gv_currentRenderWindow [ $widget GetRenderWindow ];
+       set renderers [ $gv_currentRenderWindow GetRenderers ];
+       set numRenderers [ $renderers GetNumberOfItems ];
+
+       $renderers InitTraversal;
+       set gv_rendererFound 0;
+
+       for { set i 0 } { $i < $numRenderers } { incr i } {
+
+               set gv_currentRenderer [ $renderers GetNextItem ];
+               set vx [ expr double( $x ) / $WindowX ];
+               set vy [expr ( $WindowY - double( $y ) ) / $WindowY ];
+               set viewport [ $gv_currentRenderer GetViewport ];
+               set vpxmin [ lindex $viewport 0 ];
+               set vpymin [ lindex $viewport 1 ];
+               set vpxmax [ lindex $viewport 2 ];
+               set vpymax [ lindex $viewport 3 ];
+
+               if { $vx >= $vpxmin && $vx <= $vpxmax && \
+                    $vy >= $vpymin && $vy <= $vpymax} {
+                       set gv_rendererFound 1;
+                       set gv_windowCenterX [ expr double( $WindowX ) * ( ( $vpxmax - $vpxmin ) / 2.0 \
+                                              + $vpxmin ) ];
+                       set gv_windowCenterY [ expr double( $WindowY ) * ( ( $vpymax - $vpymin ) / 2.0 \
+                                              + $vpymin ) ];
+                       break;
+
+               }; # fi
+
+       }; # rof
+
+       set gv_currentCamera [ $gv_currentRenderer GetActiveCamera ];
+       set lights [ $gv_currentRenderer GetLights ];
+       $lights InitTraversal;
+       set gv_currentLight [ $lights GetNextItem ];
+   
+       set gv_initX $x;
+       set gv_initY $y;
+       set gv_moving 0;
+
+}; # proc updateRenderer { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc render { } {
+
+       global gv_currentCamera gv_currentLight gv_currentRenderWindow;
+
+       eval $gv_currentLight SetPosition [ $gv_currentCamera GetPosition ];
+       eval $gv_currentLight SetFocalPoint [ $gv_currentCamera GetFocalPoint ];
+       $gv_currentCamera SetClippingRange 0.1 1000;
+       $gv_currentRenderWindow Render;
+
+}; # proc render { } {
+# ----------------------------------------------------------------------------------------------------
+
+# -- PROCEDURE "setFollowPath { path } ---------------------------------------------------------------
+# -- Sets a point set to interpolate a path for the camera.
+#
+# -- IN : A set of points that defines the path
+# -- OUT : The user has been enabled to walk over the path, the normal view goes over
+# --      the pendant direction.
+proc setFollowPath { path } {
+
+       global gv_pointSet;
+       global gv_actualPoint;
+       
+       set gv_pointSet $path;
+       set gv_actualPoint 0;
+
+}; # proc setFollowPath { path } {
+# ----------------------------------------------------------------------------------------------------
+
+proc unsetFollowPath { } {
+
+       set gv_actualPoint -1;
+
+}; # proc unsetFollowPath { } {
+# ----------------------------------------------------------------------------------------------------
+
+proc ev_startMotion { widget x y } {
+
+       global gv_currentRenderWindow;
+       global gv_rendererFound;
+
+       updateRenderer $widget $x $y;
+       if { ! $gv_rendererFound } { return };
+       $gv_currentRenderWindow SetDesiredUpdateRate 1.0;
+
+}; # proc evz_startMotion { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc ev_endMotion { widget x y } {
+
+       global gv_currentRenderWindow;
+       global gv_rendererFound;
+
+       if { ! $gv_rendererFound } { return };
+       $gv_currentRenderWindow SetDesiredUpdateRate 0.01;
+       render;
+
+}; # proc evz_endMotion { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evb_wireframe { widget } {
+
+       global gv_currentRenderer;
+
+       set actors [ $gv_currentRenderer GetActors ];
+       $actors InitTraversal;
+       set actor [ $actors GetNextItem ];
+
+       while { $actor != "" } {
+
+               [ $actor GetProperty ] SetRepresentationToWireframe;
+               set actor [ $actors GetNextItem ];
+
+       }; # fwhile
+
+       render;
+
+}; # proc evb_wireframe { widget } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evb_surface { widget } {
+
+       global gv_currentRenderer;
+
+       set actors [ $gv_currentRenderer GetActors ];
+       $actors InitTraversal;
+       set actor [ $actors GetNextItem ];
+
+       while { $actor != "" } {
+
+               [ $actor GetProperty ] SetRepresentationToSurface;
+               set actor [ $actors GetNextItem ];
+
+       }; #fwhile
+
+       render;
+
+}; # proc evb_surface { widget } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evb_enter { widget x y } {
+
+       #focus $widget;
+       #updateRenderer $widget $x $y;
+
+}; # proc evb_enter { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evb_expose { widget } {
+
+   update;
+   [ $widget GetRenderWindow ] Render;
+
+}; # proc evb_expose { widget } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_rotate { widget x y } {
+
+       global gv_currentCamera;
+       global gv_initX gv_initY gv_deltaStep;
+       global gv_rendererFound;
+
+       if { ! $gv_rendererFound } { return };
+       
+       set dx [ expr $gv_initX - $x ];
+       set dy [ expr $gv_initY - $y ];
+       set ori [ $gv_currentCamera GetOrientation ];
+       set ori [ list 0 0 0 ];
+       set yaw [ lindex $ori 0 ];
+       set pitch [ lindex $ori 1 ];
+
+       # Yaw rotation
+       set yaw [ expr $yaw + fmod( $dx * $gv_deltaStep, 6.283185 ) ];
+       $gv_currentCamera Yaw $yaw;
+       
+       # Pitch rotation        
+       #set pitch [ expr $pitch + fmod( $dy * $gv_deltaStep, 6.283185 ) ];
+       #$gv_currentCamera Pitch $pitch;
+       #puts "$pitch";
+
+       render;
+
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_sideMove { widget x y } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_sideMove { widget x y } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_move { widget x y } {
+
+       global gv_currentCamera;
+       global gv_initX gv_initY;
+       global gv_deltaStep;
+       global gv_rendererFound;
+
+       if { ! $gv_rendererFound } { return };
+       
+       set dx [ expr $gv_initY - $y ];
+       set pos [ $gv_currentCamera GetPosition ];
+       set foc [ $gv_currentCamera GetFocalPoint ];
+       set nor [ $gv_currentCamera GetViewPlaneNormal ];
+
+       # Calculates the new position and focal point
+       set px [ expr [ lindex $pos 0 ] + ( [ lindex $nor 0 ] * $dx * 0.1 ) ];
+       set py [ expr [ lindex $pos 1 ] + ( [ lindex $nor 1 ] * $dx * 0.1 ) ];
+       set pz [ expr [ lindex $pos 2 ] + ( [ lindex $nor 2 ] * $dx * 0.1 ) ];
+       set fx [ expr [ lindex $foc 0 ] + ( [ lindex $nor 0 ] * $dx * 0.1 ) ];
+       set fy [ expr [ lindex $foc 1 ] + ( [ lindex $nor 1 ] * $dx * 0.1 ) ];
+       set fz [ expr [ lindex $foc 2 ] + ( [ lindex $nor 2 ] * $dx * 0.1 ) ];
+#      set px [ expr [ lindex $pos 0 ] + ( [ lindex $nor 0 ] * $dx * $gv_deltaStep ) ];
+#      set py [ expr [ lindex $pos 1 ] + ( [ lindex $nor 1 ] * $dx * $gv_deltaStep ) ];
+#      set pz [ expr [ lindex $pos 2 ] + ( [ lindex $nor 2 ] * $dx * $gv_deltaStep ) ];
+#      set fx [ expr [ lindex $foc 0 ] + ( [ lindex $nor 0 ] * $dx * $gv_deltaStep ) ];
+#      set fy [ expr [ lindex $foc 1 ] + ( [ lindex $nor 1 ] * $dx * $gv_deltaStep ) ];
+#      set fz [ expr [ lindex $foc 2 ] + ( [ lindex $nor 2 ] * $dx * $gv_deltaStep ) ];
+       
+       $gv_currentCamera SetPosition $px $py $pz;
+       $gv_currentCamera SetFocalPoint $fx $fy $fz;
+       
+       render;
+
+}; # proc evu_move { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_forward { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_backward { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_rotateLeft { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_rotateRight { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_rotateUp { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_rotateDown { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_sideMoveLeft { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_sideMoveRight { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_sideMoveUp { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evu_sideMoveDown { widget } {
+}; # 
+# ----------------------------------------------------------------------------------------------------
+
+proc evz_rotate { widget x y } {
+
+       global gv_currentCamera;
+       global gv_initX gv_initY;
+       global gv_rendererFound;
+
+       if { ! $gv_rendererFound } { return };
+
+       $gv_currentCamera Azimuth [ expr ( $gv_initX - $x ) ];
+       $gv_currentCamera Elevation [ expr ( $y - $gv_initY ) ];
+       $gv_currentCamera OrthogonalizeViewUp;
+
+       set gv_initX $x;
+       set gv_initY $y;
+
+       render;
+
+}; # proc evz_rotate { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evz_pan { widget x y } {
+
+       global gv_currentRenderer gv_currentCamera;
+       global gv_windowCenterX gv_windowCenterY gv_initX gv_initY;
+       global gv_rendererFound;
+
+       if { ! $gv_rendererFound } { return };
+
+       set FPoint [ $gv_currentCamera GetFocalPoint ];
+       set FPoint0 [ lindex $FPoint 0 ];
+       set FPoint1 [ lindex $FPoint 1 ];
+       set FPoint2 [ lindex $FPoint 2 ];
+
+       set PPoint [ $gv_currentCamera GetPosition ];
+       set PPoint0 [ lindex $PPoint 0 ];
+       set PPoint1 [ lindex $PPoint 1 ];
+       set PPoint2 [ lindex $PPoint 2 ];
+
+       $gv_currentRenderer SetWorldPoint $FPoint0 $FPoint1 $FPoint2 1.0;
+       $gv_currentRenderer WorldToDisplay;
+       set DPoint [ $gv_currentRenderer GetDisplayPoint ];
+       set focalDepth [ lindex $DPoint 2 ];
+
+       set APoint0 [ expr $gv_windowCenterX + ( $x - $gv_initX ) ];
+       set APoint1 [ expr $gv_windowCenterY - ( $y - $gv_initY ) ];
+
+       $gv_currentRenderer SetDisplayPoint $APoint0 $APoint1 $focalDepth;
+       $gv_currentRenderer DisplayToWorld;
+       set RPoint [ $gv_currentRenderer GetWorldPoint ];
+       set RPoint0 [ lindex $RPoint 0 ];
+       set RPoint1 [ lindex $RPoint 1 ];
+       set RPoint2 [ lindex $RPoint 2 ];
+       set RPoint3 [ lindex $RPoint 3 ];
+
+       if { $RPoint3 != 0.0 } {
+
+               set RPoint0 [ expr $RPoint0 / $RPoint3 ];
+               set RPoint1 [ expr $RPoint1 / $RPoint3 ];
+               set RPoint2 [ expr $RPoint2 / $RPoint3 ];
+
+       }; # fi
+
+       $gv_currentCamera SetFocalPoint \
+                                       [ expr ( $FPoint0 - $RPoint0 ) / 2.0 + $FPoint0 ] \
+                                       [ expr ( $FPoint1 - $RPoint1 ) / 2.0 + $FPoint1 ] \
+                                       [ expr ( $FPoint2 - $RPoint2 ) / 2.0 + $FPoint2 ];
+
+       $gv_currentCamera SetPosition \
+                                     [ expr ( $FPoint0 - $RPoint0 ) / 2.0 + $PPoint0 ] \
+                                     [ expr ( $FPoint1 - $RPoint1 ) / 2.0 + $PPoint1 ] \
+                                     [ expr ( $FPoint2 - $RPoint2 ) / 2.0 + $PPoint2 ];
+
+       set gv_initX $x;
+       set gv_initY $y;
+
+       render;
+
+}; # proc evz_pan { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+proc evz_zoom { widget x y } {
+
+       global gv_currentCamera;
+       global gv_initX gv_initY;
+       global gv_rendererFound;
+
+       if { ! $gv_rendererFound } { return };
+
+       set zoomFactor [ expr pow( 1.02, ( 0.5 * ( $gv_initY - $y ) ) ) ];
+
+       if { [ $gv_currentCamera GetParallelProjection ] } {
+
+               set parallelScale [ expr [ $gv_currentCamera GetParallelScale ] * $zoomFactor ];
+               $gv_currentCamera SetParallelScale $parallelScale;
+
+       } else {
+
+               $gv_currentCamera SetClippingRange \
+                                                  [ expr 0.1 / $zoomFactor ] \
+                                                  [ expr 1000 / $zoomFactor ];
+               $gv_currentCamera Dolly $zoomFactor;
+
+       }; # fi
+
+       set gv_initX $x;
+       set gv_initY $y;
+
+       render;
+
+}; # proc evz_zoom { widget x y } {
+# ----------------------------------------------------------------------------------------------------
+
+# EOF - ev_userzoom.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/volTkInteractor.tcl b/lib/maracasVisuLib/src/interface/tcl/to_change/volTkInteractor.tcl
new file mode 100644 (file)
index 0000000..17fe3d9
--- /dev/null
@@ -0,0 +1,431 @@
+
+proc BindTkRenderWidget {widget} {
+    bind $widget <Any-ButtonPress> {StartMotionOrWindowLevelInteraction %W %x %y}
+    bind $widget <Any-ButtonRelease> {EndMotionOrWindowLevelInteraction %W %x %y}
+    bind $widget <B1-Motion> {PanOrRotate %W %x %y}
+    bind $widget <B2-Motion> {ZoomOrWinLevel %W %x %y}
+    bind $widget <B3-Motion> {ZoomOrWinLevel %W %x %y}
+    bind $widget <KeyPress-r> {Reset %W %x %y}
+    bind $widget <KeyPress-u> {wm deiconify .vtkInteract}
+#    bind $widget <Enter> {Enter %W %x %y}
+#    bind $widget <Leave> {focus $oldFocus}
+    bind $widget <Expose> {Expose %W}
+}
+
+proc BindTkRenderWidget2D {widget} {
+    bind $widget <Any-ButtonPress> {StartMotionOrWindowLevelInteraction %W %x %y}
+    bind $widget <Any-ButtonRelease> {EndMotionOrWindowLevelInteraction %W %x %y}
+    bind $widget <B1-Motion> {PanOrRedim %W %x %y}
+    bind $widget <B2-Motion> {ZoomOrWinLevel %W %x %y}
+    bind $widget <B3-Motion> {ZoomOrWinLevel %W %x %y}
+    bind $widget <KeyPress-r> {Reset %W %x %y}
+    bind $widget <KeyPress-u> {wm deiconify .vtkInteract}
+#    bind $widget <Enter> {Enter %W %x %y}
+#    bind $widget <Leave> {focus $oldFocus}
+    bind $widget <Expose> {Expose %W}
+}
+
+# Global variable keeps track of whether active renderer was found
+set RendererFound 0
+
+# a litle more complex than just "bind $widget <Expose> {%W Render}"
+# we have to handle all pending expose events otherwise they que up.
+proc Expose {widget} {
+   if {[GetWidgetVariableValue $widget InExpose] == 1} {
+      return
+   }
+   SetWidgetVariableValue $widget InExpose 1
+   update
+   [$widget GetRenderWindow] Render
+   SetWidgetVariableValue $widget InExpose 0
+}
+
+# Create event bindings
+#
+proc Render {} {
+    global CurrentCamera CurrentLight CurrentRenderWindow
+
+    eval $CurrentLight SetPosition [$CurrentCamera GetPosition]
+    eval $CurrentLight SetFocalPoint [$CurrentCamera GetFocalPoint]
+
+    $CurrentRenderWindow Render
+}
+
+proc UpdateRenderer {widget x y} {
+    global CurrentCamera CurrentLight 
+    global CurrentRenderWindow CurrentRenderer
+    global RendererFound LastX LastY
+    global WindowCenterX WindowCenterY
+
+    # Get the renderer window dimensions
+    set WindowX [lindex [$widget configure -width] 4]
+    set WindowY [lindex [$widget configure -height] 4]
+
+    # Find which renderer event has occurred in
+    set CurrentRenderWindow [$widget GetRenderWindow]
+    set renderers [$CurrentRenderWindow GetRenderers]
+    set numRenderers [$renderers GetNumberOfItems]
+
+    $renderers InitTraversal; set RendererFound 0
+    for {set i 0} {$i < $numRenderers} {incr i} {
+       set CurrentRenderer [$renderers GetNextItem]
+       set vx [expr double($x) / $WindowX]
+       set vy [expr ($WindowY - double($y)) / $WindowY]
+       set viewport [$CurrentRenderer GetViewport]
+       set vpxmin [lindex $viewport 0]
+       set vpymin [lindex $viewport 1]
+       set vpxmax [lindex $viewport 2]
+       set vpymax [lindex $viewport 3]
+       if { $vx >= $vpxmin && $vx <= $vpxmax && \
+       $vy >= $vpymin && $vy <= $vpymax} {
+           set RendererFound 1
+           set WindowCenterX [expr double($WindowX)*(($vpxmax - $vpxmin)/2.0\
+                               + $vpxmin)]
+           set WindowCenterY [expr double($WindowY)*(($vpymax - $vpymin)/2.0\
+                               + $vpymin)]
+           break
+       }
+    }
+    
+    set CurrentCamera [$CurrentRenderer GetActiveCamera]
+    set lights [$CurrentRenderer GetLights]
+    $lights InitTraversal; set CurrentLight [$lights GetNextItem]
+
+    set LastX $x
+    set LastY $y
+}
+
+proc Enter {widget x y} {
+    global oldFocus
+
+    set oldFocus [focus]
+    focus $widget
+    UpdateRenderer $widget $x $y
+}
+
+proc StartMotionOrWindowLevelInteraction {widget x y} {
+    global CurrentCamera CurrentLight 
+    global CurrentRenderWindow CurrentRenderer
+    global LastX LastY
+    global RendererFound
+    global vFnMPR
+
+  UpdateRenderer $widget $x $y
+  if { ! $RendererFound } { return }
+
+  if { 1 == 1} {
+
+    $CurrentRenderWindow SetDesiredUpdateRate 3.0
+  } elseif {$vFnMPR(winlevel) == 1} {
+    puts "Modificar WindowLevel"
+    # save the starting mouse position and the corresponding window/level
+    SetWidgetVariableValue $widget X $x
+    SetWidgetVariableValue $widget Y $y
+    SetWidgetVariableValue $widget Window [vtkFnMPR(ColorLookupTable) GetWindow]
+    SetWidgetVariableValue $widget Level  [vtkFnMPR(ColorLookupTable) GetLevel]
+    UpdateWindowLevelInteraction $widget $x $y
+  }
+}
+
+proc EndMotionOrWindowLevelInteraction {widget x y} {
+    global CurrentRenderWindow
+    global RendererFound
+    global vFnMPR
+
+    if { ! $RendererFound } {return}
+
+    if {$vFnMPR(zoom) == 1} {
+      $CurrentRenderWindow SetDesiredUpdateRate 0.01
+      Render
+  } elseif {$vFnMPR(winlevel) == 1} {
+      $CurrentRenderWindow SetDesiredUpdateRate 0.01
+      Render
+  }
+}
+
+proc PanOrRotate {widget x y} {
+    global LastX LastY
+    global RendererFound
+    global CurrentRenderer CurrentCamera
+    global WindowCenterX WindowCenterY LastX LastY
+    global vFnMPR
+
+  if { ! $RendererFound } { return }
+
+  if {$vFnMPR(rotate) == 1} {
+    $CurrentCamera Azimuth [expr (($LastX - $x)/3.0)]
+    $CurrentCamera Elevation [expr (($y - $LastY)/3.0)]
+    $CurrentCamera OrthogonalizeViewUp
+
+    set LastX $x
+    set LastY $y
+
+    Render
+  } elseif {$vFnMPR(pan) == 1} {
+
+    if { ! $RendererFound } { return }
+
+    set FPoint [$CurrentCamera GetFocalPoint]
+       set FPoint0 [lindex $FPoint 0]
+       set FPoint1 [lindex $FPoint 1]
+       set FPoint2 [lindex $FPoint 2]
+
+    set PPoint [$CurrentCamera GetPosition]
+       set PPoint0 [lindex $PPoint 0]
+       set PPoint1 [lindex $PPoint 1]
+       set PPoint2 [lindex $PPoint 2]
+
+    $CurrentRenderer SetWorldPoint $FPoint0 $FPoint1 $FPoint2 1.0
+    $CurrentRenderer WorldToDisplay
+    set DPoint [$CurrentRenderer GetDisplayPoint]
+    set focalDepth [lindex $DPoint 2]
+
+    set APoint0 [expr $WindowCenterX + ($x - $LastX)]
+    set APoint1 [expr $WindowCenterY - ($y - $LastY)]
+
+    $CurrentRenderer SetDisplayPoint $APoint0 $APoint1 $focalDepth
+    $CurrentRenderer DisplayToWorld
+    set RPoint [$CurrentRenderer GetWorldPoint]
+       set RPoint0 [lindex $RPoint 0]
+       set RPoint1 [lindex $RPoint 1]
+       set RPoint2 [lindex $RPoint 2]
+       set RPoint3 [lindex $RPoint 3]
+    if { $RPoint3 != 0.0 } {
+       set RPoint0 [expr $RPoint0 / $RPoint3]
+       set RPoint1 [expr $RPoint1 / $RPoint3]
+       set RPoint2 [expr $RPoint2 / $RPoint3]
+    }
+
+    $CurrentCamera SetFocalPoint \
+      [expr ($FPoint0 - $RPoint0)/2.0 + $FPoint0] \
+      [expr ($FPoint1 - $RPoint1)/2.0 + $FPoint1] \
+      [expr ($FPoint2 - $RPoint2)/2.0 + $FPoint2]
+
+    $CurrentCamera SetPosition \
+      [expr ($FPoint0 - $RPoint0)/2.0 + $PPoint0] \
+      [expr ($FPoint1 - $RPoint1)/2.0 + $PPoint1] \
+      [expr ($FPoint2 - $RPoint2)/2.0 + $PPoint2]
+
+    set LastX $x
+    set LastY $y
+
+    Render
+  }
+}
+
+proc PanOrRedim {widget x y} {
+    global LastX LastY
+    global RendererFound
+    global CurrentRenderer CurrentCamera
+    global WindowCenterX WindowCenterY LastX LastY
+    global vFnMPR
+
+    if { ! $RendererFound } { return }
+
+    set FPoint [$CurrentCamera GetFocalPoint]
+       set FPoint0 [lindex $FPoint 0]
+       set FPoint1 [lindex $FPoint 1]
+       set FPoint2 [lindex $FPoint 2]
+
+    set PPoint [$CurrentCamera GetPosition]
+       set PPoint0 [lindex $PPoint 0]
+       set PPoint1 [lindex $PPoint 1]
+       set PPoint2 [lindex $PPoint 2]
+
+    $CurrentRenderer SetWorldPoint $FPoint0 $FPoint1 $FPoint2 1.0
+    $CurrentRenderer WorldToDisplay
+    set DPoint [$CurrentRenderer GetDisplayPoint]
+    set focalDepth [lindex $DPoint 2]
+
+    set APoint0 [expr $WindowCenterX + ($x - $LastX)]
+    set APoint1 [expr $WindowCenterY - ($y - $LastY)]
+
+    $CurrentRenderer SetDisplayPoint $APoint0 $APoint1 $focalDepth
+    $CurrentRenderer DisplayToWorld
+    set RPoint [$CurrentRenderer GetWorldPoint]
+       set RPoint0 [lindex $RPoint 0]
+       set RPoint1 [lindex $RPoint 1]
+       set RPoint2 [lindex $RPoint 2]
+       set RPoint3 [lindex $RPoint 3]
+    if { $RPoint3 != 0.0 } {
+       set RPoint0 [expr $RPoint0 / $RPoint3]
+       set RPoint1 [expr $RPoint1 / $RPoint3]
+       set RPoint2 [expr $RPoint2 / $RPoint3]
+    }
+
+    $CurrentCamera SetFocalPoint \
+      [expr ($FPoint0 - $RPoint0)/2.0 + $FPoint0] \
+      [expr ($FPoint1 - $RPoint1)/2.0 + $FPoint1] \
+      [expr ($FPoint2 - $RPoint2)/2.0 + $FPoint2]
+
+    $CurrentCamera SetPosition \
+      [expr ($FPoint0 - $RPoint0)/2.0 + $PPoint0] \
+      [expr ($FPoint1 - $RPoint1)/2.0 + $PPoint1] \
+      [expr ($FPoint2 - $RPoint2)/2.0 + $PPoint2]
+
+    set LastX $x
+    set LastY $y
+
+    Render
+}
+
+
+proc ZoomOrWinLevel {widget x y} {
+    global CurrentCamera
+    global LastX LastY
+    global RendererFound
+    global vFnMPR
+
+  if { ! $RendererFound } { return }
+
+  if {$vFnMPR(zoom) == 1} {
+    set zoomFactor [expr pow(1.01,($y - $LastY))]
+    set clippingRange [$CurrentCamera GetClippingRange]
+    set minRange [lindex $clippingRange 0]
+    set maxRange [lindex $clippingRange 1]
+    $CurrentCamera SetClippingRange [expr $minRange / $zoomFactor] \
+                                   [expr $maxRange / $zoomFactor]
+    $CurrentCamera Dolly $zoomFactor
+
+    set LastX $x
+    set LastY $y
+
+    Render
+  } elseif {$vFnMPR(winlevel) == 1} {
+      UpdateWindowLevelInteraction $widget $x $y
+  }
+}
+
+proc Reset {widget x y} {
+    global CurrentRenderWindow
+    global RendererFound
+    global CurrentRenderer
+    global vFnMPR
+
+    # Get the renderer window dimensions
+    set WindowX [lindex [$widget configure -width] 4]
+    set WindowY [lindex [$widget configure -height] 4]
+
+    # Find which renderer event has occurred in
+    set CurrentRenderWindow [$widget GetRenderWindow]
+    set renderers [$CurrentRenderWindow GetRenderers]
+    set numRenderers [$renderers GetNumberOfItems]
+
+    $renderers InitTraversal; set RendererFound 0
+    for {set i 0} {$i < $numRenderers} {incr i} {
+       set CurrentRenderer [$renderers GetNextItem]
+       set vx [expr double($x) / $WindowX]
+       set vy [expr ($WindowY - double($y)) / $WindowY]
+
+       set viewport [$CurrentRenderer GetViewport]
+       set vpxmin [lindex $viewport 0]
+       set vpymin [lindex $viewport 1]
+       set vpxmax [lindex $viewport 2]
+       set vpymax [lindex $viewport 3]
+       if { $vx >= $vpxmin && $vx <= $vpxmax && \
+       $vy >= $vpymin && $vy <= $vpymax} {
+           set RendererFound 1
+           break
+       }
+    }
+
+    if { $RendererFound } {
+       [$CurrentRenderer GetActiveCamera] SetPosition 32.5 32.5 1000
+       [$CurrentRenderer GetActiveCamera] SetViewUp 0 1 0
+       [$CurrentRenderer GetActiveCamera] ComputeViewPlaneNormal
+       $CurrentRenderer ResetCamera
+    }
+
+    #vtkFnMPR(ColorLookupTable) SetWindow 255
+    #vtkFnMPR(ColorLookupTable) SetLevel 128
+
+    vtkFnMPR(ColorLookupTable) SetWindow $vFnMPR(intmax)
+    vtkFnMPR(ColorLookupTable) SetLevel [expr $vFnMPR(intmax) / 4]
+
+    Render
+}
+
+proc Wireframe {} {
+    global CurrentRenderer
+
+    set actors [$CurrentRenderer GetActors]
+
+    $actors InitTraversal
+    set actor [$actors GetNextItem]
+    while { $actor != "" } {
+       [$actor GetProperty] SetRepresentationToWireframe
+       set actor [$actors GetNextItem]
+    }
+
+    Render
+}
+
+proc Surface {} {
+    global CurrentRenderer
+
+    set actors [$CurrentRenderer GetActors]
+
+    $actors InitTraversal
+    set actor [$actors GetNextItem]
+    while { $actor != "" } {
+       [$actor GetProperty] SetRepresentationToSurface
+       set actor [$actors GetNextItem]
+    }
+
+    Render
+}
+
+
+# clicking on the window sets up sliders with current value at mouse,
+# and scaled so that the whole window represents x4 change.
+proc UpdateWindowLevelInteraction {widget x y} {
+   global vFnMPR
+
+   # get the widgets dimensions
+   set width [lindex [$widget configure -width] 4]
+   set height [lindex [$widget configure -height] 4]
+
+   # get the old window level values
+   set window [GetWidgetVariableValue $widget Window]
+   set level [GetWidgetVariableValue $widget Level]
+
+   # get starting x, y and window/level values to compute delta
+   set start_x [GetWidgetVariableValue $widget X]
+   set start_y [GetWidgetVariableValue $widget Y]
+
+   # compute normalized delta
+   set dx [expr 4.0 * ($x - $start_x) / $width]
+   set dy [expr 4.0 * ($start_y - $y) / $height]
+
+   # scale by current values 
+   set dx [expr $dx * $window]
+   set dy [expr $dy * $level]
+
+   #puts "   update: ($x, $y), dx = $dx, dy = $dy"
+
+   # abs so that direction does not flip
+   if {$window < 0.0} {set dx [expr -$dx]}
+   if {$level < 0.0} {set dy [expr -$dy]}
+
+   # compute new window level
+   set new_window [expr $dx + $window]
+   if {$new_window < 0.0} {
+      set new_level [expr $dy + $level]
+   } else {
+      set new_level [expr $level - $dy]
+   }
+
+   # zero window or level can trap the value.
+   # put a limit of 1 / 100 value
+
+
+   # if window is negative, then delta level should flip (down is dark).
+   if {$new_window < 0.0} {set dy [expr -$dy]}
+
+   vtkFnMPR(ColorLookupTable) SetWindow $new_window
+   vtkFnMPR(ColorLookupTable) SetLevel $new_level
+
+   .frText.t insert end "Window : $new_window  -  Level : $new_level\n"
+
+   Render
+}
diff --git a/lib/maracasVisuLib/src/interface/tcl/to_change/vtkInt.tcl b/lib/maracasVisuLib/src/interface/tcl/to_change/vtkInt.tcl
new file mode 100644 (file)
index 0000000..7f43ebe
--- /dev/null
@@ -0,0 +1,99 @@
+# a generic interactor for tcl and vtk
+#
+catch {unset vtkInteract.bold}
+catch {unset vtkInteract.normal}
+catch {unset vtkInteract.tagcount}
+set vtkInteractBold "-background #43ce80 -foreground #221133 -relief raised -borderwidth 1"
+set vtkInteractNormal "-background #dddddd -foreground #221133 -relief flat"
+set vtkInteractTagcount 1
+set vtkInteractCommandList ""
+set vtkInteractCommandIndex 0
+
+proc vtkInteract {} {
+    global vtkInteractCommandList vtkInteractCommandIndex
+    global vtkInteractTagcount
+
+    proc dovtk {s w} {
+       global vtkInteractBold vtkInteractNormal vtkInteractTagcount 
+       global vtkInteractCommandList vtkInteractCommandIndex
+
+       set tag [append tagnum $vtkInteractTagcount]
+        set vtkInteractCommandIndex $vtkInteractTagcount
+       incr vtkInteractTagcount 1
+       .vtkInteract.display.text configure -state normal
+       .vtkInteract.display.text insert end $s $tag
+       set vtkInteractCommandList [linsert $vtkInteractCommandList end $s]
+       eval .vtkInteract.display.text tag configure $tag $vtkInteractNormal
+       .vtkInteract.display.text tag bind $tag <Any-Enter> \
+           ".vtkInteract.display.text tag configure $tag $vtkInteractBold"
+       .vtkInteract.display.text tag bind $tag <Any-Leave> \
+           ".vtkInteract.display.text tag configure $tag $vtkInteractNormal"
+       .vtkInteract.display.text tag bind $tag <1> "dovtk [list $s] .vtkInteract"
+       .vtkInteract.display.text insert end \n;
+       .vtkInteract.display.text insert end [uplevel 1 $s]
+       .vtkInteract.display.text insert end \n\n
+       .vtkInteract.display.text configure -state disabled
+       .vtkInteract.display.text yview end
+    }
+
+    catch {destroy .vtkInteract}
+    toplevel .vtkInteract -bg #bbbbbb
+    wm title .vtkInteract "vtk Interactor"
+    wm iconname .vtkInteract "vtk"
+    
+    frame .vtkInteract.buttons -bg #bbbbbb
+    pack  .vtkInteract.buttons -side bottom -fill both -expand 0 -pady 2m
+    button .vtkInteract.buttons.dismiss -text Dismiss \
+       -command "wm withdraw .vtkInteract" \
+       -bg #bbbbbb -fg #221133 -activebackground #cccccc -activeforeground #221133
+    pack .vtkInteract.buttons.dismiss -side left -expand 1 -fill x
+    
+    frame .vtkInteract.file -bg #bbbbbb
+    label .vtkInteract.file.label -text "Command:" -width 10 -anchor w \
+       -bg #bbbbbb -fg #221133
+    entry .vtkInteract.file.entry -width 40 \
+       -bg #dddddd -fg #221133 -highlightthickness 1 -highlightcolor #221133
+    bind .vtkInteract.file.entry <Return> {
+       dovtk [%W get] .vtkInteract; %W delete 0 end}
+    pack .vtkInteract.file.label -side left
+    pack .vtkInteract.file.entry -side left -expand 1 -fill x
+    
+    frame .vtkInteract.display -bg #bbbbbb
+    text .vtkInteract.display.text -yscrollcommand ".vtkInteract.display.scroll set" \
+       -setgrid true -width 60 -height 8 -wrap word -bg #dddddd -fg #331144 \
+       -state disabled
+    scrollbar .vtkInteract.display.scroll \
+       -command ".vtkInteract.display.text yview" -bg #bbbbbb \
+       -troughcolor #bbbbbb -activebackground #cccccc -highlightthickness 0 
+    pack .vtkInteract.display.text -side left -expand 1 -fill both
+    pack .vtkInteract.display.scroll -side left -expand 0 -fill y
+
+    pack .vtkInteract.display -side bottom -expand 1 -fill both
+    pack .vtkInteract.file -pady 3m -padx 2m -side bottom -fill x 
+
+    set vtkInteractCommandIndex 0
+    
+    bind .vtkInteract <Down> {
+      if { $vtkInteractCommandIndex < [expr $vtkInteractTagcount - 1] } {
+        incr vtkInteractCommandIndex
+        set command_string [lindex $vtkInteractCommandList $vtkInteractCommandIndex]
+        .vtkInteract.file.entry delete 0 end
+        .vtkInteract.file.entry insert end $command_string
+      } elseif { $vtkInteractCommandIndex == [expr $vtkInteractTagcount - 1] } {
+        .vtkInteract.file.entry delete 0 end
+      }
+    }
+
+    bind .vtkInteract <Up> {
+      if { $vtkInteractCommandIndex > 0 } { 
+        set vtkInteractCommandIndex [expr $vtkInteractCommandIndex - 1]
+        set command_string [lindex $vtkInteractCommandList $vtkInteractCommandIndex]
+        .vtkInteract.file.entry delete 0 end
+        .vtkInteract.file.entry insert end $command_string
+      }
+    }
+
+    wm withdraw .vtkInteract
+}
+
+vtkInteract
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/Makefile.am b/lib/maracasVisuLib/src/interface/tcl/windows/Makefile.am
new file mode 100644 (file)
index 0000000..69ecda0
--- /dev/null
@@ -0,0 +1,20 @@
+## Makefile.am -- Process this file with automake to produce Makefile.in
+
+SUBDIRS = to_change
+
+EXTRA_DIST = \
+       choose_direction.tcl \
+       data_browser.tcl \
+       dlg_name_axis.tcl \
+       dlg_params.tcl \
+       global_window.tcl \
+       help_wnd.tcl \
+       image_browser.tcl \
+       planes_window.tcl \
+       subtract.tcl \
+       u_3D.tcl \
+       u_mip.tcl \
+       u_mpr.tcl \
+       u_surf.tcl
+
+## eof - Makefile.am
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/Makefile.in b/lib/maracasVisuLib/src/interface/tcl/windows/Makefile.in
new file mode 100644 (file)
index 0000000..6cc9495
--- /dev/null
@@ -0,0 +1,330 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+CFLAGS_DEBUG = @CFLAGS_DEBUG@
+CFLAGS_OPTIMIZE = @CFLAGS_OPTIMIZE@
+CFLAGS_WARNING = @CFLAGS_WARNING@
+CPP = @CPP@
+CXX = @CXX@
+DLLTOOL = @DLLTOOL@
+DL_LIBS = @DL_LIBS@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_CONFIG = @GSL_CONFIG@
+GSL_LIBS = @GSL_LIBS@
+IDO_CFLAGS = @IDO_CFLAGS@
+IDO_LIBS = @IDO_LIBS@
+KGFO_CFLAGS = @KGFO_CFLAGS@
+KGFO_CONFIG = @KGFO_CONFIG@
+KGFO_LIBS = @KGFO_LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+MARACAS_ALGORITHM_VER = @MARACAS_ALGORITHM_VER@
+MARACAS_ALGORITHM_VER_STR = @MARACAS_ALGORITHM_VER_STR@
+MARACAS_KERNEL_VER = @MARACAS_KERNEL_VER@
+MARACAS_KERNEL_VER_STR = @MARACAS_KERNEL_VER_STR@
+MARACAS_TCL_VER = @MARACAS_TCL_VER@
+MARACAS_TCL_VER_STR = @MARACAS_TCL_VER_STR@
+MARACAS_VER = @MARACAS_VER@
+MARACAS_VER_STR = @MARACAS_VER_STR@
+MATH_LIBS = @MATH_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+TCLTK_LIBS = @TCLTK_LIBS@
+TCL_BIN_DIR = @TCL_BIN_DIR@
+TCL_INC_DIR = @TCL_INC_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_LIB_FILE = @TCL_LIB_FILE@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TK_BIN_DIR = @TK_BIN_DIR@
+TK_INC_DIR = @TK_INC_DIR@
+TK_LIB_FILE = @TK_LIB_FILE@
+TK_SRC_DIR = @TK_SRC_DIR@
+VERSION = @VERSION@
+VTK_CFLAGS = @VTK_CFLAGS@
+VTK_LIBS = @VTK_LIBS@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CONFIG = @WX_CONFIG@
+WX_LIBS = @WX_LIBS@
+
+SUBDIRS = to_change
+
+EXTRA_DIST =   choose_direction.tcl    data_browser.tcl        dlg_name_axis.tcl       dlg_params.tcl  global_window.tcl       help_wnd.tcl    image_browser.tcl       planes_window.tcl       subtract.tcl    u_3D.tcl        u_mip.tcl       u_mpr.tcl       u_surf.tcl
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu tcl/windows/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" = "." && dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tcl/windows
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tcl/windows/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-tags distclean-generic clean-am
+       -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am:  maintainer-clean-tags maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/choose_direction.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/choose_direction.tcl
new file mode 100644 (file)
index 0000000..047cf9e
--- /dev/null
@@ -0,0 +1,118 @@
+
+namespace eval choose_direction {
+
+    namespace export \
+        show
+
+    # variables
+    variable base ""
+
+    variable frButtons   .frButtons
+    variable frBlueGreen .frBlueGreen
+
+    variable btnCancel .frButtons.btnCancel
+    variable btnOK     .frButtons.btnOk
+
+    variable question .frBlueGreen.question
+
+    variable btnGreenRed .frBlueGreen.btnGreenRed
+    variable btnRedBlue  .frBlueGreen.btnRedBlue
+
+    variable direction -1
+
+    variable im1 ""
+    variable im2 ""
+
+}
+
+proc choose_direction::reset_values { } {
+
+    # For programming facilities
+    upvar choose_direction::base        base
+    upvar choose_direction::frButtons   frButtons
+    upvar choose_direction::frBlueGreen frBlueGreen
+    upvar choose_direction::btnCancel   btnCancel
+    upvar choose_direction::btnOK       btnOk
+    upvar choose_direction::question    question
+    upvar choose_direction::btnGreenRed btnGreenRed
+    upvar choose_direction::btnRedBlue  btnRedBlue
+    upvar choose_direction::direction   direction
+    upvar choose_direction::im1         im1
+    upvar choose_direction::im2         im2
+
+    set base        ""
+    set frButtons   ".frButtons"
+    set frBlueGreen ".frBlueGreen"
+    set btnCancel   ".frButtons.btnCancel"
+    set btnOK       ".frButtons.btnOk"
+    set question    ".frBlueGreen.question"
+    set btnGreenRed ".frBlueGreen.btnGreenRed"
+    set btnRedBlue  ".frBlueGreen.btnRedBlue"
+    set direction   0
+
+    set im1 $global_window::im1
+    set im2 $global_window::im2
+
+}
+
+proc choose_direction::show { parent } {
+
+    # For programming facilities
+    upvar choose_direction::base        base
+    upvar choose_direction::frButtons   frButtons
+    upvar choose_direction::frBlueGreen frBlueGreen
+    upvar choose_direction::btnCancel   btnCancel
+    upvar choose_direction::btnOK       btnOk
+    upvar choose_direction::question    question
+    upvar choose_direction::btnGreenRed btnGreenRed
+    upvar choose_direction::btnRedBlue  btnRedBlue
+    upvar choose_direction::direction   direction
+    upvar choose_direction::im1         im1
+    upvar choose_direction::im2         im2
+
+    choose_direction::reset_values
+    set base        "$parent.choose_direction"
+    set frButtons   "$base$frButtons"
+    set frBlueGreen "$base$frBlueGreen"
+    set btnCancel   "$base$btnCancel"
+    set btnOK       "$base$btnOk"
+    set question    "$base$question"
+    set btnGreenRed "$base$btnGreenRed"
+    set btnRedBlue  "$base$btnRedBlue"
+
+    toplevel $base
+    wm title $base "$string_table::str_partial_axis_delete"
+
+    frame $frButtons
+    frame $frBlueGreen -relief sunken -borderwidth 2 
+
+    button $btnCancel -text $string_table::str_cancel -command "set choose_direction::direction 2; destroy $base"
+    button $btnOK     -text $string_table::str_ok     -command "destroy $base"
+
+    label $question -text "$string_table::str_select_the_segment_to_delete"
+
+    radiobutton $btnGreenRed -relief flat -image $im1 -text "$string_table::str_green_red" -variable cut_type -value 1 -command "set choose_direction::direction -1"
+    radiobutton $btnRedBlue  -relief flat -image $im2 -text "$string_table::str_red_blue"  -variable cut_type -value 2 -command "set choose_direction::direction 1"
+
+    pack $frButtons        -side bottom -fill x -pady 2m
+    pack $btnOK $btnCancel -side left -expand 1 -padx 1c
+    pack $frBlueGreen      -side top -pady 1m -padx 2m 
+    pack $question         -side top -anchor w
+    pack $btnGreenRed      -side top -anchor w
+    pack $btnRedBlue       -side top -anchor w
+
+    $btnGreenRed deselect
+    $btnRedBlue  deselect
+    $btnRedBlue  invoke
+
+    # set global focus input to dialog
+    grab set $base
+
+    # waits for dialog destruction, i.e. waits for user interaction with dialog
+    tkwait window $base
+
+    return $direction
+
+}
+
+# EOF - choose_direction.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/data_browser.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/data_browser.tcl
new file mode 100644 (file)
index 0000000..1198a45
--- /dev/null
@@ -0,0 +1,416 @@
+package require BLT
+package require mclistbox
+catch { namespace import blt::* }
+catch { namespace import mclistbox::* }
+
+namespace eval data_browser {
+
+    # public interface
+    namespace export \
+        sel_study    \
+        sel_serie    \
+        create       \
+        positionate  \
+        set_studies  \
+        forget
+    
+    # variables
+    variable widgets
+
+    variable sel_study ""
+    variable sel_serie ""
+    variable local_id
+
+}
+
+proc data_browser::reset { parent } {
+
+    # For programming facilities
+    upvar data_browser::widgets widgets
+
+    set widgets(base)      "$parent"
+    set widgets(data_brw)  "$parent\.data_browser"
+    set widgets(up_brw)    "$parent\.data_browser.01"
+    set widgets(down_brw)  "$parent\.data_browser.02"
+    set widgets(split)     "$parent\.data_browser.03"
+    set widgets(up_view)   "$parent\.data_browser.01.lst"
+    set widgets(down_view) "$parent\.data_browser.02.lst"
+    set widgets(up_hs)     "$parent\.data_browser.01.hs"
+    set widgets(up_vs)     "$parent\.data_browser.01.vs"
+    set widgets(down_hs)   "$parent\.data_browser.02.hs"
+    set widgets(down_vs)   "$parent\.data_browser.02.vs"
+
+}
+
+proc data_browser::create { parent id } {
+
+    # For programming facilities
+    upvar data_browser::widgets widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+    upvar data_browser::local_id  local_id
+
+    set local_id $id
+    data_browser::reset $parent
+
+    # frames
+    frame $widgets(data_brw) -borderwidth 1 -height 100 -relief groove -width 200 
+    frame $widgets(up_brw)   -borderwidth 1 -height 100 -relief groove -width 200 
+    frame $widgets(down_brw) -borderwidth 1 -height 100 -relief groove -width 200 
+    frame $widgets(split)    -borderwidth 2 -relief raised 
+
+    # multi-column listboxes
+    mclistbox $widgets(up_view)                       \
+        -borderwidth        1                         \
+        -highlightthickness 0                         \
+        -relief             groove                    \
+        -selectborderwidth  0                         \
+        -columnrelief       flat                      \
+        -labelanchor        w                         \
+        -columnborderwidth  0                         \
+        -selectmode         single                    \
+        -labelborderwidth   2                         \
+        -labelrelief        raised                    \
+        -selectcommand      "data_browser::cb_select"
+    scrollbar $widgets(up_vs) -command "$widgets(up_view) yview"
+    scrollbar $widgets(up_hs) -command "$widgets(up_view) xview" -orient horizontal
+    $widgets(up_view) configure -xscrollcommand "$widgets(up_hs) set"
+    $widgets(up_view) configure -yscrollcommand "$widgets(up_vs) set"
+
+    mclistbox $widgets(down_view)                           \
+        -borderwidth        1                               \
+        -highlightthickness 0                               \
+        -relief             groove                          \
+        -selectborderwidth  0                               \
+        -columnrelief       flat                            \
+        -labelanchor        w                               \
+        -columnborderwidth  0                               \
+        -selectmode         extended                        \
+        -labelborderwidth   2                               \
+        -labelrelief        raised                          \
+        -selectcommand      "data_browser::cb_select_serie"
+    scrollbar $widgets(down_vs) -command "$widgets(down_view) yview"
+    scrollbar $widgets(down_hs) -command "$widgets(down_view) xview" -orient horizontal
+    $widgets(down_view) configure -xscrollcommand "$widgets(down_hs) set"
+    $widgets(down_view) configure -yscrollcommand "$widgets(down_vs) set"
+
+    bind $widgets(down_view) <Double-Button-1> "global_window::cb_image_browse"
+
+    # split binds
+    bind $widgets(split) <B1-Motion> {
+        set root [ split %W . ]
+        set nb [ llength $root ]
+        incr nb -1
+        set root [ lreplace $root $nb $nb ]
+        set root [ join $root . ]
+        set height [ winfo height $root ].0
+        set val [ expr (%Y - [winfo rooty $root]) /$height ]
+        if { $val >= 0 && $val <= 1.0 } {
+            place $root.01 -relheight $val
+            place $root.03 -rely $val
+            place $root.02 -relheight [ expr 1.0 - $val ]
+        }
+    }
+
+}
+
+proc data_browser::positionate { } {
+
+    # For programming facilities
+    upvar data_browser::widgets  widgets
+    upvar data_browser::local_id local_id
+
+    set global_window::window_shown $local_id
+
+    pack  $widgets(data_brw)  -anchor center -expand 1 -fill both -side top 
+    place $widgets(up_brw)    -x 0 -y 0 -relwidth 1 -height -1 -relheight 0.5 -anchor nw -bordermode ignore 
+    place $widgets(down_brw)  -x 0 -y 0 -rely 1 -relwidth 1 -height -1 -relheight 0.5 -anchor sw -bordermode ignore 
+    pack  $widgets(up_view)   -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(down_view) -anchor center -expand 1 -fill both -side top 
+    place $widgets(split)     -x 0 -relx 0.9 -y 0 -rely 0.5 -width 10 -height 10 -anchor e -bordermode ignore 
+
+    grid  $widgets(up_view)   -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news
+    grid  $widgets(up_vs)     -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
+    grid  $widgets(up_hs)     -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
+
+    grid  rowconfig    $widgets(up_brw) 0 -weight 1 -minsize 0
+    grid  columnconfig $widgets(up_brw) 0 -weight 1 -minsize 0
+
+    grid  $widgets(down_view) -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news
+    grid  $widgets(down_vs)   -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
+    grid  $widgets(down_hs)   -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
+
+    grid  rowconfig    $widgets(down_brw) 0 -weight 1 -minsize 0
+    grid  columnconfig $widgets(down_brw) 0 -weight 1 -minsize 0
+
+    data_browser::controls 0
+
+}
+
+proc data_browser::forget { } {
+
+    # For programming facilities
+    upvar data_browser::widgets  widgets
+
+    grid  forget $widgets(down_hs)
+    grid  forget $widgets(down_vs)
+    grid  forget $widgets(down_view)
+    grid  forget $widgets(up_hs)
+    grid  forget $widgets(up_vs)
+    grid  forget $widgets(up_view)
+    place forget $widgets(split)
+    pack  forget $widgets(down_view)
+    pack  forget $widgets(up_view)
+    place forget $widgets(down_brw)
+    place forget $widgets(up_brw)
+    pack  forget $widgets(data_brw)
+
+}
+
+proc data_browser::clean_list { } {
+
+    # For programming facilities
+    upvar data_browser::widgets   widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+
+    catch { $widgets(up_view) column delete c08 }
+    catch { $widgets(up_view) column delete c07 }
+    catch { $widgets(up_view) column delete c06 }
+    catch { $widgets(up_view) column delete c05 }
+    catch { $widgets(up_view) column delete c04 }
+    catch { $widgets(up_view) column delete c03 }
+    catch { $widgets(up_view) column delete c02 }
+    catch { $widgets(up_view) column delete c01 }
+    catch { $widgets(up_view) column delete c00 }
+
+    catch { $widgets(down_view) column delete c08 }
+    catch { $widgets(down_view) column delete c07 }
+    catch { $widgets(down_view) column delete c06 }
+    catch { $widgets(down_view) column delete c05 }
+    catch { $widgets(down_view) column delete c04 }
+    catch { $widgets(down_view) column delete c03 }
+    catch { $widgets(down_view) column delete c02 }
+    catch { $widgets(down_view) column delete c01 }
+    catch { $widgets(down_view) column delete c00 }
+
+}
+
+proc data_browser::set_data { } {
+
+    # For programming facilities
+    upvar data_browser::widgets   widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+    upvar data_browser::local_id  local_id
+
+    data_browser::clean_list
+    $widgets(down_view) column add c00 -label "$string_table::str_serie_name"        -width 20
+    $widgets(down_view) column add c01 -label "$string_table::str_serie_number"      -width 10
+    $widgets(down_view) column add c02 -label "$string_table::str_serie_date"        -width 15
+    $widgets(down_view) column add c03 -label "$string_table::str_serie_time"        -width 10
+    $widgets(down_view) column add c04 -label "$string_table::str_serie_modality"    -width 10
+    $widgets(down_view) column add c05 -label "$string_table::str_serie_bodypart"    -width 10
+    $widgets(down_view) column add c06 -label "$string_table::str_serie_description" -width 100
+    $widgets(down_view) column add c07 -label "$string_table::str_serie_diagnostic"  -width 100
+    $widgets(up_view)   column add c00 -label "$string_table::str_patient_name"      -width 20
+    $widgets(up_view)   column add c01 -label "$string_table::str_patient_id"        -width 10
+    $widgets(up_view)   column add c02 -label "$string_table::str_study_name"        -width 15
+    $widgets(up_view)   column add c03 -label "$string_table::str_study_id"          -width 10
+    $widgets(up_view)   column add c04 -label "$string_table::str_study_date"        -width 10
+    $widgets(up_view)   column add c05 -label "$string_table::str_study_time"        -width 10
+    $widgets(up_view)   column add c06 -label "$string_table::str_institution"       -width 20
+    $widgets(up_view)   column add c07 -label "$string_table::str_description"       -width 200
+
+    $widgets(up_view) label bind c00 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c00"
+    $widgets(up_view) label bind c01 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c01"
+    $widgets(up_view) label bind c02 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c02"
+    $widgets(up_view) label bind c03 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c03"
+    $widgets(up_view) label bind c04 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c04"
+    $widgets(up_view) label bind c05 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c05"
+    $widgets(up_view) label bind c06 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c06"
+    $widgets(up_view) label bind c07 <ButtonPress-1> "data_browser::sort_mclst $widgets(up_view) c07"
+
+    $widgets(down_view) label bind c00 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c00"
+    $widgets(down_view) label bind c01 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c01"
+    $widgets(down_view) label bind c02 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c02"
+    $widgets(down_view) label bind c03 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c03"
+    $widgets(down_view) label bind c04 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c04"
+    $widgets(down_view) label bind c05 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c05"
+    $widgets(down_view) label bind c06 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c06"
+    $widgets(down_view) label bind c07 <ButtonPress-1> "data_browser::sort_mclst $widgets(down_view) c07"
+
+    $widgets(up_view) delete 0 end
+    set studies [ studies_dll ]
+    foreach study $studies { 
+    
+        array set arr [ studyData_dll $study ]
+        $widgets(up_view) insert end [ list  \
+            $arr(ID_Patient_Name)            \
+            $arr(ID_Patient_ID)              \
+            $arr(ID_File_Name)               \
+            $arr(ID_Study_ID)                \
+            $arr(ID_Study_Date)              \
+            $arr(ID_Study_Time)              \
+            $arr(ID_Institution_Name)        \
+            $arr(ID_Study_Description)       \
+        ]
+
+    }
+
+    data_browser::sort_mclst $widgets(up_view) c00
+    data_browser::controls 0
+
+}
+
+proc data_browser::cb_select { args } {
+
+    # For programming facilities
+    upvar data_browser::widgets   widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+
+    if { [ string compare $args "" ] != 0 } {
+
+        set sel [ $widgets(up_view) get [ $widgets(up_view) curselection ] ]
+        set sel_study [ lindex $sel 2 ]
+        set series [ series_dll $sel_study ]
+        $widgets(down_view) delete 0 end
+        foreach serie $series {
+        
+            array set arr [ serieData_dll $sel_study $serie ]
+            $widgets(down_view) insert end [ list        \
+                $arr(ID_File_Name)                       \
+                $arr(ID_Series_Number)                   \
+                $arr(ID_Series_Date)                     \
+                $arr(ID_Series_Time)                     \
+                $arr(ID_Modality)                        \
+                $arr(ID_Body_Part_Examined)              \
+                $arr(ID_Series_Description)              \
+                $arr(ID_Admitting_Diagnoses_Description) \
+            ]
+
+        }
+
+        data_browser::controls 0
+    
+    }
+
+
+}
+
+proc data_browser::sort_mclst { lst id } {
+
+    # For programming facilities
+    upvar data_browser::widgets   widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+
+    set data   [ $lst get 0 end ]
+    set index  [ lsearch -exact [ $lst column names ] $id ]
+    set result [ lsort -index $index $data ]
+    $lst delete 0 end
+    eval $lst insert end $result
+
+}
+
+
+proc data_browser::cb_select_serie { args } {
+
+    # For programming facilities
+    upvar data_browser::widgets   widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+
+    if { [ string compare $args "" ] != 0 } {
+
+        set sel [ $widgets(down_view) curselection ]
+        if { [ llength $sel ] == 1 } {
+
+            set sel_serie [ lindex [ $widgets(down_view) get $sel ] 0 ]
+            set data [ serieData_dll $sel_study $sel_serie ]
+            data_browser::controls 1
+
+        } elseif { [ llength $sel ] == 2 } {
+
+            data_browser::controls 2
+
+        } else {
+
+            data_browser::controls 0
+
+        }
+
+    }
+
+}
+
+proc data_browser::get_subdata { } {
+
+    # For programming facilities
+    upvar data_browser::widgets   widgets
+    upvar data_browser::sel_study sel_study
+    upvar data_browser::sel_serie sel_serie
+
+    set sel [ $widgets(down_view) curselection ]
+    set sel_data [ $widgets(down_view) get $sel ]
+    if { [ llength $sel ] == 2 } {
+
+        return [ list [ lindex [ lindex $sel_data 0 ] 0 ] [ lindex [ lindex $sel_data 1 ] 0 ] ]
+
+    }
+    return ""
+
+
+}
+
+proc data_browser::controls { { id -1 } } {
+        
+    if { $id == -1 } {
+
+        global_window::active_controls 0
+
+    } else {
+    
+        if { $id == 0 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_params    | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                0
+            ]
+
+        } elseif { $id == 1 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_ibrw      | \
+                $global_window::en_params    | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                0
+            ]
+
+        } elseif { $id == 2 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_subtract  | \
+                $global_window::en_params    | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                0
+            ]
+
+        }
+
+    }
+
+}
+
+# EOF - data_browser.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/dlg_name_axis.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/dlg_name_axis.tcl
new file mode 100644 (file)
index 0000000..1e20642
--- /dev/null
@@ -0,0 +1,83 @@
+
+namespace eval dlg_name_axis {
+
+    # public interface
+    namespace export \
+        show
+
+    # variables
+    variable widgets
+
+    variable name
+
+}
+
+proc dlg_name_axis::reset { parent } {
+
+    # For programming facilities
+    upvar dlg_name_axis::widgets widgets
+
+    set widgets(base)      "$parent\.dlg_name_axis"
+    set widgets(lbl001)    "$parent\.dlg_name_axis.lbl001"
+    set widgets(frame)     "$parent\.dlg_name_axis.frame"
+    set widgets(lbl002)    "$parent\.dlg_name_axis.frame.lbl002"
+    set widgets(edtName)   "$parent\.dlg_name_axis.frame.name"
+    set widgets(btnOk)     "$parent\.dlg_name_axis.btnOk"
+    set widgets(btnCancel) "$parent\.dlg_name_axis.btnCancel"
+
+}
+
+proc dlg_name_axis::show { parent } {
+
+    # For programming facilities
+    upvar dlg_name_axis::widgets widgets
+    upvar dlg_name_axis::name    name
+
+    dlg_name_axis::reset $parent
+    set name "<no name>"
+
+    toplevel            $widgets(base) -class Toplevel
+    wm focusmodel       $widgets(base) passive
+    wm geometry         $widgets(base) 321x151+95+255
+    wm maxsize          $widgets(base) 1030 755
+    wm minsize          $widgets(base) 106 2
+    wm overrideredirect $widgets(base) 0
+    wm resizable        $widgets(base) 0 0
+    wm title            $widgets(base) "$string_table::str_choose_a_name"
+
+    frame $widgets(frame) -height 30 -width 30 
+
+    label $widgets(lbl001) -borderwidth 0           -text $string_table::str_no_name_choose_yet 
+    label $widgets(lbl002) -anchor w -borderwidth 0 -text $string_table::str_new_axis_name 
+
+    entry $widgets(edtName) -textvariable dlg_name_axis::name
+
+    button $widgets(btnOk)     -default active -text $string_table::str_ok     -command "destroy $widgets(base)"
+    button $widgets(btnCancel)                 -text $string_table::str_cancel -command "set dlg_name_axis::name \"\"; destroy $widgets(base)"
+
+    bind $widgets(btnOk) <Key-Return> "$widgets(btnOk) invoke"
+    bind $widgets(edtName) <Key-Return> "$widgets(btnOk) invoke"
+
+    place $widgets(lbl001)    -x 30 -y 30 -anchor nw -bordermode ignore 
+    place $widgets(frame)     -x 30 -y 60 -width 245 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgets(lbl002)    -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgets(edtName)   -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgets(btnOk)     -x 75 -y 100 -anchor nw -bordermode ignore 
+    place $widgets(btnCancel) -x 160 -y 100 -anchor nw -bordermode ignore 
+
+    focus $widgets(edtName)
+    $widgets(edtName) selection range 0 end
+
+    $widgets(btnOk) flash
+
+    # set global focus input to dialog
+    grab set $widgets(base)
+
+    # waits for dialog destruction, i.e. waits for user interaction with dialog
+    tkwait window $widgets(base)
+
+    return $dlg_name_axis::name
+
+}
+
+# EOF - dlg_name_axis.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/dlg_params.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/dlg_params.tcl
new file mode 100644 (file)
index 0000000..ddcb460
--- /dev/null
@@ -0,0 +1,1301 @@
+namespace eval dlg_params {
+
+    # public interface
+    namespace export \
+        show
+
+    # variables
+    variable widgets
+    variable widgetsGeneral
+    variable widgetsAxes
+    variable widgetsContours
+    variable widgetsQuantification
+
+    # values to load
+    variable gen_debug      0
+    variable con_debug      0
+    variable quant_type     0
+    variable stenosis_type  0
+    variable alg_type       0
+    variable voxel_typ      0
+    variable params_to_save {}
+
+}
+
+proc dlg_params::reset { parent } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set widgets(base)           "$parent\.dlg_params"
+    set widgets(tabs)           "$parent\.dlg_params.tabs"
+    set widgets(buttons)        "$parent\.dlg_params.buttons"
+    set widgets(general)        "$parent\.dlg_params.general"
+    set widgets(axis)           "$parent\.dlg_params.axis"
+    set widgets(contour)        "$parent\.dlg_params.contour"
+    set widgets(quantification) "$parent\.dlg_params.quantification"
+    set widgets(btnGeneral)     "$parent\.dlg_params.tabs.btnGeneral"
+    set widgets(btnAxis)        "$parent\.dlg_params.tabs.btnAxis"
+    set widgets(btnContour)     "$parent\.dlg_params.tabs.btnContour"
+    set widgets(btnQuant)       "$parent\.dlg_params.tabs.btnQuant"
+    set widgets(btnOk)          "$parent\.dlg_params.buttons.btnOk"
+    set widgets(btnCancel)      "$parent\.dlg_params.buttons.btnCancel"
+
+    set widgetsGeneral(genDataPaths)    "$parent\.dlg_params.general.dataPaths"
+    set widgetsGeneral(genWork)         "$parent\.dlg_params.general.dataPaths.cpd24"
+    set widgetsGeneral(genWork01)       "$parent\.dlg_params.general.dataPaths.cpd24.01"
+    set widgetsGeneral(genWork02)       "$parent\.dlg_params.general.dataPaths.cpd24.02"
+    set widgetsGeneral(genImages)       "$parent\.dlg_params.general.dataPaths.cpd25"
+    set widgetsGeneral(genImages01)     "$parent\.dlg_params.general.dataPaths.cpd25.01"
+    set widgetsGeneral(genImages02)     "$parent\.dlg_params.general.dataPaths.cpd25.02"
+    set widgetsGeneral(genBtnBrwWork)   "$parent\.dlg_params.general.dataPaths.btnBrwWork"
+    set widgetsGeneral(genBtnBrwImages) "$parent\.dlg_params.general.dataPaths.btnBrwImages"
+    set widgetsGeneral(genDebug)        "$parent\.dlg_params.general.debug"
+    set widgetsGeneral(genBtnWndVis)    "$parent\.dlg_params.general.debug.btnWndVis"
+    set widgetsGeneral(genBtnConVis)    "$parent\.dlg_params.general.debug.btnConVis"
+    set widgetsGeneral(genBtnMIPDef)    "$parent\.dlg_params.general.debug.btnMIPDef"
+    set widgetsGeneral(genBtnAllSlc)    "$parent\.dlg_params.general.debug.btnAllSlc"
+    set widgetsGeneral(genBtnColor)     "$parent\.dlg_params.general.debug.btnColor"
+    set widgetsGeneral(genlbl009)       "$parent\.dlg_params.general.debug.lbl009"
+    set widgetsGeneral(genlbl001)       "$parent\.dlg_params.general.lbl001"
+    set widgetsGeneral(genlbl078)       "$parent\.dlg_params.general.lbl078"
+
+    set widgetsAxes(axVoxelX)        "$parent\.dlg_params.axis.cpd26"
+    set widgetsAxes(axVoxelX01)      "$parent\.dlg_params.axis.cpd26.01"
+    set widgetsAxes(axVoxelX02)      "$parent\.dlg_params.axis.cpd26.02"
+    set widgetsAxes(axVoxelY)        "$parent\.dlg_params.axis.cpd28"
+    set widgetsAxes(axVoxelY01)      "$parent\.dlg_params.axis.cpd28.01"
+    set widgetsAxes(axVoxelY02)      "$parent\.dlg_params.axis.cpd28.02"
+    set widgetsAxes(axVoxelZ)        "$parent\.dlg_params.axis.cpd29"
+    set widgetsAxes(axVoxelZ01)      "$parent\.dlg_params.axis.cpd29.01"
+    set widgetsAxes(axVoxelZ02)      "$parent\.dlg_params.axis.cpd29.02"
+    set widgetsAxes(axStep)          "$parent\.dlg_params.axis.cpd30"
+    set widgetsAxes(axStep01)        "$parent\.dlg_params.axis.cpd30.01"
+    set widgetsAxes(axStep02)        "$parent\.dlg_params.axis.cpd30.02"
+    set widgetsAxes(axAxisStep)      "$parent\.dlg_params.axis.cpd31"
+    set widgetsAxes(axAxisStep01)    "$parent\.dlg_params.axis.cpd31.01"
+    set widgetsAxes(axAxisStep02)    "$parent\.dlg_params.axis.cpd31.02"
+    set widgetsAxes(axROIDim)        "$parent\.dlg_params.axis.cpd32"
+    set widgetsAxes(axROIDim01)      "$parent\.dlg_params.axis.cpd32.01"
+    set widgetsAxes(axROIDim02)      "$parent\.dlg_params.axis.cpd32.02"
+    set widgetsAxes(axMassPower)     "$parent\.dlg_params.axis.cpd33"
+    set widgetsAxes(axMassPower01)   "$parent\.dlg_params.axis.cpd33.01"
+    set widgetsAxes(axMassPower02)   "$parent\.dlg_params.axis.cpd33.02"
+    set widgetsAxes(axTension)       "$parent\.dlg_params.axis.cpd34"
+    set widgetsAxes(axTension01)     "$parent\.dlg_params.axis.cpd34.01"
+    set widgetsAxes(axTension02)     "$parent\.dlg_params.axis.cpd34.02"
+    set widgetsAxes(axPas)           "$parent\.dlg_params.axis.cpd35"
+    set widgetsAxes(axPas01)         "$parent\.dlg_params.axis.cpd35.01"
+    set widgetsAxes(axPas02)         "$parent\.dlg_params.axis.cpd35.02"
+    set widgetsAxes(axDistCDG)       "$parent\.dlg_params.axis.cpd36"
+    set widgetsAxes(axDistCDG01)     "$parent\.dlg_params.axis.cpd36.01"
+    set widgetsAxes(axDistCDG02)     "$parent\.dlg_params.axis.cpd36.02"
+    set widgetsAxes(axCell)          "$parent\.dlg_params.axis.cpd37"
+    set widgetsAxes(axCell01)        "$parent\.dlg_params.axis.cpd37.01"
+    set widgetsAxes(axCell02)        "$parent\.dlg_params.axis.cpd37.02"
+    set widgetsAxes(axFlex)          "$parent\.dlg_params.axis.cpd38"
+    set widgetsAxes(axFlex01)        "$parent\.dlg_params.axis.cpd38.01"
+    set widgetsAxes(axFlex02)        "$parent\.dlg_params.axis.cpd38.02"
+    set widgetsAxes(axMaskSize)      "$parent\.dlg_params.axis.cpd39"
+    set widgetsAxes(axMaskSize01)    "$parent\.dlg_params.axis.cpd39.01"
+    set widgetsAxes(axMaskSize02)    "$parent\.dlg_params.axis.cpd39.02"
+    set widgetsAxes(axDistInt)       "$parent\.dlg_params.axis.cpd40"
+    set widgetsAxes(axDistInt01)     "$parent\.dlg_params.axis.cpd40.01"
+    set widgetsAxes(axDistInt02)     "$parent\.dlg_params.axis.cpd40.02"
+    set widgetsAxes(axCoefCellMax)   "$parent\.dlg_params.axis.axCoefCellMax"
+    set widgetsAxes(axCoefCellMax01) "$parent\.dlg_params.axis.axCoefCellMax.01"
+    set widgetsAxes(axCoefCellMax02) "$parent\.dlg_params.axis.axCoefCellMax.02"
+    set widgetsAxes(axBtnMinVoxel)   "$parent\.dlg_params.axis.btnMinVoxel"
+    set widgetsAxes(axBtnNorVoxel)   "$parent\.dlg_params.axis.btnNorVoxel"
+    set widgetsAxes(axlblColor)      "$parent\.dlg_params.axis.lblColor"
+    set widgetsAxes(axBtnColor)      "$parent\.dlg_params.axis.btnColor"
+    set widgetsAxes(axLblDebug)      "$parent\.dlg_params.axis.lblDebug"
+    set widgetsAxes(axFrDebug)       "$parent\.dlg_params.axis.frDebug"
+    set widgetsAxes(axBtnShowCell)   "$parent\.dlg_params.axis.frDebug.btnShowCell"
+    set widgetsAxes(axBtnShowICell)  "$parent\.dlg_params.axis.frDebug.btnShowICell"
+
+    set widgetsContours(conFrSlice)               "$parent\.dlg_params.contour.frSlice"
+    set widgetsContours(conFrScale)               "$parent\.dlg_params.contour.frSlice.frScale"
+    set widgetsContours(conLblScale)              "$parent\.dlg_params.contour.frSlice.frScale.lblScale"
+    set widgetsContours(conEdtScale)              "$parent\.dlg_params.contour.frSlice.frScale.edtScale"
+    set widgetsContours(conFrSample)              "$parent\.dlg_params.contour.frSlice.frSample"
+    set widgetsContours(conLblSample)             "$parent\.dlg_params.contour.frSlice.frSample.lblSample"
+    set widgetsContours(conEdtSample)             "$parent\.dlg_params.contour.frSlice.frSample.edtSample"
+    set widgetsContours(conFrDebug)               "$parent\.dlg_params.contour.frDebug"
+    set widgetsContours(conBtnIsoconturs)         "$parent\.dlg_params.contour.frDebug.btnIsoconturs"
+    set widgetsContours(conBtnDiameters)          "$parent\.dlg_params.contour.frDebug.btnDiameters"
+    set widgetsContours(conBtnFillContours)       "$parent\.dlg_params.contour.frDebug.btnFillContours"
+    set widgetsContours(conFrIso)                 "$parent\.dlg_params.contour.frIso"
+    set widgetsContours(conFrThrIso)              "$parent\.dlg_params.contour.frIso.frThrIso"
+    set widgetsContours(conLblThrIso)             "$parent\.dlg_params.contour.frIso.frThrIso.lblThrIso"
+    set widgetsContours(conEdtThrIso)             "$parent\.dlg_params.contour.frIso.frThrIso.edtThrIso"
+    set widgetsContours(conFrSnakeIso)            "$parent\.dlg_params.contour.frSnakeIso"
+    set widgetsContours(conFrThrSnakeIso)         "$parent\.dlg_params.contour.frSnakeIso.frThrSnakeIso"
+    set widgetsContours(conLblThrSnakeIso)        "$parent\.dlg_params.contour.frSnakeIso.frThrSnakeIso.lblThrSnakeIso"
+    set widgetsContours(conEdtThrSnakeIso)        "$parent\.dlg_params.contour.frSnakeIso.frThrSnakeIso.edtThrSnakeIso"
+    set widgetsContours(conFrIterSnakeIso)        "$parent\.dlg_params.contour.frSnakeIso.frIterSnakeIso"
+    set widgetsContours(conLblIterSnakeIso)       "$parent\.dlg_params.contour.frSnakeIso.frIterSnakeIso.lblIterSnakeIso"
+    set widgetsContours(conEdtIterSnakeIso)       "$parent\.dlg_params.contour.frSnakeIso.frIterSnakeIso.edtIterSnakeIso"
+    set widgetsContours(conFrCoefExternSnakeIso)  "$parent\.dlg_params.contour.frSnakeIso.frCoefExternSnakeIso"
+    set widgetsContours(conLblCoefExternSnakeIso) "$parent\.dlg_params.contour.frSnakeIso.frCoefExternSnakeIso.lblCoefExternSnakeIso"
+    set widgetsContours(conEdtCoefExternSnakeIso) "$parent\.dlg_params.contour.frSnakeIso.frCoefExternSnakeIso.edtCoefExternSnakeIso"
+    set widgetsContours(conFrSnakeDer)            "$parent\.dlg_params.contour.frSnakeDer"
+    set widgetsContours(conFrIterSnakeDer)        "$parent\.dlg_params.contour.frSnakeDer.frIterSnakeDer"
+    set widgetsContours(conLblIterSnakeDer)       "$parent\.dlg_params.contour.frSnakeDer.frIterSnakeDer.lblIterSnakeDer"
+    set widgetsContours(conEdtIterSnakeDer)       "$parent\.dlg_params.contour.frSnakeDer.frIterSnakeDer.edtIterSnakeDer"
+    set widgetsContours(conFrCoefGradSnakeDer)    "$parent\.dlg_params.contour.frSnakeDer.frCoefGradSnakeDer"
+    set widgetsContours(conLblCoefGradSnakeDer)   "$parent\.dlg_params.contour.frSnakeDer.frCoefGradSnakeDer.lblCoefGradSnakeDer"
+    set widgetsContours(conEdtCoefGradSnakeDer)   "$parent\.dlg_params.contour.frSnakeDer.frCoefGradSnakeDer.edtCoefGradSnakeDer"
+    set widgetsContours(conFrCoefBallonSnakeDer)  "$parent\.dlg_params.contour.frSnakeDer.frBallonCoefSnakeDer"
+    set widgetsContours(conLblCoefBallonSnakeDer) "$parent\.dlg_params.contour.frSnakeDer.frBallonCoefSnakeDer.lblCoefBallonSnakeDer"
+    set widgetsContours(conEdtCoefBallonSnakeDer) "$parent\.dlg_params.contour.frSnakeDer.frBallonCoefSnakeDer.edtCoefBallonSnakeDer"
+    set widgetsContours(conFrSigmaSnakeDer)       "$parent\.dlg_params.contour.frSnakeDer.frSigmaSnakeDer"
+    set widgetsContours(conLblSigmaSnakeDer)      "$parent\.dlg_params.contour.frSnakeDer.frSigmaSnakeDer.lblSigmaSnakeDer"
+    set widgetsContours(conEdtSigmaSnakeDer)      "$parent\.dlg_params.contour.frSnakeDer.frSigmaSnakeDer.edtSigmaSnakeDer"
+    set widgetsContours(conLbl001)                "$parent\.dlg_params.contour.lbl001"
+    set widgetsContours(conLbl002)                "$parent\.dlg_params.contour.lbl002"
+    set widgetsContours(conBtnIso)                "$parent\.dlg_params.contour.btnIso"
+    set widgetsContours(conBtnSnakeIso)           "$parent\.dlg_params.contour.btnSnakeIso"
+    set widgetsContours(conBtnSnakeDer)           "$parent\.dlg_params.contour.btnSnakeDer"
+
+    set widgetsQuantification(quantMeasures)    "$parent\.dlg_params.quantification.measures"
+    set widgetsQuantification(quantBtnAreaM)    "$parent\.dlg_params.quantification.measures.btnAreaM"
+    set widgetsQuantification(quantBtnPeriM)    "$parent\.dlg_params.quantification.measures.btnPeriM"
+    set widgetsQuantification(quantBtnDiaAreaM) "$parent\.dlg_params.quantification.measures.btnDiaAreaM"
+    set widgetsQuantification(quantBtnDiaPeriM) "$parent\.dlg_params.quantification.measures.btnDiaPeriM"
+    set widgetsQuantification(quantBtnDiaMinM)  "$parent\.dlg_params.quantification.measures.btnDiaMinM"
+    set widgetsQuantification(quantBtnDiaMaxM)  "$parent\.dlg_params.quantification.measures.btnDiaMaxM"
+    set widgetsQuantification(quantBtnDiaAvgM)  "$parent\.dlg_params.quantification.measures.btnDiaAvgM"
+    set widgetsQuantification(quantStenosis)    "$parent\.dlg_params.quantification.stenosis"
+    set widgetsQuantification(quantBtnAreaS)    "$parent\.dlg_params.quantification.stenosis.btnAreaS"
+    set widgetsQuantification(quantBtnPeriS)    "$parent\.dlg_params.quantification.stenosis.btnPeriS"
+    set widgetsQuantification(quantBtnDiaAreaS) "$parent\.dlg_params.quantification.stenosis.btnDiaAreaS"
+    set widgetsQuantification(quantBtnDiaPeriS) "$parent\.dlg_params.quantification.stenosis.btnDiaPeriS"
+    set widgetsQuantification(quantBtnDiaMinS)  "$parent\.dlg_params.quantification.stenosis.btnDiaMinS"
+    set widgetsQuantification(quantBtnDiaMaxS)  "$parent\.dlg_params.quantification.stenosis.btnDiaMaxS"
+    set widgetsQuantification(quantBtnDiaAvgS)  "$parent\.dlg_params.quantification.stenosis.btnDiaAvgS"
+    set widgetsQuantification(quantlbl22)       "$parent\.dlg_params.quantification.lbl22"
+    set widgetsQuantification(quantlbl23)       "$parent\.dlg_params.quantification.lbl23"
+
+    set gen_debug      0
+    set con_debug      0
+    set quant_type     0
+    set stenosis_type  0
+    set alg_type       0
+    set params_to_save {}
+
+}
+
+proc dlg_params::show { parent params } {       
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    dlg_params::reset $parent
+
+    # toplevel
+    toplevel            $widgets(base) -class Toplevel
+    wm focusmodel       $widgets(base) passive
+    wm geometry         $widgets(base) 519x384+357+190
+    wm maxsize          $widgets(base) 1030 755
+    wm minsize          $widgets(base) 106 2
+    wm overrideredirect $widgets(base) 0
+    wm resizable        $widgets(base) 0 0
+    wm deiconify        $widgets(base)
+    wm title            $widgets(base) "$string_table::str_title_params"
+
+    # frames
+    frame $widgets(tabs)           -height 75 -width 125 
+    frame $widgets(buttons)        -height 47 -width 125 
+    frame $widgets(general)        -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(axis)           -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(contour)        -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(quantification) -borderwidth 2 -height 75 -relief groove -width 125 
+
+    frame $widgetsGeneral(genDataPaths) -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgetsGeneral(genWork)      -borderwidth 1 -height 30 -width 30 
+    frame $widgetsGeneral(genImages)    -borderwidth 1 -height 30 -width 30 
+    frame $widgetsGeneral(genDebug)     -borderwidth 2 -height 75 -relief groove -width 125 
+
+    frame $widgetsAxes(axVoxelX)      -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axVoxelY)      -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axVoxelZ)      -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axStep)        -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axAxisStep)    -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axROIDim)      -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axMassPower)   -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axTension)     -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axPas)         -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axDistCDG)     -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axCell)        -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axFlex)        -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axMaskSize)    -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axDistInt)     -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axCoefCellMax) -borderwidth 1 -height 30 -width 30 
+    frame $widgetsAxes(axFrDebug)     -borderwidth 2 -height 30 -width 30 -relief groove
+
+    frame $widgetsContours(conFrSlice)               -borderwidth 2 -height 30 -width 30 -relief groove
+    frame $widgetsContours(conFrScale)               -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrSample)              -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrDebug)               -borderwidth 2 -height 30 -width 30 -relief groove
+    frame $widgetsContours(conFrIso)                 -borderwidth 2 -height 30 -width 30 -relief groove
+    frame $widgetsContours(conFrThrIso)              -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrSnakeIso)            -borderwidth 2 -height 30 -width 30 -relief groove
+    frame $widgetsContours(conFrThrSnakeIso)         -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrIterSnakeIso)        -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrCoefExternSnakeIso)  -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrSnakeDer)            -borderwidth 2 -height 30 -width 30 -relief groove
+    frame $widgetsContours(conFrIterSnakeDer)        -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrCoefGradSnakeDer)    -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrCoefBallonSnakeDer)  -borderwidth 1 -height 30 -width 30
+    frame $widgetsContours(conFrSigmaSnakeDer)       -borderwidth 1 -height 30 -width 30
+
+    frame $widgetsQuantification(quantMeasures) -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgetsQuantification(quantStenosis) -borderwidth 2 -height 75 -relief groove -width 125 
+
+    # tabs
+    radiobutton $widgets(btnGeneral) -indicatoron 0 -text $string_table::str_general        -variable tab_value -value 1 -command "dlg_params::cb_show_general"
+    radiobutton $widgets(btnAxis)    -indicatoron 0 -text $string_table::str_axis           -variable tab_value -value 2 -command "dlg_params::cb_show_axis"
+    radiobutton $widgets(btnContour) -indicatoron 0 -text $string_table::str_contour        -variable tab_value -value 3 -command "dlg_params::cb_show_contour"
+    radiobutton $widgets(btnQuant)   -indicatoron 0 -text $string_table::str_quantification -variable tab_value -value 4 -command "dlg_params::cb_show_quant"
+
+    # entries
+    entry $widgetsGeneral(genWork02)
+    entry $widgetsGeneral(genImages02)
+    
+    entry $widgetsAxes(axVoxelX02)
+    entry $widgetsAxes(axVoxelY02)
+    entry $widgetsAxes(axVoxelZ02)
+    label $widgetsAxes(axStep02)
+    entry $widgetsAxes(axAxisStep02)
+    label $widgetsAxes(axROIDim02)
+    label $widgetsAxes(axMassPower02)
+    entry $widgetsAxes(axTension02)
+    label $widgetsAxes(axPas02)
+    entry $widgetsAxes(axDistCDG02)
+    label $widgetsAxes(axCell02)
+    entry $widgetsAxes(axFlex02)
+    entry $widgetsAxes(axMaskSize02)
+    label $widgetsAxes(axDistInt02)
+    label $widgetsAxes(axCoefCellMax02)
+
+    entry $widgetsContours(conEdtScale)
+    entry $widgetsContours(conEdtSample)
+    entry $widgetsContours(conEdtThrIso)
+    entry $widgetsContours(conEdtThrSnakeIso)
+    entry $widgetsContours(conEdtIterSnakeIso)
+    entry $widgetsContours(conEdtCoefExternSnakeIso)
+    entry $widgetsContours(conEdtIterSnakeDer)
+    entry $widgetsContours(conEdtCoefGradSnakeDer)
+    entry $widgetsContours(conEdtCoefBallonSnakeDer)
+    entry $widgetsContours(conEdtSigmaSnakeDer)
+
+    # checkbuttons
+    checkbutton $widgetsGeneral(genBtnWndVis) -text $string_table::str_debug_window_visible   -variable btnWndVis  -command { dlg_params::cb_gen_debug $btnWndVis  0x01 }
+    checkbutton $widgetsGeneral(genBtnConVis) -text $string_table::str_console_window_visible -variable btnConsole -command { dlg_params::cb_gen_debug $btnConsole 0x02 }
+    checkbutton $widgetsGeneral(genBtnMIPDef) -text $string_table::str_calculate_mip_default  -variable btnMIP     -command { dlg_params::cb_gen_debug $btnMIP     0x04 }
+    checkbutton $widgetsGeneral(genBtnAllSlc) -text $string_table::str_all_slices_selected    -variable btnSlices  -command { dlg_params::cb_gen_debug $btnSlices  0x08 }
+
+    checkbutton $widgetsAxes(axBtnShowCell)  -text $string_table::str_show_cell    -variable btnDebug01 
+    checkbutton $widgetsAxes(axBtnShowICell) -text $string_table::str_show_i_cell  -variable btnDebug02 
+
+    checkbutton $widgetsContours(conBtnIsoconturs)   -text $string_table::str_isocontours    -variable btn001 -command { dlg_params::cb_con_debug $btn001 0x01 }
+    checkbutton $widgetsContours(conBtnDiameters)    -text $string_table::str_diameters      -variable btn002 -command { dlg_params::cb_con_debug $btn001 0x02 }
+    checkbutton $widgetsContours(conBtnFillContours) -text $string_table::str_filled_contour -variable btn003 -command { dlg_params::cb_con_debug $btn001 0x04 }
+
+    checkbutton $widgetsQuantification(quantBtnAreaM)    -text $string_table::str_area      -variable btnArea    -command { dlg_params::cb_quant_type $btnArea    0x01 quantBtnAreaS }
+    checkbutton $widgetsQuantification(quantBtnPeriM)    -text $string_table::str_peri      -variable btnPeri    -command { dlg_params::cb_quant_type $btnPeri    0x02 quantBtnPeriS }
+    checkbutton $widgetsQuantification(quantBtnDiaAreaM) -text $string_table::str_diam_area -variable btnDiaArea -command { dlg_params::cb_quant_type $btnDiaArea 0x04 quantBtnDiaAreaS }
+    checkbutton $widgetsQuantification(quantBtnDiaPeriM) -text $string_table::str_diam_peri -variable btnDiaPeri -command { dlg_params::cb_quant_type $btnDiaPeri 0x08 quantBtnDiaPeriS }
+    checkbutton $widgetsQuantification(quantBtnDiaMinM)  -text $string_table::str_diam_min  -variable btnDiaMin  -command { dlg_params::cb_quant_type $btnDiaMin  0x10 quantBtnDiaMinS }
+    checkbutton $widgetsQuantification(quantBtnDiaMaxM)  -text $string_table::str_diam_max  -variable btnDiaMax  -command { dlg_params::cb_quant_type $btnDiaMax  0x20 quantBtnDiaMaxS }
+    checkbutton $widgetsQuantification(quantBtnDiaAvgM)  -text $string_table::str_diam_avg  -variable btnDiaAvg  -command { dlg_params::cb_quant_type $btnDiaAvg  0x40 quantBtnDiaAvgS }
+
+    # radiobuttons
+    radiobutton $widgetsAxes(axBtnMinVoxel)  -borderwidth 0 -text $string_table::str_minimum_voxel -variable dlg_params::voxel_typ -value 1 
+    radiobutton $widgetsAxes(axBtnNorVoxel)  -borderwidth 0 -text $string_table::str_normal_voxel  -variable dlg_params::voxel_typ -value 2
+
+    radiobutton $widgetsContours(conBtnIso)      -text $string_table::str_isocontour -variable dlg_params::alg_type -value 1 -borderwidth 0 -relief flat
+    radiobutton $widgetsContours(conBtnSnakeIso) -text $string_table::str_snake_iso  -variable dlg_params::alg_type -value 2 -borderwidth 0 -relief flat
+    radiobutton $widgetsContours(conBtnSnakeDer) -text $string_table::str_snake_der  -variable dlg_params::alg_type -value 3 -borderwidth 0 -relief flat
+
+    radiobutton $widgetsQuantification(quantBtnAreaS)    -text $string_table::str_area      -variable v_stenosis_type -value 1 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+    radiobutton $widgetsQuantification(quantBtnPeriS)    -text $string_table::str_peri      -variable v_stenosis_type -value 2 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+    radiobutton $widgetsQuantification(quantBtnDiaAreaS) -text $string_table::str_diam_area -variable v_stenosis_type -value 3 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+    radiobutton $widgetsQuantification(quantBtnDiaPeriS) -text $string_table::str_diam_peri -variable v_stenosis_type -value 4 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+    radiobutton $widgetsQuantification(quantBtnDiaMaxS)  -text $string_table::str_diam_max  -variable v_stenosis_type -value 5 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+    radiobutton $widgetsQuantification(quantBtnDiaMinS)  -text $string_table::str_diam_min  -variable v_stenosis_type -value 6 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+    radiobutton $widgetsQuantification(quantBtnDiaAvgS)  -text $string_table::str_diam_avg  -variable v_stenosis_type -value 7 -command { dlg_params::set_stenosis_type $v_stenosis_type }
+
+    # labels
+    label $widgetsGeneral(genWork01)   -anchor w      -text $string_table::str_work_directory
+    label $widgetsGeneral(genImages01) -anchor w      -text $string_table::str_images_directory
+    label $widgetsGeneral(genlbl009)   -borderwidth 0 -text $string_table::str_3D_back_color 
+    label $widgetsGeneral(genlbl001)   -borderwidth 0 -text $string_table::str_directories 
+    label $widgetsGeneral(genlbl078)   -borderwidth 0 -text $string_table::str_user_defined 
+
+    label $widgetsAxes(axVoxelX01)      -anchor w      -text $string_table::str_dim_voxel_x
+    label $widgetsAxes(axVoxelY01)      -anchor w      -text $string_table::str_dim_voxel_y
+    label $widgetsAxes(axVoxelZ01)      -anchor w      -text $string_table::str_dim_voxel_z
+    label $widgetsAxes(axStep01)        -anchor w      -text $string_table::str_step -state disabled
+    label $widgetsAxes(axAxisStep01)    -anchor w      -text $string_table::str_axis_step
+    label $widgetsAxes(axROIDim01)      -anchor w      -text $string_table::str_roi_dim -state disabled
+    label $widgetsAxes(axMassPower01)   -anchor w      -text $string_table::str_mass_power -state disabled
+    label $widgetsAxes(axTension01)     -anchor w      -text $string_table::str_coef_tension
+    label $widgetsAxes(axPas01)         -anchor w      -text $string_table::str_coef_pas -state disabled
+    label $widgetsAxes(axDistCDG01)     -anchor w      -text $string_table::str_distance_cdg -state disabled
+    label $widgetsAxes(axCell01)        -anchor w      -text $string_table::str_coef_cell -state disabled
+    label $widgetsAxes(axFlex01)        -anchor w      -text $string_table::str_coef_flex
+    label $widgetsAxes(axMaskSize01)    -anchor w      -text $string_table::str_mask_size
+    label $widgetsAxes(axDistInt01)     -anchor w      -text $string_table::str_dist_int -state disabled
+    label $widgetsAxes(axlblColor)      -borderwidth 0 -text $string_table::str_axis_color 
+    label $widgetsAxes(axCoefCellMax01) -anchor w      -text $string_table::str_coef_cell_max_int -state disabled
+    label $widgetsAxes(axLblDebug)      -anchor w -text $string_table::str_debug
+
+
+    label $widgetsContours(conLblScale)              -anchor w -text $string_table::str_scale
+    label $widgetsContours(conLblSample)             -anchor w -text $string_table::str_sample
+    label $widgetsContours(conLblThrIso)             -anchor w -text $string_table::str_threshold
+    label $widgetsContours(conLblThrSnakeIso)        -anchor w -text $string_table::str_threshold
+    label $widgetsContours(conLblIterSnakeIso)       -anchor w -text $string_table::str_iter
+    label $widgetsContours(conLblCoefExternSnakeIso) -anchor w -text $string_table::str_coef_extern
+    label $widgetsContours(conLblIterSnakeDer)       -anchor w -text $string_table::str_iter
+    label $widgetsContours(conLblCoefGradSnakeDer)   -anchor w -text $string_table::str_coef_grad
+    label $widgetsContours(conLblCoefBallonSnakeDer) -anchor w -text $string_table::str_coef_ballon
+    label $widgetsContours(conLblSigmaSnakeDer)      -anchor w -text $string_table::str_sigma
+    label $widgetsContours(conLbl001)                -anchor w -text $string_table::str_slice
+    label $widgetsContours(conLbl002)                -anchor w -text $string_table::str_debug
+   
+    label $widgetsQuantification(quantlbl22) -borderwidth 0 -text $string_table::str_data_types 
+    label $widgetsQuantification(quantlbl23) -borderwidth 0 -text $string_table::str_stenosis_type 
+
+    # buttons
+    button $widgets(btnOk)     -text $string_table::str_ok          -command "dlg_params::save_params"
+    button $widgets(btnCancel) -text $string_table::str_cancel      -command "dlg_params::cancel_params"
+    
+    button $widgetsGeneral(genBtnBrwWork)   -text $string_table::str_browse -command "dlg_params::cb_browse_path $widgetsGeneral(genWork02)"
+    button $widgetsGeneral(genBtnBrwImages) -text $string_table::str_browse -command "dlg_params::cb_browse_path $widgetsGeneral(genImages02)"
+    button $widgetsGeneral(genBtnColor)                                     -command "dlg_params::cb_choose_color $widgetsGeneral(genBtnColor)"
+
+    button $widgetsAxes(axBtnColor) -command "dlg_params::cb_choose_color $widgetsAxes(axBtnColor)"
+
+    # packing
+    dlg_params::positionate
+
+    # init
+    dlg_params::init_params $params
+
+    # set global focus input to dialog
+    grab set $widgets(base)
+
+    # waits for dialog destruction, i.e. waits for user interaction with dialog
+    tkwait window $widgets(base)
+
+    return $params_to_save
+
+}
+
+proc dlg_params::positionate { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    pack  $widgets(tabs)       -expand 0 -fill x -side top 
+    pack  $widgets(btnGeneral) -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnAxis)    -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnContour) -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnQuant)   -anchor nw -expand 0 -fill none -side left 
+
+    $widgets(btnGeneral) deselect
+    $widgets(btnAxis)    deselect
+    $widgets(btnContour) deselect
+    $widgets(btnQuant)   deselect
+    $widgets(btnGeneral) invoke
+
+}
+
+proc dlg_params::init_params { params } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set params_to_save $params
+    array set arr $params
+
+    $widgetsGeneral(genWork02)   delete 0 end
+    $widgetsGeneral(genImages02) delete 0 end
+
+    $widgetsAxes(axVoxelX02) delete 0 end
+    $widgetsAxes(axVoxelY02) delete 0 end
+    $widgetsAxes(axVoxelZ02) delete 0 end
+    $widgetsAxes(axAxisStep02) delete 0 end
+    $widgetsAxes(axTension02) delete 0 end
+    $widgetsAxes(axDistCDG02) delete 0 end
+    $widgetsAxes(axFlex02) delete 0 end
+    $widgetsAxes(axMaskSize02) delete 0 end
+
+    $widgetsContours(conEdtScale)              delete 0 end
+    $widgetsContours(conEdtSample)             delete 0 end
+    $widgetsContours(conEdtThrIso)             delete 0 end
+    $widgetsContours(conEdtThrSnakeIso)        delete 0 end
+    $widgetsContours(conEdtIterSnakeIso)       delete 0 end
+    $widgetsContours(conEdtCoefExternSnakeIso) delete 0 end
+    $widgetsContours(conEdtIterSnakeDer)       delete 0 end
+    $widgetsContours(conEdtCoefGradSnakeDer)   delete 0 end
+    $widgetsContours(conEdtCoefBallonSnakeDer) delete 0 end
+    $widgetsContours(conEdtSigmaSnakeDer)      delete 0 end
+
+    $widgetsGeneral(genWork02)   insert 0 $arr(e_installation_directory)
+    $widgetsGeneral(genImages02) insert 0 $arr(e_dicom_images_directory)
+
+    $widgetsAxes(axVoxelX02)      insert 0 $arr(e_voxel_x_dimension)
+    $widgetsAxes(axVoxelY02)      insert 0 $arr(e_voxel_y_dimension)
+    $widgetsAxes(axVoxelZ02)      insert 0 $arr(e_voxel_z_dimension)
+    $widgetsAxes(axAxisStep02)    insert 0 [ change_float_precision $arr(e_axis_discret_step) 2 ]
+    $widgetsAxes(axTension02)     insert 0 [ change_float_precision $arr(e_tension_coeficient) 2 ]
+    $widgetsAxes(axDistCDG02)     insert 0 [ change_float_precision $arr(e_gravity_distance) 2 ]
+    $widgetsAxes(axFlex02)        insert 0 [ change_float_precision $arr(e_flexion_coeficient) 2 ]
+    $widgetsAxes(axMaskSize02)    insert 0 [ change_float_precision $arr(e_mask_size) 2 ]
+
+    $widgetsAxes(axStep02) configure -text [ change_float_precision $arr(e_step) 2 ]
+    $widgetsAxes(axROIDim02) configure -text [ change_float_precision $arr(e_roi_dimension) 2 ]
+    $widgetsAxes(axMassPower02) configure -text [ change_float_precision $arr(e_mass_power) 2 ]
+    $widgetsAxes(axPas02) configure -text [ change_float_precision $arr(e_step_coeficient) 2 ]
+    $widgetsAxes(axCell02) configure -text [ change_float_precision $arr(e_cell_coeficient) 2 ]
+    $widgetsAxes(axDistInt02) configure -text [ change_float_precision $arr(e_distance_to_maximum_intensity) 2 ]
+    $widgetsAxes(axCoefCellMax02) configure -text $arr(e_coef_cell_max_int)
+
+    $widgetsContours(conEdtScale)              insert 0 [ change_float_precision $arr(e_scale) 2 ]
+    $widgetsContours(conEdtSample)             insert 0 [ change_float_precision $arr(e_sampling) 2 ]
+    $widgetsContours(conEdtThrIso)             insert 0 [ change_float_precision $arr(e_threshold_isocontour) 2 ]
+    $widgetsContours(conEdtThrSnakeIso)        insert 0 [ change_float_precision $arr(e_threshold_snake_isocontour) 2 ]
+    $widgetsContours(conEdtIterSnakeIso)       insert 0 [ change_float_precision $arr(e_number_of_iterations_snake_isocontour) 2 ]
+    $widgetsContours(conEdtCoefExternSnakeIso) insert 0 [ change_float_precision $arr(e_extern_coeficient) 2 ]
+    $widgetsContours(conEdtIterSnakeDer)       insert 0 [ change_float_precision $arr(e_number_of_iterations_snake_deriche) 2 ]
+    $widgetsContours(conEdtCoefGradSnakeDer)   insert 0 [ change_float_precision $arr(e_gradient_coeficient) 2 ]
+    $widgetsContours(conEdtCoefBallonSnakeDer) insert 0 [ change_float_precision $arr(e_ballon_coeficient) 2 ]
+    $widgetsContours(conEdtSigmaSnakeDer)      insert 0 [ change_float_precision $arr(e_sigma) 2 ]
+    
+    $widgetsAxes(axBtnMinVoxel) deselect
+    $widgetsAxes(axBtnNorVoxel) deselect
+    if { $arr(e_voxel_type) == 1 } { $widgetsAxes(axBtnMinVoxel) invoke }
+    if { $arr(e_voxel_type) == 2 } { $widgetsAxes(axBtnNorVoxel) invoke }
+
+    $widgetsGeneral(genBtnWndVis) deselect
+    $widgetsGeneral(genBtnConVis) deselect
+    $widgetsGeneral(genBtnMIPDef) deselect
+    $widgetsGeneral(genBtnAllSlc) deselect
+    set gen_debug 0
+    if { $arr(e_calculate_mip_default)     == 1 } { $widgetsGeneral(genBtnMIPDef) invoke }
+    if { $arr(e_choose_all_slices_default) == 1 } { $widgetsGeneral(genBtnAllSlc) invoke }
+    if { $arr(e_debug_window_visible)      == 1 } { $widgetsGeneral(genBtnWndVis) invoke }
+    if { $arr(e_debug_console_visible)     == 1 } { $widgetsGeneral(genBtnConVis) invoke }
+
+    set alg_type $arr(e_algorithm_type)
+    if { $alg_type == 1 } { $widgetsContours(conBtnIso)      invoke }
+    if { $alg_type == 2 } { $widgetsContours(conBtnSnakeIso) invoke }
+    if { $alg_type == 3 } { $widgetsContours(conBtnSnakeDer) invoke }
+
+    $widgetsContours(conBtnIsoconturs)   deselect
+    $widgetsContours(conBtnDiameters)    deselect
+    $widgetsContours(conBtnFillContours) deselect
+    set con_debug 0
+    if { $arr(e_debug_isocontour) == 1 } { $widgetsContours(conBtnIsoconturs)   invoke }
+    if { $arr(e_debug_diameters)  == 1 } { $widgetsContours(conBtnDiameters)    invoke }
+    if { $arr(e_debug_fill_area)  == 1 } { $widgetsContours(conBtnFillContours) invoke }
+
+#    $widgetsGeneral(genBtnColor) configure -background $arr(e_back_color_3D)
+
+#    $widgetsAxes(axBtnColor) configure -background $arr(e_axis_color)
+    
+    $widgetsQuantification(quantBtnAreaM)    deselect; $widgetsQuantification(quantBtnAreaS)    configure -state disabled
+    $widgetsQuantification(quantBtnPeriM)    deselect; $widgetsQuantification(quantBtnPeriS)    configure -state disabled
+    $widgetsQuantification(quantBtnDiaAreaM) deselect; $widgetsQuantification(quantBtnDiaAreaS) configure -state disabled
+    $widgetsQuantification(quantBtnDiaPeriM) deselect; $widgetsQuantification(quantBtnDiaPeriS) configure -state disabled
+    $widgetsQuantification(quantBtnDiaMinM)  deselect; $widgetsQuantification(quantBtnDiaMinS)  configure -state disabled
+    $widgetsQuantification(quantBtnDiaMaxM)  deselect; $widgetsQuantification(quantBtnDiaMaxS)  configure -state disabled
+    $widgetsQuantification(quantBtnDiaAvgM)  deselect; $widgetsQuantification(quantBtnDiaAvgS)  configure -state disabled
+    set quant_type 0
+    if { ( $arr(e_quantification_type) & 0x01 ) == 0x01 } { $widgetsQuantification(quantBtnAreaM)    invoke }
+    if { ( $arr(e_quantification_type) & 0x02 ) == 0x02 } { $widgetsQuantification(quantBtnPeriM)    invoke }
+    if { ( $arr(e_quantification_type) & 0x04 ) == 0x04 } { $widgetsQuantification(quantBtnDiaAreaM) invoke }
+    if { ( $arr(e_quantification_type) & 0x08 ) == 0x08 } { $widgetsQuantification(quantBtnDiaPeriM) invoke }
+    if { ( $arr(e_quantification_type) & 0x10 ) == 0x10 } { $widgetsQuantification(quantBtnDiaMinM)  invoke }
+    if { ( $arr(e_quantification_type) & 0x20 ) == 0x20 } { $widgetsQuantification(quantBtnDiaMaxM)  invoke }
+    if { ( $arr(e_quantification_type) & 0x40 ) == 0x40 } { $widgetsQuantification(quantBtnDiaAvgM)  invoke }
+
+    $widgetsQuantification(quantBtnAreaS)    deselect
+    $widgetsQuantification(quantBtnPeriS)    deselect
+    $widgetsQuantification(quantBtnDiaAreaS) deselect
+    $widgetsQuantification(quantBtnDiaPeriS) deselect
+    $widgetsQuantification(quantBtnDiaMinS)  deselect
+    $widgetsQuantification(quantBtnDiaMaxS)  deselect
+    $widgetsQuantification(quantBtnDiaAvgS)  deselect
+    set stenosis_type 0
+    if { $arr(e_stenosis_type) == 1 } { $widgetsQuantification(quantBtnAreaS)    invoke }
+    if { $arr(e_stenosis_type) == 2 } { $widgetsQuantification(quantBtnPeriS)    invoke }
+    if { $arr(e_stenosis_type) == 3 } { $widgetsQuantification(quantBtnDiaAreaS) invoke }
+    if { $arr(e_stenosis_type) == 4 } { $widgetsQuantification(quantBtnDiaPeriS) invoke }
+    if { $arr(e_stenosis_type) == 5 } { $widgetsQuantification(quantBtnDiaMaxS)  invoke }
+    if { $arr(e_stenosis_type) == 6 } { $widgetsQuantification(quantBtnDiaMinS)  invoke }
+    if { $arr(e_stenosis_type) == 7 } { $widgetsQuantification(quantBtnDiaAvgS)  invoke }
+
+}
+
+proc dlg_params::cb_show_general { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    dlg_params::p_hide_general
+    dlg_params::p_hide_axis
+    dlg_params::p_hide_contour
+    dlg_params::p_hide_quant
+
+    pack  $widgets(general)                -anchor center -expand 1 -fill both -side top 
+    place $widgetsGeneral(genDataPaths)    -x 10 -y 25 -width 415 -height 110 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genWork)         -x 15 -y 20 -width 320 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsGeneral(genWork01)       -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsGeneral(genWork02)       -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsGeneral(genImages)       -x 15 -y 60 -width 320 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsGeneral(genImages01)     -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsGeneral(genImages02)     -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsGeneral(genBtnBrwWork)   -x 340 -y 20 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genBtnBrwImages) -x 340 -y 60 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genDebug)        -x 10 -y 145 -width 415 -height 130 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genBtnWndVis)    -x 5 -y 5 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genBtnConVis)    -x 5 -y 35 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genBtnMIPDef)    -x 5 -y 65 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genBtnAllSlc)    -x 5 -y 95 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genBtnColor)     -x 215 -y 50 -width 185 -height 28 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genlbl009)       -x 215 -y 30 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genlbl001)       -x 15 -y 15 -anchor nw -bordermode ignore 
+    place $widgetsGeneral(genlbl078)       -x 15 -y 135 -anchor nw -bordermode ignore 
+    pack  $widgets(buttons)                -anchor center -expand 0 -fill x -side top 
+    place $widgets(btnOk)                  -x 155 -y 10 -anchor nw -bordermode ignore 
+    place $widgets(btnCancel)              -x 235 -y 10 -anchor nw -bordermode ignore 
+
+}
+
+proc dlg_params::cb_show_axis { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    dlg_params::p_hide_general
+    dlg_params::p_hide_axis
+    dlg_params::p_hide_contour
+    dlg_params::p_hide_quant
+
+    pack  $widgets(axis)                -anchor center -expand 1 -fill both -side top 
+    place $widgetsAxes(axDistCDG)       -x 25 -y 35 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axDistCDG01)     -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axDistCDG02)     -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axCell)          -x 25 -y 65 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axCell01)        -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axCell02)        -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axFlex)          -x 25 -y 95 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axFlex01)        -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axFlex02)        -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axMaskSize)      -x 25 -y 125 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axMaskSize01)    -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axMaskSize02)    -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axDistInt)       -x 195 -y 35 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axDistInt01)     -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axDistInt02)     -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axMassPower)     -x 195 -y 125 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axMassPower01)   -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axMassPower02)   -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axTension)       -x 195 -y 95 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axTension01)     -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axTension02)     -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axPas)           -x 195 -y 65 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axPas01)         -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axPas02)         -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axROIDim)        -x 25 -y 160 -width 115 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axROIDim01)      -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axROIDim02)      -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axStep)          -x 165 -y 160 -width 115 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axStep01)        -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axStep02)        -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axAxisStep)      -x 305 -y 160 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axAxisStep01)    -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axAxisStep02)    -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axVoxelX)        -x 25 -y 190 -width 115 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axVoxelX01)      -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axVoxelX02)      -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axVoxelY)        -x 165 -y 190 -width 115 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axVoxelY01)      -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axVoxelY02)      -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axVoxelZ)        -x 305 -y 190 -width 115 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axVoxelZ01)      -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axVoxelZ02)      -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axBtnColor)      -x 180 -y 245 -width 180 -height 28 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axlblColor)      -x 175 -y 225 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axBtnMinVoxel)   -x 30 -y 220 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axBtnNorVoxel)   -x 30 -y 240 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axCoefCellMax)   -x 350 -y 35 -width 145 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsAxes(axCoefCellMax01) -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsAxes(axCoefCellMax02) -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsAxes(axFrDebug)       -x 375 -y 230 -width 135 -height 55 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axBtnShowCell)   -x 5 -y 5 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axBtnShowICell)  -x 5 -y 25 -anchor nw -bordermode ignore 
+    place $widgetsAxes(axLblDebug)      -x 380 -y 220 -anchor nw -bordermode ignore 
+    pack  $widgets(buttons)             -anchor center -expand 0 -fill x -side top 
+    place $widgets(btnOk)               -x 155 -y 10 -anchor nw -bordermode ignore 
+    place $widgets(btnCancel)           -x 235 -y 10 -anchor nw -bordermode ignore 
+
+}
+
+proc dlg_params::cb_show_contour { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    dlg_params::p_hide_general
+    dlg_params::p_hide_axis
+    dlg_params::p_hide_contour
+    dlg_params::p_hide_quant
+
+    pack  $widgets(contour)                           -anchor center -expand 1 -fill both -side top 
+    place $widgetsContours(conFrSlice)               -x 10 -y 20 -width 160 -height 80 -anchor nw -bordermode ignore 
+    place $widgetsContours(conFrDebug)               -x 10 -y 110 -width 160 -height 80 -anchor nw -bordermode ignore 
+    place $widgetsContours(conFrIso)                 -x 175 -y 40 -width 250 -height 35 -anchor nw -bordermode ignore 
+    place $widgetsContours(conFrSnakeIso)            -x 175 -y 105 -width 250 -height 85 -anchor nw -bordermode ignore 
+    place $widgetsContours(conFrSnakeDer)            -x 10 -y 220 -width 415 -height 60 -anchor nw -bordermode ignore 
+    place $widgetsContours(conBtnIso)                -x 170 -y 15 -anchor nw -bordermode ignore 
+    place $widgetsContours(conBtnSnakeIso)           -x 170 -y 80 -anchor nw -bordermode ignore 
+    place $widgetsContours(conBtnSnakeDer)           -x 170 -y 195 -anchor nw -bordermode ignore 
+    place $widgetsContours(conLbl001)                -x 15 -y 10 -anchor nw -bordermode ignore 
+    place $widgetsContours(conLbl002)                -x 15 -y 100 -anchor nw -bordermode ignore 
+    place $widgetsContours(conFrScale)               -x 10 -y 15 -width 135 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblScale)              -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtScale)              -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrSample)              -x 10 -y 45 -width 135 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblSample)             -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtSample)             -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conBtnIsoconturs)         -x 20 -y 10 -anchor nw -bordermode ignore 
+    place $widgetsContours(conBtnDiameters)          -x 20 -y 30 -anchor nw -bordermode ignore 
+    place $widgetsContours(conBtnFillContours)       -x 20 -y 50 -anchor nw -bordermode ignore 
+    place $widgetsContours(conFrThrIso)              -x 5 -y 5 -width 240 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblThrIso)             -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtThrIso)             -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrThrSnakeIso)         -x 5 -y 5 -width 240 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblThrSnakeIso)        -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtThrSnakeIso)        -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrIterSnakeIso)        -x 5 -y 30 -width 240 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblIterSnakeIso)       -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtIterSnakeIso)       -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrCoefExternSnakeIso)  -x 5 -y 55 -width 240 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblCoefExternSnakeIso) -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtCoefExternSnakeIso) -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrIterSnakeDer)        -x 5 -y 5 -width 240 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblIterSnakeDer)       -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtIterSnakeDer)       -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrCoefGradSnakeDer)    -x 5 -y 30 -width 240 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblCoefGradSnakeDer)   -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtCoefGradSnakeDer)   -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrCoefBallonSnakeDer)  -x 245 -y 5 -width 165 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblCoefBallonSnakeDer) -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtCoefBallonSnakeDer) -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $widgetsContours(conFrSigmaSnakeDer)       -x 245 -y 30 -width 165 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgetsContours(conLblSigmaSnakeDer)      -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgetsContours(conEdtSigmaSnakeDer)      -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    pack  $widgets(buttons)                           -anchor center -expand 0 -fill x -side top 
+    place $widgets(btnOk)                             -x 155 -y 10 -anchor nw -bordermode ignore 
+    place $widgets(btnCancel)                         -x 235 -y 10 -anchor nw -bordermode ignore 
+
+}
+
+proc dlg_params::cb_show_quant { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    dlg_params::p_hide_general
+    dlg_params::p_hide_axis
+    dlg_params::p_hide_contour
+    dlg_params::p_hide_quant
+
+    pack  $widgets(quantification)                 -anchor center -expand 1 -fill both -side top 
+    place $widgetsQuantification(quantMeasures)    -x 15 -y 60 -width 185 -height 170 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnAreaM)    -x 5 -y 10 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnPeriM)    -x 5 -y 30 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaAreaM) -x 5 -y 50 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaPeriM) -x 5 -y 70 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaMinM)  -x 5 -y 90 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaMaxM)  -x 5 -y 110 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaAvgM)  -x 5 -y 130 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantStenosis)    -x 220 -y 60 -width 190 -height 170 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnAreaS)    -x 5 -y 10 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnPeriS)    -x 5 -y 30 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaAreaS) -x 5 -y 50 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaPeriS) -x 5 -y 70 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaMinS)  -x 5 -y 90 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaMaxS)  -x 5 -y 110 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantBtnDiaAvgS)  -x 5 -y 130 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantlbl22)       -x 20 -y 50 -anchor nw -bordermode ignore 
+    place $widgetsQuantification(quantlbl23)       -x 225 -y 50 -anchor nw -bordermode ignore 
+    pack  $widgets(buttons)                        -anchor center -expand 0 -fill x -side top 
+    place $widgets(btnOk)                          -x 155 -y 10 -anchor nw -bordermode ignore 
+    place $widgets(btnCancel)                      -x 235 -y 10 -anchor nw -bordermode ignore 
+
+}
+
+proc dlg_params::p_hide_general { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    place forget $widgets(btnCancel)
+    place forget $widgets(btnOk)
+    pack  forget $widgets(buttons)
+    place forget $widgetsGeneral(genlbl078)
+    place forget $widgetsGeneral(genlbl001)
+    place forget $widgetsGeneral(genlbl009)
+    place forget $widgetsGeneral(genBtnColor)
+    place forget $widgetsGeneral(genBtnAllSlc)
+    place forget $widgetsGeneral(genBtnMIPDef)
+    place forget $widgetsGeneral(genBtnConVis)
+    place forget $widgetsGeneral(genBtnWndVis)
+    place forget $widgetsGeneral(genDebug)
+    place forget $widgetsGeneral(genBtnBrwImages)
+    place forget $widgetsGeneral(genBtnBrwWork)
+    pack  forget $widgetsGeneral(genImages02)
+    pack  forget $widgetsGeneral(genImages01)
+    place forget $widgetsGeneral(genImages)
+    pack  forget $widgetsGeneral(genWork02)
+    pack  forget $widgetsGeneral(genWork01)
+    place forget $widgetsGeneral(genWork)
+    place forget $widgetsGeneral(genDataPaths)
+    pack  forget $widgets(general)
+
+}
+
+proc dlg_params::p_hide_axis { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    place forget $widgets(btnCancel)
+    place forget $widgets(btnOk)
+    pack  forget $widgets(buttons)
+    place forget $widgetsAxes(axBtnNorVoxel)
+    place forget $widgetsAxes(axBtnMinVoxel)
+    place forget $widgetsAxes(axlblColor)
+    place forget $widgetsAxes(axBtnColor)
+    pack  forget $widgetsAxes(axVoxelZ02)
+    pack  forget $widgetsAxes(axVoxelZ01)
+    place forget $widgetsAxes(axVoxelZ)
+    pack  forget $widgetsAxes(axVoxelY02)
+    pack  forget $widgetsAxes(axVoxelY01)
+    place forget $widgetsAxes(axVoxelY)
+    pack  forget $widgetsAxes(axVoxelX02)
+    pack  forget $widgetsAxes(axVoxelX01)
+    place forget $widgetsAxes(axVoxelX)
+    pack  forget $widgetsAxes(axAxisStep02)
+    pack  forget $widgetsAxes(axAxisStep01)
+    place forget $widgetsAxes(axAxisStep)
+    pack  forget $widgetsAxes(axStep02)
+    pack  forget $widgetsAxes(axStep01)
+    place forget $widgetsAxes(axStep)
+    pack  forget $widgetsAxes(axROIDim02)
+    pack  forget $widgetsAxes(axROIDim01)
+    place forget $widgetsAxes(axROIDim)
+    pack  forget $widgetsAxes(axPas02)
+    pack  forget $widgetsAxes(axPas01)
+    place forget $widgetsAxes(axPas)
+    pack  forget $widgetsAxes(axTension02)
+    pack  forget $widgetsAxes(axTension01)
+    place forget $widgetsAxes(axTension)
+    pack  forget $widgetsAxes(axMassPower02)
+    pack  forget $widgetsAxes(axMassPower01)
+    place forget $widgetsAxes(axMassPower)
+    pack  forget $widgetsAxes(axDistInt02)
+    pack  forget $widgetsAxes(axDistInt01)
+    place forget $widgetsAxes(axDistInt)
+    pack  forget $widgetsAxes(axMaskSize02)
+    pack  forget $widgetsAxes(axMaskSize01)
+    place forget $widgetsAxes(axMaskSize)
+    pack  forget $widgetsAxes(axFlex02)
+    pack  forget $widgetsAxes(axFlex01)
+    place forget $widgetsAxes(axFlex)
+    pack  forget $widgetsAxes(axCell02)
+    pack  forget $widgetsAxes(axCell01)
+    place forget $widgetsAxes(axCell)
+    pack  forget $widgetsAxes(axDistCDG02)
+    pack  forget $widgetsAxes(axDistCDG01)
+    place forget $widgetsAxes(axDistCDG)
+    pack  forget $widgets(axis)
+
+}
+
+proc dlg_params::p_hide_contour { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    place forget $widgets(btnCancel)
+    place forget $widgets(btnOk)
+    pack  forget $widgets(buttons)
+    pack  forget $widgetsContours(conEdtSigmaSnakeDer)
+    pack  forget $widgetsContours(conLblSigmaSnakeDer)
+    place forget $widgetsContours(conFrSigmaSnakeDer)
+    pack  forget $widgetsContours(conEdtCoefBallonSnakeDer)
+    pack  forget $widgetsContours(conLblCoefBallonSnakeDer)
+    place forget $widgetsContours(conFrCoefBallonSnakeDer)
+    pack  forget $widgetsContours(conEdtCoefGradSnakeDer)
+    pack  forget $widgetsContours(conLblCoefGradSnakeDer)
+    place forget $widgetsContours(conFrCoefGradSnakeDer)
+    pack  forget $widgetsContours(conEdtIterSnakeDer)
+    pack  forget $widgetsContours(conLblIterSnakeDer)
+    place forget $widgetsContours(conFrIterSnakeDer)
+    pack  forget $widgetsContours(conEdtCoefExternSnakeIso)
+    pack  forget $widgetsContours(conLblCoefExternSnakeIso)
+    place forget $widgetsContours(conFrCoefExternSnakeIso)
+    pack  forget $widgetsContours(conEdtIterSnakeIso)
+    pack  forget $widgetsContours(conLblIterSnakeIso)
+    place forget $widgetsContours(conFrIterSnakeIso)
+    pack  forget $widgetsContours(conEdtThrSnakeIso)
+    pack  forget $widgetsContours(conLblThrSnakeIso)
+    place forget $widgetsContours(conFrThrSnakeIso)
+    pack  forget $widgetsContours(conEdtThrIso)
+    pack  forget $widgetsContours(conLblThrIso)
+    place forget $widgetsContours(conFrThrIso)
+    place forget $widgetsContours(conBtnFillContours)
+    place forget $widgetsContours(conBtnDiameters)
+    place forget $widgetsContours(conBtnIsoconturs)
+    pack  forget $widgetsContours(conEdtSample)
+    pack  forget $widgetsContours(conLblSample)
+    place forget $widgetsContours(conFrSample)
+    pack  forget $widgetsContours(conEdtScale)
+    pack  forget $widgetsContours(conLblScale)
+    place forget $widgetsContours(conFrScale)
+    place forget $widgetsContours(conLbl002)
+    place forget $widgetsContours(conLbl001)
+    place forget $widgetsContours(conBtnSnakeDer)
+    place forget $widgetsContours(conBtnSnakeIso)
+    place forget $widgetsContours(conBtnIso)
+    place forget $widgetsContours(conFrSnakeDer)
+    place forget $widgetsContours(conFrSnakeIso)
+    place forget $widgetsContours(conFrIso)
+    place forget $widgetsContours(conFrDebug)
+    place forget $widgetsContours(conFrSlice)
+    pack  forget $widgets(contour)
+
+}
+
+proc dlg_params::p_hide_quant { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    place forget $widgets(btnCancel)
+    place forget $widgets(btnOk)
+    pack  forget $widgets(buttons)
+    place forget $widgetsQuantification(quantlbl23)
+    place forget $widgetsQuantification(quantlbl22)
+    place forget $widgetsQuantification(quantBtnDiaAvgS)
+    place forget $widgetsQuantification(quantBtnDiaMaxS)
+    place forget $widgetsQuantification(quantBtnDiaMinS)
+    place forget $widgetsQuantification(quantBtnDiaPeriS)
+    place forget $widgetsQuantification(quantBtnDiaAreaS)
+    place forget $widgetsQuantification(quantBtnPeriS)
+    place forget $widgetsQuantification(quantBtnAreaS)
+    place forget $widgetsQuantification(quantStenosis)
+    place forget $widgetsQuantification(quantBtnDiaAvgM)
+    place forget $widgetsQuantification(quantBtnDiaMaxM)
+    place forget $widgetsQuantification(quantBtnDiaMinM)
+    place forget $widgetsQuantification(quantBtnDiaPeriM)
+    place forget $widgetsQuantification(quantBtnDiaAreaM)
+    place forget $widgetsQuantification(quantBtnPeriM)
+    place forget $widgetsQuantification(quantBtnAreaM)
+    place forget $widgetsQuantification(quantMeasures)
+    pack  forget $widgets(quantification)
+
+}
+
+proc dlg_params::cancel_params { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set params_to_save [ array get arr ]
+    destroy $widgets(base)
+
+}
+
+proc dlg_params::save_params { } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+    upvar dlg_params::voxel_typ             voxel_typ
+
+    array set arr $params_to_save
+
+    set arr(e_installation_directory)         [ $widgetsGeneral(genWork02)   get ]
+    set arr(e_dicom_images_directory)        [ $widgetsGeneral(genImages02) get ]
+
+    set arr(e_voxel_x_dimension)             [ $widgetsAxes(axVoxelX02)    get ]
+    set arr(e_voxel_y_dimension)             [ $widgetsAxes(axVoxelY02)    get ]
+    set arr(e_voxel_z_dimension)             [ $widgetsAxes(axVoxelZ02)    get ]
+    #set arr(e_step)                          [ $widgetsAxes(axStep02)      get ]
+    set arr(e_axis_discret_step)             [ $widgetsAxes(axAxisStep02)  get ]
+    #set arr(e_roi_dimension)                 [ $widgetsAxes(axROIDim02)    get ]
+    #set arr(e_mass_power)                    [ $widgetsAxes(axMassPower02) get ]
+    set arr(e_tension_coeficient)            [ $widgetsAxes(axTension02)   get ]
+    #set arr(e_step_coeficient)               [ $widgetsAxes(axPas02)       get ]
+    set arr(e_gravity_distance)              [ $widgetsAxes(axDistCDG02)   get ]
+    #set arr(e_cell_coeficient)               [ $widgetsAxes(axCell02)      get ]
+    set arr(e_flexion_coeficient)            [ $widgetsAxes(axFlex02)      get ]
+    set arr(e_mask_size)                     [ $widgetsAxes(axMaskSize02)  get ]
+    #set arr(e_distance_to_maximum_intensity) [ $widgetsAxes(axDistInt02)   get ]
+    #set arr(e_coef_cell_max_int)             [ $widgetsAxes(axCoefCellMax02) get ]
+
+    set arr(e_scale)                                 [ $widgetsContours(conEdtScale)              get ]
+    set arr(e_sampling)                              [ $widgetsContours(conEdtSample)             get ]
+    set arr(e_threshold_isocontour)                  [ $widgetsContours(conEdtThrIso)             get ]
+    set arr(e_threshold_snake_isocontour)            [ $widgetsContours(conEdtThrSnakeIso)        get ]
+    set arr(e_number_of_iterations_snake_isocontour) [ $widgetsContours(conEdtIterSnakeIso)       get ]
+    set arr(e_extern_coeficient)                     [ $widgetsContours(conEdtCoefExternSnakeIso) get ]
+    set arr(e_number_of_iterations_snake_deriche)    [ $widgetsContours(conEdtIterSnakeDer)       get ]
+    set arr(e_gradient_coeficient)                   [ $widgetsContours(conEdtCoefGradSnakeDer)   get ]
+    set arr(e_ballon_coeficient)                     [ $widgetsContours(conEdtCoefBallonSnakeDer) get ]
+    set arr(e_sigma)                                 [ $widgetsContours(conEdtSigmaSnakeDer)      get ]
+
+    set arr(e_voxel_type) $voxel_typ
+
+    set arr(e_debug_window_visible)      [ expr ( ( $gen_debug & 0x01 ) == 0x01 ) ]
+    set arr(e_debug_console_visible)     [ expr ( ( $gen_debug & 0x02 ) == 0x02 ) ]
+    set arr(e_calculate_mip_default)     [ expr ( ( $gen_debug & 0x04 ) == 0x04 ) ]
+    set arr(e_choose_all_slices_default) [ expr ( ( $gen_debug & 0x08 ) == 0x08 ) ]
+
+    set arr(e_algorithm_type)    $alg_type
+    set arr(e_debug_isocontour) [ expr ( ( $con_debug & 0x01 ) == 0x01 ) ]
+    set arr(e_debug_diameters)  [ expr ( ( $con_debug & 0x02 ) == 0x02 ) ]
+    set arr(e_debug_fill_area)  [ expr ( ( $con_debug & 0x04 ) == 0x04 ) ]
+
+#    set arr(e_back_color_3D) [ $widgetsGeneral(genBtnColor) cget -background ]
+
+#    set arr(e_axis_color)    [ $widgetsAxes(axBtnColor)  cget -background ]
+
+    set arr(e_quantification_type) $quant_type
+    set arr(e_stenosis_type)       $stenosis_type
+
+    set params_to_save [ array get arr ]
+    destroy $widgets(base)
+
+}
+
+proc dlg_params::cb_browse_path { entry_widget } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set nDir [ tk_chooseDirectory \
+                    -initialdir [ $entry_widget get ] \
+                    -parent $widgets(base) \
+                    -title "$string_table::str_chooseadirectory" \
+                    -mustexist true \
+    ]
+    if { $nDir != "" } {
+
+        $entry_widget delete 0 end
+        $entry_widget insert 0 $nDir
+
+    }
+
+}
+
+proc dlg_params::cb_gen_debug { value mask } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set gen_debug [ expr ( $value == 1 )? \
+                         ( $gen_debug | $mask ): \
+                         ( $gen_debug & ( ~$mask ) ) \
+    ]
+
+}
+
+proc dlg_params::cb_con_debug { value mask } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set con_debug [ expr ( $value == 1 )? \
+                         ( $con_debug | $mask ): \
+                         ( $con_debug & ( ~$mask ) ) \
+    ]
+
+}
+
+proc dlg_params::cb_quant_type { value mask partner } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set quant_type [ expr ( $value == 1 )? \
+                          ( $quant_type | $mask ): \
+                          ( $quant_type & ( ~$mask ) ) \
+    ]
+    set partner2 ""
+    if { [ string compare $partner "quantBtnAreaS"    ] == 0 } { set partner2 $widgetsQuantification(quantBtnAreaS) }
+    if { [ string compare $partner "quantBtnPeriS"    ] == 0 } { set partner2 $widgetsQuantification(quantBtnPeriS) }
+    if { [ string compare $partner "quantBtnDiaAreaS" ] == 0 } { set partner2 $widgetsQuantification(quantBtnDiaAreaS) }
+    if { [ string compare $partner "quantBtnDiaPeriS" ] == 0 } { set partner2 $widgetsQuantification(quantBtnDiaPeriS) }
+    if { [ string compare $partner "quantBtnDiaMinS"  ] == 0 } { set partner2 $widgetsQuantification(quantBtnDiaMinS) }
+    if { [ string compare $partner "quantBtnDiaMaxS"  ] == 0 } { set partner2 $widgetsQuantification(quantBtnDiaMaxS) }
+    if { [ string compare $partner "quantBtnDiaAvgS"  ] == 0 } { set partner2 $widgetsQuantification(quantBtnDiaAvgS) }
+
+    if { $value == 1 } { $partner2 configure -state normal }
+    if { $value == 0 } { $partner2 configure -state disabled }
+
+}
+
+proc dlg_params::cb_choose_color { button_chooser } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set col [ $button_chooser cget -background ]
+    set col [ \
+        tk_chooseColor \
+            -initialcolor $col \
+            -parent $button_chooser \
+            -title "Choose a color..."
+    ]
+    if { $col != "" } { $button_chooser configure -background $col }
+
+}
+
+proc dlg_params::set_alg_type { v_alg_type } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set alg_type $v_alg_type
+
+}
+
+proc dlg_params::set_stenosis_type { v_stenosis_type } {
+
+    # For programming facilities
+    upvar dlg_params::widgets               widgets
+    upvar dlg_params::widgetsGeneral        widgetsGeneral
+    upvar dlg_params::widgetsAxes           widgetsAxes
+    upvar dlg_params::widgetsContours       widgetsContours
+    upvar dlg_params::widgetsQuantification widgetsQuantification
+    upvar dlg_params::gen_debug             gen_debug
+    upvar dlg_params::con_debug             con_debug
+    upvar dlg_params::quant_type            quant_type
+    upvar dlg_params::alg_type              alg_type
+    upvar dlg_params::stenosis_type         stenosis_type
+    upvar dlg_params::params_to_save        params_to_save
+
+    set stenosis_type $v_stenosis_type
+
+}
+
+# EOF -- dlg_params.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/global_window.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/global_window.tcl
new file mode 100644 (file)
index 0000000..9fc6184
--- /dev/null
@@ -0,0 +1,900 @@
+namespace eval global_window {
+
+    # public interface
+    namespace export \
+        show \
+        active_controls \
+        show_params  \
+        en_quant     \
+        en_planes    \
+        en_3D        \
+        en_subtract  \
+        en_ibrw      \
+        en_params    \
+        en_save      \
+        en_load      \
+        en_open      \
+        en_help      \
+        en_rotate    \
+        en_bright    \
+        en_pan       \
+        en_zoom      \
+        en_clear     \
+        en_intensity \
+        en_linear    \
+        en_area      \
+        en_back      \
+        en_excel     \
+        en_wizard    \
+        im1         \
+        im2
+    
+    # variables
+    variable widgets
+
+    # Loaded button images
+    variable images
+
+       # Parameters dialog visible?
+    variable show_params -1
+
+       # Button enable/disable values
+    variable en_quant     0x000001
+    variable en_planes    0x000002
+    variable en_3D        0x000004
+    variable en_subtract  0x000008
+    variable en_ibrw      0x000010
+    variable en_params    0x000020
+    variable en_save      0x000040
+    variable en_load      0x000080
+    variable en_open      0x000100
+    variable en_help      0x000200
+    variable en_rotate    0x000400
+    variable en_bright    0x000800
+    variable en_pan       0x001000
+    variable en_zoom      0x002000
+    variable en_clear     0x004000
+    variable en_intensity 0x008000
+    variable en_linear    0x010000
+    variable en_area      0x020000
+    variable en_back      0x040000
+    variable en_excel     0x080000
+    variable en_wizard    0x100000
+
+       # Windows id values
+    variable sh_none    0x01
+    variable sh_data    0x02
+    variable sh_ibrw    0x04
+    variable sh_3D_mpr  0x08
+    variable sh_3D_mip  0x10
+    variable sh_3D_sur  0x20
+    variable sh_3D_qua  0x40
+
+    variable window_shown
+
+}
+
+proc global_window::reset { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    set widgets(base)              "."
+    set widgets(toolBar)           ".frToolBar"
+    set widgets(toolsAllData)      ".frToolBar.frTAllData"
+    set widgets(toolsData)         ".frToolBar.frTData"
+    set widgets(toolsState)        ".frToolBar.frState"
+    set widgets(toolsMouse)        ".frToolBar.frMouse"
+    set widgets(toolsProfil)       ".frToolBar.frProfil"
+    set widgets(toolsHelp)         ".frToolBar.frHelp"
+    set widgets(work)              ".frWork"
+    set widgets(btnChooseDataPath) ".frToolBar.frTAllData.btnChooseDataPath"
+    set widgets(btnLoadExperiment) ".frToolBar.frTAllData.btnLoadExperiment"
+    set widgets(btnSaveExperiment) ".frToolBar.frTAllData.btnSaveExperiment"
+    set widgets(btnSaveExcel)      ".frToolBar.frTAllData.btnSaveExcel"
+    set widgets(btnParam)          ".frToolBar.frTAllData.btnParam"
+    set widgets(btnWizard)         ".frToolBar.frTAllData.btnWizard"
+    set widgets(btnIbrw)           ".frToolBar.frTData.btnIbrw"
+    set widgets(btnSubtract)       ".frToolBar.frTData.btnSubtract"
+    set widgets(btnBack)           ".frToolBar.frState.btnBack"
+    set widgets(btn3D)             ".frToolBar.frState.btn3D"
+    set widgets(btnPlanes)         ".frToolBar.frState.btnPlanes"
+    set widgets(btnQuant)          ".frToolBar.frState.btnQuant"
+    set widgets(btnRotate)         ".frToolBar.frMouse.btnRotate"
+    set widgets(btnBright)         ".frToolBar.frMouse.btnBright"
+    set widgets(btnPan)            ".frToolBar.frMouse.btnPan"
+    set widgets(btnZoom)           ".frToolBar.frMouse.btnZoom"
+    set widgets(btnClear)          ".frToolBar.frProfil.btnClear"
+    set widgets(btnIntensity)      ".frToolBar.frProfil.btnIntensity"
+    set widgets(btnLinear)         ".frToolBar.frProfil.btnLinear"
+    set widgets(btnArea)           ".frToolBar.frProfil.btnArea"
+    set widgets(btnHelp)           ".frToolBar.frHelp.btnHelp"
+
+}
+
+proc global_window::show { imgpath } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+    upvar global_window::images            images
+    upvar global_window::im1               im1
+    upvar global_window::im2               im2
+    upvar global_window::data_loaded       data_loaded
+    upvar global_window::window_shown      window_shown
+
+    set data_loaded 0
+    set window_shown 0
+
+    # Images
+    set images(connect)      [ image create photo -file "$imgpath/connect.gif" ]
+    set images(loadexp)      [ image create photo -file "$imgpath/loadexp.gif" ]
+    set images(save)         [ image create photo -file "$imgpath/save.gif" ]
+    set images(excel)        [ image create photo -file "$imgpath/excel.gif" ]
+    set images(params)       [ image create photo -file "$imgpath/params.gif" ]
+    set images(wizard)       [ image create photo -file "$imgpath/wizard.gif" ]
+    set images(back)         [ image create photo -file "$imgpath/back.gif" ]
+    set images(imagebrowser) [ image create photo -file "$imgpath/imagebrowser.gif" ]
+    set images(subtract)     [ image create photo -file "$imgpath/subtract.gif" ]
+    set images(triD)         [ image create photo -file "$imgpath/3D.gif" ]
+    set images(plans)        [ image create photo -file "$imgpath/plans.gif" ]
+    set images(quant)        [ image create photo -file "$imgpath/quant.gif" ]
+    set images(rotate)       [ image create photo -file "$imgpath/rotate.gif" ]
+    set images(bright)       [ image create photo -file "$imgpath/bright.gif" ]
+    set images(pan)          [ image create photo -file "$imgpath/pan.gif" ]
+    set images(zoom)         [ image create photo -file "$imgpath/zoom.gif" ]
+    set images(clear)        [ image create photo -file "$imgpath/clear.gif" ]
+    set images(intensity)    [ image create photo -file "$imgpath/intensity.gif" ]
+    set images(linear)       [ image create photo -file "$imgpath/linear.gif" ]
+    set images(area)         [ image create photo -file "$imgpath/area.gif" ]
+    set images(help)         [ image create photo -file "$imgpath/help.gif" ]
+    set images(extract)      [ image create photo -file "$imgpath/extract.gif" ]
+    set images(del_axis)     [ image create photo -file "$imgpath/del_axis.gif" ]
+    set images(add)          [ image create photo -file "$imgpath/add.gif" ]
+    set images(continue)     [ image create photo -file "$imgpath/continue.gif" ]
+    set im1                  [ image create photo -file "$imgpath/redgreen.gif" ]
+    set im2                  [ image create photo -file "$imgpath/redblue.gif" ]
+
+    loadParams_dll "params.dat"
+    
+    global_window::create $imgpath
+     data_browser::create $widgets(work) 0x1
+    image_browser::create $widgets(work) 0x2
+             u_3D::create $widgets(work) 0x4
+    planes_window::create $widgets(work) 0x8
+
+    global_window::positionate
+
+}
+
+proc global_window::create { imgpath } {
+
+    # For programming facilities
+    upvar global_window::widgets     widgets
+    upvar global_window::images      images
+    upvar global_window::en_help     en_help
+    upvar global_window::en_quant    en_quant
+    upvar global_window::en_planes   en_planes
+    upvar global_window::en_3D       en_3D
+    upvar global_window::en_subtract en_subtract
+    upvar global_window::en_ibrw     en_ibrw
+    upvar global_window::en_params   en_params
+    upvar global_window::en_save     en_save
+    upvar global_window::en_load     en_load
+    upvar global_window::en_open     en_open
+    upvar global_window::en_excel    en_excel
+    upvar global_window::en_wizard   en_wizard
+    global_window::reset
+
+    # toplevel...
+    wm focusmodel       $widgets(base) passive
+    wm geometry         $widgets(base) 912x564+16+108
+    wm minsize          $widgets(base) 50 50
+    wm overrideredirect $widgets(base) 0
+    wm resizable        $widgets(base) 1 1
+    wm deiconify        $widgets(base)
+    wm title            $widgets(base) "$string_table::str_maracas_title"
+
+    # frames
+    frame $widgets(toolBar)      -borderwidth 1 -height 1 -relief flat -width 1
+    frame $widgets(toolsAllData) -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(toolsData)    -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(toolsState)   -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(toolsMouse)   -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(toolsProfil)  -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(toolsHelp)    -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(work)         -borderwidth 1 -height 1 -relief flat -width 1
+
+    # buttons
+    button $widgets(btnChooseDataPath) -relief flat -image $images(connect)      -command "global_window::cb_open_data"
+    button $widgets(btnLoadExperiment) -relief flat -image $images(loadexp)      -command "global_window::open_data"
+    button $widgets(btnSaveExperiment) -relief flat -image $images(save)         -command "global_window::save_data"
+    button $widgets(btnSaveExcel)      -relief flat -image $images(excel)        -command "global_window::save_data_as_excel"
+    button $widgets(btnParam)          -relief flat -image $images(params)       -command "global_window::cb_load_params"
+    button $widgets(btnWizard)         -relief flat -image $images(wizard)       -command "global_window::show_wizard"
+    button $widgets(btnBack)           -relief flat -image $images(back)         -command "global_window::back"
+    button $widgets(btnIbrw)           -relief flat -image $images(imagebrowser) -command "global_window::cb_image_browse"
+    button $widgets(btnSubtract)       -relief flat -image $images(subtract)     -command "global_window::subtract"
+    button $widgets(btn3D)             -relief flat -image $images(triD)         -command "global_window::start_3D"
+    button $widgets(btnPlanes)         -relief flat -image $images(plans)        -command "global_window::show_planes"
+    button $widgets(btnQuant)          -relief flat -image $images(quant)        -command "global_window::do_quant"
+    button $widgets(btnClear)                       -image $images(clear)        -command "global_window::clear"
+    button $widgets(btnHelp)           -relief flat -image $images(help)         -command "help_wnd::show_about $imgpath"
+                
+    radiobutton $widgets(btnRotate)    -indicatoron 0 -variable left_button -value 1 -relief flat -image $images(rotate)    -command "global_window::set_mouse_left_events 0x4"
+    radiobutton $widgets(btnPan)       -indicatoron 0 -variable left_button -value 2 -relief flat -image $images(pan)       -command "global_window::set_mouse_left_events 0x2"
+    radiobutton $widgets(btnIntensity) -indicatoron 0 -variable left_button -value 3 -relief flat -image $images(intensity) -command "global_window::set_mouse_left_events 0x1"
+
+    radiobutton $widgets(btnBright) -indicatoron 0 -variable right_button -value 1 -relief flat -image $images(bright)    -command "global_window::set_mouse_right_events 0x8"
+    radiobutton $widgets(btnZoom)   -indicatoron 0 -variable right_button -value 2 -relief flat -image $images(zoom)      -command "global_window::set_mouse_right_events 0x4"
+    radiobutton $widgets(btnLinear) -indicatoron 0 -variable right_button -value 3 -relief flat -image $images(linear)    -command "global_window::set_mouse_right_events 0x2"
+    radiobutton $widgets(btnArea)   -indicatoron 0 -variable right_button -value 4 -relief flat -image $images(area)      -command "global_window::set_mouse_right_events 0x1"
+
+    bind $widgets(btnChooseDataPath) <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnLoadExperiment) <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnSaveExperiment) <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnSaveExcel)      <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnParam)          <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnWizard)         <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnBack)           <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnIbrw)           <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnSubtract)       <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btn3D)             <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnPlanes)         <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnQuant)          <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnRotate)         <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnHelp)           <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+
+    bind $widgets(btnChooseDataPath) <Leave> { %W configure -relief flat }
+    bind $widgets(btnLoadExperiment) <Leave> { %W configure -relief flat }
+    bind $widgets(btnSaveExperiment) <Leave> { %W configure -relief flat }
+    bind $widgets(btnSaveExcel)      <Leave> { %W configure -relief flat }
+    bind $widgets(btnParam)          <Leave> { %W configure -relief flat }
+    bind $widgets(btnWizard)         <Leave> { %W configure -relief flat }
+    bind $widgets(btnBack)           <Leave> { %W configure -relief flat }
+    bind $widgets(btnIbrw)           <Leave> { %W configure -relief flat }
+    bind $widgets(btnSubtract)       <Leave> { %W configure -relief flat }
+    bind $widgets(btn3D)             <Leave> { %W configure -relief flat }
+    bind $widgets(btnPlanes)         <Leave> { %W configure -relief flat }
+    bind $widgets(btnQuant)          <Leave> { %W configure -relief flat }
+    bind $widgets(btnRotate)         <Leave> { %W configure -relief flat }
+    bind $widgets(btnHelp)           <Leave> { %W configure -relief flat }
+
+       bind $widgets(base) <Destroy> "global_window::DestroyWindow %W"
+
+    global_window::controls 0
+
+}
+
+proc global_window::DestroyWindow { widget } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+       if { [ string compare $widget $widgets(base) ] == 0 } {
+
+               freeAllMaracasInterfaces_dll
+
+       }
+
+}
+
+proc global_window::positionate { } {
+
+    # For programming facilities
+    upvar global_window::widgets     widgets
+    upvar global_window::show_params show_params
+
+    set show_params -1
+
+    pack $widgets(toolBar)           -anchor n  -expand 0 -fill both -side top
+    pack $widgets(toolsAllData)      -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnChooseDataPath) -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnLoadExperiment) -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnSaveExperiment) -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnSaveExcel)      -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnParam)          -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnWizard)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(toolsData)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnIbrw)           -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnSubtract)       -anchor nw -expand 0 -fill none -side left
+    pack $widgets(toolsState)        -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnBack)           -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btn3D)             -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnPlanes)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnQuant)          -anchor nw -expand 0 -fill none -side left
+    pack $widgets(toolsMouse)        -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnRotate)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnBright)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnPan)            -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnZoom)           -anchor nw -expand 0 -fill none -side left
+    pack $widgets(toolsProfil)       -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnClear)          -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnIntensity)      -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnLinear)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnArea)           -anchor nw -expand 0 -fill none -side left
+    pack $widgets(toolsHelp)         -anchor nw -expand 0 -fill none -side left
+    pack $widgets(btnHelp)           -anchor nw -expand 0 -fill none -side left
+    pack $widgets(work)              -anchor n  -expand 1 -fill both -side top
+
+}
+
+proc global_window::forget { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    pack forget $widgets(work)
+    pack forget $widgets(btnHelp)
+    pack forget $widgets(toolsHelp)
+    pack forget $widgets(btnArea)
+    pack forget $widgets(btnLinear)
+    pack forget $widgets(btnIntensity)
+    pack forget $widgets(btnClear)
+    pack forget $widgets(toolsProfil)
+    pack forget $widgets(btnZoom)
+    pack forget $widgets(btnPan)
+    pack forget $widgets(btnBright)
+    pack forget $widgets(btnRotate)
+    pack forget $widgets(toolsMouse)
+    pack forget $widgets(btnQuant)
+    pack forget $widgets(btnPlanes)
+    pack forget $widgets(btn3D)
+    pack forget $widgets(btnBack)
+    pack forget $widgets(toolsState)
+    pack forget $widgets(btnSubtract)
+    pack forget $widgets(btnIbrw)
+    pack forget $widgets(toolsData)
+    pack forget $widgets(btnWizard)
+    pack forget $widgets(btnParam)
+    pack forget $widgets(btnLoadExperiment)
+    pack forget $widgets(btnSaveExcel)
+    pack forget $widgets(btnSaveExperiment)
+    pack forget $widgets(btnChooseDataPath)
+    pack forget $widgets(toolsAllData)
+    pack forget $widgets(toolBar)
+
+}
+
+proc global_window::get_active_controls { } {
+
+    # For programming facilities
+    upvar global_window::widgets      widgets
+    upvar global_window::en_quant     en_quant    
+    upvar global_window::en_planes    en_planes   
+    upvar global_window::en_3D        en_3D       
+    upvar global_window::en_subtract  en_subtract 
+    upvar global_window::en_ibrw      en_ibrw     
+    upvar global_window::en_params    en_params   
+    upvar global_window::en_save      en_save     
+    upvar global_window::en_load      en_load     
+    upvar global_window::en_open      en_open     
+    upvar global_window::en_help      en_help     
+    upvar global_window::en_rotate    en_rotate   
+    upvar global_window::en_bright    en_bright   
+    upvar global_window::en_pan       en_pan      
+    upvar global_window::en_zoom      en_zoom     
+    upvar global_window::en_clear     en_clear    
+    upvar global_window::en_intensity en_intensity
+    upvar global_window::en_linear    en_linear   
+    upvar global_window::en_area      en_area     
+    upvar global_window::en_back      en_back
+    upvar global_window::en_excel     en_excel
+    upvar global_window::en_wizard    en_wizard
+
+       set ret 0
+    if { [ string compare [ $widgets(btnQuant)          cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_quant     ] }
+    if { [ string compare [ $widgets(btnPlanes)         cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_planes    ] }
+    if { [ string compare [ $widgets(btn3D)             cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_3D        ] }
+    if { [ string compare [ $widgets(btnSubtract)       cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_subtract  ] }
+    if { [ string compare [ $widgets(btnIbrw)           cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_ibrw      ] }
+    if { [ string compare [ $widgets(btnParam)          cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_params    ] }
+    if { [ string compare [ $widgets(btnSaveExperiment) cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_save      ] }
+    if { [ string compare [ $widgets(btnLoadExperiment) cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_load      ] }
+    if { [ string compare [ $widgets(btnChooseDataPath) cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_open      ] }
+    if { [ string compare [ $widgets(btnHelp)           cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_help      ] }
+    if { [ string compare [ $widgets(btnRotate)         cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_rotate    ] }
+    if { [ string compare [ $widgets(btnBright)         cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_bright    ] }
+    if { [ string compare [ $widgets(btnPan)            cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_pan       ] }
+    if { [ string compare [ $widgets(btnZoom)           cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_zoom      ] }
+    if { [ string compare [ $widgets(btnClear)          cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_clear     ] }
+    if { [ string compare [ $widgets(btnIntensity)      cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_intensity ] }
+    if { [ string compare [ $widgets(btnLinear)         cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_linear    ] }
+    if { [ string compare [ $widgets(btnArea)           cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_area      ] }
+    if { [ string compare [ $widgets(btnBack)           cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_back      ] }
+    if { [ string compare [ $widgets(btnSaveExcel)      cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_excel     ] }
+    if { [ string compare [ $widgets(btnWizard)         cget -state ] "normal" ] == 0 } { set ret [ expr $ret | $en_wizard    ] }
+
+       return $ret
+
+}
+
+proc global_window::active_controls { mask } {
+
+    # For programming facilities
+    upvar global_window::widgets      widgets
+    upvar global_window::en_quant     en_quant    
+    upvar global_window::en_planes    en_planes   
+    upvar global_window::en_3D        en_3D       
+    upvar global_window::en_subtract  en_subtract 
+    upvar global_window::en_ibrw      en_ibrw     
+    upvar global_window::en_params    en_params   
+    upvar global_window::en_save      en_save     
+    upvar global_window::en_load      en_load     
+    upvar global_window::en_open      en_open     
+    upvar global_window::en_help      en_help     
+    upvar global_window::en_rotate    en_rotate   
+    upvar global_window::en_bright    en_bright   
+    upvar global_window::en_pan       en_pan      
+    upvar global_window::en_zoom      en_zoom     
+    upvar global_window::en_clear     en_clear    
+    upvar global_window::en_intensity en_intensity
+    upvar global_window::en_linear    en_linear   
+    upvar global_window::en_area      en_area     
+    upvar global_window::en_back      en_back
+    upvar global_window::en_excel     en_excel
+    upvar global_window::en_wizard    en_wizard
+
+    if { ( $mask & $en_quant     ) == $en_quant     } { $widgets(btnQuant)          configure -state normal } else { $widgets(btnQuant)          configure -state disabled -relief flat }
+    if { ( $mask & $en_planes    ) == $en_planes    } { $widgets(btnPlanes)         configure -state normal } else { $widgets(btnPlanes)         configure -state disabled -relief flat }
+    if { ( $mask & $en_3D        ) == $en_3D        } { $widgets(btn3D)             configure -state normal } else { $widgets(btn3D)             configure -state disabled -relief flat }
+    if { ( $mask & $en_subtract  ) == $en_subtract  } { $widgets(btnSubtract)       configure -state normal } else { $widgets(btnSubtract)       configure -state disabled -relief flat }
+    if { ( $mask & $en_ibrw      ) == $en_ibrw      } { $widgets(btnIbrw)           configure -state normal } else { $widgets(btnIbrw)           configure -state disabled -relief flat }
+    if { ( $mask & $en_params    ) == $en_params    } { $widgets(btnParam)          configure -state normal } else { $widgets(btnParam)          configure -state disabled -relief flat }
+    if { ( $mask & $en_save      ) == $en_save      } { $widgets(btnSaveExperiment) configure -state normal } else { $widgets(btnSaveExperiment) configure -state disabled -relief flat }
+    if { ( $mask & $en_load      ) == $en_load      } { $widgets(btnLoadExperiment) configure -state normal } else { $widgets(btnLoadExperiment) configure -state disabled -relief flat }
+    if { ( $mask & $en_open      ) == $en_open      } { $widgets(btnChooseDataPath) configure -state normal } else { $widgets(btnChooseDataPath) configure -state disabled -relief flat }
+    if { ( $mask & $en_help      ) == $en_help      } { $widgets(btnHelp)           configure -state normal } else { $widgets(btnHelp)           configure -state disabled -relief flat }
+    if { ( $mask & $en_rotate    ) == $en_rotate    } { $widgets(btnRotate)         configure -state normal } else { $widgets(btnRotate)         configure -state disabled -relief flat }
+    if { ( $mask & $en_bright    ) == $en_bright    } { $widgets(btnBright)         configure -state normal } else { $widgets(btnBright)         configure -state disabled -relief flat }
+    if { ( $mask & $en_pan       ) == $en_pan       } { $widgets(btnPan)            configure -state normal } else { $widgets(btnPan)            configure -state disabled -relief flat }
+    if { ( $mask & $en_zoom      ) == $en_zoom      } { $widgets(btnZoom)           configure -state normal } else { $widgets(btnZoom)           configure -state disabled -relief flat }
+    if { ( $mask & $en_clear     ) == $en_clear     } { $widgets(btnClear)          configure -state normal } else { $widgets(btnClear)          configure -state disabled -relief flat }
+    if { ( $mask & $en_intensity ) == $en_intensity } { $widgets(btnIntensity)      configure -state normal } else { $widgets(btnIntensity)      configure -state disabled -relief flat }
+    if { ( $mask & $en_linear    ) == $en_linear    } { $widgets(btnLinear)         configure -state normal } else { $widgets(btnLinear)         configure -state disabled -relief flat }
+    if { ( $mask & $en_area      ) == $en_area      } { $widgets(btnArea)           configure -state normal } else { $widgets(btnArea)           configure -state disabled -relief flat }
+    if { ( $mask & $en_back      ) == $en_back      } { $widgets(btnBack)           configure -state normal } else { $widgets(btnBack)           configure -state disabled -relief flat }
+    if { ( $mask & $en_excel     ) == $en_excel     } { $widgets(btnSaveExcel)      configure -state normal } else { $widgets(btnSaveExcel)      configure -state disabled -relief flat }
+    if { ( $mask & $en_wizard    ) == $en_wizard    } { $widgets(btnWizard)         configure -state normal } else { $widgets(btnWizard)         configure -state disabled -relief flat }
+
+}
+
+proc global_window::cb_load_params { } {
+
+    # For programming facilities
+    upvar global_window::widgets      widgets
+    upvar global_window::sh_none      sh_none
+    upvar global_window::sh_data      sh_data
+    upvar global_window::sh_ibrw      sh_ibrw
+    upvar global_window::sh_3D_mpr    sh_3D_mpr
+    upvar global_window::sh_3D_mip    sh_3D_mip
+    upvar global_window::sh_3D_sur    sh_3D_sur
+    upvar global_window::sh_3D_qua    sh_3D_qua
+    upvar global_window::window_shown window_shown
+    upvar global_window::show_params  show_params
+
+    set ac_ctrls [ global_window::get_active_controls ]
+
+    set p [ params_dll ]
+    array set arrB $p
+    set p [ dlg_params::show $widgets(work) $p ]
+    array set arrP $p
+    if { $p != "" } {
+
+        setParams_dll $p
+        saveParams_dll "params.dat"
+
+        # Recalculate axes, if an
+        u_surf::reload_axis [ expr ( $arrB(e_mask_size) != $arrP(e_mask_size) ) || ( $arrB(e_coef_cell_max_int) != $arrP(e_coef_cell_max_int) ) ] [ expr ( $arrB(e_axis_discret_step) != $arrP(e_axis_discret_step) ) ]
+        planes_window::reload_axis [ expr ( $arrB(e_mask_size) != $arrP(e_mask_size) ) || ( $arrB(e_coef_cell_max_int) != $arrP(e_coef_cell_max_int) ) ] [ expr ( $arrB(e_axis_discret_step) != $arrP(e_axis_discret_step) ) ]
+
+    }
+    global_window::active_controls $ac_ctrls
+
+}
+
+proc global_window::cb_open_data { } {
+
+    # For programming facilities
+    upvar global_window::data_loaded_from_disk data_loaded_from_disk
+
+    busy hold .
+    update
+
+    planes_window::forget
+    u_3D::forget
+    image_browser::forget
+    data_browser::forget
+    data_browser::set_data
+    set data_loaded_from_disk 0
+    data_browser::positionate
+
+    busy release .
+    update
+
+}
+
+proc global_window::cb_image_browse { } {
+
+    busy hold .
+    update
+
+    planes_window::forget
+    u_3D::forget
+    image_browser::forget
+    data_browser::forget
+    image_browser::set_data
+    image_browser::positionate
+
+    busy release .
+    update
+
+}
+
+proc global_window::start_3D { } {
+
+    busy hold .
+    update
+
+    planes_window::forget
+    u_3D::forget
+    image_browser::forget
+    data_browser::forget
+    u_3D::set_data
+    u_3D::positionate
+
+    busy release .
+    update
+
+}
+
+proc global_window::show_planes { } {
+
+    busy hold .
+    update
+
+    planes_window::forget
+    u_3D::forget
+    image_browser::forget
+    data_browser::forget
+    planes_window::set_data
+    planes_window::positionate
+
+    busy release .
+    update
+
+}
+
+proc global_window::do_quant { } {
+
+    planes_window::do_quant
+
+}
+
+proc global_window::subtract { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    set sub_data [ data_browser::get_subdata ]
+    
+    if { [ llength $sub_data ] == 2 } {
+    
+        set sub_info [ subtract::show $widgets(work) [ lindex $sub_data 0 ] [ lindex $sub_data 1 ] ]
+        busy hold .
+        update
+
+        if { [ lindex $sub_info 0 ] == 12 } {
+
+            subtractSeries_dll [ lindex $sub_data 0 ] [ lindex $sub_data 1 ] [ lindex $sub_info 2 ] [ lindex $sub_info 1 ]
+
+        } elseif { [ lindex $sub_info 0 ] == 21 } {
+
+            subtractSeries_dll [ lindex $sub_data 1 ] [ lindex $sub_data 2 ] [ lindex $sub_info 2 ] [ lindex $sub_info 1 ]
+
+        }
+        busy release .
+        update
+    
+    }
+
+}
+
+proc global_window::save_data_as_excel { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    set fileName "exp_$data_browser::sel_study\_$data_browser::sel_serie\.xls"
+
+    array set arr [ params_dll -1 ]
+    set fileName [                                                \
+        tk_getSaveFile                                            \
+        -initialdir $arr(e_installation_directory)                 \
+        -initialfile $fileName                                    \
+        -parent $widgets(work)                                    \
+        -filetypes { { {Excel Files} {.xls} } { {All files} * } } \
+        -defaultextension dat                                     \
+        -title $string_table::str_choose_a_file                   \
+    ]
+
+    if { $fileName != "" } {
+
+        busy hold .
+        update
+        set res [ saveAsExcel_dll $fileName ]
+        busy release .
+        update
+
+    }
+
+}
+
+proc global_window::save_data { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    set fileName "exp_$data_browser::sel_study\_$data_browser::sel_serie\.dat"
+    set filetext "axis.txt"
+    set fileraw "vol.raw"
+
+    array set arr [ params_dll ]
+    set fileName [                                               \
+        tk_getSaveFile                                           \
+        -initialdir $arr(e_installation_directory)                \
+        -initialfile $fileName                                   \
+        -parent $widgets(work)                                   \
+        -filetypes { { {Data Files} {.dat} } { {All files} * } } \
+        -defaultextension dat                                    \
+        -title $string_table::str_choose_a_file                  \
+    ]
+
+#    set fileraw [                                               \
+#        tk_getSaveFile                                           \
+#        -initialdir $arr(e_installation_directory)                \
+#        -initialfile $fileraw                                   \
+#        -parent $widgets(work)                                   \
+#        -filetypes { { {Raw volumes} {.raw} } } \
+#        -defaultextension raw                                    \
+#        -title $string_table::str_choose_a_file                  \
+#    ]
+
+    set filetext "iamnotforyouruse.txt"
+#    set filetext [                                               \
+#        tk_getSaveFile                                           \
+#        -initialdir $arr(e_installation_directory)                \
+#        -initialfile $filetext                                   \
+#        -parent $widgets(work)                                   \
+#        -filetypes { { {Text Files} {.txt} } } \
+#        -defaultextension txt                                    \
+#        -title $string_table::str_choose_a_file                  \
+#    ]
+
+    if { $fileName != "" } {
+
+        busy hold .
+        update
+        set res [ SaveExperiment_dll $fileName ]
+#        saveVolumeAsRaw_dll $fileraw
+        busy release .
+        update
+
+
+    }
+
+}
+
+proc global_window::open_data { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+    upvar global_window::data_loaded_from_disk data_loaded_from_disk
+
+    array set arr [ params_dll -1 ]
+    set fileName [                                               \
+        tk_getOpenFile                                           \
+        -initialdir $arr(e_installation_directory)                \
+        -parent $widgets(work)                                   \
+        -filetypes { { {Data Files} {.dat} } { {All files} * } } \
+        -defaultextension dat                                    \
+        -title $string_table::str_choose_a_file                  \
+    ]
+
+    if { $fileName != "" } {
+
+        busy hold .
+        update
+        set res [ loadExperiment_dll $fileName ]
+        set data_loaded_from_disk 1
+        busy release .
+        update
+        array set ser_data [ seriedata_dll [ getStudy_dll ] [ getSerie_dll ] ]
+        global_window::set_window_title "$ser_data(ID_Patient_Name) - [ getStudy_dll ]/[ getSerie_dll ]"
+        global_window::show_planes
+
+    }
+
+}
+
+proc global_window::set_mouse_left_events { mask } {
+
+    image_browser::set_mouse_left_events $mask
+    u_mpr::set_mouse_left_events $mask
+    u_mip::set_mouse_left_events $mask
+    u_surf::set_mouse_left_events $mask
+    planes_window::set_mouse_left_events $mask
+
+}
+
+proc global_window::set_mouse_right_events { mask } {
+
+    image_browser::set_mouse_right_events $mask
+    u_mpr::set_mouse_right_events $mask
+    u_mip::set_mouse_right_events $mask
+    u_surf::set_mouse_right_events $mask
+    planes_window::set_mouse_right_events $mask
+
+}
+
+proc global_window::clear { } {
+
+    image_browser::clear
+#    planes_window::clear
+
+}
+
+proc global_window::show_wizard { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    wizardpostaxis::show $widgets(work)
+    wizardpostcontour::show $widgets(work)
+
+}
+
+proc global_window::invoke_buttons { mask } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+    upvar global_window::en_quant          en_quant    
+    upvar global_window::en_planes         en_planes   
+    upvar global_window::en_3D             en_3D       
+    upvar global_window::en_subtract       en_subtract 
+    upvar global_window::en_ibrw           en_ibrw     
+    upvar global_window::en_params         en_params   
+    upvar global_window::en_save           en_save     
+    upvar global_window::en_load           en_load     
+    upvar global_window::en_open           en_open     
+    upvar global_window::en_help           en_help     
+    upvar global_window::en_rotate         en_rotate   
+    upvar global_window::en_bright         en_bright   
+    upvar global_window::en_pan            en_pan      
+    upvar global_window::en_zoom           en_zoom     
+    upvar global_window::en_clear          en_clear    
+    upvar global_window::en_intensity      en_intensity
+    upvar global_window::en_linear         en_linear   
+    upvar global_window::en_area           en_area     
+
+    if { ( $mask & $en_quant     ) == $en_quant     } { $widgets(btnQuant)          invoke }
+    if { ( $mask & $en_planes    ) == $en_planes    } { $widgets(btnPlanes)         invoke }
+    if { ( $mask & $en_3D        ) == $en_3D        } { $widgets(btn3D)             invoke }
+    if { ( $mask & $en_subtract  ) == $en_subtract  } { $widgets(btnSubtract)       invoke }
+    if { ( $mask & $en_ibrw      ) == $en_ibrw      } { $widgets(btnIbrw)           invoke }
+    if { ( $mask & $en_params    ) == $en_params    } { $widgets(btnParam)          invoke }
+    if { ( $mask & $en_save      ) == $en_save      } { $widgets(btnSaveExperiment) invoke }
+    if { ( $mask & $en_load      ) == $en_load      } { $widgets(btnLoadExperiment) invoke }
+    if { ( $mask & $en_open      ) == $en_open      } { $widgets(btnChooseDataPath) invoke }
+    if { ( $mask & $en_help      ) == $en_help      } { $widgets(btnHelp)           invoke }
+    if { ( $mask & $en_rotate    ) == $en_rotate    } { $widgets(btnRotate)         invoke }
+    if { ( $mask & $en_bright    ) == $en_bright    } { $widgets(btnBright)         invoke }
+    if { ( $mask & $en_pan       ) == $en_pan       } { $widgets(btnPan)            invoke }
+    if { ( $mask & $en_zoom      ) == $en_zoom      } { $widgets(btnZoom)           invoke }
+    if { ( $mask & $en_clear     ) == $en_clear     } { $widgets(btnClear)          invoke }
+    if { ( $mask & $en_intensity ) == $en_intensity } { $widgets(btnIntensity)      invoke }
+    if { ( $mask & $en_linear    ) == $en_linear    } { $widgets(btnLinear)         invoke }
+    if { ( $mask & $en_area      ) == $en_area      } { $widgets(btnArea)           invoke }
+
+}
+
+proc global_window::deselect_buttons { } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    $widgets(btnRotate)    deselect
+    $widgets(btnBright)    deselect
+    $widgets(btnPan)       deselect
+    $widgets(btnZoom)      deselect
+    $widgets(btnIntensity) deselect
+    $widgets(btnLinear)    deselect
+    $widgets(btnArea)      deselect
+
+}
+
+proc global_window::set_window_title { title } {
+
+    # For programming facilities
+    upvar global_window::widgets widgets
+
+    wm title $widgets(base) "$string_table::str_maracas_title - $title"
+
+}
+
+proc global_window::back { } {
+
+    # For programming facilities
+    upvar global_window::data_loaded_from_disk data_loaded_from_disk
+
+    if { [ image_browser::back ] == 1 } {
+
+        global_window::cb_open_data
+
+    } elseif { [ u_3D::back ] == 1 } {
+
+        busy hold .
+        update
+
+        if { $data_loaded_from_disk == 1 } {
+
+            set data_browser::sel_study [ getStudy_dll ]
+            set data_browser::sel_serie [ getSerie_dll ]
+            image_browser::set_data
+        
+        }
+        
+        planes_window::forget
+        u_3D::forget
+        image_browser::forget
+        data_browser::forget
+        image_browser::positionate
+
+        busy release .
+        update
+
+    } elseif { [ planes_window::back ] == 1 } {
+
+        busy hold .
+        update
+
+        if { $data_loaded_from_disk == 1 } {
+        
+            image_browser::set_data2
+            u_3D::set_data
+            
+        }
+        planes_window::forget
+        u_3D::forget
+        image_browser::forget
+        data_browser::forget
+        u_3D::positionate
+        u_3D::controls 2
+
+        busy release .
+        update
+
+    }
+
+}
+
+proc global_window::controls { { id -1 } } {
+        
+    if { $id == -1 } {
+        global_window::active_controls 0
+    } else {
+
+        global_window::active_controls [  \
+            expr                          \
+            $global_window::en_params   | \
+            $global_window::en_load     | \
+            $global_window::en_open     | \
+            $global_window::en_help     | \
+            0
+        ]
+
+    }
+
+}
+
+# EOF - global_window.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/help_wnd.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/help_wnd.tcl
new file mode 100644 (file)
index 0000000..1d3a519
--- /dev/null
@@ -0,0 +1,68 @@
+
+namespace eval help_wnd {
+
+    namespace export \
+        show_logo    \
+        show_about
+
+}
+
+proc help_wnd::show_logo { imgpath } {
+
+    catch { destroy .fnLogo }
+    toplevel .fnLogo 
+    wm title .fnLogo "MARACAS - MAgnetic Resonance Angiography Computer ASsisted analysis"
+
+    frame .fnLogo.buttons
+    pack .fnLogo.buttons -side bottom -anchor n -expand 0
+
+    frame .fnLogo.frLogo
+    pack .fnLogo.frLogo -side top -anchor n -expand 1 -fill both
+
+    button .fnLogo.buttons.ok -text Ok \
+        -command {\
+               destroy .fnLogo
+           }
+
+    pack .fnLogo.buttons.ok
+
+    image create photo imaLogo -file "$imgpath/logocreatis.gif" -format "gif"
+
+    set cLogo .fnLogo.frLogo.cLogo
+
+    canvas $cLogo -width 598 -height 249 -relief sunken -borderwidth 2
+    pack $cLogo
+
+    $cLogo create image 0 0 -image imaLogo -anchor nw
+
+}
+
+proc help_wnd::show_about { imgpath } {
+
+    catch { destroy .fnLogo }
+    toplevel .fnLogo 
+    wm title .fnLogo "MARACAS - MAgnetic Resonance Angiography Computer ASsisted analysis"
+
+    frame .fnLogo.buttons
+    pack .fnLogo.buttons -side bottom -anchor n -expand 0
+
+    frame .fnLogo.frLogo
+    pack .fnLogo.frLogo -side top -anchor n -expand 1 -fill both
+
+    button .fnLogo.buttons.ok -text Ok \
+        -command {\
+                   destroy .fnLogo
+        }
+
+    pack .fnLogo.buttons.ok
+
+    image create photo imaLogo -file "$imgpath/authors.gif" -format "gif"
+
+    set cLogo .fnLogo.frLogo.cLogo
+
+    canvas $cLogo -width 1000 -height 600 -relief sunken -borderwidth 2
+    pack $cLogo
+
+    $cLogo create image 0 0 -image imaLogo -anchor nw
+
+}
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/image_browser.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/image_browser.tcl
new file mode 100644 (file)
index 0000000..f0f70b4
--- /dev/null
@@ -0,0 +1,591 @@
+package require ibrowser
+package require imagepp
+package require BLT
+catch { namespace import ibrowser::* }
+catch { namespace import imagepp::* }
+catch { namespace import blt::* }
+
+namespace eval image_browser {
+
+    # public interface
+    namespace export        \
+        create              \
+        positionate         \
+        forget              \
+        get_images          \
+        get_real_images
+
+    # variables
+    variable widgets
+
+    variable first_image -1
+    variable last_image -1
+    variable image_width  -1
+    variable image_height -1
+    variable mip_raised    0
+    variable actual_image
+    variable local_id
+    variable shown
+    variable return_nothing 0
+
+}
+
+proc image_browser::reset { parent } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+
+    set widgets(base)       "$parent"
+    set widgets(image_brw)  "$parent\.images"
+    set widgets(bottom_brw) "$parent\.images.02"
+    set widgets(vert_split) "$parent\.images.03"
+    set widgets(right_brw)  "$parent\.images.02.02"
+    set widgets(horz_split) "$parent\.images.02.03"
+    set widgets(type)       "$parent\.images.02.02.type"
+    set widgets(ibrw)       "$parent\.images.01"
+    set widgets(impp)       "$parent\.images.02.01"
+    set widgets(btnSerie)   "$parent\.images.02.02.type.btnSerie"
+    set widgets(btnMIP)     "$parent\.images.02.02.type.btnMIP"
+    set widgets(lbl001)     "$parent\.images.02.02.lbl001"
+    set widgets(sclSerie)   "$parent\.images.02.02.sclSerie"
+
+}
+
+proc image_browser::create { parent id } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+    upvar image_browser::image_width  image_width
+    upvar image_browser::image_height image_height
+    upvar image_browser::mip_raised   mip_raised
+    upvar image_browser::local_id  local_id
+    upvar image_browser::shown     shown
+
+    set local_id $id
+    image_browser::reset $parent
+    set shown 0
+
+    # frames
+    frame $widgets(image_brw)  -height 1 -width 1
+    frame $widgets(bottom_brw) -borderwidth 1 -relief groove 
+    frame $widgets(right_brw)  -borderwidth 1 -relief groove 
+    frame $widgets(type)       -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(horz_split) -borderwidth 2 -relief raised 
+    frame $widgets(vert_split) -borderwidth 2 -relief raised 
+
+    # radio buttons
+    set mip_raised 0
+    radiobutton $widgets(btnSerie) -text $string_table::str_serie -variable var_type -value 1 -command "image_browser::cb_load_serie"
+    radiobutton $widgets(btnMIP)   -text $string_table::str_mip   -variable var_type -value 2 -command "image_browser::cb_load_mip"
+
+    # labels
+    label $widgets(lbl001) -borderwidth 0 -text $string_table::str_showtype 
+
+    # scales
+    scale $widgets(sclSerie) -label $string_table::str_series -orient horizontal 
+
+    # split bindings
+    bind $widgets(horz_split) <B1-Motion> {
+        set root [ split %W . ]
+        set nb [ llength $root ]
+        incr nb -1
+        set root [ lreplace $root $nb $nb ]
+        set root [ join $root . ]
+        set width [ winfo width $root ].0
+        set val [ expr (%X - [winfo rootx $root]) /$width ]
+        if { $val >= 0 && $val <= 1.0 } {
+            place $root.01 -relwidth $val
+            place $root.03 -relx $val
+            place $root.02 -relwidth [ expr 1.0 - $val ]
+        }
+    }
+    bind $widgets(vert_split) <B1-Motion> {
+        set root [ split %W . ]
+        set nb [ llength $root ]
+        incr nb -1
+        set root [ lreplace $root $nb $nb ]
+        set root [ join $root . ]
+        set height [ winfo height $root ].0
+        set val [ expr (%Y - [winfo rooty $root]) /$height ]
+        if { $val >= 0 && $val <= 1.0 } {
+            place $root.01 -relheight $val
+            place $root.03 -rely $val
+            place $root.02 -relheight [ expr 1.0 - $val ]
+        }
+    }
+
+}
+
+proc image_browser::positionate { } {
+
+    # For programming facilities
+    upvar image_browser::widgets      widgets
+    upvar image_browser::image_width  image_width
+    upvar image_browser::image_height image_height
+    upvar image_browser::mip_raised   mip_raised
+    upvar image_browser::local_id     local_id
+    upvar image_browser::shown     shown
+    upvar image_browser::return_nothing return_nothing
+
+    set return_nothing 0
+    set shown 1
+    set global_window::window_shown $local_id
+
+    pack  $widgets(image_brw)  -anchor n -expand 1 -fill both -side top
+    place $widgets(ibrw)       -x 0 -y 0 -relwidth 1 -height -1 -relheight 0.25 -anchor nw -bordermode ignore
+    place $widgets(bottom_brw) -x 0 -y 0 -rely 1 -relwidth 1 -height -1 -relheight 0.75 -anchor sw -bordermode ignore
+    place $widgets(impp)       -x 0 -y 0 -width -1 -relwidth 0.75 -relheight 1 -anchor nw -bordermode ignore
+    place $widgets(right_brw)  -x 0 -relx 1 -y 0 -width -1 -relwidth 0.25 -relheight 1 -anchor ne -bordermode ignore
+    place $widgets(type)       -x 15 -y 60 -width 110 -height 65 -anchor nw -bordermode ignore
+    place $widgets(btnSerie)   -x 20 -y 10 -anchor nw -bordermode ignore
+    place $widgets(btnMIP)     -x 20 -y 35 -anchor nw -bordermode ignore
+    place $widgets(lbl001)     -x 20 -y 50 -anchor nw -bordermode ignore
+    place $widgets(sclSerie)   -x 15 -y 130 -width 200 -anchor nw -bordermode ignore
+    place $widgets(horz_split) -x 0 -relx 0.75 -y 0 -rely 0.9 -width 10 -height 10 -anchor s -bordermode ignore
+    place $widgets(vert_split) -x 0 -relx 0.9 -y 0 -rely 0.25 -width 10 -height 10 -anchor e -bordermode ignore
+
+    image_browser::controls 0
+
+}
+
+proc image_browser::forget { } {
+
+    # For programming facilities
+    upvar image_browser::widgets      widgets
+    upvar image_browser::image_width  image_width
+    upvar image_browser::image_height image_height
+    upvar image_browser::mip_raised   mip_raised
+    upvar image_browser::shown     shown
+
+    set shown 0
+
+    place forget $widgets(vert_split)
+    place forget $widgets(horz_split)
+    place forget $widgets(sclSerie)
+    place forget $widgets(lbl001)
+    place forget $widgets(btnMIP)
+    place forget $widgets(btnSerie)
+    place forget $widgets(type)
+    place forget $widgets(right_brw)
+    catch { place forget $widgets(impp) }
+    place forget $widgets(bottom_brw)
+    catch { place forget $widgets(ibrw) }
+    pack  forget $widgets(image_brw)
+
+}
+
+proc image_browser::set_data { } {
+
+    # For programming facilities
+    upvar image_browser::widgets  widgets
+    upvar image_browser::local_id local_id
+
+    set global_window::data_loaded [ expr $global_window::data_loaded | $local_id ]
+
+    catch {
+
+        set data [ $widgets(ibrw) curselection ]
+        $widgets(ibrw) delete -tags "delete"
+
+    }
+
+    # image browser
+    destroy $widgets(ibrw)
+    ibrowser $widgets(ibrw)     \
+        -borderwidth    1       \
+        -cache          1       \
+        -fontcolor      #ffff00 \
+        -gap            5       \
+        -height         1       \
+        -multisel       1       \
+        -primarycolor   #ff0000 \
+        -relief         groove  \
+        -secondarycolor #00ff00 \
+        -thumbheight    100     \
+        -thumbwidth     100     \
+        -width          1
+    bind $widgets(ibrw) <<AfterSelectFirstImage>> "image_browser::select_image 0"
+    bind $widgets(ibrw) <<AfterSelectLastImage>> "image_browser::select_image 1"
+
+    # image pp
+    destroy $widgets(impp)
+    imagepp $widgets(impp)           \
+        -borderwidth 1               \
+        -height      10              \
+        -initialroi  "10 10 100 100" \
+        -relief      groove          \
+        -takefocus   0               \
+        -width       10
+    bind $widgets(impp) <<AfterProfil>> "image_browser::do_profil"
+
+    array set ser_data [ serieData_dll $data_browser::sel_study $data_browser::sel_serie ]
+    global_window::set_window_title "$ser_data(ID_Patient_Name) - $data_browser::sel_study/$data_browser::sel_serie"
+    LoadImages_dll
+    set n [ GetNumberOfImages_dll ]
+    set tkNames {}
+    for { set i 0 } { $i < $n } { incr i } { lappend tkNames [ image create photo ] }
+    set numbers [ GetImagesNumbers_dll ]
+    LoadTkImages_dll $tkNames
+    set image_browser::first_image -1
+    set image_browser::last_image -1
+
+    set i 0
+    set fN 0
+    set lN 0
+    foreach number $numbers {
+
+        if { $i == 0 } { set fN $number }
+        set lN $number
+        set imgTK [ lindex $tkNames $i ]
+        $widgets(ibrw) add                    \
+            -image $imgTK                     \
+            -tags "id_$i delete" \
+            -title "$number"
+        $widgets(impp) add -image $imgTK -id "id_$i"
+
+        incr i
+
+    }
+
+    set image_width  [ image width $imgTK ]
+    set image_height [ image height $imgTK ]
+
+    $widgets(impp) configure -initialroi "[ expr $image_width * 0.3 ] [ expr $image_height * 0.3 ] [ expr $image_width * 0.7 ] [ expr $image_height * 0.7 ]"
+    $widgets(impp) resetroi
+
+    array set arr [ params_dll ]
+
+    $widgets(ibrw) select -tags "id_0"
+    set image_browser::first_image $fN
+    if { $arr(e_choose_all_slices_default) == 1 } {
+
+        $widgets(ibrw) select -tags "id_[ expr $i - 1 ]" -secondary
+        set image_browser::last_image $lN
+
+    }
+
+    $widgets(btnSerie) deselect
+    $widgets(btnMIP)   deselect
+
+    if { $arr(e_calculate_mip_default) == 0 } { $widgets(btnSerie) invoke }
+    if { $arr(e_calculate_mip_default) == 1 } { $widgets(btnMIP)   invoke }
+
+    $widgets(sclSerie) configure                                         \
+        -label "$string_table::str_series : $ser_data(ID_Series_Number)" \
+        -from $fN                                                        \
+        -to   $lN                                                        \
+        -command "image_browser::select_first_image" \
+        -resolution 1
+    $widgets(sclSerie) set $fN
+
+#    bind $widgets(sclSerie) <ButtonRelease-1> "image_browser::select_first_image"
+
+    image_browser::controls 0
+
+    global_window::deselect_buttons
+    global_window::invoke_buttons [ expr \
+        $global_window::en_clear     | \
+        $global_window::en_intensity   \
+    ]
+
+}
+
+proc image_browser::select_first_image { n } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+
+#    set n [ $widgets(sclSerie) get ]
+    set f [ $widgets(sclSerie) cget -from ]
+    set i [ expr $n - $f ]
+    set i [ lindex [ split $i . ] 0 ]
+    $widgets(impp) show -id "id_$i"
+#    $widgets(ibrw) select -tags "id_$i"
+
+}
+
+proc image_browser::cb_load_mip { } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+    upvar image_browser::mip_raised mip_raised
+    upvar image_browser::actual_image actual_image
+
+    set mip_raised 1
+    set datas [ $widgets(ibrw) curselection ]
+    set images [ list ]
+    foreach data $datas { lappend images [ lindex [ lindex $data 2 ] 2 ] }
+    set mip [ loadMIPZ_dll $images ]
+    set actual_image $mip
+    set imgTK [ image create photo ]
+    loadTKimage_dll $mip $imgTK
+    $widgets(impp) add -image $imgTK -id mip
+
+}
+
+proc image_browser::cb_load_serie { } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+    upvar image_browser::mip_raised mip_raised
+    upvar image_browser::actual_image actual_image
+
+    # $sclSerie configure -state normal
+    set mip_raised 0
+    set image [ $widgets(ibrw) lastimage ]
+    set actual_image [ lindex [ lindex $image 2 ] 2 ]
+    set id [ lindex $image 0 ]
+    $widgets(impp) show -id $id
+
+}
+
+proc image_browser::select_image { i } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+    upvar image_browser::mip_raised mip_raised
+
+    if { $mip_raised == 0 } { cb_load_serie }
+    if { $mip_raised == 1 } { cb_load_mip }
+    set image [ $widgets(ibrw) lastimage ]
+    set pos [ expr [ lindex [ split [ lindex [ lindex $image 2 ] 0 ] _ ] 1 ] + [ $widgets(sclSerie) cget -from ] ]
+    $widgets(sclSerie) set $pos
+
+    if { $i == 0 } { set image_browser::first_image $pos }
+    if { $i == 1 } { set image_browser::last_image $pos }
+    puts "$image_browser::first_image : $image_browser::last_image"
+
+}
+
+proc image_browser::set_data2 { } {
+
+    # For programming facilities
+    upvar image_browser::return_nothing return_nothing
+
+    set return_nothing 1
+
+}
+
+proc image_browser::get_data { } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+    upvar image_browser::mip_raised mip_raised
+    upvar image_browser::return_nothing return_nothing
+
+    if { $return_nothing == 0 } {
+
+        set fr [ string trimleft [ $widgets(sclSerie) cget -from ] 0 ]
+        set f  [ string trimleft $image_browser::first_image 0 ]
+        set l  [ string trimleft $image_browser::last_image 0 ]
+
+        set f [ expr $f - $fr ]
+        set l [ expr $l - $fr ]
+
+        set f [ expr ( $f < $l )? $f: $l ]
+        set l [ expr ( $f > $l )? $f: $l ]
+
+        set data [ $widgets(ibrw) curselection ]
+        set roi  [ $widgets(impp) roi ]
+        set roi  [ list \
+            [ lindex [ split [ lindex $roi 0 ] . ] 0 ] \
+            [ lindex [ split [ lindex $roi 2 ] . ] 0 ] \
+            [ lindex [ split [ lindex $roi 1 ] . ] 0 ] \
+            [ lindex [ split [ lindex $roi 3 ] . ] 0 ] \
+            [ lindex [ split $f . ] 0 ] \
+            [ lindex [ split $l . ] 0 ] \
+        ]
+
+        return $roi
+
+    } else { return "" }
+
+}
+
+proc image_browser::set_mouse_left_events { mask } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+
+    if { [ expr ( $mask & 0x1 ) ] == 0x1 }  { $widgets(impp) setnone }
+
+}
+
+proc image_browser::set_mouse_right_events { mask } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+
+    if { [ expr ( $mask & 0x1 ) ] == 0x1 }  { catch { $widgets(impp) setarea } }
+    if { [ expr ( $mask & 0x2 ) ] == 0x2 }  { catch { $widgets(impp) setlinear } }
+
+}
+
+proc image_browser::clear { } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+
+    catch { $widgets(impp) clean }
+
+}
+
+proc image_browser::do_profil { } {
+
+    # For programming facilities
+    upvar image_browser::widgets widgets
+    upvar image_browser::actual_image actual_image
+
+    set data [ $widgets(impp) getprofildata ]
+
+    if { [ lindex $data 0 ] == 1 } {
+
+        busy hold .
+        update
+
+        set n [ $widgets(sclSerie) get ]
+        set f [ $widgets(sclSerie) cget -from ]
+        set i [ expr $n - $f ]
+        set i [ lindex [ split $i . ] 0 ]
+        set avals [ GetProfilFromTotalVolume_dll [ lindex $data 1 ] [ lindex $data 2 ] $i [ lindex $data 3 ] [ lindex $data 4 ] $i ]
+        #avals[ 0 ] = min
+        #avals[ 1 ] = max
+        #avals[ 2 ] = avg
+        #avals[ 3 ] = sd
+        #avals[ 4 ] = size
+        set xvals {}
+        set yvals {}
+        set size [ lindex $avals 4 ]
+        for { set i 0 } { $i < $size } { incr i } {
+
+            lappend xvals $i
+            lappend yvals [ lindex $avals [ expr $i + 5 ] ]
+
+        }
+
+        catch { destroy "$widgets(impp)\.fnProfil" }
+        toplevel "$widgets(impp)\.fnProfil" -width 640 -height 480
+
+        graph $widgets(impp)\.fnProfil.gr \
+            -background white \
+            -barmode infront \
+            -borderwidth 0 \
+            -foreground black \
+            -halo 8 \
+            -height 480 \
+            -plotpadx {8 8} \
+            -plotpady {8 8} \
+            -plotrelief groove \
+            -width 640
+        pack $widgets(impp)\.fnProfil.gr -anchor center -expand 1 -fill both -side top 
+        $widgets(impp)\.fnProfil.gr axis configure y -min 0.00
+        $widgets(impp)\.fnProfil.gr grid configure  -hide no
+        $widgets(impp)\.fnProfil.gr legend configure -position bottom -font {Helvetica -14 bold}
+
+        $widgets(impp)\.fnProfil.gr element create "Profile" \
+            -color #0000ff \
+            -symbol "" \
+            -xdata $xvals \
+            -ydata $yvals
+
+        set x [ expr $size / 2 ]
+        set y [ expr [ lindex $avals 1 ] * 0.75 ]
+        set text "$string_table::str_min = [ lindex $avals 0 ]\n$string_table::str_max = [ lindex $avals 1 ]\n$string_table::str_avg = [ lindex $avals 2 ]\n$string_table::str_std = [ lindex $avals 3 ]\n$string_table::str_nro_pix = [ lindex $avals 4 ]"
+        $widgets(impp)\.fnProfil.gr marker create text -text $text \
+            -coords "$x $y" -font { Helvetica 20 }
+
+        busy release .
+        update
+
+    } elseif { [ lindex $data 0 ] == 2 } {
+
+        busy hold .
+        update
+        set n [ $widgets(sclSerie) get ]
+        set f [ $widgets(sclSerie) cget -from ]
+        set i [ expr $n - $f ]
+        set i [ lindex [ split $i . ] 0 ]
+        set avals [ GetAreaValuesFromTotalVolume_dll [ lindex $data 1 ] [ lindex $data 2 ] $i [ lindex $data 3 ] [ lindex $data 4 ] $i ]
+        $widgets(impp) addtext "$string_table::str_min = [ lindex $avals 0 ]\n$string_table::str_max = [ lindex $avals 1 ]\n$string_table::str_avg = [ lindex $avals 2 ]\n$string_table::str_std = [ lindex $avals 3 ]\n$string_table::str_nro_pix = [ lindex $avals 4 ]" [ lindex $data 3 ] [ lindex $data 4 ]
+        busy release .
+        update
+
+    } elseif { [ lindex $data 0 ] == 3 } {
+
+        set n [ $widgets(sclSerie) get ]
+        set f [ $widgets(sclSerie) cget -from ]
+        set i [ expr $n - $f ]
+        set i [ lindex [ split $i . ] 0 ]
+        set val [ GetImageIntensity_dll [ lindex $data 3 ] [ lindex $data 4 ] $i ]
+        $widgets(impp) addtext "$string_table::str_int = $val" [ lindex $data 3 ] [ lindex $data 4 ]
+
+    } elseif { [ lindex $data 0 ] == 4 } {
+
+        $widgets(impp) clean
+
+    }
+
+}
+
+proc image_browser::back { } {
+
+    # For programming facilities
+    upvar image_browser::shown shown
+
+    set ret $shown
+    set shown 0
+
+    return $ret
+
+}
+
+proc image_browser::controls { { id -1 } } {
+
+    if { $id == -1 } {
+
+        global_window::active_controls 0
+
+    } else {
+
+        if { $id == 0 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_3D        | \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_clear     | \
+                $global_window::en_intensity | \
+                $global_window::en_linear    | \
+                $global_window::en_area      | \
+                $global_window::en_back      | \
+                0
+            ]
+
+        } elseif { $id == 1 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_clear     | \
+                $global_window::en_intensity | \
+                $global_window::en_linear    | \
+                $global_window::en_area      | \
+                $global_window::en_back      | \
+                0
+            ]
+
+        }
+
+    }
+
+}
+
+# EOF - image_browser.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/planes_window.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/planes_window.tcl
new file mode 100644 (file)
index 0000000..1eddf37
--- /dev/null
@@ -0,0 +1,2932 @@
+package require BLT
+catch { namespace import blt::* }
+
+namespace eval planes_window {
+
+    # public interface
+    namespace export        \
+        create              \
+        positionate         \
+        forget
+    
+    # variables
+    variable widgets
+
+    variable reference_actor
+    variable surf_data
+    variable actual_actor
+    variable quant_actor
+    variable bounds
+    variable intRange
+    variable axis_index -1
+    variable nClicks 0
+    variable quantifing 0
+    variable first_point_quant
+    variable last_point_quant
+    variable real_first_point_quant -1
+    variable real_last_point_quant  -1
+    variable actor_debug1
+    variable actor_debug2
+    variable initX
+    variable initY
+    variable initWindow
+    variable initLevel
+    variable man_points {}
+    variable show_hs_var
+    variable first_quant
+    variable local_id
+    variable show_rings
+    variable rings_index {}
+    variable quant_shown 0
+
+    variable actual_area    0.00
+    variable actual_peri    0.00
+    variable actual_darea   0.00
+    variable actual_dperi   0.00
+    variable actual_dmax    0.00
+    variable actual_dmin    0.00
+    variable actual_davg    0.00
+    variable actual_sten    0.00
+    variable actual_partial 0.00
+    variable actual_total   0.00
+
+    variable actual_quant_x     {}
+    variable actual_quant_area  {}
+    variable actual_quant_peri  {}
+    variable actual_quant_darea {}
+    variable actual_quant_dperi {}
+    variable actual_quant_dmax  {}
+    variable actual_quant_dmin  {}
+    variable actual_quant_davg  {}
+    variable actual_quant_sten  {}
+    variable shown 0
+    variable given_points 0
+
+}
+
+proc planes_window::reset { parent } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    set widgets(base)              "$parent"
+    set widgets(planes_wnd)        "$parent\.planes_wnd"
+    set widgets(frTop)             "$parent\.planes_wnd.frTop"
+    set widgets(frLeft)            "$parent\.planes_wnd.frTop.frLeft"
+    set widgets(frRight)           "$parent\.planes_wnd.frTop.frRight"
+    set widgets(work3D)            "$parent\.planes_wnd.frTop.frLeft.work3D"
+    set widgets(frControls)        "$parent\.planes_wnd.frTop.frLeft.frControls"
+    set widgets(frPlanes)          "$parent\.planes_wnd.frTop.frLeft.frControls.frPlanes"
+    set widgets(btnSHealthySlice)  "$parent\.planes_wnd.frTop.frLeft.frControls.frPlanes.btnSHealthySlice"
+    set widgets(btnPerpendicular)  "$parent\.planes_wnd.frTop.frLeft.frControls.frPlanes.btnPerpendicular"
+    set widgets(frColor)           "$parent\.planes_wnd.frTop.frLeft.frControls.frColor"
+    set widgets(btnGreyScale)      "$parent\.planes_wnd.frTop.frLeft.frControls.frColor.btnGreyScale"
+    set widgets(btnColor)          "$parent\.planes_wnd.frTop.frLeft.frControls.frColor.btnColor"
+    set widgets(frSurfaces)        "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces"
+    set widgets(btnTransparent)    "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnTransparent"
+    set widgets(btnEdge)           "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnEdge"
+    set widgets(btnOpaque)         "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnOpaque"
+    set widgets(btnShowS)          "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnShowS"
+    set widgets(btnRings)          "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnRings"
+    set widgets(btnSurface)        "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnSurface"
+    set widgets(btnSColor)         "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.btnSColor"
+    set widgets(lbl001)            "$parent\.planes_wnd.frTop.frLeft.frControls.frSurfaces.lbl001"
+    set widgets(frBrowsers)        "$parent\.planes_wnd.frTop.frLeft.frControls.frBrowsers"
+    set widgets(sclSlice)          "$parent\.planes_wnd.frTop.frLeft.frControls.frBrowsers.sclSlice"
+    set widgets(sclIsoVal)         "$parent\.planes_wnd.frTop.frLeft.frControls.frBrowsers.sclIsoVal"
+    set widgets(sclOpacity)        "$parent\.planes_wnd.frTop.frLeft.frControls.frBrowsers.sclOpacity"
+    set widgets(fr2D)              "$parent\.planes_wnd.frTop.frRight.fr2D"
+    set widgets(image2D)           "$parent\.planes_wnd.frTop.frRight.fr2D.image2D"
+    set widgets(frControls2D)      "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D"
+    set widgets(fr001)             "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001"
+    set widgets(btnContour)        "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnContour"
+    set widgets(btnClean)          "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnClean"
+    set widgets(btnHealthySlice)   "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnHealthySlice"
+    set widgets(btnCalculated)     "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnCalculated"
+    set widgets(btnPause)          "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnPause"
+    set widgets(btnEraseQuant)     "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnEraseQuant"
+    set widgets(btnSetPoint)       "$parent\.planes_wnd.frTop.frRight.fr2D.frControls2D.fr001.btnSetPoint"
+    set widgets(frBLT)             "$parent\.planes_wnd.frTop.frRight.frBLT"
+    set widgets(graph)             "$parent\.planes_wnd.frTop.frRight.frBLT.graph"
+    set widgets(frData)            "$parent\.planes_wnd.frData"
+    set widgets(frPartialAxis)     "$parent\.planes_wnd.frData.frPartialArea"
+    set widgets(frTotalAxis)       "$parent\.planes_wnd.frData.frTotalArea"
+    set widgets(frArea)            "$parent\.planes_wnd.frData.frArea"
+    set widgets(frPerimeter)       "$parent\.planes_wnd.frData.frPerimeter"
+    set widgets(frDiamArea)        "$parent\.planes_wnd.frData.frDiamArea"
+    set widgets(frDiamPerimeter)   "$parent\.planes_wnd.frData.frDiamPerimeter"
+    set widgets(frDiamMax)         "$parent\.planes_wnd.frData.frDiamMax"
+    set widgets(frDiamMin)         "$parent\.planes_wnd.frData.frDiamMin"
+    set widgets(frDiamAvg)         "$parent\.planes_wnd.frData.frDiamAvg"
+    set widgets(frStenosis)        "$parent\.planes_wnd.frData.frStenosis"
+    set widgets(lblArea)           "$parent\.planes_wnd.frData.frArea.lblArea"
+    set widgets(lblPerimeter)      "$parent\.planes_wnd.frData.frPerimeter.lblPerimeter"
+    set widgets(lblDiamArea)       "$parent\.planes_wnd.frData.frDiamArea.lblDiamArea"
+    set widgets(lblDiamPerimeter)  "$parent\.planes_wnd.frData.frDiamPerimeter.lblDiamPerimeter"
+    set widgets(lblDiamMax)        "$parent\.planes_wnd.frData.frDiamMax.lblDiamMax"
+    set widgets(lblDiamMin)        "$parent\.planes_wnd.frData.frDiamMin.lblDiamMin"
+    set widgets(lblDiamAvg)        "$parent\.planes_wnd.frData.frDiamAvg.lblDiamAvg"
+    set widgets(lblStenosis)       "$parent\.planes_wnd.frData.frStenosis.lblStenosis"
+    set widgets(lblPartialAxis)    "$parent\.planes_wnd.frData.frPartialArea.lblPartialArea"
+    set widgets(lblTotalAxis)      "$parent\.planes_wnd.frData.frTotalArea.lblTotalArea"
+    set widgets(vlblArea)          "$parent\.planes_wnd.frData.frArea.vlblArea"
+    set widgets(vlblPerimeter)     "$parent\.planes_wnd.frData.frPerimeter.vlblPerimeter"
+    set widgets(vlblDiamArea)      "$parent\.planes_wnd.frData.frDiamArea.vlblDiamArea"
+    set widgets(vlblDiamPerimeter) "$parent\.planes_wnd.frData.frDiamPerimeter.vlblDiamPerimeter"
+    set widgets(vlblDiamMax)       "$parent\.planes_wnd.frData.frDiamMax.vlblDiamMax"
+    set widgets(vlblDiamMin)       "$parent\.planes_wnd.frData.frDiamMin.vlblDiamMin"
+    set widgets(vlblDiamAvg)       "$parent\.planes_wnd.frData.frDiamAvg.vlblDiamAvg"
+    set widgets(vlblStenosis)      "$parent\.planes_wnd.frData.frStenosis.vlblStenosis"
+    set widgets(vlblPartialAxis)   "$parent\.planes_wnd.frData.frPartialArea.vlblPartialArea"
+    set widgets(vlblTotalAxis)     "$parent\.planes_wnd.frData.frTotalArea.vlblTotalArea"
+
+}
+
+proc planes_window::create { parent id } {
+
+    # For programming facilities
+    upvar planes_window::widgets        widgets
+    upvar planes_window::local_id       local_id
+    upvar planes_window::actual_area    actual_area
+    upvar planes_window::actual_peri    actual_peri
+    upvar planes_window::actual_darea   actual_darea
+    upvar planes_window::actual_dperi   actual_dperi
+    upvar planes_window::actual_dmax    actual_dmax
+    upvar planes_window::actual_dmin    actual_dmin
+    upvar planes_window::actual_davg    actual_davg
+    upvar planes_window::actual_sten    actual_sten
+    upvar planes_window::actual_partial actual_partial
+    upvar planes_window::actual_total   actual_total
+    upvar planes_window::quant_shown    quant_shown
+    upvar planes_window::shown          shown
+
+    set shown 0
+
+    set local_id $id
+    set quant_shown 0
+
+    planes_window::reset $parent
+
+    # frames
+    frame $widgets(planes_wnd)   -height 100 -width 125 
+    frame $widgets(frTop)        -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frLeft)       -borderwidth 0 -height 1 -relief flat   -width 1
+    frame $widgets(frControls)   -borderwidth 2 -height 112 -relief groove -width 100
+    frame $widgets(frPlanes)     -borderwidth 0 -height 1 -relief groove -width 1
+    frame $widgets(frColor)      -borderwidth 0 -height 1 -relief groove -width 1
+    frame $widgets(frSurfaces)   -borderwidth 0 -height 1 -relief groove -width 1
+    frame $widgets(frBrowsers)   -borderwidth 0 -height 1 -relief groove -width 1
+    frame $widgets(frRight)      -borderwidth 0 -height 1 -relief flat   -width 1
+    frame $widgets(fr2D)         -borderwidth 0 -height 1 -relief flat   -width 1
+    frame $widgets(frControls2D) -borderwidth 0 -height 1 -relief flat   -width 1
+    frame $widgets(fr001)        -borderwidth 2 -height 1 -relief groove -width 1
+    frame $widgets(frBLT)        -borderwidth 0 -height 1 -relief flat   -width 1
+    frame $widgets(frData)       -borderwidth 0 -height 1 -relief flat -width 1
+
+    frame $widgets(frPartialAxis)   -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frTotalAxis)     -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frArea)          -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frPerimeter)     -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frDiamArea)      -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frDiamPerimeter) -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frDiamMax)       -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frDiamMin)       -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frDiamAvg)       -borderwidth 0 -height 1 -relief flat -width 1
+    frame $widgets(frStenosis)      -borderwidth 0 -height 1 -relief flat -width 1
+    
+    # checkbuttons
+    checkbutton $widgets(btnSHealthySlice)  -text $string_table::str_healthy_slice         -variable var_healthy -command { planes_window::show_hs_3D $var_healthy } 
+    checkbutton $widgets(btnShowS)          -text $string_table::str_show_surf             -variable var_showS   -command { planes_window::set_IsoActor [ expr ( $var_showS == 0 )? 4: $planes_window::actual_actor ] }
+    checkbutton $widgets(btnRings)          -text $string_table::str_rings_visible         -variable var_rings   -command { planes_window::show3D_rings_contour $var_rings }
+    checkbutton $widgets(btnSurface)        -text $string_table::str_rec_surface           -variable var_rec     -command { planes_window::load_reconstructed_surface $var_rec }
+    checkbutton $widgets(btnPerpendicular)  -text $string_table::str_perpendicular_section -variable var_perp    -command { planes_window::put_plane_3D $var_perp }
+
+    # radiobuttons
+    radiobutton $widgets(btnGreyScale)   -text $string_table::str_greyscale -variable color_type -value 1 -command { planes_window::set_color_table $color_type }
+    radiobutton $widgets(btnColor)       -text $string_table::str_color     -variable color_type -value 2 -command { planes_window::set_color_table $color_type }
+
+    radiobutton $widgets(btnOpaque)      -text $string_table::str_opaque      -variable surf_type -value 1 -command { planes_window::set_IsoActor $surf_type }
+    radiobutton $widgets(btnTransparent) -text $string_table::str_transparent -variable surf_type -value 2 -command { planes_window::set_IsoActor $surf_type }
+    radiobutton $widgets(btnEdge)        -text $string_table::str_edge_points -variable surf_type -value 3 -command { planes_window::set_IsoActor $surf_type }
+
+    # buttons
+    button $widgets(btnSColor)       -command "planes_window::change_color"
+
+    button $widgets(btnContour)      -text $string_table::str_contour
+    button $widgets(btnClean)        -text $string_table::str_clean         -command "planes_window::clean_contour"
+    button $widgets(btnHealthySlice) -text $string_table::str_healthy_slice -command "planes_window::set_healthy_slice"
+    button $widgets(btnCalculated)   -text $string_table::str_calculated    -command "planes_window::contour_calculated"
+    button $widgets(btnPause)        -text $string_table::str_pause         -command "planes_window::pause"
+    button $widgets(btnEraseQuant)   -text $string_table::str_erase_quant   -command "planes_window::erase_all_data"
+    button $widgets(btnSetPoint)     -text "Point..." -command "planes_window::set_quant_point_from_scale"
+
+    # scales
+    scale $widgets(sclSlice)   -label $string_table::str_slice   -orient horizontal 
+    scale $widgets(sclIsoVal)  -label $string_table::str_isoval  -orient horizontal 
+    scale $widgets(sclOpacity) -label $string_table::str_opacity -orient horizontal 
+
+    # labels
+    label $widgets(lbl001)                                         -text $string_table::str_color 
+    label $widgets(lblArea)          -borderwidth 1 -relief groove -text $string_table::str_area
+    label $widgets(lblPerimeter)     -borderwidth 1 -relief groove -text $string_table::str_peri
+    label $widgets(lblDiamArea)      -borderwidth 1 -relief groove -text $string_table::str_diam_area
+    label $widgets(lblDiamPerimeter) -borderwidth 1 -relief groove -text $string_table::str_diam_peri
+    label $widgets(lblDiamMax)       -borderwidth 1 -relief groove -text $string_table::str_diam_max
+    label $widgets(lblDiamMin)       -borderwidth 1 -relief groove -text $string_table::str_diam_min
+    label $widgets(lblDiamAvg)       -borderwidth 1 -relief groove -text $string_table::str_diam_avg
+    label $widgets(lblStenosis)      -borderwidth 1 -relief groove -text Stenosis
+    label $widgets(lblPartialAxis)   -borderwidth 1 -relief groove -text "Partial Axis Length"
+    label $widgets(lblTotalAxis)     -borderwidth 1 -relief groove -text "Total Axis Length"
+
+    label $widgets(vlblArea)          -borderwidth 1 -relief groove -textvariable planes_window::actual_area
+    label $widgets(vlblPerimeter)     -borderwidth 1 -relief groove -textvariable planes_window::actual_peri
+    label $widgets(vlblDiamArea)      -borderwidth 1 -relief groove -textvariable planes_window::actual_darea
+    label $widgets(vlblDiamPerimeter) -borderwidth 1 -relief groove -textvariable planes_window::actual_dperi
+    label $widgets(vlblDiamMax)       -borderwidth 1 -relief groove -textvariable planes_window::actual_dmax
+    label $widgets(vlblDiamMin)       -borderwidth 1 -relief groove -textvariable planes_window::actual_dmin
+    label $widgets(vlblDiamAvg)       -borderwidth 1 -relief groove -textvariable planes_window::actual_davg
+    label $widgets(vlblStenosis)      -borderwidth 1 -relief groove -textvariable planes_window::actual_sten
+    label $widgets(vlblPartialAxis)   -borderwidth 1 -relief groove -textvariable planes_window::actual_partial
+    label $widgets(vlblTotalAxis)     -borderwidth 1 -relief groove -textvariable planes_window::actual_total
+
+    # BLT graph
+    graph $widgets(graph) \
+        -background white \
+        -barmode infront \
+        -borderwidth 0 \
+        -foreground black \
+        -halo 8 \
+        -height 75 \
+        -plotpadx {8 8} \
+        -plotpady {8 8} \
+        -plotrelief groove \
+        -width 480 
+
+}
+
+proc planes_window::positionate { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::local_id  local_id
+    upvar planes_window::first_quant  first_quant
+    upvar planes_window::local_id  local_id
+    upvar planes_window::shown          shown
+    upvar planes_window::given_points  given_points
+
+    set given_points 0
+
+    set shown 1
+
+    set global_window::show_params 0
+
+    set first_quant 1
+    set global_window::window_shown $local_id
+
+    pack  $widgets(planes_wnd)       -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frTop)            -anchor center -expand 1 -fill both -side top
+    pack  $widgets(frLeft)           -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(work3D)           -anchor center -expand 1 -fill both -side top
+    pack  $widgets(frControls)       -anchor center -expand 0 -fill both -side top
+    place $widgets(frPlanes)         -x 10 -y 2 -width 300 -height 25 -anchor nw -bordermode ignore 
+    place $widgets(btnSHealthySlice) -x 5 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(btnPerpendicular) -x 100 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(frColor)          -x 350 -y 2 -width 150 -height 25 -anchor nw -bordermode ignore 
+    place $widgets(btnGreyScale)     -x 5 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(btnColor)         -x 80 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(frSurfaces)       -x 10 -y 27 -width 400 -height 25 -anchor nw -bordermode ignore 
+    #place $widgets(btnSurface)       -x 5 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(btnRings)         -x 150 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(btnShowS)         -x 250 -y 0 -anchor nw -bordermode ignore 
+    place $widgets(frBrowsers)       -x 10 -y 50 -width 515 -height 60 -anchor nw -bordermode ignore
+    place $widgets(sclSlice)         -x 5 -y 0 -width 163 -height 60 -anchor nw -bordermode ignore 
+    place $widgets(sclIsoVal)        -x 175 -y 0 -width 163 -height 60 -anchor nw -bordermode ignore 
+    place $widgets(sclOpacity)       -x 350 -y 0 -width 158 -height 60 -anchor nw -bordermode ignore 
+    pack  $widgets(frRight)          -anchor center -expand 0 -fill both -side left
+    pack  $widgets(fr2D)             -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(image2D)          -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(frControls2D)     -anchor center -expand 0 -fill x -side top 
+    pack  $widgets(fr001)            -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnContour)       -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnClean)         -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnHealthySlice)  -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnCalculated)    -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnPause)         -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnEraseQuant)    -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnSetPoint)      -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(frBLT)            -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(graph)            -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(frData)           -anchor center -expand 0 -fill x -side top 
+    pack  $widgets(frPartialAxis)    -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frTotalAxis)      -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frArea)           -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frPerimeter)      -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frDiamArea)       -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frDiamPerimeter)  -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frDiamMax)        -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frDiamMin)        -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frDiamAvg)        -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(frStenosis)       -anchor nw -expand 1 -fill both -side left 
+    pack  $widgets(lblArea)           -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblPerimeter)      -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblDiamArea)       -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblDiamPerimeter)  -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblDiamMax)        -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblDiamMin)        -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblDiamAvg)        -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblStenosis)       -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblPartialAxis)   -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(lblTotalAxis)     -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblArea)          -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblPerimeter)     -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblDiamArea)      -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblDiamPerimeter) -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblDiamMax)       -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblDiamMin)       -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblDiamAvg)       -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblStenosis)      -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblPartialAxis)   -anchor center -expand 1 -fill both -side top 
+    pack  $widgets(vlblTotalAxis)     -anchor center -expand 1 -fill both -side top 
+
+}
+
+proc planes_window::forget { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::shown   shown
+
+    set shown 0
+
+    pack  forget $widgets(vlblStenosis)
+    pack  forget $widgets(vlblDiamAvg)
+    pack  forget $widgets(vlblDiamMin)
+    pack  forget $widgets(vlblDiamMax)
+    pack  forget $widgets(vlblDiamPerimeter)
+    pack  forget $widgets(vlblDiamArea)
+    pack  forget $widgets(vlblPerimeter)
+    pack  forget $widgets(vlblArea)
+    pack  forget $widgets(lblStenosis)
+    pack  forget $widgets(lblDiamAvg)
+    pack  forget $widgets(lblDiamMin)
+    pack  forget $widgets(lblDiamMax)
+    pack  forget $widgets(lblDiamPerimeter)
+    pack  forget $widgets(lblDiamArea)
+    pack  forget $widgets(lblPerimeter)
+    pack  forget $widgets(lblArea)
+    pack  forget $widgets(frStenosis)
+    pack  forget $widgets(frDiamAvg)
+    pack  forget $widgets(frDiamMin)
+    pack  forget $widgets(frDiamMax)
+    pack  forget $widgets(frDiamPerimeter)
+    pack  forget $widgets(frDiamArea)
+    pack  forget $widgets(frPerimeter)
+    pack  forget $widgets(frArea)
+    pack  forget $widgets(frData)
+    pack  forget $widgets(graph)
+    pack  forget $widgets(frBLT)
+    pack  forget $widgets(btnEraseQuant)
+    pack  forget $widgets(btnPause)
+    pack  forget $widgets(btnCalculated)
+    pack  forget $widgets(btnHealthySlice)
+    pack  forget $widgets(btnClean)
+    pack  forget $widgets(btnContour)
+    pack  forget $widgets(fr001)
+    pack  forget $widgets(frControls2D)
+    pack  forget $widgets(image2D)
+    pack  forget $widgets(fr2D)
+    pack  forget $widgets(frRight)
+    place forget $widgets(sclOpacity)
+    place forget $widgets(sclIsoVal)
+    place forget $widgets(sclSlice)
+    place forget $widgets(frBrowsers)
+    place forget $widgets(lbl001)
+    place forget $widgets(btnSColor)
+    place forget $widgets(btnShowS)
+    place forget $widgets(btnSurface)
+    place forget $widgets(btnRings)
+    place forget $widgets(btnOpaque)
+    place forget $widgets(btnEdge)
+    place forget $widgets(btnTransparent)
+    place forget $widgets(frSurfaces)
+    place forget $widgets(btnColor)
+    place forget $widgets(btnGreyScale)
+    place forget $widgets(frColor)
+    place forget $widgets(btnPerpendicular)
+    place forget $widgets(btnSHealthySlice)
+    place forget $widgets(frPlanes)
+    pack  forget $widgets(frControls)
+    pack  forget $widgets(work3D)
+    pack  forget $widgets(frLeft)
+    pack  forget $widgets(frTop)
+    pack  forget $widgets(planes_wnd)
+
+}
+
+proc planes_window::set_data { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index       axis_index
+    upvar planes_window::first_point_quant first_point_quant
+    upvar planes_window::last_point_quant last_point_quant
+    upvar planes_window::first_quant       first_quant
+    upvar planes_window::local_id  local_id
+    upvar planes_window::actual_area  actual_area
+    upvar planes_window::actual_peri  actual_peri
+    upvar planes_window::actual_darea actual_darea
+    upvar planes_window::actual_dperi actual_dperi
+    upvar planes_window::actual_dmax  actual_dmax
+    upvar planes_window::actual_dmin  actual_dmin
+    upvar planes_window::actual_davg  actual_davg
+    upvar planes_window::actual_sten  actual_sten
+    upvar planes_window::rings_index  rings_index
+    upvar planes_window::quant_shown  quant_shown
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+    upvar planes_window::actual_partial  actual_partial
+    upvar planes_window::actual_total    actual_total
+
+    set real_first_point_quant -1
+    set real_last_point_quant -1
+    planes_window::controls 1
+
+    catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+    catch { hs_actor_$widgets(work3D) Delete }
+    catch { hs_mapper_$widgets(work3D) Delete }
+    catch { hs_grid_$widgets(work3D) Delete }
+    catch { hs_points_$widgets(work3D) Delete }
+    catch { hs_poly_line_$widgets(work3D) Delete }
+    foreach i $rings_index {
+
+        catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+        catch { cont3DActor_{$widgets(work3D)}_{$i}    Delete }
+        catch { cont3DMapper_{$widgets(work3D)}_{$i}   Delete }
+        catch { cont3DGrid_{$widgets(work3D)}_{$i}     Delete }
+        catch { cont3DPolyLine_{$widgets(work3D)}_{$i} Delete }
+        catch { cont3DPoints_{$widgets(work3D)}_{$i}   Delete }
+
+    }
+    set rings_index [ list ]
+
+    set actual_area  0.00
+    set actual_peri  0.00
+    set actual_darea 0.00
+    set actual_dperi 0.00
+    set actual_dmax  0.00
+    set actual_dmin  0.00
+    set actual_davg  0.00
+    set actual_sten  0.00
+    set quant_shown  0
+    set global_window::data_loaded [ expr $global_window::data_loaded | $local_id ]
+
+    set actual_quant_x     [ list ]
+    set actual_quant_area  [ list ]
+    set actual_quant_peri  [ list ]
+    set actual_quant_darea [ list ]
+    set actual_quant_dperi [ list ]
+    set actual_quant_dmax  [ list ]
+    set actual_quant_dmin  [ list ]
+    set actual_quant_davg  [ list ]
+    set actual_quant_sten  [ list ]
+
+    planes_window::clean_BLT
+    catch { $widgets(graph) marker delete line_healthy_slice }
+    
+    set first_quant 1
+
+    # vtk controls
+    destroy $widgets(work3D)
+    destroy $widgets(image2D)
+    vtkTkRenderWidget $widgets(work3D)  -width 30 -height 30
+    vtkTkRenderWidget $widgets(image2D) -width 30 -height 30
+
+    # TODO: change
+    bindBasicEvents $widgets(work3D)
+    bindBasicEvents $widgets(image2D)
+
+    bind $widgets(work3D) <Double-Button-1> "planes_window::select_axis_point %x %y"
+    bind $widgets(work3D) <Double-Button-2> "planes_window::set_plane_3D %x %y"
+    bind $widgets(work3D) <Double-Button-3> "planes_window::set_plane_3D %x %y"
+
+    bind $widgets(image2D) <Double-Button-1> "planes_window::extract_contour %x %y 1"
+    bind $widgets(image2D) <Double-Button-3> "planes_window::add_point_contour_manual %x %y"
+
+    catch { renderer_$widgets(work3D) Delete }
+    catch { renderer_$widgets(image2D) Delete }
+    vtkRenderer renderer_$widgets(work3D)
+    vtkRenderer renderer_$widgets(image2D)
+
+    set render [ $widgets(work3D) GetRenderWindow ]
+#    renderer_$widgets(work3D) SetBackground 0.5 0.5 0.5
+       renderer_$widgets(work3D) SetBackground 0.75 0.75 0.75
+#    renderer_$widgets(work3D) SetBackground 0 0 0
+    $render AddRenderer renderer_$widgets(work3D)
+    $render SetSize 1 1
+
+    set render [ $widgets(image2D) GetRenderWindow ]
+#    renderer_$widgets(image2D) SetBackground 0.5 0.5 0.5
+    renderer_$widgets(image2D) SetBackground 0 0 0
+    $render AddRenderer renderer_$widgets(image2D)
+    $render SetSize 1 1
+
+    set range    [ GetImageRange_dll ]
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+    $widgets(btnSColor) configure -background #faebd6
+    set r 0.9803
+    set g 0.9215
+    set b 0.8392
+    set actual_total [ change_float_precision [ getAxisLength_dll ] 2 ]
+    set actual_partial 0.00
+
+    catch { renderer_$widgets(work3D) RemoveActor outlineActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor isoActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor edgeActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveVolume opaqueVol_$widgets(work3D) }
+    catch { outlineActor_$widgets(work3D)  Delete }
+    catch { outlineMapper_$widgets(work3D) Delete }
+    catch { outlineSource_$widgets(work3D) Delete }
+    catch { opaqueVol_$widgets(work3D)     Delete }
+    catch { isoCast_$widgets(work3D)       Delete }
+    catch { isoFunc_$widgets(work3D)       Delete }
+    catch { opaqueProp_$widgets(work3D)    Delete }
+    catch { colorFunc_$widgets(work3D)     Delete }
+    catch { constFunc_$widgets(work3D)     Delete }
+    catch { edgeActor_$widgets(work3D)     Delete }
+    catch { edgeMapper_$widgets(work3D)    Delete }
+    catch { edgePoints_$widgets(work3D)    Delete }
+    catch { isoActor_$widgets(work3D)      Delete }
+    catch { isoMapper_$widgets(work3D)     Delete }
+    catch { cubes_$widgets(work3D)         Delete }
+    catch { struct_$widgets(work3D)        Delete }
+
+    # 3D outline
+    vtkCubeSource outlineSource_$widgets(work3D)
+        outlineSource_$widgets(work3D) SetXLength [ expr [ lindex $bounds 1 ] - [ lindex $bounds 0 ] ]
+        outlineSource_$widgets(work3D) SetYLength [ expr [ lindex $bounds 3 ] - [ lindex $bounds 2 ] ]
+        outlineSource_$widgets(work3D) SetZLength [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ]
+        outlineSource_$widgets(work3D) SetCenter  \
+            [ expr ( [ lindex $bounds 0 ] + [ lindex $bounds 1 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 2 ] + [ lindex $bounds 3 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 4 ] + [ lindex $bounds 5 ] ) / 2 ]
+
+    vtkPolyDataMapper outlineMapper_$widgets(work3D)
+        outlineMapper_$widgets(work3D) SetInput [ outlineSource_$widgets(work3D) GetOutput ]
+        outlineMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor outlineActor_$widgets(work3D)
+        outlineActor_$widgets(work3D) SetMapper outlineMapper_$widgets(work3D)
+        [ outlineActor_$widgets(work3D) GetProperty ] SetRepresentationToWireframe
+        [ outlineActor_$widgets(work3D) GetProperty ] SetColor    0.7 0.00 0.9
+        [ outlineActor_$widgets(work3D) GetProperty ] SetAmbient  1
+        [ outlineActor_$widgets(work3D) GetProperty ] SetDiffuse  0
+        [ outlineActor_$widgets(work3D) GetProperty ] SetSpecular 0
+
+    # Surface
+    vtkImageToStructuredPoints struct_$widgets(work3D)
+        struct_$widgets(work3D) SetInput $resample
+        struct_$widgets(work3D) Update
+
+    vtkMarchingCubes cubes_$widgets(work3D)
+        cubes_$widgets(work3D) SetInput [ struct_$widgets(work3D) GetOutput ]
+        cubes_$widgets(work3D) SetValue 0 [ expr [ lindex $range 1 ] / 4 ]
+
+    vtkPolyDataMapper isoMapper_$widgets(work3D)
+        isoMapper_$widgets(work3D) SetInput [ cubes_$widgets(work3D) GetOutput ]
+        isoMapper_$widgets(work3D) ScalarVisibilityOff
+        isoMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor isoActor_$widgets(work3D)
+        isoActor_$widgets(work3D) SetMapper isoMapper_$widgets(work3D)
+        eval [ isoActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+        eval [ isoActor_$widgets(work3D) GetProperty ] SetOpacity 0.5
+
+    # Edge points
+    vtkEdgePoints edgePoints_$widgets(work3D)
+        edgePoints_$widgets(work3D) SetInput $resample
+        edgePoints_$widgets(work3D) SetValue [ expr [ lindex $range 1 ] / 4 ]
+
+    vtkDataSetMapper edgeMapper_$widgets(work3D)
+        edgeMapper_$widgets(work3D) SetInput [ edgePoints_$widgets(work3D) GetOutput ]
+        edgeMapper_$widgets(work3D) ScalarVisibilityOff
+        edgeMapper_$widgets(work3D) ImmediateModeRenderingOn
+    
+    vtkActor edgeActor_$widgets(work3D)
+        edgeActor_$widgets(work3D) SetMapper edgeMapper_$widgets(work3D)
+        eval [ edgeActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+
+    # Opaque
+    vtkPiecewiseFunction constFunc_$widgets(work3D)
+        constFunc_$widgets(work3D) AddPoint  0                    1.0
+        constFunc_$widgets(work3D) AddPoint  [ lindex $range 1 ]  1.0
+
+    vtkColorTransferFunction colorFunc_$widgets(work3D)
+        colorFunc_$widgets(work3D) AddRGBPoint 0.00                 1.0 1.0 1.0
+        colorFunc_$widgets(work3D) AddRGBPoint [ lindex $range 1 ] 1.0 1.0 1.0
+
+    vtkVolumeProperty opaqueProp_$widgets(work3D)
+        opaqueProp_$widgets(work3D) SetColor colorFunc_$widgets(work3D)
+        opaqueProp_$widgets(work3D) SetScalarOpacity constFunc_$widgets(work3D)
+        opaqueProp_$widgets(work3D) ShadeOn
+        opaqueProp_$widgets(work3D) SetInterpolationTypeToLinear
+
+    vtkVolumeRayCastIsosurfaceFunction isoFunc_$widgets(work3D)
+        isoFunc_$widgets(work3D) SetIsoValue [ expr [ lindex $range 1 ] / 4 ]
+
+    vtkVolumeRayCastMapper isoCast_$widgets(work3D)
+        isoCast_$widgets(work3D) SetInput $resample
+        isoCast_$widgets(work3D) SetVolumeRayCastFunction isoFunc_$widgets(work3D)
+
+    vtkVolume opaqueVol_$widgets(work3D)
+        opaqueVol_$widgets(work3D) SetMapper isoCast_$widgets(work3D)
+        opaqueVol_$widgets(work3D) SetProperty opaqueProp_$widgets(work3D)
+
+    # Axis
+    set points [ getAxis_dll ]
+    set nP [ expr [ llength $points ] / 3 ]
+
+    # Poly-line actor construction...
+    catch { renderer_$widgets(work3D) RemoveActor axisActor_$widgets(work3D) }
+    catch { axisActor_$widgets(work3D)    Delete }
+    catch { axisMapper_$widgets(work3D)   Delete }
+    catch { axisGrid_$widgets(work3D)     Delete }
+    catch { axisPolyLine_$widgets(work3D) Delete }
+    catch { axisPoints_$widgets(work3D)   Delete }
+
+    vtkPoints axisPoints_$widgets(work3D)
+    vtkPolyLine axisPolyLine_$widgets(work3D)
+    [ axisPolyLine_$widgets(work3D) GetPointIds ] SetNumberOfIds $nP
+    set vox_size [ getActualVoxelSize_dll ]
+    for { set i 0 } { $i < $nP } { incr i } {
+
+        [ axisPolyLine_$widgets(work3D) GetPointIds ] SetId $i $i
+        set p [ \
+            PointCoord \
+            [ lindex $points [ expr $i * 3 + 0 ] ] \
+            [ lindex $points [ expr $i * 3 + 1 ] ] \
+            [ lindex $points [ expr $i * 3 + 2 ] ] \
+            [ lindex $bounds 0 ] \
+            [ lindex $bounds 2 ] \
+            [ lindex $bounds 4 ] \
+            $vox_size $vox_size $vox_size \
+        ]
+        axisPoints_$widgets(work3D) InsertNextPoint [ lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ]
+
+    }
+
+    vtkUnstructuredGrid axisGrid_$widgets(work3D)
+        axisGrid_$widgets(work3D) Allocate 1 1
+        axisGrid_$widgets(work3D) InsertNextCell \
+            [ axisPolyLine_$widgets(work3D) GetCellType ] \
+            [ axisPolyLine_$widgets(work3D) GetPointIds ]
+            axisGrid_$widgets(work3D) SetPoints axisPoints_$widgets(work3D)
+
+    vtkDataSetMapper axisMapper_$widgets(work3D)
+        axisMapper_$widgets(work3D) SetInput axisGrid_$widgets(work3D)
+        axisMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor axisActor_$widgets(work3D)
+        axisActor_$widgets(work3D) SetMapper axisMapper_$widgets(work3D)
+        [ axisActor_$widgets(work3D) GetProperty] BackfaceCullingOn
+        [ axisActor_$widgets(work3D) GetProperty] SetDiffuseColor 1 0 0
+#        [ axisActor_$widgets(work3D) GetProperty] SetLineWidth 3
+
+    renderer_$widgets(work3D) AddActor axisActor_$widgets(work3D)
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    $widgets(sclIsoVal) configure \
+        -from [ lindex $range 0 ] \
+        -to   [ lindex $range 1 ] \
+        -resolution 1.0
+
+    $widgets(sclOpacity) configure \
+        -from 0.00 \
+        -to   1.0 \
+        -resolution 0.001
+
+    bind $widgets(sclIsoVal) <Any-ButtonRelease>
+    bind $widgets(sclIsoVal) <Any-ButtonRelease> "planes_window::change_intensity 0"
+    
+    bind $widgets(sclOpacity) <Any-ButtonRelease>
+    bind $widgets(sclOpacity) <Any-ButtonRelease> "planes_window::change_opacity 0"
+
+    if { [ u_surf::get_isoval ] != 0 } {
+
+        planes_window::change_intensity 1 [ u_surf::get_isoval ]
+
+    } else {
+
+        planes_window::change_intensity 1 [ expr ( [ $widgets(sclIsoVal) cget -to ] + ( [ $widgets(sclIsoVal) cget -from ] * 3 ) ) / 4 ]
+
+    }
+    planes_window::change_opacity 1
+
+    $widgets(btnPerpendicular) select
+    $widgets(btnPerpendicular) invoke
+
+    $widgets(btnOpaque)      deselect
+    $widgets(btnTransparent) deselect
+    $widgets(btnEdge)        deselect
+    $widgets(btnTransparent) invoke
+
+    $widgets(sclSlice) configure \
+        -from 0 \
+        -to   [ expr [ getNumberOfAxisPoints_dll ] - 1 ] \
+        -resolution 1
+
+    set first_point_quant 0
+    set last_point_quant [ expr [ getNumberOfAxisPoints_dll ] - 1 ]
+
+    bind $widgets(sclSlice) <Any-ButtonRelease>
+    $widgets(sclSlice) set [ expr [ getNumberOfAxisPoints_dll ] / 2 ]
+    planes_window::prepare_planes
+    planes_window::set_plane
+    bind $widgets(sclSlice) <Any-ButtonRelease> "planes_window::set_plane"
+    
+    $widgets(btnGreyScale) deselect
+    $widgets(btnColor)     deselect
+    $widgets(btnGreyScale) invoke
+
+    $widgets(btnSHealthySlice) deselect
+    $widgets(btnSHealthySlice) invoke
+    
+    $widgets(btnShowS) deselect
+    $widgets(btnShowS) invoke
+
+    $widgets(btnRings) select
+    $widgets(btnRings) invoke
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    planes_window::controls 0
+    global_window::deselect_buttons
+    global_window::invoke_buttons [ expr \
+        $global_window::en_clear  | \
+        $global_window::en_rotate | \
+        $global_window::en_zoom     \
+    ]
+
+    renderer_$widgets(work3D) AddActor outlineActor_$widgets(work3D)
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    $widgets(btnContour) configure \
+        -command "planes_window::extract_contour -1 -1"
+
+}
+
+proc planes_window::set_IsoActor { typ } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actual_actor     actual_actor
+
+    catch { renderer_$widgets(work3D) RemoveActor isoActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor edgeActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveVolume opaqueVol_$widgets(work3D) }
+
+    if { $typ != 4 } { set actual_actor $typ }
+
+    if { $typ == 1 } {
+
+        renderer_$widgets(work3D) AddVolume opaqueVol_$widgets(work3D)
+        $widgets(btnShowS) select
+    
+    } elseif { $typ == 2 } {
+
+        renderer_$widgets(work3D) AddActor isoActor_$widgets(work3D)
+        $widgets(btnShowS) select
+
+    } elseif { $typ == 3 } {
+
+        renderer_$widgets(work3D) AddActor edgeActor_$widgets(work3D)
+        $widgets(btnShowS) select
+
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::change_color { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actual_actor     actual_actor
+
+    set col [ $widgets(btnSColor) cget -background ]
+    set col [ \
+        tk_chooseColor \
+            -initialcolor $col \
+            -parent $widgets(btnColor) \
+            -title "Choose a color..."
+    ]
+    if { $col != "" } { 
+        
+        $widgets(btnSColor) configure -background $col            
+        set r [ expr "0x[ string index $col 1 ][ string index $col 2 ]" / 255.0 ]
+        set g [ expr "0x[ string index $col 3 ][ string index $col 4 ]" / 255.0 ]
+        set b [ expr "0x[ string index $col 5 ][ string index $col 6 ]" / 255.0 ]
+        [ isoActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+        [ edgeActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+        
+        [ $widgets(work3D) GetRenderWindow ] Render
+        [ $widgets(image2D) GetRenderWindow ] Render
+
+    }
+
+}
+
+proc planes_window::change_intensity { typ { isoval 0 } } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    if { $typ == 1 } {
+
+        set slc $isoval
+        $widgets(sclIsoVal) set $slc
+
+    } else { set slc [ $widgets(sclIsoVal) get ] }
+
+    cubes_$widgets(work3D) SetValue 0 $slc
+    edgePoints_$widgets(work3D) SetValue $slc
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+    
+
+}
+
+proc planes_window::change_opacity { typ } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    if { $typ == 1 } {
+
+        set slc [ expr ( [ $widgets(sclOpacity) cget -to ] + [ $widgets(sclOpacity) cget -from ] ) / 2 ]
+        $widgets(sclOpacity) set $slc
+    
+    } else { set slc [ $widgets(sclOpacity) get ] }
+
+    [ isoActor_$widgets(work3D) GetProperty ] SetOpacity $slc
+    [ edgeActor_$widgets(work3D) GetProperty ] SetOpacity $slc
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+    
+
+}
+
+proc planes_window::prepare_planes { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+
+    catch { renderer_$widgets(image2D) RemoveActor plane_actor_2D_$widgets(image2D) }
+    catch { renderer_$widgets(work3D) RemoveActor plane_actor_3D_$widgets(work3D) }
+    catch { plane_actor_2D_$widgets(image2D) Delete }
+    catch { mapper_2D_$widgets(image2D) Delete }
+    catch { collookup_$widgets(work3D) Delete }
+    catch { bwlookup_$widgets(work3D) Delete }
+    catch { plane_actor_3D_$widgets(work3D) Delete }
+    catch { mapper_3D_$widgets(work3D) Delete }
+
+    set range    [ getIntensityRange_dll ]
+
+    vtkWindowLevelLookupTable bwlookup_$widgets(work3D)
+        bwlookup_$widgets(work3D) SetHueRange 0.00 1.0 
+        bwlookup_$widgets(work3D) SetNumberOfColors [ lindex [ split [ expr [ lindex $range 1 ] - [ lindex $range 0 ] + 1 ] . ] 0 ]
+        bwlookup_$widgets(work3D) SetTableRange [ lindex $range 0 ] [ lindex $range 1 ]
+        bwlookup_$widgets(work3D) SetSaturationRange 0 0
+        bwlookup_$widgets(work3D) SetValueRange 0 1
+        bwlookup_$widgets(work3D) SetAlphaRange 1 1
+        bwlookup_$widgets(work3D) Build
+
+    vtkLookupTable collookup_$widgets(work3D)
+        collookup_$widgets(work3D) SetNumberOfColors 256
+        collookup_$widgets(work3D) SetTableRange 0 255
+        collookup_$widgets(work3D) Build
+        collookup_$widgets(work3D) SetTableValue 0    1 0 0 1
+        collookup_$widgets(work3D) SetTableValue 128  0 0 1 1
+        collookup_$widgets(work3D) SetTableValue 255  0 1 0 1
+
+    vtkDataSetMapper mapper_2D_$widgets(image2D)
+        mapper_2D_$widgets(image2D) SetInput [ getVTKPoints_dll ]
+        mapper_2D_$widgets(image2D) SetLookupTable bwlookup_$widgets(work3D)
+        eval mapper_2D_$widgets(image2D) SetScalarRange [ lindex $range 0 ] [ lindex $range 1 ]
+        mapper_2D_$widgets(image2D) ImmediateModeRenderingOn
+
+    vtkActor plane_actor_2D_$widgets(image2D)
+       plane_actor_2D_$widgets(image2D) SetMapper mapper_2D_$widgets(image2D)
+
+    renderer_$widgets(image2D) AddActor plane_actor_2D_$widgets(image2D)
+
+    [ renderer_$widgets(image2D) GetActiveCamera ] SetPosition   [ expr [ getCutSize_dll ] / 2 ] [ expr [ getCutSize_dll ] / 2 ] [ expr round( [ getCutSize_dll ] * 1.8 ) ]
+    [ renderer_$widgets(image2D) GetActiveCamera ] SetFocalPoint [ expr [ getCutSize_dll ] / 2 ] [ expr [ getCutSize_dll ] / 2 ] 0
+
+    # 3D actor
+    vtkDataSetMapper mapper_3D_$widgets(work3D)
+        mapper_3D_$widgets(work3D) SetInput [ [ getVTKProbe_dll ] GetOutput ]
+        mapper_3D_$widgets(work3D) SetLookupTable bwlookup_$widgets(work3D)
+        eval mapper_3D_$widgets(work3D) SetScalarRange $range
+        mapper_3D_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor plane_actor_3D_$widgets(work3D)
+        plane_actor_3D_$widgets(work3D) SetMapper mapper_3D_$widgets(work3D)
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::set_plane { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+    upvar planes_window::actual_area  actual_area
+    upvar planes_window::actual_peri  actual_peri
+    upvar planes_window::actual_darea actual_darea
+    upvar planes_window::actual_dperi actual_dperi
+    upvar planes_window::actual_dmax  actual_dmax
+    upvar planes_window::actual_dmin  actual_dmin
+    upvar planes_window::actual_davg  actual_davg
+    upvar planes_window::actual_sten  actual_sten
+    upvar planes_window::actual_quant_x actual_quant_x
+    upvar planes_window::actual_quant_sten actual_quant_sten
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+
+    set slice [ $widgets(sclSlice) get ]
+
+    planes_window::clean_contour
+    changeSliceAxis_dll $slice
+    set p [ getAxisPoint_dll $slice ]
+    set resample [ getVTKSource_dll ]
+    set bounds   [ $resample GetBounds ]
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_cell_int_$widgets(work3D) ] }
+    DeleteSphere sphere_cell_int_$widgets(work3D)
+    set act [ \
+        DrawSphere \
+            sphere_cell_int_$widgets(work3D) \
+            [ expr [ getCellIntensitySize_dll ] / 2.0 ] \
+            [ expr [ lindex $p 0 ] + [ lindex $bounds 0 ] ] \
+            [ expr [ lindex $p 1 ] + [ lindex $bounds 2 ] ] \
+            [ expr [ lindex $p 2 ] + [ lindex $bounds 4 ] ] \
+            0.0 0.0 1.0 \
+    ]
+    [ $act GetProperty ] SetOpacity 0.2
+    renderer_$widgets(work3D) AddActor $act
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    catch { $widgets(graph) marker delete line_select }
+    $widgets(graph) marker create line -coords { $slice -Inf $slice Inf } -dashes dash -linewidth 1 -outline red -name line_select
+
+    set quant_data [ getValues_dll $slice ]
+    set actual_area  [ change_float_precision [ lindex $quant_data 0 ] 2 ]
+    set actual_peri  [ change_float_precision [ lindex $quant_data 1 ] 2 ]
+    set actual_darea [ change_float_precision [ lindex $quant_data 2 ] 2 ]
+    set actual_dperi [ change_float_precision [ lindex $quant_data 3 ] 2 ]
+    set actual_dmax  [ change_float_precision [ lindex $quant_data 4 ] 2 ]
+    set actual_dmin  [ change_float_precision [ lindex $quant_data 5 ] 2 ]
+    set actual_davg  [ change_float_precision [ lindex $quant_data 6 ] 2 ]
+
+    if { [ llength $actual_quant_sten ] > 0 } {
+
+        set actual_sten [ change_float_precision [ lindex $actual_quant_sten [ expr $slice - [ lindex $actual_quant_x 0 ] ] ] 2 ]
+
+    }
+
+}
+
+proc planes_window::extract_contour { x y { transformy 0 } } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+    upvar planes_window::man_points man_points
+    upvar planes_window::actual_area  actual_area
+    upvar planes_window::actual_peri  actual_peri
+    upvar planes_window::actual_darea actual_darea
+    upvar planes_window::actual_dperi actual_dperi
+    upvar planes_window::actual_dmax  actual_dmax
+    upvar planes_window::actual_dmin  actual_dmin
+    upvar planes_window::actual_davg  actual_davg
+    upvar planes_window::actual_sten  actual_sten
+    upvar planes_window::actual_quant_x     actual_quant_x
+    upvar planes_window::actual_quant_area  actual_quant_area
+    upvar planes_window::actual_quant_peri  actual_quant_peri
+    upvar planes_window::actual_quant_darea actual_quant_darea
+    upvar planes_window::actual_quant_dperi actual_quant_dperi
+    upvar planes_window::actual_quant_dmax  actual_quant_dmax
+    upvar planes_window::actual_quant_dmin  actual_quant_dmin
+    upvar planes_window::actual_quant_davg  actual_quant_davg
+    upvar planes_window::actual_quant_sten  actual_quant_sten
+    upvar planes_window::quant_shown        quant_shown
+    upvar planes_window::quantifing         quantifing
+    upvar planes_window::first_quant        first_quant
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+
+    set index [ $widgets(sclSlice) get ]
+    planes_window::clean_contour
+
+    if { [ llength $man_points ] > 0 } {
+    
+        setContour_dll $man_points
+        for { set i 1 } { $i <= [ llength $man_points ] } { incr i } {
+    
+            catch { renderer_$widgets(image2D) RemoveActor [ GetSphereActorName man_point_$i ] }
+            DeleteSphere man_point_$i
+    
+        }
+        set man_points [ list ]
+
+    } else {
+
+        set params [ getContourParams_dll ]
+        if { $transformy == 1 } { 
+
+            set y [ expr [ lindex [ $widgets(image2D) configure -height ] 4 ] - $y - 1 ]
+            catch { tmp_picker_$widgets(image2D) Delete }
+            vtkWorldPointPicker tmp_picker_$widgets(image2D)
+                set pickWP    [ tmp_picker_$widgets(image2D) Pick $x $y 0 renderer_$widgets(image2D) ]
+                set pickWPPos [ tmp_picker_$widgets(image2D) GetPickPosition ]
+
+            set x [ lindex $pickWPPos 0 ] 
+            set y [ lindex $pickWPPos 1 ]
+
+        }
+        if { $x == -1 } { set rx [ expr [ getCutSize_dll ] / 2 ] } else { set rx $x }
+        if { $y == -1 } { set ry [ expr [ getCutSize_dll ] / 2 ] } else { set ry $y }
+        planes_window::generate_isocontour $rx $ry [ lindex $params 5 ] [ lindex $params 6 ]
+        if { $x != -1 } { set x [ expr round( $x ) ] }
+        if { $y != -1 } { set y [ expr round( [ getCutSize_dll ] - $y - 1 ) ] }
+        extractContour_dll $x $y isoStrips_$widgets(work3D) 
+
+    }
+
+  catch { triangles_tmp Delete }
+  catch { mesures_tmp Delete }
+
+    # triangulate the polygons
+#    vtkTriangleFilter triangles_tmp
+#        triangles_tmp SetInput [ isoStrips_$widgets(work3D) GetOutput ]
+#        triangles_tmp PassLinesOn
+#        triangles_tmp PassVertsOn
+#
+#    vtkMassProperties mesures_tmp
+#        mesures_tmp SetInput [triangles_tmp GetOutput]
+#        mesures_tmp Update
+#        set monarea [ mesures_tmp GetSurfaceArea ]
+#    puts $monarea
+
+    # Some contours had been calculated, so it's possible that
+    # the user wants to keep them.
+    set first_quant 0
+    
+    set points [ getContourPoints_dll ]
+    set taille [ expr [ llength $points ] / 2 ]
+
+    vtkPolygon aPolygon_$widgets(image2D)
+    vtkPoints PointsContour_$widgets(image2D)
+
+    vtkPolyLine aPolyLine_$widgets(image2D)
+        set PointIds [ aPolyLine_$widgets(image2D) GetPointIds ]
+        $PointIds SetNumberOfIds $taille
+        set PointIdsPolygon [ aPolygon_$widgets(image2D) GetPointIds ]
+        $PointIdsPolygon SetNumberOfIds $taille
+    for { set i 0 } { $i< $taille } { incr i } {
+      $PointIds SetId $i $i
+      $PointIdsPolygon SetId $i $i
+      PointsContour_$widgets(image2D) InsertNextPoint [ lindex $points [ expr ( $i * 2 ) + 0 ] ] [ lindex $points [ expr ( $i * 2 ) + 1 ] ] 0
+    }
+
+    vtkUnstructuredGrid aPolyLineGrid_$widgets(image2D)
+        aPolyLineGrid_$widgets(image2D) Allocate 1 1
+        set param1 [ aPolyLine_$widgets(image2D) GetCellType]
+        set param2 [ aPolyLine_$widgets(image2D) GetPointIds]
+        aPolyLineGrid_$widgets(image2D) InsertNextCell $param1 $param2
+        aPolyLineGrid_$widgets(image2D) SetPoints PointsContour_$widgets(image2D)
+
+    vtkDataSetMapper aPolyLineMapper_$widgets(image2D) 
+        aPolyLineMapper_$widgets(image2D)    SetInput aPolyLineGrid_$widgets(image2D)
+
+    vtkActor aPolyLineActor_$widgets(image2D)
+        aPolyLineActor_$widgets(image2D) SetMapper aPolyLineMapper_$widgets(image2D)
+        set Property1 [aPolyLineActor_$widgets(image2D) GetProperty]
+        $Property1 SetColor 0 1 0
+        $Property1 SetLineWidth 2
+        $Property1 SetPointSize 2
+        $Property1 BackfaceCullingOff
+
+    renderer_$widgets(image2D) AddActor aPolyLineActor_$widgets(image2D)
+
+    vtkUnstructuredGrid aPolygonGrid_$widgets(image2D)
+        aPolygonGrid_$widgets(image2D) Allocate 1 1
+        set param1 [ aPolygon_$widgets(image2D) GetCellType ]
+        set param2 [ aPolygon_$widgets(image2D) GetPointIds ]
+        aPolygonGrid_$widgets(image2D) InsertNextCell $param1 $param2
+        aPolygonGrid_$widgets(image2D) SetPoints PointsContour_$widgets(image2D)
+
+    vtkDataSetMapper aPolygonMapper_$widgets(image2D)
+        aPolygonMapper_$widgets(image2D)  SetInput aPolygonGrid_$widgets(image2D)
+
+    vtkActor aPolygonActor_$widgets(image2D)
+        aPolygonActor_$widgets(image2D) SetMapper aPolygonMapper_$widgets(image2D)
+        set Property1 [ aPolygonActor_$widgets(image2D) GetProperty ]
+        $Property1 SetColor 0 1 0
+        $Property1 SetLineWidth 2
+        $Property1 SetPointSize 2
+        $Property1 BackfaceCullingOff
+
+    array set arr [ params_dll 0 ]
+    if { $arr(e_debug_fill_area) == 1 } { renderer_$widgets(image2D) AddActor aPolygonActor_$widgets(image2D) }
+
+    planes_window::show_max_min_diameters
+
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    planes_window::draw3D_contour $index
+
+    set quant_data [ getValues_dll $index ]
+    set actual_area  [ change_float_precision [ lindex $quant_data 0 ] 2 ]
+    set actual_peri  [ change_float_precision [ lindex $quant_data 1 ] 2 ]
+    set actual_darea [ change_float_precision [ lindex $quant_data 2 ] 2 ]
+    set actual_dperi [ change_float_precision [ lindex $quant_data 3 ] 2 ]
+    set actual_dmax  [ change_float_precision [ lindex $quant_data 4 ] 2 ]
+    set actual_dmin  [ change_float_precision [ lindex $quant_data 5 ] 2 ]
+    set actual_davg  [ change_float_precision [ lindex $quant_data 6 ] 2 ]
+    set i [ lsearch -exact $actual_quant_x $index ]
+    if { $i != -1 } {
+
+        set actual_quant_area  [ lreplace $actual_quant_area  $i $i $actual_area ]
+        set actual_quant_peri  [ lreplace $actual_quant_peri  $i $i $actual_peri ]
+        set actual_quant_darea [ lreplace $actual_quant_darea $i $i $actual_darea ]
+        set actual_quant_dperi [ lreplace $actual_quant_dperi $i $i $actual_dperi ]
+        set actual_quant_dmax  [ lreplace $actual_quant_dmax  $i $i $actual_dmax ]
+        set actual_quant_dmin  [ lreplace $actual_quant_dmin  $i $i $actual_dmin ]
+        set actual_quant_davg  [ lreplace $actual_quant_davg  $i $i $actual_davg ]
+        if { [ llength $actual_quant_sten ] > 0 } {
+            
+            set actual_quant_sten [ getStenosisQuant_dll ]
+            set actual_sten [ change_float_precision [ lindex $actual_quant_sten [ expr $index - $real_first_point_quant ] ] 2 ]
+
+        }
+
+    }
+    planes_window::update_blt_all_meassures
+
+}
+
+proc planes_window::clean_contour { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    catch { renderer_$widgets(image2D) RemoveActor actor_debug2_work3D }
+    catch { renderer_$widgets(image2D) RemoveActor actor_debug1_work3D }
+    catch { actor_debug2_work3D Delete }
+    catch { connMapper_$widgets(work3D) Delete }
+    catch { isoStrips_$widgets(work3D) Delete }
+    catch { cpd2_$widgets(work3D) Delete }
+    catch { conn_$widgets(work3D) Delete }
+    catch { cpd_$widgets(work3D) Delete }
+    catch { actor_debug1_work3D Delete }
+    catch { cntVTKMapper_$widgets(work3D) Delete }
+    catch { cntVTK_$widgets(work3D) Delete }
+    catch { renderer_$widgets(image2D) RemoveActor aPolyLineActor_$widgets(image2D) }
+    catch { renderer_$widgets(image2D) RemoveActor aPolygonActor_$widgets(image2D) }
+    catch { aPolyLineActor_$widgets(image2D) Delete }
+    catch { aPolyLineMapper_$widgets(image2D) Delete }
+    catch { aPolyLineGrid_$widgets(image2D) Delete }
+    catch { aPolyLine_$widgets(image2D) Delete }
+    catch { PointsContour_$widgets(image2D) Delete }
+    catch { aPolygonActor_$widgets(image2D) Delete }
+    catch { aPolygonMapper_$widgets(image2D) Delete }
+    catch { aPolygonGrid_$widgets(image2D) Delete }
+    catch { aPolygon_$widgets(image2D) Delete }
+    catch { renderer_$widgets(image2D) RemoveActor dMax_actor_$widgets(image2D) }
+    catch { renderer_$widgets(image2D) RemoveActor dMin_actor_$widgets(image2D) }
+    catch { dMax_actor_$widgets(image2D)   Delete }
+    catch { dMax_mapper_$widgets(image2D) Delete }
+    catch { dMax_line_$widgets(image2D)   Delete }
+    catch { dMin_actor_$widgets(image2D)   Delete }
+    catch { dMin_mapper_$widgets(image2D) Delete }
+    catch { dMin_line_$widgets(image2D)   Delete }
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::show_hs_3D { var_healthy } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actor_debug1 actor_debug1
+    upvar planes_window::actor_debug2 actor_debug2
+    upvar planes_window::show_hs_var show_hs_var
+    
+    set show_hs_var $var_healthy
+    if { $var_healthy == 1 } {
+    catch { renderer_$widgets(work3D) AddActor hs_actor_$widgets(work3D) }
+    } else {
+    catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::put_plane_3D { var_perp } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actor_debug1 actor_debug1
+    upvar planes_window::actor_debug2 actor_debug2
+
+    if { $var_perp == 1 } {
+    catch { renderer_$widgets(work3D) AddActor plane_actor_3D_$widgets(work3D) }
+    } else {
+    catch { renderer_$widgets(work3D) RemoveActor plane_actor_3D_$widgets(work3D) }
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+        
+proc planes_window::set_color_table { typ } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actor_debug1 actor_debug1
+    upvar planes_window::actor_debug2 actor_debug2
+
+    if { $typ == 1 } {
+
+        mapper_3D_$widgets(work3D) SetLookupTable bwlookup_$widgets(work3D)
+
+    } else {
+
+        mapper_3D_$widgets(work3D) SetLookupTable collookup_$widgets(work3D)
+
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::generate_isocontour { x y vmin vmax } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    catch { renderer_$widgets(image2D) RemoveActor actor_debug2_work3D }
+    catch { renderer_$widgets(image2D) RemoveActor actor_debug1_work3D }
+    catch { actor_debug2_work3D Delete }
+    catch { connMapper_$widgets(work3D) Delete }
+    catch { isoStrips_$widgets(work3D) Delete }
+    catch { cpd2_$widgets(work3D) Delete }
+    catch { conn_$widgets(work3D) Delete }
+    catch { cpd_$widgets(work3D) Delete }
+    catch { actor_debug1_work3D Delete }
+    catch { cntVTKMapper_$widgets(work3D) Delete }
+    catch { cntVTK_$widgets(work3D) Delete }
+    catch { renderer_$widgets(image2D) RemoveActor [ GetSphereActorName tmp_gc_point ] }
+    DeleteSphere tmp_gc_point
+
+    renderer_$widgets(image2D) AddActor [ \
+        DrawSphere tmp_gc_point 0.1 \
+        $x $y 0 \
+        1.00 0.0 0.00
+    ]
+
+    set spoints [ getVTKPoints_dll ]
+    vtkKitwareContourFilter cntVTK_$widgets(work3D)
+        cntVTK_$widgets(work3D) SetInput $spoints
+        cntVTK_$widgets(work3D) SetNumberOfContours 1
+        cntVTK_$widgets(work3D) SetValue 0 $vmin
+        #cntVTK_$widgets(work3D) SetValue 1 $vmax
+
+    vtkPolyDataMapper cntVTKMapper_$widgets(work3D)
+        cntVTKMapper_$widgets(work3D) SetInput [ cntVTK_$widgets(work3D) GetOutput ]
+        cntVTKMapper_$widgets(work3D) ScalarVisibilityOff
+
+    vtkActor actor_debug1_work3D
+        actor_debug1_work3D SetMapper cntVTKMapper_$widgets(work3D)
+        [ actor_debug1_work3D GetProperty ] SetColor 1 0 0
+        
+    vtkCleanPolyData cpd_$widgets(work3D)
+        cpd_$widgets(work3D) SetInput [ cntVTK_$widgets(work3D) GetOutput ]
+
+    vtkPolyDataConnectivityFilter conn_$widgets(work3D)
+        conn_$widgets(work3D) SetInput [ cpd_$widgets(work3D) GetOutput ]
+        conn_$widgets(work3D) SetExtractionModeToClosestPointRegion
+        conn_$widgets(work3D) SetClosestPoint $x $y 0
+        conn_$widgets(work3D) Update
+
+    vtkCleanPolyData cpd2_$widgets(work3D)
+        cpd2_$widgets(work3D) SetInput [ conn_$widgets(work3D) GetOutput ]
+
+    vtkStripper isoStrips_$widgets(work3D)
+        isoStrips_$widgets(work3D) SetInput [ cpd2_$widgets(work3D) GetOutput ]
+        isoStrips_$widgets(work3D) Update
+
+    vtkPolyDataMapper connMapper_$widgets(work3D)
+        connMapper_$widgets(work3D) SetInput [ isoStrips_$widgets(work3D) GetOutput ]
+        connMapper_$widgets(work3D) ScalarVisibilityOff
+
+    vtkActor actor_debug2_work3D
+        actor_debug2_work3D SetMapper connMapper_$widgets(work3D)
+        [ actor_debug2_work3D GetProperty ] SetColor 0 0 1
+
+    array set arr [ params_dll 0 ]
+
+    if { $arr(e_debug_isocontour) == 1 } {
+    
+        renderer_$widgets(image2D) AddActor actor_debug1_work3D
+        renderer_$widgets(image2D) AddActor actor_debug2_work3D
+
+    }
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::select_axis_point { x y { real -1 } } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+    upvar planes_window::nClicks nClicks
+    upvar planes_window::first_point_quant first_point_quant
+    upvar planes_window::last_point_quant last_point_quant
+    upvar planes_window::actual_partial actual_partial
+    upvar planes_window::given_points  given_points
+
+    set nClicks [ expr ( $nClicks % 2 ) + 1 ]
+
+    if { $real == -1 } {
+    
+        renderer_$widgets(work3D) IsInViewport 0 0
+        catch { tmp_world_picker_$widgets(work3D) Delete }
+        set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+                [ $widgets(work3D) GetRenderWindow ] Render
+        set pickWPPos [ pick_point_local_actor $x $y renderer_$widgets(work3D) axisActor_$widgets(work3D) 0.001 ]
+        set xc [ lindex $pickWPPos 0 ]
+        set yc [ lindex $pickWPPos 1 ]
+        set zc [ lindex $pickWPPos 2 ]
+        
+        #Chercher le point de l'axe le plus proche au point choisi
+        set indP [axisGrid_$widgets(work3D) FindPoint $xc $yc $zc]
+        set coordsP [axisGrid_$widgets(work3D) GetPoint $indP]
+        set xc [lindex $coordsP 0]
+        set yc [lindex $coordsP 1]
+        set zc [lindex $coordsP 2]
+
+    } else {
+
+        set indP $real
+        set coordsP [ axisGrid_$widgets(work3D) GetPoint $indP ]
+        set xc [ lindex $coordsP 0 ]
+        set yc [ lindex $coordsP 1 ]
+        set zc [ lindex $coordsP 2 ]
+
+    }
+
+    if { $nClicks == 1 } {
+
+        set first_point_quant $indP
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_quant1_$widgets(work3D) ] }
+        DeleteSphere sphere_quant1_$widgets(work3D)
+
+        renderer_$widgets(work3D) AddActor [ DrawSphere sphere_quant1_$widgets(work3D) 0.5 $xc $yc $zc 0.00 0.00 1.0 ]
+
+    } else {
+    
+        set last_point_quant $indP
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_quant2_$widgets(work3D) ] }
+        DeleteSphere sphere_quant2_$widgets(work3D)
+
+        renderer_$widgets(work3D) AddActor [ DrawSphere sphere_quant2_$widgets(work3D) 0.5 $xc $yc $zc 0.00 1.0 0.00 ]
+        planes_window::controls 1
+        set given_points 1
+
+    }
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    set f [ expr ( $first_point_quant < $last_point_quant )? $first_point_quant: $last_point_quant ]
+    set l [ expr ( $first_point_quant > $last_point_quant )? $first_point_quant: $last_point_quant ]
+    set actual_partial [ change_float_precision [ getPartialAxisLength_dll $f $l ] 2 ]
+
+}
+
+
+proc planes_window::set_plane_3D { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+
+    renderer_$widgets(work3D) IsInViewport 0 0
+
+    busy hold .
+    update
+
+    catch { tmp_world_picker_$widgets(work3D) Delete }
+    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+
+    set pickWPPos [ pick_point_local_actor $x $y renderer_$widgets(work3D) isoActor_$widgets(work3D) 0.001 ]
+    set xc [ lindex $pickWPPos 0 ]
+    set yc [ lindex $pickWPPos 1 ]
+    set zc [ lindex $pickWPPos 2 ]
+    #Chercher le point de l'axe le plus proche au point choisi sur la surface
+    set indP [axisGrid_$widgets(work3D) FindPoint $xc $yc $zc]
+    set coordsP [axisGrid_$widgets(work3D) GetPoint $indP]
+    set xc [lindex $coordsP 0]
+    set yc [lindex $coordsP 1]
+    set zc [lindex $coordsP 2]
+
+    if { $indP >= 0 } {
+
+        $widgets(sclSlice) set $indP
+        planes_window::set_plane
+
+    }
+
+    busy release .
+    update
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::do_quant { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index        axis_index
+    upvar planes_window::nClicks           nClicks
+    upvar planes_window::first_point_quant first_point_quant
+    upvar planes_window::last_point_quant  last_point_quant
+    upvar planes_window::quantifing        quantifing
+    upvar planes_window::first_quant       first_quant
+    upvar planes_window::actual_quant_x     actual_quant_x
+    upvar planes_window::actual_quant_area  actual_quant_area
+    upvar planes_window::actual_quant_peri  actual_quant_peri
+    upvar planes_window::actual_quant_darea actual_quant_darea
+    upvar planes_window::actual_quant_dperi actual_quant_dperi
+    upvar planes_window::actual_quant_dmax  actual_quant_dmax
+    upvar planes_window::actual_quant_dmin  actual_quant_dmin
+    upvar planes_window::actual_quant_davg  actual_quant_davg
+    upvar planes_window::actual_quant_sten  actual_quant_sten
+    upvar planes_window::actual_area  actual_area
+    upvar planes_window::actual_peri  actual_peri
+    upvar planes_window::actual_darea actual_darea
+    upvar planes_window::actual_dperi actual_dperi
+    upvar planes_window::actual_dmax  actual_dmax
+    upvar planes_window::actual_dmin  actual_dmin
+    upvar planes_window::actual_davg  actual_davg
+    upvar planes_window::quant_shown        quant_shown
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+    upvar planes_window::actual_partial actual_partial
+
+    if { $quantifing == 0 } {
+
+        planes_window::clean_BLT
+        planes_window::clean3D
+
+        set quantifing 1
+
+        set f [ expr ( $first_point_quant < $last_point_quant )? $first_point_quant: $last_point_quant ]
+        set l [ expr ( $first_point_quant > $last_point_quant )? $first_point_quant: $last_point_quant ]
+        planes_window::controls 2
+
+        set actual_quant_x     [ list ]
+        set actual_quant_area  [ list ]
+        set actual_quant_peri  [ list ]
+        set actual_quant_darea [ list ]
+        set actual_quant_dperi [ list ]
+        set actual_quant_dmax  [ list ]
+        set actual_quant_dmin  [ list ]
+        set actual_quant_davg  [ list ]
+        for { set i $f } { $i <= $l } { incr i } { lappend actual_quant_x $i }
+        update_blt_all_meassures
+
+        startQuant_dll $f
+        set cont $f
+        changeSliceAxis_dll $f
+
+        set ans [ \
+            tk_messageBox \
+                -icon question \
+                -message "$string_table::str_recalculate_contours" \
+                -type yesno \
+                -title "Question" \
+        ]
+        set recal [ expr ( [ string compare $ans yes ] == 0 )? 1: 0 ]
+
+        planes_window::clean_contour
+        $widgets(sclSlice) set $cont
+        planes_window::set_plane
+        set quant_shown 1
+        set params [ getContourParams_dll ]
+        planes_window::generate_isocontour [ expr [ getCutSize_dll ] / 2 ] [ expr [ getCutSize_dll ] / 2 ] [ lindex $params 5 ] [ lindex $params 6 ]
+        while { [ nextQuant_dll $recal isoStrips_$widgets(work3D) ] == 1 && $cont <= $l } {
+
+            if { $quantifing == 1 } {
+
+                catch { renderer_$widgets(image2D) RemoveActor aPolygonActor_$widgets(image2D) }
+                catch { renderer_$widgets(image2D) RemoveActor aPolyLineActor_$widgets(image2D) }
+                catch { aPolygonActor_$widgets(image2D)   Delete }
+                catch { aPolygonMapper_$widgets(image2D)  Delete }
+                catch { aPolygonGrid_$widgets(image2D)    Delete }
+                catch { aPolyLineActor_$widgets(image2D)  Delete }
+                catch { aPolyLineMapper_$widgets(image2D) Delete }
+                catch { aPolyLineGrid_$widgets(image2D)   Delete }
+                catch { aPolyLine_$widgets(image2D)       Delete }
+                catch { PointsContour_$widgets(image2D)   Delete }
+                catch { aPolygon_$widgets(image2D)        Delete }
+
+                set points [ getContourPoints_dll ]
+                set taille [ expr [ llength $points ] / 2 ]
+
+                vtkPolygon aPolygon_$widgets(image2D)
+                vtkPoints PointsContour_$widgets(image2D)
+
+                vtkPolyLine aPolyLine_$widgets(image2D)
+                    set PointIds [ aPolyLine_$widgets(image2D) GetPointIds ]
+                    $PointIds SetNumberOfIds $taille
+                    set PointIdsPolygon [ aPolygon_$widgets(image2D) GetPointIds ]
+                    $PointIdsPolygon SetNumberOfIds $taille
+                for { set i 0 } { $i< $taille } { incr i } {
+                    $PointIds SetId $i $i
+                    $PointIdsPolygon SetId $i $i
+                    PointsContour_$widgets(image2D) InsertNextPoint [ lindex $points [ expr ( $i * 2 ) + 0 ] ] [ lindex $points [ expr ( $i * 2 ) + 1 ] ] 0
+                }
+
+                vtkUnstructuredGrid aPolyLineGrid_$widgets(image2D)
+                    aPolyLineGrid_$widgets(image2D) Allocate 1 1
+                    set param1 [ aPolyLine_$widgets(image2D) GetCellType]
+                    set param2 [ aPolyLine_$widgets(image2D) GetPointIds]
+                    aPolyLineGrid_$widgets(image2D) InsertNextCell $param1 $param2
+                    aPolyLineGrid_$widgets(image2D) SetPoints PointsContour_$widgets(image2D)
+
+                vtkDataSetMapper aPolyLineMapper_$widgets(image2D) 
+                    aPolyLineMapper_$widgets(image2D)    SetInput aPolyLineGrid_$widgets(image2D)
+
+                vtkActor aPolyLineActor_$widgets(image2D)
+                    aPolyLineActor_$widgets(image2D) SetMapper aPolyLineMapper_$widgets(image2D)
+                    set Property1 [aPolyLineActor_$widgets(image2D) GetProperty]
+                    $Property1 SetColor 0 1 0
+                    $Property1 SetLineWidth 2
+                    $Property1 SetPointSize 2
+                    $Property1 BackfaceCullingOff
+
+                renderer_$widgets(image2D) AddActor aPolyLineActor_$widgets(image2D)
+
+                vtkUnstructuredGrid aPolygonGrid_$widgets(image2D)
+                    aPolygonGrid_$widgets(image2D) Allocate 1 1
+                    set param1 [ aPolygon_$widgets(image2D) GetCellType ]
+                    set param2 [ aPolygon_$widgets(image2D) GetPointIds ]
+                    aPolygonGrid_$widgets(image2D) InsertNextCell $param1 $param2
+                    aPolygonGrid_$widgets(image2D) SetPoints PointsContour_$widgets(image2D)
+
+                vtkDataSetMapper aPolygonMapper_$widgets(image2D)
+                    aPolygonMapper_$widgets(image2D)  SetInput aPolygonGrid_$widgets(image2D)
+
+                vtkActor aPolygonActor_$widgets(image2D)
+                    aPolygonActor_$widgets(image2D) SetMapper aPolygonMapper_$widgets(image2D)
+                    set Property1 [ aPolygonActor_$widgets(image2D) GetProperty ]
+                    $Property1 SetColor 0 1 0
+                    $Property1 SetLineWidth 2
+                    $Property1 SetPointSize 2
+                    $Property1 BackfaceCullingOff
+
+                array set arr [ params_dll 0 ]
+                if { $arr(e_debug_fill_area) == 1 } { renderer_$widgets(image2D) AddActor aPolygonActor_$widgets(image2D) }
+                planes_window::show_max_min_diameters
+
+                [ $widgets(image2D) GetRenderWindow ] Render
+
+                planes_window::draw3D_contour $cont
+
+                set values [ getValues_dll $cont ]
+                lappend actual_quant_area  [ lindex $values 0 ]
+                lappend actual_quant_peri  [ lindex $values 1 ]
+                lappend actual_quant_darea [ lindex $values 2 ]
+                lappend actual_quant_dperi [ lindex $values 3 ]
+                lappend actual_quant_dmax  [ lindex $values 4 ]
+                lappend actual_quant_dmin  [ lindex $values 5 ]
+                lappend actual_quant_davg  [ lindex $values 6 ]
+                planes_window::update_blt_all_meassures
+
+                set actual_area  [ change_float_precision [ lindex $values 0 ] 2 ]
+                set actual_peri  [ change_float_precision [ lindex $values 1 ] 2 ]
+                set actual_darea [ change_float_precision [ lindex $values 2 ] 2 ]
+                set actual_dperi [ change_float_precision [ lindex $values 3 ] 2 ]
+                set actual_dmax  [ change_float_precision [ lindex $values 4 ] 2 ]
+                set actual_dmin  [ change_float_precision [ lindex $values 5 ] 2 ]
+                set actual_davg  [ change_float_precision [ lindex $values 6 ] 2 ]
+                incr cont
+                planes_window::clean_contour
+                $widgets(sclSlice) set $cont
+                planes_window::set_plane
+                set params [ getContourParams_dll ]
+                planes_window::generate_isocontour [ expr [ getCutSize_dll ] / 2 ] [ expr [ getCutSize_dll ] / 2 ] [ lindex $params 5 ] [ lindex $params 6 ]
+                update
+
+            } elseif { $quantifing == 2 } { 
+            
+                while { $quantifing == 2 } { update }
+                
+            } elseif { $quantifing == 3 } {
+
+                $widgets(btnPause) configure -text $string_table::str_pause
+                break
+
+            }
+
+        }
+        finishQuant_dll
+        planes_window::clean_contour
+        set quantifing 0
+
+    } else {
+
+        set quantifing 2
+        set ans [ \
+            tk_messageBox \
+                -icon question \
+                -message "$string_table::str_stop_quantification" \
+                -type yesno \
+                -title "Question" \
+        ]
+        set quantifing 1
+        if { [ string compare $ans yes ] == 0 } { set quantifing 3 }
+
+    }
+
+}
+
+proc planes_window::contour_calculated { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+
+    set index [ $widgets(sclSlice) get ]
+
+    planes_window::clean_contour
+    set points [ getContourPoints_dll ]
+    set taille [ expr [ llength $points ] / 2 ]
+
+    if { $taille > 0 } {
+    
+        vtkPolygon aPolygon_$widgets(image2D)
+        vtkPoints PointsContour_$widgets(image2D)
+
+        vtkPolyLine aPolyLine_$widgets(image2D)
+            set PointIds [ aPolyLine_$widgets(image2D) GetPointIds ]
+            $PointIds SetNumberOfIds $taille
+            set PointIdsPolygon [ aPolygon_$widgets(image2D) GetPointIds ]
+            $PointIdsPolygon SetNumberOfIds $taille
+        for { set i 0 } { $i< $taille } { incr i } {
+
+            $PointIds SetId $i $i
+            $PointIdsPolygon SetId $i $i
+            PointsContour_$widgets(image2D) InsertNextPoint [ lindex $points [ expr ( $i * 2 ) + 0 ] ] [ lindex $points [ expr ( $i * 2 ) + 1 ] ] 0
+
+        }
+
+        vtkUnstructuredGrid aPolyLineGrid_$widgets(image2D)
+            aPolyLineGrid_$widgets(image2D) Allocate 1 1
+            set param1 [ aPolyLine_$widgets(image2D) GetCellType]
+            set param2 [ aPolyLine_$widgets(image2D) GetPointIds]
+            aPolyLineGrid_$widgets(image2D) InsertNextCell $param1 $param2
+            aPolyLineGrid_$widgets(image2D) SetPoints PointsContour_$widgets(image2D)
+
+        vtkDataSetMapper aPolyLineMapper_$widgets(image2D) 
+            aPolyLineMapper_$widgets(image2D)    SetInput aPolyLineGrid_$widgets(image2D)
+
+        vtkActor aPolyLineActor_$widgets(image2D)
+            aPolyLineActor_$widgets(image2D) SetMapper aPolyLineMapper_$widgets(image2D)
+            set Property1 [aPolyLineActor_$widgets(image2D) GetProperty]
+            $Property1 SetColor 0 1 0
+            $Property1 SetLineWidth 2
+            $Property1 SetPointSize 2
+            $Property1 BackfaceCullingOff
+
+        renderer_$widgets(image2D) AddActor aPolyLineActor_$widgets(image2D)
+
+        vtkUnstructuredGrid aPolygonGrid_$widgets(image2D)
+            aPolygonGrid_$widgets(image2D) Allocate 1 1
+            set param1 [ aPolygon_$widgets(image2D) GetCellType ]
+            set param2 [ aPolygon_$widgets(image2D) GetPointIds ]
+            aPolygonGrid_$widgets(image2D) InsertNextCell $param1 $param2
+            aPolygonGrid_$widgets(image2D) SetPoints PointsContour_$widgets(image2D)
+
+        vtkDataSetMapper aPolygonMapper_$widgets(image2D)
+            aPolygonMapper_$widgets(image2D)  SetInput aPolygonGrid_$widgets(image2D)
+
+        vtkActor aPolygonActor_$widgets(image2D)
+            aPolygonActor_$widgets(image2D) SetMapper aPolygonMapper_$widgets(image2D)
+            set Property1 [ aPolygonActor_$widgets(image2D) GetProperty ]
+            $Property1 SetColor 0 1 0
+            $Property1 SetLineWidth 2
+            $Property1 SetPointSize 2
+            $Property1 BackfaceCullingOff
+
+        array set arr [ params_dll 0 ]
+        if { $arr(e_debug_fill_area) == 1 } { renderer_$widgets(image2D) AddActor aPolygonActor_$widgets(image2D) }
+
+        [ $widgets(work3D) GetRenderWindow ] Render
+        [ $widgets(image2D) GetRenderWindow ] Render
+
+    }
+
+}
+
+proc planes_window::clean_BLT { } {
+
+    # For programming facilities
+    upvar planes_window::widgets     widgets
+
+    $widgets(graph) axis configure y -min 0.00
+    $widgets(graph) grid configure  -hide no
+    $widgets(graph) legend configure -position bottom -font {Helvetica -14 bold}
+    Blt_Crosshairs $widgets(graph)
+    $widgets(graph) crosshairs configure -hide no
+    $widgets(graph) crosshairs configure -color red -dashes 2
+    bind bltCrosshairs <ButtonPress-1> {}
+
+    catch { $widgets(graph) marker delete line_select }
+    catch { $widgets(graph) element delete $string_table::str_area }
+    catch { $widgets(graph) element delete $string_table::str_peri }
+    catch { $widgets(graph) element delete $string_table::str_diam_area }
+    catch { $widgets(graph) element delete $string_table::str_diam_peri }
+    catch { $widgets(graph) element delete $string_table::str_diam_max }
+    catch { $widgets(graph) element delete $string_table::str_diam_min }
+    catch { $widgets(graph) element delete $string_table::str_diam_avg }
+    catch { $widgets(graph) element delete $string_table::str_stenosis }
+
+}
+
+proc planes_window::update_blt_all_meassures { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actual_quant_x     actual_quant_x
+    upvar planes_window::actual_quant_area  actual_quant_area
+    upvar planes_window::actual_quant_peri  actual_quant_peri
+    upvar planes_window::actual_quant_darea actual_quant_darea
+    upvar planes_window::actual_quant_dperi actual_quant_dperi
+    upvar planes_window::actual_quant_dmax  actual_quant_dmax
+    upvar planes_window::actual_quant_dmin  actual_quant_dmin
+    upvar planes_window::actual_quant_davg  actual_quant_davg
+    upvar planes_window::actual_quant_sten  actual_quant_sten
+    upvar planes_window::quant_shown        quant_shown
+
+    if { [ llength $actual_quant_x ] > 0 } {
+    
+        planes_window::clean_BLT
+        bind bltCrosshairs <ButtonPress-1> "planes_window::set_plane_BLT %x"
+
+        array set arr [ params_dll 0 ]
+
+        if { [ expr $arr(e_quantification_type) & 0x01 ] == 0x01 } { $widgets(graph) element create $string_table::str_area      -symbol "" -color #ff0000 -xdata $actual_quant_x -ydata $actual_quant_area }
+        if { [ expr $arr(e_quantification_type) & 0x02 ] == 0x02 } { $widgets(graph) element create $string_table::str_peri      -symbol "" -color #ff8000 -xdata $actual_quant_x -ydata $actual_quant_peri }
+        if { [ expr $arr(e_quantification_type) & 0x04 ] == 0x04 } { $widgets(graph) element create $string_table::str_diam_area -symbol "" -color #808040 -xdata $actual_quant_x -ydata $actual_quant_darea }
+        if { [ expr $arr(e_quantification_type) & 0x08 ] == 0x08 } { $widgets(graph) element create $string_table::str_diam_peri -symbol "" -color #808080 -xdata $actual_quant_x -ydata $actual_quant_dperi }
+        if { [ expr $arr(e_quantification_type) & 0x10 ] == 0x10 } { $widgets(graph) element create $string_table::str_diam_min  -symbol "" -color #0000ff -xdata $actual_quant_x -ydata $actual_quant_dmin }
+        if { [ expr $arr(e_quantification_type) & 0x20 ] == 0x20 } { $widgets(graph) element create $string_table::str_diam_max  -symbol "" -color #800080 -xdata $actual_quant_x -ydata $actual_quant_dmax }
+        if { [ expr $arr(e_quantification_type) & 0x40 ] == 0x40 } { $widgets(graph) element create $string_table::str_diam_avg  -symbol "" -color #000000 -xdata $actual_quant_x -ydata $actual_quant_davg }
+        if { [ llength $actual_quant_sten ] > 0 } {
+    
+            set actual_quant_sten [ getStenosisQuant_dll ]
+            $widgets(graph) element create $string_table::str_stenosis -symbol "" -color #00ff00 -xdata $actual_quant_x -ydata $actual_quant_sten
+            $widgets(graph) element configure $string_table::str_stenosis -mapy y2
+            $widgets(graph) axis configure y2 -hide no
+            $widgets(graph) axis configure y2 -min -100.00 -max 100.00
+
+        }
+
+    }
+
+}
+
+proc planes_window::ev_start_window_level { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::initX           initX
+    upvar planes_window::initY           initY
+    upvar planes_window::initWindow      initWindow
+    upvar planes_window::initLevel       initLevel
+
+    set initX $x
+    set initY $y
+
+    set initWindow [ bwlookup_$widgets(work3D) GetWindow ]
+    set initLevel  [ bwlookup_$widgets(work3D) GetLevel  ]
+
+}
+
+proc planes_window::ev_window_level { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::initX           initX
+    upvar planes_window::initY           initY
+    upvar planes_window::initWindow      initWindow
+    upvar planes_window::initLevel       initLevel
+
+    # get the widgets dimensions
+    set width  [ lindex [ $widgets(image2D) configure -width ] 4 ]
+    set height [ lindex [ $widgets(image2D) configure -height ] 4 ]
+
+    # compute normalized delta
+    set dx [ expr 4.0 * ( $x - $initX ) / $width  ]
+    set dy [ expr 4.0 * ( $initY - $y ) / $height ]
+
+    # scale by current values 
+    set dx [ expr $dx * $initWindow ]
+    set dy [ expr $dy * $initLevel  ]
+
+    # abs so that direction does not flip
+    if { $initWindow < 0.00 } { set dx [ expr 0 - $dx ] }
+    if { $initLevel < 0.00  } { set dy [ expr 0 - $dy ] }
+    
+    # compute new window level
+    set window [ expr $dx + $initWindow ]
+    if {$window < 0.00} {
+    set level [ expr $dy + $initLevel ]
+    } else {
+    set level [ expr $initLevel - $dy ]
+    }
+    
+    if { $window < 0.00 } { set dy [ expr 0 - $dy ] }
+    
+    bwlookup_$widgets(work3D) SetWindow $window
+    bwlookup_$widgets(work3D) SetLevel  $level
+
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::profil_linear { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::initX   initX
+    upvar planes_window::initY   initY
+
+    set y1 [ expr [ lindex [ $widgets(image2D) configure -height ] 4 ] - $initY - 1 ]
+    set y2 [ expr [ lindex [ $widgets(image2D) configure -height ] 4 ] - $y - 1 ]
+    set x1 $initX
+    set x2 $x
+    
+    catch { tmp_picker_$widgets(image2D) Delete }
+    vtkWorldPointPicker tmp_picker_$widgets(image2D)
+        set pickWP     [ tmp_picker_$widgets(image2D) Pick $x1 $y1 0 renderer_$widgets(image2D) ]
+        set pickWPPos1 [ tmp_picker_$widgets(image2D) GetPickPosition ]
+        set pickWP     [ tmp_picker_$widgets(image2D) Pick $x2 $y2 0 renderer_$widgets(image2D) ]
+        set pickWPPos2 [ tmp_picker_$widgets(image2D) GetPickPosition ]
+
+    set c1 [ list [ lindex $pickWPPos1 0 ] [ lindex $pickWPPos1 1 ] 0 ]
+    set c2 [ list [ lindex $pickWPPos2 0 ] [ lindex $pickWPPos2 1 ] 0 ]
+
+    planes_window::clear
+    
+    renderer_$widgets(image2D) AddActor [ \
+        DrawSphere prb1_lfv 0.1 \
+        [ lindex $c1 0 ] [ lindex $c1 1 ] [ lindex $c1 2 ] \
+        1.0 0.00 0.00
+    ]
+    renderer_$widgets(image2D) AddActor [ \
+        DrawSphere prb2_lfv 0.1 \
+        [ lindex $c2 0 ] [ lindex $c2 1 ] [ lindex $c2 2 ] \
+        0.00 0.00 1.0
+    ]
+    
+    vtkLineSource line_2D_profil_$widgets(image2D)
+        line_2D_profil_$widgets(image2D) SetPoint1 [ lindex $c1 0 ] [ lindex $c1 1 ] [ lindex $c1 2 ]
+        line_2D_profil_$widgets(image2D) SetPoint2 [ lindex $c2 0 ] [ lindex $c2 1 ] [ lindex $c2 2 ]
+    vtkPolyDataMapper mapper_2D_profil_$widgets(image2D)
+        mapper_2D_profil_$widgets(image2D) SetInput [ line_2D_profil_$widgets(image2D) GetOutput ]
+        mapper_2D_profil_$widgets(image2D) ImmediateModeRenderingOn
+    vtkActor actor_2D_profil_$widgets(image2D)
+        actor_2D_profil_$widgets(image2D) SetMapper mapper_2D_profil_$widgets(image2D)
+        [ actor_2D_profil_$widgets(image2D) GetProperty ] SetColor  1.0 0.00 0.00
+    renderer_$widgets(image2D) AddActor actor_2D_profil_$widgets(image2D)
+
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    busy hold .
+    update
+    set vals [ getProfilCut_dll $c1 $c2 ]
+    catch { destroy $widgets(image2D).fnProfil }
+    toplevel $widgets(image2D).fnProfil -width [ lindex $vals 2 ] -height [ lindex $vals 1 ] -background black
+    canvas $widgets(image2D).fnProfil.c -width [ lindex $vals 2 ] -height [ lindex $vals 1 ] -background black -borderwidth 1
+    pack $widgets(image2D).fnProfil.c -fill both -expand 1
+    for { set i 5 } { $i < [ llength $vals ] } { incr i } {
+            
+        if { $i > 5 } {
+
+        $widgets(image2D).fnProfil.c create line \
+            [ expr $i - 6 ] [ expr [ lindex $vals 1 ] - [ lindex $vals [ expr $i - 1 ] ] ] \
+            [ expr $i - 5 ] [ expr [ lindex $vals 1 ] - [ lindex $vals $i ] ] \
+            -fill #0000ff -width 1
+
+        } else {
+
+            $widgets(image2D).fnProfil.c create line \
+                0 0 \
+                [ expr $i - 5 ] [ expr [ lindex $vals 1 ] - [ lindex $vals $i ] ] \
+                -fill #0000ff -width 1
+
+        }
+
+    }
+    array set arr [ params_dll 0 ]
+    set dist [ DistPoints [ lindex $c1 0 ] [ lindex $c1 1 ] 0 [ lindex $c2 0 ] [ lindex $c2 1 ] 0 ]
+    set len [ expr $dist * $arr(e_scale) * $arr(e_roi_dimension) / [ getCutSize_dll ] ]
+    $widgets(image2D).fnProfil.c create text \
+        0 0 \
+        -text "$string_table::str_min = [ lindex $vals 0 ]\n$string_table::str_max = [ lindex $vals 1 ]\n$string_table::str_nro_pix = [ lindex $vals 2 ]\n$string_table::str_mm_length = $len\n$string_table::str_avg = [ lindex $vals 3 ]\n$string_table::str_std = [ lindex $vals 4 ]" \
+        -fill yellow \
+        -justify left \
+        -anchor nw \
+        -font { Helvetica -12 bold }
+    busy release .
+    update
+
+}
+
+proc planes_window::profil_area { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::initX   initX
+    upvar planes_window::initY   initY
+
+    set y1 [ expr [ lindex [ $widgets(image2D) configure -height ] 4 ] - $initY - 1 ]
+    set y2 [ expr [ lindex [ $widgets(image2D) configure -height ] 4 ] - $y - 1 ]
+    set x1 $initX
+    set x2 $x
+    
+    catch { tmp_picker_$widgets(image2D) Delete }
+    vtkWorldPointPicker tmp_picker_$widgets(image2D)
+        set pickWP     [ tmp_picker_$widgets(image2D) Pick $x1 $y1 0 renderer_$widgets(image2D) ]
+        set pickWPPos1 [ tmp_picker_$widgets(image2D) GetPickPosition ]
+        set pickWP     [ tmp_picker_$widgets(image2D) Pick $x2 $y2 0 renderer_$widgets(image2D) ]
+        set pickWPPos2 [ tmp_picker_$widgets(image2D) GetPickPosition ]
+
+    set c1 [ list [ lindex $pickWPPos1 0 ] [ lindex $pickWPPos1 1 ] 0 ]
+    set c2 [ list [ lindex $pickWPPos2 0 ] [ lindex $pickWPPos2 1 ] 0 ]
+
+    planes_window::clear
+
+    renderer_$widgets(image2D) AddActor [ \
+        DrawSphere prb1_lfv2 1.0 \
+        [ lindex $c1 0 ] [ lindex $c1 1 ] [ lindex $c1 2 ] \
+        1.0 0.00 0.00
+    ]
+    renderer_$widgets(image2D) AddActor [ \
+        DrawSphere prb2_lfv2 1.0 \
+        [ lindex $c2 0 ] [ lindex $c2 1 ] [ lindex $c2 2 ] \
+        0.00 0.00 1.0
+    ]
+    
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+    busy hold .
+    update
+    set vals [ getProfilAreaCut_dll $c1 $c2 ]
+    catch { destroy .fnProfil }
+    toplevel $widgets(image2D).fnProfil -width 100 -height 100 -background black
+    canvas $widgets(image2D).fnProfil.c -width 100 -height 100 -background black -borderwidth 1
+    pack $widgets(image2D).fnProfil.c -fill both -expand 1
+    $widgets(image2D).fnProfil.c create text \
+        0 0 \
+        -text "$string_table::str_min = [ lindex $vals 0 ]\n$string_table::str_max = [ lindex $vals 1 ]\n$string_table::str_nro_pix = [ lindex $vals 2 ]\n$string_table::str_avg = [ lindex $vals 3 ]\n$string_table::str_std = [ lindex $vals 4 ]" \
+        -fill yellow \
+        -justify left \
+        -anchor nw \
+        -font { Helvetica -12 bold }
+    busy release .
+    update
+
+}
+
+proc planes_window::clear { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    catch { renderer_$widgets(image2D) RemoveActor [ GetSphereActorName prb1_lfv2 ] }
+    catch { renderer_$widgets(image2D) RemoveActor [ GetSphereActorName prb2_lfv2 ] }
+    DeleteSphere prb1_lfv2
+    DeleteSphere prb2_lfv2
+    catch { renderer_$widgets(image2D) RemoveActor [ GetSphereActorName prb1_lfv ] }
+    catch { renderer_$widgets(image2D) RemoveActor [ GetSphereActorName prb2_lfv ] }
+    catch { renderer_$widgets(image2D) RemoveActor actor_2D_profil_$widgets(image2D) }
+    catch { actor_2D_profil_$widgets(image2D) Delete }
+    catch { mapper_2D_profil_$widgets(image2D) Delete }
+    catch { line_2D_profil_$widgets(image2D) Delete }
+    DeleteSphere prb1_lfv
+    DeleteSphere prb2_lfv
+
+    catch { [ $widgets(image2D) GetRenderWindow ] Render }
+
+}
+
+proc planes_window::set_healthy_slice { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index        axis_index
+    upvar planes_window::first_point_quant first_point_quant
+    upvar planes_window::last_point_quant  last_point_quant
+    upvar planes_window::show_hs_var show_hs_var
+    upvar planes_window::actual_sten actual_sten
+    upvar planes_window::actual_quant_sten actual_quant_sten
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+
+    set f $real_first_point_quant
+    set l $real_last_point_quant
+
+    set x [ list ]
+    for { set i $f } { $i <= $l } { incr i } { lappend x $i }
+
+    set slice [ $widgets(sclSlice) get ]
+
+    # Get new data
+    setHealthySlice_dll $slice
+    set actual_quant_sten [ getStenosisQuant_dll ]
+
+    # Show it
+    catch { $widgets(graph) marker delete line_healthy_slice }
+    $widgets(graph) marker create line -coords { $slice -Inf $slice Inf } -dashes dash -linewidth 1.5 -outline green -name line_healthy_slice
+    planes_window::update_blt_all_meassures
+    set actual_sten 0.00
+
+    # Show plane
+    set plane [ getVTKPlane_dll ]
+    set o [ $plane GetOrigin ]
+    set c [ $plane GetCenter ]
+    set n [ $plane GetNormal ]
+    set p1 [ $plane GetPoint1 ]
+    set p2 [ $plane GetPoint2 ]
+
+    catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+    catch { hs_actor_$widgets(work3D) Delete }
+    catch { hs_mapper_$widgets(work3D) Delete }
+    catch { hs_grid_$widgets(work3D) Delete }
+    catch { hs_points_$widgets(work3D) Delete }
+    catch { hs_poly_line_$widgets(work3D) Delete }
+
+    vtkPolyLine hs_poly_line_$widgets(work3D)
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetNumberOfIds 8
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 0 0
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 1 1
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 2 2
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 3 3
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 4 4
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 5 5
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 6 6
+        [ hs_poly_line_$widgets(work3D) GetPointIds ] SetId 7 7
+
+    vtkPoints hs_points_$widgets(work3D)
+        hs_points_$widgets(work3D) InsertNextPoint [ lindex $o 0 ] [ lindex $o 1 ] [ lindex $o 2 ]
+        hs_points_$widgets(work3D) InsertNextPoint [ lindex $p1 0 ] [ lindex $p1 1 ] [ lindex $p1 2 ]
+        hs_points_$widgets(work3D) InsertNextPoint \
+            [ expr [ lindex $p2 0 ] + [ lindex $p1 0 ] - [ lindex $o 0 ] ] \
+            [ expr [ lindex $p2 1 ] + [ lindex $p1 1 ] - [ lindex $o 1 ] ] \
+            [ expr [ lindex $p2 2 ] + [ lindex $p1 2 ] - [ lindex $o 2 ] ]
+        hs_points_$widgets(work3D) InsertNextPoint [ lindex $p2 0 ] [ lindex $p2 1 ] [ lindex $p2 2 ]
+        hs_points_$widgets(work3D) InsertNextPoint [ lindex $o 0 ] [ lindex $o 1 ] [ lindex $o 2 ]
+        hs_points_$widgets(work3D) InsertNextPoint \
+            [ expr [ lindex $p2 0 ] + [ lindex $p1 0 ] - [ lindex $o 0 ] ] \
+            [ expr [ lindex $p2 1 ] + [ lindex $p1 1 ] - [ lindex $o 1 ] ] \
+            [ expr [ lindex $p2 2 ] + [ lindex $p1 2 ] - [ lindex $o 2 ] ]
+        hs_points_$widgets(work3D) InsertNextPoint [ lindex $p1 0 ] [ lindex $p1 1 ] [ lindex $p1 2 ]
+        hs_points_$widgets(work3D) InsertNextPoint [ lindex $p2 0 ] [ lindex $p2 1 ] [ lindex $p2 2 ]
+
+    vtkUnstructuredGrid hs_grid_$widgets(work3D)
+        hs_grid_$widgets(work3D) Allocate 1 1
+        hs_grid_$widgets(work3D) InsertNextCell \
+            [ hs_poly_line_$widgets(work3D) GetCellType ] [ hs_poly_line_$widgets(work3D) GetPointIds ]
+            hs_grid_$widgets(work3D) SetPoints hs_points_$widgets(work3D)
+
+    vtkDataSetMapper hs_mapper_$widgets(work3D)
+        hs_mapper_$widgets(work3D) SetInput hs_grid_$widgets(work3D)
+        hs_mapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor hs_actor_$widgets(work3D)
+        hs_actor_$widgets(work3D) SetMapper hs_mapper_$widgets(work3D)
+        [ hs_actor_$widgets(work3D) GetProperty] BackfaceCullingOn
+        [ hs_actor_$widgets(work3D) GetProperty] SetDiffuseColor 0 1 0
+
+    if { $show_hs_var == 1 } { catch { renderer_$widgets(work3D) AddActor hs_actor_$widgets(work3D) } }
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::set_plane_BLT { x } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+
+    busy hold .
+    update
+
+    set slice [ expr round( [ $widgets(graph) axis invtransform x $x ] ) ]
+    $widgets(sclSlice) set $slice
+    planes_window::set_plane
+    catch { $widgets(graph) marker delete line_select }
+    $widgets(graph) marker create line -coords { $slice -Inf $slice Inf } -dashes dash -linewidth 1 -outline red -name line_select
+
+    busy release .
+    update
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::add_point_contour_manual { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::man_points man_points
+
+    set y [ expr [ lindex [ $widgets(image2D) configure -height ] 4 ] - $y - 1 ]
+
+    catch { tmp_picker_$widgets(image2D) Delete }
+    vtkWorldPointPicker tmp_picker_$widgets(image2D)
+        set pickWP    [ tmp_picker_$widgets(image2D) Pick $x $y 0 renderer_$widgets(image2D) ]
+        set pickWPPos [ tmp_picker_$widgets(image2D) GetPickPosition ]
+
+    set point [ list [ lindex $pickWPPos 0 ] [ lindex $pickWPPos 1 ] 0 ]
+    lappend man_points [ lindex $point 0 ]
+    lappend man_points [ lindex $point 1 ]
+    set i [ llength $man_points ]
+
+    renderer_$widgets(image2D) AddActor [ \
+        DrawSphere man_point_$i 0.5 \
+        [ lindex $point 0 ] [ lindex $point 1 ] [ lindex $point 2 ] \
+        0.00 1.0 0.00
+    ]
+    
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::set_mouse_left_events { mask } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    # TODO : change
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+    catch { bind $widgets(image2D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(image2D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    if { [ expr $mask & 0x4 ] == 0x4 } { 
+
+        catch { bind $widgets(work3D) <B1-Motion> { evz_rotate %W %x %y } }
+        catch { bind $widgets(image2D) <B1-Motion> { evz_pan %W %x %y } }
+
+    }
+    if { [ expr $mask & 0x2 ] == 0x2 } {
+    
+        catch { bind $widgets(work3D) <B1-Motion> { evz_pan %W %x %y } }
+        catch { bind $widgets(image2D) <B1-Motion> { evz_pan %W %x %y } }
+        
+    }
+    if { [ expr $mask & 0x1 ] == 0x1 } {
+
+        catch { bind $widgets(image2D) <B1-Motion> { planes_window::point_intensity %x %y } }
+
+    }
+
+}
+
+proc planes_window::set_mouse_right_events { mask } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    if { [ expr $mask & 0x4 ] == 0x4 } {
+
+        catch { bind $widgets(work3D) <B3-Motion> { evz_zoom %W %x %y } }
+
+        catch { bind $widgets(image2D) <ButtonPress-3>   { ev_startMotion %W %x %y } }
+        catch { bind $widgets(image2D) <ButtonRelease-3> { ev_endMotion %W %x %y } }
+        catch { bind $widgets(image2D) <B3-Motion>       { evz_zoom %W %x %y } }
+
+    }
+    if { [ expr $mask & 0x8 ] == 0x8 } {
+
+        catch { bind $widgets(work3D) <B3-Motion> { evz_zoom %W %x %y } }
+
+        catch { bind $widgets(image2D) <ButtonPress-3>   { planes_window::ev_start_window_level %x %y } }
+        catch { bind $widgets(image2D) <ButtonRelease-3> { ev_endMotion %W %x %y } }
+        catch { bind $widgets(image2D) <B3-Motion>       { planes_window::ev_window_level %x %y } }
+
+    }
+    if { [ expr $mask & 0x2 ] == 0x2 } {
+
+        catch { bind $widgets(work3D) <B3-Motion> { evz_zoom %W %x %y } }
+
+        catch { bind $widgets(image2D) <ButtonPress-3>   { planes_window::ev_start_window_level %x %y } }
+        catch { bind $widgets(image2D) <B3-Motion>       { } }
+        catch { bind $widgets(image2D) <ButtonRelease-3> { planes_window::profil_linear %x %y } }
+
+    }
+    if { [ expr $mask & 0x1 ] == 0x1 } {
+
+        catch { bind $widgets(work3D) <B3-Motion> { evz_zoom %W %x %y } }
+
+        catch { bind $widgets(image2D) <ButtonPress-3>   { planes_window::ev_start_window_level %x %y } }
+        catch { bind $widgets(image2D) <B3-Motion>       { } }
+        catch { bind $widgets(image2D) <ButtonRelease-3> { planes_window::profil_area %x %y } }
+
+    }
+
+}
+
+proc planes_window::draw3D_contour { slice } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+    upvar planes_window::show_rings show_rings
+    upvar planes_window::rings_index  rings_index
+
+    if { [ lsearch -exact $rings_index $slice ] == -1 } { lappend rings_index $slice }
+
+    catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$slice} }
+    catch { cont3DActor_{$widgets(work3D)}_{$slice}    Delete }
+    catch { cont3DMapper_{$widgets(work3D)}_{$slice}   Delete }
+    catch { cont3DGrid_{$widgets(work3D)}_{$slice}     Delete }
+    catch { cont3DPolyLine_{$widgets(work3D)}_{$slice} Delete }
+    catch { cont3DPoints_{$widgets(work3D)}_{$slice}   Delete }
+
+    set points3D [ get3DContour_dll $slice ]
+    set nP [ expr [ llength $points3D ] / 3 ]
+
+    vtkPoints cont3DPoints_{$widgets(work3D)}_{$slice}
+    vtkPolyLine cont3DPolyLine_{$widgets(work3D)}_{$slice}
+    [ cont3DPolyLine_{$widgets(work3D)}_{$slice} GetPointIds ] SetNumberOfIds $nP
+    for { set i 0 } { $i < $nP } { incr i } {
+
+        [ cont3DPolyLine_{$widgets(work3D)}_{$slice} GetPointIds ] SetId $i $i
+        cont3DPoints_{$widgets(work3D)}_{$slice} InsertNextPoint \
+            [ lindex $points3D [ expr $i * 3 + 0 ] ] \
+            [ lindex $points3D [ expr $i * 3 + 1 ] ] \
+            [ lindex $points3D [ expr $i * 3 + 2 ] ]
+
+    }
+
+    vtkUnstructuredGrid cont3DGrid_{$widgets(work3D)}_{$slice}
+        cont3DGrid_{$widgets(work3D)}_{$slice} Allocate 1 1
+        cont3DGrid_{$widgets(work3D)}_{$slice} InsertNextCell \
+            [ cont3DPolyLine_{$widgets(work3D)}_{$slice} GetCellType ] \
+            [ cont3DPolyLine_{$widgets(work3D)}_{$slice} GetPointIds ]
+        cont3DGrid_{$widgets(work3D)}_{$slice} SetPoints cont3DPoints_{$widgets(work3D)}_{$slice}
+
+    vtkDataSetMapper cont3DMapper_{$widgets(work3D)}_{$slice}
+        cont3DMapper_{$widgets(work3D)}_{$slice} SetInput cont3DGrid_{$widgets(work3D)}_{$slice}
+     cont3DMapper_{$widgets(work3D)}_{$slice} ImmediateModeRenderingOn
+
+    vtkActor cont3DActor_{$widgets(work3D)}_{$slice}
+        cont3DActor_{$widgets(work3D)}_{$slice} SetMapper cont3DMapper_{$widgets(work3D)}_{$slice}
+        [ cont3DActor_{$widgets(work3D)}_{$slice} GetProperty] BackfaceCullingOn
+        [ cont3DActor_{$widgets(work3D)}_{$slice} GetProperty] SetDiffuseColor 0 1 0
+
+    if { $show_rings == 1 } { renderer_$widgets(work3D) AddActor cont3DActor_{$widgets(work3D)}_{$slice} }
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::show3D_rings_contour { var_rings } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::axis_index axis_index
+    upvar planes_window::show_rings show_rings
+
+    set show_rings $var_rings
+
+    set noap [ getNumberOfAxisPoints_dll ]
+
+    for { set i 0 } { $i < $noap } { incr i } {
+    
+        if { $show_rings == 0 } {
+        catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+        } else {
+        catch { renderer_$widgets(work3D) AddActor cont3DActor_{$widgets(work3D)}_{$i} }
+        }
+    
+    }
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::controls { { id -1 } } {
+
+    if { $id == -1 } {
+
+        global_window::active_controls 0
+
+    } else {
+
+        if { $id == 0 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_rotate    | \
+                $global_window::en_bright    | \
+                $global_window::en_pan       | \
+                $global_window::en_zoom      | \
+                $global_window::en_clear     | \
+                $global_window::en_intensity | \
+                $global_window::en_linear    | \
+                $global_window::en_area      | \
+                $global_window::en_back      | \
+                $global_window::en_wizard    | \
+                0
+            ]
+
+        } elseif { $id == 1 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_quant     | \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_rotate    | \
+                $global_window::en_bright    | \
+                $global_window::en_pan       | \
+                $global_window::en_zoom      | \
+                $global_window::en_clear     | \
+                $global_window::en_intensity | \
+                $global_window::en_linear    | \
+                $global_window::en_area      | \
+                $global_window::en_back      | \
+                $global_window::en_wizard    | \
+                0
+            ]
+
+        } elseif { $id == 2 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_quant     | \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_rotate    | \
+                $global_window::en_bright    | \
+                $global_window::en_pan       | \
+                $global_window::en_zoom      | \
+                $global_window::en_clear     | \
+                $global_window::en_intensity | \
+                $global_window::en_linear    | \
+                $global_window::en_area      | \
+                $global_window::en_back      | \
+                $global_window::en_excel     | \
+                $global_window::en_wizard    | \
+                0
+            ]
+
+        }
+
+    }
+
+}
+
+proc planes_window::point_intensity { x y } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+    catch { tmp_picker_$widgets(image2D) Delete }
+    vtkWorldPointPicker tmp_picker_$widgets(image2D)
+        set pickWP    [ tmp_picker_$widgets(image2D) Pick $x $y 0 renderer_$widgets(image2D) ]
+        set pickWPPos [ tmp_picker_$widgets(image2D) GetPickPosition ]
+    set x [ lindex [ split [ lindex $pickWPPos 0 ] . ] 0 ]
+    set y [ lindex [ split [ lindex $pickWPPos 1 ] . ] 0 ]
+    set y [ expr [ getCutSize_dll ] - $y - 1 ]
+    set intensity [ getIntensityCut_dll  $x $y ]
+
+}
+    
+
+proc planes_window::refresh_quant { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::actual_quant_sten actual_quant_sten
+    upvar planes_window::axis_index axis_index
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+
+    if { $real_first_point_quant != -1 && $real_last_point_quant != -1 && [ llength $actual_quant_sten ] > 0 } {
+            
+        set actual_quant_sten [ getStenosisQuant_dll ]
+        set actual_sten [ change_float_precision [ lindex $actual_quant_sten [ expr [ $widgets(sclSlice) get ] - $real_first_point_quant ] ] 2 ]
+
+    }
+    planes_window::update_blt_all_meassures
+
+}
+
+proc planes_window::pause { } {
+
+    # For programming facilities
+    upvar planes_window::widgets    widgets
+    upvar planes_window::quantifing quantifing
+
+    if { $quantifing == 1 } {
+
+        set quantifing 2
+        $widgets(btnPause) configure -text $string_table::str_play
+        backQuant_dll
+
+    } elseif { $quantifing == 2 } {
+
+        set quantifing 1
+        $widgets(btnPause) configure -text $string_table::str_pause
+
+    }
+
+}
+
+
+proc planes_window::clean3D { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+    upvar planes_window::rings_index rings_index
+    upvar planes_window::actual_area  actual_area
+    upvar planes_window::actual_peri  actual_peri
+    upvar planes_window::actual_darea actual_darea
+    upvar planes_window::actual_dperi actual_dperi
+    upvar planes_window::actual_dmax  actual_dmax
+    upvar planes_window::actual_dmin  actual_dmin
+    upvar planes_window::actual_davg  actual_davg
+    upvar planes_window::actual_sten  actual_sten
+    upvar planes_window::quant_shown  quant_shown
+    upvar planes_window::actual_quant_x     actual_quant_x
+    upvar planes_window::actual_quant_area  actual_quant_area
+    upvar planes_window::actual_quant_peri  actual_quant_peri
+    upvar planes_window::actual_quant_darea actual_quant_darea
+    upvar planes_window::actual_quant_dperi actual_quant_dperi
+    upvar planes_window::actual_quant_dmax  actual_quant_dmax
+    upvar planes_window::actual_quant_dmin  actual_quant_dmin
+    upvar planes_window::actual_quant_davg  actual_quant_davg
+    upvar planes_window::actual_quant_sten  actual_quant_sten
+    upvar planes_window::first_quant first_quant
+
+    set first_quant 1
+    set real_first_point_quant -1
+    set real_last_point_quant -1
+    planes_window::controls 1
+    set quant_shown 0
+
+    catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+    catch { hs_actor_$widgets(work3D) Delete }
+    catch { hs_mapper_$widgets(work3D) Delete }
+    catch { hs_grid_$widgets(work3D) Delete }
+    catch { hs_points_$widgets(work3D) Delete }
+    catch { hs_poly_line_$widgets(work3D) Delete }
+    foreach i $rings_index {
+
+        catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+        catch { cont3DActor_{$widgets(work3D)}_{$i}    Delete }
+        catch { cont3DMapper_{$widgets(work3D)}_{$i}   Delete }
+        catch { cont3DGrid_{$widgets(work3D)}_{$i}     Delete }
+        catch { cont3DPolyLine_{$widgets(work3D)}_{$i} Delete }
+        catch { cont3DPoints_{$widgets(work3D)}_{$i}   Delete }
+
+    }
+    set rings_index [ list ]
+
+}
+
+proc planes_window::erase_all_data { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant real_last_point_quant
+    upvar planes_window::rings_index rings_index
+    upvar planes_window::actual_area  actual_area
+    upvar planes_window::actual_peri  actual_peri
+    upvar planes_window::actual_darea actual_darea
+    upvar planes_window::actual_dperi actual_dperi
+    upvar planes_window::actual_dmax  actual_dmax
+    upvar planes_window::actual_dmin  actual_dmin
+    upvar planes_window::actual_davg  actual_davg
+    upvar planes_window::actual_sten  actual_sten
+    upvar planes_window::quant_shown  quant_shown
+    upvar planes_window::actual_quant_x     actual_quant_x
+    upvar planes_window::actual_quant_area  actual_quant_area
+    upvar planes_window::actual_quant_peri  actual_quant_peri
+    upvar planes_window::actual_quant_darea actual_quant_darea
+    upvar planes_window::actual_quant_dperi actual_quant_dperi
+    upvar planes_window::actual_quant_dmax  actual_quant_dmax
+    upvar planes_window::actual_quant_dmin  actual_quant_dmin
+    upvar planes_window::actual_quant_davg  actual_quant_davg
+    upvar planes_window::actual_quant_sten  actual_quant_sten
+    upvar planes_window::first_quant first_quant
+
+    set ans [ \
+        tk_messageBox \
+            -icon question \
+            -message "$string_table::str_erase_quant_q" \
+            -type yesno \
+            -title "Question" \
+    ]
+
+    if { [ string compare $ans yes ] == 0 } {
+
+        set first_quant 1
+        set real_first_point_quant -1
+        set real_last_point_quant -1
+        planes_window::controls 1
+        set quant_shown 0
+        planes_window::clean_BLT
+
+        catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+        catch { hs_actor_$widgets(work3D) Delete }
+        catch { hs_mapper_$widgets(work3D) Delete }
+        catch { hs_grid_$widgets(work3D) Delete }
+        catch { hs_points_$widgets(work3D) Delete }
+        catch { hs_poly_line_$widgets(work3D) Delete }
+        foreach i $rings_index {
+
+            catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+            catch { cont3DActor_{$widgets(work3D)}_{$i}    Delete }
+            catch { cont3DMapper_{$widgets(work3D)}_{$i}   Delete }
+            catch { cont3DGrid_{$widgets(work3D)}_{$i}     Delete }
+            catch { cont3DPolyLine_{$widgets(work3D)}_{$i} Delete }
+            catch { cont3DPoints_{$widgets(work3D)}_{$i}   Delete }
+
+        }
+        set rings_index [ list ]
+
+        set actual_quant_x     [ list ]
+        set actual_quant_area  [ list ]
+        set actual_quant_peri  [ list ]
+        set actual_quant_darea [ list ]
+        set actual_quant_dperi [ list ]
+        set actual_quant_dmax  [ list ]
+        set actual_quant_dmin  [ list ]
+        set actual_quant_davg  [ list ]
+        set actual_quant_sten  [ list ]
+
+        set actual_area  0.00
+        set actual_peri  0.00
+        set actual_darea 0.00
+        set actual_dperi 0.00
+        set actual_dmax  0.00
+        set actual_dmin  0.00
+        set actual_davg  0.00
+        set actual_sten  0.00
+        set quant_shown  0
+        [ $widgets(work3D) GetRenderWindow ] Render
+
+        planes_window::clean_contour
+
+        set ans [ \
+            tk_messageBox \
+                -icon question \
+                -message "$string_table::str_erase_extracted_contours" \
+                -type yesno \
+                -title "Question" \
+        ]
+        if { [ string compare $ans yes ] == 0 } { cleanData_dll }
+
+    }
+
+}
+
+proc planes_window::reload_axis { mask step } {
+
+    # For programming facilities
+    upvar planes_window::widgets      widgets
+    upvar planes_window::axis_index   axis_index
+    upvar planes_window::given_points given_points
+    upvar planes_window::quant_shown  quant_shown
+    upvar planes_window::shown        shown
+    upvar planes_window::rings_index  rings_index
+
+    if { $step == 1 } {
+        
+        redoAxisSpline_dll
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_quant1_$widgets(work3D) ] }
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_quant2_$widgets(work3D) ] }
+        DeleteSphere sphere_quant1_$widgets(work3D)
+        DeleteSphere sphere_quant2_$widgets(work3D)
+        set given_points 0
+
+    } elseif { $mask == 1 } { recalculeAxisSignal_dll }
+
+    if { ( $mask == 1 || $step == 1 ) && $shown == 1 } {
+        
+        tk_messageBox \
+            -icon info \
+            -message "$string_table::str_quant_will_be_erased" \
+            -type ok
+
+        catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+        catch { hs_actor_$widgets(work3D) Delete }
+        catch { hs_mapper_$widgets(work3D) Delete }
+        catch { hs_grid_$widgets(work3D) Delete }
+        catch { hs_points_$widgets(work3D) Delete }
+        catch { hs_poly_line_$widgets(work3D) Delete }
+        foreach i $rings_index {
+
+            catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+            catch { cont3DActor_{$widgets(work3D)}_{$i}    Delete }
+            catch { cont3DMapper_{$widgets(work3D)}_{$i}   Delete }
+            catch { cont3DGrid_{$widgets(work3D)}_{$i}     Delete }
+            catch { cont3DPolyLine_{$widgets(work3D)}_{$i} Delete }
+            catch { cont3DPoints_{$widgets(work3D)}_{$i}   Delete }
+                
+        }
+        set rings_index [ list ]
+
+        set actual_area  0.00
+        set actual_peri  0.00
+        set actual_darea 0.00
+        set actual_dperi 0.00
+        set actual_dmax  0.00
+        set actual_dmin  0.00
+        set actual_davg  0.00
+        set actual_sten  0.00
+        set quant_shown  0
+
+        planes_window::clean_BLT
+    
+        set first_quant 1
+        set range    [ getIntensityRange_dll ]
+        set resample [ getVTKSource_dll ]
+        set bounds   [ $resample GetBounds ]
+
+        # Axis
+        set points [ getAxis_dll ]
+        set nP [ expr [ llength $points ] / 3 ]
+        $widgets(sclSlice) configure \
+            -from 0 \
+            -to   [ expr [ getNumberOfAxisPoints_dll ] - 1 ] \
+            -resolution 1
+
+        # Poly-line actor construction...
+        catch { renderer_$widgets(work3D) RemoveActor axisActor_$widgets(work3D) }
+        catch { axisActor_$widgets(work3D)    Delete }
+        catch { axisMapper_$widgets(work3D)   Delete }
+        catch { axisGrid_$widgets(work3D)     Delete }
+        catch { axisPolyLine_$widgets(work3D) Delete }
+        catch { axisPoints_$widgets(work3D)   Delete }
+
+        vtkPoints axisPoints_$widgets(work3D)
+        vtkPolyLine axisPolyLine_$widgets(work3D)
+        [ axisPolyLine_$widgets(work3D) GetPointIds ] SetNumberOfIds $nP
+        set vox_size [ getActualVoxelSize_dll ]
+        for { set i 0 } { $i < $nP } { incr i } {
+
+            [ axisPolyLine_$widgets(work3D) GetPointIds ] SetId $i $i
+            set p [ \
+                PointCoord \
+                [ lindex $points [ expr $i * 3 + 0 ] ] \
+                [ lindex $points [ expr $i * 3 + 1 ] ] \
+                [ lindex $points [ expr $i * 3 + 2 ] ] \
+                [ lindex $bounds 0 ] \
+                [ lindex $bounds 2 ] \
+                [ lindex $bounds 4 ] \
+                $vox_size $vox_size $vox_size \
+            ]
+            axisPoints_$widgets(work3D) InsertNextPoint [ lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ]
+
+        }
+
+        vtkUnstructuredGrid axisGrid_$widgets(work3D)
+            axisGrid_$widgets(work3D) Allocate 1 1
+            axisGrid_$widgets(work3D) InsertNextCell \
+                [ axisPolyLine_$widgets(work3D) GetCellType ] \
+                [ axisPolyLine_$widgets(work3D) GetPointIds ]
+                axisGrid_$widgets(work3D) SetPoints axisPoints_$widgets(work3D)
+
+        vtkDataSetMapper axisMapper_$widgets(work3D)
+            axisMapper_$widgets(work3D) SetInput axisGrid_$widgets(work3D)
+            axisMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+        vtkActor axisActor_$widgets(work3D)
+            axisActor_$widgets(work3D) SetMapper axisMapper_$widgets(work3D)
+            [ axisActor_$widgets(work3D) GetProperty] BackfaceCullingOn
+            [ axisActor_$widgets(work3D) GetProperty] SetDiffuseColor 1 0 0
+
+        renderer_$widgets(work3D) AddActor axisActor_$widgets(work3D)
+
+        [ $widgets(work3D) GetRenderWindow ] Render
+        [ $widgets(image2D) GetRenderWindow ] Render
+
+        renderer_$widgets(work3D) AddActor outlineActor_$widgets(work3D)
+        planes_window::controls 0
+
+    }
+    if { $given_points == 1 } {
+            
+        planes_window::controls 1
+
+    }
+    if { $quant_shown == 1 } {
+
+        planes_window::update_blt_all_meassures
+
+    }
+
+}
+
+proc planes_window::load_reconstructed_surface { typ } {
+
+    # For programming facilities
+    upvar planes_window::widgets                widgets
+    upvar planes_window::axis_index             axis_index
+    upvar planes_window::real_first_point_quant real_first_point_quant
+    upvar planes_window::real_last_point_quant  real_last_point_quant
+
+    catch { renderer_$widgets(work3D) RemoveActor surfaceActor_rec_$widgets(work3D) }
+    catch { surfaceActor_rec_$widgets(work3D) Delete }
+    catch { map_rec_$widgets(work3D)          Delete }
+    catch { reverse_rec_$widgets(work3D)      Delete }
+    catch { cf_rec_$widgets(work3D)           Delete }
+    catch { surf_rec_$widgets(work3D)         Delete }
+    catch { source_rec_$widgets(work3D)       Delete }
+    catch { cells_rec_$widgets(work3D)        Delete }
+    catch { points_rec_$widgets(work3D)       Delete }
+
+    if { $typ == 1 } {
+
+        vtkPoints    points_rec_$widgets(work3D)
+        vtkCellArray cells_rec_$widgets(work3D)
+        set f [ getFirstSlice_dll ]
+        set l [ getLastSlice_dll ]
+
+        set k 0
+        for { set i $f } { $i < $l } { incr i } {
+
+            set points3D [ get3DContour_dll $i ]
+            set nP [ expr [ llength $points3D ] / 3 ]
+            for { set j 0 } { $j < $nP } { incr j } {
+
+                points_rec_$widgets(work3D) InsertNextPoint \
+                    [ lindex $points3D [ expr $j * 3 + 0 ] ] \
+                    [ lindex $points3D [ expr $j * 3 + 1 ] ] \
+                    [ lindex $points3D [ expr $j * 3 + 2 ] ]
+                cells_rec_$widgets(work3D) InsertNextCell 0
+                cells_rec_$widgets(work3D) InsertCellPoint $k
+                incr k
+
+            }
+
+        }
+
+        vtkPolyData source_rec_$widgets(work3D)
+            source_rec_$widgets(work3D) SetPoints points_rec_$widgets(work3D)
+            source_rec_$widgets(work3D) SetPolys cells_rec_$widgets(work3D)
+
+        vtkSurfaceReconstructionFilter surf_rec_$widgets(work3D)
+            surf_rec_$widgets(work3D) SetInput source_rec_$widgets(work3D)
+            surf_rec_$widgets(work3D) SetSampleSpacing 0.05
+
+        vtkMarchingCubes cf_rec_$widgets(work3D)
+#        vtkContourFilter cf_rec_$widgets(work3D)
+            cf_rec_$widgets(work3D) SetInput [ surf_rec_$widgets(work3D) GetOutput ]
+            cf_rec_$widgets(work3D) SetValue 0 0.0
+
+        vtkReverseSense reverse_rec_$widgets(work3D)
+            reverse_rec_$widgets(work3D) SetInput [ cf_rec_$widgets(work3D) GetOutput ]
+            reverse_rec_$widgets(work3D) ReverseCellsOn
+            reverse_rec_$widgets(work3D) ReverseNormalsOn
+
+        vtkPolyDataMapper map_rec_$widgets(work3D)
+            map_rec_$widgets(work3D) SetInput [ reverse_rec_$widgets(work3D) GetOutput ]
+            map_rec_$widgets(work3D) ScalarVisibilityOff
+
+        vtkActor surfaceActor_rec_$widgets(work3D)
+            surfaceActor_rec_$widgets(work3D) SetMapper map_rec_$widgets(work3D)
+            [ surfaceActor_rec_$widgets(work3D) GetProperty ] SetDiffuseColor 0.5 0.3882 0.2784
+            [ surfaceActor_rec_$widgets(work3D) GetProperty ] SetSpecularColor 1 1 1
+            [ surfaceActor_rec_$widgets(work3D) GetProperty ] SetSpecular .4
+            [ surfaceActor_rec_$widgets(work3D) GetProperty ] SetSpecularPower 50
+
+        renderer_$widgets(work3D) AddActor surfaceActor_rec_$widgets(work3D)
+
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::show_max_min_diameters { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    set slice [ $widgets(sclSlice) get ]
+    set lmax [ getMaximumLine_dll ]
+    set lmin [ getMinimumLine_dll ]
+
+    catch { renderer_$widgets(image2D) RemoveActor dMax_actor_$widgets(image2D) }
+    catch { renderer_$widgets(image2D) RemoveActor dMin_actor_$widgets(image2D) }
+    catch { dMax_actor_$widgets(image2D)   Delete }
+    catch { dMax_mapper_$widgets(image2D) Delete }
+    catch { dMax_line_$widgets(image2D)   Delete }
+    catch { dMin_actor_$widgets(image2D)   Delete }
+    catch { dMin_mapper_$widgets(image2D) Delete }
+    catch { dMin_line_$widgets(image2D)   Delete }
+
+    vtkLineSource dMax_line_$widgets(image2D)
+        dMax_line_$widgets(image2D) SetPoint1 [ lindex $lmax 0 ] [ lindex $lmax 1 ] 0.0
+        dMax_line_$widgets(image2D) SetPoint2 [ lindex $lmax 2 ] [ lindex $lmax 3 ] 0.0
+    vtkPolyDataMapper dMax_mapper_$widgets(image2D)
+        dMax_mapper_$widgets(image2D) SetInput [ dMax_line_$widgets(image2D) GetOutput ]
+        dMax_mapper_$widgets(image2D) ImmediateModeRenderingOn
+    vtkActor dMax_actor_$widgets(image2D)
+        dMax_actor_$widgets(image2D) SetMapper dMax_mapper_$widgets(image2D)
+        [ dMax_actor_$widgets(image2D) GetProperty ] SetColor  1.00 0.00 0.00
+
+    vtkLineSource dMin_line_$widgets(image2D)
+        dMin_line_$widgets(image2D) SetPoint1 [ lindex $lmin 0 ] [ lindex $lmin 1 ] 0.0
+        dMin_line_$widgets(image2D) SetPoint2 [ lindex $lmin 2 ] [ lindex $lmin 3 ] 0.0
+    vtkPolyDataMapper dMin_mapper_$widgets(image2D)
+        dMin_mapper_$widgets(image2D) SetInput [ dMin_line_$widgets(image2D) GetOutput ]
+        dMin_mapper_$widgets(image2D) ImmediateModeRenderingOn
+    vtkActor dMin_actor_$widgets(image2D)
+        dMin_actor_$widgets(image2D) SetMapper dMin_mapper_$widgets(image2D)
+        [ dMin_actor_$widgets(image2D) GetProperty ] SetColor  0.00 0.00 1.00
+
+    array set arr [ params_dll 0 ]
+    if { $arr(e_debug_diameters) == 1 } {
+
+        renderer_$widgets(image2D) AddActor dMax_actor_$widgets(image2D)
+        renderer_$widgets(image2D) AddActor dMin_actor_$widgets(image2D)
+
+    }
+    [ $widgets(image2D) GetRenderWindow ] Render
+
+}
+
+proc planes_window::back { } {
+
+    # For programming facilities
+    upvar planes_window::shown shown
+
+    set ret $shown
+    set shown 0
+
+    return $ret
+
+}
+
+proc planes_window::set_quant_point_from_scale { } {
+
+    # For programming facilities
+    upvar planes_window::widgets widgets
+
+    set slice [ $widgets(sclSlice) get ]
+    planes_window::select_axis_point 0 0 $slice
+
+}
+
+# EOF - planes_window.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/subtract.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/subtract.tcl
new file mode 100644 (file)
index 0000000..d0fb8a4
--- /dev/null
@@ -0,0 +1,182 @@
+
+namespace eval subtract {
+
+    namespace export \
+        show
+
+    # variables
+    variable base ""
+
+    variable frSerieName    .frSerieName
+    variable frDescription  .frDescription
+    variable frSeries       .frSeries
+
+    variable edtSerieName   .frSerieName.02
+    variable edtDescription .frDescription.02
+
+    variable btnLeft1  .frSeries.btnLeft1
+    variable btnLeft2  .frSeries.btnLeft2
+    variable btnRight1 .frSeries.btnRight1
+    variable btnRight2 .frSeries.btnRight2
+
+    variable btnOk     .btnOk
+    variable btnCancel .btnCancel
+
+    variable lbl001 .frSerieName.01
+    variable lblSub .frSeries.lblSub
+    variable lbl002 .frDescription.01
+    variable lblt   .lblt
+
+    variable sense 12
+    variable description
+    variable seriename
+
+}
+
+proc subtract::reset_values { } {
+
+    # For programming facilities
+    upvar subtract::base           base
+    upvar subtract::frSerieName    frSerieName
+    upvar subtract::frDescription  frDescription
+    upvar subtract::frSeries       frSeries
+    upvar subtract::edtSerieName   edtSerieName
+    upvar subtract::edtDescription edtDescription
+    upvar subtract::btnLeft1       btnLeft1
+    upvar subtract::btnLeft2       btnLeft2
+    upvar subtract::btnRight1      btnRight1
+    upvar subtract::btnRight2      btnRight2
+    upvar subtract::btnOk          btnOk
+    upvar subtract::btnCancel      btnCancel
+    upvar subtract::lbl001         lbl001
+    upvar subtract::lblSub         lblSub
+    upvar subtract::lbl002         lbl002
+    upvar subtract::lblt           lblt
+    upvar subtract::sense          sense
+
+    set base           ""
+    set frSerieName    ".frSerieName"
+    set frDescription  ".frDescription"
+    set frSeries       ".frSeries"
+    set edtSerieName   ".frSerieName.02"
+    set edtDescription ".frDescription.02"
+    set btnLeft1       ".frSeries.btnLeft1"
+    set btnLeft2       ".frSeries.btnLeft2"
+    set btnRight1      ".frSeries.btnRight1"
+    set btnRight2      ".frSeries.btnRight2"
+    set btnOk          ".btnOk"
+    set btnCancel      ".btnCancel"
+    set lbl001         ".frSerieName.01"
+    set lblSub         ".frSeries.lblSub"
+    set lbl002         ".frDescription.01"
+    set lblt           ".lblt"
+    set sense 12
+
+}
+
+
+proc subtract::show { parent serie1 serie2 } {
+
+    # For programming facilities
+    upvar subtract::base           base
+    upvar subtract::frSerieName    frSerieName
+    upvar subtract::frDescription  frDescription
+    upvar subtract::frSeries       frSeries
+    upvar subtract::edtSerieName   edtSerieName
+    upvar subtract::edtDescription edtDescription
+    upvar subtract::btnLeft1       btnLeft1
+    upvar subtract::btnLeft2       btnLeft2
+    upvar subtract::btnRight1      btnRight1
+    upvar subtract::btnRight2      btnRight2
+    upvar subtract::btnOk          btnOk
+    upvar subtract::btnCancel      btnCancel
+    upvar subtract::lbl001         lbl001
+    upvar subtract::lblSub         lblSub
+    upvar subtract::lbl002         lbl002
+    upvar subtract::lblt           lblt
+    upvar subtract::sense          sense
+    upvar subtract::description    description
+    upvar subtract::seriename      seriename
+
+    subtract::reset_values
+    set base           "$parent.subtract"
+    set frSerieName    "$base$frSerieName"
+    set frDescription  "$base$frDescription"
+    set frSeries       "$base$frSeries"
+    set edtSerieName   "$base$edtSerieName"
+    set edtDescription "$base$edtDescription"
+    set btnLeft1       "$base$btnLeft1"
+    set btnLeft2       "$base$btnLeft2"
+    set btnRight1      "$base$btnRight1"
+    set btnRight2      "$base$btnRight2"
+    set btnOk          "$base$btnOk"
+    set btnCancel      "$base$btnCancel"
+    set lbl001         "$base$lbl001"
+    set lblSub         "$base$lblSub"
+    set lbl002         "$base$lbl002"
+    set lblt           "$base$lblt"
+
+    toplevel $base -class Toplevel
+    wm focusmodel       $base passive
+    wm geometry         $base 365x213+215+163
+    wm maxsize          $base 1028 753
+    wm minsize          $base 104 1
+    wm overrideredirect $base 0
+    wm resizable        $base 0 0
+    wm deiconify        $base
+    wm title            $base "$string_table::str_subtract_series"
+
+    frame $frSerieName   -height 30 -width 30 
+    frame $frDescription -height 30 -width 30 
+    frame $frSeries      -borderwidth 2 -height 75 -relief groove -width 125 
+
+    entry $edtSerieName   -textvariable subtract::seriename
+    entry $edtDescription -textvariable subtract::description
+
+    $edtSerieName   delete 0 end
+    $edtDescription delete 0 end
+    $edtSerieName   insert 0 "subtraction_$serie1\_$serie2"
+    $edtDescription insert 0 "subtraction_$serie1\_$serie2"
+
+    radiobutton $btnLeft1  -text $serie1 -variable ser1_var -value 1 -command "set subtract::sense 12; $btnRight1 deselect; $btnRight2 select"
+    radiobutton $btnLeft2  -text $serie2 -variable ser1_var -value 2 -command "set subtract::sense 21; $btnRight1 select; $btnRight2 deselect"
+    radiobutton $btnRight1 -text $serie1 -variable ser2_var -value 1 -command "set subtract::sense 21; $btnLeft1 deselect; $btnLeft2 select"
+    radiobutton $btnRight2 -text $serie2 -variable ser2_var -value 2 -command "set subtract::sense 12; $btnLeft2 deselect; $btnLeft1 select"
+
+    button $btnOk          -text $string_table::str_ok     -command "destroy $base"
+    button $base.btnCancel -text $string_table::str_cancel -command "set subtract::sense 0; destroy $base"
+
+    label $lbl001 -anchor w -borderwidth 0 -text $string_table::str_serie_name 
+    label $lbl002 -anchor w -borderwidth 0 -text $string_table::str_description 
+    label $lblSub -borderwidth 0 -text "----"
+    label $lblt   -borderwidth 0 -text $string_table::str_choose_order 
+
+    place $frSerieName    -x 15 -y 25 -width 335 -height 25 -anchor nw -bordermode ignore 
+    pack  $lbl001         -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $edtSerieName   -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $frDescription  -x 15 -y 55 -width 335 -height 25 -anchor nw -bordermode ignore 
+    pack  $lbl002         -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $edtDescription -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+    place $frSeries       -x 10 -y 100 -width 345 -height 65 -anchor nw -bordermode ignore 
+    place $btnLeft1       -x 15 -y 10 -anchor nw -bordermode ignore 
+    place $btnLeft2       -x 15 -y 30 -anchor nw -bordermode ignore 
+    place $btnRight1      -x 210 -y 10 -anchor nw -bordermode ignore 
+    place $btnRight2      -x 210 -y 30 -anchor nw -bordermode ignore 
+    place $lblSub         -x 135 -y 25 -anchor nw -bordermode ignore 
+    place $base.lblt      -x 15 -y 90 -anchor nw -bordermode ignore 
+    place $base.btnOk     -x 115 -y 175 -anchor nw -bordermode ignore 
+    place $base.btnCancel -x 180 -y 175 -anchor nw -bordermode ignore 
+
+    $btnLeft1 invoke
+
+    # set global focus input to dialog
+    grab set $base
+
+    # waits for dialog destruction, i.e. waits for user interaction with dialog
+    tkwait window $base
+
+    return [ list $sense $seriename $description ]
+
+}
+
+# EOF - subtract.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/u_3D.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/u_3D.tcl
new file mode 100644 (file)
index 0000000..0d1507b
--- /dev/null
@@ -0,0 +1,293 @@
+namespace eval u_3D {
+
+    # public interface
+    namespace export        \
+        create              \
+        positionate         \
+        forget
+    
+    # variables
+    variable base ""
+
+    variable tools .tools
+    variable work  .work3D
+
+    variable btnMPR  .tools.btnMPR
+    variable btnMIP  .tools.btnMIP
+    variable btnSurf .tools.btnSurf
+    variable local_id
+
+    variable axis_shown
+    variable shown
+
+}
+
+proc u_3D::create { parent id } {
+
+    # For programming facilities
+    upvar u_3D::base    base
+    upvar u_3D::tools   tools
+    upvar u_3D::work    work
+    upvar u_3D::btnMPR  btnMPR
+    upvar u_3D::btnMIP  btnMIP
+    upvar u_3D::btnSurf btnSurf
+    upvar u_3D::local_id  local_id
+    upvar u_3D::shown     shown
+
+    set shown 0
+
+    set local_id $id
+
+    set base    "$parent"
+    set tools   "$parent$tools"
+    set work    "$parent$work"
+    set btnMPR  "$parent$btnMPR"
+    set btnMIP  "$parent$btnMIP"
+    set btnSurf "$parent$btnSurf"
+
+    # frames
+    frame $tools -borderwidth 0 -height 75 -relief flat -width 125
+    frame $work  -borderwidth 0 -height 75 -relief flat -width 125
+
+    # buttons
+    radiobutton $btnMPR  -indicatoron 0 -text mpr  -variable u3dtype -value 1 -command { u_3D::set_vis $u3dtype }
+    radiobutton $btnMIP  -indicatoron 0 -text mip  -variable u3dtype -value 2 -command { u_3D::set_vis $u3dtype }
+    radiobutton $btnSurf -indicatoron 0 -text surf -variable u3dtype -value 3 -command { u_3D::set_vis $u3dtype }
+    
+    # sub-windows
+    u_mpr::create  $work
+    u_mip::create  $work
+    u_surf::create $work
+
+}
+
+proc u_3D::positionate { } {
+
+    # For programming facilities
+    upvar u_3D::base    base
+    upvar u_3D::tools   tools
+    upvar u_3D::work    work
+    upvar u_3D::btnMPR  btnMPR
+    upvar u_3D::btnMIP  btnMIP
+    upvar u_3D::btnSurf btnSurf
+    upvar u_3D::local_id  local_id
+    upvar u_3D::shown     shown
+
+    set shown 1
+
+    set global_window::window_shown $local_id
+
+    pack $tools   -anchor center -expand 0 -fill x    -side top
+    pack $btnMPR  -anchor nw     -expand 0 -fill none -side left
+    pack $btnMIP  -anchor nw     -expand 0 -fill none -side left
+    pack $btnSurf -anchor nw     -expand 0 -fill none -side left
+    pack $work    -anchor center -expand 1 -fill both -side top
+
+    $btnMPR  deselect
+    $btnMIP  deselect
+    $btnSurf deselect
+    $btnSurf  invoke
+
+}
+
+proc u_3D::forget { } {
+
+    # For programming facilities
+    upvar u_3D::base    base
+    upvar u_3D::tools   tools
+    upvar u_3D::work    work
+    upvar u_3D::btnMPR  btnMPR
+    upvar u_3D::btnMIP  btnMIP
+    upvar u_3D::btnSurf btnSurf
+    upvar u_3D::shown     shown
+
+    set shown 0
+
+    pack forget $work
+    pack forget $btnSurf
+    pack forget $btnMIP
+    pack forget $btnMPR
+    pack forget $tools
+
+}
+
+proc u_3D::set_data { } {
+
+    # For programming facilities
+    upvar u_3D::base    base
+    upvar u_3D::tools   tools
+    upvar u_3D::work    work
+    upvar u_3D::btnMPR  btnMPR
+    upvar u_3D::btnMIP  btnMIP
+    upvar u_3D::btnSurf btnSurf
+    upvar u_3D::local_id  local_id
+    upvar u_3D::axis_shown axis_shown
+
+    set global_window::data_loaded [ expr $global_window::data_loaded | $local_id ]
+
+    set axis_shown 0
+    set data [ image_browser::get_data ]
+    if { $data != "" } {
+
+               InitExperiment_dll $data
+        u_mpr::set_data
+        u_mip::set_data
+        u_surf::set_data
+
+    } else {
+    
+        set axis_shown 1
+        u_mpr::set_data
+        u_mip::set_data
+        u_surf::set_data
+        u_surf::load_axes
+    
+    }
+
+    $btnMPR  deselect
+    $btnMIP  deselect
+    $btnSurf deselect
+    $btnSurf  invoke
+
+}
+
+proc u_3D::set_vis { typ } {
+
+    # For programming facilities
+    upvar u_3D::base    base
+    upvar u_3D::tools   tools
+    upvar u_3D::work    work
+    upvar u_3D::btnMPR  btnMPR
+    upvar u_3D::btnMIP  btnMIP
+    upvar u_3D::btnSurf btnSurf
+    upvar u_3D::axis_shown axis_shown
+
+    u_mpr::forget
+    u_mip::forget
+    u_surf::forget
+
+    if { $typ == 1 } {
+
+        u_mpr::positionate
+        u_3D::controls 1
+        global_window::deselect_buttons
+        global_window::invoke_buttons [ expr \
+            $global_window::en_clear  | \
+            $global_window::en_rotate | \
+            $global_window::en_zoom     \
+        ]
+
+    } elseif { $typ == 2 } {
+
+        u_mip::positionate
+        u_3D::controls 0
+        global_window::deselect_buttons
+        global_window::invoke_buttons [ expr \
+            $global_window::en_clear  | \
+            $global_window::en_rotate | \
+            $global_window::en_zoom     \
+        ]
+
+    } elseif { $typ == 3 } {
+
+        u_surf::positionate
+        
+        if { $axis_shown == 0 } {
+
+            u_3D::controls 0
+
+        } else {
+
+            u_3D::controls 2
+
+        }
+        global_window::deselect_buttons
+        global_window::invoke_buttons [ expr \
+            $global_window::en_clear  | \
+            $global_window::en_rotate | \
+            $global_window::en_zoom     \
+        ]
+
+    }
+
+}
+
+proc u_3D::back { } {
+
+    # For programming facilities
+    upvar u_3D::shown     shown
+
+    set ret $shown
+    set shown 0
+
+    return $ret
+
+}
+
+proc u_3D::controls { { id -1 } } {
+
+    if { $id == -1 } {
+
+        global_window::active_controls 0
+
+    } else {
+
+        if { $id == 0 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_rotate    | \
+                $global_window::en_pan       | \
+                $global_window::en_zoom      | \
+                $global_window::en_back      | \
+                0
+            ]
+
+        } elseif { $id == 1 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_rotate    | \
+                $global_window::en_bright    | \
+                $global_window::en_pan       | \
+                $global_window::en_zoom      | \
+                $global_window::en_back      | \
+                0
+            ]
+
+        } elseif { $id == 2 } {
+
+            global_window::active_controls [   \
+                expr                           \
+                $global_window::en_planes    | \
+                $global_window::en_params    | \
+                $global_window::en_save      | \
+                $global_window::en_load      | \
+                $global_window::en_open      | \
+                $global_window::en_help      | \
+                $global_window::en_rotate    | \
+                $global_window::en_bright    | \
+                $global_window::en_pan       | \
+                $global_window::en_zoom      | \
+                $global_window::en_back      | \
+                $global_window::en_wizard    | \
+                0
+            ]
+
+        }
+
+    }
+
+}
+
+# EOF - u_3D.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/u_mip.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/u_mip.tcl
new file mode 100644 (file)
index 0000000..b4e6a6d
--- /dev/null
@@ -0,0 +1,237 @@
+namespace eval u_mip {
+
+    # public interface
+    namespace export        \
+        create              \
+        positionate         \
+        forget
+    
+    # variables
+    variable widgets
+    variable reference_actor
+    variable mip_volume
+
+}
+
+proc u_mip::reset { parent } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+
+    set widgets(base)         "$parent"
+    set widgets(work3D)       "$parent\.mip"
+    set widgets(controls)     "$parent\.mipControls"
+    set widgets(frType)       "$parent\.mipControls.type"
+    set widgets(frColor)      "$parent\.mipControls.colors"
+    set widgets(btnNeighbor)  "$parent\.mipControls.type.btnNeighbor"
+    set widgets(btnTrilinear) "$parent\.mipControls.type.btnTrilinear"
+    set widgets(btnGrey)      "$parent\.mipControls.colors.btnGrey"
+    set widgets(btnColor)     "$parent\.mipControls.colors.btnColor"
+    set widgets(lbl001)       "$parent\.mipControls.lbl001"
+    set widgets(lbl002)       "$parent\.mipControls.lbl002"
+    set widgets(lbl003)       "$parent\.mipControls.lbl003"
+
+}
+
+proc u_mip::create { parent } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+
+    u_mip::reset $parent
+
+    # frames
+    frame $widgets(controls) -borderwidth 1 -height 75 -relief groove -width 191 
+    frame $widgets(frType)   -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(frColor)  -borderwidth 2 -height 75 -relief groove -width 125 
+
+    # labels
+    label $widgets(lbl001) -borderwidth 0 -text $string_table::str_mip_controls 
+    label $widgets(lbl002) -borderwidth 0 -text $string_table::str_interpolation_type 
+    label $widgets(lbl003) -borderwidth 0 -text $string_table::str_colormap 
+
+}
+
+proc u_mip::positionate { } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+    upvar u_mip::mip_volume mip_volume
+
+    pack  $widgets(work3D)       -anchor nw -expand 1 -fill both -side left
+    pack  $widgets(controls)     -anchor nw -expand 0 -fill both -side left
+    place $widgets(lbl001)       -x 55 -y 15 -anchor nw -bordermode ignore 
+    place $widgets(frType)       -x 10 -y 60 -width 170 -height 95 -anchor nw -bordermode ignore 
+    place $widgets(btnNeighbor)  -x 25 -y 20 -anchor nw -bordermode ignore 
+    place $widgets(btnTrilinear) -x 25 -y 50 -anchor nw -bordermode ignore 
+    place $widgets(frColor)      -x 10 -y 175 -width 170 -height 95 -anchor nw -bordermode ignore 
+    place $widgets(btnGrey)      -x 30 -y 20 -anchor nw -bordermode ignore 
+    place $widgets(btnColor)     -x 30 -y 50 -anchor nw -bordermode ignore 
+    place $widgets(lbl002)       -x 15 -y 50 -anchor nw -bordermode ignore 
+    place $widgets(lbl003)       -x 15 -y 165 -anchor nw -bordermode ignore 
+
+    $widgets(btnGrey)      deselect
+    $widgets(btnColor)     deselect
+    $widgets(btnNeighbor)  deselect
+    $widgets(btnTrilinear) deselect
+
+    $widgets(btnGrey)     invoke
+    $widgets(btnNeighbor) invoke
+    
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_mip::forget { } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+    upvar u_mip::mip_volume mip_volume
+
+    catch { place forget $widgets(lbl003) }
+    catch { place forget $widgets(lbl002) }
+    catch { place forget $widgets(btnColor) }
+    catch { place forget $widgets(btnGrey) }
+    catch { place forget $widgets(frColor) }
+    catch { place forget $widgets(btnTrilinear) }
+    catch { place forget $widgets(btnNeighbor) }
+    catch { place forget $widgets(frType) }
+    catch { place forget $widgets(lbl001) }
+    catch { pack  forget $widgets(controls) }
+    catch { pack  forget $widgets(work3D) }
+
+}
+
+proc u_mip::set_data { } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+    upvar u_mip::mip_volume mip_volume
+
+    # render widget
+    destroy $widgets(work3D)
+    vtkTkRenderWidget $widgets(work3D) -width 30 -height 30
+
+    # TODO: change
+    bindBasicEvents $widgets(work3D)
+
+    catch { renderer_$widgets(work3D) Delete }
+    vtkRenderer renderer_$widgets(work3D)
+    set render [ $widgets(work3D) GetRenderWindow ]
+    $render AddRenderer renderer_$widgets(work3D)
+    $render SetSize 1 1
+
+    # radiobuttons
+    destroy $widgets(btnNeighbor)
+    destroy $widgets(btnTrilinear)
+    destroy $widgets(btnGrey)
+    destroy $widgets(btnColor)
+
+    radiobutton $widgets(btnNeighbor)  -text $string_table::str_near_neighbor -variable var_type  -value 1 -command "catch { mip_prop_$widgets(work3D) SetInterpolationTypeToNearest; [ $widgets(work3D) GetRenderWindow ] Render }"
+    radiobutton $widgets(btnTrilinear) -text $string_table::str_trilinear     -variable var_type  -value 2 -command "catch { mip_prop_$widgets(work3D) SetInterpolationTypeToLinear; [ $widgets(work3D) GetRenderWindow ] Render }"
+    radiobutton $widgets(btnGrey)      -text $string_table::str_greyscale     -variable var_color -value 1 -command "catch { mip_prop_$widgets(work3D) SetColor gtfun_$widgets(work3D); [ $widgets(work3D) GetRenderWindow ] Render }"
+    radiobutton $widgets(btnColor)     -text $string_table::str_color         -variable var_color -value 2 -command "catch { mip_prop_$widgets(work3D) SetColor ctfun_$widgets(work3D); [ $widgets(work3D) GetRenderWindow ] Render }"
+
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+    set range    [ GetImageRange_dll ]
+
+    # 3D outline
+    catch { renderer_$widgets(work3D) RemoveActor outlineActor_$widgets(work3D) }
+    catch { outlineActor_$widgets(work3D)  Delete }
+    catch { outlineMapper_$widgets(work3D) Delete }
+    catch { outlineSource_$widgets(work3D) Delete }
+    catch { renderer_$widgets(work3D) RemoveVolume mip_volume_$widgets(work3D) }
+    catch { mip_volume_$widgets(work3D) Delete }
+    catch { mip_volmap_$widgets(work3D) Delete }
+    catch { mip_func_$widgets(work3D) Delete }
+    catch { mip_prop_$widgets(work3D) Delete }
+    catch { ctfun_$widgets(work3D) Delete }
+    catch { gtfun_$widgets(work3D) Delete }
+    catch { mip_tfun_$widgets(work3D) Delete }
+
+    vtkCubeSource outlineSource_$widgets(work3D)
+        outlineSource_$widgets(work3D) SetXLength [ expr [ lindex $bounds 1 ] - [ lindex $bounds 0 ] ]
+        outlineSource_$widgets(work3D) SetYLength [ expr [ lindex $bounds 3 ] - [ lindex $bounds 2 ] ]
+        outlineSource_$widgets(work3D) SetZLength [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ]
+        outlineSource_$widgets(work3D) SetCenter  \
+            [ expr ( [ lindex $bounds 0 ] + [ lindex $bounds 1 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 2 ] + [ lindex $bounds 3 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 4 ] + [ lindex $bounds 5 ] ) / 2 ]
+
+    vtkPolyDataMapper outlineMapper_$widgets(work3D)
+        outlineMapper_$widgets(work3D) SetInput [ outlineSource_$widgets(work3D) GetOutput ]
+        outlineMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor outlineActor_$widgets(work3D)
+        outlineActor_$widgets(work3D) SetMapper outlineMapper_$widgets(work3D)
+        [ outlineActor_$widgets(work3D) GetProperty ] SetRepresentationToWireframe
+        [ outlineActor_$widgets(work3D) GetProperty ] SetColor    0.7 0.0 0.9
+        [ outlineActor_$widgets(work3D) GetProperty ] SetAmbient  1
+        [ outlineActor_$widgets(work3D) GetProperty ] SetDiffuse  0
+        [ outlineActor_$widgets(work3D) GetProperty ] SetSpecular 0
+
+    renderer_$widgets(work3D) AddActor outlineActor_$widgets(work3D)
+
+    vtkPiecewiseFunction mip_tfun_$widgets(work3D)
+        mip_tfun_$widgets(work3D) AddPoint 0   0.0
+        mip_tfun_$widgets(work3D) AddPoint [ expr ( [ lindex $range 1 ] / 2 ) ] 1.0
+
+    vtkPiecewiseFunction gtfun_$widgets(work3D)
+       gtfun_$widgets(work3D) AddPoint 0 0.0
+       gtfun_$widgets(work3D) AddPoint [ expr ( [ lindex $range 1 ] / 4 ) ] 1.0
+
+
+    vtkColorTransferFunction ctfun_$widgets(work3D)
+        ctfun_$widgets(work3D) AddRGBPoint 0.0 0.0 0.0 0.0
+#;      ctfun_$widgets(work3D) AddRGBPoint [ expr [ lindex $range 1 ] / 8 ] 0.0 0.0 0.0
+        ctfun_$widgets(work3D) AddRGBPoint [ expr [ lindex $range 1 ] / 4 ] 1.0 0.0 0.0
+        ctfun_$widgets(work3D) AddRGBPoint [ expr [ lindex $range 1 ] / 2 ] 0.0 0.0 1.0
+           ctfun_$widgets(work3D) AddRGBPoint [ lindex $range 1 ] 0.0 1.0 0.0
+
+    vtkVolumeProperty mip_prop_$widgets(work3D)
+        mip_prop_$widgets(work3D) SetColor gtfun_$widgets(work3D)
+        mip_prop_$widgets(work3D) SetScalarOpacity mip_tfun_$widgets(work3D)
+
+    vtkVolumeRayCastMIPFunction  mip_func_$widgets(work3D)
+        mip_func_$widgets(work3D) SetMaximizeMethodToScalarValue
+
+    vtkVolumeRayCastMapper mip_volmap_$widgets(work3D)
+        mip_volmap_$widgets(work3D) SetInput $resample
+        mip_volmap_$widgets(work3D) SetVolumeRayCastFunction mip_func_$widgets(work3D)
+
+    vtkVolume mip_volume_$widgets(work3D)
+        mip_volume_$widgets(work3D) SetMapper mip_volmap_$widgets(work3D)
+        mip_volume_$widgets(work3D) SetProperty mip_prop_$widgets(work3D)
+
+    renderer_$widgets(work3D) AddVolume mip_volume_$widgets(work3D)
+
+}
+
+proc u_mip::set_mouse_left_events { mask } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+
+    # TODO : change
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    if { [ expr $mask & 0x4 ] == 0x4 } { catch { bind $widgets(work3D) <B1-Motion> { evz_rotate %W %x %y } } }
+    if { [ expr $mask & 0x2 ] == 0x2 } { catch { bind $widgets(work3D) <B1-Motion> { evz_pan %W %x %y } } }
+
+}
+
+proc u_mip::set_mouse_right_events { mask } {
+
+    # For programming facilities
+    upvar u_mip::widgets widgets
+
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    if { [ expr $mask & 0x4 ] == 0x4 } { catch { bind $widgets(work3D) <B3-Motion> { evz_zoom %W %x %y } } }
+    
+}
+
+# EOF - u_mip.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/u_mpr.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/u_mpr.tcl
new file mode 100644 (file)
index 0000000..34d3bd8
--- /dev/null
@@ -0,0 +1,687 @@
+namespace eval u_mpr {
+
+    # public interface
+    namespace export        \
+        create              \
+        positionate         \
+        forget
+    
+    # variables
+    variable widgets
+
+    variable reference_actor
+    variable mpr_data
+    variable actual_plane -1
+    variable bounds
+    variable intRange
+    variable stPoint
+
+    variable initX
+    variable initY
+    variable initWindow
+    variable initLevel
+    variable select_first
+
+}
+
+proc u_mpr::reset { parent } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+
+    set widgets(base)       "$parent"
+    set widgets(work3D)     "$parent\.mpr"
+    set widgets(controls)   "$parent\.mprControls"
+    set widgets(type)       "$parent\.mprControls.type"
+    set widgets(btnSagital) "$parent\.mprControls.type.btnSagital"
+    set widgets(btnAxial)   "$parent\.mprControls.type.btnAxial"
+    set widgets(btnCoronal) "$parent\.mprControls.type.btnCoronal"
+    set widgets(lbl001)     "$parent\.mprControls.lbl001"
+    set widgets(lbl002)     "$parent\.mprControls.lbl002"
+    set widgets(sclMPR)     "$parent\.mprControls.sclMPR"
+    set widgets(frMeasure)  "$parent\.mprControls.frMeasure"
+    set widgets(lblMeasure) "$parent\.mprControls.frMeasure.01"
+    set widgets(edtMeasure) "$parent\.mprControls.frMeasure.02"
+
+}
+
+proc u_mpr::create { parent } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::select_first select_first
+
+    u_mpr::reset $parent
+
+    # frames
+    frame $widgets(controls)  -borderwidth 1 -height 75 -relief groove -width 191
+    frame $widgets(type)      -borderwidth 2 -height 75 -relief groove -width 125
+    frame $widgets(frMeasure) -height 30 -width 30 
+
+    # entries
+    entry $widgets(edtMeasure) -cursor {}
+
+    # buttons
+    radiobutton $widgets(btnSagital) -text $string_table::str_sagital -variable show_type -value 1 -command { u_mpr::set_probe $show_type #ff0000 }
+    radiobutton $widgets(btnAxial)   -text $string_table::str_axial   -variable show_type -value 2 -command { u_mpr::set_probe $show_type #00ff00 }
+    radiobutton $widgets(btnCoronal) -text $string_table::str_coronal -variable show_type -value 3 -command { u_mpr::set_probe $show_type #0000ff }
+
+    # labels
+    label $widgets(lbl001)     -borderwidth 0 -text $string_table::str_mpr_controls
+    label $widgets(lbl002)     -borderwidth 0 -text $string_table::str_mpr_type
+    label $widgets(lblMeasure) -anchor w -borderwidth 0 -text $string_table::str_distance
+
+    scale $widgets(sclMPR) -label $string_table::str_slices -orient horizontal
+
+}
+
+proc u_mpr::positionate { } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+
+    pack  $widgets(work3D)     -anchor nw -expand 1 -fill both -side left
+    pack  $widgets(controls)   -anchor nw -expand 0 -fill both -side left
+    place $widgets(type)       -x 10 -y 80 -width 175 -height 100 -anchor nw -bordermode ignore
+    place $widgets(btnSagital) -x 5 -y 5 -anchor nw -bordermode ignore
+    place $widgets(btnAxial)   -x 5 -y 35 -anchor nw -bordermode ignore
+    place $widgets(btnCoronal) -x 5 -y 65 -anchor nw -bordermode ignore
+    place $widgets(lbl001)     -x 55 -y 25 -anchor nw -bordermode ignore
+    place $widgets(lbl002)     -x 15 -y 70 -anchor nw -bordermode ignore 
+    place $widgets(sclMPR)     -x 5 -y 245 -width 178 -height 59 -anchor nw -bordermode ignore 
+    place $widgets(frMeasure)  -x 5 -y 430 -width 180 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgets(lblMeasure) -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgets(edtMeasure) -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+
+}
+
+proc u_mpr::forget { } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+
+    pack  forget $widgets(edtMeasure)
+    pack  forget $widgets(lblMeasure)
+    place forget $widgets(frMeasure)
+    place forget $widgets(sclMPR)
+    place forget $widgets(lbl002)
+    place forget $widgets(lbl001)
+    place forget $widgets(btnCoronal)
+    place forget $widgets(btnAxial)
+    place forget $widgets(btnSagital)
+    place forget $widgets(type)
+    pack  forget $widgets(controls)
+    pack  forget $widgets(work3D)
+
+}
+
+proc u_mpr::set_data { } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::reference_actor reference_actor
+    upvar u_mpr::mpr_data        mpr_data
+    upvar u_mpr::actual_plane    actual_plane
+    upvar u_mpr::bounds          bounds
+    upvar u_mpr::intRange        intRange
+    upvar u_mpr::select_first    select_first
+
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+
+    # 3D outline
+    catch { renderer_$widgets(work3D) RemoveActor outlineActor_$widgets(work3D) }
+    catch { outlineActor_$widgets(work3D)  Delete }
+    catch { outlineMapper_$widgets(work3D) Delete }
+    catch { outlineSource_$widgets(work3D) Delete }
+    catch { lookup_$widgets(work3D)        Delete }
+
+    # render widget
+    destroy $widgets(work3D)
+    vtkTkRenderWidget $widgets(work3D) -width 30 -height 30
+
+    # TODO: change
+    bindBasicEvents $widgets(work3D)
+
+    set select_first 1
+    bind $widgets(work3D) <Double-Button-1> "u_mpr::ev_dbl_select_st_point %x %y"
+    bind $widgets(work3D) <Double-Button-3> "u_mpr::ev_dbl_select_point %x %y"
+    $widgets(edtMeasure) delete 0 end
+    
+    catch { renderer_$widgets(work3D) Delete }
+    vtkRenderer renderer_$widgets(work3D)
+    renderer_$widgets(work3D) SetBackground 0 0 0
+    #renderer_$widgets(work3D) SetBackground 1 1 1
+    set render [ $widgets(work3D) GetRenderWindow ]
+    $render AddRenderer renderer_$widgets(work3D)
+    $render SetSize 1 1
+
+    set u_mpr::stPoint {}
+
+    for { set i 0 } { $i < 3 } { incr i } {    
+
+        catch { renderer_$widgets(work3D) RemoveActor outline_actor_{$widgets(work3D)}_{$i} }
+        catch { renderer_$widgets(work3D) RemoveActor plane_{$widgets(work3D)}_{$i} }
+        catch { plane_{$widgets(work3D)}_{$i}          Delete }
+        catch { mapper_{$widgets(work3D)}_{$i}         Delete }
+        catch { strip_{$widgets(work3D)}_{$i}          Delete }
+        catch { triangle_{$widgets(work3D)}_{$i}       Delete }
+        catch { cast_{$widgets(work3D)}_{$i}           Delete }
+        catch { probe_filter_{$widgets(work3D)}_{$i}   Delete }
+        catch { outline_actor_{$widgets(work3D)}_{$i}  Delete }
+        catch { outline_mapper_{$widgets(work3D)}_{$i} Delete }
+        catch { outline_filter_{$widgets(work3D)}_{$i} Delete }
+        catch { trans_filter_{$widgets(work3D)}_{$i}   Delete }
+        catch { transform_{$widgets(work3D)}_{$i}      Delete }
+        catch { source_{$widgets(work3D)}_{$i}         Delete }
+
+    }
+
+    vtkCubeSource outlineSource_$widgets(work3D)
+        outlineSource_$widgets(work3D) SetXLength [ expr [ lindex $bounds 1 ] - [ lindex $bounds 0 ] ]
+        outlineSource_$widgets(work3D) SetYLength [ expr [ lindex $bounds 3 ] - [ lindex $bounds 2 ] ]
+        outlineSource_$widgets(work3D) SetZLength [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ]
+        outlineSource_$widgets(work3D) SetCenter  \
+            [ expr ( [ lindex $bounds 0 ] + [ lindex $bounds 1 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 2 ] + [ lindex $bounds 3 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 4 ] + [ lindex $bounds 5 ] ) / 2 ]
+
+    vtkPolyDataMapper outlineMapper_$widgets(work3D)
+        outlineMapper_$widgets(work3D) SetInput [ outlineSource_$widgets(work3D) GetOutput ]
+        outlineMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor outlineActor_$widgets(work3D)
+        outlineActor_$widgets(work3D) SetMapper outlineMapper_$widgets(work3D)
+        [ outlineActor_$widgets(work3D) GetProperty ] SetRepresentationToWireframe
+        [ outlineActor_$widgets(work3D) GetProperty ] SetColor    0.7 0.0 0.9
+        [ outlineActor_$widgets(work3D) GetProperty ] SetAmbient  1
+        [ outlineActor_$widgets(work3D) GetProperty ] SetDiffuse  0
+        [ outlineActor_$widgets(work3D) GetProperty ] SetSpecular 0
+
+    renderer_$widgets(work3D) AddActor outlineActor_$widgets(work3D)
+
+    # Probe planes
+    set range    [ GetImageRange_dll ]
+    set xdiff    [ lindex [ split [ expr [ lindex $bounds 1 ] - [ lindex $bounds 0 ] ] . ] 0 ]
+    set ydiff    [ lindex [ split [ expr [ lindex $bounds 3 ] - [ lindex $bounds 2 ] ] . ] 0 ]
+    set zdiff    [ lindex [ split [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ] . ] 0 ]
+
+    vtkWindowLevelLookupTable lookup_$widgets(work3D)
+        lookup_$widgets(work3D) SetHueRange 0.0 1.0
+        lookup_$widgets(work3D) SetNumberOfColors [ lindex [ split [ expr [ lindex $range 1 ] - [ lindex $range 0 ] + 1 ] . ] 0 ]
+        lookup_$widgets(work3D) SetTableRange [ lindex $range 0 ] [ lindex $range 1 ]
+        lookup_$widgets(work3D) SetSaturationRange 0 0
+        lookup_$widgets(work3D) SetValueRange 0 1
+        lookup_$widgets(work3D) SetAlphaRange 1 1
+        lookup_$widgets(work3D) Build
+
+    for { set i 0 } { $i < 3 } { incr i } {
+
+        vtkPlaneSource source_{$widgets(work3D)}_{$i}
+            source_{$widgets(work3D)}_{$i} SetResolution [ expr ( $i == 0 )? $zdiff: $xdiff ] [ expr ( $i == 1 )? $zdiff: $ydiff ]
+
+        vtkTransform transform_{$widgets(work3D)}_{$i}
+            transform_{$widgets(work3D)}_{$i} Identity
+            transform_{$widgets(work3D)}_{$i} Translate \
+                [ expr ( $xdiff / 2 ) + [ lindex $bounds 0 ] ] \
+                [ expr ( $ydiff / 2 ) + [ lindex $bounds 2 ] ] \
+                [ expr ( $zdiff / 2 ) + [ lindex $bounds 4 ] ]
+            transform_{$widgets(work3D)}_{$i} Scale $xdiff $ydiff $zdiff
+            if { $i == 0 } { transform_{$widgets(work3D)}_{$i} RotateY 90 }
+            if { $i == 1 } { transform_{$widgets(work3D)}_{$i} RotateX 90 }
+
+        vtkTransformPolyDataFilter trans_filter_{$widgets(work3D)}_{$i}
+            trans_filter_{$widgets(work3D)}_{$i} SetInput [ source_{$widgets(work3D)}_{$i} GetOutput ]
+            trans_filter_{$widgets(work3D)}_{$i} SetTransform transform_{$widgets(work3D)}_{$i}
+
+        vtkOutlineFilter outline_filter_{$widgets(work3D)}_{$i}
+            outline_filter_{$widgets(work3D)}_{$i} SetInput [ trans_filter_{$widgets(work3D)}_{$i} GetOutput ]
+
+        vtkPolyDataMapper outline_mapper_{$widgets(work3D)}_{$i}
+            outline_mapper_{$widgets(work3D)}_{$i} SetInput [ outline_filter_{$widgets(work3D)}_{$i} GetOutput ]
+
+        vtkActor outline_actor_{$widgets(work3D)}_{$i}
+            outline_actor_{$widgets(work3D)}_{$i} SetMapper outline_mapper_{$widgets(work3D)}_{$i}
+            [ outline_actor_{$widgets(work3D)}_{$i} GetProperty ] SetRepresentationToWireframe
+            [ outline_actor_{$widgets(work3D)}_{$i} GetProperty ] SetColor    0.7 0.0 0.9
+            [ outline_actor_{$widgets(work3D)}_{$i} GetProperty ] SetAmbient  1
+            [ outline_actor_{$widgets(work3D)}_{$i} GetProperty ] SetDiffuse  0
+            [ outline_actor_{$widgets(work3D)}_{$i} GetProperty ] SetSpecular 0
+
+        vtkProbeFilter probe_filter_{$widgets(work3D)}_{$i}
+            probe_filter_{$widgets(work3D)}_{$i} SetInput [ trans_filter_{$widgets(work3D)}_{$i} GetOutput ]
+            probe_filter_{$widgets(work3D)}_{$i} SetSource $resample
+
+        vtkCastToConcrete cast_{$widgets(work3D)}_{$i}
+            cast_{$widgets(work3D)}_{$i} SetInput [ probe_filter_{$widgets(work3D)}_{$i} GetOutput ]
+
+        vtkTriangleFilter triangle_{$widgets(work3D)}_{$i}
+            triangle_{$widgets(work3D)}_{$i} SetInput [ cast_{$widgets(work3D)}_{$i} GetPolyDataOutput ]
+
+        vtkStripper strip_{$widgets(work3D)}_{$i}
+            strip_{$widgets(work3D)}_{$i} SetInput [ triangle_{$widgets(work3D)}_{$i} GetOutput ]
+
+        vtkPolyDataMapper mapper_{$widgets(work3D)}_{$i}
+        mapper_{$widgets(work3D)}_{$i} SetInput [ strip_{$widgets(work3D)}_{$i} GetOutput ]
+        mapper_{$widgets(work3D)}_{$i} SetLookupTable lookup_$widgets(work3D)
+        mapper_{$widgets(work3D)}_{$i} SetScalarRange [ lindex $range 0 ] [ lindex $range 1 ]
+        mapper_{$widgets(work3D)}_{$i} ImmediateModeRenderingOn
+
+        vtkActor plane_{$widgets(work3D)}_{$i}
+            plane_{$widgets(work3D)}_{$i} SetMapper mapper_{$widgets(work3D)}_{$i}
+            [ plane_{$widgets(work3D)}_{$i} GetProperty ] SetOpacity 1.0
+
+    }
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+    $widgets(btnSagital) deselect
+    $widgets(btnAxial)   deselect
+    $widgets(btnCoronal) deselect
+
+    $widgets(btnCoronal) invoke
+
+    global_window::active_controls [ expr \
+        $global_window::en_open   | \
+        $global_window::en_load   | \
+        $global_window::en_params | \
+        $global_window::en_rotate |  \
+        $global_window::en_pan    |  \
+        $global_window::en_bright |  \
+        $global_window::en_zoom      \
+    ]
+
+}
+
+proc u_mpr::set_probe { typ col } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::reference_actor reference_actor
+    upvar u_mpr::mpr_data        mpr_data
+    upvar u_mpr::actual_plane    actual_plane
+    upvar u_mpr::bounds          bounds
+    upvar u_mpr::intRange        intRange
+
+    catch { renderer_$widgets(work3D) RemoveActor outline_actor_{$widgets(work3D)}_{$actual_plane} }
+    catch { renderer_$widgets(work3D) RemoveActor plane_{$widgets(work3D)}_{$actual_plane} }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_1_$widgets(work3D) ] }
+    DeleteSphere sphere_1_$widgets(work3D)
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_2_$widgets(work3D) ] }
+    DeleteSphere sphere_2_$widgets(work3D)
+    catch { renderer_$widgets(work3D) RemoveActor textActor_$widgets(work3D) }
+    catch { textActor_$widgets(work3D) Delete }
+    catch { textMapper_$widgets(work3D) Delete }
+    catch { textSource_$widgets(work3D) Delete }
+    catch { tmp_picker_$widgets(work3D) Delete }
+
+    if { $actual_plane == 1 } {
+
+        [ renderer_$widgets(work3D) GetActiveCamera ] Elevation -90.0
+        [ renderer_$widgets(work3D) GetActiveCamera ] OrthogonalizeViewUp
+
+    }
+    if { $actual_plane == 0 } {
+
+            [ renderer_$widgets(work3D) GetActiveCamera ] Azimuth -90.0
+            [ renderer_$widgets(work3D) GetActiveCamera ] OrthogonalizeViewUp
+
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+    set actual_plane [ expr $typ - 1 ]
+    if { $actual_plane == 0 || $actual_plane == 1 || $actual_plane == 2 } {
+    
+        set r [ expr "0x[ string index $col 1 ][ string index $col 2 ]" / 255.0 ]
+        set g [ expr "0x[ string index $col 3 ][ string index $col 4 ]" / 255.0 ]
+        set b [ expr "0x[ string index $col 5 ][ string index $col 6 ]" / 255.0 ]
+        [ outline_actor_{$widgets(work3D)}_{$actual_plane} GetProperty ] SetColor $r $g $b
+        renderer_$widgets(work3D) AddActor outline_actor_{$widgets(work3D)}_{$actual_plane}
+        renderer_$widgets(work3D) AddActor plane_{$widgets(work3D)}_{$actual_plane}
+
+        [ $widgets(work3D) GetRenderWindow ] Render
+
+        set resample [ GetVTKVolume_dll ]
+        set bounds   [ $resample GetBounds ]
+        $widgets(sclMPR) configure \
+            -from [ lindex $bounds [ expr ( $actual_plane == 0 )? 0: ( $actual_plane == 1 )? 2: 4 ] ] \
+            -to   [ lindex $bounds [ expr ( $actual_plane == 0 )? 1: ( $actual_plane == 1 )? 3: 5 ] ] \
+            -fg $col \
+            -resolution 0.5
+
+        bind $widgets(sclMPR) <Any-ButtonRelease>
+        bind $widgets(sclMPR) <Any-ButtonRelease> "u_mpr::ev_change_slice 0"
+        u_mpr::ev_change_slice 1
+
+        [ $widgets(work3D) GetRenderWindow ] Render
+
+        set xc [ expr ( [ lindex $bounds 1 ] + [ lindex $bounds 0 ] ) / 2 ]
+        set yc [ expr ( [ lindex $bounds 3 ] + [ lindex $bounds 2 ] ) / 2 ]
+        set zc [ expr ( [ lindex $bounds 5 ] + [ lindex $bounds 4 ] ) / 2 ]
+        set xf $xc
+        set yf $yc
+        set zf $zc
+        set zc [ expr $zc + 15 * [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ] ]
+        #[ renderer_$widgets(work3D) GetActiveCamera ] SetFocalPoint $xf $yf $zf
+        #[ renderer_$widgets(work3D) GetActiveCamera ] SetPosition   $xc $yc $zc
+
+        if { $actual_plane == 0 } {
+
+            [ renderer_$widgets(work3D) GetActiveCamera ] Azimuth   90.0
+            [ renderer_$widgets(work3D) GetActiveCamera ] OrthogonalizeViewUp
+
+        } elseif { $actual_plane == 1 } {
+
+            [ renderer_$widgets(work3D) GetActiveCamera ] Elevation 90.0
+            [ renderer_$widgets(work3D) GetActiveCamera ] OrthogonalizeViewUp
+
+        }
+
+        [ $widgets(work3D) GetRenderWindow ] Render
+
+    }
+
+}
+
+proc u_mpr::ev_change_slice { typ } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::reference_actor reference_actor
+    upvar u_mpr::mpr_data        mpr_data
+    upvar u_mpr::actual_plane    actual_plane
+    upvar u_mpr::bounds          bounds
+    upvar u_mpr::intRange        intRange
+
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_1_$widgets(work3D) ] }
+    DeleteSphere sphere_1_$widgets(work3D)
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_2_$widgets(work3D) ] }
+    DeleteSphere sphere_2_$widgets(work3D)
+    catch { renderer_$widgets(work3D) RemoveActor textActor_$widgets(work3D) }
+    catch { textActor_$widgets(work3D) Delete }
+    catch { textMapper_$widgets(work3D) Delete }
+    catch { textSource_$widgets(work3D) Delete }
+    catch { tmp_picker_$widgets(work3D) Delete }
+    if { $actual_plane == 0 || $actual_plane == 1 || $actual_plane == 2 } {
+    
+        if { $typ == 1 } {
+
+            set slc [ expr ( [ $widgets(sclMPR) cget -to ] + [ $widgets(sclMPR) cget -from ] ) / 2 ]
+            $widgets(sclMPR) set $slc
+
+        } else { set slc [ $widgets(sclMPR) get ] }
+
+        set resample [ GetVTKVolume_dll ]
+        set bounds   [ $resample GetBounds ]
+        set xdiff [ expr [ lindex $bounds 1 ] - [ lindex $bounds 0 ] ];
+        set ydiff [ expr [ lindex $bounds 3 ] - [ lindex $bounds 2 ] ];
+        set zdiff [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ];
+
+        transform_{$widgets(work3D)}_{$actual_plane} Identity
+        transform_{$widgets(work3D)}_{$actual_plane} Translate \
+            [ expr ( $actual_plane == 0 )? $slc: ( $xdiff / 2 ) + [ lindex $bounds 0 ] ] \
+            [ expr ( $actual_plane == 1 )? $slc: ( $ydiff / 2 ) + [ lindex $bounds 2 ] ] \
+            [ expr ( $actual_plane == 2 )? $slc: ( $zdiff / 2 ) + [ lindex $bounds 4 ] ]
+        transform_{$widgets(work3D)}_{$actual_plane} Scale $xdiff $ydiff $zdiff
+        if { $actual_plane == 0 } { transform_{$widgets(work3D)}_{$actual_plane} RotateY 90 }
+        if { $actual_plane == 1 } { transform_{$widgets(work3D)}_{$actual_plane} RotateX 90 }
+        [ $widgets(work3D) GetRenderWindow ] Render
+    
+    }
+
+}
+
+proc u_mpr::set_mouse_events { bright_type } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::reference_actor reference_actor
+    upvar u_mpr::mpr_data        mpr_data
+    upvar u_mpr::actual_plane    actual_plane
+    upvar u_mpr::bounds          bounds
+    upvar u_mpr::intRange        intRange
+
+    if { $bright_type == 0 } {
+
+        bind $widgets(work3D) <Any-ButtonPress>
+        bind $widgets(work3D) <B1-Motion>
+
+        # TODO: change
+        bindBasicEvents $widgets(work3D)
+        bindZoomEvents $widgets(work3D) 0
+
+    } else {
+
+        bind $widgets(work3D) <Any-ButtonPress>
+        bind $widgets(work3D) <B1-Motion>
+
+    }
+
+}
+
+proc u_mpr::ev_start_window_level { x y } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::reference_actor reference_actor
+    upvar u_mpr::mpr_data        mpr_data
+    upvar u_mpr::actual_plane    actual_plane
+    upvar u_mpr::bounds          bounds
+    upvar u_mpr::intRange        intRange
+    upvar u_mpr::initX           initX
+    upvar u_mpr::initY           initY
+    upvar u_mpr::initWindow      initWindow
+    upvar u_mpr::initLevel       initLevel
+
+    set initX $x
+    set initY $y
+
+    set initWindow [ lookup_$widgets(work3D) GetWindow ]
+    set initLevel  [ lookup_$widgets(work3D) GetLevel  ]
+
+}
+
+proc u_mpr::ev_window_level { x y } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::reference_actor reference_actor
+    upvar u_mpr::mpr_data        mpr_data
+    upvar u_mpr::actual_plane    actual_plane
+    upvar u_mpr::bounds          bounds
+    upvar u_mpr::intRange        intRange
+    upvar u_mpr::initX           initX
+    upvar u_mpr::initY           initY
+    upvar u_mpr::initWindow      initWindow
+    upvar u_mpr::initLevel       initLevel
+
+    # get the widgets dimensions
+    set width  [ lindex [ $widgets(work3D) configure -width ] 4 ]
+    set height [ lindex [ $widgets(work3D) configure -height ] 4 ]
+
+    # compute normalized delta
+    set dx [ expr 4.0 * ( $x - $initX ) / $width  ]
+    set dy [ expr 4.0 * ( $initY - $y ) / $height ]
+
+    # scale by current values 
+    set dx [ expr $dx * $initWindow ]
+    set dy [ expr $dy * $initLevel  ]
+
+    # abs so that direction does not flip
+    if { $initWindow < 0.0 } { set dx [ expr 0 - $dx ] }
+    if { $initLevel < 0.0  } { set dy [ expr 0 - $dy ] }
+    
+    # compute new window level
+    set window [ expr $dx + $initWindow ]
+    if {$window < 0.0} {
+    set level [ expr $dy + $initLevel ]
+    } else {
+    set level [ expr $initLevel - $dy ]
+    }
+    
+    if { $window < 0.0 } { set dy [ expr 0 - $dy ] }
+    
+    lookup_$widgets(work3D) SetWindow $window
+    lookup_$widgets(work3D) SetLevel  $level
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_mpr::ev_dbl_select_point { x y } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::actual_plane actual_plane
+    upvar u_mpr::select_first select_first
+
+    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+
+    if { $select_first == 1 } {
+
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_1_$widgets(work3D) ] }
+        DeleteSphere sphere_1_$widgets(work3D)
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_2_$widgets(work3D) ] }
+        DeleteSphere sphere_2_$widgets(work3D)
+        catch { tmp_picker_$widgets(work3D) Delete }
+
+        vtkWorldPointPicker tmp_picker_$widgets(work3D)
+        set pickWP    [ tmp_picker_$widgets(work3D) Pick $x $y 0 renderer_$widgets(work3D) ]
+        set pickWPPos [ tmp_picker_$widgets(work3D) GetPickPosition ]
+  
+        set xc [ lindex $pickWPPos 0 ]
+        set yc [ lindex $pickWPPos 1 ]
+        set zc [ lindex $pickWPPos 2 ]
+        set resample [ GetVTKVolume_dll ]
+    
+        set indP [ [ probe_filter_{$widgets(work3D)}_{$actual_plane} GetOutput ] FindPoint $xc $yc $zc ]
+        set coordsP [ [ probe_filter_{$widgets(work3D)}_{$actual_plane} GetOutput ] GetPoint $indP ]
+
+        renderer_$widgets(work3D) AddActor [ \
+            DrawSphere \
+                sphere_1_$widgets(work3D) \
+                0.5 \
+                [ lindex $coordsP 0 ] [ lindex $coordsP 1 ] [ lindex $coordsP 2 ] \
+                1.0 0.5 0.5
+        ]
+
+        set select_first 0
+    
+    } else {
+
+        catch { tmp_picker_$widgets(work3D) Delete }
+
+        vtkWorldPointPicker tmp_picker_$widgets(work3D)
+        set pickWP    [ tmp_picker_$widgets(work3D) Pick $x $y 0 renderer_$widgets(work3D) ]
+        set pickWPPos [ tmp_picker_$widgets(work3D) GetPickPosition ]
+  
+        set xc [ lindex $pickWPPos 0 ]
+        set yc [ lindex $pickWPPos 1 ]
+        set zc [ lindex $pickWPPos 2 ]
+        set resample [ GetVTKVolume_dll ]
+    
+        set indP [ [ probe_filter_{$widgets(work3D)}_{$actual_plane} GetOutput ] FindPoint $xc $yc $zc ]
+        set coordsP [ [ probe_filter_{$widgets(work3D)}_{$actual_plane} GetOutput ] GetPoint $indP ]
+
+        renderer_$widgets(work3D) AddActor [ \
+            DrawSphere \
+                sphere_2_$widgets(work3D) \
+                0.5 \
+                [ lindex $coordsP 0 ] [ lindex $coordsP 1 ] [ lindex $coordsP 2 ] \
+                1.0 0.5 0.5
+        ]
+
+        set select_first 1
+
+        set c1 [ sphere_1_$widgets(work3D) GetCenter ]
+        set c2 [ sphere_2_$widgets(work3D) GetCenter ]
+        set dist [ DistPoints \
+            [ lindex $c1 0 ] \
+            [ lindex $c1 1 ] \
+            [ lindex $c1 2 ] \
+            [ lindex $c2 0 ] \
+            [ lindex $c2 1 ] \
+            [ lindex $c2 2 ] \
+        ]
+
+        $widgets(edtMeasure) delete 0 end
+        $widgets(edtMeasure) insert 0 "$dist"
+
+    }    
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_mpr::ev_dbl_select_st_point { x y } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+    upvar u_mpr::actual_plane actual_plane
+    upvar u_mpr::select_first select_first
+
+    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_st_$widgets(work3D) ] }
+    DeleteSphere sphere_st_$widgets(work3D)
+    catch { tmp_picker_$widgets(work3D) Delete }
+
+    vtkWorldPointPicker tmp_picker_$widgets(work3D)
+    set pickWP    [ tmp_picker_$widgets(work3D) Pick $x $y 0 renderer_$widgets(work3D) ]
+    set pickWPPos [ tmp_picker_$widgets(work3D) GetPickPosition ]
+
+    set xc [ lindex $pickWPPos 0 ]
+    set yc [ lindex $pickWPPos 1 ]
+    set zc [ lindex $pickWPPos 2 ]
+    set resample [ GetVTKVolume_dll ]
+
+    set indP [ [ probe_filter_{$widgets(work3D)}_{$actual_plane} GetOutput ] FindPoint $xc $yc $zc ]
+    set coordsP [ [ probe_filter_{$widgets(work3D)}_{$actual_plane} GetOutput ] GetPoint $indP ]
+
+    renderer_$widgets(work3D) AddActor [ \
+        DrawSphere \
+            sphere_st_$widgets(work3D) \
+            1.0 \
+            [ lindex $coordsP 0 ] [ lindex $coordsP 1 ] [ lindex $coordsP 2 ] \
+            0.0 0.0 1.0
+    ]
+    set u_mpr::stPoint "[ lindex $coordsP 0 ] [ lindex $coordsP 1 ] [ lindex $coordsP 2 ]"
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_mpr::set_mouse_left_events { mask } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+
+    # TODO : change
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    catch { bind $widgets(work3D) <B1-Motion> { evz_pan %W %x %y } }
+
+}
+
+proc u_mpr::set_mouse_right_events { mask } {
+
+    # For programming facilities
+    upvar u_mpr::widgets widgets
+
+    if { [ expr $mask & 0x4 ] == 0x4 } {
+
+        catch { bind $widgets(work3D) <ButtonPress-3>   { ev_startMotion %W %x %y } }
+        catch { bind $widgets(work3D) <ButtonRelease-3> { ev_endMotion %W %x %y } }
+        catch { bind $widgets(work3D) <B3-Motion>       { evz_zoom %W %x %y } }
+
+    }
+    if { [ expr $mask & 0x8 ] == 0x8 } { 
+
+        catch { bind $widgets(work3D) <ButtonPress-3>   { u_mpr::ev_start_window_level %x %y } }
+        catch { bind $widgets(work3D) <ButtonRelease-3> { } }
+        catch { bind $widgets(work3D) <B3-Motion>       { u_mpr::ev_window_level %x %y } }
+
+    }
+    
+}
+
+# EOF - u_mpr.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/windows/u_surf.tcl b/lib/maracasVisuLib/src/interface/tcl/windows/u_surf.tcl
new file mode 100644 (file)
index 0000000..6217240
--- /dev/null
@@ -0,0 +1,1655 @@
+package require BLT
+package require combobox
+catch { namespace import blt::* }
+catch { namespace import combobox::* }
+
+namespace eval u_surf {
+
+    # public interface
+    namespace export        \
+        create              \
+        positionate         \
+        forget
+    
+    # variables
+    variable widgets
+
+    variable reference_actor
+    variable actual_actor
+    variable surf_data
+    variable bounds
+    variable intRange
+    variable axis_index -1
+    variable indexes
+
+}
+
+proc u_surf::reset { parent } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    set widgets(base)            "$parent"
+    set widgets(work3D)          "$parent\.surf"
+    set widgets(controls)        "$parent\.surfControls"
+    set widgets(frButtons)       "$parent\.surfControls.frButtons"
+    set widgets(btnExtract)      "$parent\.surfControls.frButtons.btnExtract"
+    set widgets(btnErase)        "$parent\.surfControls.frButtons.btnErase"
+    set widgets(btnAdd)          "$parent\.surfControls.frButtons.btnAdd"
+    set widgets(btnContinue)     "$parent\.surfControls.frButtons.btnContinue"
+    set widgets(frOther)         "$parent\.surfControls.frOther"
+    set widgets(frSurface)       "$parent\.surfControls.frOther.frSurface"
+    set widgets(btnOpaque)       "$parent\.surfControls.frOther.frSurface.btnOpaque"
+    set widgets(btnTransparent)  "$parent\.surfControls.frOther.frSurface.btnTransparent"
+    set widgets(btnEdgePoints)   "$parent\.surfControls.frOther.frSurface.btnEdgePoints"
+    set widgets(frSurfaceValues) "$parent\.surfControls.frOther.frSurfaceValues"
+    set widgets(sclIso)          "$parent\.surfControls.frOther.frSurfaceValues.sclIso"
+    set widgets(sclOpacity)      "$parent\.surfControls.frOther.frSurfaceValues.sclOpacity"
+    set widgets(btnColor)        "$parent\.surfControls.frOther.btnColor"
+    set widgets(lbl001)          "$parent\.surfControls.frOther.lbl001"
+    set widgets(lbl002)          "$parent\.surfControls.frOther.lbl002"
+    set widgets(lbl003)          "$parent\.surfControls.frOther.lbl003"
+    set widgets(frChooseAxis)    "$parent\.surfControls.frOther.frChooseAxis"
+    set widgets(lblChooseAxis)   "$parent\.surfControls.frOther.frChooseAxis.01"
+    set widgets(edtChooseAxis)   "$parent\.surfControls.frOther.frChooseAxis.02"
+    set widgets(btnSaveAsVtk)   "$parent\.surfControls.frOther.btnSaveAsVtk"
+
+}
+
+proc u_surf::create { parent } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    u_surf::reset $parent
+
+    # frames
+    frame $widgets(controls)        -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(frButtons)       -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(frOther)         -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(frSurface)       -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(frSurfaceValues) -borderwidth 2 -height 75 -relief groove -width 125 
+    frame $widgets(frChooseAxis)    -height 30 -width 30 
+
+    # buttons
+    button $widgets(btnExtract)  -relief flat -image $global_window::images(extract)  -command "u_surf::extract_axis"
+    button $widgets(btnErase)    -relief flat -image $global_window::images(del_axis) -command "u_surf::remove_axis"
+    button $widgets(btnAdd)      -relief flat -image $global_window::images(add)      -command "u_surf::add_axis"
+    button $widgets(btnContinue) -relief flat -image $global_window::images(continue) -command "u_surf::continue_axis"
+    button $widgets(btnColor)    -command "u_surf::change_color"
+    button $widgets(btnSaveAsVtk) -text "Save as VTK..." -command "u_surf::saveasvtk"
+
+    bind $widgets(btnExtract)  <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnErase)    <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnAdd)      <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+    bind $widgets(btnContinue) <Enter> { if { [ string compare [ %W cget -state ] "normal" ] == 0 } { %W configure -relief raised } }
+
+    bind $widgets(btnExtract)  <Leave> { %W configure -relief flat }
+    bind $widgets(btnErase)    <Leave> { %W configure -relief flat }
+    bind $widgets(btnAdd)      <Leave> { %W configure -relief flat }
+    bind $widgets(btnContinue) <Leave> { %W configure -relief flat }
+
+    # radiobuttons
+    radiobutton $widgets(btnOpaque)      -text $string_table::str_opaque      -variable surf_type  -value 1 -command { u_surf::set_IsoActor $surf_type }
+    radiobutton $widgets(btnTransparent) -text $string_table::str_transparent -variable surf_type  -value 2 -command { u_surf::set_IsoActor $surf_type }
+    radiobutton $widgets(btnEdgePoints)  -text $string_table::str_edge_points -variable surf_type  -value 3 -command { u_surf::set_IsoActor $surf_type }
+
+    # scales
+    scale $widgets(sclIso)     -label $string_table::str_isovalue -orient horizontal 
+    scale $widgets(sclOpacity) -label $string_table::str_opacity -orient horizontal -from 0.0 -to 1.0 -resolution 0.01
+
+    # labels
+    label $widgets(lbl001)        -borderwidth 0 -text $string_table::str_surface 
+    label $widgets(lbl002)        -borderwidth 0 -text $string_table::str_surface_values
+    label $widgets(lbl003)        -borderwidth 0 -text $string_table::str_surface_color 
+    label $widgets(lblChooseAxis) -anchor w -borderwidth 0 -text $string_table::str_axis 
+
+    # comboboxes
+    combobox $widgets(edtChooseAxis) \
+        -editable true      \
+        -command  "u_surf::select_axis"
+
+}
+
+proc u_surf::positionate { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    set global_window::show_params 0
+
+    pack  $widgets(work3D)          -anchor nw -expand 1 -fill both -side left
+    pack  $widgets(controls)        -anchor nw -expand 0 -fill both -side left 
+    pack  $widgets(frButtons)       -anchor center -expand 0 -fill none -side top 
+    pack  $widgets(btnExtract)      -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnErase)        -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnAdd)          -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(btnContinue)     -anchor nw -expand 0 -fill none -side left 
+    pack  $widgets(frOther)         -anchor center -expand 1 -fill both -side top 
+    place $widgets(frSurface)       -x 10 -y 55 -width 165 -height 80 -anchor nw -bordermode ignore 
+    place $widgets(btnOpaque)       -x 15 -y 10 -anchor nw -bordermode ignore 
+    place $widgets(btnTransparent)  -x 15 -y 30 -anchor nw -bordermode ignore 
+    place $widgets(btnEdgePoints)   -x 15 -y 50 -anchor nw -bordermode ignore 
+    place $widgets(frSurfaceValues) -x 10 -y 155 -width 165 -height 140 -anchor nw -bordermode ignore 
+    place $widgets(sclIso)          -x 5 -y 10 -width 153 -height 59 -anchor nw -bordermode ignore 
+    place $widgets(sclOpacity)      -x 5 -y 70 -width 153 -height 59 -anchor nw -bordermode ignore 
+    place $widgets(btnColor)        -x 10 -y 320 -width 165 -height 48 -anchor nw -bordermode ignore 
+    place $widgets(lbl001)          -x 15 -y 45 -anchor nw -bordermode ignore 
+    place $widgets(lbl002)          -x 15 -y 145 -anchor nw -bordermode ignore 
+    place $widgets(lbl003)          -x 10 -y 300 -anchor nw -bordermode ignore 
+    place $widgets(frChooseAxis)    -x 5 -y 10 -width 170 -height 25 -anchor nw -bordermode ignore 
+    #place $widgets(btnSaveAsVtk)    -x 15 -y 400 -width 150 -height 25 -anchor nw -bordermode ignore 
+    pack  $widgets(lblChooseAxis)   -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
+    pack  $widgets(edtChooseAxis)   -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
+
+    if { $u_mpr::stPoint != "" } {
+
+        u_surf::select_initial_2 [ lindex $u_mpr::stPoint 0 ] [ lindex $u_mpr::stPoint 1 ] [ lindex $u_mpr::stPoint 2 ]
+
+    }
+
+}
+
+proc u_surf::forget { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    pack  forget $widgets(edtChooseAxis)
+    pack  forget $widgets(lblChooseAxis)
+    place forget $widgets(btnSaveAsVtk)
+    place forget $widgets(frChooseAxis)
+    place forget $widgets(lbl003)
+    place forget $widgets(lbl002)
+    place forget $widgets(lbl001)
+    place forget $widgets(btnColor)
+    place forget $widgets(sclOpacity)
+    place forget $widgets(sclIso)
+    place forget $widgets(frSurfaceValues)
+    place forget $widgets(btnEdgePoints)
+    place forget $widgets(btnTransparent)
+    place forget $widgets(btnOpaque)
+    place forget $widgets(frSurface)
+    pack  forget $widgets(frOther)
+    pack  forget $widgets(btnContinue)
+    pack  forget $widgets(btnAdd)
+    pack  forget $widgets(btnErase)
+    pack  forget $widgets(btnExtract)
+    pack  forget $widgets(frButtons)
+    pack  forget $widgets(controls)
+    pack  forget $widgets(work3D)
+
+}
+
+proc u_surf::set_data { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::axis_index      axis_index
+
+    set axis_index 0
+
+    $widgets(edtChooseAxis) list delete 0 end
+    $widgets(edtChooseAxis) delete 0 end
+
+    # render widget
+    destroy $widgets(work3D)
+    vtkTkRenderWidget $widgets(work3D) -width 30 -height 30
+
+    # TODO: change
+    bindBasicEvents $widgets(work3D)
+
+    bind $widgets(work3D) <Double-Button-1> "u_surf::select_initial %x %y"
+    bind $widgets(work3D) <Double-Button-3> "u_surf::select_axis_point %x %y"
+
+    catch { renderer_$widgets(work3D) Delete }
+    vtkRenderer renderer_$widgets(work3D)
+    set render [ $widgets(work3D) GetRenderWindow ]
+    renderer_$widgets(work3D) SetBackground 1 1 1
+    #renderer_$widgets(work3D) SetBackground 0.023 0.239 0.909
+    #renderer_$widgets(work3D) SetBackground 0 0 0.627
+    $render AddRenderer renderer_$widgets(work3D)
+    $render SetSize 1 1
+
+    set range    [ GetImageRange_dll ]
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+    $widgets(btnColor) configure -background #faebd6
+    set r 0.9803
+    set g 0.9215
+    set b 0.8392
+
+    catch { renderer_$widgets(work3D) RemoveActor outlineActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor isoActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor edgeActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveVolume opaqueVol_$widgets(work3D) }
+    catch { outlineActor_$widgets(work3D)  Delete }
+    catch { outlineMapper_$widgets(work3D) Delete }
+    catch { outlineSource_$widgets(work3D) Delete }
+    catch { opaqueVol_$widgets(work3D)     Delete }
+    catch { isoCast_$widgets(work3D)       Delete }
+    catch { isoFunc_$widgets(work3D)       Delete }
+    catch { opaqueProp_$widgets(work3D)    Delete }
+    catch { colorFunc_$widgets(work3D)     Delete }
+    catch { constFunc_$widgets(work3D)     Delete }
+    catch { edgeActor_$widgets(work3D)     Delete }
+    catch { edgeMapper_$widgets(work3D)    Delete }
+    catch { edgePoints_$widgets(work3D)    Delete }
+    catch { isoActor_$widgets(work3D)      Delete }
+    catch { isoMapper_$widgets(work3D)     Delete }
+    catch { cubes_$widgets(work3D)         Delete }
+    catch { struct_$widgets(work3D)        Delete }
+
+    # 3D outline
+    vtkCubeSource outlineSource_$widgets(work3D)
+        outlineSource_$widgets(work3D) SetXLength [ expr [ lindex $bounds 1 ] - [ lindex $bounds 0 ] ]
+        outlineSource_$widgets(work3D) SetYLength [ expr [ lindex $bounds 3 ] - [ lindex $bounds 2 ] ]
+        outlineSource_$widgets(work3D) SetZLength [ expr [ lindex $bounds 5 ] - [ lindex $bounds 4 ] ]
+        outlineSource_$widgets(work3D) SetCenter  \
+            [ expr ( [ lindex $bounds 0 ] + [ lindex $bounds 1 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 2 ] + [ lindex $bounds 3 ] ) / 2 ] \
+            [ expr ( [ lindex $bounds 4 ] + [ lindex $bounds 5 ] ) / 2 ]
+
+    vtkPolyDataMapper outlineMapper_$widgets(work3D)
+        outlineMapper_$widgets(work3D) SetInput [ outlineSource_$widgets(work3D) GetOutput ]
+        outlineMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor outlineActor_$widgets(work3D)
+        outlineActor_$widgets(work3D) SetMapper outlineMapper_$widgets(work3D)
+        [ outlineActor_$widgets(work3D) GetProperty ] SetRepresentationToWireframe
+        [ outlineActor_$widgets(work3D) GetProperty ] SetColor    0.7 0.0 0.9
+        [ outlineActor_$widgets(work3D) GetProperty ] SetAmbient  1
+        [ outlineActor_$widgets(work3D) GetProperty ] SetDiffuse  0
+        [ outlineActor_$widgets(work3D) GetProperty ] SetSpecular 0
+
+    renderer_$widgets(work3D) AddActor outlineActor_$widgets(work3D)
+
+    # Surface
+    vtkImageToStructuredPoints struct_$widgets(work3D)
+        struct_$widgets(work3D) SetInput $resample
+        struct_$widgets(work3D) Update
+
+    vtkMarchingCubes cubes_$widgets(work3D)
+        cubes_$widgets(work3D) SetInput [ struct_$widgets(work3D) GetOutput ]
+        cubes_$widgets(work3D) SetValue 0 [ expr [ lindex $range 1 ] / 4 ]
+
+    vtkPolyDataMapper isoMapper_$widgets(work3D)
+        isoMapper_$widgets(work3D) SetInput [ cubes_$widgets(work3D) GetOutput ]
+        isoMapper_$widgets(work3D) ScalarVisibilityOff
+        isoMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+    vtkActor isoActor_$widgets(work3D)
+        isoActor_$widgets(work3D) SetMapper isoMapper_$widgets(work3D)
+        eval [ isoActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+        eval [ isoActor_$widgets(work3D) GetProperty ] SetOpacity 0.5
+
+    # Edge points
+    vtkEdgePoints edgePoints_$widgets(work3D)
+        edgePoints_$widgets(work3D) SetInput $resample
+        edgePoints_$widgets(work3D) SetValue [ expr [ lindex $range 1 ] / 4 ]
+
+    vtkDataSetMapper edgeMapper_$widgets(work3D)
+        edgeMapper_$widgets(work3D) SetInput [ edgePoints_$widgets(work3D) GetOutput ]
+        edgeMapper_$widgets(work3D) ScalarVisibilityOff
+        edgeMapper_$widgets(work3D) ImmediateModeRenderingOn
+    
+    vtkActor edgeActor_$widgets(work3D)
+        edgeActor_$widgets(work3D) SetMapper edgeMapper_$widgets(work3D)
+        eval [ edgeActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+
+    # Opaque
+    vtkPiecewiseFunction constFunc_$widgets(work3D)
+        constFunc_$widgets(work3D) AddPoint  0                  1.0
+        constFunc_$widgets(work3D) AddPoint  [ lindex $range 1 ]  1.0
+
+    vtkColorTransferFunction colorFunc_$widgets(work3D)
+        colorFunc_$widgets(work3D) AddRGBPoint 0.0                 1.0 1.0 1.0
+        colorFunc_$widgets(work3D) AddRGBPoint [ lindex $range 1 ] 1.0 1.0 1.0
+
+    vtkVolumeProperty opaqueProp_$widgets(work3D)
+        opaqueProp_$widgets(work3D) SetColor colorFunc_$widgets(work3D)
+        opaqueProp_$widgets(work3D) SetScalarOpacity constFunc_$widgets(work3D)
+        opaqueProp_$widgets(work3D) ShadeOn
+        opaqueProp_$widgets(work3D) SetInterpolationTypeToLinear
+
+    vtkVolumeRayCastIsosurfaceFunction isoFunc_$widgets(work3D)
+        isoFunc_$widgets(work3D) SetIsoValue [ expr [ lindex $range 1 ] / 4 ]
+
+    vtkVolumeRayCastMapper isoCast_$widgets(work3D)
+        isoCast_$widgets(work3D) SetInput $resample
+        isoCast_$widgets(work3D) SetVolumeRayCastFunction isoFunc_$widgets(work3D)
+
+    vtkVolume opaqueVol_$widgets(work3D)
+        opaqueVol_$widgets(work3D) SetMapper isoCast_$widgets(work3D)
+        opaqueVol_$widgets(work3D) SetProperty opaqueProp_$widgets(work3D)
+
+    $widgets(sclIso) configure \
+        -from [ lindex $range 0 ] \
+        -to   [ lindex $range 1 ] \
+        -resolution 1.0
+
+    $widgets(sclOpacity) configure \
+        -from 0.0 \
+        -to   1.0 \
+        -resolution 0.01
+
+    bind $widgets(sclIso) <Any-ButtonRelease>
+    bind $widgets(sclIso) <Any-ButtonRelease> "u_surf::change_intensity 0"
+    
+    bind $widgets(sclOpacity) <Any-ButtonRelease>
+    bind $widgets(sclOpacity) <Any-ButtonRelease> "u_surf::change_opacity 0"
+
+    u_surf::change_intensity 1
+    u_surf::change_opacity 1
+
+    $widgets(btnOpaque)      deselect
+    $widgets(btnTransparent) deselect
+    $widgets(btnEdgePoints)  deselect
+    $widgets(btnTransparent) invoke
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    u_3D::controls 0
+
+}
+
+proc u_surf::set_IsoActor { typ } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::actual_actor   actual_actor
+
+    catch { renderer_$widgets(work3D) RemoveActor isoActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor edgeActor_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveVolume opaqueVol_$widgets(work3D) }
+
+    set actual_actor $typ
+
+    if { $actual_actor == 1 } {
+
+        renderer_$widgets(work3D) AddVolume opaqueVol_$widgets(work3D)
+    
+    } elseif { $actual_actor == 2 } {
+
+        renderer_$widgets(work3D) AddActor isoActor_$widgets(work3D)
+
+    } elseif { $actual_actor == 3 } {
+
+        renderer_$widgets(work3D) AddActor edgeActor_$widgets(work3D)
+
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_surf::change_color { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::reference_actor reference_actor
+    upvar u_surf::actual_actor    actual_actor
+    upvar u_surf::surf_data       surf_data
+    upvar u_surf::bounds          bounds
+    upvar u_surf::intRange        intRange
+
+    set col [ $widgets(btnColor) cget -background ]
+    set col [ \
+     tk_chooseColor \
+         -initialcolor $col \
+         -parent $widgets(btnColor) \
+         -title "Choose a color..."
+    ]
+    if { $col != "" } { 
+        
+        $widgets(btnColor) configure -background $col            
+        set r [ expr "0x[ string index $col 1 ][ string index $col 2 ]" / 255.0 ]
+        set g [ expr "0x[ string index $col 3 ][ string index $col 4 ]" / 255.0 ]
+        set b [ expr "0x[ string index $col 5 ][ string index $col 6 ]" / 255.0 ]
+        [ isoActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+        [ edgeActor_$widgets(work3D) GetProperty ] SetColor $r $g $b
+        
+        [ $widgets(work3D) GetRenderWindow ] Render
+
+    }
+
+}
+
+proc u_surf::intersectionSurface { data p n o dir extent distance } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    vtkCellLocator locator_tmp_$widgets(work3D)
+        locator_tmp_$widgets(work3D) SetDataSet $data
+        locator_tmp_$widgets(work3D) Initialize
+
+    set p1x [ expr ( $dir == 0 )? [ lindex $p 0 ] - [ lindex $n 0 ]: [ lindex $p 0 ] + [ lindex $n 0 ] ]
+    set p1y [ expr ( $dir == 0 )? [ lindex $p 1 ] - [ lindex $n 1 ]: [ lindex $p 1 ] + [ lindex $n 1 ] ]
+    set p1z [ expr ( $dir == 0 )? [ lindex $p 2 ] - [ lindex $n 2 ]: [ lindex $p 2 ] + [ lindex $n 2 ] ]
+
+    set iter 1
+    set i 0
+    while { $iter == 1 } {
+    
+        set p2x [ expr ( $dir == 0 )? [ expr $p1x - [ lindex $n 0 ] * $i ]: [ expr $p1x + [ lindex $n 0 ] * $i ] ]
+        set p2y [ expr ( $dir == 0 )? [ expr $p1y - [ lindex $n 1 ] * $i ]: [ expr $p1y + [ lindex $n 1 ] * $i ] ]
+        set p2z [ expr ( $dir == 0 )? [ expr $p1z - [ lindex $n 2 ] * $i ]: [ expr $p1z + [ lindex $n 2 ] * $i ] ]
+        incr i
+
+        set index [ $data FindPoint $p2x $p2y $p2z ]
+        set voxx [ lindex [ split [ expr $p2x - [ lindex $o 0 ] ] . ] 0 ]
+        set voxy [ lindex [ split [ expr $p2y - [ lindex $o 1 ] ] . ] 0 ]
+        set voxz [ lindex [ split [ expr $p2z - [ lindex $o 2 ] ] . ] 0 ]
+
+        if {
+            $voxx >= 0 && $voxx <= [ lindex $extent 1 ] - [ lindex $extent 0 ] &&
+            $voxy >= 0 && $voxy <= [ lindex $extent 3 ] - [ lindex $extent 2 ] &&
+            $voxz >= 0 && $voxz <= [ lindex $extent 5 ] - [ lindex $extent 4 ]
+        } {
+
+            locator_tmp_$widgets(work3D) Update
+            set res [ IntersectWithLine_dll locator_tmp_$widgets(work3D)  $p1x $p1y $p1z $p2x $p2y $p2z 0.001 ]
+            if { [ lindex $res 0 ] == 1 } {
+
+                set ret [ list        \
+                    1                 \
+                    [ lindex $res 1 ] \
+                    [ lindex $res 2 ] \
+                    [ lindex $res 3 ] \
+                    $i                \
+                ]
+                set iter 0
+
+            } elseif { $i >= $distance } { set iter 0; set ret [ list 0 ] }
+
+        } else { set iter 0; set ret [ list 0 ] }
+
+    }
+    catch { locator_tmp_$widgets(work3D) Delete }
+    return $ret
+
+}
+
+proc u_surf::select_initial { x y } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    busy hold .
+    update
+
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_1_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_2_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_3_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_4_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_5_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_ROI_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor line_actor_1_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor line_actor_2_$widgets(work3D) }
+    DeleteSphere sphere_1_$widgets(work3D)
+    DeleteSphere sphere_2_$widgets(work3D)
+    DeleteSphere sphere_3_$widgets(work3D)
+    DeleteSphere sphere_4_$widgets(work3D)
+    DeleteSphere sphere_5_$widgets(work3D)
+    DeleteSphere sphere_ROI_$widgets(work3D)
+    catch { line_actor_1_$widgets(work3D)  Delete }
+    catch { line_mapper_1_$widgets(work3D) Delete }
+    catch { tube_normal_1_$widgets(work3D) Delete }
+    catch { poly_normal_1_$widgets(work3D) Delete }
+    catch { line_1_$widgets(work3D)        Delete }
+    catch { points_1_$widgets(work3D)      Delete }
+    catch { line_actor_2_$widgets(work3D)  Delete }
+    catch { line_mapper_2_$widgets(work3D) Delete }
+    catch { tube_normal_2_$widgets(work3D) Delete }
+    catch { poly_normal_2_$widgets(work3D) Delete }
+    catch { line_2_$widgets(work3D)        Delete }
+    catch { points_2_$widgets(work3D)      Delete }
+
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+
+    renderer_$widgets(work3D) IsInViewport 0 0
+    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+
+    set surfPD [ cubes_$widgets(work3D) GetOutput ]
+    $surfPD ComputeBounds
+
+    set pointData    [ $surfPD GetPointData ]
+    set normalsSurf  [ $pointData GetNormals ]
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    
+    set pickWPPos [ pick_point_local_actor $x $y renderer_$widgets(work3D) isoActor_$widgets(work3D) 0.001 ]
+
+    set xc [ lindex $pickWPPos 0 ]; set yc [ lindex $pickWPPos 1 ]; set zc [ lindex $pickWPPos 2 ]
+    
+    set indP    [ $surfPD FindPoint $xc $yc $zc ]
+    set coordsP [ $surfPD GetPoint $indP ]
+
+    set xc [ lindex $coordsP 0 ]; set yc [ lindex $coordsP 1 ]; set zc [ lindex $coordsP 2 ]
+    set x1 $xc; set y1 $yc; set z1 $zc
+
+    renderer_$widgets(work3D) AddActor [ DrawSphere sphere_1_$widgets(work3D) 0.5 $xc $yc $zc 1.0 0.0 0.0 ]
+
+    set normalP [ $normalsSurf GetTuple3 $indP ]
+    set xN [ lindex $normalP 0 ]; set yN [ lindex $normalP 1 ]; set zN [ lindex $normalP 2 ]
+    set xO [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 0 ] . ] 0 ]
+    set yO [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 1 ] . ] 0 ]
+    set zO [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 2 ] . ] 0 ]
+
+    set largmax 30
+
+    set resInt [ u_surf::intersectionSurface \
+        $surfPD                              \
+        $coordsP                             \
+        $normalP                             \
+        [ list $xO $yO $zO ]                 \
+        0                                    \
+        $bounds                              \
+        $largmax                             \
+    ]
+
+    set trouve [ lindex $resInt 0 ]
+    set xI     [ lindex $resInt 1 ]
+    set yI     [ lindex $resInt 2 ]
+    set zI     [ lindex $resInt 3 ]
+    set i      [ lindex $resInt 4 ]
+
+    if { $trouve == 0 } {
+
+        tk_messageBox \
+            -icon error \
+            -message "$string_table::str_please_select_a_different_point" \
+            -title "ERROR"
+
+    } else {
+
+        renderer_$widgets(work3D) AddActor [ DrawSphere sphere_2_$widgets(work3D) 0.5 $xI $yI $zI 1.0 0.0 0.0 ]
+
+        vtkPoints points_1_$widgets(work3D)
+            points_1_$widgets(work3D) InsertPoint 0 $xI $yI $zI
+            points_1_$widgets(work3D) InsertPoint 1 $xc $yc $zc
+        vtkCellArray line_1_$widgets(work3D)
+            line_1_$widgets(work3D) InsertNextCell 2
+        for { set j 0 } { $j < 2 } { incr j } { line_1_$widgets(work3D) InsertCellPoint $j }
+
+        vtkPolyData poly_normal_1_$widgets(work3D)
+            poly_normal_1_$widgets(work3D) SetPoints points_1_$widgets(work3D)
+            poly_normal_1_$widgets(work3D) SetLines line_1_$widgets(work3D)
+
+        vtkTubeFilter tube_normal_1_$widgets(work3D)
+            tube_normal_1_$widgets(work3D) SetInput poly_normal_1_$widgets(work3D)
+            tube_normal_1_$widgets(work3D) SetRadius 0.25
+
+        vtkPolyDataMapper line_mapper_1_$widgets(work3D)
+            line_mapper_1_$widgets(work3D) SetInput [ tube_normal_1_$widgets(work3D) GetOutput ]
+            line_mapper_1_$widgets(work3D) ImmediateModeRenderingOn
+
+        vtkActor line_actor_1_$widgets(work3D)
+            line_actor_1_$widgets(work3D) SetMapper line_mapper_1_$widgets(work3D)
+            [ line_actor_1_$widgets(work3D) GetProperty ] SetColor 1 0 0
+            [ line_actor_1_$widgets(work3D) GetProperty ] BackfaceCullingOff
+
+        renderer_$widgets(work3D) AddActor line_actor_1_$widgets(work3D)
+
+        set distPoints $i
+        set largVaisseau1 [ DistPoints $xc $yc $zc $xI $yI $zI ]
+        set vox_size [ GetActualVoxelSize_dll ]
+        set coordVoxelPc  [ VoxelCoord $xc $yc $zc $xO $yO $zO $vox_size $vox_size $vox_size ]
+        set xcvol         [ lindex $coordVoxelPc 0 ]
+        set ycvol         [ lindex $coordVoxelPc 1 ]
+        set zcvol         [ lindex $coordVoxelPc 2 ]
+        set coordVoxelPI [ VoxelCoord $xI $yI $zI $xO $yO $zO $vox_size $vox_size $vox_size ]
+        set xIvol        [ lindex $coordVoxelPI 0 ]
+        set yIvol        [ lindex $coordVoxelPI 1 ]
+        set zIvol        [ lindex $coordVoxelPI 2 ]
+        set distPointsVol1 [ DistPoints $xcvol $ycvol $zcvol $xIvol $yIvol $zIvol ]
+
+        set xc [ expr ( $xc - ( $xN * ( $largVaisseau1 / 2 ) ) ) ]
+        set yc [ expr ( $yc - ( $yN * ( $largVaisseau1 / 2 ) ) ) ]
+        set zc [ expr ( $zc - ( $zN * ( $largVaisseau1 / 2 ) ) ) ]
+
+        renderer_$widgets(work3D) AddActor [ DrawSphere sphere_3_$widgets(work3D) 0.5 $xc $yc $zc 1.0 0.0 0.0 ]
+
+        set vectsPerp [ TclPerpendiculars_dll $xN $yN $zN 0 ]
+        set xP1 [ lindex $vectsPerp 0 ]; set yP1 [ lindex $vectsPerp 1 ]; set zP1 [ lindex $vectsPerp 2 ];
+        set xP2 [ lindex $vectsPerp 3 ]; set yP2 [ lindex $vectsPerp 4 ]; set zP2 [ lindex $vectsPerp 5 ];
+
+        set resIntP11 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP1 $yP1 $zP1 ]              \
+            [ list $xO $yO $zO ]                 \
+            0                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP11 [ lindex $resIntP11 0 ]
+        set xP11      [ lindex $resIntP11 1 ]
+        set yP11      [ lindex $resIntP11 2 ]
+        set zP11      [ lindex $resIntP11 3 ]
+        set i         [ lindex $resIntP11 4 ]
+
+        set resIntP12 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP1 $yP1 $zP1 ]              \
+            [ list $xO $yO $zO ]                 \
+            1                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP12 [ lindex $resIntP12 0 ]
+        set xP12      [ lindex $resIntP12 1 ]
+        set yP12      [ lindex $resIntP12 2 ]
+        set zP12      [ lindex $resIntP12 3 ]
+        set i         [ lindex $resIntP12 4 ]
+
+        if { ( $trouveP11 == 1 ) && ( $trouveP12 == 1 ) } {
+            set largP1 [ DistPoints $xP11 $yP11 $zP11 $xP12 $yP12 $zP12 ]
+        } else { set largP1 10000 }
+
+        set resIntP21 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP2 $yP2 $zP2 ]              \
+            [ list $xO $yO $zO ]                 \
+            0                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP21 [ lindex $resIntP21 0 ]
+        set xP21      [ lindex $resIntP21 1 ]
+        set yP21      [ lindex $resIntP21 2 ]
+        set zP21      [ lindex $resIntP21 3 ]
+        set i         [ lindex $resIntP21 4 ]
+
+        set resIntP22 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP2 $yP2 $zP2 ]              \
+            [ list $xO $yO $zO ]                 \
+            1                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP22 [ lindex $resIntP22 0 ]
+        set xP22      [ lindex $resIntP22 1 ]
+        set yP22      [ lindex $resIntP22 2 ]
+        set zP22      [ lindex $resIntP22 3 ]
+        set i         [ lindex $resIntP22 4 ]
+
+        if { ( $trouveP21 == 1 ) && ( $trouveP22 == 1 ) } {
+            set largP2 [ DistPoints $xP21 $yP21 $zP21 $xP22 $yP22 $zP22 ]
+        } else { set largP2 10000 }
+
+        if { ( $largP1 == 10000 ) && ( $largP2 == 10000 ) } {
+        
+            set xP1 0; set yP1 0; set zP1 0
+            set xP2 0; set yP2 0; set zP2 0
+            set largdef 0
+
+        } elseif { ( $largP1 < $largP2 ) } {
+        
+            set xP1 $xP11; set yP1 $yP11; set zP1 $zP11
+            set xP2 $xP12; set yP2 $yP12; set zP2 $zP12
+            set largdef $largP1
+
+        } elseif { ( $largP2 < $largP1 ) } {
+
+            set xP1 $xP21; set yP1 $yP21; set zP1 $zP21
+            set xP2 $xP22; set yP2 $yP22; set zP2 $zP22
+            set largdef $largP2
+        } 
+        set largVaisseau2 $largdef
+
+        if { $largVaisseau2 > 0 } {
+        
+            set largVaisseau [ expr ( $largVaisseau1 + $largVaisseau2 ) / 2 ]
+            set vox_size [ GetActualVoxelSize_dll ]
+            set coordVoxelP1 [ VoxelCoord $xP1 $yP1 $zP1 $xO $yO $zO $vox_size $vox_size $vox_size ]
+            set xP1vol [ lindex $coordVoxelP1 0 ]; set yP1vol [ lindex $coordVoxelP1 1 ]; set zP1vol [ lindex $coordVoxelP1 2 ]
+
+            set coordVoxelP2 [VoxelCoord $xP2 $yP2 $zP2 $xO $yO $zO $vox_size $vox_size $vox_size ]
+            set xP2vol [ lindex $coordVoxelP2 0 ]; set yP2vol [ lindex $coordVoxelP2 1 ]; set zP2vol [ lindex $coordVoxelP2 2 ]
+            set distPointsVol2 [ DistPoints $xP1vol $yP1vol $zP1vol $xP2vol $yP2vol $zP2vol ]
+
+        } else {
+        
+            set largVaisseau 0
+            set distPointsVol2 0
+        }
+
+        if { $largVaisseau2 > 0 } {
+
+            renderer_$widgets(work3D) AddActor [ DrawSphere sphere_4_$widgets(work3D) 0.5 $xP1 $yP1 $zP1 0.0 1.0 0.0 ]
+            renderer_$widgets(work3D) AddActor [ DrawSphere sphere_5_$widgets(work3D) 0.5 $xP2 $yP2 $zP2 0.0 1.0 0.0 ]
+
+            vtkPoints points_2_$widgets(work3D)
+                points_2_$widgets(work3D) InsertPoint 0 $xP1 $yP1 $zP1
+                points_2_$widgets(work3D) InsertPoint 1 $xP2 $yP2 $zP2
+            vtkCellArray line_2_$widgets(work3D)
+                line_2_$widgets(work3D) InsertNextCell 2
+            for { set j 0 } { $j < 2 } { incr j } { line_2_$widgets(work3D) InsertCellPoint $j }
+
+            vtkPolyData poly_normal_2_$widgets(work3D)
+                poly_normal_2_$widgets(work3D) SetPoints points_2_$widgets(work3D)
+                poly_normal_2_$widgets(work3D) SetLines line_2_$widgets(work3D)
+
+            vtkTubeFilter tube_normal_2_$widgets(work3D)
+                tube_normal_2_$widgets(work3D) SetInput poly_normal_2_$widgets(work3D)
+                tube_normal_2_$widgets(work3D) SetRadius 0.25
+
+            vtkPolyDataMapper line_mapper_2_$widgets(work3D)
+                line_mapper_2_$widgets(work3D) SetInput [ tube_normal_2_$widgets(work3D) GetOutput ]
+                line_mapper_2_$widgets(work3D) ImmediateModeRenderingOn
+
+            vtkActor line_actor_2_$widgets(work3D)
+                line_actor_2_$widgets(work3D) SetMapper line_mapper_2_$widgets(work3D)
+                [ line_actor_2_$widgets(work3D) GetProperty ] SetColor 0.0 1.0 0.0
+                [ line_actor_2_$widgets(work3D) GetProperty ] BackfaceCullingOff
+
+            renderer_$widgets(work3D) AddActor line_actor_2_$widgets(work3D)
+
+        }
+
+        if { $distPointsVol2 > 0 } {
+            set distPointsVol [ expr ( $distPointsVol1 + $distPointsVol2 ) / 2 ]
+        } else { set distPointsVol $distPointsVol1 }
+        SetROIStep_dll $distPointsVol
+        array set arr [ params_dll ]
+        set act [ \
+            DrawSphere \
+                sphere_ROI_$widgets(work3D) \
+                [ expr $arr(e_roi_dimension) / 2.0 ] \
+                $xc $yc $zc \
+                1.0 0.0 0.0 \
+        ]
+        [ $act GetProperty ] SetOpacity 0.2
+        renderer_$widgets(work3D) AddActor $act
+
+    }
+
+    busy release .
+    update
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_surf::select_initial_2 { xc yc zc } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    busy hold .
+    update
+
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_1_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_2_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_3_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_4_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_5_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_ROI_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor line_actor_1_$widgets(work3D) }
+    catch { renderer_$widgets(work3D) RemoveActor line_actor_2_$widgets(work3D) }
+    DeleteSphere sphere_1_$widgets(work3D)
+    DeleteSphere sphere_2_$widgets(work3D)
+    DeleteSphere sphere_3_$widgets(work3D)
+    DeleteSphere sphere_4_$widgets(work3D)
+    DeleteSphere sphere_5_$widgets(work3D)
+    DeleteSphere sphere_ROI_$widgets(work3D)
+    catch { line_actor_1_$widgets(work3D)  Delete }
+    catch { line_mapper_1_$widgets(work3D) Delete }
+    catch { tube_normal_1_$widgets(work3D) Delete }
+    catch { poly_normal_1_$widgets(work3D) Delete }
+    catch { line_1_$widgets(work3D)        Delete }
+    catch { points_1_$widgets(work3D)      Delete }
+    catch { line_actor_2_$widgets(work3D)  Delete }
+    catch { line_mapper_2_$widgets(work3D) Delete }
+    catch { tube_normal_2_$widgets(work3D) Delete }
+    catch { poly_normal_2_$widgets(work3D) Delete }
+    catch { line_2_$widgets(work3D)        Delete }
+    catch { points_2_$widgets(work3D)      Delete }
+
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+
+#    renderer_$widgets(work3D) IsInViewport 0 0
+#    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+#
+    set surfPD [ cubes_$widgets(work3D) GetOutput ]
+    $surfPD ComputeBounds
+#
+    set pointData    [ $surfPD GetPointData ]
+    set normalsSurf  [ $pointData GetNormals ]
+#
+#    [ $widgets(work3D) GetRenderWindow ] Render
+#    
+#    set pickWPPos [ pick_point_local_actor $x $y renderer_$widgets(work3D) isoActor_$widgets(work3D) 0.001 ]
+#
+#    set xc [ lindex $pickWPPos 0 ]; set yc [ lindex $pickWPPos 1 ]; set zc [ lindex $pickWPPos 2 ]
+#    
+    set indP    [ $surfPD FindPoint $xc $yc $zc ]
+    set coordsP [ $surfPD GetPoint $indP ]
+#
+#    set xc [ lindex $coordsP 0 ]; set yc [ lindex $coordsP 1 ]; set zc [ lindex $coordsP 2 ]
+    set x1 $xc; set y1 $yc; set z1 $zc
+
+    renderer_$widgets(work3D) AddActor [ DrawSphere sphere_1_$widgets(work3D) 0.5 $xc $yc $zc 1.0 0.0 0.0 ]
+
+    set normalP [ $normalsSurf GetTuple3 $indP ]
+    set xN [ lindex $normalP 0 ]; set yN [ lindex $normalP 1 ]; set zN [ lindex $normalP 2 ]
+    set xO [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 0 ] . ] 0 ]
+    set yO [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 1 ] . ] 0 ]
+    set zO [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 2 ] . ] 0 ]
+
+    set largmax 30
+
+    set resInt [ u_surf::intersectionSurface \
+        $surfPD                              \
+        $coordsP                             \
+        $normalP                             \
+        [ list $xO $yO $zO ]                 \
+        0                                    \
+        $bounds                              \
+        $largmax                             \
+    ]
+
+    set trouve [ lindex $resInt 0 ]
+    set xI     [ lindex $resInt 1 ]
+    set yI     [ lindex $resInt 2 ]
+    set zI     [ lindex $resInt 3 ]
+    set i      [ lindex $resInt 4 ]
+
+    if { $trouve == 0 } {
+
+        tk_messageBox \
+            -icon error \
+            -message "$string_table::str_please_select_a_different_point" \
+            -title "ERROR"
+
+    } else {
+
+        renderer_$widgets(work3D) AddActor [ DrawSphere sphere_2_$widgets(work3D) 0.5 $xI $yI $zI 1.0 0.0 0.0 ]
+
+        vtkPoints points_1_$widgets(work3D)
+            points_1_$widgets(work3D) InsertPoint 0 $xI $yI $zI
+            points_1_$widgets(work3D) InsertPoint 1 $xc $yc $zc
+        vtkCellArray line_1_$widgets(work3D)
+            line_1_$widgets(work3D) InsertNextCell 2
+        for { set j 0 } { $j < 2 } { incr j } { line_1_$widgets(work3D) InsertCellPoint $j }
+
+        vtkPolyData poly_normal_1_$widgets(work3D)
+            poly_normal_1_$widgets(work3D) SetPoints points_1_$widgets(work3D)
+            poly_normal_1_$widgets(work3D) SetLines line_1_$widgets(work3D)
+
+        vtkTubeFilter tube_normal_1_$widgets(work3D)
+            tube_normal_1_$widgets(work3D) SetInput poly_normal_1_$widgets(work3D)
+            tube_normal_1_$widgets(work3D) SetRadius 0.25
+
+        vtkPolyDataMapper line_mapper_1_$widgets(work3D)
+            line_mapper_1_$widgets(work3D) SetInput [ tube_normal_1_$widgets(work3D) GetOutput ]
+            line_mapper_1_$widgets(work3D) ImmediateModeRenderingOn
+
+        vtkActor line_actor_1_$widgets(work3D)
+            line_actor_1_$widgets(work3D) SetMapper line_mapper_1_$widgets(work3D)
+            [ line_actor_1_$widgets(work3D) GetProperty ] SetColor 1 0 0
+            [ line_actor_1_$widgets(work3D) GetProperty ] BackfaceCullingOff
+
+        renderer_$widgets(work3D) AddActor line_actor_1_$widgets(work3D)
+
+        set distPoints $i
+        set largVaisseau1 [ DistPoints $xc $yc $zc $xI $yI $zI ]
+        set vox_size [ GetActualVoxelSize_dll ]
+        set coordVoxelPc  [ VoxelCoord $xc $yc $zc $xO $yO $zO $vox_size $vox_size $vox_size ]
+        set xcvol         [ lindex $coordVoxelPc 0 ]
+        set ycvol         [ lindex $coordVoxelPc 1 ]
+        set zcvol         [ lindex $coordVoxelPc 2 ]
+        set coordVoxelPI [ VoxelCoord $xI $yI $zI $xO $yO $zO $vox_size $vox_size $vox_size ]
+        set xIvol        [ lindex $coordVoxelPI 0 ]
+        set yIvol        [ lindex $coordVoxelPI 1 ]
+        set zIvol        [ lindex $coordVoxelPI 2 ]
+        set distPointsVol1 [ DistPoints $xcvol $ycvol $zcvol $xIvol $yIvol $zIvol ]
+
+        set xc [ expr ( $xc - ( $xN * ( $largVaisseau1 / 2 ) ) ) ]
+        set yc [ expr ( $yc - ( $yN * ( $largVaisseau1 / 2 ) ) ) ]
+        set zc [ expr ( $zc - ( $zN * ( $largVaisseau1 / 2 ) ) ) ]
+
+        renderer_$widgets(work3D) AddActor [ DrawSphere sphere_3_$widgets(work3D) 0.5 $xc $yc $zc 1.0 0.0 0.0 ]
+
+        set vectsPerp [ TclPerpendiculars_dll $xN $yN $zN 0 ]
+        set xP1 [ lindex $vectsPerp 0 ]; set yP1 [ lindex $vectsPerp 1 ]; set zP1 [ lindex $vectsPerp 2 ];
+        set xP2 [ lindex $vectsPerp 3 ]; set yP2 [ lindex $vectsPerp 4 ]; set zP2 [ lindex $vectsPerp 5 ];
+
+        set resIntP11 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP1 $yP1 $zP1 ]              \
+            [ list $xO $yO $zO ]                 \
+            0                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP11 [ lindex $resIntP11 0 ]
+        set xP11      [ lindex $resIntP11 1 ]
+        set yP11      [ lindex $resIntP11 2 ]
+        set zP11      [ lindex $resIntP11 3 ]
+        set i         [ lindex $resIntP11 4 ]
+
+        set resIntP12 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP1 $yP1 $zP1 ]              \
+            [ list $xO $yO $zO ]                 \
+            1                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP12 [ lindex $resIntP12 0 ]
+        set xP12      [ lindex $resIntP12 1 ]
+        set yP12      [ lindex $resIntP12 2 ]
+        set zP12      [ lindex $resIntP12 3 ]
+        set i         [ lindex $resIntP12 4 ]
+
+        if { ( $trouveP11 == 1 ) && ( $trouveP12 == 1 ) } {
+            set largP1 [ DistPoints $xP11 $yP11 $zP11 $xP12 $yP12 $zP12 ]
+        } else { set largP1 10000 }
+
+        set resIntP21 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP2 $yP2 $zP2 ]              \
+            [ list $xO $yO $zO ]                 \
+            0                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP21 [ lindex $resIntP21 0 ]
+        set xP21      [ lindex $resIntP21 1 ]
+        set yP21      [ lindex $resIntP21 2 ]
+        set zP21      [ lindex $resIntP21 3 ]
+        set i         [ lindex $resIntP21 4 ]
+
+        set resIntP22 [ u_surf::intersectionSurface \
+            [ cubes_$widgets(work3D) GetOutput ]          \
+            [ list $xc $yc $zc ]                 \
+            [ list $xP2 $yP2 $zP2 ]              \
+            [ list $xO $yO $zO ]                 \
+            1                                    \
+            $bounds                              \
+            [ expr $largmax / 2 ]                \
+        ]
+        set trouveP22 [ lindex $resIntP22 0 ]
+        set xP22      [ lindex $resIntP22 1 ]
+        set yP22      [ lindex $resIntP22 2 ]
+        set zP22      [ lindex $resIntP22 3 ]
+        set i         [ lindex $resIntP22 4 ]
+
+        if { ( $trouveP21 == 1 ) && ( $trouveP22 == 1 ) } {
+            set largP2 [ DistPoints $xP21 $yP21 $zP21 $xP22 $yP22 $zP22 ]
+        } else { set largP2 10000 }
+
+        if { ( $largP1 == 10000 ) && ( $largP2 == 10000 ) } {
+        
+            set xP1 0; set yP1 0; set zP1 0
+            set xP2 0; set yP2 0; set zP2 0
+            set largdef 0
+
+        } elseif { ( $largP1 < $largP2 ) } {
+        
+            set xP1 $xP11; set yP1 $yP11; set zP1 $zP11
+            set xP2 $xP12; set yP2 $yP12; set zP2 $zP12
+            set largdef $largP1
+
+        } elseif { ( $largP2 < $largP1 ) } {
+
+            set xP1 $xP21; set yP1 $yP21; set zP1 $zP21
+            set xP2 $xP22; set yP2 $yP22; set zP2 $zP22
+            set largdef $largP2
+        } 
+        set largVaisseau2 $largdef
+
+        if { $largVaisseau2 > 0 } {
+        
+            set largVaisseau [ expr ( $largVaisseau1 + $largVaisseau2 ) / 2 ]
+            set vox_size [ GetActualVoxelSize_dll ]
+            set coordVoxelP1 [ VoxelCoord $xP1 $yP1 $zP1 $xO $yO $zO $vox_size $vox_size $vox_size ]
+            set xP1vol [ lindex $coordVoxelP1 0 ]; set yP1vol [ lindex $coordVoxelP1 1 ]; set zP1vol [ lindex $coordVoxelP1 2 ]
+
+            set coordVoxelP2 [VoxelCoord $xP2 $yP2 $zP2 $xO $yO $zO $vox_size $vox_size $vox_size ]
+            set xP2vol [ lindex $coordVoxelP2 0 ]; set yP2vol [ lindex $coordVoxelP2 1 ]; set zP2vol [ lindex $coordVoxelP2 2 ]
+            set distPointsVol2 [ DistPoints $xP1vol $yP1vol $zP1vol $xP2vol $yP2vol $zP2vol ]
+
+        } else {
+        
+            set largVaisseau 0
+            set distPointsVol2 0
+        }
+
+        if { $largVaisseau2 > 0 } {
+
+            renderer_$widgets(work3D) AddActor [ DrawSphere sphere_4_$widgets(work3D) 0.5 $xP1 $yP1 $zP1 0.0 1.0 0.0 ]
+            renderer_$widgets(work3D) AddActor [ DrawSphere sphere_5_$widgets(work3D) 0.5 $xP2 $yP2 $zP2 0.0 1.0 0.0 ]
+
+            vtkPoints points_2_$widgets(work3D)
+                points_2_$widgets(work3D) InsertPoint 0 $xP1 $yP1 $zP1
+                points_2_$widgets(work3D) InsertPoint 1 $xP2 $yP2 $zP2
+            vtkCellArray line_2_$widgets(work3D)
+                line_2_$widgets(work3D) InsertNextCell 2
+            for { set j 0 } { $j < 2 } { incr j } { line_2_$widgets(work3D) InsertCellPoint $j }
+
+            vtkPolyData poly_normal_2_$widgets(work3D)
+                poly_normal_2_$widgets(work3D) SetPoints points_2_$widgets(work3D)
+                poly_normal_2_$widgets(work3D) SetLines line_2_$widgets(work3D)
+
+            vtkTubeFilter tube_normal_2_$widgets(work3D)
+                tube_normal_2_$widgets(work3D) SetInput poly_normal_2_$widgets(work3D)
+                tube_normal_2_$widgets(work3D) SetRadius 0.25
+
+            vtkPolyDataMapper line_mapper_2_$widgets(work3D)
+                line_mapper_2_$widgets(work3D) SetInput [ tube_normal_2_$widgets(work3D) GetOutput ]
+                line_mapper_2_$widgets(work3D) ImmediateModeRenderingOn
+
+            vtkActor line_actor_2_$widgets(work3D)
+                line_actor_2_$widgets(work3D) SetMapper line_mapper_2_$widgets(work3D)
+                [ line_actor_2_$widgets(work3D) GetProperty ] SetColor 0.0 1.0 0.0
+                [ line_actor_2_$widgets(work3D) GetProperty ] BackfaceCullingOff
+
+            renderer_$widgets(work3D) AddActor line_actor_2_$widgets(work3D)
+
+        }
+
+        if { $distPointsVol2 > 0 } {
+            set distPointsVol [ expr ( $distPointsVol1 + $distPointsVol2 ) / 2 ]
+        } else { set distPointsVol $distPointsVol1 }
+        SetROIStep_dll $distPointsVol
+        array set arr [ params_dll ]
+        set act [ \
+            DrawSphere \
+                sphere_ROI_$widgets(work3D) \
+                [ expr $arr(e_roi_dimension) / 2.0 ] \
+                $xc $yc $zc \
+                1.0 0.0 0.0 \
+        ]
+        [ $act GetProperty ] SetOpacity 0.2
+        renderer_$widgets(work3D) AddActor $act
+
+    }
+
+    busy release .
+    update
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_surf::change_intensity { typ } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    if { $typ == 1 } {
+
+        set slc [ expr ( [ $widgets(sclIso) cget -to ] + ( [ $widgets(sclIso) cget -from ] * 3 ) ) / 4 ]
+        $widgets(sclIso) set $slc
+
+    } else { set slc [ $widgets(sclIso) get ] }
+
+    cubes_$widgets(work3D) SetValue 0 $slc
+    edgePoints_$widgets(work3D) SetValue $slc
+    [ $widgets(work3D) GetRenderWindow ] Render
+    
+
+}
+
+proc u_surf::change_opacity { typ } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    if { $typ == 1 } {
+
+        set slc [ expr ( [ $widgets(sclOpacity) cget -to ] + [ $widgets(sclOpacity) cget -from ] ) / 2 ]
+        $widgets(sclOpacity) set $slc
+    
+    } else { set slc [ $widgets(sclOpacity) get ] }
+
+    [ isoActor_$widgets(work3D) GetProperty ] SetOpacity $slc
+    [ edgeActor_$widgets(work3D) GetProperty ] SetOpacity $slc
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+}
+
+proc u_surf::show_axis { points } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    set resample [ GetVTKVolume_dll ]
+    set bounds   [ $resample GetBounds ]
+    set nP [ expr [ llength $points ] / 3 ]
+
+    if { $nP > 0 } {
+
+        # Poly-line actor construction...
+        catch { renderer_$widgets(work3D) RemoveActor axisActor_$widgets(work3D) }
+        catch { axisActor_$widgets(work3D)    Delete }
+        catch { axisMapper_$widgets(work3D)   Delete }
+        catch { axisGrid_$widgets(work3D)     Delete }
+        catch { axisPolyLine_$widgets(work3D) Delete }
+        catch { axisPoints_$widgets(work3D)   Delete }
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_6_$widgets(work3D) ] }
+        catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_7_$widgets(work3D) ] }
+        DeleteSphere sphere_6_$widgets(work3D)
+        DeleteSphere sphere_7_$widgets(work3D)
+
+        vtkPoints axisPoints_$widgets(work3D)
+        vtkPolyLine axisPolyLine_$widgets(work3D)
+        [ axisPolyLine_$widgets(work3D) GetPointIds ] SetNumberOfIds $nP
+        set vox_size [ GetActualVoxelSize_dll ]
+        for { set i 0 } { $i < $nP } { incr i } {
+
+            [ axisPolyLine_$widgets(work3D) GetPointIds ] SetId $i $i
+            set p [ \
+                PointCoord \
+                [ lindex $points [ expr $i * 3 + 0 ] ] \
+                [ lindex $points [ expr $i * 3 + 1 ] ] \
+                [ lindex $points [ expr $i * 3 + 2 ] ] \
+                [ lindex $bounds 0 ] \
+                [ lindex $bounds 2 ] \
+                [ lindex $bounds 4 ] \
+                $vox_size $vox_size $vox_size \
+            ]
+            axisPoints_$widgets(work3D) InsertNextPoint [ lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ]
+
+            #catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_cell_int_$widgets(work3D) ] }
+            #DeleteSphere sphere_cell_int_$widgets(work3D)
+            #set act [ \
+            #    DrawSphere \
+            #        sphere_cell_int_$widgets(work3D) \
+            #        [ expr [ getCellIntensitySize_dll ] / 2.0 ] \
+            #        [ lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ] \
+            #        1.0 0.0 0.0 \
+            #]
+            #[ $act GetProperty ] SetOpacity 0.2
+            #renderer_$widgets(work3D) AddActor $act
+            #[ $widgets(work3D) GetRenderWindow ] Render
+            #update
+
+        }
+
+        vtkUnstructuredGrid axisGrid_$widgets(work3D)
+            axisGrid_$widgets(work3D) Allocate 1 1
+            axisGrid_$widgets(work3D) InsertNextCell \
+                [ axisPolyLine_$widgets(work3D) GetCellType ] \
+                [ axisPolyLine_$widgets(work3D) GetPointIds ]
+            axisGrid_$widgets(work3D) SetPoints axisPoints_$widgets(work3D)
+
+        vtkDataSetMapper axisMapper_$widgets(work3D)
+            axisMapper_$widgets(work3D) SetInput axisGrid_$widgets(work3D)
+         axisMapper_$widgets(work3D) ImmediateModeRenderingOn
+
+        vtkActor axisActor_$widgets(work3D)
+            axisActor_$widgets(work3D) SetMapper axisMapper_$widgets(work3D)
+            [ axisActor_$widgets(work3D) GetProperty] BackfaceCullingOn
+            [ axisActor_$widgets(work3D) GetProperty] SetDiffuseColor 1 0 0
+#            [ axisActor_$widgets(work3D) GetProperty]  SetLineWidth 3
+                       
+        renderer_$widgets(work3D) AddActor axisActor_$widgets(work3D)
+
+        set p [ \
+            PointCoord \
+            [ lindex $points 0 ] \
+            [ lindex $points 1 ] \
+            [ lindex $points 2 ] \
+            [ lindex $bounds 0 ] \
+            [ lindex $bounds 2 ] \
+            [ lindex $bounds 4 ] \
+            $vox_size $vox_size $vox_size \
+        ]
+        renderer_$widgets(work3D) AddActor [ \
+            DrawSphere \
+                sphere_6_$widgets(work3D) \
+                1.0 \
+                [ lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ] \
+                0.0 0.0 1.0 \
+        ]
+
+        set i [ expr $nP - 1 ]
+        set p [ \
+            PointCoord \
+            [ lindex $points [ expr $i * 3 + 0 ] ] \
+            [ lindex $points [ expr $i * 3 + 1 ] ] \
+            [ lindex $points [ expr $i * 3 + 2 ] ] \
+            [ lindex $bounds 0 ] \
+            [ lindex $bounds 2 ] \
+            [ lindex $bounds 4 ] \
+            $vox_size $vox_size $vox_size \
+        ]
+        renderer_$widgets(work3D) AddActor [ \
+            DrawSphere \
+                sphere_7_$widgets(work3D) \
+                1.0 \
+                [ lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ] \
+                0.0 1.0 0.0 \
+        ]
+        [ $widgets(work3D) GetRenderWindow ] Render
+        u_3D::controls 2
+
+    }
+
+}
+
+proc u_surf::extract_axis { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::axis_index      axis_index
+
+    busy hold .
+    u_3D::controls
+    update
+
+    catch { set center [ sphere_3_$widgets(work3D) GetCenter ] } err
+    set err [ expr ( [ string compare [ lindex $err 0 ] invalid ] != 0 )? 0: 1 ]
+
+    catch { renderer_$widgets(work3D) RemoveActor axesActor_$widgets(work3D) }
+    catch { axesActor_$widgets(work3D) Delete }
+    catch { axesMapper_$widgets(work3D) Delete }
+
+    if { $err == 0 } {
+
+        set vox_size [ GetActualVoxelSize_dll ]
+        set coord [ \
+            VoxelCoord \
+                [ lindex $center 0 ] \
+                [ lindex $center 1 ] \
+                [ lindex $center 2 ] \
+                [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 0 ] . ] 0 ] \
+                [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 1 ] . ] 0 ] \
+                [ lindex [ split [ lindex [ [ struct_$widgets(work3D) GetOutput ] GetOrigin ] 2 ] . ] 0 ] \
+                $vox_size $vox_size $vox_size \
+        ]
+
+#        set resample [ GetVTKVolume_dll ]
+#        set bounds   [ $resample GetBounds ]
+
+        $widgets(edtChooseAxis) delete 0  end
+        $widgets(edtChooseAxis) insert end ""
+
+        SetStartPoint_dll [ lindex $coord 0 ] [ lindex $coord 1 ] [ lindex $coord 2 ]
+        ExtractAxes_dll
+
+        set axes [ GetAllAxes_dll ]
+
+        vtkPolyDataMapper axesMapper_$widgets(work3D)
+        axesMapper_$widgets(work3D) SetInput $axes
+
+        vtkActor axesActor_$widgets(work3D)
+        axesActor_$widgets(work3D) SetMapper axesMapper_$widgets(work3D)
+        [ axesActor_$widgets(work3D) GetProperty ] SetColor 1 0 0
+
+        renderer_$widgets(work3D) AddActor axesActor_$widgets(work3D)
+        [ $widgets(work3D) GetRenderWindow ] Render
+
+#        set points [ getAxis_dll ]
+#        u_surf::show_axis $points
+
+        busy release .
+        update
+        u_3D::controls 2
+
+    } else {
+
+        busy release .
+        update
+
+        tk_messageBox \
+            -icon error \
+            -message "$string_table::str_please_select_a_point" \
+            -title "ERROR"
+
+    }
+
+}
+
+proc u_surf::add_axis { } {
+
+    # For programming facilities
+    upvar u_surf::widgets    widgets
+    upvar u_surf::axis_index axis_index
+    upvar u_surf::indexes    indexes
+
+    
+    if { [ string compare [ $widgets(edtChooseAxis) get ] "" ] != 0 } {
+    
+        set name [ $widgets(edtChooseAxis) get ]
+        $widgets(edtChooseAxis) list insert end $name
+        set indexes($name) [ commitAxis_dll $name ]
+        u_3D::controls 2
+
+    } else {
+
+        set name [ dlg_name_axis::show $widgets(base) ]
+        if { [ string compare $name "" ] != 0 } {
+        
+            $widgets(edtChooseAxis) delete 0  end
+            $widgets(edtChooseAxis) insert end $name
+            u_surf::add_axis
+        
+        }
+
+    }
+
+}
+
+proc u_surf::select_axis_point { x y } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::axis_index axis_index
+
+    catch { tmp_world_picker_$widgets(work3D) Delete }
+    renderer_$widgets(work3D) IsInViewport 0 0
+
+    set y [ expr [ lindex [ $widgets(work3D) configure -height ] 4 ] - $y - 1 ]
+
+    set pickWPPos [ pick_point_local_actor $x $y renderer_$widgets(work3D) isoActor_$widgets(work3D) 0.001 ]
+    set xc [ lindex $pickWPPos 0 ]
+    set yc [ lindex $pickWPPos 1 ]
+    set zc [ lindex $pickWPPos 2 ]
+
+    #Chercher le point de l'axe le plus proche au point choisi sur la surface
+    set indP [ axisGrid_$widgets(work3D) FindPoint $xc $yc $zc ]
+    set coordsP [ axisGrid_$widgets(work3D) GetPoint $indP ]
+    set xc [ lindex $coordsP 0 ]
+    set yc [ lindex $coordsP 1 ]
+    set zc [ lindex $coordsP 2 ]
+
+    renderer_$widgets(work3D) AddActor [ DrawSphere sphere_tmp_$widgets(work3D) 1.0 $xc $yc $zc 1.0 0.0 0.0 ]
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+
+    set dir [ choose_direction::show $widgets(work3D) ]
+    if { $dir == -1 || $dir == 1 } {
+
+        cutAxis_dll $indP $dir
+        set points [ getAxis_dll ]
+        u_surf::show_axis $points
+        set ans [ \
+            tk_messageBox \
+                -icon question \
+                -message "$string_table::str_accept_changes" \
+                -type yesno \
+                -title "Question" \
+        ]
+        if { [ string compare $ans no ] == 0 } {
+        
+            undoAxis_dll
+            u_surf::show_axis [ getAxis_dll ]
+
+        } else {
+
+            $widgets(edtChooseAxis) delete 0  end
+            $widgets(edtChooseAxis) insert end ""
+
+        }
+
+    }
+    [ $widgets(work3D) GetRenderWindow ] Render
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_tmp_$widgets(work3D) ] }
+    DeleteSphere sphere_tmp_$widgets(work3D)
+
+}
+
+proc u_surf::remove_axis { } {
+
+    # For programming facilities
+    upvar u_surf::widgets    widgets
+    upvar u_surf::axis_index axis_index
+    upvar u_surf::indexes    indexes
+
+    #   Delete from data...
+    set name [ $widgets(edtChooseAxis) get ]
+    cleanAxis_dll
+    if { $name != "" } {
+
+        deleteAxis_dll $indexes($name)
+
+        #   Reorder combobox
+        $widgets(edtChooseAxis) delete 0  end
+        $widgets(edtChooseAxis) insert end ""
+        $widgets(edtChooseAxis) list delete $indexes($name) $indexes($name)
+
+        #   Reorder array
+        set l [ getAxisDescriptions_dll ]
+        array set indexes [ list [ lindex $l 0 ] 0 ]
+        for { set i 1 } { $i < [ llength $l ] } { incr i } {
+
+            set indexes([ lindex $l $i ]) $i
+
+        }
+
+    }
+
+    #   3D data reset
+    catch { renderer_$widgets(work3D) RemoveActor axisActor_$widgets(work3D) }
+    catch { axisActor_$widgets(work3D)    Delete }
+    catch { axisMapper_$widgets(work3D)   Delete }
+    catch { axisGrid_$widgets(work3D)     Delete }
+    catch { axisPolyLine_$widgets(work3D) Delete }
+    catch { axisPoints_$widgets(work3D)   Delete }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_6_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_7_$widgets(work3D) ] }
+    catch { renderer_$widgets(work3D) RemoveActor [ GetSphereActorName sphere_cell_int_$widgets(work3D) ] }
+    DeleteSphere sphere_6_$widgets(work3D)
+    DeleteSphere sphere_7_$widgets(work3D)
+    DeleteSphere sphere_cell_int_$widgets(work3D)
+
+    [ $widgets(work3D) GetRenderWindow ] Render
+    u_3D::controls 0
+
+}
+
+proc u_surf::continue_axis { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::axis_index axis_index
+
+    busy hold .
+    u_3D::controls
+    update
+
+    catch { set center [ sphere_3_$widgets(work3D) GetCenter ] } err
+    set err [ expr ( [ string compare [ lindex $err 0 ] invalid ] != 0 )? 0: 1 ]
+
+    if { $err == 0 } {
+
+        set resample [ GetVTKVolume_dll ]
+        set bounds   [ $resample GetBounds ]
+        set vox_size [ GetActualVoxelSize_dll ]
+        set coord [ \
+            VoxelCoord \
+                [ lindex $center 0 ] \
+                [ lindex $center 1 ] \
+                [ lindex $center 2 ] \
+                [ lindex $bounds 0 ] \
+                [ lindex $bounds 2 ] \
+                [ lindex $bounds 4 ] \
+                $vox_size $vox_size $vox_size \
+        ]
+
+        continueAxis_dll $coord
+        set points [ getAxis_dll ]
+        u_surf::show_axis $points
+        set ans [ \
+            tk_messageBox \
+                -icon question \
+                -message "$string_table::str_accept_changes" \
+                -type yesno \
+                -title "Question" \
+        ]
+        if { [ string compare $ans no ] == 0 } {
+        
+            undoAxis_dll
+            u_surf::show_axis [ getAxis_dll ]
+
+        } else {
+
+            $widgets(edtChooseAxis) delete 0  end
+            $widgets(edtChooseAxis) insert end ""
+
+        }
+
+
+        busy release .
+        update
+        u_3D::controls 0
+
+    } else {
+
+        busy release .
+        update
+        u_3D::controls 0
+
+        tk_messageBox \
+            -icon error \
+            -message "$string_table::str_please_select_a_point" \
+            -title "ERROR"
+
+    }
+}
+
+proc u_surf::set_mouse_left_events { mask } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    # TODO : change
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    if { [ expr $mask & 0x4 ] == 0x4 } { catch { bind $widgets(work3D) <B1-Motion> { evz_rotate %W %x %y } } }
+    if { [ expr $mask & 0x2 ] == 0x2 } { catch { bind $widgets(work3D) <B1-Motion> { evz_pan %W %x %y } } }
+
+}
+
+proc u_surf::set_mouse_right_events { mask } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    catch { bind $widgets(work3D) <Any-ButtonPress>   { ev_startMotion %W %x %y } }
+    catch { bind $widgets(work3D) <Any-ButtonRelease> { ev_endMotion %W %x %y } }
+
+    if { [ expr $mask & 0x4 ] == 0x4 } { catch { bind $widgets(work3D) <B3-Motion> { evz_zoom %W %x %y } } }
+
+}
+
+proc u_surf::select_axis { args } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::axis_index axis_index
+    upvar u_surf::indexes         indexes
+
+    if { [ array names indexes [ $widgets(edtChooseAxis) get ] ] != "" } {
+    
+        setAxis_dll $indexes([ $widgets(edtChooseAxis) get ])
+        u_surf::show_axis [ getAxis_dll ]
+
+    }
+
+}
+
+proc u_surf::get_isoval { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+    return [ $widgets(sclIso) get ]
+
+}
+
+proc u_surf::reload_axis { mask step } {
+
+    # For programming facilities
+    upvar u_surf::widgets    widgets
+    upvar u_surf::axis_index axis_index
+
+    if { $axis_index != -1 } {
+
+        if { $step == 1 } {
+
+            redoAxisSpline_dll
+
+        } elseif { $mask == 1 } { recalculeAxisSignal_dll }
+        set points [ getAxis_dll ]
+        u_surf::show_axis $points
+
+    }
+
+}
+
+proc u_surf::load_axes { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+    upvar u_surf::indexes indexes
+
+    u_surf::show_axis [ getAxis_dll ]
+
+    $widgets(edtChooseAxis) list delete 0 end
+    set names [ getAxisDescriptions_dll ]
+    set i 0
+    array set indexes [ list [ lindex $names 0 ] 0 ]
+    foreach name $names {
+
+        $widgets(edtChooseAxis) list insert end $name
+        set indexes($name) $i
+        incr i
+
+    }
+    
+    $widgets(edtChooseAxis) delete 0 end
+    $widgets(edtChooseAxis) insert end  [ getAxisDescription_dll ]
+    [ $widgets(work3D) GetRenderWindow ] Render
+    u_3D::controls 2
+
+}
+
+proc u_surf::saveasvtk { } {
+
+    # For programming facilities
+    upvar u_surf::widgets widgets
+
+#    catch { objexp Delete }
+#
+#    vtkOBJExporter objexp
+#    objexp SetInput [ $widgets(work3D) GetRenderWindow ]
+#    objexp SetFilePrefix "./maracas"
+#    objexp Write
+
+    set a [cubes_$widgets(work3D) GetOutput]
+    vtkPolyDataWriter b
+
+    set f [ tk_getSaveFile -defaultextension "vtk" \
+        -initialdir "." \
+                          -title "Save surface..." \
+                          -filetypes { { {vtk Files} {.vtk} } }
+    ]
+    if { [ string compare $f "" ] != 0 } {
+        b SetInput $a
+        b SetFileName $f
+        b SetFileTypeToASCII
+        b Write
+    }
+    b Delete
+}
+
+
+# EOF - u_surf.tcl
diff --git a/lib/maracasVisuLib/src/interface/tcl/wrap_maracas.i b/lib/maracasVisuLib/src/interface/tcl/wrap_maracas.i
new file mode 100644 (file)
index 0000000..47040bf
--- /dev/null
@@ -0,0 +1,216 @@
+%module maracas
+
+%{
+#include <wx/list.h>
+#include <wx/string.h>
+#include <vtkCellLocator.h>
+#include <vtkImageData.h>
+#include <vtkPolyData.h>
+#include <vtkTclUtil.h>
+#include "marTclInterface.h"
+%}
+
+%include typemaps.i
+
+%typemap(tcl8,in) std::string& {
+
+    int l;
+    $target = new std::string( Tcl_GetStringFromObj( $source, &l ) );
+
+}
+
+%typemap(tcl8,freearg) std::string& {
+
+    delete $source;
+
+}
+
+%typemap(tcl8,out) std::string {
+
+
+    Tcl_AppendElement( interp, $source->c_str( ) );
+
+}
+
+%typemap(tcl8,in) wxStringList& {
+
+    int l, i, s;
+    Tcl_Obj *tmp;
+
+    $target = new wxStringList;
+    Tcl_ListObjLength( interp, $source, &l );
+    for( i = 0; i < l; i++ ) {
+
+        Tcl_ListObjIndex( interp, $source, i, &tmp );
+        $target->Add( Tcl_GetStringFromObj( tmp, &s ) );
+
+    } // rof
+
+}
+
+%typemap(tcl8,freearg) wxStringList& {
+
+    delete $source;
+
+}
+
+%typemap(tcl8,out) wxStringList& {
+
+    unsigned int i = 0;
+
+    for( i = 0; i < $source->GetCount( ); i++ ) {
+
+        Tcl_AppendElement( interp, ( *$source )[ i ] );
+
+    } // rof
+
+}
+
+%typemap(tcl8,in) int * {
+
+    int* c = NULL;
+    int l, i;
+    Tcl_Obj *tmp;
+
+    Tcl_ListObjLength( interp, $source, &l );
+    c = new int [ l ];
+    for( i = 0; i < l; i++ ) {
+
+        Tcl_ListObjIndex( interp, $source, i, &tmp );
+        Tcl_GetIntFromObj( interp, tmp, &c[ i ] );
+
+    } // rof
+
+    $target = c;
+
+}
+
+%typemap(tcl8,out) ushort * {
+
+    int i;
+    int tam;
+    char cad[ 100 ];
+
+    if( $source != NULL ) {
+
+        tam = ( int )$source[ 0 ];
+        for( i = 1; i <= tam; i++ ) {
+
+            sprintf( cad, "%d", $source[ i ] );
+            Tcl_AppendElement( interp, cad );
+
+        } // rof
+
+    } // fi
+
+}
+
+%typemap(tcl8,out) double * {
+
+    int i;
+    int tam;
+    char cad[ 100 ];
+
+    if( $source != NULL ) {
+
+        tam = ( int )$source[ 0 ];
+        for( i = 1; i <= tam; i++ ) {
+
+            sprintf( cad, "%f", $source[ i ] );
+            Tcl_AppendElement( interp, cad );
+
+        } // rof
+
+    } // fi
+
+}
+
+%typemap(tcl8,in) vtkCellLocator * {
+
+    int err, s;
+    Tcl_Obj* tmp;
+
+    Tcl_ListObjIndex( interp, $source, 0, &tmp );
+    $target = ( vtkCellLocator* ) vtkTclGetPointerFromObject( Tcl_GetStringFromObj( tmp, &s ), "vtkCellLocator", interp, err );
+
+}
+
+%typemap(tcl8,out) vtkImageData * {
+
+    int ( *command )( ClientData, Tcl_Interp*, int, char* [] ) = NULL;
+
+    // this function already sets the return    
+    vtkTclGetObjectFromPointer( interp, $source, command );
+
+}
+
+%typemap(tcl8,out) vtkPolyData * {
+
+    int ( *command )( ClientData, Tcl_Interp*, int, char* [] ) = NULL;
+
+    // this function already sets the return    
+    vtkTclGetObjectFromPointer( interp, $source, command );
+
+}
+
+// INTERFACE
+
+void freeAllMaracasInterfaces_dll( );
+
+// Parameters functions
+wxStringList params_dll          ( );
+void         setParams_dll          ( wxStringList& raParams );
+bool         saveParams_dll         ( std::string& fName );
+bool         loadParams_dll         ( std::string& fName );
+void         SetROIStep_dll         ( double vWidth );
+double       GetActualVoxelSize_dll ( );
+
+// DB functions
+wxStringList studies_dll   ( );
+wxStringList studyData_dll ( std::string& study );
+wxStringList series_dll    ( std::string& study );
+wxStringList serieData_dll ( std::string& study, std::string& serie );
+void SubtractSeries_dll( std::string& sl, std::string& sr, std::string& ss, std::string& description );
+
+// Image functions
+bool         LoadImages_dll        ( );
+void         LoadTkImages_dll      ( wxStringList& tkNames, Tcl_Interp* interp );
+int          GetNumberOfImages_dll ( );
+wxStringList GetImagesNumbers_dll  ( );
+
+double GetImageIntensity_dll ( int x, int y, int z );
+
+ushort* GetProfilFromTotalVolume_dll( int xO, int yO, int zO, int xF, int yF, int zF );
+
+%apply int *OUTPUT { int* min, int* max, int* avg, int* sd, int* size };
+void GetAreaValuesFromTotalVolume_dll( int xO, int yO, int zO, int xF, int yF, int zF, int* min, int* max, int* avg, int* sd, int* size );
+
+// Experiment functions
+bool SaveExperiment_dll ( std::string& fName );
+bool LoadExperiment_dll ( std::string& fName );
+void InitExperiment_dll ( int* voi );
+void SetStartPoint_dll  ( int x, int y, int z );
+void ExtractAxes_dll    ( );
+
+int          GetNumberOfAxes_dll     ( );
+vtkPolyData* GetAllAxes_dll          ( );
+vtkPolyData* GetActualAxis_dll       ( );
+int GetActualAxisNumberOfPoints_dll  ( );
+double* GetActualAxisPoint_dll       ( int i );
+vtkImageData* GetActualAxisSlice_dll ( int i );
+
+void PrepareQuantification_dll( int i );
+double GetAxisLength_dll( );
+
+// VTK data retrieving functions
+%apply int *OUTPUT { int* min, int* max };
+void          GetImageRange_dll ( int* min, int* max );
+vtkImageData* GetVTKVolume_dll  ( );
+
+// Functions to replace
+%apply double *OUTPUT { double* xI, double* yI, double* zI };
+extern int IntersectWithLine_dll ( vtkCellLocator* iCellLocator, double x1, double y1, double z1, double x2, double y2, double z2, double tol, double *xI, double *yI, double *zI );
+%apply double *OUTPUT { double* xP1, double* yP1, double* zP1, double* xP2, double* yP2, double* zP2 };
+extern void TclPerpendiculars_dll( double xN, double yN, double zN, double angle, double *xP1, double *yP1, double *zP1, double *xP2, double *yP2, double *zP2 );
+
+// EOF - local_typemaps.i
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/CMakeLists.txt b/lib/maracasVisuLib/src/interface/wxWindows/CMakeLists.txt
new file mode 100644 (file)
index 0000000..75381cb
--- /dev/null
@@ -0,0 +1,631 @@
+# This directory should only be build if wxWindows and VTK can be found
+
+
+#-----------------------------------------------------------------------------
+# Headers Requeridas - Required Headers
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES(
+"C:/Creatis/MaracasTools/OSGi/src"
+"C:/Creatis/MaracasTools/Include"
+"/home/jpr/Creatis/Maracas/src/interface/wxWindows"
+)
+
+#-----------------------------------------------------------------------------
+# Lib directory
+#-----------------------------------------------------------------------------
+LINK_DIRECTORIES(
+"C:/Creatis/MaracasTools/OSGi/bin/Debug"
+)
+
+#-----------------------------------------------------------------------------
+# Source file list
+#-----------------------------------------------------------------------------
+SET(MARACAS_TOOLS_SOURCES
+    "tools/MaracasTools.h"
+    "tools/MaracasTools.cpp"
+)
+
+#-----------------------------------------------------------------------------
+# Project MaracasTools in workspace
+#-----------------------------------------------------------------------------
+##EED 6 aout 2007
+##ADD_LIBRARY(MaracasTools ${MARACAS_TOOLS_SOURCES})
+
+
+#-----------------------------------------------------------------------------
+# Required libraries (dll o so)
+#-----------------------------------------------------------------------------
+
+##EED 6 aout 2007
+##TARGET_LINK_LIBRARIES(MaracasTools OSGi ${maracas_WXWIDGETS_LIBRARIES} )
+
+
+
+#SUBDIRS(ILPD)
+
+
+#GSLobj need GSL
+#INCLUDE_DIRECTORIES(${GSL_INCLUDE_DIR})
+
+#kernel need gdcm
+#INCLUDE_DIRECTORIES(${GDCM_INCLUDE_DIR})
+
+
+#TODO for a nice VC++ we need to add header file...
+SET(MARACAS_LIB_SRCS
+  manualContour.cpp
+  manualContour.h
+  marDictionary.cxx
+  marDictionary.h
+  wxMaracas3DBrowser.cxx
+  wxMaracas3DBrowser.h
+#  wxMaracasDataBrowser.cxx
+#  wxMaracasDataBrowser.h
+  wxMaracasImageBrowser.cxx
+  wxMaracasImageBrowser.h
+  wxMaracasFrame.cxx
+  wxMaracasFrame.h
+  wxMaracasParametersDialog.cxx
+  wxMaracasParametersDialog.h
+  widgets/wxParametersDialog.cpp
+  widgets/wxParametersDialog.h
+  wxMaracasHelpDialog.cxx
+  wxMaracasHelpDialog.h
+  wxMaracasQuantification.cxx
+  wxMaracasQuantification.h
+  widgets/wxVTKRenderWindowInteractor.cxx
+  widgets/wxVTKRenderWindowInteractor.h
+  widgets/wxVTKRenderWindowInteractorEditContour.cxx
+  widgets/wxVTKRenderWindowInteractorEditContour.h
+  widgets/vtk3DSurfaceWidget.cxx
+  widgets/vtk3DSurfaceWidget.h
+  widgets/vtk3DQuantSurfaceWidget.cxx
+  widgets/vtk3DQuantSurfaceWidget.h
+  widgets/vtk2DQuantSliceWidget.cxx
+  widgets/vtk2DQuantSliceWidget.h
+  widgets/wxSurfaceWidget.cxx
+  widgets/wxSurfaceWidget.h
+  widgets/wxImageBrowserWdg.cxx
+  widgets/wxImageBrowserWdg.h
+  widgets/wxImageViewerWidget.cxx
+  widgets/wxImageViewerWidget.h
+  widgets/vtkClosePolyData.cxx
+  widgets/vtkClosePolyData.h
+#  widgets/vtkImagePolyDataSeedConnectivity.cxx
+#  widgets/vtkImagePolyDataSeedConnectivity.h
+#  widgets/vtkInteractorStyleCutter.cxx
+#  widgets/vtkInteractorStyleCutter.h
+#  widgets/wxChart.cxx
+#  widgets/wxChart.h
+  widgets/wxQuantificationWidget.cxx
+  widgets/wxQuantificationWidget.h
+  wxMaracas_ManualTree_MPRDlg.cxx
+  wxMaracas_ManualTree_MPRDlg.h
+  wxMaracas_ManualTree_MPR.cxx
+  wxMaracas_ManualTree_MPR.h
+  widgets/wxManualTree_MPRWidget.cxx
+  widgets/wxManualTree_MPRWidget.h
+  widgets/wxManualRegistration3D.cxx
+  widgets/wxManualRegistration3D.h
+  wxMaracasMPR.cxx
+  wxMaracasMPR.h
+  widgets/wxMPRWidget.cxx
+  widgets/wxMPRWidget.h
+  widgets/wxMPRBaseData.cxx
+  widgets/wxMPRBaseData.h
+  widgets/wxVtkBaseView.cxx
+  widgets/wxVtkBaseView.h
+  widgets/wxQuantificationWidget_base.cxx
+  widgets/wxQuantificationWidget_base.h
+  widgets/UtilVtk3DGeometriSelection.cxx
+  widgets/UtilVtk3DGeometriSelection.h
+  res/wxInterface.rc
+)
+
+
+ADD_LIBRARY(MaracasInterfaceWX ${MARACAS_LIB_SRCS} )
+TARGET_LINK_LIBRARIES(MaracasInterfaceWX
+  ${maracas_WXWIDGETS_LIBRARIES}
+  MaracasAlgorithm
+  MaracasKernel
+  MaracasSnakeContour
+  #${LIBIDO_LIBRARIES}
+  #${GLIB_LIBRARIES}
+  vtkCommon  vtkFiltering  vtkGraphics  vtkIO  vtkImaging  vtkRendering  vtkHybrid
+)
+
+
+
+
+#TODO for a nice VC++ we need to add header file...
+SET(MARACAS_LIB_SRCS_02
+  manualContour.cpp
+  manualContour.h
+  marDictionary.cxx
+  marDictionary.h
+  wxMaracas3DBrowser.cxx
+  wxMaracas3DBrowser.h
+  wxMaracasDataBrowser.cxx
+  wxMaracasDataBrowser.h
+  wxMaracasImageBrowser.cxx
+  wxMaracasImageBrowser.h
+  wxMaracasImageBrowser02.cxx
+  wxMaracasImageBrowser02.h
+  widgets/wxReadingPriorityPanel.cpp
+  widgets/wxReadingPriorityPanel.h
+  wxMaracasFrame02.cxx
+  wxMaracasFrame02.h
+  wxILPDwithImage.cxx
+  wxILPDwithImage.h
+  wxMaracasParametersDialog.cxx
+  wxMaracasParametersDialog.h
+  widgets/wxParametersDialog.cpp
+  widgets/wxParametersDialog.h
+  wxMaracasHelpDialog.cxx
+  wxMaracasHelpDialog.h
+  wxMaracasQuantification.cxx
+  wxMaracasQuantification.h
+  widgets/wxVTKRenderWindowInteractor.cxx
+  widgets/wxVTKRenderWindowInteractor.h
+  widgets/wxVTKRenderWindowInteractorEditContour.cxx
+  widgets/wxVTKRenderWindowInteractorEditContour.h
+  widgets/vtk3DSurfaceWidget.cxx
+  widgets/vtk3DSurfaceWidget.h
+  widgets/vtk3DQuantSurfaceWidget.cxx
+  widgets/vtk3DQuantSurfaceWidget.h
+  widgets/vtk2DQuantSliceWidget.cxx
+  widgets/vtk2DQuantSliceWidget.h
+  widgets/vtk3DSurfaceSTLWidget.cxx
+  widgets/vtk3DSurfaceSTLWidget.h
+  widgets/wxSurfaceSTLWidget.cxx
+  widgets/wxSurfaceSTLWidget.h
+  widgets/InterfaceVtkPanelWidgets.cxx
+  widgets/InterfaceVtkPanelWidgets.h
+  widgets/wxSurfaceWidget.cxx
+  widgets/wxSurfaceWidget.h
+  widgets/wxImageBrowserWdg.cxx
+  widgets/wxImageBrowserWdg.h
+  widgets/wxImageViewerWidget.cxx
+  widgets/wxImageViewerWidget.h
+  widgets/vtkClosePolyData.cxx
+  widgets/vtkClosePolyData.h
+  widgets/vtkImagePolyDataSeedConnectivity.cxx
+  widgets/vtkImagePolyDataSeedConnectivity.h
+  widgets/vtkInteractorStyleCutter.cxx
+  widgets/vtkInteractorStyleCutter.h
+#  widgets/wxChart.cxx
+#  widgets/wxChart.h
+  widgets/wxQuantificationWidget.cxx
+  widgets/wxQuantificationWidget.h
+  wxMaracasMPR.cxx
+  wxMaracasMPR.h
+  wxMaracasEmptyPanel.cxx
+  wxMaracasEmptyPanel.h
+  widgets/wxEmptyPanelWidget.cxx
+  widgets/wxEmptyPanelWidget.h
+  wxMaracasEmptyPanel_2.cxx
+  wxMaracasEmptyPanel_2.h
+  widgets/wxEmptyPanelWidget_2.cxx
+  widgets/wxEmptyPanelWidget_2.h
+  widgets/wxMPRWidget.cxx
+  widgets/wxMPRWidget.h
+  widgets/wxMPRBaseData.cxx
+  widgets/wxMPRBaseData.h
+  widgets/wxVtkBaseView.cxx
+  widgets/wxVtkBaseView.h
+  widgets/wxMaracas_ViewerWidget.cxx
+  widgets/wxMaracas_ViewerWidget.h
+  widgets/wxMaracas_N_ViewersWidget.cxx
+  widgets/wxMaracas_N_ViewersWidget.h
+  wxMaracasProcessingCT.cxx
+  wxMaracasProcessingCT.h
+  widgets/wxProcessingCTWidget.cxx
+  widgets/wxProcessingCTWidget.h
+  wxMaracasQuantificationCT.cxx
+  wxMaracasQuantificationCT.h
+  widgets/wxQuantificationWidgetCT.cxx
+  widgets/wxQuantificationWidgetCT.h
+  widgets/wxQuantificationWidget_base.cxx
+  widgets/wxQuantificationWidget_base.h
+  wxMaracasEmptyPanel_3.cxx
+  wxMaracasEmptyPanel_3.h
+  widgets/wxEmptyPanel_3_Widget.cxx
+  widgets/wxEmptyPanel_3_Widget.h
+  wxMaracas_ManualTree_MPRDlg.cxx
+  wxMaracas_ManualTree_MPRDlg.h
+  wxMaracas_ManualTree_MPR.cxx
+  wxMaracas_ManualTree_MPR.h
+  widgets/wxManualTree_MPRWidget.cxx
+  widgets/wxManualTree_MPRWidget.h
+  widgets/wxManualRegistration3D.cxx
+  widgets/wxManualRegistration3D.h
+  res/wxInterface.rc
+  widgets/ContourView.h
+  widgets/ContourView.cxx
+  widgets/PointView.h
+  widgets/PointView.cxx
+  widgets/LineView.h
+  widgets/LineView.cxx
+  wxMaracasPathology_01.cxx
+  wxMaracasPathology_01.h
+  widgets/wxPathologyWidget_01.cxx
+  widgets/wxPathologyWidget_01.h
+  widgets/wxSTLWidget_02.cxx
+  widgets/wxSTLWidget_02.h
+  widgets/wxSTLWidget_03.cxx
+  widgets/wxSTLWidget_03.h
+  widgets/UtilVtk3DGeometriSelection.cxx
+  widgets/UtilVtk3DGeometriSelection.h
+  manualContourContainer.cxx
+  manualContourContainer.h
+  wxMaracas_ManualSegmentation_MPR.cxx
+  wxMaracas_ManualSegmentation_MPR.h
+  widgets/wxManualSegmentation_MPRWidget.cxx
+  widgets/wxManualSegmentation_MPRWidget.h
+  wxMaracas_SegmentationFM3D.cxx
+  wxMaracas_SegmentationFM3D.h
+  widgets/wxSegmentationFM3DWidget.cxx
+  widgets/wxSegmentationFM3DWidget.h
+  wxMaracas_ManualContour_Panel.cxx
+  wxMaracas_ManualContour_Panel.h
+
+##### Contour Edition - JS - Juan Sebastian 
+  #Contour/ContourPropagation.cxx
+  #Contour/ContourPropagation.h
+  #Contour/ExtractControlPoints2D.cxx
+  #Contour/ExtractControlPoints2D.h
+  #Contour/ContoursIntersection.cxx
+  #Contour/ContoursIntersection.h
+  #Contour/vectorFunctions.cxx
+  #Contour/vectorFunctions.h
+  #Contour/Propagation.cxx
+  #Contour/Propagation.h
+
+#####pPlotter classes - Monica/Silvia
+  #1widgets/pPlotter/HistogramDialog.cxx
+  #1widgets/pPlotter/HistogramDialog.h
+  #1widgets/pPlotter/HistogramWidget.cxx
+  #1widgets/pPlotter/HistogramWidget.h
+  #1widgets/pPlotter/pHistogram.cxx
+  #1widgets/pPlotter/pHistogram.h
+  #1widgets/pPlotter/mBarRange.cxx
+  #1widgets/pPlotter/mBarRange.h
+  #1widgets/pPlotter/pLogicalFunction.cxx
+  #1widgets/pPlotter/pLogicalFunction.h
+  #1widgets/pPlotter/pGraphicalFunction.h
+  #1widgets/pPlotter/pGraphicalFunction.cxx
+  #1widgets/pPlotter/pFunctionPoint.cxx
+  #1widgets/pPlotter/pFunctionPoint.h
+  #1widgets/pPlotter/pPlotterWindow.cxx
+  #1widgets/pPlotter/pPlotterWindow.h
+  #1widgets/pPlotter/pPlotterLayer.cxx
+  #1widgets/pPlotter/pPlotterLayer.h
+  #1widgets/pPlotter/pPlotterScaleX.h
+  #1widgets/pPlotter/pPlotterScaleX.cxx
+  #1widgets/pPlotter/pPlotterScaleY.h
+  #1widgets/pPlotter/pPlotterScaleY.cxx
+  #1widgets/pPlotter/pColorBar.h
+  #1widgets/pPlotter/pColorBar.cxx
+  #1widgets/pPlotter/pFigure.h
+  #1widgets/pPlotter/pFigure.cxx
+  #1widgets/pPlotter/pColorPoint.h
+  #1widgets/pPlotter/pColorPoint.cxx
+  #1widgets/pPlotter/pPlotter.h
+  #1widgets/pPlotter/pPlotter.cxx
+  #1widgets/pPlotter/mathplot.cxx
+  #1widgets/pPlotter/mathplot.h
+  #1widgets/pPlotter/MaximumsDialog.cxx
+  #1widgets/pPlotter/MaximumsDialog.h
+# widgets/pPlotter/DegradeRectangle.cxx
+# widgets/pPlotter/DegradeRectangle.h
+  #1widgets/pPlotter/LogicalColorBar.cxx
+  #1widgets/pPlotter/LogicalColorBar.h
+  #1widgets/pPlotter/Histogram.cxx
+  #1widgets/pPlotter/Histogram.h
+
+)
+
+
+
+ADD_LIBRARY(MaracasInterface02WX ${MARACAS_LIB_SRCS_02} )
+TARGET_LINK_LIBRARIES(MaracasInterface02WX
+  ${maracas_WXWIDGETS_LIBRARIES}
+  MaracasAlgorithm
+  MaracasKernel
+  MaracasSnakeContour
+##EED 6 aout 2007
+##  MaracasTools
+  #${LIBIDO_LIBRARIES}
+  ${GLIB_LIBRARIES}
+  ${GDCM_LIBRARIES}
+  vtkCommon  vtkFiltering  vtkGraphics  vtkIO  vtkImaging  vtkRendering vtkHybrid
+)
+
+SET(MARACAS_WIN32LIB_SRCS
+    MaracasDll.h
+    MaracasDll.cpp
+    StdAfx.h
+    StdAfx.cpp
+    wxMaracasApp.cxx
+    wxMaracasApp.h
+    ../../kernel/marSimpleDicom.cpp
+    ../../kernel/marSimpleDicom.h
+    res/wxInterface.rc
+  )
+
+
+#ADD_LIBRARY(MaracasWin32Lib SHARED ${MARACAS_WIN32LIB_SRCS} )
+#TARGET_LINK_LIBRARIES(MaracasWin32Lib
+#      MaracasAlgorithm    
+#      MaracasKernel    
+#      MaracasSnakeContour    
+#      MaracasInterfaceWX 
+#      ${WXWIDGETS_LIBRARIES}
+#      vtkCommon  vtkFiltering  vtkGraphics  vtkIO  vtkImaging  vtkRendering vtkHybrid vtkPatented
+#)
+
+
+
+IF(WIN32)
+  SET(MARACAS_WIN32APP_SRCS
+    wxMaracasApp02.cxx
+    wxMaracasApp02.h
+    ../../kernel/marGdcmDicom.cpp
+    ../../kernel/marGdcmDicom.h
+    res/wxInterface.rc
+  )
+  set(CMAKE_MFC_FLAG 2)
+  ADD_EXECUTABLE(maracas WIN32 ${MARACAS_WIN32APP_SRCS} )
+
+  TARGET_LINK_LIBRARIES(maracas
+#      debug msvcrtd
+#      debug msvcprtd
+#      optimized msvcrt
+#      optimized msvcprt
+       MaracasAlgorithm    MaracasKernel    MaracasSnakeContour    MaracasInterface02WX
+       vtkCommon  vtkFiltering  vtkGraphics  vtkIO  vtkImaging  vtkRendering vtkHybrid 
+#vtkPatented
+       vtkWidgets vtkVolumeRendering
+
+       ILPDInterface ILPDModel ILPDcontrolerInterface 
+       ${MYSQL_LIBRARIES} 
+       ${maracas_WXWIDGETS_LIBRARIES}
+       ${GDCM_LIBRARIES} 
+ )
+
+
+###
+#  SET(WIDO_WIN32APP_SRCS
+#    wxWidoApp.cxx
+#    wxWidoApp.h
+#  )
+#  ADD_EXECUTABLE(wido_wx_test WIN32 ${WIDO_WIN32APP_SRCS} )
+#  TARGET_LINK_LIBRARIES(wido_wx_test
+#      MaracasInterface02WX
+#      vtkCommon  vtkFiltering  vtkGraphics  vtkIO  vtkImaging  vtkRendering vtkHybrid vtkPatented
+#      ${WXWIDGETS_LIBRARIES}
+#      debug msvcrtd
+#      debug msvcprtd
+#      optimized msvcrt
+#      optimized msvcprt
+#  )
+#
+##
+
+
+  IF(MYSQL_PATH)
+
+##----Copy Debug cofiguration and DLLs---
+
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Debug )
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Debug/MySql/data )
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Debug/MySql/share )
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Debug/MySql/share/english )
+    CONFIGURE_FILE( ${MARACAS_SOURCE_DIR}/configuration/my.ini        ${LIBRARY_OUTPUT_PATH}/debug/my.ini                           COPYONLY        )
+    CONFIGURE_FILE( ${MARACAS_SOURCE_DIR}/configuration/errmsg.txt    ${LIBRARY_OUTPUT_PATH}/debug/MySql/share/english/errmsg.txt   COPYONLY        )
+    CONFIGURE_FILE( ${MARACAS_SOURCE_DIR}/configuration/errmsg.sys    ${LIBRARY_OUTPUT_PATH}/debug/MySql/share/english/errmsg.sys   COPYONLY        )
+
+    CONFIGURE_FILE( ${LIBIDO_BINARY_DIR}/lib/debug/libIdo.dll  ${LIBRARY_OUTPUT_PATH}/debug/libIdo.dll COPYONLY        )
+    CONFIGURE_FILE( C:/Creatis/glib-1.3/src/glib/glib-1.3.dll  ${LIBRARY_OUTPUT_PATH}/debug/glib-1.3.dll       COPYONLY        )
+
+    IF ( EXISTS ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_net_vc_custom.dll )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_net_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/debug/wxbase28d_net_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_odbc_vc_custom.dll    ${LIBRARY_OUTPUT_PATH}/debug/wxbase28d_odbc_vc_custom.dll       COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_vc_custom.dll         ${LIBRARY_OUTPUT_PATH}/debug/wxbase28d_vc_custom.dll            COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_xml_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/debug/wxbase28d_xml_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_adv_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_adv_vc_custom.dll         COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_aui_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_aui_vc_custom.dll         COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_core_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_core_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_gl_vc_custom.dll       ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_gl_vc_custom.dll          COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_html_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_html_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_media_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_media_vc_custom.dll      COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_qa_vc_custom.dll       ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_qa_vc_custom.dll          COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_richtext_vc_custom.dll  ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_richtext_vc_custom.dll   COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28d_xrc_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28d_xrc_vc_custom.dll         COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_aui_vc_custom.dll                 ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28_aui_vc_custom.dll                        COPYONLY        ) 
+    ELSE ( EXISTS ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_net_vc_custom.dll )
+       MESSAGE (FATAL_ERROR, " wxWidgets dlls not found (Debug copy dlls)")
+    ENDIF( EXISTS ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28d_net_vc_custom.dll )
+
+    IF ( EXISTS ${MYSQL_PATH}/Embedded/DLL/debug/libmysqld.dll )
+      CONFIGURE_FILE( ${MYSQL_PATH}/Embedded/DLL/debug/libmysqld.dll    ${LIBRARY_OUTPUT_PATH}/debug/libmysqld.dll                    COPYONLY        )
+    ELSE ( EXISTS ${MYSQL_PATH}/Embedded/DLL/debug/libmysqld.dll )
+         MESSAGE (FATAL_ERROR, " libmysqld.dll not found (Debug copy dlls)")
+    ENDIF( EXISTS ${MYSQL_PATH}/Embedded/DLL/debug/libmysqld.dll )
+
+       
+    IF ( EXISTS ${GDCM_DIR}/../../bin/vtkgdcm.dll )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmopenjpeg.dll        ${LIBRARY_OUTPUT_PATH}/debug/gdcmopenjpeg.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/vtkgdcm.dll             ${LIBRARY_OUTPUT_PATH}/debug/vtkgdcm.dll                      COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmjpeg16.dll          ${LIBRARY_OUTPUT_PATH}/debug/gdcmjpeg16.dll                   COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmjpeg12.dll          ${LIBRARY_OUTPUT_PATH}/debug/gdcmjpeg12.dll                   COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmjpeg8.dll           ${LIBRARY_OUTPUT_PATH}/debug/gdcmjpeg8.dll                    COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcm.dll                ${LIBRARY_OUTPUT_PATH}/debug/gdcm.dll                         COPYONLY        )
+    ELSE ( EXISTS ${GDCM_DIR}/../../bin/vtkgdcm.dll )
+         MESSAGE (FATAL_ERROR, " gdcm dlls not found (Debug copy dlls)    )")
+    ENDIF( EXISTS ${GDCM_DIR}/../../bin/vtkgdcm.dll )
+
+    IF ( EXISTS ${VTK_DIR}/../../bin/vtkCommon.dll )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkCommon.dll            ${LIBRARY_OUTPUT_PATH}/debug/vtkCommon.dll                    COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkDICOMParser.dll       ${LIBRARY_OUTPUT_PATH}/debug/vtkDICOMParser.dll               COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkexpat.dll             ${LIBRARY_OUTPUT_PATH}/debug/vtkexpat.dll                     COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkFiltering.dll         ${LIBRARY_OUTPUT_PATH}/debug/vtkFiltering.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkfreetype.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkfreetype.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkftgl.dll              ${LIBRARY_OUTPUT_PATH}/debug/vtkftgl.dll                      COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkGraphics.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkGraphics.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkHybrid.dll            ${LIBRARY_OUTPUT_PATH}/debug/vtkHybrid.dll                    COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkImaging.dll           ${LIBRARY_OUTPUT_PATH}/debug/vtkImaging.dll                   COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkIO.dll                ${LIBRARY_OUTPUT_PATH}/debug/vtkIO.dll                        COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkjpeg.dll              ${LIBRARY_OUTPUT_PATH}/debug/vtkjpeg.dll                      COPYONLY        )
+#      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkPatented.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkPatented.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkWidgets.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkWidgets.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkVolumeRendering.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkVolumeRendering.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkexoIIc.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkexoIIc.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkNetCDF.dll          ${LIBRARY_OUTPUT_PATH}/debug/vtkNetCDF.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkpng.dll               ${LIBRARY_OUTPUT_PATH}/debug/vtkpng.dll                       COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkRendering.dll         ${LIBRARY_OUTPUT_PATH}/debug/vtkRendering.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtktiff.dll              ${LIBRARY_OUTPUT_PATH}/debug/vtktiff.dll                      COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkzlib.dll              ${LIBRARY_OUTPUT_PATH}/debug/vtkzlib.dll                      COPYONLY        )
+    ELSE ( EXISTS ${VTK_DIR}/../../bin/vtkCommon.dll )
+          MESSAGE (FATAL_ERROR, " VTK dlls not found (Debug copy dlls)")
+    ENDIF( EXISTS ${VTK_DIR}/../../bin/vtkCommon.dll )
+
+    IF ( EXISTS ${ITK_DIR}/../../bin/ITKCommon.dll )
+      CONFIGURE_FILE( ${ITK_DIR}/../../bin/ITKCommon.dll            ${LIBRARY_OUTPUT_PATH}/debug/ITKCommon.dll                    COPYONLY        )
+    ELSE ( EXISTS ${ITK_DIR}/../../bin/ITKCommon.dll )
+         MESSAGE (FATAL_ERROR, " ITK dlls not found (Debug copy dlls)")
+    ENDIF( EXISTS ${ITK_DIR}/../../bin/ITKCommon.dll )
+
+
+
+##----Copy Release cofiguration and DLLs---
+
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Release )
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Release/MySql/data )
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Release/MySql/share )
+    FILE(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}/Release/MySql/share/english )
+    CONFIGURE_FILE( ${MARACAS_SOURCE_DIR}/configuration/my.ini        ${LIBRARY_OUTPUT_PATH}/release/my.ini                         COPYONLY        )
+    CONFIGURE_FILE( ${MARACAS_SOURCE_DIR}/configuration/errmsg.txt    ${LIBRARY_OUTPUT_PATH}/release/MySql/share/english/errmsg.txt COPYONLY        )
+    CONFIGURE_FILE( ${MARACAS_SOURCE_DIR}/configuration/errmsg.sys    ${LIBRARY_OUTPUT_PATH}/release/MySql/share/english/errmsg.sys COPYONLY        )
+
+    CONFIGURE_FILE( ${LIBIDO_BINARY_DIR}/lib/release/libIdo.dll        ${LIBRARY_OUTPUT_PATH}/release/libIdo.dll       COPYONLY        )
+    CONFIGURE_FILE( C:/Creatis/glib-1.3/src/glib/glib-1.3.dll  ${LIBRARY_OUTPUT_PATH}/release/glib-1.3.dll     COPYONLY        )
+
+    IF ( EXISTS ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_net_vc_custom.dll )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_net_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/release/wxbase28_net_vc_custom.dll       COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_odbc_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/release/wxbase28_odbc_vc_custom.dll      COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_vc_custom.dll          ${LIBRARY_OUTPUT_PATH}/release/wxbase28_vc_custom.dll           COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_xml_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/release/wxbase28_xml_vc_custom.dll       COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_adv_vc_custom.dll       ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_adv_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_aui_vc_custom.dll       ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_aui_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_core_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_core_vc_custom.dll       COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_gl_vc_custom.dll        ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_gl_vc_custom.dll         COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_html_vc_custom.dll      ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_html_vc_custom.dll       COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_media_vc_custom.dll     ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_media_vc_custom.dll      COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_richtext_vc_custom.dll   ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_richtext_vc_custom.dll  COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_qa_vc_custom.dll        ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_qa_vc_custom.dll         COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_xrc_vc_custom.dll       ${LIBRARY_OUTPUT_PATH}/release/wxmsw28_xrc_vc_custom.dll        COPYONLY        )
+      CONFIGURE_FILE( ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxmsw28_aui_vc_custom.dll                ${LIBRARY_OUTPUT_PATH}/debug/wxmsw28_aui_vc_custom.dll                 COPYONLY        ) 
+    ELSE ( EXISTS ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_net_vc_custom.dll )
+       MESSAGE (FATAL_ERROR, " wxWidgets dlls not found (Release copy dlls)")
+    ENDIF( EXISTS ${WXWIDGETS_ROOT_DIR}/lib/vc_dll/wxbase28_net_vc_custom.dll )
+
+
+    IF ( EXISTS ${MYSQL_PATH}/Embedded/DLL/release/libmysqld.dll )
+      CONFIGURE_FILE( ${MYSQL_PATH}/Embedded/DLL/release/libmysqld.dll  ${LIBRARY_OUTPUT_PATH}/release/libmysqld.dll                  COPYONLY        )
+    ELSE ( EXISTS ${MYSQL_PATH}/Embedded/DLL/release/libmysqld.dll )
+       MESSAGE (FATAL_ERROR, " libmysqld.dll not found (Release copy dlls)")
+    ENDIF( EXISTS ${MYSQL_PATH}/Embedded/DLL/release/libmysqld.dll )
+
+    IF ( EXISTS ${GDCM_DIR}/../../bin/vtkgdcm.dll )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmopenjpeg.dll      ${LIBRARY_OUTPUT_PATH}/release/gdcmopenjpeg.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/vtkgdcm.dll           ${LIBRARY_OUTPUT_PATH}/release/vtkgdcm.dll                    COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmjpeg16.dll        ${LIBRARY_OUTPUT_PATH}/release/gdcmjpeg16.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmjpeg12.dll        ${LIBRARY_OUTPUT_PATH}/release/gdcmjpeg12.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcmjpeg8.dll         ${LIBRARY_OUTPUT_PATH}/release/gdcmjpeg8.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${GDCM_DIR}/../../bin/gdcm.dll              ${LIBRARY_OUTPUT_PATH}/release/gdcm.dll                       COPYONLY        )
+    ELSE ( EXISTS ${GDCM_DIR}/../../bin/vtkgdcm.dll )
+         MESSAGE (FATAL_ERROR, " gdcm dlls not found (Release copy dlls)")
+    ENDIF( EXISTS ${GDCM_DIR}/../../bin/vtkgdcm.dll )
+
+    IF ( EXISTS ${VTK_DIR}/../../bin/vtkCommon.dll )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkCommon.dll            ${LIBRARY_OUTPUT_PATH}/release/vtkCommon.dll                    COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkDICOMParser.dll       ${LIBRARY_OUTPUT_PATH}/release/vtkDICOMParser.dll               COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkexpat.dll             ${LIBRARY_OUTPUT_PATH}/release/vtkexpat.dll                     COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkFiltering.dll         ${LIBRARY_OUTPUT_PATH}/release/vtkFiltering.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkfreetype.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkfreetype.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkftgl.dll              ${LIBRARY_OUTPUT_PATH}/release/vtkftgl.dll                      COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkGraphics.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkGraphics.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkHybrid.dll            ${LIBRARY_OUTPUT_PATH}/release/vtkHybrid.dll                    COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkImaging.dll           ${LIBRARY_OUTPUT_PATH}/release/vtkImaging.dll                   COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkIO.dll                ${LIBRARY_OUTPUT_PATH}/release/vtkIO.dll                        COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkjpeg.dll              ${LIBRARY_OUTPUT_PATH}/release/vtkjpeg.dll                      COPYONLY        )
+#      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkPatented.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkPatented.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkWidgets.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkWidgets.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkVolumeRendering.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkVolumeRendering.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkexoIIc.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkexoIIc.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkNetCDF.dll          ${LIBRARY_OUTPUT_PATH}/release/vtkNetCDF.dll                  COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkpng.dll               ${LIBRARY_OUTPUT_PATH}/release/vtkpng.dll                       COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkRendering.dll         ${LIBRARY_OUTPUT_PATH}/release/vtkRendering.dll                 COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtktiff.dll              ${LIBRARY_OUTPUT_PATH}/release/vtktiff.dll                      COPYONLY        )
+      CONFIGURE_FILE( ${VTK_DIR}/../../bin/vtkzlib.dll              ${LIBRARY_OUTPUT_PATH}/release/vtkzlib.dll                      COPYONLY        )
+    ELSE ( EXISTS ${VTK_DIR}/../../bin/vtkCommon.dll )
+         MESSAGE (FATAL_ERROR, " VTK dlls not found (Release copy dlls)")
+    ENDIF( EXISTS ${VTK_DIR}/../../bin/vtkCommon.dll )
+
+
+    IF ( EXISTS ${ITK_DIR}/../../bin/ITKCommon.dll )
+      CONFIGURE_FILE( ${ITK_DIR}/../../bin/ITKCommon.dll            ${LIBRARY_OUTPUT_PATH}/release/ITKCommon.dll                    COPYONLY        )
+    ELSE ( EXISTS ${ITK_DIR}/../../bin/ITKCommon.dll )
+         MESSAGE (FATAL_ERROR, " ITK dlls not found (Release copy dlls)")
+    ENDIF( EXISTS ${ITK_DIR}/../../bin/ITKCommon.dll )
+
+ENDIF(MYSQL_PATH)
+
+ELSE(WIN32)
+
+
+
+#  ADD_EXECUTABLE(maracas wxMaracasApp.cxx )
+# TARGET_LINK_LIBRARIES(maracas
+#    ${WXWIDGETS_LIBRARIES}
+#    MaracasInterfaceWX
+#    #${GDCM_LIBRARIES}
+#  )
+
+
+
+  SET(MARACAS_LINUXAPP_SRCS
+    wxMaracasApp02.cxx
+    wxMaracasApp02.h
+    ../../kernel/marGdcmDicom.cpp
+    ../../kernel/marGdcmDicom.h
+#    res/wxInterface.rc
+  )
+#  set(CMAKE_MFC_FLAG 2)
+  ADD_EXECUTABLE(maracas ${MARACAS_LINUXAPP_SRCS} )
+
+
+  TARGET_LINK_LIBRARIES(maracas
+#      debug msvcrtd
+#      debug msvcprtd
+#      optimized msvcrt
+#      optimized msvcprt
+       MaracasAlgorithm    MaracasKernel    MaracasSnakeContour    MaracasInterface02WX
+       vtkCommon  vtkFiltering  vtkGraphics  vtkIO  vtkImaging  vtkRendering vtkHybrid 
+#vtkPatented
+       vtkWidgets vtkVolumeRendering
+
+       ILPDcontrolerInterface
+       ILPDInterface 
+       ILPDModel 
+       ${MYSQL_LIBRARIES}
+       ${maracas_WXWIDGETS_LIBRARIES}
+       ${GDCM_LIBRARIES}
+ )
+
+
+ENDIF(WIN32)
+SUBDIRS(widgets)
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/AutoControlPoints.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/AutoControlPoints.cxx
new file mode 100644 (file)
index 0000000..1e497c9
--- /dev/null
@@ -0,0 +1,1723 @@
+#include "AutoControlPoints.h"
+//------------------------------------------------------------------------------------------------------------------------------------------
+//CLASS: AutoControlPoints -----------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Constructor
+AutoControlPoints::AutoControlPoints()
+{
+        _pathsize = 0;
+        _numspline = 100;
+}
+//Destructor
+AutoControlPoints::~AutoControlPoints()
+{
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+int AutoControlPoints::GetSizeVector(std::vector<double>*Vector)
+   {
+          if(Vector != NULL)
+          {
+                       return _SizeVectorIn = Vector->size();
+          }
+          else
+          {
+                       return _SizeVectorIn = -1;
+          }
+   }
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::PointLeft ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ,
+                                                               double* lex, double* ley, double* lez )
+{
+       double LeftX = 1000;
+       int pos = 0;
+       int size = GetSizeVector(InX);
+       if(size != -1)
+       {
+               for(int i=0; i< size; i++)
+               {
+                       if(  (*InX)[i] < LeftX  )
+                       {
+                               LeftX = (*InX)[i];
+                               pos = i;
+                       }
+               }
+               *lex = (*InX)[pos];
+               *ley = (*InY)[pos];
+               *lez = (*InZ)[pos];
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::PointRight( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ,
+                                                               double* rix, double* riy, double* riz )
+{
+         double RightX = 0;
+         int pos = 0;
+         int size = GetSizeVector(InX);
+         if(size != -1)
+         {
+               for(int i=0; i< size; i++)
+               {
+                 if(  (*InX)[i] > RightX  )
+                 {
+                         RightX = (*InX)[i];
+                         pos = i;      
+                 }
+               }
+               *rix = (*InX)[pos];
+               *riy = (*InY)[pos];
+               *riz = (*InZ)[pos];
+         }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::PointHigh ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ,
+                                                               double* hix, double* hiy, double* hiz )
+{
+       double HighY=-1;
+       int pos = 0;
+       int size = InX->size();
+       if(size > 0){
+               HighY = (*InY)[0];
+               for(int i = 1; i < size; i++){
+                       if((*InY)[i] < HighY){
+                               HighY = (*InY)[i];
+                               pos = i;
+                       }
+               }
+               *hix = (*InX)[pos];
+               *hiy = (*InY)[pos];
+               *hiz = (*InZ)[pos];
+       }
+       
+/*JCP 29-09-08
+       int size = GetSizeVector(InX);
+       if(size != -1)
+       {
+               for(int i=0; i< _SizeVectorIn; i++)
+               {
+                       if(  (*InY)[i] < HighY  )
+                       {
+                               HighY = (*InY)[i];
+                               pos = i;
+                       }
+               }
+               *hix = (*InX)[pos];
+               *hiy = (*InY)[pos];
+               *hiz = (*InZ)[pos];
+       }
+JCP 29-09-08*/
+       
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::PointLow (     std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ,
+                                                                       double *lox, double *loy, double *loz)
+{
+       double LowY = 0;
+       int pos = 0;
+       int size = GetSizeVector(InX);
+       if(size != 0)
+       {
+               for(int i=0; i< _SizeVectorIn; i++)
+               {
+                       if(  (*InY)[i] > LowY  )
+                       {
+                               LowY = (*InY)[i];
+                               pos = i;
+                       }
+               } 
+               *lox = (*InX)[pos];
+               *loy = (*InY)[pos];
+               *loz = (*InZ)[pos];
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::TwoPoints ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ )
+{
+       double hiX=0,hiY=0,hiZ=0;
+       PointHigh ( InX,InY,InZ,&hiX,&hiY,&hiZ );
+       
+       double leX=0,leY=0,leZ=0;
+       PointLeft ( InX,InY,InZ,&leX,&leY,&leZ );
+       
+       double loX=0,loY=0,loZ=0;
+       PointLow  ( InX,InY,InZ,&loX,&loY,&loZ );
+
+       double riX=0,riY=0,riZ=0;
+       PointRight( InX,InY,InZ,&riX,&riY,&riZ );
+
+       double distHiLo = sqrt( pow(hiX-loX,2) + pow(hiY-loY,2) );
+       double distRiLe = sqrt( pow(riX-leX,2) + pow(riY-leY,2) );
+               
+       _controlpointsX.clear();
+       _controlpointsY.clear();
+       _controlpointsZ.clear();
+       if(distHiLo >= distRiLe)
+       {
+               _controlpointsX.push_back(hiX);
+               _controlpointsY.push_back(hiY);
+               _controlpointsZ.push_back(hiZ);
+                       
+               _controlpointsX.push_back(loX);
+               _controlpointsY.push_back(loY);
+               _controlpointsZ.push_back(loZ);
+       }
+       else
+       {
+               _controlpointsX.push_back(riX);
+               _controlpointsY.push_back(riY);
+               _controlpointsZ.push_back(riZ);
+
+               _controlpointsX.push_back(leX);
+               _controlpointsY.push_back(leY);
+               _controlpointsZ.push_back(leZ);
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::CircleCenter(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ, double *cx, double *cy, double *r)
+{
+       double hiX=0,hiY=0,hiZ=0;
+       PointHigh ( InX,InY,InZ,&hiX,&hiY,&hiZ );
+
+       double leX=0,leY=0,leZ=0;
+       PointLeft ( InX,InY,InZ,&leX,&leY,&leZ );
+               
+       double loX=0,loY=0,loZ=0;
+       PointLow  ( InX,InY,InZ,&loX,&loY,&loZ );
+
+       double riX=0,riY=0,riZ=0;
+       PointRight( InX,InY,InZ,&riX,&riY,&riZ );
+
+       *cx = (riX+leX)/2;
+       *cy = (hiY+loY)/2;
+       *r = sqrt(pow(leX-*cx,2)+pow(hiY-*cy,2)) + 7;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::CirclePoints(double cx, double cy, double r, double grad, double *x, double *y)
+{
+       double alpha = (2*3.14159265*grad)/360;
+
+       *x = cx + (r*cos(alpha));
+       *y = cy + (r*sin(alpha));
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+ void AutoControlPoints::ChargeSpline( )
+ {
+        int size = _controlpointsX.size();
+        if(size != 0)
+        {
+               _mContourModel = new manualContourModel();
+               if( _controlpointsX.size() == 2 )
+               {
+                       _mContourModel->SetCloseContour(false);
+               }
+               if( _controlpointsX.size() > 2 )
+               {
+                       _mContourModel->SetCloseContour(true);
+               }
+
+               _mContourModel->DeleteAllPoints();
+               _mContourModel->SetNumberOfPointsSpline(_numspline);
+               for(int i=0; i<size; i++)
+               {
+                       _mContourModel->AddPoint(_controlpointsX[i],_controlpointsY[i],_controlpointsZ[i]);
+               }
+               _mContourModel->UpdateSpline();
+               int numspline = _mContourModel->GetNumberOfPointsSpline();
+               double x,y,z;
+               _chargecontrolpointsX.clear();
+               _chargecontrolpointsY.clear();
+               _chargecontrolpointsZ.clear();
+               for(int j=0; j<numspline; j++)
+               {
+                       _mContourModel->GetSpline_i_Point(j,&x,&y,&z);
+                       _chargecontrolpointsX.push_back(x);
+                       _chargecontrolpointsY.push_back(y);
+                       _chargecontrolpointsZ.push_back(z);
+               }
+               _pathsize = _mContourModel->GetPathSize();
+//printf("\nPATH SIZE = %f",_pathsize);
+
+                std::ofstream file1;
+               file1.open( "4_SplinePoints.txt" );
+
+               for(int i = 0; i < numspline; i++){
+                       file1<<"X= "<<_chargecontrolpointsX[i] << "\tY= "<<_chargecontrolpointsY[i] << "\tZ= "<<_chargecontrolpointsZ[i]<<std::endl;
+               }
+               file1.close();
+        }
+       
+ }
+ //Given the coordinates of two points, it calculates the slope
+double AutoControlPoints::Slope(double x0, double y0, double x1, double y1)
+{
+       double m = (y1-y0)/(x1-x0);
+       return m;
+}
+//----------------------------------------------------------------------------------------------------------------------------------------
+//Given the coordinates of two points, it calculates the normal and it's slope 
+double AutoControlPoints::Normal(double x0, double y0, double* m, double xi)
+{
+       double y;
+       *m = -(1/(*m));
+       y = ((*m)*(xi - x0)) + y0;
+       return y;
+}
+//----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::Intersection(double x01, double y01, double x02, double y02, double mn, double m2, double* x, double* y)
+{
+       *x = ( y02-y01-(m2*x02)+(mn*x01) )/(mn-m2);
+       *y = m2*(*x-x02)+y02;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+/**
+**This methods finds the points where each radius of the circle intersect the contour
+**/
+void AutoControlPoints::InterCircle(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       double cx,cy,r;
+       CircleCenter(InX,InY,InZ,&cx,&cy,&r);
+
+       //GENERATE THE CIRCLE'S POINTS
+       int i;
+       double grad,x,y,n;
+       std::vector<double>tempX;
+       std::vector<double>tempY;
+       tempX.clear();
+       tempY.clear();
+       n = 1;
+       grad = 0;
+       for(i=0; i<360/n; i++)
+       {
+               CirclePoints(cx,cy,r,grad,&x,&y);
+               tempX.push_back(x);
+               tempY.push_back(y);
+               grad = grad + n;
+       }
+
+       //FIND THE INTERSECTIONS BETWEEN THE CIRCLE AND THE CONTOUR
+       int j,jj;
+       bool interRad = false;
+       double m1,mn=0,m2,xinter,yinter,xmin,ymin,min,dist;
+       _intercircleX.clear();
+       _intercircleY.clear();
+       _intercircleDist.clear();
+       _interbewteencircleX.clear();
+       _interbewteencircleY.clear();
+       _interbewteencircleDist.clear();
+       _interbewteencirclePos.clear();
+
+//EED 22 Sep 2008
+//     FILE *fd, *fexp;
+//     fd = fopen("C:/bbtk_JS/data/tempCircle.txt","w");
+//     fexp = fopen("C:/bbtk_JS/data/InterCircle.txt","w");
+//     fprintf(fexp,"\npos     min             xmin    ymin    xcir    ycir");
+
+       //std::ofstream file1;
+    //file1.open( "Temp.txt" );        
+       
+       for(i=0; i<tempX.size(); i++)
+       {
+//             fprintf(fd,"\n Para X = %f, Y = %f",tempX[i],tempY[i]);
+               _circleX.push_back(tempX[i]);
+               _circleY.push_back(tempY[i]);
+               m1 = Slope(tempX[i],tempY[i],cx,cy);//slope of the radius
+               min = 9999;
+               for(j=0; j<InX->size(); j++)
+               {
+                       jj = (j+1)%(InX->size());
+                       m2 = Slope((*InX)[j],(*InY)[j],(*InX)[jj],(*InY)[jj]);//Slope of the vector between the adjacent points
+                       Intersection(tempX[i],tempY[i],(*InX)[j],(*InY)[j],m1,m2,&xinter,&yinter);
+
+//JCP 26-09-2008
+                       //If the point of intersection is between two points of the contour
+                       if( ((xinter>=(*InX)[j]) && (xinter<=(*InX)[jj]))||((xinter<=(*InX)[j]) && (xinter>=(*InX)[jj]) ))
+                       {
+                               dist = sqrt(pow(tempX[i]-xinter,2) + pow(tempY[i]-yinter,2));
+                               if(dist<min)
+                               {
+                                       min = dist;
+                                       xmin = xinter;
+                                       ymin = yinter;
+                               }
+                       }
+//JCP 26-09-2008
+/*JCP 26-09-2008
+                       if((*InX)[j]<=(*InX)[jj])
+                       {
+                               if( (xinter>=(*InX)[j]) && (xinter<=(*InX)[jj]) )               //Intersection entre le cercle et le contour
+                               {
+                                       dist = sqrt(pow(tempX[i]-xinter,2) + pow(tempY[i]-yinter,2));
+                                       if(dist<min)
+                                       {
+                                               min = dist;
+                                               xmin = xinter;
+                                               ymin = yinter;
+                                       }
+                               }
+                       }
+                       if((*InX)[j]>(*InX)[jj])
+                       {
+                               if( (xinter<=(*InX)[j]) && (xinter>=(*InX)[jj]) )               //Intersection entre le cercle et le contour
+                               {
+                                       dist = sqrt(pow(tempX[i]-xinter,2) + pow(tempY[i]-yinter,2));
+                                       if(dist<min)
+                                       {
+                                               min = dist;
+                                               xmin = xinter;
+                                               ymin = yinter;
+                                       }
+                               }
+                       }
+JCP 26-09-2008*/
+               }
+
+
+
+//             fprintf(fd,"\n => x_int = %f, y_int = %f, dist_int = %f",xmin,ymin,min);
+//             fprintf(fexp,"\n%d      %f      %f      %f      %f      %f",i,min,xmin,ymin,tempX[i],tempY[i]);
+//JCP 26-09-08 If the distance of the intersection is bigger than the radio we have to invert the segment
+               if(min>=r)
+               {
+                       interRad = true;
+                       _interbewteencirclePos.push_back(i);
+                       _interbewteencircleX.push_back(xmin);
+                       _interbewteencircleY.push_back(ymin);
+                       _interbewteencircleDist.push_back( sqrt(pow(cx-xmin,2)+pow(cy-ymin,2)) );
+
+                       //      file1<<i<<std::endl;
+               }else{
+//JCP 26-09-08         if(min<r)
+//JCP 26-09-08         {
+                       _intercircleX.push_back(xmin);
+                       _intercircleY.push_back(ymin);
+                       _intercircleDist.push_back(min);
+               //      file1<<"\t"<<i<<std::endl;
+               }
+       }
+       //file1.close();
+//     fclose(fd);
+//     fclose(fexp);
+
+       //WHEN THERE IS RADIAL INTERSECTION
+       vectorFunctions *vecf = new vectorFunctions();
+
+//EED 22 Sep 2008
+//     FILE *fdata;
+//     fdata = fopen("C:/bbtk_JS/data/autoCPdata.txt","w");
+       if(interRad == true)
+       {
+               std::vector<double> tempXX;
+               std::vector<double> tempYY;
+               std::vector<double> tempDD;
+               tempXX.clear();
+               tempYY.clear();
+               tempDD.clear();
+//Copy of the first points in the array until the first intersection is found          
+               for(i=0; i<_interbewteencirclePos[0]; i++)
+               {
+                       tempXX.push_back(_intercircleX[i]);
+                       tempYY.push_back(_intercircleY[i]);
+                       tempDD.push_back(_intercircleDist[i]);
+//                     fprintf(fdata,"\n%f     %f      %f",_intercircleDist[i],_intercircleX[i],_intercircleY[i]);
+               }
+               int sizep = _interbewteencirclePos.size();
+//Copy all the points where there is an intersection with the center but inverted
+//JCP 26-09-08         for(i=_interbewteencirclePos[sizep-1],j=sizep-1; i>=_interbewteencirclePos[0]; i--,j--)
+               for(i=sizep-1; i >= 0;i--)
+               {
+//JCP 26-09-08                 tempXX.push_back(_interbewteencircleX[j]);
+//JCP 26-09-08                 tempYY.push_back(_interbewteencircleY[j]);
+//JCP 26-09-08                 tempDD.push_back(_interbewteencircleDist[j]);
+                       tempXX.push_back(_interbewteencircleX[i]);
+                       tempYY.push_back(_interbewteencircleY[i]);
+                       tempDD.push_back(_interbewteencircleDist[i]);
+//                     fprintf(fdata,"\n%f     %f      %f",_interbewteencircleDist[j],_interbewteencircleX[j],_interbewteencircleY[j]);
+               }
+               for(i=_interbewteencirclePos[0]; i<_intercircleX.size(); i++)
+               {
+                       tempXX.push_back(_intercircleX[i]);
+                       tempYY.push_back(_intercircleY[i]);
+                       tempDD.push_back(_intercircleDist[i]);
+//                     fprintf(fdata,"\n%f     %f      %f",_intercircleDist[i],_intercircleX[i],_intercircleY[i]);
+               }
+               
+               _intercircleX.clear();
+               _intercircleY.clear();
+               _intercircleDist.clear();
+               vecf->copyVector(&tempXX,&_intercircleX);
+               vecf->copyVector(&tempYY,&_intercircleY);
+               vecf->copyVector(&tempDD,&_intercircleDist);
+       }       
+//     fclose(fdata);
+
+       //DELETE!!
+
+       std::ofstream file1;
+    file1.open( "1_Intersection.txt" );
+
+       for(int i = 0; i < _intercircleX.size(); i++){
+               file1<<"X= "<<_intercircleX[i] << "\tY= "<<_intercircleY[i] << "\tDist= "<<_intercircleDist[i]<<std::endl;
+       }
+       file1.close();
+               
+
+       delete vecf;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::maxminLocal()
+{
+       int i;
+       _posmaxlocal.clear();
+       _posminlocal.clear();
+       _posminmaxlocal.clear();
+       _maxlocalX.clear();
+       _maxlocalY.clear();
+       _minlocalX.clear();
+       _minlocalY.clear();
+       _minmaxlocalX.clear();
+       _minmaxlocalY.clear();
+       
+       if(_intercircleDist.size() != 0)
+       {
+//JCP 26 - 09 - 08 This change was du to the posibility of having a maximum or a minimum value in the limits of 
+//JCP 26 - 09 - 08 the array
+               double lastdist, currentdist, nextdist;
+               for(i=0; i < _intercircleDist.size(); i++)
+               {
+                       //FOR MAXIMUM LOCAL
+//JCP 26-09-08
+                       currentdist = _intercircleDist[i];
+                       if(i == 0){
+                               lastdist = _intercircleDist[_intercircleDist.size()-1];
+                               nextdist = _intercircleDist[i+1];
+                       }else if (i == _intercircleDist.size()-1){
+                               lastdist = _intercircleDist[i-1];
+                               nextdist = _intercircleDist[0];
+                       }else{
+                               lastdist = _intercircleDist[i-1];                               
+                               nextdist = _intercircleDist[i+1];
+                       }
+                       
+
+//JCP 26-09-08                 if( (_intercircleDist[i-1]<_intercircleDist[i]) && (_intercircleDist[i]>_intercircleDist[i+1]))
+                       if(lastdist < currentdist && currentdist > nextdist)
+                       {
+                               _posmaxlocal.push_back(i);
+                               _maxlocalX.push_back(_intercircleX[i]);
+                               _maxlocalY.push_back(_intercircleY[i]);
+                               _minmaxlocalX.push_back(_intercircleX[i]);
+                               _minmaxlocalY.push_back(_intercircleY[i]);
+                               _posminmaxlocal.push_back(i);
+                       }
+                       //FOR MINIMUM LOCAL
+//JCP 26-09-08                 if( (_intercircleDist[i-1]>_intercircleDist[i]) && (_intercircleDist[i]<_intercircleDist[i+1]))
+                       if(lastdist > currentdist && currentdist < nextdist)
+                       {
+                               _posminlocal.push_back(i);
+                               _minlocalX.push_back(_intercircleX[i]);
+                               _minlocalY.push_back(_intercircleY[i]);
+                               _minmaxlocalX.push_back(_intercircleX[i]);
+                               _minmaxlocalY.push_back(_intercircleY[i]);
+                               _posminmaxlocal.push_back(i);
+                       }
+               }
+       }
+
+       vectorFunctions *vecf   = new vectorFunctions();
+       std::vector<double> tempZ;
+       tempZ.clear();
+       
+       vecf->copyVector(&_minlocalX,&_controlpointsX); 
+       vecf->copyVector(&_minlocalY,&_controlpointsY);
+       for(i=0; i<_minlocalX.size(); i++)
+       {
+               tempZ.push_back(_controlpointsZ[0]);
+       }
+       vecf->copyVector(&tempZ,&_controlpointsZ);
+
+//JCP 26-09-08 
+       std::ofstream file1;
+    file1.open( "2_MaxMin.txt" );
+
+       for(int i = 0; i < _controlpointsX.size(); i++){
+               file1<<"X= "<<_controlpointsX[i] << "\tY= "<<_controlpointsY[i] << "\tZ= "<<_controlpointsZ[i]<<std::endl;
+       }
+       file1.close();
+//JCP 26-09-08
+       delete vecf;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+//ELIMINATES THE POINTS WITH A DISTANCE < val
+void AutoControlPoints::fixBetweenPoints(double val)
+{
+       int size = _controlpointsX.size();
+       double dist;
+       if(size != 0)
+       {
+               std::vector<double> tempX;
+               std::vector<double> tempY;
+               std::vector<double>     tempZ;
+               tempX.clear();
+               tempY.clear();
+               tempZ.clear();
+
+               int ii;
+               vectorFunctions *vecf = new vectorFunctions();
+               for(int i=0; i<size; i++)
+               {
+                       ii = (i+1)%size;
+                       dist = sqrt(pow(_controlpointsX[i]-_controlpointsX[ii],2)+pow(_controlpointsY[i]-_controlpointsY[ii],2));
+                       if(dist>val)
+                       {
+                               tempX.push_back(_controlpointsX[i]);
+                               tempY.push_back(_controlpointsY[i]);
+                               tempZ.push_back(_controlpointsZ[i]);
+                       }
+               }
+               _controlpointsX.clear();
+               _controlpointsY.clear();
+               _controlpointsZ.clear();
+
+               vecf->copyVector(&tempX,&_controlpointsX);
+               vecf->copyVector(&tempY,&_controlpointsY);
+               vecf->copyVector(&tempZ,&_controlpointsZ);
+
+               std::ofstream file1;
+               file1.open( "3_PointsFixed.txt" );
+
+               for(int i = 0; i < _controlpointsX.size(); i++){
+                       file1<<"X= "<<_controlpointsX[i] << "\tY= "<<_controlpointsY[i] << "\tZ= "<<_controlpointsZ[i]<<std::endl;
+               }
+               file1.close();
+
+               delete vecf;
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+//ALL THE INTERSECTIONS
+void AutoControlPoints::InterBetweenContours(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       _intervectorX.clear();
+       _intervectorY.clear();
+       ChargeSpline();
+
+       int i,ii,j,jj;
+       double m1,mn,m2,xinter,yinter;
+       if(_chargecontrolpointsX.size() > 1) //These condition exists because there is a method for find the initial control points 
+       {
+//EED 22 Sep 2008
+//             FILE *fd;
+//             fd = fopen("C:/bbtk_JS/data/interBetweenContours.txt","w");
+               for(i=0; i<_chargecontrolpointsX.size(); i++)
+               {
+                       ii = (i+1)%(_chargecontrolpointsX.size());
+
+                       m1 = Slope(_chargecontrolpointsX[i],_chargecontrolpointsY[i],_chargecontrolpointsX[ii],_chargecontrolpointsY[ii]);
+                       mn = m1;
+                       Normal(_chargecontrolpointsX[i],_chargecontrolpointsY[i],&mn,_chargecontrolpointsX[i]+1);
+//                     fprintf(fd,"\n Para X = %f, Y = %f",_chargecontrolpointsX[i],_chargecontrolpointsY[i]);
+
+                       Vector *vecX = new Vector();
+                       Vector *vecY = new Vector();
+                       vecX->set_var(_chargecontrolpointsX[i]);
+                       vecY->set_var(_chargecontrolpointsY[i]);
+
+                       for(j=0; j<InX->size(); j++)
+                       {
+                               jj = (j+1)%(InX->size());
+                               m2 = Slope((*InX)[j],(*InY)[j],(*InX)[jj],(*InY)[jj]);
+                               Intersection(_chargecontrolpointsX[i],_chargecontrolpointsY[i],(*InX)[j],(*InY)[j],mn,m2,&xinter,&yinter);
+
+                               if(((*InX)[j] <= xinter && xinter <= (*InX)[jj]) || (xinter<=(*InX)[j] && xinter>=(*InX)[jj])){
+                                       vecX->set_vec(xinter);
+                                       vecY->set_vec(yinter);
+                               }
+/*JCP 29-09-08
+                               if( (*InX)[j]<=(*InX)[jj] )
+                               {
+                                       if( (xinter>=(*InX)[j]) && (xinter<=(*InX)[jj]) )
+                                       {
+                                               //If the point is a CP, the intersection is itself.
+                                               if((xinter==_chargecontrolpointsX[i]) && (yinter==_chargecontrolpointsY[i]))
+                                               {
+                                                       vecX->set_vec(xinter);
+                                                       vecY->set_vec(yinter);
+//                                                     fprintf(fd,"\n => x_int = %f, y_int = %f",xinter,yinter);
+                                               }
+                                               else
+                                               {
+                                                       vecX->set_vec(xinter);
+                                                       vecY->set_vec(yinter);
+//                                                     fprintf(fd,"\n => x_int = %f, y_int = %f",xinter,yinter);
+                                               }
+                                       }
+                               }
+                               if( (*InX)[j]>(*InX)[jj] )
+                               {
+                                       if( (xinter<=(*InX)[j]) && (xinter>=(*InX)[jj]) )
+                                       {
+                                               //If the point is a CP, the intersection is itself.
+                                               if((xinter==_chargecontrolpointsX[i]) && (yinter==_chargecontrolpointsY[i]))
+                                               {
+                                                       vecX->set_vec(xinter);
+                                                       vecY->set_vec(yinter);
+//                                                     fprintf(fd,"\n => x_int = %f, y_int = %f",xinter,yinter);
+                                               }
+                                               else
+                                               {
+                                                       vecX->set_vec(xinter);
+                                                       vecY->set_vec(yinter);
+//                                                     fprintf(fd,"\n => x_int = %f, y_int = %f",xinter,yinter);
+                                               }
+                                       }
+                               }
+JCP 29-09-08*/
+                       }//FOR2
+                       _intervectorX.push_back(*vecX);
+                       _intervectorY.push_back(*vecY);
+                       //DELETE!!
+                       delete vecX;
+                       delete vecY;
+               }//FOR1
+//             fclose(fd);
+       }//IF
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetInterBetweenContours(std::vector<Vector>*interVX, std::vector<Vector>*interVY)
+{
+       interVX->clear();
+       interVY->clear();
+       int size = _intervectorX.size();
+       int i;
+       if(size != 0)
+       {
+               for(i=0; i<size; i++)
+               {
+                       interVX->push_back(_intervectorX[i]);
+                       interVY->push_back(_intervectorY[i]);
+               }
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+//ONLY THE LOGICAL INTERSECTIONS
+void AutoControlPoints::IntersectionPoints()
+{
+       if(_intervectorX.size() != 0)
+       {               
+               _interpointsX.clear();
+               _interpointsY.clear();
+
+//EED
+//             FILE *fd;
+//             fd = fopen("C:/bbtk_JS/data/IntersectionPoints.txt","w");
+               double dist,min;
+               int i,j,posj;
+
+               posj = -1;
+               min = 9999;
+/*JCP 30-08-09 
+               for(j=0; j<_intervectorX[0].getsize_vec(); j++)
+               {
+                       dist = sqrt( pow( _intervectorX[0].get_vec(j)-_intervectorX[0].get_var(),2 ) + pow( _intervectorY[0].get_vec(j)-_intervectorY[0].get_var(),2 ) );
+                       if( dist < min )
+                       {
+                               min = dist;
+                               posj = j;
+                       }
+               }
+               if(posj != -1)
+               {
+                       _interpointsX.push_back(_intervectorX[0].get_vec(posj));
+                       _interpointsY.push_back(_intervectorY[0].get_vec(posj));
+//                     fprintf(fd,"\n Para X = %f, Y = %f",_intervectorX[0].get_var(),_intervectorY[0].get_var());
+//                     fprintf(fd,"\n => x_int = %f, y_int = %f",_interpointsX[0],_interpointsY[0]);
+               }
+               if(posj == -1)
+               {
+                       printf("\n\n There is an invalid intersection: Must see AutoControlPoints::IntersectionPoints() method");
+               }
+JCP 30-08-09 */
+               for(i=0; i<_intervectorX.size(); i++){
+                       min = 9999;
+                       posj = -1;
+                       for(j=0; j<_intervectorX[i].getsize_vec(); j++) {
+                               dist  = sqrt( pow( _intervectorX[i].get_vec(j)-_intervectorX[i].get_var(),2 ) + pow( _intervectorY[i].get_vec(j)-_intervectorX[i].get_var(),2 ) );
+                               if( dist < min ){
+                                       min = dist;
+                                       posj = j;
+                               }
+                       }
+                       _interpointsX.push_back(_intervectorX[i].get_vec(posj));
+                       _interpointsY.push_back(_intervectorY[i].get_vec(posj));                
+               }
+/*JCP 30-09-08
+               for(i=1; i<_intervectorX.size(); i++)
+               {
+                       min = 9999;
+                       posj = -1;
+//                     fprintf(fd,"\n Para X = %f, Y = %f",_intervectorX[i].get_var(),_intervectorY[i].get_var());
+                       for(j=0; j<_intervectorX[i].getsize_vec(); j++)
+                       {
+                               //TYPE: LE PLUS PRES VOISIN
+                               dist  = sqrt( pow( _intervectorX[i].get_vec(j)-_interpointsX[i-1],2 ) + pow( _intervectorY[i].get_vec(j)-_interpointsY[i-1],2 ) );
+                               //TYPE: LE PLUS PRES DANS LA MÊME DROITE
+                               //dist = sqrt(pow(_intervectorX[i].get_vec(j)-_intervectorX[i].get_var(),2)+pow(_intervectorY[i].get_vec(j)-_intervectorY[i].get_var(),2));
+                               
+                               if( dist < min )
+                               {
+                                       min = dist;
+                                       posj = j;
+                               }
+                       }
+                       _interpointsX.push_back(_intervectorX[i].get_vec(posj));
+                       _interpointsY.push_back(_intervectorY[i].get_vec(posj));
+//                     fprintf(fd,"\n => x_int = %f, y_int = %f",_interpointsX[i],_interpointsY[i]);
+               }
+JCP 30-09-08*/
+//             fclose(fd);
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetIntersectionPoints(std::vector<Vector>*interVX, std::vector<Vector>*interVY)
+{
+       int size = _interpointsX.size();
+       int i;
+       if(size != 0)
+       {
+               Vector *vecX = new Vector();
+               Vector *vecY = new Vector();
+               interVX->clear();
+               interVY->clear();
+               for(i=0; i<size; i++)
+               {
+                       vecX->set_var(_controlpointsZ[0]);
+                       vecX->set_vec(_interpointsX[i]);
+                       vecY->set_var(_controlpointsZ[0]);
+                       vecY->set_vec(_interpointsY[i]);
+                       interVX->push_back(*vecX);
+                       interVY->push_back(*vecY);
+               }
+               delete vecX;
+               delete vecY;
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+//ERROR BETWEEN THE LOGICAL INTERSECTIONS
+void AutoControlPoints::ErrorBetweenContours()
+{
+       _errorpos = -1;
+       if(_interpointsX.size() != 0)
+       {
+               _errorvector.clear();
+               int i;
+//EED 22 Sep 2008
+
+//             FILE *fd;
+//             fd = fopen("C:/bbtk_JS/data/interErrorData.txt","w");
+               for(i=0; i<_interpointsX.size(); i++)
+               {
+                       _errorvector.push_back( (sqrt( pow( _interpointsX[i]-_intervectorX[i].get_var(),2 ) + pow( _interpointsY[i]-_intervectorY[i].get_var(),2 ) )/_pathsize)*100 );
+//                     fprintf(fd,"\n%d        %f",i,_errorvector[i]);
+               }
+//             fclose(fd);
+               double max = -1;
+               for(i=0; i<_errorvector.size(); i++)
+               {
+                       if(_interpointsX[i] != -1)
+                       {
+                               if(_errorvector[i]>max)
+                               {
+                                       max = _errorvector[i];
+                                       _errorpos = i;
+                               }
+                       }
+               }
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetErrorBetweenContours( std::vector<double>*vec )
+{
+       vec->clear();
+       vectorFunctions *vf = new vectorFunctions();
+       vf->copyVector(&_errorvector,vec);
+       delete vf;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::AddControlPoint(bool activate)
+{
+       if(_errorpos != -1)
+       {
+               double xmax = _interpointsX[_errorpos];
+               double ymax = _interpointsY[_errorpos];
+               double xx       = _intervectorX[_errorpos].get_var();
+               double yy       = _intervectorY[_errorpos].get_var();
+printf("\n XMAX = %f, YMAX = %f, XX = %f, YY = %f",xmax,ymax,xx,yy);
+
+               int i,ii,j,posA=-1,posB=-1;
+               bool findA=false, findB=false;
+               //CASE A
+               for(i=_errorpos; findA!=true; i++)
+               {
+                       ii = i%_errorvector.size();
+                       for(j=0; j<_controlpointsX.size(); j++)
+                       {
+                               if( ((float)_controlpointsX[j]-1.5<=(float)_intervectorX[ii].get_var()) && ((float)_intervectorX[ii].get_var()<=(float)_controlpointsX[j]+1.5) &&
+                                       ((float)_controlpointsY[j]-1.5<=(float)_intervectorY[ii].get_var()) && ((float)_intervectorY[ii].get_var()<=(float)_controlpointsY[j]+1.5) )
+                               {
+                                       findA = true;
+                                       posA = j;
+                               }
+                       }
+               }
+               //CASE B
+               for(i=_errorpos; findB!=true; i--)
+               {
+                       if(_errorpos==-1)
+                       {
+                               i = _errorvector.size();
+                       }
+                       for(j=0; j<_controlpointsX.size(); j++)
+                       {
+                               if( ((float)_controlpointsX[j]-1.5<=(float)_intervectorX[i].get_var()) && ((float)_intervectorX[i].get_var()<=(float)_controlpointsX[j]+1.5) &&
+                                       ((float)_controlpointsY[j]-1.5<=(float)_intervectorY[i].get_var()) && ((float)_intervectorY[i].get_var()<=(float)_controlpointsY[j]+1.5) )
+                               {
+                                       findB = true;
+                                       posB = j;
+                               }
+                       }
+               }
+               if(posA == posB)
+               {
+                       posB = posA-1;
+               }
+               if(posA<posB)
+               {
+                       posA = posB+1;
+                       if(posB = _controlpointsX.size()-1)
+                       {
+                               posA = 0;
+                       }
+               }
+printf("\n POSA = %d, X = %f, Y = %f",posA,_controlpointsX[posA],_controlpointsY[posA]);
+printf("\n POSB = %d, X = %f, Y = %f",posB,_controlpointsX[posB],_controlpointsY[posB]);
+               _posA = posA;
+               _posB = posB;
+               int id = -1;
+               if(((posA!=-1)&&(posB!=-1)))
+               {
+                       id = posA;
+               }
+printf("\n ID = %d",id);
+               if(id != -1)
+               {
+                       std::vector<double> tempX;
+                       std::vector<double> tempY;
+                       std::vector<double> tempZ;
+                       for(i=0; i<_controlpointsX.size(); i++)
+                       {
+                               if(i == id)
+                               {
+                                       tempX.push_back(xmax);
+                                       tempY.push_back(ymax);
+                                       tempZ.push_back(_controlpointsZ[0]);
+                               }
+                               tempX.push_back(_controlpointsX[i]);
+                               tempY.push_back(_controlpointsY[i]);
+                               tempZ.push_back(_controlpointsZ[i]);
+                       }
+               
+                       if(activate == true)
+                       {
+                               vectorFunctions *vf = new vectorFunctions();
+                               vf->copyVector(&tempX,&_controlpointsX);
+                               vf->copyVector(&tempY,&_controlpointsY);
+                               vf->copyVector(&tempZ,&_controlpointsZ);
+                               delete vf;
+                       }
+               
+               }
+       }//IF-(principal)
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::InterBetweenControl( )
+{
+       _intervecXX.clear();
+       _intervecYY.clear();
+       
+       int i,ii,j,jj;
+       double m1,mn,m2,xinter,yinter;
+       if(_chargecontrolpointsX.size() > 1) //These condition exists because there is a method for find the initial control points 
+       {
+//EED 22 Sep 2008
+
+//             FILE *fd;
+//             fd = fopen("C:/bbtk_JS/data/InterBetweenControl.txt","w");
+               for(i=0; i<_chargecontrolpointsX.size()-1; i++)
+               {
+                       ii = (i+1)%(_chargecontrolpointsX.size());
+                       m1 = Slope(_chargecontrolpointsX[i],_chargecontrolpointsY[i],_chargecontrolpointsX[ii],_chargecontrolpointsY[ii]);
+                       mn = m1;
+                       Normal(_chargecontrolpointsX[i],_chargecontrolpointsY[i],&mn,_chargecontrolpointsX[i]+1);
+//                     fprintf(fd,"\n Para X = %f, Y = %f",_chargecontrolpointsX[i],_chargecontrolpointsY[i]);
+
+                       Vector *vecX = new Vector();
+                       Vector *vecY = new Vector();
+                       vecX->set_var(_chargecontrolpointsX[i]);
+                       vecY->set_var(_chargecontrolpointsY[i]);
+
+                       for(j=0; j<_chargecontrolpointsX.size(); j++)
+                       {
+                               jj = (j+1)%(_chargecontrolpointsX.size());
+                               m2 = Slope(_chargecontrolpointsX[j],_chargecontrolpointsY[j],_chargecontrolpointsX[jj],_chargecontrolpointsY[jj]);
+                               Intersection(_chargecontrolpointsX[i],_chargecontrolpointsY[i],_chargecontrolpointsX[j],_chargecontrolpointsY[j],mn,m2,&xinter,&yinter);
+                               if( _chargecontrolpointsX[j]<=_chargecontrolpointsX[jj] )
+                               {
+                                       if( (xinter>=_chargecontrolpointsX[j]) && (xinter<=_chargecontrolpointsX[jj]) )
+                                       {
+                                               if(((float)xinter==(float)_chargecontrolpointsX[i]) && ((float)yinter==(float)_chargecontrolpointsY[i]))
+                                               {
+                                               }
+                                               else
+                                               {
+//                                                     fprintf(fd,"\n => x_int = %f, y_int = %f",xinter,yinter);
+                                                       vecX->set_vec(xinter);
+                                                       vecY->set_vec(yinter);
+                                               }
+                                       }
+                               }
+                               if( _chargecontrolpointsX[j]>_chargecontrolpointsX[jj] )
+                               {
+                                       if( (xinter<=_chargecontrolpointsX[j]) && (xinter>=_chargecontrolpointsX[jj]) )
+                                       {
+                                               if(((float)xinter==(float)_chargecontrolpointsX[i]) && ((float)yinter==(float)_chargecontrolpointsY[i]))
+                                               {
+                                               }
+                                               else
+                                               {
+//                                                     fprintf(fd,"\n => x_int = %f, y_int = %f",xinter,yinter);
+                                                       vecX->set_vec(xinter);
+                                                       vecY->set_vec(yinter);
+                                               }
+                                       }
+                               }
+                       }//FOR2
+                       _intervecXX.push_back(*vecX);
+                       _intervecYY.push_back(*vecY);
+                       
+                       //DELETE!!
+                       delete vecX;
+                       delete vecY;
+
+               }//FOR1
+//             fclose(fd);
+       }//IF
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::fixBetweenControl()
+{
+       _interitselfX.clear();
+       _interitselfY.clear();
+       int i,j;
+       float vecx,vecy,varx,vary;
+//     FILE *fd;
+//     fd = fopen("C:/bbtk_JS/data/InterBetweenControlFix.txt","w");
+       for(i=0; i<_intervecXX.size(); i++)
+       {
+               Vector *vx = new Vector();
+               Vector *vy = new Vector();
+               vx->set_var(_intervecXX[i].get_var());
+               vy->set_var(_intervecYY[i].get_var());
+//             fprintf(fd,"\n Para X = %f, Y = %f",_intervecXX[i].get_var(),_intervecYY[i].get_var());
+               for(j=0; j<_intervecXX[i].getsize_vec(); j++)
+               {
+                       vecx = _intervecXX[i].get_vec(j);
+                       varx = _intervecXX[i].get_var();
+                       vecy = _intervecYY[i].get_vec(j);
+                       vary = _intervecYY[i].get_var();
+                       if(  (vecx == varx) && (vecy == vary) )
+                       {
+                       }
+                       else
+                       {
+                               vx->set_vec((double)vecx);
+                               vy->set_vec((double)vecy);
+//                             fprintf(fd,"\n => x_int = %f, y_int = %f",vecx,vecy);
+                       }
+               }
+               _interitselfX.push_back(*vx);
+               _interitselfY.push_back(*vy);
+               delete vx;
+               delete vy;
+       }
+//     fclose(fd);
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::PossibleIntersections( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ )
+{
+       InterBetweenContours(InX,InY,InZ);      //_intervectorX
+       //InterBetweenControl();                                //_intervecXX
+       //fixBetweenControl();                          //_interitselfX
+       
+       std::vector<Vector> tempX;
+       std::vector<Vector> tempY;
+       tempX.clear();
+       tempY.clear();
+       int i,j,k;
+       double dist1,dist2;
+//EED 22 Sep 2008
+//     FILE *fd;
+/*
+       bool ready;
+       fd = fopen("C:/bbtk_JS/data/InterPossibleIntersections.txt","w");
+
+
+       for(i=0; i<_intervectorX.size(); i++)
+       {
+               fprintf(fd,"\n Para X = %f, Y = %f",_intervectorX[i].get_var(),_intervectorY[i].get_var());
+               Vector *vx = new Vector();
+               Vector *vy = new Vector();
+               vx->set_var(_intervectorX[i].get_var());
+               vy->set_var(_intervectorY[i].get_var());
+               ready = false;
+               for(j=0; j<_intervectorX[i].getsize_vec() ; j++)
+               {
+                       dist1 = sqrt( pow(_intervectorX[i].get_var()-_intervectorX[i].get_vec(j),2) + pow(_intervectorY[i].get_var()-_intervectorY[i].get_vec(j),2) );
+                       for(k=0; (k<_interitselfX[i].getsize_vec()) && (ready!=true); k++)
+                       {
+                               dist2 = sqrt( pow(_interitselfX[i].get_var()-_interitselfX[i].get_vec(k),2) + pow(_interitselfY[i].get_var()-_interitselfY[i].get_vec(k),2) );
+                               if(dist2>dist1)
+                               {
+                                       fprintf(fd,"\n => x_int = %f, y_int = %f",_intervectorX[i].get_vec(j),_intervectorY[i].get_vec(j));
+                                       vx->set_vec(_intervectorX[i].get_vec(j));
+                                       vy->set_vec(_intervectorY[i].get_vec(j));
+                                       ready == true;
+                               }
+                       }
+               }
+               tempX.push_back(*vx);
+               tempY.push_back(*vy);
+               delete vx;
+               delete vy;
+       }
+       fclose(fd);
+       
+       _intervectorX.clear();
+       _intervectorY.clear();
+       Vector *vv = new Vector();
+       vv->copyVector(&tempX,&_intervectorX);
+       vv->copyVector(&tempY,&_intervectorY);
+       
+       //vv->printVector(&_intervectorX);
+*/
+       std::vector<double> arrX; 
+       std::vector<double> arrY;
+       std::vector<double>::iterator itx;
+       std::vector<double>::iterator ity;
+       std::vector<double>::iterator itxx;
+       std::vector<double>::iterator ityy;
+       double distA, distB;
+       if(_intervectorX.size() != 0)
+       {
+//             fd = fopen("C:/bbtk_JS/data/InterPossibleIntersections.txt","w");
+               for(i=0; i<_intervectorX.size(); i++)
+               {
+//                     fprintf(fd,"\n Para X = %f, Y = %f",_intervectorX[i].get_var(),_intervectorY[i].get_var());
+                       if(_intervectorX[i].getsize_vec() > 1)
+                       {
+                               arrX.clear();
+                               arrY.clear();
+                               for(j=0; j<_intervectorX[i].getsize_vec(); j++)
+                               {
+                                       arrX.push_back(_intervectorX[i].get_vec(j));
+                                       arrY.push_back(_intervectorY[i].get_vec(j));
+                               }
+//printf("\n arrX Size = %d",arrX.size());
+                               itx = arrX.begin();
+                               ity = arrY.begin();
+                               itxx = arrX.begin()+1;
+                               ityy = arrY.begin()+1;
+                               for(j=0; j<arrX.size()-1; j++)
+                               {
+                                       // I
+                                       if( (*itx > _intervectorX[i].get_var())  && (*ity < _intervectorY[i].get_var()) && 
+                                               (*itxx > _intervectorX[i].get_var()) && (*ityy < _intervectorY[i].get_var()) )
+                                       {
+                                               distA = sqrt( pow(*itx-_intervectorX[i].get_var(),2) + pow(*ity-_intervectorY[i].get_var(),2) );
+                                               distB = sqrt( pow(*itxx-_intervectorX[i].get_var(),2) + pow(*ityy-_intervectorY[i].get_var(),2) );
+                                               if(distA<distB)
+                                               {
+                                                       arrX.erase(itxx);
+                                                       arrY.erase(ityy);
+                                               }
+                                                       if(distA>distB)
+                                               {
+                                                       arrX.erase(itx);
+                                                       arrY.erase(ity);
+                                                       itxx++;
+                                                       ityy++;
+                                               }       
+                                       }
+                                       // II
+                                       else if( (*itx < _intervectorX[i].get_var())  && (*ity < _intervectorY[i].get_var()) && 
+                                               (*itxx < _intervectorX[i].get_var()) && (*ityy < _intervectorY[i].get_var()) )
+                                       {
+                                               distA = sqrt( pow(*itx-_intervectorX[i].get_var(),2) + pow(*ity-_intervectorY[i].get_var(),2) );
+                                               distB = sqrt( pow(*itxx-_intervectorX[i].get_var(),2) + pow(*ityy-_intervectorY[i].get_var(),2) );
+                                               if(distA<distB)
+                                               {
+                                                       arrX.erase(itxx);
+                                                       arrY.erase(ityy);
+                                               }
+                                               if(distA>distB)
+                                               {
+                                                       arrX.erase(itx);
+                                                       arrY.erase(ity);
+                                                       itxx++;
+                                                       ityy++;
+                                               }       
+                                       }
+                                       // III
+                                       else if( (*itx < _intervectorX[i].get_var())  && (*ity > _intervectorY[i].get_var()) && 
+                                               (*itxx < _intervectorX[i].get_var()) && (*ityy > _intervectorY[i].get_var()) )
+                                       {
+                                               distA = sqrt( pow(*itx-_intervectorX[i].get_var(),2) + pow(*ity-_intervectorY[i].get_var(),2) );
+                                               distB = sqrt( pow(*itxx-_intervectorX[i].get_var(),2) + pow(*ityy-_intervectorY[i].get_var(),2) );
+                                               if(distA<distB)
+                                               {
+                                                       arrX.erase(itxx);
+                                                       arrY.erase(ityy);
+                                               }
+                                               if(distA>distB)
+                                               {
+                                                       arrX.erase(itx);
+                                                       arrY.erase(ity);
+                                                       itxx++;
+                                                       ityy++;
+                                               }       
+                                       }
+                                       // IV
+                                       else if( ((double)*itx > _intervectorX[i].get_var())  && (*ity > _intervectorY[i].get_var()) && 
+                                               ((double)*itxx > _intervectorX[i].get_var()) && (*ityy > _intervectorY[i].get_var()) )
+                                       {
+                                               distA = sqrt( pow(*itx-_intervectorX[i].get_var(),2) + pow(*ity-_intervectorY[i].get_var(),2) );
+                                               distB = sqrt( pow(*itxx-_intervectorX[i].get_var(),2) + pow(*ityy-_intervectorY[i].get_var(),2) );
+                                               if(distA<distB)
+                                               {
+                                                       arrX.erase(itxx);
+                                                       arrY.erase(ityy);
+                                               }
+                                               if(distA>distB)
+                                               {
+                                                       arrX.erase(itx);
+                                                       arrY.erase(ity);
+                                                       itxx++;
+                                                       ityy++;
+                                               }       
+                                       }
+                                       else
+                                       {
+                                               itx++;
+                                               ity++;
+                                               itxx++;
+                                               ityy++;
+                                       }
+                               }
+                               _intervectorX[i].resetVec();
+                               _intervectorY[i].resetVec();
+//printf("\n _intervector(%d) Size = %d",i,_intervectorX[i].getsize_vec());
+                               for(k=0; k<arrX.size(); k++)
+                               {
+//printf("\n arr(%d) X = %f, Y = %f",k,arrX[k],arrY[k]);
+//                                     fprintf(fd,"\n => x_int = %f, y_int = %f",arrX[k],arrY[k]);
+                                       _intervectorX[i].set_vec(arrX[k]);
+                                       _intervectorY[i].set_vec(arrY[k]);
+                               }
+                       }
+               }
+       }
+
+       //DELETE!!
+//     delete vv;
+
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::ControlInContour(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       int i,j;
+       _contIncontpos.clear(); 
+       bool find = false;
+       double range = 2;
+       for(i=0; i<_controlpointsX.size(); i++)
+       {
+               find = false;
+               for(j=0; (j<InX->size()) && (find!=true); j++)
+               {
+                       if( ((*InX)[j]-range<=_controlpointsX[i]) && (_controlpointsX[i]<=(*InX)[j]+range) && ((*InY)[j]-range<=_controlpointsY[i]) && (_controlpointsY[i]<=(*InY)[j]+range) )
+                       {
+                               _contIncontpos.push_back(j);
+                               find = true;
+                       }
+               }
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::NearMaxError2Control()
+{
+       if(_interpointsX.size() != 0)
+       {
+               AddControlPoint(false);
+
+               double distA = sqrt( pow(_interpointsX[_errorpos]-_controlpointsX[_posA],2) + pow(_interpointsY[_errorpos]-_controlpointsY[_posA],2) );
+               double distB = sqrt( pow(_interpointsX[_errorpos]-_controlpointsX[_posB],2) + pow(_interpointsY[_errorpos]-_controlpointsY[_posB],2) );
+               double nearp = -1;
+               if(distA<distB)
+               {
+                       nearp = distA;
+                       _posn = _posA;
+
+               }
+               else
+               {
+                       nearp = distB;
+                       _posn = _posB;
+               }
+       }
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::MoveControlPointInContour(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+int i;
+/*
+//PRINTF---------------------------------------------------------------
+printf("\n CONTROL POINTS BEFORE MOVEMENT");
+for(i=0; i<_controlpointsX.size(); i++)
+{
+       printf("\n X = %f, Y = %f",_controlpointsX[i],_controlpointsY[i]);
+}
+//---------------------------------------------------------------------
+*/
+       vectorFunctions *vf = new vectorFunctions();
+       fixBetweenPoints(5.0);
+       PossibleIntersections(InX,InY,InZ);
+       IntersectionPoints();
+       ErrorBetweenContours();
+       double promIn = vf->promVector(&_errorvector,false);
+
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       tempX.clear();
+       tempY.clear();
+       tempZ.clear();
+       
+       vf->copyVector(&_controlpointsX,&tempX);
+       vf->copyVector(&_controlpointsY,&tempY);
+       vf->copyVector(&_controlpointsZ,&tempZ);
+       _controlpointsX.clear();
+       _controlpointsY.clear();
+       _controlpointsZ.clear();
+
+       for(i=0; i<tempX.size(); i++)
+       {
+               if(i==_posn)
+               {
+                       _controlpointsX.push_back( (*InX)[_contIncontpos[_posn]] );
+                       _controlpointsY.push_back( (*InY)[_contIncontpos[_posn]] );
+                       _controlpointsZ.push_back( (*InZ)[_contIncontpos[_posn]] );
+               }
+               else
+               {
+                       _controlpointsX.push_back( tempX[i] );
+                       _controlpointsY.push_back( tempY[i] );
+                       _controlpointsZ.push_back( tempZ[i] );
+               }
+       }
+
+       fixBetweenPoints(5.0);
+       PossibleIntersections(InX,InY,InZ);
+       IntersectionPoints();
+       ErrorBetweenContours();
+       double promactualIn = vf->promVector(&_errorvector,false);
+       double prom;
+       double promactual;
+       
+       int posact;
+       int pos1;
+       double prom1final;
+       int pos2;
+       double prom2final;
+
+       //DIRECTION 1
+       int direction = 1;
+       posact = _posn;
+       prom = -1;
+       promactual = promactualIn;
+       _controlpointsX.clear();
+       _controlpointsY.clear();
+       _controlpointsZ.clear();
+       for(i=0; promactual > prom; i++)
+       {
+               prom = promactual;
+               for(i=0; i<tempX.size(); i++)
+               {
+                       if(i==_posn)
+                       {
+                               _controlpointsX.push_back( (*InX)[_contIncontpos[posact]] );
+                               _controlpointsY.push_back( (*InY)[_contIncontpos[posact]] );
+                               _controlpointsZ.push_back( (*InZ)[_contIncontpos[posact]] );
+                       }
+                       else
+                       {
+                               _controlpointsX.push_back( tempX[i] );
+                               _controlpointsY.push_back( tempY[i] );
+                               _controlpointsZ.push_back( tempZ[i] );
+                       }
+               }
+               if(direction == 1)
+               {
+                       posact = posact+1;
+               }
+               if(direction == -1)
+               {
+                       posact = posact-1;
+               }
+               fixBetweenPoints(5.0);
+               PossibleIntersections(InX,InY,InZ);
+               IntersectionPoints();
+               ErrorBetweenContours();
+               promactual = vf->promVector(&_errorvector,false);
+//printf("\n The point in the position %d, has moved %d times",_posn,i);
+       }
+       pos2 = posact;
+       prom2final = promactual;
+
+       delete vf;
+}
+//--------------------------------------------------------------------------------------------------------------------------------
+double AutoControlPoints::MoveAndAverage(int dir, std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       /*
+//PRINTF---------------------------------------------------------------
+       int i;
+       printf("\n CONTROL POINTS BEFORE MOVEMENT");
+       for(i=0; i<_controlpointsX.size(); i++)
+       {
+               printf("\n X = %f, Y = %f",_controlpointsX[i],_controlpointsY[i]);
+       }
+       for(i=0; i<_contIncontpos.size(); i++)
+       {
+               printf("\n contIncont pos = %d",_contIncontpos[i]);
+       }
+*/
+//IMPLEMENTATION-------------------------------------------------------
+       if( (_contIncontpos.size() != 0) && (_controlpointsX.size() != 0) )
+       {
+               vectorFunctions *vf = new vectorFunctions();
+               std::vector<double>::iterator itx;
+               std::vector<double>::iterator ity;
+               std::vector<double> tempX;
+               std::vector<double> tempY;
+               tempX.clear();
+               tempY.clear();
+               vf->copyVector(&_controlpointsX,&tempX);
+               vf->copyVector(&_controlpointsY,&tempY);
+               int i,j,pos = 0;
+               double prom1=0,promactual1=1;
+               double prom2=0,promactual2=1;
+               int h = 0;
+               int hh = 1;
+               if(_contIncontpos[h]>_contIncontpos[hh])
+               {
+                       itx = _controlpointsX.begin();
+                       ity = _controlpointsY.begin();
+                       for(i=_contIncontpos[h],j=_contIncontpos[h]; (i>_contIncontpos[hh]) && (promactual1>prom1); i--)
+                       {
+                               if(j == InX->size())
+                               {
+                                       j = 0;
+                               }
+                               prom1 = promactual1;
+                               *itx = (*InX)[j];
+                               *ity = (*InY)[j];
+                               printf("\n itx = %f, ity = %f", *itx,*ity);
+                               fixBetweenPoints(5.0);
+                               PossibleIntersections(InX,InY,InZ);
+                               IntersectionPoints();
+                               ErrorBetweenContours();
+                               promactual1 = vf->promVector(&_errorvector,false);
+                               j++;
+                       }
+               }
+               if(_contIncontpos[h]<_contIncontpos[hh])
+               {
+                       itx = _controlpointsX.begin();
+                       ity = _controlpointsY.begin();
+                       for(i=_contIncontpos[h],j=_contIncontpos[h]; (i<_contIncontpos[hh]) && (promactual1>prom1); i++)
+                       {
+                               if(j == -1)
+                               {
+                                       j = InX->size()-1;
+                               }
+                               prom1 = promactual1;
+                               *itx = (*InX)[j];
+                               *ity = (*InY)[j];
+                               printf("\n itx = %f, ity = %f", *itx,*ity);
+                               fixBetweenPoints(5.0);
+                               PossibleIntersections(InX,InY,InZ);
+                               IntersectionPoints();
+                               ErrorBetweenContours();
+                               promactual1 = vf->promVector(&_errorvector,false);
+                               j--;
+                       }
+               }
+               delete vf;
+       }
+       return 99999;
+}
+//--------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::MoveControlPoints(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       ControlInContour(InX,InY,InZ);
+       NearMaxError2Control();
+       MoveAndAverage(1,InX,InY,InZ);
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetNewPoints( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ )
+{
+       vectorFunctions *vf = new vectorFunctions();
+       double prom,maxerror;
+       
+       InterCircle(InX,InY,InZ);
+       maxminLocal();
+       fixBetweenPoints(5.0);
+       PossibleIntersections(InX,InY,InZ);
+       IntersectionPoints();
+       ErrorBetweenContours();
+       prom = vf->promVector(&_errorvector,false);
+       vf->maxVector(&_errorvector,&maxerror);
+printf("\n");
+       if( maxerror>3.0 )
+       {
+               _controlpointsX.clear();
+               _controlpointsY.clear();
+               _controlpointsZ.clear();
+               vf->copyVector(&_minmaxlocalX,&_controlpointsX);
+               vf->copyVector(&_minmaxlocalY,&_controlpointsY);
+               for(int i=0; i<_minmaxlocalX.size(); i++)
+               {
+                       _controlpointsZ.push_back( (*InZ)[0] );
+               }
+               fixBetweenPoints(5.0);
+               PossibleIntersections(InX,InY,InZ);
+               IntersectionPoints();
+               ErrorBetweenContours();
+               prom = vf->promVector(&_errorvector,false);
+               vf->maxVector(&_errorvector,&maxerror);
+printf("\n");
+       }
+
+       std::vector<double> cpX;
+       std::vector<double> cpY;
+       std::vector<double> cpZ;
+       cpX.clear();
+       cpY.clear();
+       cpZ.clear();
+       vf->copyVector(&_controlpointsX,&cpX);
+       vf->copyVector(&_controlpointsY,&cpY);
+       vf->copyVector(&_controlpointsZ,&cpZ);
+       int i;
+
+       for(i=0; (i<10)&&(maxerror>0.5)&&(prom>0.15); i++ )
+       {
+               AddControlPoint(true);
+               fixBetweenPoints(5.0);
+               PossibleIntersections(InX,InY,InZ);
+               IntersectionPoints();
+               ErrorBetweenContours();
+               prom = vf->promVector(&_errorvector,false);
+               vf->maxVector(&_errorvector,&maxerror);
+               printf("\n %d ",i);
+       }
+
+       if(i == 10)
+       {
+               _controlpointsX.clear();
+               _controlpointsY.clear();
+               _controlpointsZ.clear();
+               int inicontrolpoints = cpX.size();
+               double inipercentage = (inicontrolpoints*100)/InX->size();
+               int h=0;
+               if(inicontrolpoints<10)
+               {
+                       int points = (int)((inipercentage*3*InX->size())/100);
+                       for (int i=0; i<InX->size(); i++, h++)
+                       {
+                               if( h == points )
+                               {
+                                       _controlpointsX.push_back( (*InX)[i] );
+                                       _controlpointsY.push_back( (*InY)[i] );
+                                       _controlpointsZ.push_back( (*InZ)[i] );
+                                       h = 0;
+                               }
+                       }
+               }
+               if(inicontrolpoints>=10)
+               {
+                       int points = (int)((inipercentage*2*InX->size())/100);
+                       for (int i=0; i<InX->size(); i++, h++)
+                       {
+                               if( h == points )
+                               {
+                                       _controlpointsX.push_back( (*InX)[i] );
+                                       _controlpointsY.push_back( (*InY)[i] );
+                                       _controlpointsZ.push_back( (*InZ)[i] );
+                                       h = 0;
+                               }
+                       }
+               }
+       }
+/*
+       fixBetweenPoints(5.0);
+       PossibleIntersections(InX,InY,InZ);
+       IntersectionPoints();
+       ErrorBetweenContours();
+       prom = vf->promVector(&_errorvector,false);
+       vf->maxVector(&_errorvector,&maxerror);
+
+
+printf("\n Error Average  = %f",prom);
+printf("\n Error Max  = %f",maxerror);
+       AddControlPoint(false);
+*/
+/*
+       //if( (prom>1) || (maxerror>2))
+       if( prom>0.2 )
+       {
+printf("\n Error Average is grater than 1 !!");
+               MoveControlPoints(InX,InY,InZ);
+       }
+*/
+       delete vf;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetInitialNewPoints(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ )
+{
+       vectorFunctions *vf = new vectorFunctions();
+       double prom,maxerror;
+       
+       InterCircle(InX,InY,InZ);
+       maxminLocal();
+       fixBetweenPoints(5.0);
+       PossibleIntersections(InX,InY,InZ);
+       IntersectionPoints();
+       ErrorBetweenContours();
+       prom = vf->promVector(&_errorvector,false);
+       vf->maxVector(&_errorvector,&maxerror);
+       
+       if( maxerror>3.0 )
+       {
+               _controlpointsX.clear();
+               _controlpointsY.clear();
+               _controlpointsZ.clear();
+               vf->copyVector(&_minmaxlocalX,&_controlpointsX);
+               vf->copyVector(&_minmaxlocalY,&_controlpointsY);
+               for(int i=0; i<_minmaxlocalX.size(); i++)
+               {
+                       _controlpointsZ.push_back( (*InZ)[0] );
+               }
+               fixBetweenPoints(5.0);
+               PossibleIntersections(InX,InY,InZ);
+               IntersectionPoints();
+               ErrorBetweenContours();
+               prom = vf->promVector(&_errorvector,false);
+               vf->maxVector(&_errorvector,&maxerror);
+       }
+
+       std::vector<double> cpX;
+       std::vector<double> cpY;
+       std::vector<double> cpZ;
+       cpX.clear();
+       cpY.clear();
+       cpZ.clear();
+       vf->copyVector(&_controlpointsX,&cpX);
+       vf->copyVector(&_controlpointsY,&cpY);
+       vf->copyVector(&_controlpointsZ,&cpZ);
+
+       double promini = prom; 
+
+       int i;
+       for(i=0; (i<10)&&(maxerror>0.5)&&(prom>0.15); i++ )
+       {
+               AddControlPoint(true);
+               fixBetweenPoints(5.0);
+               PossibleIntersections(InX,InY,InZ);
+               IntersectionPoints();
+               ErrorBetweenContours();
+               prom = vf->promVector(&_errorvector,false);
+               vf->maxVector(&_errorvector,&maxerror);
+       }
+
+       if( i==10 || prom > promini)
+       {
+               _controlpointsX.clear();
+               _controlpointsY.clear();
+               _controlpointsZ.clear();
+               vf->copyVector(&cpX,&_controlpointsX);
+               vf->copyVector(&cpY,&_controlpointsY);
+               vf->copyVector(&cpZ,&_controlpointsZ);
+       }
+       delete vf;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::CalculeControlPoints(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+
+       _controlpointsX.clear();
+       _controlpointsY.clear();
+       _controlpointsZ.clear();
+       _controlpointsZ.push_back((*InZ)[0]);
+       GetNewPoints( InX,InY,InZ );
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::CalculeInitialControlPoints(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+
+       _controlpointsX.clear();
+       _controlpointsY.clear();
+       _controlpointsZ.clear();
+       _controlpointsZ.push_back((*InZ)[0]);
+       GetInitialNewPoints( InX,InY,InZ );
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetControlPoints(std::vector<double>*OutX, std::vector<double>*OutY, std::vector<double>*OutZ)
+{
+       vectorFunctions *vf = new vectorFunctions();
+       OutX->clear();
+       OutY->clear();
+       OutZ->clear();
+       vf->copyVector(&_controlpointsX,OutX);
+       vf->copyVector(&_controlpointsY,OutY);
+       vf->copyVector(&_controlpointsZ,OutZ);
+       delete vf;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::GetInitialControlPoints(std::vector<double>*OutX, std::vector<double>*OutY, std::vector<double>*OutZ)
+{
+       vectorFunctions *vf = new vectorFunctions();
+       OutX->clear();
+       OutY->clear();
+       OutZ->clear();
+       vf->copyVector(&_controlpointsX,OutX);
+       vf->copyVector(&_controlpointsY,OutY);
+       vf->copyVector(&_controlpointsZ,OutZ);
+       delete vf;
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------
+void AutoControlPoints::SetNumSplineInterpolation(int num)
+{
+       _numspline = num;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/AutoControlPoints.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/AutoControlPoints.h
new file mode 100644 (file)
index 0000000..e0bad6b
--- /dev/null
@@ -0,0 +1,112 @@
+#ifndef __AutoControlPoints_h_INCLUDED__
+#define __AutoControlPoints_h_INCLUDED__
+
+#include "manualContour.h"
+#include "Propagation.h"
+#include "vectorFunctions.h"
+
+class AutoControlPoints : Vector
+{
+       public:
+                       AutoControlPoints();
+                       ~AutoControlPoints();           
+                       int GetSizeVector       ( std::vector<double>*Vector );
+
+                       void PointLeft          ( std::vector<double>*IndX, std::vector<double>*InY, std::vector<double>*InZ, 
+                                                                 double* lex, double* ley, double* lez );
+                       void PointRight         ( std::vector<double>*IndX, std::vector<double>*InY, std::vector<double>*InZ, 
+                                                                 double* rix, double* riy, double* riz );
+                       void PointHigh          ( std::vector<double>*IndX, std::vector<double>*InY, std::vector<double>*InZ, 
+                                                                 double* hix, double* hiy, double* hiz );
+                       void PointLow           ( std::vector<double>*IndX, std::vector<double>*InY, std::vector<double>*InZ, 
+                                                                 double* lox, double* loy, double* loz );
+                       void TwoPoints          ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       
+                       void Intersection       ( double x01, double y01, double x02, double y02, double mn, double m2, double* x, double* y );
+                       void InterBetweenContours                       ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void GetInterBetweenContours            ( std::vector<Vector>*interVX, std::vector<Vector>*interVY );
+                       void IntersectionPoints                         ( );
+                       void GetIntersectionPoints                      ( std::vector<Vector>*interVX, std::vector<Vector>*interVY );
+                       void GetErrorBetweenContours            ( std::vector<double>*vec );
+                       void CalculeControlPoints                       ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void GetControlPoints                           ( std::vector<double>*OutX, std::vector<double>*OutY, std::vector<double>*OutZ );
+                       void CalculeInitialControlPoints        ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void GetInitialControlPoints            ( std::vector<double>*OutX, std::vector<double>*OutY, std::vector<double>*OutZ );
+                       void SetNumSplineInterpolation          ( int num ); 
+       
+       private:
+                       void ChargeSpline                                       ( );
+                       double  Slope                                           ( double x0, double y0, double x1, double y1 );
+                       double  Normal                                          ( double x0, double y0, double* m, double xi );
+                       void    CircleCenter                            ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ, double *cx, double *cy, double *r );
+                       void    CirclePoints                            ( double cx, double cy, double r, double grad, double *x, double *y );  
+                       void    InterCircle                                     ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void    maxminLocal                                     ( );
+                       void    fixBetweenPoints                        ( double val );
+                       void    ErrorBetweenContours            ( );
+                       void    AddControlPoint                         ( bool activate );
+                       void    InterBetweenControl                     ( );
+                       void    fixBetweenControl                       ( );
+                       void    PossibleIntersections           ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void    ControlInContour                        ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void    NearMaxError2Control            ( );
+                       void    MoveControlPointInContour       ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       double  MoveAndAverage                          ( int dir, std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void    MoveControlPoints                       ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void    GetNewPoints                            ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void    GetInitialNewPoints                     ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       
+                       int                                             _SizeVectorIn;
+                       std::vector<double>             _controlpointsX;
+                       std::vector<double>             _controlpointsY;
+                       std::vector<double>             _controlpointsZ;
+
+                       manualContourModel              *_mContourModel;
+                       int                                             _numspline;
+                       double                                  _pathsize;
+
+                       std::vector<double>             _chargecontrolpointsX;
+                       std::vector<double>             _chargecontrolpointsY;
+                       std::vector<double>             _chargecontrolpointsZ;
+
+                       std::vector<double>             _circleX;
+                       std::vector<double>             _circleY;
+                       std::vector<double>             _intercircleX;
+                       std::vector<double>             _intercircleY;
+                       std::vector<double>             _intercircleDist;
+                       std::vector<double>             _interbewteencircleX;
+                       std::vector<double>             _interbewteencircleY;
+                       std::vector<double>             _interbewteencircleDist;
+                       std::vector<int>                _interbewteencirclePos;
+
+                       std::vector<int>                _posmaxlocal;
+                       std::vector<int>                _posminlocal;
+                       std::vector<double>             _maxlocalX;
+                       std::vector<double>             _maxlocalY;
+                       std::vector<double>             _minlocalX;
+                       std::vector<double>             _minlocalY;
+                       std::vector<double>             _minmaxlocalX;
+                       std::vector<double>             _minmaxlocalY;
+                       std::vector<int>                _posminmaxlocal;
+
+                       std::vector<Vector>             _intervectorX;
+                       std::vector<Vector>             _intervectorY;
+                       std::vector<double>             _interpointsX;
+                       std::vector<double>             _interpointsY;
+                       int                                             _posA;
+                       int                                             _posB;
+
+                       double                                  _errorpos;
+                       std::vector<double>             _errorvector;
+                       
+                       std::vector<Vector>             _intervecXX;
+                       std::vector<Vector>             _intervecYY;
+                       std::vector<Vector>             _interitselfX;
+                       std::vector<Vector>             _interitselfY;
+
+                       int                                             _posn;
+                       std::vector<int>                _contIncontpos; 
+
+};
+
+#endif //  __AutoControlPoints_h_INCLUDED__
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourCrownWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourCrownWidget.cxx
new file mode 100644 (file)
index 0000000..ba64844
--- /dev/null
@@ -0,0 +1,686 @@
+
+#include "ContourCrownWidget.h"
+
+#include <vtkImageMapToColors.h>
+#include <vtkImageActor.h>
+
+
+
+//----------------------------------------------------------------------
+  wxMaracasCoutourTool::wxMaracasCoutourTool(wxWindow *parent, wxVtkBaseView *wxvtkbaseview, vtkImageData* imagedata)
+    : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+  {
+//EED    this->mbbtkContourCrown       = contourcrown;
+    this->imagedata                    = imagedata;
+       this->wxvtkbaseview             = wxvtkbaseview;
+       wxPanel *panel                  = this;
+    wxSizer *sizer                     = NULL;
+       
+       InitVtkImagesResult();
+
+        vtkLookupTable *table = vtkLookupTable::New();
+//      table->SetAlphaRange(128,255);
+     table->SetRange(0, 255); // image intensity range
+//   table->SetValueRange(0.0, 1.0); // from black to white
+     table->SetValueRange(0.0, 255.0); // from black to white
+
+        table->SetTableValue (0, 1.0 , 1.0 , 1.0 , 0.1 );
+        table->SetTableValue (255, 1.0 , 1.0 , 0.0 , 0.1);
+
+//      table->SetTableValue (0, 0.0 , 0.0 , 1.0 , 0.35 );
+//      table->SetTableValue (255, 1.0 , 0.0 , 0.0 , 0.10);
+
+     table->SetSaturationRange(0.0, 0.0); // no color saturation
+     table->SetRampToLinear();
+     table->Build();
+
+       vtkImageMapToColors  *mapperImage = vtkImageMapToColors::New();
+       mapperImage->SetLookupTable(table);
+       mapperImage->SetInput( imagedataMaskResult );
+       vtkImageActor *actorImage       = vtkImageActor::New();
+       actorImage->SetInput( mapperImage->GetOutput() );
+       actorImage->SetOpacity(1);
+
+       wxvtkbaseview->GetRenderer()->AddActor(actorImage);
+
+       // Widget interface
+       wxButton *btnContourA   = new wxButton( panel, -1, _T("Crown Extern"));
+       wxButton *btnContourB   = new wxButton( panel, -1, _T("Crown Intern"));
+       wxButton *btnContourAB  = new wxButton( panel, -1, _T("Crown Extern and Intern"));
+
+//JSTG 21-03-08 --------------------------------------------------------------------
+       wxButton *btnSaveContour                = new wxButton( panel, -1, _T("Save Contour"));
+       wxButton *btnSaveControlPoints  = new wxButton( panel, -1, _T("Save Control Points"));
+//JSTG 11-04-08
+       wxButton *btnEreaseLastContour  = new wxButton( panel, -1, _T("Erease Last Contour"));
+       wxButton *btnEreaseLastCP               = new wxButton( panel, -1, _T("Erease Last Control Points"));
+//----------------------------------------------------------------------------------
+
+       wxFlexGridSizer *sizer1 = new wxFlexGridSizer(10); //Original Value = 10
+    sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
+
+    Connect(btnContourA->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::OnContourA  );
+    Connect(btnContourB->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::OnContourB  );
+    Connect(btnContourAB->GetId()      , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::OnContourAB );
+
+//JSTG 21-03-08 ---------------------------------------------------------------------
+       Connect(btnSaveContour->GetId(), wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::OnSaveContour );
+       Connect(btnSaveControlPoints->GetId(), wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::OnSaveControlPoints );
+//JSTG 11-04-08
+       Connect(btnEreaseLastContour->GetId(), wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::EreaseLastContour );
+       Connect(btnEreaseLastCP->GetId(), wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxMaracasCoutourTool::EreaseLastCP );        
+//-----------------------------------------------------------------------------------
+
+    sizer1->Add(btnContourA);
+    sizer1->Add(btnContourB);
+    sizer1->Add(btnContourAB);
+
+//JSTG 21-03-08 --------------------
+       sizer1->Add(btnSaveContour);
+       sizer1->Add(btnSaveControlPoints);
+//JSTG 11-04-08
+       sizer1->Add(btnEreaseLastContour);
+       sizer1->Add(btnEreaseLastCP);
+//----------------------------------   
+       sizer = sizer1;
+       panel   ->      SetSizer(sizer);
+    panel      ->      SetAutoLayout(true);
+    panel      ->      Layout();  
+       
+}
+
+  // ------------------------------------------------------------------------
+
+  wxMaracasCoutourTool::~wxMaracasCoutourTool()
+  {
+  }
+
+  // ------------------------------------------------------------------------
+  wxVtkBaseView *wxMaracasCoutourTool::GetWxVtkBaseView()
+       {
+               return this->wxvtkbaseview;
+       }
+
+
+  // ------------------------------------------------------------------------
+
+  void wxMaracasCoutourTool::ConfigureVTK()
+  {
+         double spc[3];
+         this->imagedata->GetSpacing(spc);
+
+       // Contorno 1
+       _manContourControl_1    = new manualContourControler();
+       _mContourModel_1                = new manualContourModel();
+       _mViewContour_1                 = new manualViewContour();
+       _mViewContour_1->SetModel( _mContourModel_1 );
+       _mViewContour_1->SetWxVtkBaseView( this->wxvtkbaseview );
+       _mViewContour_1->SetRange( 2 );
+       _mViewContour_1->SetZ( 1000 );
+
+//JSTG 18-06-07
+       _mContourModel_1->SetNumberOfPointsSpline(100);
+
+
+//EED 3 oct 2006
+       _mViewContour_1->SetSpacing(spc);
+
+
+//EED 3 oct 2006
+       _mViewContour_1->SetColorNormalContour(0, 0, 1);
+       _mViewContour_1->SetColorEditContour(0.5, 0.5, 0.5);
+
+
+       _manContourControl_1->SetModelView( _mContourModel_1 , _mViewContour_1 );
+       this->wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
+       _manContourControl_1->CreateNewManualContour();
+       _manContourControl_1->SetActive(false);
+       _mViewContour_1->RefreshContour();
+
+
+       // Contorno 2
+       _manContourControl_2    = new manualContourControler();
+       _mContourModel_2                = new manualContourModel();
+       _mViewContour_2                 = new manualViewContour();
+       _mViewContour_2->SetModel( _mContourModel_2 );
+       _mViewContour_2->SetWxVtkBaseView( this->wxvtkbaseview );
+       _mViewContour_2->SetRange( 2 );
+       _mViewContour_2->SetZ( 1000 );
+
+//EED 3 oct 2006
+       _mViewContour_2->SetSpacing(spc);
+
+//EED 3 oct 2006
+       _mViewContour_2->SetColorNormalContour(1, 0, 0);
+       _mViewContour_2->SetColorEditContour(0.5, 0.5, 0.5);
+
+
+       _manContourControl_2->SetModelView( _mContourModel_2 , _mViewContour_2 );
+       this->wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_2 );
+       _manContourControl_2->CreateNewManualContour();
+       _manContourControl_2->SetActive(false);
+       _mViewContour_2->RefreshContour();
+
+//     Refresh();      
+
+//JSTG 16-06-08
+       _contprop = new ContourPropagation();
+ }
+
+//JSTG 26-02-08 -------------------------------------------------------------------------------------------------------------
+  void wxMaracasCoutourTool::SetControlPoints(  std::vector<double> *InVectorX, 
+                                                                                               std::vector<double> *InVectorY, 
+                                                                                               std::vector<double> *InVectorZ )
+  {
+       int lstSize;
+       if (InVectorX!=NULL)
+       {
+               int i,size=InVectorX->size();
+               if (size!=0)
+               {
+                       _mContourModel_1->DeleteAllPoints();
+                       _mViewContour_1->DeleteContour();
+
+                       for (i=0;i<size;i++)
+                       {
+                               lstSize = _mContourModel_1->AddPoint( (*InVectorX)[i] , (*InVectorY)[i] , (*InVectorZ)[i] );
+                               _mViewContour_1->AddPoint();
+                       }
+                       //_manContourControl_1->CreateNewManualContour();
+                       //_manContourControl_1->SetActive(true);
+                       _mViewContour_1->CreateNewContour();
+                       _mContourModel_1->UpdateSpline();
+                       _mViewContour_1->RefreshContour();
+                       //_mViewContour_1->Refresh ();
+               } 
+        } 
+  }
+
+// JSTG 26-02-08 ------------------------------------------------------------------------------
+  void wxMaracasCoutourTool::GetSplinePoints(   std::vector<double> *pLstContourX,
+                                                                                               std::vector<double> *pLstContourY,
+                                                                                               std::vector<double> *pLstContourZ  )
+  {
+         int i;
+         double x,y,z;
+         _mContourModel_1->UpdateSpline();
+         
+         for(i=0; i<_mContourModel_1->GetNumberOfPointsSpline(); i++)
+         {
+               _mContourModel_1->GetSpline_i_Point( i, &x, &y, &z );
+               pLstContourX->push_back(x);
+               pLstContourY->push_back(y);
+               //pLstContourY->push_back(z);                   //Fake Z -> For Visualization
+               pLstContourZ->push_back(_zz);                   //True Z -> For processing
+         }
+  }
+//---------------------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------
+void wxMaracasCoutourTool::OnContourA(wxCommandEvent& event)
+{
+       _manContourControl_1 -> SetActive(true);
+       _manContourControl_2 -> SetActive(false);
+}
+//------------------------------------------------------------------------
+void wxMaracasCoutourTool::OnContourB(wxCommandEvent& event)
+{
+       _manContourControl_1 -> SetActive(false);
+       _manContourControl_2 -> SetActive(true);
+}
+//------------------------------------------------------------------------
+void wxMaracasCoutourTool::OnContourAB(wxCommandEvent& event)
+{
+       _manContourControl_1 -> SetActive(true);
+       _manContourControl_2 -> SetActive(true);
+}
+
+//------------------------------------------------------------------------
+void wxMaracasCoutourTool::GetMinMaxPoint(int *minPoint, 
+                                                                                 int *maxPoint, 
+                                                                                 manualViewBaseContour *manualviewbaseecontour,
+                                                                                 manualContourModel *manualcontourmodel
+                                                                                 )
+{
+       int i;
+       int     np  = manualviewbaseecontour->GetNumberOfPoints( );  // number of control points
+
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+       //int nps = manualviewbaseecontour->GetNumberOfPointsSpline(); // number of points in the spline
+       int nps = manualcontourmodel->GetNumberOfPointsSpline(); // number of points in the spline
+//------------------------------------------------------------------------------------------------------
+       
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+       //double x,y,z,t;
+       double x,y,z;
+       //double delta=( double ) ( np  ) / ( double ) ( nps  );
+       manualcontourmodel->UpdateSpline();
+       for (i=0; i<nps; i++)
+       {
+               //t= delta * (double)i;
+               //manualcontourmodel->GetSplinePoint(t,x,y,z);
+               manualcontourmodel->GetSpline_i_Point(i,&x,&y,&z);
+               if (x<minPoint[0]){ minPoint[0]=(int)x; }
+               if (y<minPoint[1]){ minPoint[1]=(int)y; }
+               if (x>maxPoint[0]){ maxPoint[0]=(int)x; }
+               if (y>maxPoint[1]){ maxPoint[1]=(int)y; }
+       }
+//------------------------------------------------------------------------------------------------------
+}
+
+//------------------------------------------------------------------------
+
+int wxMaracasCoutourTool::AnalisisContourInside(int x, 
+                                                                                               int y, 
+                                                                                               manualViewBaseContour *manualviewbaseecontour,
+                                                                                               manualContourModel *manualcontourmodel
+                                                                                               )
+{
+       int result = 0;
+       int i;
+       int     np  = manualviewbaseecontour->GetNumberOfPoints( );  // number of control points
+
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+       //int nps = manualviewbaseecontour->GetNumberOfPointsSpline(); // number of points in the spline
+       int nps = manualcontourmodel->GetNumberOfPointsSpline(); // number of points in the spline
+       //double x1,y1,z1,x2,y2,z2,t;
+       double x1,y1,z1,x2,y2,z2;
+       double xx1, yy1,xx2, yy2;
+       //double delta=( double ) ( np  ) / ( double ) ( nps  );
+       manualcontourmodel->UpdateSpline();
+//------------------------------------------------------------------------------------------------------
+       double d;
+       bool ok;
+       if (np>=2)
+       {
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+               nps--;
+               //manualcontourmodel->GetSplinePoint(0,x1,y1,z1);
+               manualcontourmodel->GetSpline_i_Point(0,&x1,&y1,&z1);
+               for (i=1; i<=nps; i++)
+               {
+                       ok=false;
+                       //t= delta * (double)(i%nps);
+                       //manualcontourmodel->GetSplinePoint(t,x2,y2,z2);
+                       manualcontourmodel->GetSpline_i_Point(i,&x2,&y2,&z2);
+//------------------------------------------------------------------------------------------------------
+                       //by triangle similarity
+                       if ( ((y1<y2)&&(y>=y1)&&(y<y2)) || ((y1>y2)&&(y<=y1)&&(y>y2)) )
+                       {
+                               if (y1<y2) { xx1=x1; yy1=y1; xx2=x2; yy2=y2;} else { xx1=x2; yy1=y2; xx2=x1; yy2=y1; } 
+                               d = ( fabs(xx2-xx1)*(y-yy1) ) / (yy2-yy1) ;
+                               if (  ((xx1<xx2)&&(x<(xx1+d)))  ||  ((xx1>xx2)&&(x<(xx1-d)))  ) { result++; }
+                       }
+                       x1=x2; y1=y2; z1=z2;
+               }
+       }
+       return result;
+}
+
+//------------------------------------------------------------------------
+
+
+bool wxMaracasCoutourTool::isInside(int x, int y)
+{
+       bool result=false;
+
+       int ext[6];
+       imagedataValueResult->GetExtent(ext);
+
+       if ((x>=0) && (x<=ext[1]) && (y>=0) && (y<=ext[3]))
+       {
+               int numberLeftA=AnalisisContourInside(x,y,_mViewContour_1, _mContourModel_1); 
+               int numberLeftB=AnalisisContourInside(x,y,_mViewContour_2, _mContourModel_2);
+               if ( (numberLeftA+numberLeftB) % 2 ==1){        result = true;  } 
+       }
+
+       return result;
+}
+
+//------------------------------------------------------------------------
+
+double wxMaracasCoutourTool::GetDataValue(int x, int y)
+{
+       unsigned short *p;
+       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview;
+       int z = (int)wxvtk2dbaseview->GetVtkBaseData()->GetZ();
+       //JSTG 13-03-08-----
+       _zz = z;
+       //------------------
+       p = (unsigned short *)imagedata->GetScalarPointer(x,y,z);
+       return (double)(*p);
+}
+
+//------------------------------------------------------------------------
+
+void wxMaracasCoutourTool::PutVtkImageDataResultValue( int x, int y, double value )
+{
+       unsigned short *pValue;
+       unsigned short *pMask;
+       pValue  = (unsigned short *)imagedataValueResult->GetScalarPointer(x,y,0);
+       pMask   = (unsigned short *)imagedataMaskResult->GetScalarPointer(x,y,0);
+       *pMask  = 255;
+       *pValue = (unsigned short)value;
+}
+
+//------------------------------------------------------------------------
+void wxMaracasCoutourTool::ResetImageResult()
+{
+       unsigned short *pValue;
+       unsigned short *pMask;
+       pValue  = (unsigned short *)imagedataValueResult->GetScalarPointer(0,0,0);
+       pMask   = (unsigned short *)imagedataMaskResult->GetScalarPointer(0,0,0);
+       
+       int ext[6];
+       imagedataValueResult->GetExtent(ext);
+
+       int i,size = (ext[1]-ext[0]+1) * (ext[3]-ext[2]+1); 
+       for(i=0; i<size; i++)
+       {
+               *pMask  = 0;
+               *pValue = 0;
+               pMask++;
+               pValue++;
+       }
+}
+//------------------------------------------------------------------------
+
+void wxMaracasCoutourTool::GetValuesInsideCrown(std::vector<double> *pLstValue,
+                                                                                               std::vector<double> *pLstValuePosX,
+                                                                                               std::vector<double> *pLstValuePosY,
+                                                                                               std::vector<double> *pLstValuePosZ)
+{
+  pLstValue->clear();
+  pLstValuePosX->clear();
+  pLstValuePosY->clear();
+  pLstValuePosZ->clear();
+  ResetImageResult();
+  
+       int minPoint[2];
+       int maxPoint[2];
+       int i,j;
+       double value;
+
+
+       minPoint[0]=999999;
+       minPoint[1]=999999;
+       maxPoint[0]=-999999;
+       maxPoint[1]=-999999;
+
+       GetMinMaxPoint(minPoint,maxPoint, _mViewContour_1, _mContourModel_1);
+       GetMinMaxPoint(minPoint,maxPoint, _mViewContour_2, _mContourModel_2);
+
+       for (j=minPoint[1]; j<maxPoint[1]; j++)
+       {
+               for (i=minPoint[0]; i<maxPoint[0]; i++)
+               {
+                       if (isInside(i,j)==true)
+                       {
+                               value = GetDataValue(i,j);
+                               PutVtkImageDataResultValue(i,j,  value );
+                               pLstValue               -> push_back( value );
+                               pLstValuePosX   -> push_back( i );
+                               pLstValuePosY   -> push_back( j );
+                               pLstValuePosZ   -> push_back( -1 );
+                       } // if
+               } // for
+       } // for
+
+       imagedataValueResult->Modified();
+       imagedataMaskResult->Modified();
+}
+
+//------------------------------------------------------------------------
+
+vtkImageData *wxMaracasCoutourTool::GetVtkImageValueResult()
+{
+       return imagedataValueResult;
+}
+//------------------------------------------------------------------------
+vtkImageData *wxMaracasCoutourTool::GetVtkImageMaskResult()
+{
+       return imagedataMaskResult;
+}
+// ------------------------------------------------------------------------
+void wxMaracasCoutourTool::InitVtkImagesResult()
+  {
+         int ext[6];
+         int newDim[3];
+         double spc[3];
+         int scalartype;
+
+         imagedata->GetSpacing(spc);
+         imagedata->GetExtent(ext);
+         newDim[0]=ext[1]-ext[0]+1;
+         newDim[1]=ext[3]-ext[2]+1;
+         newDim[2]=1;
+         scalartype = imagedata->GetScalarType();
+
+         imagedataValueResult = vtkImageData::New();
+//       imagedataValueResult->SetScalarType(scalartype);
+         imagedataValueResult->SetScalarTypeToUnsignedShort();
+         imagedataValueResult->SetSpacing(spc);
+         imagedataValueResult->SetDimensions( newDim );
+         imagedataValueResult->AllocateScalars();
+
+         imagedataMaskResult  = vtkImageData::New();
+//       imagedataMaskResult->SetScalarType(scalartype);
+         imagedataMaskResult->SetScalarTypeToUnsignedShort();
+         imagedataMaskResult->SetSpacing(spc);
+         imagedataMaskResult->SetDimensions( newDim );
+         imagedataMaskResult->AllocateScalars();
+
+  }
+
+//JSTG 21-03-08 -------------------------------------------------------------------
+void wxMaracasCoutourTool::OnSaveContour(wxCommandEvent& event)
+{
+       //For write the actual time and date
+       /*
+       time_t timer;
+       struct tm *tblock;
+       timer = time(NULL);
+       tblock = localtime(&timer);
+       */
+
+       FILE *fd;
+       
+       //WHERE CAN I MAKE THEM DELETE!!!
+       _mpoint = new manualPoint();
+
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       tempX.clear();
+       tempY.clear();
+       tempZ.clear();
+
+       int size = _mContourModel_1->GetNumberOfPointsSpline();
+       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview;
+       int z = (int)wxvtk2dbaseview->GetVtkBaseData()->GetZ();
+       double xx, yy, zz;
+
+       fd = fopen("C:/bbtk_JS/data/SavedContours.txt","a");
+       //fprintf(fd,"Date %s", asctime(tblock) );
+       fprintf(fd,"\nPointsContour %d", size );
+       for(int i=0; i<size; i++)
+       {
+               _mContourModel_1->GetSpline_i_Point(i,&xx,&yy,&zz);
+               fprintf(fd,"\n%f %f %d",xx,yy,z);       //z -> Contain the true value || zz -> Contain the cheating value for visualitation 
+               tempX.push_back(xx);
+               tempY.push_back(yy);
+               tempZ.push_back(z);
+       }
+       fclose(fd);
+
+//JSTG 16-06-08
+       _contprop->appendContour(&tempX,&tempY,&tempZ);
+}
+
+//JSTG 21-03-08 --------------------------------------------------------------------
+void wxMaracasCoutourTool::OnSaveControlPoints(wxCommandEvent& event)
+{
+       //For write the actual time and date
+       /*
+       time_t timer;
+       struct tm *tblock;
+       timer = time(NULL);
+       tblock = localtime(&timer);
+       */
+       FILE *fd;
+       _mpoint = new manualPoint();
+       int size = _mContourModel_1->GetSizeLstPoints();
+       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview;
+       int z = (int)wxvtk2dbaseview->GetVtkBaseData()->GetZ();
+
+       fd = fopen("C:/bbtk_JS/data/SavedManualPoints.txt","a");
+       //fprintf(fd,"Date %s", asctime(tblock) );
+       fprintf(fd,"\nNumberOfControlPoints %d", size );
+       for(int i=0; i<size; i++)
+       {
+               _mpoint = _mContourModel_1->GetManualPoint(i);
+               fprintf(fd,"\n%f %f %d",_mpoint->GetX(),_mpoint->GetY(),z);
+       }
+       fclose(fd);
+}
+//----------------------------------------------------------------------------------
+void wxMaracasCoutourTool::EreaseLastContour(wxCommandEvent& event)
+{
+       char firstline[30];
+       int     size = 0,i,j;
+       double x,y;
+       int z;          
+       
+       _tempCX.clear();
+       _tempCY.clear();
+       _tempCZ.clear();
+       _tempCPX.clear();
+       _tempCPY.clear();
+       _tempCPZ.clear();
+       _SizesC.clear();
+       _SizesCP.clear();
+
+       FILE* fd;
+       fd = fopen("C:/bbtk_JS/data/SavedContours.txt","r");
+       if(fd!=NULL)
+       {
+               while(!feof(fd))        
+               {
+                       fscanf(fd,"");
+                       fscanf(fd," %s %d",&firstline,&size);
+                       _SizesC.push_back(size);
+                       for(j=0; j<size; j++)
+                       {
+                               fscanf(fd,"%lf %lf %d",&x,&y,&z);
+                               _tempCX.push_back(x);
+                               _tempCY.push_back(y);
+                               _tempCZ.push_back(z);
+                       }
+               }
+       }
+       else
+       {
+               printf("\nJSTG - wxMaracasCoutourTool::EreaseLastContour - FILE NOT FOUND");
+       }
+       fclose(fd);
+
+       for(i=0; i<size; i++)
+       {
+               _tempCX.pop_back();
+               _tempCY.pop_back();
+               _tempCZ.pop_back();
+       }
+       _SizesC.pop_back();
+       
+       fd = fopen("C:/bbtk_JS/data/SavedContours.txt","w");
+       if(fd!=NULL)
+       {
+               int cont = 0;
+               for(i=0; i<_SizesC.size(); i++)
+               {
+                       fprintf(fd,"\nNumberOfPoints %d", _SizesC[i] );
+                       for(j=0; j<_SizesC[i]; j++)
+                       {
+                               fprintf(fd,"\n%f %f %d",_tempCX[j+cont],_tempCY[j+cont],_tempCZ[j+cont]);
+                       }
+                       cont = _SizesC[i];
+               }
+       }
+       else
+       {
+               printf("\nJSTG - wxMaracasCoutourTool::EreaseLastContour - FILE NOT FOUND");
+       }
+       fclose(fd);
+
+}
+//----------------------------------------------------------------------------------
+void wxMaracasCoutourTool::EreaseLastCP(wxCommandEvent& event)
+{
+       char firstline[30];
+       int     size = 0,i,j;
+       double x,y;
+       int z;          
+       
+       _tempCX.clear();
+       _tempCY.clear();
+       _tempCZ.clear();
+       _tempCPX.clear();
+       _tempCPY.clear();
+       _tempCPZ.clear();
+       _SizesC.clear();
+       _SizesCP.clear();
+
+       FILE* fd;
+       fd = fopen("C:/bbtk_JS/data/SavedManualPoints.txt","r");
+       if(fd!=NULL)
+       {
+               while(!feof(fd))        
+               {
+                       fscanf(fd,"");
+                       fscanf(fd," %s %d",&firstline,&size);
+                       _SizesC.push_back(size);
+                       for(j=0; j<size; j++)
+                       {
+                               fscanf(fd,"%lf %lf %d",&x,&y,&z);
+                               _tempCX.push_back(x);
+                               _tempCY.push_back(y);
+                               _tempCZ.push_back(z);
+                       }
+               }
+       }
+       else
+       {
+               printf("\nJSTG - wxMaracasCoutourTool::EreaseLastContour - FILE NOT FOUND");
+       }
+       fclose(fd);
+
+       for(i=0; i<size; i++)
+       {
+               _tempCX.pop_back();
+               _tempCY.pop_back();
+               _tempCZ.pop_back();
+       }
+       _SizesC.pop_back();
+       
+       fd = fopen("C:/bbtk_JS/data/SavedManualPoints.txt","w");
+       if(fd!=NULL)
+       {
+               int cont = 0;
+               for(i=0; i<_SizesC.size(); i++)
+               {
+                       fprintf(fd,"\nNumberOfControlPoints %d", _SizesC[i] );
+                       for(j=0; j<_SizesC[i]; j++)
+                       {
+                               fprintf(fd,"\n%f %f %d",_tempCX[j+cont],_tempCY[j+cont],_tempCZ[j+cont]);
+                       }
+                       cont = _SizesC[i];
+               }
+       }
+       else
+       {
+               printf("\nJSTG - wxMaracasCoutourTool::EreaseLastContour - FILE NOT FOUND");
+       }
+       fclose(fd);
+}
+//----------------------------------------------------------------------------------
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourCrownWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourCrownWidget.h
new file mode 100644 (file)
index 0000000..56a03d2
--- /dev/null
@@ -0,0 +1,112 @@
+
+#ifndef __ContourCrownWidget_h_INCLUDED_H__
+#define __ContourCrownWidget_h_INCLUDED_H__
+
+
+#include <manualContour.h>
+#include "mBarRange.h"
+
+//JSTG_14-06-08--------------------
+#include "ContourPropagation.h"
+//---------------------------------
+  
+
+
+  //--------------------------------------------------------------------------
+  class wxMaracasCoutourTool : public wxPanel
+  {
+  public:
+       wxMaracasCoutourTool( wxWindow *parent, wxVtkBaseView *wxvtkbaseview, vtkImageData* imagedata);
+    ~wxMaracasCoutourTool();
+       void OnContourA(wxCommandEvent &event);   
+       void OnContourB(wxCommandEvent &event);   
+       void OnContourAB(wxCommandEvent &event);   
+    void ConfigureVTK();
+
+       void GetValuesInsideCrown(      std::vector<double> *pLstValue,
+                                                               std::vector<double> *pLstValuePosX,
+                                                               std::vector<double> *pLstValuePosY,
+                                                               std::vector<double> *pLstValuePosZ);
+
+       wxVtkBaseView *GetWxVtkBaseView();
+//EED  void ProcessOutputs();
+       vtkImageData *GetVtkImageValueResult();
+       vtkImageData *GetVtkImageMaskResult();
+
+//JSTG 26-02-08 --------------------------------------------------------------------------------------------
+       void GetSplinePoints    (       std::vector<double> *pLstContourX,
+                                                               std::vector<double> *pLstContourY,
+                                                               std::vector<double> *pLstContourZ  );
+
+       void SetControlPoints   (       std::vector<double> *InVectorX,
+                                                               std::vector<double> *InVectorY, 
+                                                               std::vector<double> *InVectorZ );
+//JSTG 21-03-08 ----------------------------------------------
+       void OnSaveContour              ( wxCommandEvent &event );
+       void OnSaveControlPoints( wxCommandEvent &event );
+//JSTG 11-04-08 ----------------------------------------------
+    void EreaseLastContour     ( wxCommandEvent& event );
+       void EreaseLastCP               ( wxCommandEvent& event );
+//----------------------------------------------------------------------------------------------------------
+
+  private:
+       mBarRange               *mbarrange;
+//EED  ContourCrown    *mbbtkContourCrown;
+       vtkImageData    *imagedata;
+       vtkImageData    *imagedataValueResult;
+       vtkImageData    *imagedataMaskResult;
+       wxVtkBaseView   *wxvtkbaseview;
+
+//JSTG 26-02-08 ------------------------------------------
+       std::vector<double>             _tempCX;
+       std::vector<double>             _tempCY;
+       std::vector<int>                _tempCZ;
+       std::vector<int>                _SizesC;
+       std::vector<double>             _tempCPX;
+       std::vector<double>             _tempCPY;
+       std::vector<int>                _tempCPZ;
+       std::vector<int>                _SizesCP;
+       std::vector<double>             *pControlVectorX;
+       std::vector<double>             *pControlVectorY;
+       std::vector<double>             *pControlVectorZ;
+       int _zz;
+       manualPoint                             *_mpoint;
+//--------------------------------------------------------
+//JSTG_14-06-08-------------------------------------------
+       ContourPropagation              *_contprop;
+//--------------------------------------------------------
+
+       manualContourControler  *_manContourControl_1;
+       manualContourModel              *_mContourModel_1;
+       manualViewContour               *_mViewContour_1;
+
+       manualContourControler  *_manContourControl_2;
+       manualContourModel              *_mContourModel_2;
+       manualViewContour               *_mViewContour_2;
+
+       manualRoiControler              *_manRoiControl;
+       manualContourModel              *_mContourModel;
+       manualViewRoi                   *_mViewRoi;
+
+
+       bool isInside(int x, int y);
+       void GetMinMaxPoint(int *minPoint, int *maxPoint);
+       void GetMinMaxPoint(int *minPoint, 
+                                               int *maxPoint, 
+                                               manualViewBaseContour *manualviewbaseecontour,
+                                               manualContourModel *manualcontourmodel );
+       int AnalisisContourInside(      int x, 
+                                                               int y, 
+                                                               manualViewBaseContour *manualviewbaseecontour,
+                                                               manualContourModel *manualcontourmodel );
+       double GetDataValue(int x, int y);
+       void ResetImageResult();
+       void PutVtkImageDataResultValue( int x, int y, double value );
+       void InitVtkImagesResult();
+
+
+  };
+
+
+#endif  // __ContourCrownWidget_h_INCLUDED_H__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.cxx
new file mode 100644 (file)
index 0000000..acb9e78
--- /dev/null
@@ -0,0 +1,469 @@
+
+#include "ContourExtractData.h"
+
+
+//----------------------------------------------------------------------
+ContourExtractData::ContourExtractData( bool okImagesResults)
+  {
+    this->imagedata                    = NULL;
+       imagedataValueResult    = NULL;
+       imagedataMaskResult             = NULL;
+       this->okImagesResults   = okImagesResults;
+       _typeOperation                  = 0;
+  }
+
+  // ------------------------------------------------------------------------
+
+  ContourExtractData::~ContourExtractData()
+  {
+  }
+
+
+//----------------------------------------------------------------------
+void ContourExtractData::SetImage( vtkImageData* imagedata)
+  {
+    this->imagedata                    = imagedata;
+       if (this->okImagesResults==true){
+               InitVtkImagesResult();
+       }
+  }
+//----------------------------------------------------------------------
+void ContourExtractData::SetZtoBeAnalys( int z )
+  {
+       this->zImage                    = z;
+  }
+
+//------------------------------------------------------------------------
+  void ContourExtractData::SetLstManualContourModel( std::vector<manualContourModel*> lstManConMod)
+  {
+         this->lstManConMod = lstManConMod;
+  }
+
+
+//------------------------------------------------------------------------
+void ContourExtractData::GetMinMaxPoint(int *minPoint, 
+                                                                                 int *maxPoint, 
+                                                                                 manualContourModel *manualcontourmodel
+                                                                                 )
+{
+       int i;
+       int     np              = manualcontourmodel->GetSizeLstPoints( );  // number of control points
+
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+       //int nps = manualviewbaseecontour->GetNumberOfPointsSpline(); // number of points in the spline
+       int nps = manualcontourmodel->GetNumberOfPointsSpline(); // number of points in the spline
+//------------------------------------------------------------------------------------------------------
+       
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+       //double x,y,z,t;
+       double x,y,z;
+       //double delta=( double ) ( np  ) / ( double ) ( nps  );
+       manualcontourmodel->UpdateSpline();
+       for (i=0; i<nps; i++)
+       {
+               //t= delta * (double)i;
+               //manualcontourmodel->GetSplinePoint(t,x,y,z);
+               manualcontourmodel->GetSpline_i_Point(i,&x,&y,&z);
+               if (x<minPoint[0]){ minPoint[0]=(int)x; }
+               if (y<minPoint[1]){ minPoint[1]=(int)y; }
+               if (x>maxPoint[0]){ maxPoint[0]=(int)x; }
+               if (y>maxPoint[1]){ maxPoint[1]=(int)y; }
+       }
+//------------------------------------------------------------------------------------------------------
+}
+
+//------------------------------------------------------------------------
+void ContourExtractData::GetMinMaxPoint_Of_LstManConMod(       int *minPoint, 
+                                                                                       int *maxPoint
+                                                                               )
+
+{
+       int i,size = lstManConMod.size();
+       for(i=0 ; i<size ; i++)
+       {
+               GetMinMaxPoint(minPoint,maxPoint,lstManConMod[i]);
+       }
+}
+//------------------------------------------------------------------------
+
+int ContourExtractData::AnalisisContourInside(int x, 
+                                                                                               int y, 
+                                                                                               manualContourModel *manualcontourmodel
+                                                                                               )
+{
+       int result      = 0;
+       int i;
+       int     np              = manualcontourmodel->GetSizeLstPoints( );  // number of control points
+
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+       //int nps = manualviewbaseecontour->GetNumberOfPointsSpline(); // number of points in the spline
+       int nps = manualcontourmodel->GetNumberOfPointsSpline(); // number of points in the spline
+       //double x1,y1,z1,x2,y2,z2,t;
+       double x1,y1,z1,x2,y2,z2;
+       double xx1, yy1,xx2, yy2;
+       //double delta=( double ) ( np  ) / ( double ) ( nps  );
+       manualcontourmodel->UpdateSpline();
+//------------------------------------------------------------------------------------------------------
+       double d;
+       bool ok;
+//     if (np>=2)
+//     {
+// JSTG 26-02-08 ---------------------------------------------------------------------------------------
+               nps--;
+               //manualcontourmodel->GetSplinePoint(0,x1,y1,z1);
+               manualcontourmodel->GetSpline_i_Point(0,&x1,&y1,&z1);
+               for (i=1; i<=nps; i++)
+               {
+                       ok=false;
+                       //t= delta * (double)(i%nps);
+                       //manualcontourmodel->GetSplinePoint(t,x2,y2,z2);
+                       manualcontourmodel->GetSpline_i_Point(i,&x2,&y2,&z2);
+//------------------------------------------------------------------------------------------------------
+                       //by triangle similarity
+                       if ( ((y1<y2)&&(y>=y1)&&(y<y2)) || ((y1>y2)&&(y<=y1)&&(y>y2)) )
+                       {
+                               if (y1<y2) { xx1=x1; yy1=y1; xx2=x2; yy2=y2;} else { xx1=x2; yy1=y2; xx2=x1; yy2=y1; } 
+                               d = ( fabs(xx2-xx1)*(y-yy1) ) / (yy2-yy1) ;
+                               if (  ((xx1<xx2)&&(x<(xx1+d)))  ||  ((xx1>xx2)&&(x<(xx1-d)))  ) { result++; }
+                       } // if
+                       x1=x2; y1=y2; z1=z2;
+               } // for i
+//     } //if
+       return result;
+}
+
+//------------------------------------------------------------------------
+
+
+bool ContourExtractData::isInside(int x, int y, int typeOperation)
+{
+       bool result                             = false;
+       int numberLeft                  = 0;
+       int i,size                              = this->lstManConMod.size();
+       int numberInside        = 0;
+
+       int ext[6];
+       imagedata->GetExtent(ext);
+
+       if ((x>=0) && (x<=ext[1]) && (y>=0) && (y<=ext[3]))
+       {
+
+               if (typeOperation==0)  // AND  Intersection
+               {
+                       for (i=0;i<size;i++)
+                       {
+                               numberLeft =  AnalisisContourInside(x,y, lstManConMod[i] );
+                               if ( (numberLeft % 2) ==1){         numberInside++;  }
+                       }
+                       if ( numberInside == (size) ){ result=true; }
+               } // AND  Intersection
+
+
+               if (typeOperation==1)  // OR  All
+               {
+                       for (i=0;i<size;i++)
+                       {
+                               numberLeft =  AnalisisContourInside(x,y, lstManConMod[i] );
+                               if ( (numberLeft % 2) ==1){ result=true;  }
+                       }
+               } // OR  All
+
+               if (typeOperation==2)  // XOR  crown
+               {
+                       for (i=0;i<size;i++)
+                       {
+                               numberLeft = numberLeft + AnalisisContourInside(x,y, lstManConMod[i] );
+                       }
+                       if ( numberLeft % 2 ==1){       result = true;  } 
+               }// XOR  crown
+
+
+
+       }
+
+       return result;
+}
+
+//------------------------------------------------------------------------
+
+double ContourExtractData::GetDataValue(int x, int y, int z)
+{
+//     wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview;
+//     int z = (int)wxvtk2dbaseview->GetVtkBaseData()->GetZ();
+       //JSTG 13-03-08-----
+//EED OJO avec JS      _zz = z;
+       //------------------
+       double result;
+       void *p;
+       p = imagedata->GetScalarPointer(x,y,z);
+
+       if (imagedata->GetScalarType()==VTK_UNSIGNED_CHAR)
+       {       unsigned char *pp = (unsigned char*)p;
+               result = (double)(*pp);
+       }
+       if (imagedata->GetScalarType()==VTK_FLOAT)
+       {       float *pp = (float*)p;
+               result = (double)(*pp);
+       }
+       if (imagedata->GetScalarType()==VTK_SHORT)
+       {       short *pp = (short*)p;
+               result = (double)(*pp);
+       }
+       if (imagedata->GetScalarType()==VTK_UNSIGNED_SHORT)
+       {       unsigned short *pp = (unsigned short*)p;
+               result = (double)(*pp);
+       }
+       return result;
+}
+
+//------------------------------------------------------------------------
+
+void ContourExtractData::PutVtkImageDataResultValue( int x, int y, int z, double value )
+{
+       unsigned short *pValue;
+       unsigned short *pMask;
+       pValue  = (unsigned short *)imagedataValueResult->GetScalarPointer(x,y,z);
+       pMask   = (unsigned short *)imagedataMaskResult->GetScalarPointer(x,y,z);
+       *pMask  = 255;
+       *pValue = (unsigned short)value;
+}
+
+//------------------------------------------------------------------------
+void ContourExtractData::ResetImageResult(int z)
+{
+       if (okImagesResults==true)
+       {
+               unsigned short *pValue;
+               unsigned short *pMask;
+               pValue  = (unsigned short *)imagedataValueResult->GetScalarPointer(0,0,z);
+               pMask   = (unsigned short *)imagedataMaskResult->GetScalarPointer(0,0,z);
+               
+               int ext[6];
+               imagedataValueResult->GetExtent(ext);
+
+               int i,size = (ext[1]-ext[0]+1) * (ext[3]-ext[2]+1); 
+               for(i=0; i<size; i++)
+               {
+                       *pMask  = 0;
+                       *pValue = 0;
+                       pMask++;
+                       pValue++;
+               }// for
+       } // if
+}
+
+
+//------------------------------------------------------------------------
+void ContourExtractData::CalculateImageResult()
+{
+       if (okImagesResults==true)
+       {
+               ResetImageResult(zImage);
+
+               int minPoint[2];
+               int maxPoint[2];
+               int i,j;
+               double value;
+
+               minPoint[0] = 999999;
+               minPoint[1] = 999999;
+               maxPoint[0] = -999999;
+               maxPoint[1] = -999999;
+
+               GetMinMaxPoint_Of_LstManConMod(minPoint,maxPoint);
+               for (j=minPoint[1]; j<maxPoint[1]; j++)
+               {
+                       for (i=minPoint[0]; i<maxPoint[0]; i++)
+                       {
+                               if (isInside(i,j,_typeOperation)==true)
+                               {
+                                       value = GetDataValue(i,j,zImage);
+                                       PutVtkImageDataResultValue(i,j,zImage,  value );
+                               } // if
+                       } // for i
+               } // for j
+
+
+               imagedataValueResult->Modified();
+               imagedataMaskResult->Modified();
+       }
+
+}
+
+//------------------------------------------------------------------------
+void ContourExtractData::GetValuesInsideCrown(std::vector<double> *pLstValue,
+                                                                                               std::vector<double> *pLstValuePosX,
+                                                                                               std::vector<double> *pLstValuePosY,
+                                                                                               std::vector<double> *pLstValuePosZ)
+{
+       pLstValue->clear();
+       pLstValuePosX->clear();
+       pLstValuePosY->clear();
+       pLstValuePosZ->clear();
+
+//     if (okImagesResults==true)
+//     {
+//             ResetImageResult(zImage);
+//     }
+
+       int minPoint[2];
+       int maxPoint[2];
+       int i,j;
+       double value;
+
+
+       minPoint[0] = 999999;
+       minPoint[1] = 999999;
+       maxPoint[0] = -999999;
+       maxPoint[1] = -999999;
+
+       GetMinMaxPoint_Of_LstManConMod(minPoint,maxPoint);
+
+
+       for (j=minPoint[1]; j<maxPoint[1]; j++)
+       {
+               for (i=minPoint[0]; i<maxPoint[0]; i++)
+               {
+                       if (isInside(i,j,_typeOperation)==true)
+                       {
+                               value = GetDataValue(i,j,zImage);
+
+// Borrame
+//                             if (okImagesResults==true){
+//                                     PutVtkImageDataResultValue(i,j,zImage,  value );
+//                             }
+
+                               pLstValue               -> push_back( value );
+                               pLstValuePosX   -> push_back( i );
+                               pLstValuePosY   -> push_back( j );
+                               pLstValuePosZ   -> push_back( -1 );
+                       } // if
+               } // for
+       } // for
+
+
+// Borrame
+//     if (this->okImagesResults==true){
+//             imagedataValueResult->Modified();
+//             imagedataMaskResult->Modified();
+//     }
+
+
+}
+
+//------------------------------------------------------------------------
+
+vtkImageData *ContourExtractData::GetVtkImageValueResult()
+{
+       return imagedataValueResult;
+}
+//------------------------------------------------------------------------
+vtkImageData *ContourExtractData::GetVtkImageMaskResult()
+{
+       return imagedataMaskResult;
+}
+// ------------------------------------------------------------------------
+void ContourExtractData::InitVtkImagesResult()
+{
+         int ext[6];
+         int newDim[3];
+         double spc[3];
+         int scalartype;
+
+         imagedata->GetSpacing(spc);
+         imagedata->GetExtent(ext);
+         newDim[0]=ext[1]-ext[0]+1;
+         newDim[1]=ext[3]-ext[2]+1;
+         newDim[2]=ext[5]-ext[4]+1;
+         scalartype = imagedata->GetScalarType();
+
+         if (imagedataValueResult!=NULL)
+         {
+                 imagedataValueResult->Delete();
+         }
+         imagedataValueResult = vtkImageData::New();
+//       imagedataValueResult->SetScalarType(scalartype);
+         imagedataValueResult->SetScalarTypeToUnsignedShort();
+         imagedataValueResult->SetSpacing(spc);
+         imagedataValueResult->SetDimensions( newDim );
+         imagedataValueResult->AllocateScalars();
+
+         if (imagedataMaskResult!=NULL)
+         {
+                 imagedataMaskResult->Delete();
+         }
+         imagedataMaskResult  = vtkImageData::New();
+//       imagedataMaskResult->SetScalarType(scalartype);
+         imagedataMaskResult->SetScalarTypeToUnsignedShort();
+         imagedataMaskResult->SetSpacing(spc);
+         imagedataMaskResult->SetDimensions( newDim );
+         imagedataMaskResult->AllocateScalars();
+}
+
+
+
+//------------------------------------------------------------------------
+void ContourExtractData::Statistics( std::vector<double> *inputLstValue, 
+                                                                       int     grayRangeMin,
+                                                                       int     grayRangeMax,
+                                                                       int             *rCountRange, 
+                                                                       int             *rsize, 
+                                                                       double  *rmin, 
+                                                                       double  *rmax,
+                                                                       double  *raverage,
+                                                                       double  *rstandardeviation)
+{
+         double min                            = 0;
+         double max                            = 0;
+         double average                        = 0;
+         double standardeviation       = 0;
+         double acum                           = 0;
+         int    size                           = 0;
+         int    countRange                     = 0;
+         double ng;
+
+         if (inputLstValue!=NULL)
+         {
+               size=inputLstValue->size();
+               if (size>0){
+              max=(*inputLstValue)[0];
+                  min=(*inputLstValue)[0];
+     // Average , countRange
+                       int i;
+                       for ( i=0; i<size; i++ )
+                       {
+                               ng=(*inputLstValue)[i];
+                               acum = acum + ng;
+                               if (max<ng) max=ng;             // Max
+                               if (min>ng) min=ng;     // Min
+                               if ((ng>=grayRangeMin) && (ng<=grayRangeMax)) countRange++;  // countRange
+                       }
+                       average = acum / size;
+
+         // Standar Deviation
+                       acum=0;
+                       double tmp;
+                       for ( i=0; i<size; i++ )
+                       {
+                tmp = (*inputLstValue)[i] - average;
+                               acum = acum + tmp*tmp;
+                       }
+                       standardeviation = sqrt(acum/size);
+
+               }
+         }
+
+         // OUTPUT
+               *rsize                          = size; 
+               *rCountRange            = countRange;
+               *rmin                           = min; 
+               *rmax                           = max;
+               *raverage                       = average;
+               *rstandardeviation      = standardeviation;
+}
+
+//------------------------------------------------------------------------
+void ContourExtractData::SetTypeOperation(int type)
+{
+       _typeOperation=type;
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourExtractData.h
new file mode 100644 (file)
index 0000000..edf87f3
--- /dev/null
@@ -0,0 +1,71 @@
+
+#ifndef __ContourExtractData_h_INCLUDED_H__
+#define __ContourExtractData_h_INCLUDED_H__
+
+
+#include <manualContour.h>
+#include "marTypes.h"
+
+
+  //--------------------------------------------------------------------------
+  class MARACASVISULIB_EXPORTS ContourExtractData 
+  {
+  public:
+       ContourExtractData(bool imagesResults=false);
+    ~ContourExtractData();
+
+//----------------------------------------------------------------------
+       void SetImage( vtkImageData* imagedata);
+       void SetZtoBeAnalys( int z );
+
+       void SetLstManualContourModel( std::vector<manualContourModel*> lstManConMod);
+       void GetValuesInsideCrown(      std::vector<double> *pLstValue,
+                                                               std::vector<double> *pLstValuePosX,
+                                                               std::vector<double> *pLstValuePosY,
+                                                               std::vector<double> *pLstValuePosZ);
+
+       void CalculateImageResult();
+       vtkImageData *GetVtkImageValueResult();
+       vtkImageData *GetVtkImageMaskResult();
+       void Statistics( std::vector<double> *inputLstValue, 
+                                       int     grayRangeMin,
+                                       int     grayRangeMax,
+                                       int             *rCountRange, 
+                                       int             *rsize, 
+                                       double  *rmin, 
+                                       double  *rmax,
+                                       double  *raverage,
+                                       double  *rstandardeviation);
+       void SetTypeOperation(int type);
+
+  private:
+       bool                                                            okImagesResults;
+       std::vector<manualContourModel*>        lstManConMod;
+       int                                                                     _typeOperation;
+
+       int                                                                     zImage;
+       vtkImageData                                            *imagedata;
+       vtkImageData                                            *imagedataValueResult;
+       vtkImageData                                            *imagedataMaskResult;
+
+       bool isInside(int x, int y, int typeOperation );
+       void GetMinMaxPoint(int *minPoint, 
+                                               int *maxPoint, 
+                                               manualContourModel *manualcontourmodel );
+       void GetMinMaxPoint_Of_LstManConMod(    int *minPoint, 
+                                                                                       int *maxPoint);
+
+       int AnalisisContourInside(      int x, 
+                                                               int y, 
+                                                               manualContourModel *manualcontourmodel );
+       double GetDataValue(int x, int y, int z);
+       void ResetImageResult(int z);
+       void PutVtkImageDataResultValue( int x, int y,int z, double value );
+       void InitVtkImagesResult();
+
+
+  };
+
+
+#endif  // __ContourExtractData_h_INCLUDED_H__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourPropagation.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourPropagation.cxx
new file mode 100644 (file)
index 0000000..0b30ca1
--- /dev/null
@@ -0,0 +1,316 @@
+#include "ContourPropagation.h"
+
+//Construction
+ContourPropagation::ContourPropagation()
+{
+       _propc = new PropContour();
+       _autoc = new AutoControlPoints();
+       _ext2D = new ExtractControlPoints2D();
+       _InX.clear();
+       _InY.clear();
+       _InZ.clear();
+       _sliceKeyContourVec.clear();
+}
+//Destruction
+ContourPropagation::~ContourPropagation()
+{
+}
+//-------------------------------------------------------------------------------------
+void ContourPropagation::resetAppend()
+{
+       _InX.clear();
+       _InY.clear();
+       _InZ.clear();
+       _InS.clear();
+       _propc->ResetKeyContours();
+       _sliceKeyContourVec.clear();
+}
+
+//-------------------------------------------------------------------------------------
+bool ContourPropagation::ifSliceKeyContourExist(int slice)
+{
+       bool result=false;
+       int i,size=_sliceKeyContourVec.size();
+       for (i=0; ((i<size) && (result==false)); i++)
+       {
+               int temp=_sliceKeyContourVec[i];
+               if (_sliceKeyContourVec[i]==slice)
+               {
+                       result=true;
+               }
+               if (_sliceKeyContourVec[i]>slice)
+               {
+                       i=size;
+               }
+       }
+       return result;
+}
+
+//-------------------------------------------------------------------------------------
+void ContourPropagation::OrdenarSliceKeyContourVec()
+{
+       int i,j,tmp,size=_sliceKeyContourVec.size();
+       for (i=0;i<size;i++)
+       {
+               for (j=0;j<size;j++)
+               {
+                       if (_sliceKeyContourVec[i]<_sliceKeyContourVec[j])
+                       {
+                               tmp=_sliceKeyContourVec[i];
+                               _sliceKeyContourVec[i]=_sliceKeyContourVec[j];
+                               _sliceKeyContourVec[j]=tmp;
+                       }
+               }
+       }
+}
+
+//-------------------------------------------------------------------------------------
+void ContourPropagation::appendContour(std::vector<double>*InX,std::vector<double>*InY,std::vector<double>*InZ)
+{
+/*
+       vectorFunctions *vf = new vectorFunctions();
+       vf->copyVector(InX,&_InX);
+       vf->copyVector(InY,&_InY);
+       vf->copyVector(InZ,&_InZ);
+       delete vf;
+*/
+
+
+       int i,size = InX->size();
+       if(size != 0)
+       {
+               _sliceKeyContourVec.push_back( (*InZ)[0] );
+               OrdenarSliceKeyContourVec();
+               for(i=0; i<size; i++)
+               {
+                       _InX.push_back( (*InX)[i] );
+                       _InY.push_back( (*InY)[i] );
+                       _InZ.push_back( (*InZ)[i] );
+               }
+       }
+
+       _InS.push_back(InX->size());
+       _propc->SetKeyContours(InX,InY,InZ);
+}
+//-------------------------------------------------------------------------------------
+//TEST CLASS FOR BBTK
+void ContourPropagation::appendContour()
+{
+       _InX.clear();
+       _InY.clear();
+       _InZ.clear();
+       _InS.clear();
+       _propc->ResetKeyContours();
+       FILE* fd;
+       fd = fopen("C:/bbtk_JS/data/SavedContours.txt","r");
+       _propc->ReadKeyContour( fd );
+       fclose(fd);
+       _propc->GetKeyContours(&_InX,&_InY,&_InZ,&_InS);
+}
+//-------------------------------------------------------------------------------------
+bool ContourPropagation::mustOrderAppend()
+{
+       bool orderA = true;
+       bool orderD = true;
+       bool mustOrder = false;
+       int i,j;
+
+       if(_InS.size()>2)
+       {
+               //ASCENDING
+               j=0;
+               for(i=0; i<_InS.size()-1; i++)
+               {
+                       if(_InZ[j]>_InZ[j+_InS[i]])
+                       {
+                               orderA = false;
+                       }
+                       j = j+_InS[i];
+               }
+               //DESCENDING
+               if(orderA == false)
+               {
+                       j=0;
+                       for(i=0; i<_InS.size()-1; i++)
+                       {
+                               if(_InZ[j]<_InZ[j+_InS[i]])
+                               {
+                                       orderD = false;
+                               }
+                               j =     j+_InS[i];
+                       }
+               }
+               //IS ORGANIZED
+               if((orderD == false) || (orderA == false))
+               {
+                       mustOrder = true;
+               }
+               else
+               {
+                       mustOrder = false;
+               }
+               return mustOrder;
+       }
+       return mustOrder;
+}
+//-------------------------------------------------------------------------------------
+void ContourPropagation::orderAppend()
+{
+       int i,j,cont,cont2;
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       std::vector<int> tempS;
+       tempX.clear();
+       tempY.clear();
+       tempZ.clear();
+       tempS.clear();
+       
+       bool mustOrder = mustOrderAppend();
+
+       while( mustOrder == true )
+       {
+               tempX.clear();
+               tempY.clear();
+               tempZ.clear();
+               tempS.clear();
+               cont = 0;
+               for(i=0; i<_InS.size()-1; i++)
+               {
+                       if(_InZ[cont]<_InZ[cont+_InS[i]])
+                       {
+                               cont2 = cont;
+                               for(j=0; j<_InS[i]; j++)
+                               {
+                                       tempX.push_back( _InX[cont2] );
+                                       tempY.push_back( _InY[cont2] );
+                                       tempZ.push_back( _InZ[cont2] );
+                                       cont2++;
+                               }
+                               tempS.push_back( _InS[1] );
+                       }
+                       if(_InZ[cont]>_InZ[cont+_InS[i]])
+                       {
+                               cont2 = cont+_InS[i];
+                               for(j=0; j<_InS[i+1]; j++)
+                               {
+                                       tempX.push_back( _InX[cont2] );
+                                       tempY.push_back( _InY[cont2] );
+                                       tempZ.push_back( _InZ[cont2] );
+                                       cont2++;
+                               }
+                               tempS.push_back( _InS[i+1] );
+                               cont2 = cont;
+                               for(j=0; j<_InS[i]; j++)
+                               {
+                                       tempX.push_back( _InX[cont2] );
+                                       tempY.push_back( _InY[cont2] );
+                                       tempZ.push_back( _InZ[cont2] );
+                                       cont2++;
+                               }
+                               tempS.push_back( _InS[i] );
+                       }
+                       cont = cont + _InS[i];
+               }
+               _InX.clear();
+               _InY.clear();
+               _InZ.clear();   
+               _InS.clear();
+               vectorFunctions *vf = new vectorFunctions();
+               vf->copyVector(&tempX,&_InX);
+               vf->copyVector(&tempY,&_InY);
+               vf->copyVector(&tempZ,&_InZ);
+               delete vf;
+               for(i=0; i<tempS.size(); i++)
+               {
+                       _InS.push_back(tempS[i]);
+               }
+               mustOrder = mustOrderAppend();
+       }
+
+}
+//-------------------------------------------------------------------------------------
+void ContourPropagation::CalculeSplinePropagation()
+{
+       //_propc->SetKeyContours(&_InX,&_InY,&_InZ);
+       _propc->GetKeyContours(&_InX,&_InY,&_InZ,&_InS);
+       _propc->CalculeSplinePropagation();
+}
+
+//-------------------------------------------------------------------------------------
+int ContourPropagation::FindIdWithZ(double z)
+{
+       return _propc->FindIdWithZ(z);
+}
+
+
+
+//-------------------------------------------------------------------------------------
+//INITIAL AUTOMATIC METHOD
+void ContourPropagation::GetInitialControlPoints(int id, std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ)
+{
+       _propc->GetIdContour(id,vecX,vecY,vecZ);
+       _ext2D->SetContour(vecX,vecY,vecZ);
+       _ext2D->GetInitialControlPoints(vecX,vecY,vecZ);
+}
+
+//-------------------------------------------------------------------------------------
+//AUTOMATIC METHOD
+void ContourPropagation::GetControlPoints(int id, std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ)
+{
+       //_propc->SetKeyContours(&_InX,&_InY,&_InZ);
+//     _propc->CalculeSplinePropagation();
+       _propc->GetIdContour(id,vecX,vecY,vecZ);
+       _ext2D->SetContour(vecX,vecY,vecZ);
+       _ext2D->GetControlPoints(vecX,vecY,vecZ);
+}
+
+//-------------------------------------------------------------------------------------
+//SAMPLING METHOD
+void ContourPropagation::GetControlPoints(int id, double samp, std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ)
+{
+//     //_propc->SetKeyContours(&_InX,&_InY,&_InZ);
+//     _propc->GetKeyContours(&_InX,&_InY,&_InZ,&_InS);
+//     _propc->CalculeSplinePropagation();
+//     int size = _InX.size();
+       _propc->GetIdContour(id,vecX,vecY,vecZ);
+//     int size2 = vecX->size();
+       _ext2D->SetContour(vecX,vecY,vecZ);
+       _ext2D->SetSamplingControlPoints(samp);
+       _ext2D->GetSamplingControlPoints(vecX,vecY,vecZ);
+}
+//-------------------------------------------------------------------------------------
+void ContourPropagation::GetContour(int id, std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ)
+{
+       //orderAppend();
+       _propc->SetKeyContours(&_InX,&_InY,&_InZ);
+       _propc->CalculeSplinePropagation();
+       _propc->GetIdContour(id,vecX,vecY,vecZ);
+}
+//-------------------------------------------------------------------------------------
+//TEST CLASS FOR BBTK
+vtkImageData* ContourPropagation::GetKeyContours(std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ,std::vector<int>*vecS)
+{
+       //orderAppend();
+       _propc->GetKeyContours(vecX,vecY,vecZ,vecS);    
+       return _propc->CalculeSplinePropagation();
+}
+//-------------------------------------------------------------------------------------
+void ContourPropagation ::getMaxMinZ(double *minz, double *maxz)
+{
+       vectorFunctions *vf = new vectorFunctions();
+       vf->minVector(&_InZ,minz);
+       vf->maxVector(&_InZ,maxz);
+       delete vf;
+}
+//-------------------------------------------------------------------------------------
+void ContourPropagation::setInterpolationNumber(int num)
+{
+       _propc->SetInterpNumber(num);
+}
+//-------------------------------------------------------------------------------------
+//-------------------------------------------------------------------------------------
+//-------------------------------------------------------------------------------------
+//-------------------------------------------------------------------------------------
+//-------------------------------------------------------------------------------------
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourPropagation.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourPropagation.h
new file mode 100644 (file)
index 0000000..69ac0ea
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef __ContourPropagation_h_INCLUDED__
+#define __ContourPropagation_h_INCLUDED__
+
+#include "Propagation.h"
+#include "ExtractControlPoints2D.h"
+#include "vtkImageData.h"
+#include "vectorFunctions.h"
+#include "marTypes.h"
+
+class MARACASVISULIB_EXPORTS ContourPropagation 
+{
+       public:
+               ContourPropagation();
+               ~ContourPropagation();
+               void resetAppend                                ( );
+               void appendContour                              ( std::vector<double>*InX, 
+                                                                                 std::vector<double>*InY, 
+                                                                                 std::vector<double>*InZ );
+               void GetContour                                 ( int id, std::vector<double>*vecX, 
+                                                                                                 std::vector<double>*vecY, 
+                                                                                                 std::vector<double>*vecZ );
+               //AUTOMATIC METHOD
+               void GetInitialControlPoints    ( int id, std::vector<double>*vecX, 
+                                                                                                 std::vector<double>*vecY, 
+                                                                                                 std::vector<double>*vecZ);
+               void GetControlPoints                   ( int id, std::vector<double>*vecX, 
+                                                                                                 std::vector<double>*vecY, 
+                                                                                                 std::vector<double>*vecZ );
+
+               //SAMPLING METHOD
+               void CalculeSplinePropagation();
+               void GetControlPoints                   ( int id, double samp,
+                                                                                 std::vector<double>*vecX, 
+                                                                                 std::vector<double>*vecY, 
+                                                                                 std::vector<double>*vecZ );
+
+               int  FindIdWithZ                                ( double z);
+
+
+               void getMaxMinZ                                 ( double *minz, double *maxz);
+               void setInterpolationNumber             ( int num );
+
+
+       //TEST CLASSES FOR BBTK
+               void appendContour                              ( );
+               vtkImageData* GetKeyContours    ( std::vector<double>*vecX, 
+                                                                                 std::vector<double>*vecY, 
+                                                                                 std::vector<double>*vecZ, 
+                                                                                 std::vector<int>*vecS );
+
+               bool ifSliceKeyContourExist(int slice);
+
+
+       private:
+               bool mustOrderAppend( );
+               void orderAppend( );
+               void OrdenarSliceKeyContourVec();
+               
+
+               PropContour                                     *_propc;
+               AutoControlPoints                       *_autoc;
+               ExtractControlPoints2D          *_ext2D;
+
+               std::vector<double>                     _InX;
+               std::vector<double>                     _InY;
+               std::vector<double>                     _InZ;
+               std::vector<int>                        _InS;
+               std::vector<int>                        _sliceKeyContourVec;
+
+               std::vector<Vector>                     _planevector;
+};
+
+#endif //__ContourPropagation_h_INCLUDED__
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourVOIWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourVOIWidget.cxx
new file mode 100644 (file)
index 0000000..5a9ebdf
--- /dev/null
@@ -0,0 +1,211 @@
+
+#include "ContourVOIWidget.h"
+
+#include <vtkImageMapToColors.h>
+#include <vtkImageActor.h>
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+  wxWidgetSliderMinMaxVOI :: wxWidgetSliderMinMaxVOI(ContourVOIWidget *contourtool,
+                                                                                                        mBarRange *modelBarRange )
+               :wxEvtHandler()
+               {                       
+                       modBarRange = modelBarRange;
+                       mcontourtool = contourtool;
+                       modBarRange->PushEventHandler(this);
+                       Connect(modBarRange->GetId(),wxEVT_TSBAR,(wxObjectEventFunction) (wxCommandEventFunction) &wxWidgetSliderMinMaxVOI::onBarrange );
+                       Connect(modBarRange->GetId(),wxEVT_TSBAR_ACTUAL,(wxObjectEventFunction) (wxCommandEventFunction)  &wxWidgetSliderMinMaxVOI::onActualChange_Bar );
+                       Connect(modBarRange->GetId(),wxEVT_TSBAR_START,(wxObjectEventFunction) (wxCommandEventFunction)  &wxWidgetSliderMinMaxVOI::onStartChange_Bar );
+                       Connect(modBarRange->GetId(),wxEVT_TSBAR_END,(wxObjectEventFunction) (wxCommandEventFunction)  &wxWidgetSliderMinMaxVOI::onEndChange_Bar );
+                       Connect(modBarRange->GetId(),wxEVT_SELECTION_END,(wxObjectEventFunction) (wxCommandEventFunction)  &wxWidgetSliderMinMaxVOI::onSelectionEnd );
+                       Connect(modBarRange->GetId(),wxEVT_TSBAR_MOVED,(wxObjectEventFunction) (wxCommandEventFunction)  &wxWidgetSliderMinMaxVOI::onMovedBar );                
+               }
+
+               wxWidgetSliderMinMaxVOI ::  ~wxWidgetSliderMinMaxVOI()
+               {
+                       
+               }
+               
+
+         //--------------------------------------------------------------------------------------------------------------------------------
+         // Min-Max Barrange received events
+         //--------------------------------------------------------------------------------------------------------------------------------
+               void wxWidgetSliderMinMaxVOI :: onBarrange(wxCommandEvent& event)
+               {
+
+               }
+               void wxWidgetSliderMinMaxVOI :: onActualChange_Bar(wxCommandEvent& event)
+               {
+                       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)mcontourtool->GetWxVtkBaseView();
+                       wxvtk2dbaseview->GetVtkBaseData()->SetZ(modBarRange->GetActual());
+                       wxvtk2dbaseview->Refresh();
+               }
+               void wxWidgetSliderMinMaxVOI :: onStartChange_Bar(wxCommandEvent& event)
+               {
+                       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)mcontourtool->GetWxVtkBaseView();
+                       wxvtk2dbaseview->GetVtkBaseData()->SetZ(modBarRange->GetStart());
+                       wxvtk2dbaseview->Refresh();
+//EED                  mcontourtool->ProcessOutputs();
+               }
+               void wxWidgetSliderMinMaxVOI :: onEndChange_Bar(wxCommandEvent& event)
+               {
+                       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)mcontourtool->GetWxVtkBaseView();
+                       wxvtk2dbaseview->GetVtkBaseData()->SetZ(modBarRange->GetEnd());
+                       wxvtk2dbaseview->Refresh();
+//EED                  mcontourtool->ProcessOutputs();
+               }
+               void wxWidgetSliderMinMaxVOI :: onSelectionEnd(wxCommandEvent& event)
+               {
+               }
+               void wxWidgetSliderMinMaxVOI :: onMovedBar(wxCommandEvent& event)
+               {
+//EED                  mcontourtool->ProcessOutputs();
+               }
+//----------------------------------------------------------------------
+//----------------------------------------------------------------------
+//----------------------------------------------------------------------
+
+
+  ContourVOIWidget::ContourVOIWidget(wxWindow *parent, wxVtkBaseView *wxvtkbaseview, vtkImageData* imagedata)
+    : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+  {
+//EED    this->mbbtkContourCrown       = contourcrown;
+    this->imagedata                                    = imagedata;
+       this->wxvtkbaseview                             = wxvtkbaseview;
+       wxPanel *panel                                  = this;
+    wxSizer *sizer                                     = NULL;
+       
+       mbarrange = new mBarRange(panel,200, 65); 
+       mbarrange -> SetOrientation( true );
+       mbarrange -> setActiveStateTo(true);
+       mbarrange -> setVisibleLabels( true );
+       mbarrange -> setDeviceEndMargin(10);
+       mbarrange -> setRepresentedValues( 0 , 100 );
+       mbarrange -> setDeviceBlitStart(10,10); 
+       mbarrange -> setIfWithActualDrawed( true );
+       mbarrange -> SetStart( 10 );
+       mbarrange -> SetEnd( 90 );  
+
+       wxWidgetSliderMinMaxVOI * eventHandler = new wxWidgetSliderMinMaxVOI(this, mbarrange);
+
+       wxFlexGridSizer *sizer1 = new wxFlexGridSizer(10);
+       sizer1->AddGrowableCol(0);
+    sizer1->Add(mbarrange,1,wxGROW);
+       sizer = sizer1;
+       panel -> SetSizer(sizer);
+
+    panel      ->      SetAutoLayout(true);
+    panel      ->      Layout();  
+  }
+
+  // ------------------------------------------------------------------------
+
+  ContourVOIWidget::~ContourVOIWidget()
+  {
+  }
+
+  // ------------------------------------------------------------------------
+  wxVtkBaseView *ContourVOIWidget::GetWxVtkBaseView()
+       {
+               return this->wxvtkbaseview;
+       }
+
+
+  // ------------------------------------------------------------------------
+
+
+  void ContourVOIWidget::ConfigureVTK()
+  {
+         double spc[3];
+         this->imagedata->GetSpacing(spc);
+
+         // LG 14 dec 2007
+         int dim[3];
+         this->imagedata->GetDimensions(dim);
+         mbarrange -> setRepresentedValues( 0 , dim[2] );
+       
+       // Rectangulo
+       _manRoiControl  = new manualRoiControler();
+       _mContourModel  = new manualContourModel();
+       _mViewRoi               = new manualViewRoi();
+       _mViewRoi->SetModel( _mContourModel );
+       _mViewRoi->SetWxVtkBaseView( this->wxvtkbaseview );
+       _mViewRoi->SetRange( 2 );
+       _mViewRoi->SetZ( 1000 );
+
+//EED 3 oct 2006
+       _mViewRoi->SetSpacing(spc);
+
+       _manRoiControl->SetModelView( _mContourModel , _mViewRoi );
+        this->wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manRoiControl );
+       _manRoiControl->CreateNewManualContour();
+       _manRoiControl->SetActive(true);
+       _mViewRoi->RefreshContour();
+
+
+  }
+
+//--------------------------------------------------------------------------------------------------------------------------------
+void ContourVOIWidget::GetVOI( int voi[6] )
+{
+       double minX,minY,maxX,maxY;
+       _mViewRoi->GetMinMax(minX,minY,maxX,maxY);
+       voi[0]=(int)minX;
+       voi[1]=(int)maxX;
+       voi[2]=(int)minY;
+       voi[3]=(int)maxY;
+
+       voi[4] =  mbarrange->GetStart();
+       voi[5] =  mbarrange->GetEnd();
+
+       int border[6];
+       wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)wxvtkbaseview;
+       wxvtk2dbaseview->GetVtkBaseData()->GetImageData()->GetExtent( border );
+
+       if ( (voi[0]==voi[1]) || (voi[2]==voi[3]) || (voi[4]==voi[5]) )
+       {
+                       voi[0] = border[0];
+                       voi[1] = border[1];
+                       voi[2] = border[2];
+                       voi[3] = border[3];
+                       voi[4] = border[4];
+                       voi[5] = border[5];
+       }
+
+       // border min
+       if (voi[0]<border[0]) { voi[0]=border[0]; }
+       if (voi[2]<border[2]) { voi[2]=border[2]; }
+       if (voi[4]<border[4]) { voi[4]=border[4]; }
+
+       // border max
+       if (voi[1]>border[1]) { voi[1]=border[1]; }
+       if (voi[3]>border[3]) { voi[3]=border[3]; }
+       if (voi[5]>border[5]) { voi[5]=border[5]; }
+}
+
+//--------------------------------------------------------------------------------------------------------------------------------
+/*EED
+void wxMaracasCoutourTool::ProcessOutputs()
+{
+       int voi[6];
+       GetVOI(voi);
+       char buffer[40];
+       sprintf(buffer,"%d %d %d ", voi[0], voi[2], voi[4] );
+       std::string Index(buffer);
+       sprintf(buffer,"%d %d %d ", voi[1]-voi[0]+1, voi[3]-voi[2]+1, voi[5]-voi[4]+1 );
+       std::string Size(buffer);
+       mbbtkContourCrown->bbSetOutputIndex( Index );
+       mbbtkContourCrown->bbSetOutputSize( Size );
+       std::vector<std::string> mod;
+       mod.push_back("Index");
+       mod.push_back("Size");
+       mbbtkContourCrown->bbSignalOutputModification(mod);
+}
+*/
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourVOIWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ContourVOIWidget.h
new file mode 100644 (file)
index 0000000..a862a46
--- /dev/null
@@ -0,0 +1,72 @@
+
+#ifndef __ContourVOIWidget_h_INCLUDED_H__
+#define __ContourVOIWidget_h_INCLUDED_H__
+
+
+#include <manualContour.h>
+#include "mBarRange.h"
+
+  
+
+
+  class ContourVOIWidget;
+  //------------------------------------------------------------------------------------------------------------------------------------
+  // Event handling auxiliar class
+  //------------------------------------------------------------------------------------------------------------------------------------
+  class wxWidgetSliderMinMaxVOI : wxEvtHandler
+  {
+  public:
+         //--------------------------------------------------------------------------------------------------------------------------------
+         // Constructors ans destructors
+         //--------------------------------------------------------------------------------------------------------------------------------
+               wxWidgetSliderMinMaxVOI(ContourVOIWidget *contourtool,mBarRange * modelBarRange);
+               ~wxWidgetSliderMinMaxVOI();             
+
+         //--------------------------------------------------------------------------------------------------------------------------------
+         // Min-Max Barrange received events
+         //--------------------------------------------------------------------------------------------------------------------------------
+               void onBarrange(wxCommandEvent& event);
+               void onActualChange_Bar(wxCommandEvent& event);
+               void onStartChange_Bar(wxCommandEvent& event);
+               void onEndChange_Bar(wxCommandEvent& event);
+               void onSelectionEnd(wxCommandEvent& event);
+               void onMovedBar(wxCommandEvent& event);
+
+  private:
+         //--------------------------------------------------------------------------------------------------------------------------------
+         // Attributes
+         //--------------------------------------------------------------------------------------------------------------------------------
+         ContourVOIWidget      *mcontourtool;
+         mBarRange                     *modBarRange;
+  };
+
+
+//--------------------------------------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------------------------------------------
+
+  class ContourVOIWidget : public wxPanel
+  {
+  public:
+       ContourVOIWidget( wxWindow *parent, wxVtkBaseView *wxvtkbaseview , vtkImageData* imagedata);
+    ~ContourVOIWidget();
+    void ConfigureVTK();
+
+       wxVtkBaseView *GetWxVtkBaseView();
+       void GetVOI( int voi[6] );
+
+
+  private:
+       mBarRange                               *mbarrange;
+
+       vtkImageData                    *imagedata;
+       wxVtkBaseView                   *wxvtkbaseview;
+
+       manualRoiControler              *_manRoiControl;
+       manualContourModel              *_mContourModel;
+       manualViewRoi                   *_mViewRoi;
+
+  };
+
+#endif  // __ContourVOIWidget_h_INCLUDED_H__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ExtractControlPoints2D.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ExtractControlPoints2D.cxx
new file mode 100644 (file)
index 0000000..17d0810
--- /dev/null
@@ -0,0 +1,113 @@
+#include "ExtractControlPoints2D.h"
+
+//Construction
+ExtractControlPoints2D::ExtractControlPoints2D()
+{
+       _numinterspline = 100;
+       _numsampling = 25;
+}
+//Destruction
+ExtractControlPoints2D::~ExtractControlPoints2D()
+{
+}
+//-----------------------------------------------------------------------------------------
+void ExtractControlPoints2D::ResetControlPoints()
+{
+
+}
+//-----------------------------------------------------------------------------------------
+void ExtractControlPoints2D::SetContour(std::vector<double>*InX, std::vector<double>*InY,std::vector<double>*InZ)
+{
+       _InX.clear();
+       _InY.clear();
+       _InZ.clear();
+       int sizeX = InX->size();
+       int sizeY = InY->size();
+       int sizeZ = InZ->size();
+       if( (sizeX == sizeY) && (sizeY==sizeZ) )
+       {
+               for(int i=0; i<sizeX; i++)
+               {
+                       _InX.push_back( (*InX)[i] );
+                       _InY.push_back( (*InY)[i] );
+                       _InZ.push_back( (*InZ)[i] );
+               }
+       }
+       else
+       {
+               printf("\n The lists Of vectors have diferents sizes");
+       }
+}
+//-----------------------------------------------------------------------------------------
+//AUTOMATIC METHOD (INITIAL AND ADDING)
+void ExtractControlPoints2D::GetInitialControlPoints(std::vector<double>*pOutX, std::vector<double>*pOutY, std::vector<double>*pOutZ)
+{
+       AutoControlPoints *autoc = new AutoControlPoints();
+       pOutX->clear();
+       pOutY->clear();
+       pOutZ->clear();
+
+       if(_InX.size() != 0)
+       {
+               autoc->SetNumSplineInterpolation(_numinterspline);
+               autoc->CalculeInitialControlPoints(&_InX,&_InY,&_InZ);
+               autoc->GetInitialControlPoints(pOutX,pOutY,pOutZ);
+       }
+       delete autoc;
+}
+//-----------------------------------------------------------------------------------------
+//AUTOMATIC METHOD (INITIAL, ADDING AND SAMPLING)
+void ExtractControlPoints2D::GetControlPoints(std::vector<double>*pOutX, std::vector<double>*pOutY, std::vector<double>*pOutZ)
+{
+       AutoControlPoints *autoc = new AutoControlPoints();
+       pOutX->clear();
+       pOutY->clear();
+       pOutZ->clear();
+
+       if(_InX.size() != 0)
+       {
+               autoc->SetNumSplineInterpolation(_numinterspline);
+               autoc->CalculeControlPoints(&_InX,&_InY,&_InZ);
+               autoc->GetControlPoints(pOutX,pOutY,pOutZ);
+       }
+       delete autoc;
+}
+//-----------------------------------------------------------------------------------------
+//SET THE SAMPLING (PERCENT) FOR THE REGULAR SAMPLING METHOD
+void ExtractControlPoints2D::SetSamplingControlPoints(double val)
+{
+       if(_InX.size() != 0)
+       {
+               _numsampling = _InX.size()* (val/100);
+       }
+}
+//-----------------------------------------------------------------------------------------
+//REGULAR SAMPLING METHOD
+void ExtractControlPoints2D::GetSamplingControlPoints(std::vector<double>*pOutX, std::vector<double>*pOutY, std::vector<double>*pOutZ)
+{
+       pOutX->clear();
+       pOutY->clear();
+       pOutZ->clear();
+       if(_InX.size() != 0)
+       {
+               int h = 1;
+               int j=0;
+               int points = (int)(_InX.size()/_numsampling);
+               for (int i=0; i<_InX.size(); i++, h++)
+               {
+                       if( h == points )
+                       {
+                               pOutX->push_back( _InX[i] );
+                               pOutY->push_back( _InY[i] );
+                               pOutZ->push_back( _InZ[i] );
+                               h = 0;
+                       }
+               }
+       }
+}
+//-----------------------------------------------------------------------------------------
+void ExtractControlPoints2D::SetNumberOfSplineInterpolation(double val)
+{
+       _numinterspline = val;
+}
+//-----------------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/ExtractControlPoints2D.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/ExtractControlPoints2D.h
new file mode 100644 (file)
index 0000000..070ea64
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef __ExtractControlPoints2D_h_INCLUDED__
+#define __ExtractControlPoints2D_h_INCLUDED__
+
+#include "AutoControlPoints.h"
+#include "marTypes.h"
+
+class MARACASVISULIB_EXPORTS ExtractControlPoints2D
+{
+       public:
+                       ExtractControlPoints2D  ( );
+                       ~ExtractControlPoints2D ( );
+                       void ResetControlPoints ( );
+                       void SetContour                                 ( std::vector<double>*pInX,
+                                                                                         std::vector<double>*pInY,
+                                                                                         std::vector<double>*pInZ );
+                       void GetControlPoints                   ( std::vector<double>*pOutX,
+                                                                                         std::vector<double>*pOutY,
+                                                                                         std::vector<double>*pOutZ );
+                       void GetInitialControlPoints    ( std::vector<double>*pOutX,
+                                                                                         std::vector<double>*pOutY,
+                                                                                         std::vector<double>*pOutZ );
+                       
+                       void SetSamplingControlPoints           ( double val );
+                       void GetSamplingControlPoints           ( std::vector<double>*pOutX,
+                                                                                                 std::vector<double>*pOutY,
+                                                                                                 std::vector<double>*pOutZ );
+                       void SetNumberOfSplineInterpolation ( double val);
+       
+       private:
+                       double _numinterspline;
+                       double _numsampling;
+                       std::vector<double> _InX;
+                       std::vector<double> _InY;
+                       std::vector<double> _InZ;
+};
+
+#endif
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/Propagation.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/Propagation.cxx
new file mode 100644 (file)
index 0000000..ca90820
--- /dev/null
@@ -0,0 +1,1237 @@
+#include "Propagation.h"
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+//CLASS: Vector ------------------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Constructor
+Vector::Vector()
+{
+       _plane = -1;
+       _var = -1;
+}
+//Destructor
+Vector::~Vector()
+{
+       _vec.clear();
+       _vecX.clear();
+       _vecY.clear();
+       _vecZ.clear();
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::set_vec(double val)
+{
+       _vec.push_back(val);
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::set_var(double val)
+{
+       _var = val;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+double Vector::get_vec(int id)
+{
+       if(_vec.size() != 0)
+       {
+               return _vec[id];
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+double Vector::get_var()
+{
+       return _var;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+int Vector::getsize_vec()
+{
+       return _vec.size();
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::copyVector( std::vector<Vector>*vec1, std::vector<Vector>*vec2 )
+{
+       int i,j;
+       if( vec1->size() != 0 )
+       {
+               vec2->clear();
+               for(i=0; i<vec1->size(); i++)
+               {
+                       Vector *temp = new Vector();
+                       temp->set_var( (*vec1)[i].get_var() );
+                       for(j=0; j<(*vec1)[i].getsize_vec(); j++)
+                       {
+                               temp->set_vec( (*vec1)[i].get_vec(j) );
+                       }
+                       vec2->push_back(*temp);
+                       delete temp;
+               }
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::printVector(std::vector<Vector>*vec1)
+{
+       int i,j;
+       for(i=0; i<vec1->size(); i++)
+       {
+               printf("\n Pos (%d) => var = %f",i,(*vec1)[i].get_var());
+               for(j=0; j<(*vec1)[i].getsize_vec(); j++)
+               {
+                       printf("\n vec(%d) = %f",j,(*vec1)[i].get_vec(j));
+               }
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::set_plane(int val)
+{
+       _plane = val;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::set_x(double val)
+{
+       _vecX.push_back(val);
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::set_y(double val)
+{
+       _vecY.push_back(val);
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::set_z(double val)
+{
+       _vecZ.push_back(val);
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+int Vector::get_plane()
+{
+       return _plane;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+double Vector::get_x(int id)
+{
+       if( (-1<id) && (id<_vecX.size()) )
+       {
+               return _vecX[id];
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+int Vector::getsize_x()
+{
+       if(_vecX.size() != 0)
+       {
+               return _vecX.size();
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+double Vector::get_y(int id)
+{
+       if( (-1<id) && (id<_vecY.size()) )
+       {
+               return _vecY[id];
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+int Vector::getsize_y()
+{
+       if(_vecY.size() != 0)
+       {
+               return _vecY.size();
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+int Vector::getsize_z()
+{
+       if(_vecZ.size() != 0)
+       {
+               return _vecZ.size();
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+double Vector::get_z(int id)
+{
+       if( (-1<id) && (id<_vecZ.size()) )
+       {
+               return _vecZ[id];
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+std::vector<double> Vector::getVec()
+{
+       return _vec;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+void Vector::resetVec()
+{
+       _vec.clear();
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+
+//Constructor
+PropContour::PropContour()
+{
+       _interpnumber = 100;
+}
+
+//Destructor
+PropContour::~PropContour()
+{
+       ResetPlaneVector();
+       ResetKeyContours();
+}
+
+/* EED 03/07/2008
+//------------------------------------------------------------------------------------
+double PropContour::RBF_WendLand(double norm, double m_rad)
+{
+       double y;
+         norm = norm / m_rad;
+         y = pow( 1-norm,4 ) * ( (4*norm) + 1 );
+         if(norm >= 1)
+         {
+               y = 0;
+         }
+       return y; 
+}
+//------------------------------------------------------------------------------------
+double PropContour::RBF_ThinPlate(double norm)
+{
+       double y;
+       if(norm == 0)
+       {
+               y = 0;
+       }
+       else
+       {
+               y = pow(norm,2)*log(norm);
+       }
+       return y;
+}
+//------------------------------------------------------------------------------------
+vtkImageData* PropContour::method_RBF ( double rad, std::vector<double>*CoordX, std::vector<double>*CoordY, 
+                                                                               std::vector<double>*CoordZ )
+{
+       _dimImage[0] = 100;                     // X Axis
+       _dimImage[1] = 100;                     // Y Axis
+       _dimImage[2] = 1;                       // Z Axis
+       int pointsSize = CoordX->size();
+       double spc[3]={1,1,1};
+       double norm = 0, val = 0;
+
+       vnl_matrix<double> A( pointsSize,pointsSize, 0.0 );
+       vnl_matrix<double> Ainv( pointsSize,pointsSize, 0.0 );
+       vnl_matrix<double> I( pointsSize,pointsSize, 0.0 );
+       vnl_vector<double> H( pointsSize, 1 );
+       vnl_vector<double> D( pointsSize, 0.0 );
+       vnl_vector<double> Q( 2, 0.0 );
+       vnl_matrix<double> Impl( _dimImage[0],_dimImage[1], 0.0 );
+
+       unsigned short *pValue;
+       imagedataValue = vtkImageData::New();
+       imagedataValue->SetScalarTypeToUnsignedShort();
+       imagedataValue->SetSpacing(spc);
+       imagedataValue->SetDimensions(_dimImage);
+       imagedataValue->SetExtent(0,_dimImage[0]-1,0,_dimImage[1]-1,0,_dimImage[2]-1);
+       imagedataValue->AllocateScalars();
+       imagedataValue->Update();
+
+    int i,j,h;
+       for(i=0; i<pointsSize; i++)
+       {
+               for(j=0; j<pointsSize; j++)
+               {
+                       norm = sqrt( pow((*CoordX)[i]-(*CoordX)[j],2) + pow((*CoordY)[i]-(*CoordY)[j],2) );
+                       A(i,j) = RBF_WendLand(norm,rad);
+                       //A(i,j) = RBF_ThinPlate(norm);
+               }
+       }
+
+       Ainv = vnl_matrix_inverse<double>(A);
+       D = Ainv* H;
+
+       for(i=0; i < _dimImage[1]; i++)
+       {
+               for(j=0; j < _dimImage[0]; j++)
+               {
+                       Q(0) = i;
+                       Q(1) = j;
+                       val = 0;
+                       for(h=0; h<pointsSize; h++)
+                       {
+                               norm = sqrt( pow( i-(*CoordX)[h],2 ) + pow( j-(*CoordY)[h],2 ) );
+                               //val = val + ( D(h) * RBF_ThinPlate(norm) );
+                               val = val + ( D(h) * RBF_WendLand(norm,rad) );
+                       }
+                       Impl(i,j) = val - 1.0;
+
+//                     if ( (Impl(i,j)>=-0.001) && (Impl(i,j) <=0.001)  )
+//                     {Impl(i,j)=128;
+//                     }
+//                     else
+//                     {Impl(i,j)=0;}
+
+
+//                     pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,0);
+//                     vvalue = (Impl(i,j)*256+256);
+//                     if (vvalue) < 0) 
+//                     { 
+//                             *pValue = 0;
+//                     } else {
+//                             *pValue = vvalue;
+//                     }
+
+                       pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,0);
+                       if ( Impl(i,j) >=0 ) 
+                       { 
+                               *pValue = 128;
+                       } 
+                       else 
+                       {
+                               *pValue = 0;
+                       }
+               }
+       }
+
+       for(i=0; i<pointsSize; i=i+5)
+       {
+         pValue = (unsigned short *)imagedataValue->GetScalarPointer( (int)(*CoordX)[i] , (int)(*CoordY)[i] ,0);
+                *pValue=255;
+       }
+
+       return imagedataValue;
+}
+//----------------------------------------------------------------------------------------------------
+double PropContour::RBF_ThinPlate_3D(double norm)
+{
+       return norm = pow( norm,3 );
+}
+//----------------------------------------------------------------------------------------------------
+vtkImageData* PropContour::method_RBF_3D (  double rad, std::vector<double>*CoordX, std::vector<double>*CoordY, 
+                                                                                       std::vector<double>*CoordZ )
+{
+       long interval = wxGetElapsedTime(TRUE);
+
+       int i,j,k,h;
+       int pointsSize = CoordX->size();
+       double max = -1, min = 1000, minz = 100000, maxz = -10000;
+
+       for( i=0; i<pointsSize; i++ )
+       {
+               if( (*CoordX)[i] > max )
+               {
+                       max = (*CoordX)[i]; 
+               }
+               if( (*CoordY)[i] > max )
+               {
+                       max = (*CoordY)[i]; 
+               }
+               if( (*CoordX)[i] < min )
+               {
+                       min = (*CoordX)[i]; 
+               }
+               if( (*CoordY)[i] < min )
+               {
+                       min = (*CoordY)[i]; 
+               }
+               if( (*CoordZ)[i] < minz )
+               {
+                       minz = (*CoordZ)[i];
+               }
+               if( (*CoordZ)[i] > maxz )
+               {
+                       maxz = (*CoordZ)[i];
+               }
+       }
+
+       _dimImage[0] = 200;                     // X axis
+       _dimImage[1] = 200;                     // Y axis
+       _dimImage[2] = 200;                     // Z axis
+
+       double spc[3]={1,1,1};
+       double norm = 0, val, vvalue;
+
+       vnl_matrix<double> A( pointsSize,pointsSize, 0.0 );
+       vnl_matrix<double> Ainv( pointsSize,pointsSize, 0.0 );
+       vnl_matrix<double> I( pointsSize,pointsSize, 0.0 );
+       vnl_vector<double> H( pointsSize, 1 );
+       vnl_vector<double> D( pointsSize, 0.0 );
+       vnl_vector<double> Q( 3, 0.0 );
+
+       unsigned short *pValue;
+       imagedataValue = vtkImageData::New();
+       imagedataValue->SetScalarTypeToUnsignedShort();
+       imagedataValue->SetSpacing(spc);
+       imagedataValue->SetDimensions(_dimImage);
+       imagedataValue->SetExtent(0,_dimImage[0]-1,0,_dimImage[1]-1,0,_dimImage[2]-1);
+       imagedataValue->AllocateScalars();
+       imagedataValue->Update();
+
+       for(i=0; i<pointsSize; i++)
+       {
+               for(j=0; j<pointsSize; j++)
+               {
+                       norm = sqrt( pow((*CoordX)[i]-(*CoordX)[j],2) + pow((*CoordY)[i]-(*CoordY)[j],2) + pow((*CoordZ)[i]-(*CoordZ)[j],2) );
+                       A(i,j) = RBF_WendLand(norm,rad);
+               }
+       }
+       D = vnl_matrix_inverse<double>(A)* H;
+
+//Inicialization
+//     for(k=0; k<_dimImage[2]; k++)
+//     {
+//             for(j=0; j<_dimImage[1]; j++)
+//             {
+//                     for(i=0; i<_dimImage[0]; i++)
+//                     {
+//                             pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,k);
+//                             *pValue = 0;
+//                     }
+//             }
+//     }
+
+//Filling
+//     pValue = (unsigned short *)imagedataValue->GetScalarPointer(0,0,0);
+//     i = 0;
+//     j = 0;
+//     k = 0;
+//     for(h=0; h<pointsSize; h++)
+//     {
+//             norm = sqrt( pow( i-(*CoordX)[h],2 ) + pow( j-(*CoordY)[h],2 ) + pow( k-(*CoordZ)[h],2 ));
+//             //val = val + ( D(h) * RBF_ThinPlate_3D(norm) );
+//             val = val + ( D(h) * RBF_WendLand(norm,rad) );
+//             if( h == pointsSize-1 )
+//             {
+//                     val = val - 1;
+//                     pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,k);
+//                     if ( val >=0 ) 
+//                     { 
+//                             *pValue = 128;
+//                     } 
+//                     else 
+//                     {
+//                             *pValue = 0;
+//                     }
+//                     //pValue++;
+//                     j++;
+//                     h = -1;
+//                     val = 0;
+//                     if( j == _dimImage[0] )
+//                     {
+//                             i++;
+//                             j = 0;
+//                             h = -1;
+//                             if( i == _dimImage[1])
+//                             {
+//                                     k++;
+//                                     i = 0;
+//                                     j = 0;
+//                                     h = -1;
+//                                     if(k == _dimImage[2])
+//                                     {
+//                                             h = pointsSize;
+//                                     }
+//                             }
+//                     }
+//             }
+//     }
+
+       i = (int)min-10;
+       j = (int)min-10;
+       k = (int)minz-10;
+       val = 0;
+
+       for(h=0; h<pointsSize; h++)
+       {
+               norm = sqrt( pow( i-(*CoordX)[h],2 ) + pow( j-(*CoordY)[h],2 ) + pow( k-(*CoordZ)[h],2 ));
+               val = val + ( D(h) * RBF_WendLand(norm,rad) );
+               if( h == pointsSize-1 )
+               {
+                       val = val - 1;
+                       pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,k);
+                       if ( val >=0 ) 
+                       { 
+                               *pValue = 128;
+                       } 
+                       else 
+                       {
+                               *pValue = 0;
+                       }
+                       //pValue++;
+                       j++;
+                       h = -1;
+                       val = 0;
+                       if( j == (int)max+10)
+                       {
+                               i++;
+                               j = min-10;
+                               h = -1;
+                               if( i == (int)max+10)
+                               {
+                                       k++;
+                                       i = min-10;
+                                       j = min-10;
+                                       h = -1;
+                                       if(k == maxz+10)
+                                       {
+                                               h = pointsSize;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       interval = wxGetElapsedTime(FALSE);
+       long interPlane = interval/_dimImage[2];
+
+       for(i=0; i<pointsSize; i++)
+       {
+                pValue = (unsigned short *)imagedataValue->GetScalarPointer( (int)(*CoordX)[i] , (int)(*CoordY)[i] ,(int)(*CoordZ)[i]);
+               *pValue=255;
+       }
+
+       long intervalPC = wxGetElapsedTime();
+
+       printf("\n\n JSTG - PropContour::method_RBF_3D ------------------------");
+       printf("\n TIME FOR: IMAGE 3D WITHOUT THE CONTROL POINTS.... %lld (ms)",interval);
+       printf("\n TIME FOR: IMAGE 3D WITH THE CONTROL POINTS....... %lld (ms)",intervalPC);
+       printf("\n TIME AVERAGE FOR: EVERY PLANE.................... %lld (ms)",interPlane);
+       printf("\n NUMBER OF PLANES................................. %d",k);
+       printf("\n TOTAL NUMBER OF CONTROL POINTS................... %d",pointsSize);
+       printf("\n ------------------------------------------------------------");
+
+       return imagedataValue;
+}
+//----------------------------------------------------------------------------------------------------
+
+vtkImageData* PropContour::method_RBF_3D_ThinPlate (  double rad, std::vector<double>*CoordX, std::vector<double>*CoordY, 
+                                                                                                         std::vector<double>*CoordZ )
+{
+       long interval = wxGetElapsedTime(TRUE);
+
+       int i,j,k,h;
+       int pointsSize = CoordX->size();
+       double max = -1, min = 1000, minz = 100000, maxz = -10000;
+
+       for( i=0; i<pointsSize; i++ )
+       {
+               if( (*CoordX)[i] > max )
+               {
+                       max = (*CoordX)[i]; 
+               }
+               if( (*CoordY)[i] > max )
+               {
+                       max = (*CoordY)[i]; 
+               }
+               if( (*CoordX)[i] < min )
+               {
+                       min = (*CoordX)[i]; 
+               }
+               if( (*CoordY)[i] < min )
+               {
+                       min = (*CoordY)[i]; 
+               }
+               if( (*CoordZ)[i] < minz )
+               {
+                       minz = (*CoordZ)[i];
+               }
+               if( (*CoordZ)[i] > maxz )
+               {
+                       maxz = (*CoordZ)[i];
+               }
+       }
+
+       _dimImage[0] = 190;                     // X axis
+       _dimImage[1] = 190;                     // Y axis
+       _dimImage[2] = 190;                     // Z axis
+
+       double spc[3]={1,1,1};
+       double norm = 0, val, vvalue;
+
+       vnl_matrix<double> A( pointsSize,pointsSize, 0.0 );
+       vnl_matrix<double> Ainv( pointsSize,pointsSize, 0.0 );
+       vnl_matrix<double> I( pointsSize,pointsSize, 0.0 );
+       vnl_vector<double> H( pointsSize, 1 );
+       vnl_vector<double> D( pointsSize, 0.0 );
+       vnl_vector<double> Q( 3, 0.0 );
+
+       unsigned short *pValue;
+       imagedataValue = vtkImageData::New();
+       imagedataValue->SetScalarTypeToUnsignedShort();
+       imagedataValue->SetSpacing(spc);
+       imagedataValue->SetDimensions(_dimImage);
+       imagedataValue->SetExtent(0,_dimImage[0]-1,0,_dimImage[1]-1,-10,_dimImage[2]-1);
+       imagedataValue->AllocateScalars();
+       imagedataValue->Update();
+
+       for(i=0; i<pointsSize; i++)
+       {
+               for(j=0; j<pointsSize; j++)
+               {
+                       norm = sqrt( pow((*CoordX)[i]-(*CoordX)[j],2) + pow((*CoordY)[i]-(*CoordY)[j],2) + pow((*CoordZ)[i]-(*CoordZ)[j],2) );
+                       A(i,j) = RBF_ThinPlate_3D(norm);
+               }
+       }
+       D = vnl_matrix_inverse<double>(A)* H;
+
+//Inicialization
+//     for(k=0; k<_dimImage[2]; k++)
+//     {
+//             for(j=0; j<_dimImage[1]; j++)
+//             {
+//                     for(i=0; i<_dimImage[0]; i++)
+//                     {
+//                             pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,k);
+//                             *pValue = 0;
+//                     }
+//             }
+//     }
+
+//Filling
+
+//     pValue = (unsigned short *)imagedataValue->GetScalarPointer(0,0,0);
+//     i = 0;
+//     j = 0;
+//     k = 0;
+//     for(h=0; h<pointsSize; h++)
+//     {
+//             norm = sqrt( pow( i-(*CoordX)[h],2 ) + pow( j-(*CoordY)[h],2 ) + pow( k-(*CoordZ)[h],2 ));
+//             //val = val + ( D(h) * RBF_ThinPlate_3D(norm) );
+//             val = val + ( D(h) * RBF_WendLand(norm,rad) );
+//             if( h == pointsSize-1 )
+//             {
+//                     val = val - 1;
+//                     pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,k);
+//                     if ( val >=0 ) 
+//                     { 
+//                             *pValue = 128;
+//                     } 
+//                     else 
+//                     {
+//                             *pValue = 0;
+//                     }
+//                     //pValue++;
+//                     j++;
+//                     h = -1;
+//                     val = 0;
+//                     if( j == _dimImage[0] )
+//                     {
+//                             i++;
+//                             j = 0;
+//                             h = -1;
+//                             if( i == _dimImage[1])
+//                             {
+//                                     k++;
+//                                     i = 0;
+//                                     j = 0;
+//                                     h = -1;
+//                                     if(k == _dimImage[2])
+//                                     {
+//                                             h = pointsSize;
+//                                     }
+//                             }
+//                     }
+//             }
+//     }
+
+       i = (int)min-10;
+       j = (int)min-10;
+       k = (int)minz-10;
+       val = 0;
+
+       for(h=0; h<pointsSize; h++)
+       {
+               norm = sqrt( pow( i-(*CoordX)[h],2 ) + pow( j-(*CoordY)[h],2 ) + pow( k-(*CoordZ)[h],2 ));
+               val = val + ( D(h) * RBF_ThinPlate_3D(norm) );
+               if( h == pointsSize-1 )
+               {
+                       val = val - 1;
+                       pValue = (unsigned short *)imagedataValue->GetScalarPointer(i,j,k);
+                       if ( val >=0 ) 
+                       { 
+                               *pValue = 128;
+                       } 
+                       else 
+                       {
+                               *pValue = 0;
+                       }
+                       //pValue++;
+                       j++;
+                       h = -1;
+                       val = 0;
+                       if( j == (int)max+10)
+                       {
+                               i++;
+                               j = min-10;
+                               h = -1;
+                               if( i == (int)max+10)
+                               {
+                                       k++;
+                                       i = min-10;
+                                       j = min-10;
+                                       h = -1;
+                                       if(k == maxz+10)
+                                       {
+                                               h = pointsSize;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       interval = wxGetElapsedTime(FALSE);
+       long interPlane = interval/_dimImage[2];
+
+       for(i=0; i<pointsSize; i++)
+       {
+                pValue = (unsigned short *)imagedataValue->GetScalarPointer( (int)(*CoordX)[i] , (int)(*CoordY)[i] ,(int)(*CoordZ)[i]);
+               *pValue=255;
+       }
+
+       long intervalPC = wxGetElapsedTime();
+
+       printf("\n\n JSTG - PropContour::method_RBF_3D ------------------------");
+       printf("\n TIME FOR: IMAGE 3D WITHOUT THE CONTROL POINTS.... %lld (ms)",interval);
+       printf("\n TIME FOR: IMAGE 3D WITH THE CONTROL POINTS....... %lld (ms)",intervalPC);
+       printf("\n TIME AVERAGE FOR: EVERY PLANE.................... %lld (ms)",interPlane);
+       printf("\n NUMBER OF PLANES................................. %d",k);
+       printf("\n TOTAL NUMBER OF CONTROL POINTS................... %d",pointsSize);
+       printf("\n ------------------------------------------------------------");
+
+       return imagedataValue;
+}
+
+*/
+
+//---------------------------------------------------------------------------------------------------------
+void PropContour::ReadKeyContour(FILE* fd)
+{
+       char firstline[30];
+       int     size;
+       double x,y;             
+       int z;
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       tempX.clear();
+       tempY.clear();
+       tempZ.clear();
+       while(!feof(fd))
+       {
+               fscanf(fd," %s %d",&firstline,&size);
+               for(int i=0; i<size; i++)
+               {
+                       fscanf(fd,"%lf %lf %d",&x,&y,&z);
+                       tempX.push_back(x);
+                       tempY.push_back(y);
+                       tempZ.push_back(z);
+               }
+               SetKeyContours(&tempX,&tempY,&tempZ);
+               tempX.clear();
+               tempY.clear();
+               tempZ.clear();
+       }
+}
+//---------------------------------------------------------------------------------------------------------
+int PropContour::VectorDirection(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       int dir,i;
+       double SumX = 0,SumY = 0;
+       double ax,ay,bx,by,axb;
+       int size = InX->size();
+       for(i=0; i<size; i++)
+       {
+               SumX = SumX + (*InX)[i];
+               SumY = SumY + (*InY)[i];
+       }
+       SumX = SumX/size;               //Mass Center: X coord
+       SumY = SumY/size;               //Mass Center: Y coord
+       
+       int positive = 0;
+       int negative = 0;
+       for(i=0; i<size; i++)
+       {
+               ax = (*InX)[i]-SumX;
+               ay = (*InY)[i]-SumY;
+               bx = (*InX)[i+1]-SumX;
+               by = (*InY)[i+1]-SumY;
+               axb = (ax*by) - (bx*ay);
+               if(axb > 0)
+               {
+                       positive++;
+               }
+               if(axb < 0)
+               {
+                       negative++;
+               }
+       }
+       if(positive >= negative)
+       {
+               dir = 1;
+       }
+       else
+       {
+               dir = -1;
+       }
+
+       return dir;
+}
+//----------------------------------------------------------------------------------------------------
+void PropContour::VectorOrder(int dir, int posini, std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+       int size = InX->size();
+       int i;
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       
+       tempX.clear();
+       tempY.clear();
+       tempZ.clear();
+
+       for(i=0; i<size; i++)
+       {
+               if(dir == 1)
+               {
+                       tempX.push_back((*InX)[posini]);
+                       tempY.push_back((*InY)[posini]);
+                       tempZ.push_back((*InZ)[posini]);
+                       posini++;
+                       if(posini == size)
+                       {
+                               posini = 0;
+                       }
+               }
+               if(dir == -1)
+               {
+                       tempX.push_back((*InX)[posini]);
+                       tempY.push_back((*InY)[posini]);
+                       tempZ.push_back((*InZ)[posini]);
+                       posini--;
+                       if(posini < 0)
+                       {
+                               posini = size-1;
+                       }
+               }
+       }
+       InX->clear();
+       InY->clear();
+       InZ->clear();
+       for(i=0; i<size; i++)
+       {
+               InX->push_back(tempX[i]);
+               InY->push_back(tempY[i]);
+               InZ->push_back(tempZ[i]);
+       }
+
+}
+//----------------------------------------------------------------------------------------------------
+void PropContour::PreparePointsForSpline(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ, 
+                                                                                std::vector<int>*Sizes)
+{
+       int sizeS = Sizes->size();
+       int sizeV = InX->size();
+       int i,j,mem,posinic,dir,cont;
+       double leX;
+
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       std::vector<double> lstX;
+       std::vector<double> lstY;
+       std::vector<double> lstZ;
+       
+       lstX.clear();
+       lstY.clear();
+       lstZ.clear();
+
+       mem = 0;
+       cont = 0;
+       for(i=0; i<sizeS; i++)
+       {
+               leX=1000;
+               tempX.clear();
+               tempY.clear();
+               tempZ.clear();
+               for(j=0; j<(*Sizes)[i]; j++)
+               {
+                       tempX.push_back((*InX)[j+mem]);
+                       tempY.push_back((*InY)[j+mem]);
+                       tempZ.push_back((*InZ)[j+mem]);
+                       if( (*InX)[j] < leX )
+                       {
+                               posinic = j;
+                               leX = (*InX)[j];
+                       }
+               }
+               mem = mem + (*Sizes)[i];
+               dir = VectorDirection(&tempX,&tempY,&tempZ);
+               VectorOrder(dir,posinic,&tempX,&tempY,&tempZ);
+
+               for(j=0; j<(*Sizes)[i]; j++)
+               {
+                       lstX.push_back(tempX[j]);
+                       lstY.push_back(tempY[j]);
+                       lstZ.push_back((*InZ)[j+cont]);
+               }
+               cont = cont + (*Sizes)[i];
+       }
+
+//Fill the Finally lst in X,Y,Z ---------------
+       int sizetemp = lstX.size();
+       //printf("\nJSTG-PropContour::PreparePointsForSpline");
+       InX->clear();
+       InY->clear();
+       InZ->clear();
+       for(i=0; i<sizetemp; i++)
+       {
+               //printf("\nlst: Z = %f, X = %f, Y = %f, ",lstZ[i],lstX[i],lstY[i]);
+               InX->push_back(lstX[i]);
+               InY->push_back(lstY[i]);
+               InZ->push_back(lstZ[i]);
+       }
+
+       
+}
+//----------------------------------------------------------------------------------------------------
+vtkImageData* PropContour::method_Spline(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ, std::vector<int>*Sizes)
+{
+       long interval = wxGetElapsedTime(TRUE);
+
+       int i,j,k,sizeX,sizeS,sizeInS;
+       int numspline;
+       double x,y,z;
+//EED  double spc[3]={1,1,1};
+       std::vector<double> lstX;
+       std::vector<double> lstY;
+       std::vector<double> lstZ;
+       std::vector<double> tempX;
+       std::vector<double> tempY;
+       std::vector<double> tempZ;
+       std::vector<double> tempS;
+       _mContourModel = new manualContourModel();
+       _mContourModel->SetNumberOfPointsSpline(_interpnumber);
+
+       imagedataValue=NULL;
+//EED
+//     _dimImage[0] = 200;                     // X axis
+//     _dimImage[1] = 200;                     // Y axis
+//     _dimImage[2] = 200;                     // Z axis
+//
+//     unsigned short *pValue;
+//     imagedataValue = vtkImageData::New();
+//     imagedataValue->SetScalarTypeToUnsignedShort();
+//     imagedataValue->SetSpacing(spc);
+//     imagedataValue->SetDimensions(_dimImage);
+//     imagedataValue->SetExtent(0,_dimImage[0]-1,0,_dimImage[1]-1,0,_dimImage[2]-1);
+//     imagedataValue->AllocateScalars();
+//     imagedataValue->Update();
+       
+//     lstX.clear();
+//     lstY.clear();
+//     lstZ.clear();
+
+       sizeX = InX->size();
+       for(i=0; i<sizeX; i++)
+       {
+               lstX.push_back((*InX)[i]);
+               lstY.push_back((*InY)[i]);
+               lstZ.push_back((*InZ)[i]);
+       }
+       
+       PreparePointsForSpline(&lstX,&lstY,&lstZ,Sizes);
+       /*int sizetemp = lstX.size();
+       printf("\nJSTG-PropContour::method_Spline");
+       for(i=0; i<sizetemp; i++)
+       {
+               printf("\nlst: Z = %f, X = %f, Y = %f, ",lstZ[i],lstX[i],lstY[i]);
+       }*/
+
+       sizeS = Sizes->size();
+       int cont = 0;
+       for(i=0; i<sizeS; i++)
+       {
+               _mContourModel->DeleteAllPoints();
+               _mContourModel->SetCloseContour(true);
+               sizeInS = (*Sizes)[i];
+               for(j=0; j<sizeInS; j++)
+               {
+                       _mContourModel->AddPoint(lstX[cont],lstY[cont],lstZ[cont]);
+                       cont ++;
+               }
+               _mContourModel->UpdateSpline();
+               numspline = _mContourModel->GetNumberOfPointsSpline();
+               for(k=0; k<numspline; k++)
+               {
+                       _mContourModel->GetSpline_i_Point(k,&x,&y,&z);
+//EED                  pValue = (unsigned short *)imagedataValue->GetScalarPointer(x,y,z);
+//                     *pValue = 128;
+                       tempX.push_back(x);
+                       tempY.push_back(y);
+                       tempZ.push_back(z);
+               }
+       }
+       
+       int tam = numspline;
+       std::vector<Vector>::iterator it;
+       
+       ResetPlaneVector();
+
+       for(i=0; i<numspline; i++)
+       {
+               Vector *vec = new Vector();
+               _planevector.push_back(*vec);
+       }// for i
+
+       for(j=0; j<tam; j++)
+       {
+               _mContourModel->DeleteAllPoints();
+               _mContourModel->SetCloseContour(false);
+               cont = 0;
+               for(i=0; i<sizeS; i++)
+               {
+                       double hh=tempZ[cont+j];
+                       _mContourModel->AddPoint(tempX[cont+j],tempY[cont+j],tempZ[cont+j]);
+                       cont = cont + tam;
+               } // for i
+               _mContourModel->UpdateSpline();
+               numspline = _mContourModel->GetNumberOfPointsSpline();
+               for(k=0; k<numspline; k++)
+               {
+//EED002
+                       _mContourModel->GetSpline_i_Point(k,&x,&y,&z);
+                       _planevector[k].set_x(x);
+                       _planevector[k].set_y(y);
+                       _planevector[k].set_z(z);
+                       _planevector[k].set_plane(k);
+//EED                  pValue = (unsigned short *)imagedataValue->GetScalarPointer(x,y,z);
+//EED                  *pValue = 128;
+               } // for k
+       } // for j
+
+/*
+       int tempsize = _planevector.size();
+       int sizexx;
+       for(i=0; i<tempsize; i++)
+       {
+               sizexx = _planevector[i].getsize_x();
+       }
+*/
+/*
+       interval = wxGetElapsedTime(FALSE);
+       int zplanes = abs(tempZ[0]-tempZ[tempZ.size()-1]);
+       long interPlane = interval/zplanes;
+       int pointsSize = 0;
+       for(i=0; i<sizeS; i++)
+       {
+               pointsSize = pointsSize + (*Sizes)[i]; 
+       }
+       for(i=0; i<pointsSize; i++)
+       {
+                pValue = (unsigned short *)imagedataValue->GetScalarPointer( (int)(*InX)[i] , (int)(*InY)[i] ,(int)(*InZ)[i]);
+               *pValue=255;
+       }
+
+       printf("\n\n JSTG - PropContour::method_Spline ------------------------");
+       printf("\n TIME FOR: IMAGE 3D WITHOUT THE CONTROL POINTS.... %d (ms)",interval);
+       //printf("\n TIME FOR: IMAGE 3D WITH THE CONTROL POINTS....... %lld (ms)",intervalPC);
+       printf("\n TIME AVERAGE FOR: EVERY PLANE.................... %d (ms)",interPlane);
+       printf("\n NUMBER OF PLANES................................. %d",zplanes);
+       printf("\n TOTAL NUMBER OF CONTROL POINTS................... %d",pointsSize);
+       printf("\n ------------------------------------------------------------");
+*/
+       return imagedataValue;
+}
+
+//---------------------------------------------------------------------------------------------------
+void PropContour::ResetPlaneVector()
+{
+//     Vector *vec;
+//     int ii,iiSize = _planevector.size();
+//     for (ii=0 ; ii<iiSize ; ii++) 
+//     {
+//             vec = &(_planevector[ii]);
+//             delete vec;
+//     }
+       _planevector.clear();
+}
+
+
+//---------------------------------------------------------------------------------------------------
+void PropContour::ResetKeyContours()
+{
+       _KeyContourSizes.clear();
+       _KeyContourX.clear();
+       _KeyContourY.clear();
+       _KeyContourZ.clear();
+}
+//---------------------------------------------------------------------------------------------------
+void PropContour::SetKeyContours(std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ)
+{
+
+       int idKeyContour                = 0;
+       int idKeyContourSizes   = 0;
+       int tmpIdKeyContSizes   = 0;
+       bool okFind                             = false;
+       int i;
+       int sizeKeyContour,Z=(*InZ)[0];
+       sizeKeyContour = _KeyContourZ.size();
+       for (i=0; i<sizeKeyContour; i++)
+       { 
+               if (i>0)
+               {
+                       if ( (_KeyContourZ[i-1]<Z) && (_KeyContourZ[i]>=Z) )
+                       {
+                               idKeyContour            = i;
+                               idKeyContourSizes       = tmpIdKeyContSizes;
+                               okFind=true;
+                               i=sizeKeyContour;
+                       }
+                       if ( (_KeyContourZ[i-1] != _KeyContourZ[i]) )
+                       {
+                               tmpIdKeyContSizes++;
+                       }
+               } else {
+                       if  (_KeyContourZ[0]>Z) 
+                       {
+                               idKeyContour            = 0;
+                               idKeyContourSizes       = 0;
+                               okFind                          = true;
+                               i                                       = sizeKeyContour;
+                       }
+               } // if >O
+       } // for 
+
+       if (okFind==false)
+       {
+               idKeyContour            = _KeyContourX.size();
+               idKeyContourSizes       = _KeyContourSizes.size();
+               okFind=true;
+       }
+
+       _KeyContourSizes.insert( _KeyContourSizes.begin() + idKeyContourSizes , InX->size() );
+       for(i=0; i<InX->size(); i++)
+       {
+               _KeyContourX.insert( _KeyContourX.begin() + idKeyContour, (*InX)[i] );
+               _KeyContourY.insert( _KeyContourY.begin() + idKeyContour, (*InY)[i] );
+               _KeyContourZ.insert( _KeyContourZ.begin() + idKeyContour, (*InZ)[i] );
+       }
+
+
+//EED
+//     _KeyContourSizes.push_back( InX->size() );
+//     for(i=0; i<InX->size(); i++)
+//     {
+//             _KeyContourX.push_back( (*InX)[i] );
+//             _KeyContourY.push_back( (*InY)[i] );
+//             _KeyContourZ.push_back( (*InZ)[i] );
+//     }
+
+}
+//---------------------------------------------------------------------------------------------------
+vtkImageData* PropContour::CalculeSplinePropagation()
+{
+       if(_KeyContourSizes.size() <= 0)
+       {
+               printf("\n There would be at last 1 contour");
+               return NULL;
+       }
+       if(_KeyContourSizes.size() == 1)
+       {
+               return NULL;
+       }
+       if(_KeyContourSizes.size() >= 2)
+       {
+               return method_Spline(&_KeyContourX,&_KeyContourY,&_KeyContourZ,&_KeyContourSizes);
+       }
+}
+//---------------------------------------------------------------------------------------------------
+void PropContour::GetKeyContours(std::vector<double>*KeyX, std::vector<double>*KeyY, std::vector<double>*KeyZ, std::vector<int>*KeyS)
+{
+       int i;
+       KeyX->clear();
+       KeyY->clear();
+       KeyZ->clear();
+       KeyS->clear();
+
+       for(i=0; i<_KeyContourSizes.size(); i++)
+       {
+               KeyS->push_back( _KeyContourSizes[i] );
+       }
+       for(i=0; i<_KeyContourX.size(); i++)
+       {
+               KeyX->push_back( _KeyContourX[i] );
+               KeyY->push_back( _KeyContourY[i] );
+               KeyZ->push_back( _KeyContourZ[i] );
+       }
+}
+//---------------------------------------------------------------------------------------------------
+void PropContour::GetPropagatedContours( std::vector<Vector>*planevec )
+{
+       int i,j;
+       planevec->clear();
+       for(i=0; i<_planevector.size(); i++)
+       {
+               Vector *temp = new Vector();
+               temp->set_plane( _planevector[i].get_plane() );
+               for(j=0; j<_planevector[i].getsize_x(); j++)
+               {
+                       temp->set_x( _planevector[i].get_x(j) );
+                       temp->set_y( _planevector[i].get_y(j) );
+                       temp->set_z( _planevector[i].get_z(j) );
+               }
+               planevec->push_back(*temp);
+               delete temp;
+       }
+}
+//---------------------------------------------------------------------------------------------------
+void PropContour::SetInterpNumber(int val)
+{
+       _interpnumber = val;
+}
+
+int  PropContour::FindIdWithZ(double z)
+{
+       int result_ID=0;
+       int k,size=_planevector.size();
+       double dist,minDist=99999999;
+       for ( k=0 ; k<size ; k++)
+       {
+               dist=fabs( z - _planevector[k].get_z(0) );
+               if (dist<minDist)
+               {
+                       minDist=dist;
+                       result_ID = k;
+               }
+       }// for i
+       return result_ID;
+}
+
+//---------------------------------------------------------------------------------------------------
+void PropContour::GetIdContour(int id, std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ)
+{
+       int i;
+       vecX->clear();
+       vecY->clear();
+       vecZ->clear();
+       int sizeplane = _planevector[id].getsize_x();
+       double tempx;
+       for(i=0; i<_planevector[id].getsize_x(); i++)
+       {
+               vecX->push_back( _planevector[id].get_x(i) );
+               tempx = _planevector[id].get_x(i);
+               vecY->push_back( _planevector[id].get_y(i) );
+               vecZ->push_back( _planevector[id].get_z(i) );
+       }
+}
+//---------------------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------------
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/Propagation.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/Propagation.h
new file mode 100644 (file)
index 0000000..9ede3ea
--- /dev/null
@@ -0,0 +1,101 @@
+#ifndef __Propagation_h_INCLUDED__
+#define __Propagation_h_INCLUDED__
+
+#include "vtkImageData.h"
+
+/* EED 03/07/2008
+  #include "itkMatrix.h"
+*/
+
+#include "../manualContour.h"
+#include "time.h"
+#include <wx/wx.h>
+
+class Vector
+{
+       public:
+                       Vector  ();
+                       ~Vector ();
+            void       set_vec         ( double val );
+                       void    set_var         ( double val );
+                       double  get_vec         ( int id );
+                       double  get_var         ( );
+                       int             getsize_vec     ( );
+                       void    copyVector      ( std::vector<Vector>*vec1, std::vector<Vector>*vec2 ); 
+                       void    printVector     ( std::vector<Vector>*vec1 );
+                       void    set_x           ( double val );
+                       void    set_y           ( double val );
+                       void    set_z           ( double val );
+                       void    set_plane       ( int val );
+                       double  get_x           ( int id );
+                       int             getsize_x       ( );
+                       double  get_y           ( int id );
+                       int             getsize_y       ( );
+                       double  get_z           ( int id );
+                       int             getsize_z       ( );
+                       int             get_plane       ( );
+                       void    resetVec        ( );
+                       std::vector<double>     getVec();
+
+       private:
+                       double _var;
+                       int _plane;
+                       std::vector<double> _vec;
+                       std::vector<double> _vecX;
+                       std::vector<double> _vecY;
+                       std::vector<double> _vecZ;
+};
+
+class PropContour
+{
+       public:
+                       PropContour();
+                       ~PropContour();
+
+/* EED 03/07/2008
+                       vtkImageData*   method_RBF                                      ( double rad, std::vector<double>*CoordX, std::vector<double>*CoordY, 
+                                                                                                                 std::vector<double>*CoordZ );
+                       vtkImageData*   method_RBF_3D                           ( double rad, std::vector<double>*CoordX, std::vector<double>*CoordY, 
+                                                                                                                 std::vector<double>*CoordZ );
+                       vtkImageData*   method_RBF_3D_ThinPlate         ( double rad, std::vector<double>*CoordX, std::vector<double>*CoordY, 
+                                                                                                                 std::vector<double>*CoordZ );
+*/
+
+                       int                             VectorDirection                         ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       void                    VectorOrder                                     ( int dir, int posinic, std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ);
+                       void                    ReadKeyContour                          ( FILE* fd );
+                       void                    ResetKeyContours                        ( );
+                       void                    SetKeyContours                          ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ );
+                       vtkImageData*   CalculeSplinePropagation        (  );  
+                       void                    GetKeyContours                          ( std::vector<double>*KeyX, std::vector<double>*KeyY, std::vector<double>*KeyZ, std::vector<int>*KeyS );
+                       void                    GetPropagatedContours           ( std::vector<Vector>*planevec );
+                       void                    GetIdContour                            ( int id, std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ );
+                       void                    SetInterpNumber                         ( int val );
+                       int                             FindIdWithZ                                     ( double z );
+
+       private:
+
+/* EED 03/07/2008
+                       double                  RBF_WendLand                            ( double norm, double m_rad );
+                       double                  RBF_ThinPlate                           ( double norm );
+                       double                  RBF_ThinPlate_3D                        ( double norm );
+*/
+
+                       void                    PreparePointsForSpline          ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ, std::vector<int>*Sizes );
+                       vtkImageData*   method_Spline                           ( std::vector<double>*InX, std::vector<double>*InY, std::vector<double>*InZ, std::vector<int>*Sizes );
+                       void                    ResetPlaneVector();
+                       
+                       int                                             _interpnumber;
+
+                       int                                             _dimImage[3];
+                       vtkImageData                    *imagedataValue;
+                       manualContourModel              *_mContourModel;
+
+                       std::vector<double>             _KeyContourX;
+                       std::vector<double>             _KeyContourY;
+                       std::vector<double>             _KeyContourZ;
+                       std::vector<int>                _KeyContourSizes;
+
+                       std::vector<Vector>             _planevector;
+};
+#endif // __Propagation_h_INCLUDED__
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/contoursIntersection.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/contoursIntersection.cxx
new file mode 100644 (file)
index 0000000..0fb1259
--- /dev/null
@@ -0,0 +1,38 @@
+#include "contoursIntersection.h"
+
+//Construction
+contoursIntersection::contoursIntersection()
+{
+}
+//Destruction
+contoursIntersection::~contoursIntersection()
+{
+} 
+//-----------------------------------------------------------
+double contoursIntersection::Slope(double x0, double y0, double x1, double y1)
+{
+       double m = (y1-y0)/(x1-x0);
+       return m;
+}
+//-----------------------------------------------------------
+double contoursIntersection::Normal(double x0, double y0, double* m, double xi)
+{
+       double y;
+       *m = -(1/(*m));
+       y = ((*m)*(xi - x0)) + y0;
+       return y;
+}
+//-----------------------------------------------------------
+void contoursIntersection::Intersection(double x01, double y01, double x02, double y02, double mn, double m2, double* x, double* y)
+{
+       *x = ( y02-y01-(m2*x02)+(mn*x01) )/(mn-m2);
+       *y = m2*(*x-x02)+y02;
+}
+//-----------------------------------------------------------
+//-----------------------------------------------------------
+//-----------------------------------------------------------
+//-----------------------------------------------------------
+//-----------------------------------------------------------
+//-----------------------------------------------------------
+//-----------------------------------------------------------
+//-----------------------------------------------------------
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/contoursIntersection.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/contoursIntersection.h
new file mode 100644 (file)
index 0000000..06255d0
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef __contoursIntersection_h_INCLUDED__
+#define __contoursIntersection_h_INCLUDED__
+
+#include "manualContour.h"
+#include "vectorFunctions.h"
+
+class contoursIntersection
+{
+  public:
+               contoursIntersection  ( );
+               ~contoursIntersection ( );
+        double Slope                ( double x0, double y0,
+                                      double x1, double y1 );
+        double Normal               ( double x0, double y0,
+                                      double *m, double xi );
+        void Intersection           ( double x01, double y01,
+                                      double x02, double y02,
+                                      double mn, double m2,
+                                      double *x, double *y );
+        void SetContour1            ( std::vector<double>*InX1,
+                                      std::vector<double>*InY1,
+                                      std::vector<double>*InZ1 );
+        void SetContour2            ( std::vector<double>*InX2,
+                                      std::vector<double>*InY2,
+                                      std::vector<double>*InZ2 );
+        //All the intersections between the two set contour
+        void InterBetweenContours   ( std::vector<double>*OutX,
+                                      std::vector<double>*OutY,
+                                      std::vector<double>*OutZ );
+        //All the possible intersections between the contours
+        void PossibleIntersections  ( std::vector<double>*OutX,
+                                      std::vector<double>*OutY,
+                                      std::vector<double>*OutZ );
+        //Logical intersections between the two set contours
+        void IntersectionPoints     ( std::vector<double>*OutX,
+                                      std::vector<double>*OutY,
+                                      std::vector<double>*OutZ );
+        //Set the parameter data for stimate the error between the contours
+        void SetErrorParameter      ( double val );
+        //The error between the contours
+        int GetErrorBetweenContours ( double error );
+   private:
+         std::vector<double> _InX1;
+         std::vector<double> _InY1;
+         std::vector<double> _InZ1;
+          std::vector<double> _InX2;
+         std::vector<double> _InY2;
+         std::vector<double> _InZ2;
+};
+#endif
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/vectorFunctions.cxx b/lib/maracasVisuLib/src/interface/wxWindows/Contour/vectorFunctions.cxx
new file mode 100644 (file)
index 0000000..cc4be76
--- /dev/null
@@ -0,0 +1,176 @@
+#include "vectorFunctions.h"
+
+//Constructor
+vectorFunctions::vectorFunctions()
+{
+}
+//Destructor
+vectorFunctions::~vectorFunctions()
+{
+}
+
+//---------------------------------------------------------------
+//Copy Vector1 in Vector2 (double)
+void vectorFunctions::copyVector(std::vector<double>*Vector1,std::vector<double>*Vector2)
+{
+       int size = Vector1->size();
+       Vector2->clear();
+       int i;
+       if(size != 0)
+       {
+               for(i=0; i<size; i++)
+               {
+                       Vector2->push_back( (*Vector1)[i] );
+               }
+       }
+}
+//---------------------------------------------------------------
+//Copy Vector1 in Vector2 (int)
+void vectorFunctions::copyintVector(std::vector<int>*Vector1,std::vector<int>*Vector2)
+{
+       int size = Vector1->size();
+       Vector2->clear();
+       int i;
+       if(size =! 0)
+       {
+               for(i=0; i<size; i++)
+               {
+                       Vector2->push_back( (*Vector1)[i] );
+               }
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Print 2 vectors of the same size
+void vectorFunctions::printVector(std::vector<double>*Vector1,std::vector<double>*Vector2)
+{
+       int i;
+       if( Vector1->size() == Vector2->size() )
+       {
+               for(i=0; i<Vector1->size(); i++)
+               {
+                       printf("\n v1(%d) = %f, v2(%d) = %f",i,(*Vector1)[i],i,(*Vector2)[i]);
+               }
+       }
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Returns the average value of the vector
+double vectorFunctions::promVector(std::vector<double>*Vector1, bool OnNormal)
+{
+       int i;
+       double suma = 0,prom;
+       std::vector<double> tempv;
+       int size = Vector1->size();
+       if(size != 0)
+       {
+               if(OnNormal == false)
+               {
+                       for(i=0; i<size; i++)
+                       {
+                               suma = suma + (*Vector1)[i];
+                       }
+                       return prom = suma/Vector1->size();
+               }
+               int pos;
+               double maxval;
+               copyVector(Vector1,&tempv);
+               if(OnNormal == true)
+               {
+                       pos = maxVector(Vector1,&maxval);
+                       for(i=0; i<size; i++)
+                       {
+                               tempv.push_back((*Vector1)[i]/maxval);
+                       }
+                       suma = 0;
+                       for(i=0; i<tempv.size(); i++)
+                       {
+                               suma = suma + tempv[i];
+                       }
+                       return prom = suma/tempv.size();
+               }
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Returns the maximum value of the vector
+int vectorFunctions::maxVector(std::vector<double>*Vector1,double *val)
+{
+       int i, pos;
+       double max = -1;
+       if(Vector1->size() != 0)
+       {
+               for(i=0; i<Vector1->size(); i++)
+               {
+                       if( (*Vector1)[i]>max )
+                       {
+                               max = (*Vector1)[i];
+                               pos = i;
+                       }
+               }
+               *val = max;
+               return pos;
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Returns the minimum value of the vector
+int vectorFunctions::minVector(std::vector<double>*Vector1,double *val)
+{
+       int i, pos;
+       double min = 99999;
+       if(Vector1->size() != 0)
+       {
+               for(i=0; i<Vector1->size(); i++)
+               {
+                       if( (*Vector1)[i]<min )
+                       {
+                               min = (*Vector1)[i];
+                               pos = i;
+                       }
+               }
+               *val = min;
+               return pos;
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Find the minimal distance between an input point and an input lists of points
+int vectorFunctions::nearPoint(std::vector<double>*VectorX, std::vector<double>*VectorY, double px, double py)
+{
+       int i, pos = -1;
+       double min = 10000, dist;
+       if(VectorX->size() != 0)
+       {
+               for(i=0; i<VectorX->size(); i++)
+               {
+                       dist = sqrt(pow(px-(*VectorX)[i],2) + pow(py-(*VectorY)[i],2));
+                       if(dist<min)
+                       {
+                               min = dist;
+                               pos = i;
+                       }
+               }
+               return pos;
+       }
+       return -1;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------
+//Returns the position of the point in the lsts. (Aprox. + or - 1).
+int vectorFunctions::findPointInLst(std::vector<double>*vecX, std::vector<double>*vecY, std::vector<double>*vecZ, 
+                                                                       double x, double y, double z)
+{
+       int i,flag = -1;
+       double apr = 1.5;
+       if(vecX->size() != 0)
+       {
+               for(i=0; i<vecX->size(); i++)
+               {
+                       if( ((*vecX)[i]-apr <= x)&&(x <=(*vecX)[i]+apr)&&((*vecY)[i]-apr <= y)&&(y <=(*vecY)[i]+apr)&&((*vecZ)[i]-apr <= z)&&(z <=(*vecZ)[i]+apr) )
+                       {
+                               flag = i;
+                               return i; 
+                       }
+               }
+               return flag;
+       }
+       return -1;
+}
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/Contour/vectorFunctions.h b/lib/maracasVisuLib/src/interface/wxWindows/Contour/vectorFunctions.h
new file mode 100644 (file)
index 0000000..e31e824
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef __vectorFunctions_h_INCLUDED__
+#define __vectorFunctions_h_INCLUDED__
+#include <vector>
+#include "math.h"
+
+class vectorFunctions
+{
+  public:
+
+     vectorFunctions  ( );
+        ~vectorFunctions ( );
+        void   copyVector              ( std::vector<double>*Vector1, 
+                                                         std::vector<double>*Vector2  );
+        void   copyintVector  ( std::vector<int>*Vector1, 
+                             std::vector<int>*Vector2 );
+     void      printVector    ( std::vector<double>*Vector1,     
+                             std::vector<double>*Vector2 );
+        double promVector     ( std::vector<double>*Vector1, bool OnNormal );
+        int    maxVector      ( std::vector<double>*Vector1, double *val);
+        int    minVector      ( std::vector<double>*Vector1, double *val);
+        int    nearPoint      ( std::vector<double>*VectorX,        
+                             std::vector<double>*VectorY, 
+                             double px, double py );
+        int    findPointInLst ( std::vector<double>*vecX, 
+                             std::vector<double>*vecY,
+                             std::vector<double>*vecZ,
+                             double x, double y, double z );
+};
+
+#endif
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/MaracasDll.cpp b/lib/maracasVisuLib/src/interface/wxWindows/MaracasDll.cpp
new file mode 100644 (file)
index 0000000..ceda497
--- /dev/null
@@ -0,0 +1,195 @@
+// MaracasDll.cpp : Defines the entry point for the DLL application.
+//
+
+#include "stdafx.h"
+#include "wxMaracasApp.h"
+#include "MaracasDll.h"
+#include <wx/log.h>
+
+BOOL APIENTRY DllMain( HANDLE hModule, 
+                       DWORD  ul_reason_for_call, 
+                       LPVOID lpReserved
+                                        )
+{
+    switch (ul_reason_for_call)
+       {
+               case DLL_PROCESS_ATTACH:
+                       break;
+               case DLL_THREAD_ATTACH:
+               case DLL_THREAD_DETACH:
+               case DLL_PROCESS_DETACH:
+                       break;
+    }
+    return TRUE;
+}
+// This is the constructor of a class that has been exported.
+// see MaracasDll.h for the class definition
+CMaracasController::CMaracasController()
+:m_pSlicesPixels(NULL)
+{
+//EEDxx        wxWindows 2.4
+//     wxEntry(GetModuleHandle(NULL),NULL,NULL,0,FALSE);
+       m_pMarApp = (wxMaracasApp*)wxTheApp;
+       _rpPixels = NULL;
+}
+
+CMaracasController::~CMaracasController()
+{
+       // TODO : verifier le vidage de la mémoire
+       if (m_pSlicesPixels!=NULL) delete m_pSlicesPixels;
+       m_pMarApp->OnExit();
+//EEDxx        wxWindows 2.4
+//     wxApp::CleanUp();
+       m_pMarApp->CleanUp();
+}
+
+int CMaracasController::RunMaracas(void)
+{ 
+       m_pMarApp->SetVolumeData(
+               m_nX,
+               m_nY,
+               m_nSlices,
+               m_PixelSpacingColumn,
+               m_PixelSpacingRow, 
+               m_PixelSpacingSlice,
+               m_RescaleSlope,
+               m_RescaleIntercept,
+               m_pSlicesPixels);
+       m_pMarApp->Run();
+       return 0;
+}
+
+int CMaracasController::ShowApp(int nCmdShow) 
+{
+   if ( SW_HIDE == nCmdShow )
+   {
+         m_pMarApp->ShowFrame(SHOW_WINDOW_MINIMIZED);
+   } 
+   else if ( SW_SHOW == nCmdShow )
+   {
+         m_pMarApp->ShowFrame(SHOW_WINDOW_RESTORE);
+   }
+   else if ( SW_NORMAL == nCmdShow )
+   {
+         m_pMarApp->ShowFrame(SHOW_WINDOW_NORMAL);
+   }
+   else if ( SW_MINIMIZE == nCmdShow )
+   {
+         m_pMarApp->ShowFrame(SHOW_WINDOW_MINIMIZED);
+   }
+   else if ( SW_MAXIMIZE == nCmdShow )
+   {
+         m_pMarApp->ShowFrame(SHOW_WINDOW_MAXIMIZED);
+   }
+   else
+   {
+         m_pMarApp->ShowFrame(SHOW_WINDOW_NORMAL);
+   }
+   return 0;
+}
+
+int CMaracasController::Reset(void)
+{
+       // TODO : verifier le vidage de la mémoire
+       if (m_pSlicesPixels!=NULL) delete m_pSlicesPixels;
+       m_pSlicesPixels=NULL;
+       m_pMarApp->Reset();
+       return 0;
+}
+
+void CMaracasController::SetVolumeParams(int nX, int nY, int nSlices)
+{
+       m_nX=nX;
+       m_nY=nY;
+       m_nSlices=nSlices;
+       if(m_pSlicesPixels==NULL) 
+       {
+               m_pSlicesPixels=new unsigned short [m_nX*m_nY*m_nSlices];
+       }
+       wxString msg=wxString();
+
+//EEDxx2.4 DEBuG
+//     wxLogDebug(msg.Format("Volume dimensions received : %d, %d ,%d",m_nX,m_nY,m_nSlices));
+
+}
+
+void CMaracasController::SetSliceParams(float pixelSpacingColumn,
+                                                                               float pixelSpacingRow,
+                                                                               float pixelSpacingSlice, 
+                                                                               float RescaleSlope, 
+                                                                               float RescaleIntercept)
+{
+       m_PixelSpacingColumn    = pixelSpacingColumn;
+       m_PixelSpacingRow               = pixelSpacingRow;
+       m_PixelSpacingSlice             = pixelSpacingSlice;
+       m_RescaleSlope                  = RescaleSlope;
+       m_RescaleIntercept              = RescaleIntercept;
+
+       wxString msg=wxString();
+//EEDxx2.4 DEBuG
+//     wxLogDebug(msg.Format("Spacings received: %d, %d, %d",m_PixelSpacingColumn,m_PixelSpacingRow,m_PixelSpacingSlice));
+
+}
+
+void CMaracasController::SetSlicePixels(int numSlice,unsigned short * pixels)
+{
+
+       wxString msg=wxString();
+
+//EEDxx2.4 DEBuG
+//     wxLogDebug(msg.Format("Data for slice %d received",numSlice));
+       
+       int nbPixels=m_nX*m_nY;
+       int startIndex=numSlice*nbPixels;
+
+       for (int i=0; i<nbPixels;i++)
+       {
+               m_pSlicesPixels[i+startIndex]=pixels[i];
+       }
+}
+
+void CMaracasController::GetSnapshot(  unsigned int&   rWidth,
+                                                               unsigned int&   rHeight,
+                                                                               unsigned char*& rpPixels )  /*const*/ {
+
+       wxColour        *colour         = new wxColour();
+       wxBitmap        *wxbitmap       = m_pMarApp->GetSnapshot();
+       wxMemoryDC      *wxmemorydc = new wxMemoryDC();
+       wxmemorydc->SelectObject(*wxbitmap);
+
+       int i,j;
+       unsigned char r,g,b;
+       int w = wxbitmap->GetWidth();
+       int h = wxbitmap->GetHeight();
+
+       _rpPixels=(unsigned char*)malloc( sizeof(unsigned char)*3*w*h );
+       for (i=0;i<w;i++){
+               for (j=0;j<h;j++){
+                       wxmemorydc->GetPixel(i,j,colour);
+                       r=colour->Red();
+                       g=colour->Green();
+                       b=colour->Blue();
+                       rpPixels[j*3*w+i*3+0]=r;
+                       rpPixels[j*3*w+i*3+1]=g;
+                       rpPixels[j*3*w+i*3+2]=b;
+               }
+       }
+
+       delete wxbitmap;
+       delete wxmemorydc;
+       wxbitmap->SaveFile("c:/tmp/MaracasPlamavic.bmp", wxBITMAP_TYPE_BMP  );
+
+       rWidth   = w;
+       rHeight  = h;
+       rpPixels = _rpPixels;
+}
+
+
+int CMaracasController::ReleaseSnapshot(){
+       if (_rpPixels!=NULL) {
+               free(_rpPixels);
+               _rpPixels=NULL;
+       }
+       return 0;
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/MaracasDll.h b/lib/maracasVisuLib/src/interface/wxWindows/MaracasDll.h
new file mode 100644 (file)
index 0000000..08d1b23
--- /dev/null
@@ -0,0 +1,68 @@
+#ifndef __CMARACASCONTROLLER_H_
+#define __CMARACASCONTROLLER_H_
+
+// The following ifdef block is the standard way of creating macros which make exporting 
+// from a DLL simpler. All files within this DLL are compiled with the MaracasWin32Lib_EXPORTS
+// symbol defined on the command line. this symbol should not be defined on any project
+// that uses this DLL. This way any other project whose source files include this file see 
+// MARACASDLL_API functions as being imported from a DLL, wheras this DLL sees symbols
+// defined with this macro as being exported.
+#ifdef MaracasWin32Lib_EXPORTS
+#define MARACASDLL_API __declspec(dllexport)
+#else
+#define MARACASDLL_API __declspec(dllimport)
+#endif
+class wxMaracasApp;
+// This class is exported from the MaracasWin32Lib.dll
+class MARACASDLL_API CMaracasController {
+public:
+       CMaracasController(void);
+       
+       ~CMaracasController();
+       
+       int RunMaracas(void);
+       
+       int ShowApp(int nCmdShow);
+       
+       int Reset();
+       
+       void GetSnapshot( unsigned int& rWidth,
+                     unsigned int& rHeight,
+                     unsigned char*& rpPixels ) /*const*/ ;
+
+       /*! \brief Notify the snapshot bitmap has been retrieved
+       */
+       int ReleaseSnapshot();
+       
+       /*! \brief Notify the resampled image has been retrieved
+       */
+       int OutputVolumeRetrieved();
+
+       void SetVolumeParams(int nX, int nY, int nSlices);
+
+       void SetSliceParams(float pixelSpacingColumn,
+                                               float pixelSpacingRow,
+                                               float pixelSpacingSlice,
+                                               float RescaleSlope, 
+                                               float RescaleIntercept);
+
+       void SetSlicePixels(int numSlice,unsigned short * pixels);
+
+private :
+       wxMaracasApp    *m_pMarApp;
+       unsigned char   *_rpPixels; //Snapshot
+
+       unsigned short  *m_pSlicesPixels;
+       int                             m_nX;
+       int                             m_nY;
+       int                             m_nSlices;
+       float                   m_PixelSpacingColumn;
+       float                   m_PixelSpacingRow;
+       float                   m_PixelSpacingSlice;
+       float                   m_RescaleSlope;
+       float                   m_RescaleIntercept;
+};
+
+
+#endif // __CMARACASCONTROLLER_H_
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/StdAfx.cpp b/lib/maracasVisuLib/src/interface/wxWindows/StdAfx.cpp
new file mode 100644 (file)
index 0000000..badce90
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+//     testDll3.pch will be the pre-compiled header
+//     stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/StdAfx.h b/lib/maracasVisuLib/src/interface/wxWindows/StdAfx.h
new file mode 100644 (file)
index 0000000..dd36b5c
--- /dev/null
@@ -0,0 +1,29 @@
+// stdafx.h : include file for standard system include files,
+//  or project specific include files that are used frequently, but
+//      are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__B7BB723B_5D61_49D0_B21F_FB8ADD1360F2__INCLUDED_)
+#define AFX_STDAFX_H__B7BB723B_5D61_49D0_B21F_FB8ADD1360F2__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+
+// Insert your headers here
+#define WIN32_LEAN_AND_MEAN            // Exclude rarely-used stuff from Windows headers
+#include <windows.h>
+
+#ifdef DEBUG
+//EEDxx2.6
+//     #define __WXDEBUG__
+#endif
+
+
+// TODO: reference additional headers your program requires here
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__B7BB723B_5D61_49D0_B21F_FB8ADD1360F2__INCLUDED_)
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/manualContour.cpp b/lib/maracasVisuLib/src/interface/wxWindows/manualContour.cpp
new file mode 100644 (file)
index 0000000..1d9f3ad
--- /dev/null
@@ -0,0 +1,5127 @@
+
+#include <vtkActor.h> 
+#include <vtkProperty.h>
+
+#include <vtkCellArray.h>
+#include <vtkRenderer.h>
+#include <vtkCoordinate.h>
+#include <vtkTextProperty.h>
+#include <vtkTextActor.h>
+#include <vtkProperty2D.h>
+#include <vtkPointPicker.h>
+#include "widgets/UtilVtk3DGeometriSelection.h"
+
+
+#include "manualContour.h"
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+manualPoint::manualPoint(){
+}
+// ----------------------------------------------------------------------------
+manualPoint::~manualPoint(){
+}
+// ----------------------------------------------------------------------------
+void manualPoint::SetPoint(double x,double y,double z){
+       _x=x;
+       _y=y;
+       _z=z;
+}
+// ----------------------------------------------------------------------------
+void manualPoint::SetPointX(double x){
+       _x=x;
+}
+// ----------------------------------------------------------------------------
+void manualPoint::SetPointY(double y){
+       _y=y;
+}
+// ----------------------------------------------------------------------------
+void manualPoint::SetPointZ(double z){
+       _z=z;
+}
+// ----------------------------------------------------------------------------
+double manualPoint::GetX(){
+       return _x;
+}
+// ----------------------------------------------------------------------------
+double manualPoint::GetY(){
+       return _y;
+}
+// ----------------------------------------------------------------------------
+double manualPoint::GetZ(){
+       return _z;
+}
+// ----------------------------------------------------------------------------
+manualPoint * manualPoint :: Clone()
+{
+       manualPoint * clone = new manualPoint();
+       clone->SetPoint( GetX(), GetY(), GetZ());
+       return clone;
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+manualContourModelCircle::manualContourModelCircle()
+: manualContourModel()
+{
+}
+
+manualContourModelCircle::~manualContourModelCircle()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualContourModelCircle * manualContourModelCircle :: Clone()  // virtual 
+{
+       manualContourModelCircle * clone = new manualContourModelCircle();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualContourModelCircle::CopyAttributesTo( manualContourModelCircle * cloneObject)
+{
+       // Fathers object
+       manualContourModel::CopyAttributesTo(cloneObject);
+}
+
+//----------------------------------------------------------------
+int manualContourModelCircle::GetTypeModel() //virtual 
+{
+       return 3;
+}
+
+//----------------------------------------------------------------
+void manualContourModelCircle::GetSpline_i_Point(int i, double *x, double *y, double *z) // virtal
+{
+       double angle = _deltaAngle*i;
+       *x = _radio*cos(angle) + _centerX;
+       *y = _radio*sin(angle) + _centerY;
+       *z = _centerZ;
+}
+
+//
+// ---------------------------------------------------------------------------
+void manualContourModelCircle::UpdateSpline() // virtal
+{
+       manualPoint     *mpA,*mpB;
+       double difX,difY;
+    int np     = GetSizeLstPoints( );
+       int nps = GetNumberOfPointsSpline();
+       _deltaAngle=(3.14159265*2)/(nps-1);
+
+       if (np==2){
+               mpA                     = GetManualPoint(0);
+               mpB                     = GetManualPoint(1);
+               difX            = mpA->GetX() - mpB->GetX();
+               difY            = mpA->GetY() - mpB->GetY();
+               _radio          = sqrt( difX*difX + difY*difY );
+               _centerX        = mpA->GetX();
+               _centerY        = mpA->GetY();
+               _centerZ        = mpA->GetZ();
+       } else {
+               _radio          = -1;
+               _centerX        = -1;
+               _centerY        = -1;
+               _centerZ        = -1;
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualContourModelBullEye::manualContourModelBullEye()
+: manualContourModel()
+{
+       _numberPointsSlineBySector=101;   // impaire
+}
+
+manualContourModelBullEye::~manualContourModelBullEye()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualContourModelBullEye * manualContourModelBullEye :: Clone()  // virtual 
+{
+       manualContourModelBullEye * clone = new manualContourModelBullEye();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualContourModelBullEye::CopyAttributesTo( manualContourModelBullEye * cloneObject)
+{
+       // Fathers object
+       manualContourModel::CopyAttributesTo(cloneObject);
+}
+
+//----------------------------------------------------------------
+int manualContourModelBullEye::GetTypeModel() //virtual 
+{
+       return 4;
+}
+
+//----------------------------------------------------------------
+int    manualContourModelBullEye::GetNumberOfPointsSplineSectorBulleEje()
+{
+       return _numberPointsSlineBySector;
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEye::SetNumberOfPointsSplineSectorBulleEje(int numpoints)
+{
+       this->_numberPointsSlineBySector = numpoints;
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEye::AddSector(     double radioA,
+                                               double radioB,
+                                               double ang,
+                                               double angDelta)
+{
+       manualContourModelBullEyeSector *modelSector = new manualContourModelBullEyeSector();
+       modelSector->SetSector(radioA,radioB,ang,angDelta);
+       modelSector->SetNumberOfPointsSpline( this->GetNumberOfPointsSplineSectorBulleEje() );
+       _lstModelBullEyeSector.push_back(modelSector);
+}
+
+//----------------------------------------------------------------
+manualContourModelBullEyeSector * manualContourModelBullEye::GetModelSector(int id)
+{
+       return _lstModelBullEyeSector[id];
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEye::GetSector(int id,      
+                                               double *radioA,
+                                               double *radioB,
+                                               double *ang,
+                                               double *angDelta)
+{
+       _lstModelBullEyeSector[id]->GetSector(radioA,radioB,ang,angDelta);
+}
+
+void manualContourModelBullEye::UpdateSpline() // virtual
+{
+       manualContourModel::UpdateSpline();
+
+       if (this->GetSizeLstPoints()>2){
+               double cx,cy;
+               double ww,hh;
+               manualPoint *mpA = GetManualPoint(0);
+               manualPoint *mpB = GetManualPoint(2);
+               cx = (mpA->GetX() + mpB->GetX()) / 2.0;
+               cy = (mpA->GetY() + mpB->GetY()) / 2.0;
+               ww = fabs( mpA->GetX() - mpB->GetX() )/2.0;
+               hh = fabs( mpA->GetY() - mpB->GetY() )/2.0;
+               int i,size = _lstModelBullEyeSector.size();
+               for (i=0;i<size;i++)
+               {
+                       _lstModelBullEyeSector[i]->SetCenter(cx,cy);
+                       _lstModelBullEyeSector[i]->SetSize(ww,hh);
+               } // for
+       }
+}
+
+
+//----------------------------------------------------------------
+void manualContourModelBullEye::ResetSectors()
+{
+       int i,size=_lstModelBullEyeSector.size();
+       for (i=0;i<size;i++)
+       {
+               delete _lstModelBullEyeSector[i];
+       }
+       _lstModelBullEyeSector.clear();
+}
+
+//----------------------------------------------------------------
+int manualContourModelBullEye::GetSizeOfSectorLst()
+{
+       return _lstModelBullEyeSector.size();
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEye::Save(FILE *ff) // virtual
+{
+       manualContourModel::Save(ff); 
+       int i,size = GetSizeOfSectorLst();
+       fprintf(ff,"numberOfSections %d \n",size);
+       for ( i=0 ; i<size ; i++ )
+       {
+               _lstModelBullEyeSector[i]->Save(ff);
+       }
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEye::Open(FILE *ff) // virtual
+{
+       manualContourModel::Open(ff); 
+
+       ResetSectors();
+
+       char tmp[255];
+       int i;
+       int numberOfSections;
+//     double radioA,radioB,ang,deltaAng;
+
+       fscanf(ff,"%s",tmp); // NumberOfSections
+       fscanf(ff,"%s",tmp); // ##
+       numberOfSections = atoi(tmp);  
+       for (i=0;i<numberOfSections;i++)
+       {
+               AddSector(0,1,90,0);
+               _lstModelBullEyeSector[i]->Open(ff);
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+std::vector<manualContourModel*> manualContourModelBullEye::ExploseModel(  )
+{
+//EED004
+       std::vector<manualContourModel*> lstTmp;
+       int i,iSize=_lstModelBullEyeSector.size();
+       for (i=0;i<iSize;i++)
+       {
+               lstTmp.push_back( _lstModelBullEyeSector[i] );
+       }
+       return lstTmp;
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualContourModelBullEyeSector::manualContourModelBullEyeSector()
+: manualContourModel()
+{
+}
+
+manualContourModelBullEyeSector::~manualContourModelBullEyeSector()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualContourModelBullEyeSector * manualContourModelBullEyeSector :: Clone()  // virtual 
+{
+       manualContourModelBullEyeSector * clone = new manualContourModelBullEyeSector();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualContourModelBullEyeSector::CopyAttributesTo( manualContourModelBullEyeSector * cloneObject)
+{
+       // Fathers object
+       manualContourModel::CopyAttributesTo(cloneObject);
+}
+
+//----------------------------------------------------------------
+int manualContourModelBullEyeSector::GetTypeModel() //virtual 
+{
+       return 5;
+}
+
+
+//----------------------------------------------------------------
+void manualContourModelBullEyeSector::SetSector(       double radioA,
+                                               double radioB,
+                                               double ang,
+                                               double angDelta)
+{
+       _radioA         = radioA;
+       _radioB         = radioB;
+       _ang            = ang*3.14159265/180.0;
+       _angDelta       = angDelta*3.14159265/180.0;
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEyeSector::GetSector(       
+                                               double *radioA,
+                                               double *radioB,
+                                               double *ang,
+                                               double *angDelta)
+{
+       *radioA         = _radioA;
+       *radioB         = _radioB;
+       *ang            = _ang;
+       *angDelta       = _angDelta;
+}
+
+// ----------------------------------------------------------------------------
+void manualContourModelBullEyeSector::SetCenter(double cx,double cy)
+{
+       _cx = cx;
+       _cy = cy;
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEyeSector::SetSize(double ww,double hh)
+{
+       _ww = ww;
+       _hh = hh;
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEyeSector::GetSpline_i_Point(int i, double *x, double *y, double *z)
+{
+//EED004
+
+       int ii,nps;
+//     double x,y,z;
+       double ang,angcos, angsin;
+       double radio;
+
+       nps     =  GetNumberOfPointsSpline() - 3;
+
+       if (i==GetNumberOfPointsSpline()-1)
+       {
+               i=0;
+       }
+
+       if (i<=nps/2)
+       {
+               ii=i;
+               radio=_radioA;
+       } else {
+               ii=nps-i+1;
+               radio=_radioB;
+       }
+       ang = ((double)ii/(nps/2))*_angDelta + _ang;
+       angcos =  cos(ang);
+       angsin =  sin(ang);
+
+       *x = _ww*radio*angcos + _cx;
+       *y = _hh*radio*angsin + _cy;
+       *z= -900;
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEyeSector::Save(FILE *ff) // virtual
+{
+       manualContourModel::Save(ff); 
+       fprintf(ff,"rA= %f rB= %f ang= %f deltaAng= %f\n", _radioA,_radioB, _ang , _angDelta);
+}
+
+//----------------------------------------------------------------
+void manualContourModelBullEyeSector::Open(FILE *ff) // virtual
+{
+       char tmp[255];
+       fscanf(ff,"%s",tmp); // TypeModel
+       fscanf(ff,"%s",tmp); // ##
+
+       manualContourModel::Open(ff); 
+
+
+       fscanf(ff,"%s",tmp); // radioA=
+       fscanf(ff,"%s",tmp); // radioA
+       _radioA = atof(tmp);  
+
+       fscanf(ff,"%s",tmp); // radioB=
+       fscanf(ff,"%s",tmp); // radioB
+       _radioB = atof(tmp);  
+
+       fscanf(ff,"%s",tmp); // ang=
+       fscanf(ff,"%s",tmp); // ang
+       _ang = atof(tmp);  
+
+       fscanf(ff,"%s",tmp); // deltaAng=
+       fscanf(ff,"%s",tmp); // deltaAng
+       _angDelta = atof(tmp);  
+}
+
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+
+//JSTG 25-02-08 --------------------------------------------------
+manualContourModelRoi::manualContourModelRoi()
+: manualContourModel()
+{
+       SetNumberOfPointsSpline(5);
+}
+
+manualContourModelRoi::~manualContourModelRoi()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualContourModelRoi * manualContourModelRoi :: Clone()  // virtual 
+{
+       manualContourModelRoi * clone = new manualContourModelRoi();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualContourModelRoi::CopyAttributesTo( manualContourModelRoi * cloneObject)
+{
+       // Fathers object
+       manualContourModel::CopyAttributesTo(cloneObject);
+}
+
+//----------------------------------------------------------------
+int manualContourModelRoi::GetTypeModel() //virtual 
+{
+       return 2;
+}
+
+//----------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+manualContourModel::manualContourModel()
+{
+    _cntSplineX = vtkKochanekSpline::New( );
+    _cntSplineY = vtkKochanekSpline::New( );
+    _cntSplineZ = vtkKochanekSpline::New( );
+
+       this->SetCloseContour(true);
+
+    _cntSplineX->SetDefaultTension( 0 ); 
+       _cntSplineX->SetDefaultBias( 0 ); 
+       _cntSplineX->SetDefaultContinuity( 0 ); 
+
+    _cntSplineY->SetDefaultTension( 0 ); 
+       _cntSplineY->SetDefaultBias( 0 ); 
+       _cntSplineY->SetDefaultContinuity( 0 );
+
+    _cntSplineZ->SetDefaultTension( 0 ); 
+       _cntSplineZ->SetDefaultBias( 0 ); 
+       _cntSplineZ->SetDefaultContinuity( 0 );
+
+//JSTG 25-02-08 -------------------------------------------------------------------------------------------------
+
+       // this parameter is reset in the  VIRTUAL manualContourBaseControler::Configure
+       _sizePointsContour      = 100;                  //JSTG 25-02-08 The change in the inisialization of these variable is critical.
+
+       _delta_JSTG                     = 0.0;
+//---------------------------------------------------------------------------------------------------------------
+}
+
+// ----------------------------------------------------------------------------
+manualContourModel::~manualContourModel()
+{
+       int i,size=_lstPoints.size();
+       for (i=0;i<size; i++){
+               delete _lstPoints[i];
+       }
+       _lstPoints.clear();
+
+       _cntSplineX->Delete();
+       _cntSplineY->Delete();
+       _cntSplineZ->Delete();
+}
+// ----------------------------------------------------------------------------
+int manualContourModel::AddPoint(double x,double y,double z)
+{
+   manualPoint *mp = new manualPoint();
+   mp->SetPoint(x,y,z);
+   AddManualPoint(mp);
+   //UpdateSpline();
+
+   return _lstPoints.size()-1;
+}
+// ----------------------------------------------------------------------------
+int manualContourModel::InsertPoint(double x,double y,double z)
+{
+       double dd,ddmin=9999999;
+       int    ibak=0;
+       double xx,x1,x2;
+       double yy,y1,y2;
+       double zz,z1,z2;
+       int i,ii,iii,size=_lstPoints.size();
+       double j,MaxDivisions=20,porcentage;
+       int sizeB=size;
+
+       if (_closeContour==false)
+       {
+               size=size-1;
+       }
+
+       double jbak;
+
+       for ( i=0 ; i<size ; i++ )
+       {
+               ii=i % sizeB ;
+               iii=(i+1) % sizeB;
+               x1=_lstPoints[ii]->GetX();
+               y1=_lstPoints[ii]->GetY();
+               z1=_lstPoints[ii]->GetZ();
+               x2=_lstPoints[iii]->GetX();
+               y2=_lstPoints[iii]->GetY();
+               z2=_lstPoints[iii]->GetZ();
+               for (j=0; j<=MaxDivisions; j++)
+               {
+                       porcentage=(j/MaxDivisions);
+                       xx=(x2-x1)*porcentage+x1;
+                       yy=(y2-y1)*porcentage+y1;
+                       zz=(z2-z1)*porcentage+z1;
+                       dd=sqrt( (xx-x)*(xx-x) + (yy-y)*(yy-y) + (zz-z)*(zz-z) );
+                       if ( dd<ddmin )
+                       {
+                               ddmin=dd;
+                               ibak=iii;
+                               jbak=j;
+                       }
+               }
+       }
+
+       if (_closeContour==false)
+       {
+               if ( (ibak==1) && (jbak==0) )
+               {
+                       ibak=0;
+               }
+               if ( ( ibak==size ) && ( jbak==MaxDivisions ) )
+               {
+                       ibak=sizeB;
+               }
+       }
+
+
+//JSTG - 25-04-08 ----------------------------------------------------------
+       //manualPoint *mp = new manualPoint();
+       //mp->SetPoint(x,y,z);
+       //std::vector<manualPoint*>::iterator itNum = _lstPoints.begin() + ibak;
+       //_lstPoints.insert(itNum,mp);  
+       InsertPoint_id(ibak,x,y,z);
+//----------------------------------------------------------------------------
+
+       return ibak;
+}
+// ----------------------------------------------------------------------------
+void manualContourModel::InsertPoint_id(int id, double x, double y, double z)
+{
+       manualPoint *mp = new manualPoint();
+       mp->SetPoint(x,y,z);
+       std::vector<manualPoint*>::iterator itNum = _lstPoints.begin() + id;
+       _lstPoints.insert(itNum,mp);
+}
+// ----------------------------------------------------------------------------
+
+void manualContourModel::DeletePoint(int i)
+{
+       std::vector<manualPoint*>::iterator itNum = _lstPoints.begin() + i;
+   _lstPoints.erase(itNum);
+}
+// ----------------------------------------------------------------------------
+void manualContourModel::DeleteAllPoints()
+{
+       int i,size=_lstPoints.size();
+       for (i=0;i<size;i++){
+          _lstPoints.erase( _lstPoints.begin() );
+       }
+       this->UpdateSpline();
+}
+// ----------------------------------------------------------------------------
+
+void manualContourModel::MovePoint(int i,double dx,double dy,double dz)
+{
+       manualPoint *mp=_lstPoints[i];
+       double x=mp->GetX()+dx;
+       double y=mp->GetY()+dy;
+       double z=mp->GetZ()+dz;
+       mp->SetPoint(x,y,z);
+}
+// ----------------------------------------------------------------------------
+void manualContourModel::MoveLstPoints(double dx,double dy,double dz)
+{
+       // ToDo
+}
+// ----------------------------------------------------------------------------
+void manualContourModel::MoveAllPoints(double dx,double dy,double dz)
+{
+       int i,size=_lstPoints.size();
+       for (i=0;i<size;i++){
+               MovePoint(i,dx,dy,dz);
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+
+// type=-1  x,y,z
+// type=0      x,y
+// type=1      y,z
+// type=2      x,z
+int     manualContourModel::GetIdPoint(double x, double y, double z, int i_range,int type)  
+{
+       double range = i_range+1;
+
+       double xx,yy,zz,dd,ddmin=9999999;
+       int ibak=-1;
+       int i,size=_lstPoints.size();
+       for (i=0;i<size;i++){
+               manualPoint *mp=_lstPoints[i];
+               xx=mp->GetX();
+               yy=mp->GetY();
+               zz=mp->GetZ();
+
+               if (type==-1)
+               {
+                       if ((fabs(xx-x)<range) && (fabs(yy-y)<range) && (fabs(zz-z)<range)) {
+                          dd=sqrt(   (xx-x)*(xx-x) + (yy-y)*(yy-y) + (zz-z)*(zz-z) ); 
+                          if (dd<ddmin){
+                                  ddmin=dd;
+                                  ibak=i;
+                          }
+                       }
+               }
+               if (type==0)
+               {
+                       if ((fabs(yy-y)<range) && (fabs(zz-z)<range)) {
+                          dd=sqrt(   (yy-y)*(yy-y) + (zz-z)*(zz-z) ); 
+                          if (dd<ddmin){
+                                  ddmin=dd;
+                                  ibak=i;
+                          }
+                       }
+               }
+               if (type==1)
+               {
+                       if ((fabs(xx-x)<range) && (fabs(zz-z)<range)) {
+                          dd=sqrt(   (xx-x)*(xx-x)  + (zz-z)*(zz-z) ); 
+                          if (dd<ddmin){
+                                  ddmin=dd;
+                                  ibak=i;
+                          }
+                       }
+               }
+               if (type==2)
+               {
+                       if ((fabs(xx-x)<range) && (fabs(yy-y)<range) ) {
+                          dd=sqrt(   (xx-x)*(xx-x) + (yy-y)*(yy-y)  ); 
+                          if (dd<ddmin){
+                                  ddmin=dd;
+                                  ibak=i;
+                          }
+                       }
+               }
+       }
+       return ibak;
+}
+// ----------------------------------------------------------------------------
+manualPoint* manualContourModel::GetManualPoint(int id)
+{
+       return _lstPoints[id];
+}
+// ----------------------------------------------------------------------------
+int manualContourModel::GetSizeLstPoints()
+{
+       return _lstPoints.size();
+}
+//----------------------------------------------------------------------------
+int manualContourModel::GetNumberOfPointsSpline()
+{
+       return _sizePointsContour;
+}
+//----------------------------------------------------------------------------
+void manualContourModel::SetNumberOfPointsSpline(int size)
+{
+       _sizePointsContour = size;
+}
+
+
+// ----------------------------------------------------------------------------
+
+void manualContourModel::SetCloseContour(bool closeContour)
+{
+       _closeContour = closeContour;
+       if (_closeContour==true)
+       {
+               _cntSplineX->ClosedOn(); 
+               _cntSplineY->ClosedOn();
+               _cntSplineZ->ClosedOn();
+       } else {
+               _cntSplineX->ClosedOff(); 
+               _cntSplineY->ClosedOff();
+               _cntSplineZ->ClosedOff();
+       }
+}
+
+// ----------------------------------------------------------------------------
+bool manualContourModel::IfCloseContour()
+{
+       return _closeContour;
+}
+
+// ----------------------------------------------------------------------------
+
+void manualContourModel::UpdateSpline() // virtual
+{
+       int i, np;
+    np = _lstPoints.size();
+       manualPoint     *mp;
+       _cntSplineX->RemoveAllPoints();
+       _cntSplineY->RemoveAllPoints();
+       _cntSplineZ->RemoveAllPoints();
+    for( i = 0; i < np; i++ ) {
+               mp = GetManualPoint(i);
+        _cntSplineX->AddPoint( i, mp->GetX() );
+        _cntSplineY->AddPoint( i, mp->GetY() );
+        _cntSplineZ->AddPoint( i, mp->GetZ() );
+    } //  rof
+
+//JSTG 25-02-08 ---------------------------------------------------------------------------------------------
+       if (this->_closeContour==true)
+       {
+               _delta_JSTG = (double) (np) / double (_sizePointsContour - 1);  //Without the -1 the curve is not close
+       } else {
+               _delta_JSTG = (double) (np-1) / double (_sizePointsContour );  //Without the -1 the curve is not close
+       }
+//-----------------------------------------------------------------------------------------------------------
+}
+
+//---------------------------------------------------------------------------------
+
+/*void manualContourModel::GetSplineiPoint(int i, double &x, double &y, double &z)
+{
+       double delta=(double)(_lstPoints.size()) / (double)(_sizePointsContour);        
+       double t = delta*(double)i;
+       GetSplinePoint(t, x, y, z);
+}*/
+
+//-----------------------------------------------------------------------------
+
+//JSTG 25-02-08 ---------------------------------------------------------------
+void manualContourModel::GetSpline_i_Point(int i, double *x, double *y, double *z) // virtal
+{
+       GetSpline_t_Point(i*_delta_JSTG,x,y,z);
+}
+
+// ----------------------------------------------------------------------------
+
+//JSTG 25-02-08 ---------------------------------------------------------------
+void manualContourModel::GetSpline_t_Point(double t, double *x, double *y, double *z)
+{
+               if (_lstPoints.size()==0)
+       {
+               *x      = 0;
+               *y      = 0;
+               *z      = 0;
+       }
+       if (_lstPoints.size()==1)
+       {
+               manualPoint     *mp;
+               mp      = GetManualPoint(0);
+               *x      = mp->GetX();
+               *y      = mp->GetY();
+               *z      = mp->GetZ();
+       }
+       if (_lstPoints.size()>=2)
+       {
+               *x      = _cntSplineX->Evaluate(t); 
+               *y      = _cntSplineY->Evaluate(t); 
+               *z      = _cntSplineZ->Evaluate(t); 
+       }
+}
+
+// ----------------------------------------------------------------------------
+
+
+/*void manualContourModel::GetSplinePoint(double t, double &x, double &y, double &z)
+{
+       if (_lstPoints.size()==0)
+       {
+               x       = 0;
+               y       = 0;
+               z       = 0;
+       }
+       if (_lstPoints.size()==1)
+       {
+               manualPoint     *mp;
+               mp      = GetManualPoint(0);
+               x       = mp->GetX();
+               y       = mp->GetY();
+               z       = mp->GetZ();
+       }
+       if (_lstPoints.size()>=2)
+       {
+               x       = _cntSplineX->Evaluate(t); 
+               y       = _cntSplineY->Evaluate(t); 
+               z       = _cntSplineZ->Evaluate(t); 
+       }
+}*/
+// ----------------------------------------------------------------------------
+double manualContourModel::GetPathSize()
+{
+       double result = 0;
+       double x1,y1,z1;
+       double x2,y2,z2;
+
+// JSTG 25-02-08 -----------------------------
+       //double t,delta;
+       //int i,np,nps;
+       int i;
+//--------------------------------------------
+
+       if (_lstPoints.size()==2)
+       {
+               x1=_lstPoints[0]->GetX();
+               y1=_lstPoints[0]->GetY();
+               z1=_lstPoints[0]->GetZ();
+               x2=_lstPoints[1]->GetX();
+               y2=_lstPoints[1]->GetY();
+               z2=_lstPoints[1]->GetZ();
+               result = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1) );
+       }
+       if (_lstPoints.size()>2)
+       {
+
+// JSTG 25-02-08 ------------------------------------------            
+               //np  = _lstPoints.size( );
+               //nps = 200; 
+               //delta=( double ) ( np  ) / ( double ) ( nps  );
+               UpdateSpline();
+               //GetSplinePoint(0,x1,y1,z1);
+               GetSpline_i_Point(0,&x1,&y1,&z1);
+
+               //for( i = 1; i < nps; i++ )
+               for( i = 1; i < GetNumberOfPointsSpline(); i++ )
+               {
+                       //t = delta * (double)i;
+                       //GetSplinePoint(t,x2,y2,z2);
+                       GetSpline_i_Point(i,&x2,&y2,&z2);
+//---------------------------------------------------------
+                       result=result + sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1) );
+                       x1=x2;
+                       y1=y2;
+                       z1=z2;
+               }// for 
+       }
+
+       return result;
+}
+// ----------------------------------------------------------------------------
+double manualContourModel::GetPathArea()
+{
+       double result = 555;
+       if ((_lstPoints.size()>=3) && IfCloseContour()==true )
+       {
+               double area;
+//JSTG 25-02-08 ---------------------------------------------
+               //double ti,tj;
+//-----------------------------------------------------------
+               double x1,y1,z1;
+               double x2,y2,z2;
+               bool okArea=true;
+               int i, j;
+         
+               // This uses Green's theorem:
+               // A = 1/2 * sum( xiyi+1 - xi+1yi); pO == pN
+               // A < 0 -> A = |A| (a negative value could raise because points are
+               // given in clockwise order).
+
+//JSTG 25-02-08 -------------------------------------------------
+               //int np  = _lstPoints.size( );
+               //int nps = 200;
+               int nps = GetNumberOfPointsSpline();
+               //double delta=( double ) ( np  ) / ( double ) ( nps  );
+               UpdateSpline();
+               for( i = 0, area = 0.0; i < nps; i++ ) 
+               {
+                       j = ( i + 1 ) % nps;
+                       //ti = delta * (double)i;
+                       //tj = delta * (double)j;
+                       //GetSplinePoint(ti,x1,y1,z1);
+                       //GetSplinePoint(tj,x2,y2,z2);
+                       GetSpline_i_Point(i,&x1,&y1,&z1);
+                       GetSpline_i_Point(j,&x2,&y2,&z2);
+//----------------------------------------------------------------
+                       area +=
+                                       (x1 * y2 ) -
+                                       ( x2 * y1 );
+                       if (z1!=z2)
+                       {
+                               okArea=false;
+                       }
+               }// for 
+               area /= 2.0;
+               area = fabs( area );
+
+/*
+               for( i = 0, area = 0.0; i < _lstPoints.size(); i++ ) 
+               {
+                       j = ( i + 1 ) % _lstPoints.size();
+                       //  Area
+                       area +=
+                                       (_lstPoints[i]->GetX() * _lstPoints[j]->GetY() ) -
+                                       ( _lstPoints[j]->GetX() * _lstPoints[i]->GetY() );
+                       if (_lstPoints[0]->GetZ()!=_lstPoints[i]->GetZ())
+                       {
+                               okArea=false;
+                       }
+               } // rof
+               area /= 2.0;
+               area = fabs( area );
+*/
+
+               if (okArea==true)
+               {
+                       result = area;
+               } else {
+                       result = -1;
+               }
+
+       } else {
+               result = 0;
+       }
+       return result;
+}
+
+// ----------------------------------------------------------------------------
+// p[x,y,z]   :  data in 
+// rp[x,y,z]  :  data out  result point 
+// rn[x,y,z]  :  data out   result normal
+
+void manualContourModel::GetNearestPointAndNormal(double *p, double *rp,  double *rn)
+{
+       double  distMin=999999999;
+       double  dist,dx,dy,dz;
+       double  x1,y1,z1;
+       double  x2,y2,z2;
+       int             i,np,nps;
+
+//JSTG 25-02-08 -------------------
+       //double  tback;
+       int iback;
+       //double        t,delta;
+//---------------------------------
+
+       np      = _lstPoints.size( );
+       if (np>=2)
+       {
+// JSTG 25-02-08 ------------------------------------------
+               //nps           = 200; 
+               nps = GetNumberOfPointsSpline();
+               //delta = ( double ) ( np  ) / ( double ) ( nps  );
+               UpdateSpline();
+               //GetSplinePoint(0,x1,y1,z1);
+               GetSpline_i_Point(0,&x1,&y1,&z1);
+               for( i = 0; i < nps; i++ ) 
+               {
+                       //t = delta * (double)i;
+                       //GetSplinePoint(t,x1,y1,z1);
+                       GetSpline_i_Point(i,&x1,&y1,&z1);
+//----------------------------------------------------------
+                       dx= x1-p[0];
+                       dy= y1-p[1];
+                       dz= z1-p[2];
+                       dist = sqrt( dx*dx + dy*dy + dz*dz );
+                       if (dist<distMin) 
+                       {
+                               distMin  = dist;
+//JSTG                 tback = t;
+                               iback = i;
+                               rp[0] = x1;
+                               rp[1] = y1;
+                               rp[2] = z1;
+                               rn[0] = x2-x1;
+                               rn[1] = y2-y1;
+                               rn[2] = z2-z1;
+                       }
+                       x2=x1;
+                       y2=y1;
+                       z2=z1;
+               }// for 
+
+// JSTG 25-02-08 ------------------------------------------
+               //if (tback==0)
+               if (iback==0)
+               {
+                       //t = delta * (double)1.0;
+                       //GetSplinePoint(t,x1,y1,z1);
+                       GetSpline_i_Point(i,&x1,&y1,&z1);
+//----------------------------------------------------------
+                       rn[0]=rp[0]-x1;
+                       rn[1]=rp[1]-y1;
+                       rn[2]=rp[2]-z1;
+               }
+       } 
+       else 
+       {
+               rp[0] = 0;
+               rp[1] = 0;
+               rp[2] = 0;
+               rn[0] = -1;
+               rn[1] = 0;
+               rn[2] = 0;
+       }
+}
+
+// ----------------------------------------------------------------------------
+manualContourModel * manualContourModel :: Clone() // virtual
+{
+       manualContourModel * clone = new manualContourModel();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ----------------------------------------------------------------------------
+void manualContourModel::Open(FILE *ff) // virtual
+{
+       char tmp[255];
+       int i;
+       int numberOfControlPoints;
+       double x,y,z;
+
+       fscanf(ff,"%s",tmp); // NumberOfControlPoints
+       fscanf(ff,"%s",tmp); // ##
+       numberOfControlPoints = atoi(tmp);  
+       for (i=0;i<numberOfControlPoints;i++)
+       {
+               fscanf(ff,"%s",tmp); // X
+               x = atof(tmp);  
+               fscanf(ff,"%s",tmp); // Y
+               y = atof(tmp);  
+               fscanf(ff,"%s",tmp); // Z
+               z = atof(tmp);  
+               AddPoint(x,y,z);
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+int manualContourModel::GetTypeModel() //virtual 
+{
+       // 0 spline
+       // 1 spline
+       // 2 rectangle
+       // 3 circle
+       // 4 BullEye
+       // 5 BullEyeSector
+       return 1;
+}
+
+// ----------------------------------------------------------------------------
+void manualContourModel::Save(FILE *ff) // virtual
+{
+       int i,size=_lstPoints.size();
+       fprintf(ff,"TypeModel %d\n", GetTypeModel() );
+       fprintf(ff,"NumberOfControlPoints %d\n",size);
+       for (i=0;i<size;i++)
+       {
+               manualPoint *mp=_lstPoints[i];
+               fprintf(ff,"%f %f %f\n", mp->GetX(), mp->GetY(), mp->GetZ() );
+       }
+}
+
+
+// ---------------------------------------------------------------------------
+
+void manualContourModel::CopyAttributesTo( manualContourModel * cloneObject)
+{
+       // Fathers object
+       //XXXX::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetCloseContour( this->IfCloseContour() );
+       int i, size = GetSizeLstPoints();
+       for( i=0; i<size; i++ )
+       {
+               cloneObject->AddManualPoint( GetManualPoint( i )->Clone() );
+       }
+       cloneObject->SetNumberOfPointsSpline( GetNumberOfPointsSpline () ); 
+       cloneObject->SetCloseContour( _closeContour );
+       cloneObject->UpdateSpline();
+}
+
+
+// ---------------------------------------------------------------------------
+void manualContourModel::AddManualPoint( manualPoint* theManualPoint )//private
+{
+       _lstPoints.push_back( theManualPoint );
+}
+
+std::vector<manualContourModel*> manualContourModel::ExploseModel(  )
+{
+       std::vector<manualContourModel*> lstTmp;
+       lstTmp.push_back(this);
+       return lstTmp;
+}
+
+
+// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+//int manualViewPoint::range=1;
+
+
+manualViewPoint::manualViewPoint(wxVtkBaseView *wxvtkbaseview){
+       _selected                = false;
+       _posibleSelected = false;
+       _pts                     = NULL;
+       _pd                              = NULL;
+       _pointVtkActor   = NULL;
+       _bboxMapper              = NULL;
+       _wxvtkbaseview   = wxvtkbaseview;
+       _spc[0]                  = 1;
+       _spc[1]                  = 1;
+       _spc[2]                  = 1;
+
+       _widthline               = 1;
+
+}
+// ----------------------------------------------------------------------------
+manualViewPoint::~manualViewPoint(){
+       DeleteVtkObjects();
+}
+
+// ----------------------------------------------------------------------------
+void manualViewPoint::SetWidthLine( double width)
+{
+       _widthline = width;
+}
+
+// ----------------------------------------------------------------------------
+void manualViewPoint::SetSelected(bool selected){
+       _selected=selected;
+}
+// ----------------------------------------------------------------------------
+void manualViewPoint::SetPosibleSelected(bool posibleSelected){
+       _posibleSelected=posibleSelected;       
+}
+// ----------------------------------------------------------------------------
+bool manualViewPoint::GetSelected(){
+       return _selected;
+}
+// ----------------------------------------------------------------------------
+bool manualViewPoint::GetPosibleSelected(){
+       return _posibleSelected;
+}
+// ----------------------------------------------------------------------------
+void manualViewPoint::DeleteVtkObjects(){
+       if (_pointVtkActor      !=NULL)         { _pointVtkActor->Delete(); }
+       if (_bboxMapper         !=NULL)         { _bboxMapper   ->Delete();     }
+       if (_pts                        !=NULL)         { _pts                  ->Delete();     }
+       if (_pd                         !=NULL)         { _pd                   ->Delete();     }
+       _pointVtkActor  =       NULL;
+       _bboxMapper             =       NULL;
+       _pts                    =       NULL;
+       _pd                             =       NULL;
+}
+
+
+
+// ----------------------------------------------------------------------------
+vtkActor* manualViewPoint::CreateVtkPointActor()
+{
+       DeleteVtkObjects();
+
+       _pts = vtkPoints::New();
+       _pts->SetNumberOfPoints(8);
+       _pts->SetPoint(0, -1000 , -1000 , 0 );
+       _pts->SetPoint(1,  1000 , -1000 , 0     );
+       _pts->SetPoint(2,  1000 ,  1000 , 0 );
+       _pts->SetPoint(3, -1000 ,  1000 , 0 );
+       _pts->SetPoint(4, -1000 ,  1000 , 0 );
+       _pts->SetPoint(5, -1000 ,  1000 , 0 );
+       _pts->SetPoint(6, -1000 ,  1000 , 0 );
+       _pts->SetPoint(7, -1000 ,  1000 , 0 );
+
+       vtkCellArray *lines = vtkCellArray::New();
+       lines->InsertNextCell(17);
+       lines->InsertCellPoint(0);
+       lines->InsertCellPoint(1);
+       lines->InsertCellPoint(2);
+       lines->InsertCellPoint(3);
+       lines->InsertCellPoint(0);
+       lines->InsertCellPoint(4);
+       lines->InsertCellPoint(5);
+       lines->InsertCellPoint(6);
+       lines->InsertCellPoint(7);
+       lines->InsertCellPoint(4);
+       lines->InsertCellPoint(0);
+       lines->InsertCellPoint(3);
+       lines->InsertCellPoint(7);
+       lines->InsertCellPoint(6);
+       lines->InsertCellPoint(2);
+       lines->InsertCellPoint(1);
+       lines->InsertCellPoint(5);
+
+       _pd = vtkPolyData::New();
+       _pd->SetPoints( _pts );
+       _pd->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+
+       _pointVtkActor  =       vtkActor::New();
+    _bboxMapper                =       vtkPolyDataMapper::New();
+
+       _bboxMapper->SetInput(_pd);
+       _bboxMapper->ImmediateModeRenderingOn();
+       _pointVtkActor->SetMapper(_bboxMapper);
+       _pointVtkActor->GetProperty()->BackfaceCullingOn();
+       UpdateColorActor();
+       _pd->ComputeBounds();
+
+       return _pointVtkActor;
+}
+// ----------------------------------------------------------------------------
+vtkActor* manualViewPoint::GetVtkActor(){
+       return _pointVtkActor;
+}
+// ----------------------------------------------------------------------------
+void manualViewPoint::SetPositionXY(double x, double y,double i_range,double posZ)
+{
+//     double range=0.2; // i_range;
+//     double range=(double)manualViewPoint::range;
+
+       double range=i_range;
+
+//EED 27 sep 2006
+       x        = x * _spc[0];
+       y        = y * _spc[1];
+       posZ = posZ * _spc[2];
+
+       if (_pts!=NULL){
+               _pts->SetPoint(0, x-range, y+range, posZ-range);
+               _pts->SetPoint(1, x+range, y+range, posZ-range);
+               _pts->SetPoint(2, x+range, y-range, posZ-range);
+               _pts->SetPoint(3, x-range, y-range, posZ-range);
+               _pts->SetPoint(4, x-range, y+range, posZ+range);
+               _pts->SetPoint(5, x+range, y+range, posZ+range);
+               _pts->SetPoint(6, x+range, y-range, posZ+range);
+               _pts->SetPoint(7, x-range, y-range, posZ+range);
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+void manualViewPoint::UpdateColorActor()
+{
+       if (_pointVtkActor!=NULL){
+//EED03
+               _pointVtkActor->GetProperty()->SetLineWidth( _widthline );
+               _pointVtkActor->GetProperty()->SetDiffuseColor(1,0,0);
+               if (_posibleSelected==true){
+                       _pointVtkActor->GetProperty()->SetDiffuseColor(1,1,0);
+               }
+       }
+}
+// ----------------------------------------------------------------------------
+void manualViewPoint::GetSpacing(double spc[3])
+{
+       spc[0] = _spc[0];
+       spc[1] = _spc[1];
+       spc[2] = _spc[2];
+}
+// ----------------------------------------------------------------------------
+void manualViewPoint::SetSpacing(double spc[3])
+{
+       _spc[0] = spc[0];
+       _spc[1] = spc[1];
+       _spc[2] = spc[2];
+}
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+manualViewContour::manualViewContour()
+{
+       _id_viewPoint_for_text  =       0;
+       _mesureScale                    =       1;
+       _initialConoturModel = new manualContourModel();
+}
+// ----------------------------------------------------------------------------
+manualViewContour::~manualViewContour()
+{
+       delete _initialConoturModel;
+}
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+manualViewContour * manualViewContour :: Clone()
+{
+       manualViewContour * clone = new manualViewContour();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualViewContour::CopyAttributesTo( manualViewContour * cloneObject)
+{
+       // Call to Fathers object
+       manualViewBaseContour::CopyAttributesTo(cloneObject);
+       
+       cloneObject->SetMesureScale(_mesureScale);
+}
+
+// ---------------------------------------------------------------------------
+
+int manualViewContour::GetType() // virtual
+{
+       return 1;
+}
+
+// ----------------------------------------------------------------------------
+
+void manualViewContour::Save(FILE *pFile)
+{
+       manualViewBaseContour::Save(pFile);
+}
+
+// ----------------------------------------------------------------------------
+
+void manualViewContour::Open(FILE *pFile)
+{
+}
+
+
+
+// ----------------------------------------------------------------------------
+void manualViewContour::RefreshContour() // virtual
+{
+
+       int i,np,nps;
+
+//JSTG 25-02-08 --------------------
+       //double t,delta, x,y,z;
+       double x,y,z;
+//----------------------------------
+
+       _manContModel->UpdateSpline();
+    np = GetNumberOfPoints( );
+       //nps = GetNumberOfPointsSpline(); 
+    nps = _manContModel->GetNumberOfPointsSpline();            
+       //delta=( double ) ( np  ) / ( double ) ( nps-1  );             //JSTG 25-02-08
+
+//printf ("EED manualViewContour::RefreshContour>> %d %d \n", np,nps);
+
+       if ( _pts!=NULL )
+       {
+               if (np>=2  )
+               {
+                       for( i = 0; i < nps; i++ ) 
+                       {
+//JSTG 25-02-08 ------------------------------------------------                               
+                               //t = delta * (double)i;
+                               //_manContModel->GetSplinePoint(t,x,y,z);
+                               _manContModel->GetSpline_i_Point(i,&x,&y,&z);
+//--------------------------------------------------------------
+       // EED 27 sep 2006
+       //                      _pts->SetPoint(i, x,y,z );      
+                               _pts->SetPoint(i , x*_spc[0] , y*_spc[1] , z*_spc[2] );  
+//if (i%15==0)
+//{
+//     printf ("EED manualViewContour::RefreshContour>> %d : %f %f %f \n", i,x,y,z);
+//}
+
+
+                       }// for 
+               } 
+               else 
+               {
+                               _pts->SetPoint(0, 0 , 0 , 0);   
+                               _pts->SetPoint(1, 0 , 0 , 0);   
+               } // if
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualViewContour::RefreshText()  // virtual
+{
+
+       if ((_textActor!=NULL) && ( _textActor->GetProperty()->GetOpacity()!=0 )){
+               int size = GetNumberOfPoints();
+               char text[50];
+               char resultText[50];
+               strcpy(resultText," ");
+               if (size==2)
+               {
+                       strcpy(resultText,"L= ");
+                       gcvt ( _mesureScale * this->_manContModel->GetPathSize() , 5, text );
+                       strcat(resultText,text);
+               }
+               if (size>2)
+               {
+                       if (_manContModel->IfCloseContour()==true)
+                       {
+                               strcpy(resultText,"P= ");
+                               gcvt ( _mesureScale * this->_manContModel->GetPathSize() , 5, text );
+                               strcat(resultText,text);
+                               gcvt ( _mesureScale * _mesureScale * this->_manContModel->GetPathArea() , 5, text );
+                               strcat(resultText,"   A= ");
+                               strcat(resultText,text);
+                       } else {
+                               strcpy(resultText,"L= ");
+                               gcvt (  _mesureScale * this->_manContModel->GetPathSize() , 5, text );
+                               strcat(resultText,text);
+                       }
+               }
+
+               _textActor -> SetInput(resultText);
+
+               if (size>=1){
+
+                       int i;
+                       for (i=0; i<size; i++)
+                       {
+                               if (_lstViewPoints[i]->GetPosibleSelected()==true)
+                               {
+                                       _id_viewPoint_for_text = i;
+                               }
+                       }
+
+                       int id = _id_viewPoint_for_text;
+                       double px = _manContModel->GetManualPoint(id)->GetX();
+                       double py = _manContModel->GetManualPoint(id)->GetY();
+
+                       //EED 27 sep 2006
+                       px=px*_spc[0];
+                       py=py*_spc[1];
+
+                       _textActor->SetPosition(px+GetRange()+1,py);
+               }
+
+       }
+}
+
+// ----------------------------------------------------------------------------
+bool manualViewContour::ifTouchContour(int x,int y,int z){
+       bool result=false;
+       double xx=x;
+       double yy=y;
+       double zz=z;
+       double ppA[3];
+       double ppB[3];
+       double d1,d2,d3;
+       TransfromeCoordViewWorld(xx,yy,zz);
+
+//EED 27 sep 2006
+       xx = xx * _spc[0];
+       yy = yy * _spc[1];
+       zz = zz * _spc[2];
+
+
+    unsigned int i, nps,nps_t;
+    nps          = _sizePointsContour; 
+       if (this->_manContModel->IfCloseContour()==true) 
+       {
+               nps_t = nps; 
+       } else {
+               nps_t = nps-1; 
+       }
+
+    for( i = 0; i < nps_t; i++ ) {
+               _pts->GetPoint(i%nps, ppA);
+               _pts->GetPoint((i+1)%nps, ppB);
+               d1= sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
+               d2= sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
+               d3= sqrt( (ppB[0]-ppA[0])*(ppB[0]-ppA[0]) + (ppB[1]-ppA[1])*(ppB[1]-ppA[1]) + (ppB[2]-ppA[2])*(ppB[2]-ppA[2]));
+               if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) {
+                       result=true;
+                       i=nps;
+               }
+       } 
+       return result;
+}
+
+// ----------------------------------------------------------------------------
+void manualViewContour::DeletePoint(int id) // virtual 
+{
+       if (_lstViewPoints.size()>2)
+       {
+               manualViewBaseContour::DeletePoint( id );
+       }
+}
+// ----------------------------------------------------------------------------
+
+void manualViewContour::ClearPoint(int id)
+{
+       manualViewBaseContour::DeletePoint( id );
+}
+
+//-------------------------------------------------------------------
+void manualViewContour::SetMesureScale(double mesureScale)
+{
+       _mesureScale = mesureScale;
+}
+//-------------------------------------------------------------------
+void manualViewContour::InitMove(int x, int y, int z)
+{
+       _initialConoturModel->DeleteAllPoints();
+       
+       manualPoint *mp = NULL;
+       double XX=x;
+       double YY=y;
+       double ZZ=z;
+       TransfromeCoordViewWorld(XX,YY,ZZ);
+               
+       int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
+       for ( i=0; i<manualPointsSZ; i++ )
+       {
+               mp = _manContModel->GetManualPoint( i );
+               this->_initialConoturModel->AddPoint( mp->GetX() - XX, mp->GetY() - YY, mp->GetZ() );
+       }               
+}
+//-------------------------------------------------------------------
+void manualViewContour::MoveContour(int x, int y, int z)
+{
+       manualPoint *mpOrigin = NULL;
+       manualPoint *mpMoving = NULL;
+       double XX=x;
+       double YY=y;
+       double ZZ=z;
+       
+       TransfromeCoordViewWorld(XX,YY,ZZ);
+
+       int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
+       for ( i=0; i<manualPointsSZ; i++ )
+       {
+               mpOrigin = _manContModel->GetManualPoint( i );
+               mpMoving = _initialConoturModel->GetManualPoint(i);
+               mpOrigin->SetPoint( mpMoving->GetX()+XX, mpMoving->GetY() + YY, mpMoving->GetZ() );
+       }       
+       UpdateViewPoints();     
+}
+void manualViewContour::MoveContour(int horizontalUnits, int verticalUnits )
+{
+       manualPoint *mpOrigin = NULL;
+
+       int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
+       for ( i=0; i<manualPointsSZ; i++ )
+       {
+               mpOrigin = _manContModel->GetManualPoint( i );
+               mpOrigin->SetPoint( mpOrigin->GetX()+horizontalUnits, mpOrigin->GetY()+verticalUnits, mpOrigin->GetZ() );
+       }       
+       UpdateViewPoints();             
+}
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+manualView3VContour::manualView3VContour(int type)
+{
+       _type=type;
+// JSTG 25-02-08 ------------------------------
+       //_manContModel= new manualContourModel();
+//---------------------------------------------
+}
+// ----------------------------------------------------------------------------
+manualView3VContour::~manualView3VContour()
+{
+}
+
+
+
+// ----------------------------------------------------------------------------
+manualView3VContour * manualView3VContour :: Clone()
+{
+       manualView3VContour * clone = new manualView3VContour( GetType() );
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualView3VContour::CopyAttributesTo( manualView3VContour * cloneObject)
+{
+       // Fathers object
+       manualViewContour::CopyAttributesTo(cloneObject);
+}
+
+int manualView3VContour::GetType()
+{
+       return _type;
+}
+
+// ----------------------------------------------------------------------------
+void manualView3VContour::FilterCordinateXYZ(double &x,double &y,double &z)
+{
+       if (_type==0)
+       {
+               x=-1000;
+       }
+       if (_type==1)
+       {
+               y=500;
+       }
+       if (_type==2)
+       {
+               z=-1000;
+       }
+}
+// ----------------------------------------------------------------------------
+
+void manualView3VContour::RefreshContour()  // virtula
+{
+       manualViewContour::RefreshContour();
+       int i;
+       double pp[3];
+// JSTG 25-02-08 ----------------------------------------
+       //int nps = GetNumberOfPointsSpline();
+       int nps = _manContModel->GetNumberOfPointsSpline();
+//-------------------------------------------------------
+       for( i = 0; i < nps; i++ ) 
+       {
+               _pts->GetPoint( i, pp );
+               FilterCordinateXYZ(pp[0],pp[1],pp[2]);
+
+//EED 27 sep 2006
+               _pts->SetPoint( i, pp[0] , pp[1] ,pp[2] );      
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+
+void manualView3VContour::UpdateViewPoint(int id){  // virtual
+       double x,y,z;
+       manualPoint             *mp             = _manContModel->GetManualPoint(id);
+       x=mp->GetX();
+       y=mp->GetY();
+       z=mp->GetZ();
+
+       FilterCordinateXYZ(x,y,z);
+       _lstViewPoints[id]->SetPositionXY( x , y ,GetRange(), z );
+}
+
+// ----------------------------------------------------------------------------
+
+int    manualView3VContour::GetIdPoint(int x, int y, int z) // virtual
+{
+       int ii=-1;
+       if (_manContModel!=NULL){
+               double xx=x;
+               double yy=y;
+               double zz=z;
+               TransfromeCoordViewWorld(xx,yy,zz,-1);
+               ii=_manContModel->GetIdPoint(xx,yy,zz,GetRange(),_type);
+       }
+       return ii;
+}
+
+// ----------------------------------------------------------------------------
+bool manualView3VContour::ifTouchContour(int x,int y,int z){ // virtual
+       bool result=false;
+       double xx=x;
+       double yy=y;
+       double zz=z;
+       double ppA[3];
+       double ppB[3];
+       double d1,d2,d3;
+       TransfromeCoordViewWorld(xx,yy,zz,-1);
+
+//EED 27 sep 2006
+       xx = xx * _spc[0];
+       yy = yy * _spc[1];
+       zz = zz * _spc[2];
+
+    unsigned int i, nps,nps_t;
+    nps          = _sizePointsContour; 
+       if (this->_manContModel->IfCloseContour()==true) 
+       {
+               nps_t = nps; 
+       } else {
+               nps_t = nps-1; 
+       }
+       FilterCordinateXYZ(xx,yy,zz);
+
+    for( i = 0; i < nps_t; i++ ) {
+               _pts->GetPoint(i%nps, ppA);
+               _pts->GetPoint((i+1)%nps, ppB);
+               FilterCordinateXYZ(ppA[0],ppA[1],ppA[2]);
+               FilterCordinateXYZ(ppB[0],ppB[1],ppB[2]);
+               d1= sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
+               d2= sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
+               d3= sqrt( (ppB[0]-ppA[0])*(ppB[0]-ppA[0]) + (ppB[1]-ppA[1])*(ppB[1]-ppA[1]) + (ppB[2]-ppA[2])*(ppB[2]-ppA[2]));
+               if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) {
+                       result=true;
+                       i=nps;
+               }
+       } 
+       return result;
+}
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualView3DContour::manualView3DContour()
+{
+}
+// ----------------------------------------------------------------------------
+manualView3DContour::~manualView3DContour()
+{
+}
+
+// ----------------------------------------------------------------------------
+manualView3DContour * manualView3DContour :: Clone()
+{
+       manualView3DContour * clone = new manualView3DContour();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualView3DContour::CopyAttributesTo( manualView3DContour * cloneObject)
+{
+       // Fathers object
+       manualViewContour::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetDimensions ( _w , _h , _d );
+}
+// ----------------------------------------------------------------------------
+void manualView3DContour::SetDimensions(int w, int h, int d)
+{
+       _w = w;
+       _h = h;
+       _d = d;
+}
+// ----------------------------------------------------------------------------
+void manualView3DContour::TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type)
+{
+       X = _vtkmprbasedata->GetX();
+       Y = _vtkmprbasedata->GetY();
+       Z = _vtkmprbasedata->GetZ();
+}
+// ----------------------------------------------------------------------------
+void manualView3DContour::SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata)
+{
+       _vtkmprbasedata = vtkmprbasedata;
+}
+// ----------------------------------------------------------------------------
+int manualView3DContour::GetIdPoint2(int x, int y)
+{
+       int id = -1;
+       double p[3],pA[3],pB[3];
+
+       double pickPoint[ 3 ], cameraPos[ 3 ];
+       vtkPointPicker* picker = vtkPointPicker::New( );        
+       vtkRenderer *pRenderer = this->GetWxVtkBaseView()->GetRenderer();
+       picker->Pick( x, y, 0.0, pRenderer );
+       pRenderer->GetActiveCamera( )->GetPosition( cameraPos );
+       picker->GetPickPosition( pickPoint );
+       picker->Delete( );
+
+       UtilVtk3DGeometriSelection utilVtk3Dgeometriselection;
+       utilVtk3Dgeometriselection.SetDimentions(_w,_h,_d);
+
+       if( utilVtk3Dgeometriselection.FindCubePointsFromPoints( pA, pB, pickPoint, cameraPos )  ) 
+       {
+               double dist,distMin=999999999;
+               int i,size=this->_manContModel->GetSizeLstPoints();
+               for (i=0;i<size;i++)
+               {
+                       manualPoint *mp = this->_manContModel->GetManualPoint(i);
+                       p[0] = mp->GetX();
+                       p[1] = mp->GetY();
+                       p[2] = mp->GetZ();
+                       dist=utilVtk3Dgeometriselection.DistanceMinPointToLine(p,pA,pB);
+                       if ( (dist<=2*GetRange()) && (dist<distMin) )
+                       {
+                               distMin = dist;
+                               id              = i;
+                       }
+               }
+       }
+       return id;
+}
+// ----------------------------------------------------------------------------
+int manualView3DContour::SelectPosiblePoint ( int x, int y, int z )// virtual
+{
+       SelectAllPossibleSelected(false);
+       int id=GetIdPoint2(x,y);
+       if (id!=-1)
+       {
+               SetPointPosibleSelected(id,true);
+       }
+       return id;
+}
+
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualViewBullEyeSector::manualViewBullEyeSector()
+{
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBullEyeSector::RefreshContour()
+{
+//EED004
+       int i,nps;
+       double x,y,z;
+//----------------------------------
+
+       _manContModel->UpdateSpline();
+    nps = _manContModel->GetNumberOfPointsSpline();            
+
+       if ( _pts!=NULL )
+       {
+               for( i = 0; i < nps; i++ ) 
+               {
+                       _manContModel->GetSpline_i_Point(i,&x,&y,&z);
+                       _pts->SetPoint(i , x*_spc[0] , y*_spc[1] , z*_spc[2] );  
+               }// for 
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+manualViewBullEye::manualViewBullEye()
+{
+}
+
+// ----------------------------------------------------------------------------
+manualViewBullEye::~manualViewBullEye()
+{
+       // BullEye(s)
+       int i,size=lstSectorBullEye.size();
+       for (i=0;i<size;i++)
+       {
+               delete lstSectorBullEye[i];
+       }
+       lstSectorBullEye.clear();
+}
+
+
+// ----------------------------------------------------------------------------
+manualViewBullEye * manualViewBullEye :: Clone()
+{
+       manualViewBullEye * clone = new manualViewBullEye();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualViewBullEye::CopyAttributesTo( manualViewBullEye * cloneObject)
+{
+       // Fathers object
+       manualViewBaseContour::CopyAttributesTo(cloneObject);
+}
+
+
+// ----------------------------------------------------------------------------
+int manualViewBullEye::GetType() // virtual
+{
+       return 4;
+}
+
+
+// ----------------------------------------------------------------------------
+void manualViewBullEye::RefreshContour() // virtual
+{ 
+       // External Rectangle
+       manualViewRoi::RefreshContour();
+
+       _manContModel->UpdateSpline();
+    int np     = GetNumberOfPoints( );
+       // Refres sectors of BullEye(s)
+
+       if (np>=2  )
+       {
+               int i,size = lstSectorBullEye.size();
+               for (i=0;i<size;i++)
+               {
+                       lstSectorBullEye[i]->RefreshContour();
+               } // for
+       } // if
+
+
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBullEye::ConstructVTKObjects() // virtual
+{
+       manualViewRoi::ConstructVTKObjects();
+
+       double spc[3];
+       this->GetSpacing(spc);
+       manualViewBullEyeSector *mvbc;
+       manualContourModelBullEye *mcmbe = (manualContourModelBullEye*)this->_manContModel;
+       int i,size = mcmbe->GetSizeOfSectorLst();
+       for ( i=0 ; i<size ; i++ )
+       {
+               mvbc = new manualViewBullEyeSector();
+               mvbc->SetModel( mcmbe->GetModelSector(i) );
+               mvbc->SetWxVtkBaseView( this->GetWxVtkBaseView()  );
+               mvbc->SetRange( 2 );
+               mvbc->SetZ( 1000 );
+               mvbc->SetSpacing(spc);
+               mvbc->SetColorNormalContour(1, 0, 0);
+//             mvbc->SetColorEditContour(0.5, 0.5, 0.5);
+//             mvbc->SetColorSelectContour(1, 0.8, 0);
+               mvbc->SetWidthLine( this->GetWidthLine()  );
+//EED004
+               mvbc->ConstructVTKObjects();
+               lstSectorBullEye.push_back( mvbc );
+       }
+
+
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBullEye::AddSplineActor()  // virtual
+{
+       manualViewRoi::AddSplineActor();
+       int i,size=lstSectorBullEye.size();
+       for (i=0;i<size;i++)
+       {
+               lstSectorBullEye[i]->AddSplineActor();
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBullEye::RemoveSplineActor()  // virtual
+{
+       manualViewRoi::RemoveSplineActor();
+       int i,size=lstSectorBullEye.size();
+       for (i=0;i<size;i++)
+       {
+               lstSectorBullEye[i]->RemoveSplineActor();
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+manualViewRoi::manualViewRoi()
+{
+       _sizePointsContour=5;
+}
+// ----------------------------------------------------------------------------
+manualViewRoi::~manualViewRoi()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualViewRoi * manualViewRoi :: Clone()
+{
+       manualViewRoi * clone = new manualViewRoi();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualViewRoi::CopyAttributesTo( manualViewRoi * cloneObject)
+{
+       // Fathers object
+       manualViewBaseContour::CopyAttributesTo(cloneObject);
+}
+
+// ----------------------------------------------------------------------------
+void manualViewRoi::RefreshContour() // virtual
+{
+    unsigned int i,ii, np;
+    np = GetNumberOfPoints( );
+       if ( np > 0)
+       {
+               if (np>=2)
+               {
+                       manualPoint     *mp;
+                       for( i = 0; i < np+1; i++ ) {
+                               ii=i%np;
+                               mp = _manContModel->GetManualPoint(ii);
+
+       //EEDx6
+                               double XX=mp->GetX(),YY=mp->GetY(),ZZ=mp->GetZ();
+       //                      wxVtk2DBaseView *wxvtk2Dbasevie = (wxVtk2DBaseView*)this->GetWxVtkBaseView();
+       //                      wxvtk2Dbasevie->TransformCoordinate_spacing_ModelToView(XX,YY,ZZ);
+
+       //EED 27 sep 2007
+       //                      _pts->SetPoint(i, XX,YY,ZZ );   
+                               _pts->SetPoint(i, XX*_spc[0] , YY*_spc[1] , ZZ*_spc[2] );       
+                       } //  rof
+
+               } else {
+                               _pts->SetPoint(0, 0 , 0 , 0);   
+                               _pts->SetPoint(1, 0 , 0 , 0);   
+               } // if
+       }
+}
+
+// ----------------------------------------------------------------------------
+int manualViewRoi::GetType() // virtual
+{
+       return 2;
+}
+
+// ----------------------------------------------------------------------------
+
+void manualViewRoi::GetMinMax(double &minX,double &minY, double &maxX, double &maxY)
+{
+       double  pp[3];
+       manualPoint *mp;  
+    unsigned int i;
+       
+       minX=99999;
+       minY=99999;
+       maxX=-99999;
+       maxY=-99999;
+
+       unsigned int size=(unsigned int) _manContModel->GetSizeLstPoints();
+
+       for( i = 0; i < size; i++ ) 
+       {
+
+               mp=_manContModel->GetManualPoint(i);
+               pp[0]=mp->GetX();
+               pp[1]=mp->GetY();
+               // min X
+               if (pp[0]<minX) 
+               {
+                       minX=pp[0];
+               }
+               //min Y
+               if (pp[1]<minY) 
+               {
+                       minY=pp[1];
+               }
+               //max X
+               if (pp[0]>maxX) 
+               {
+                       maxX=pp[0];
+               }
+               // max Y
+               if (pp[1]>maxY) 
+               {
+                       maxY=pp[1];
+               }
+       }
+
+       if ( size<1 )
+       {
+               minX=0;
+               maxX=0;
+               minY=0;
+               maxY=0;
+       }
+} 
+
+// ----------------------------------------------------------------------------
+
+bool manualViewRoi::ifTouchContour(int x,int y, int z) // virtual 
+{
+       bool    result=false;
+       double  px1=99999,py1=99999,px2=-9999,py2=-99999;
+
+       GetMinMax(px1,py1, px2, py2);
+
+       double xx=x;
+       double yy=y;
+       double zz=z;
+       TransfromeCoordViewWorld(xx,yy,zz);
+
+       bool ok1=false;
+       bool ok2=false;
+       double ddx=GetRange();
+       double ddy=GetRange();
+
+       if ((xx>px1-ddx)&&(xx<px2+ddx) &&  (yy>py1-ddy)&&(yy<py2+ddy))
+       {
+               ok1=true;
+       }
+
+       if ((xx>px1+ddx)&&(xx<px2-ddx) &&  (yy>py1+ddy)&&(yy<py2-ddy))
+       {
+               ok2=true;
+       }
+
+       if ((ok1==true) && (ok2==false))
+       {
+               result=true;
+       }
+
+       return result;
+}
+
+
+// ----------------------------------------------------------------------------
+
+void manualViewRoi::InitMove(int x, int y, int z)  // virtual
+{
+       manualPoint *mp;
+       double XX=x;
+       double YY=y;
+       double ZZ=z;
+       TransfromeCoordViewWorld(XX,YY,ZZ);
+
+       if (_manContModel->GetSizeLstPoints()==4){
+               mp = _manContModel->GetManualPoint(0);
+               _dp0[0]= mp->GetX() - XX;
+               _dp0[1]= mp->GetY() - YY;
+               _dp0[2]= mp->GetZ();
+
+               mp = _manContModel->GetManualPoint(1);
+               _dp1[0]= mp->GetX() - XX;
+               _dp1[1]= mp->GetY() - YY;
+               _dp1[2]= mp->GetZ();
+
+               mp = _manContModel->GetManualPoint(2);
+               _dp2[0]= mp->GetX() - XX;
+               _dp2[1]= mp->GetY() - YY;
+               _dp2[2]= mp->GetZ();
+
+               mp = _manContModel->GetManualPoint(3);
+               _dp3[0]= mp->GetX() - XX;
+               _dp3[1]= mp->GetY() - YY;
+               _dp3[2]= mp->GetZ();
+       }
+}
+
+// ----------------------------------------------------------------------------
+
+void manualViewRoi::MoveContour(int x, int y, int z) // virtual 
+{
+       manualPoint *mp;
+       double XX=x;
+       double YY=y;
+       double ZZ=z;
+       TransfromeCoordViewWorld(XX,YY,ZZ);
+
+       mp = _manContModel->GetManualPoint(0);
+       mp->SetPoint(_dp0[0]+XX,_dp0[1]+YY,_dp0[2]);
+
+       mp = _manContModel->GetManualPoint(1);
+       mp->SetPoint(_dp1[0]+XX,_dp1[1]+YY,_dp0[2]);
+
+       mp = _manContModel->GetManualPoint(2);
+       mp->SetPoint(_dp2[0]+XX,_dp2[1]+YY,_dp0[2]);
+
+       mp = _manContModel->GetManualPoint(3);
+       mp->SetPoint(_dp3[0]+XX,_dp3[1]+YY,_dp0[2]);
+
+       UpdateViewPoint(0);
+       UpdateViewPoint(1);
+       UpdateViewPoint(2);
+       UpdateViewPoint(3);     
+
+}
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// EED08
+
+manualViewCircle::manualViewCircle()
+{
+//     _sizePointsContour=5;   // default 100
+}
+// ----------------------------------------------------------------------------
+manualViewCircle::~manualViewCircle()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualViewCircle * manualViewCircle :: Clone()
+{
+       manualViewCircle * clone = new manualViewCircle();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualViewCircle::CopyAttributesTo( manualViewCircle * cloneObject)
+{
+       // Fathers object
+       manualViewBaseContour::CopyAttributesTo(cloneObject);
+}
+
+
+// ----------------------------------------------------------------------------
+/*
+void manualViewCircle::RefreshContour(){ // virtual
+
+       manualPoint     *mpA,*mpB;
+    unsigned int i, np,nps;
+       double angle,radio;
+       double difX,difY;
+       double XX,YY,ZZ;
+    np = GetNumberOfPoints( );
+       nps = _manContModel->GetNumberOfPointsSpline();
+       double deltaAngle=(3.14159265*2)/(nps-1);
+       if ( np > 0)
+       {
+               if (np==2)
+               {
+                       mpA             = _manContModel->GetManualPoint(0);
+                       mpB             = _manContModel->GetManualPoint(1);
+                       difX    = mpA->GetX() - mpB->GetX();
+                       difY    = mpA->GetY() - mpB->GetY();
+                       radio   = sqrt( difX*difX + difY*difY );
+                       manualContourModelCircle *manContModelCir = (manualContourModelCircle*)_manContModel;
+                       manContModelCir->SetRadio(radio);
+
+                       for( i = 0; i < nps; i++ ) {
+                               manContModelCir->GetSpline_i_Point(i, &XX, &YY, &ZZ);
+//                             angle = deltaAngle*i;
+//                             XX = cos(angle)*radio+mpA->GetX();
+//                             YY = sin(angle)*radio+mpA->GetY();
+                               ZZ = mpA->GetZ();
+                               _pts->SetPoint(i, XX*_spc[0] , YY*_spc[1] , ZZ*_spc[2] );       
+                       } //  rof
+               } else {
+                               _pts->SetPoint(0, 0 , 0 , 0);   
+                               _pts->SetPoint(1, 0 , 0 , 0);   
+               } // if
+       }
+}
+*/
+
+// ----------------------------------------------------------------------------
+int manualViewCircle::GetType() // virtual
+{
+       return 3;
+}
+
+// ----------------------------------------------------------------------------
+
+void manualViewCircle::GetMinMax(double &minX,double &minY, double &maxX, double &maxY)
+{
+       manualPoint     *mpA,*mpB;
+    unsigned int  np;
+       double radio;
+       double difX,difY;
+    np = GetNumberOfPoints( );
+       if (np==2)
+       {
+               mpA             = _manContModel->GetManualPoint(0);
+               mpB             = _manContModel->GetManualPoint(1);
+               difX    = mpA->GetX() - mpB->GetX();
+               difY    = mpA->GetY() - mpB->GetY();
+               radio   = sqrt( difX*difX + difY*difY );
+               minX=mpA->GetX()-radio;
+               minY=mpA->GetY()-radio;
+               maxX=mpA->GetX()+radio;
+               maxY=mpA->GetY()+radio;
+       } else {
+               minX=0;
+               maxX=0;
+               minY=0;
+               maxY=0;
+       }
+} 
+
+/*
+// ----------------------------------------------------------------------------
+bool manualViewCircle::ifTouchContour(int x,int y, int z) // virtual 
+{
+       bool    result=false;
+       double  px1=99999,py1=99999,px2=-9999,py2=-99999;
+
+       GetMinMax(px1,py1, px2, py2);
+
+       double xx=x;
+       double yy=y;
+       double zz=z;
+       TransfromeCoordViewWorld(xx,yy,zz);
+
+       bool ok1=false;
+       bool ok2=false;
+       double ddx=GetRange();
+       double ddy=GetRange();
+
+       if ((xx>px1-ddx)&&(xx<px2+ddx) &&  (yy>py1-ddy)&&(yy<py2+ddy))
+       {
+               ok1=true;
+       }
+
+       if ((xx>px1+ddx)&&(xx<px2-ddx) &&  (yy>py1+ddy)&&(yy<py2-ddy))
+       {
+               ok2=true;
+       }
+
+       if ((ok1==true) && (ok2==false))
+       {
+               result=true;
+       }
+
+       return result;
+}
+*/
+
+// ----------------------------------------------------------------------------
+
+void manualViewCircle::InitMove(int x, int y, int z)  // virtual
+{
+       manualPoint *mp;
+       double XX=x;
+       double YY=y;
+       double ZZ=z;
+       TransfromeCoordViewWorld(XX,YY,ZZ);
+
+       if (_manContModel->GetSizeLstPoints()==2){
+               mp = _manContModel->GetManualPoint(0);
+               _dp0[0]= mp->GetX() - XX;
+               _dp0[1]= mp->GetY() - YY;
+               _dp0[2]= mp->GetZ();
+
+               mp = _manContModel->GetManualPoint(1);
+               _dp1[0]= mp->GetX() - XX;
+               _dp1[1]= mp->GetY() - YY;
+               _dp1[2]= mp->GetZ();
+/*
+               mp = _manContModel->GetManualPoint(2);
+               _dp2[0]= mp->GetX() - XX;
+               _dp2[1]= mp->GetY() - YY;
+               _dp2[2]= mp->GetZ();
+
+               mp = _manContModel->GetManualPoint(3);
+               _dp3[0]= mp->GetX() - XX;
+               _dp3[1]= mp->GetY() - YY;
+               _dp3[2]= mp->GetZ();
+*/
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+void manualViewCircle::MoveContour(int x, int y, int z) // virtual 
+{
+       manualPoint *mp;
+       double XX=x;
+       double YY=y;
+       double ZZ=z;
+       TransfromeCoordViewWorld(XX,YY,ZZ);
+
+       mp = _manContModel->GetManualPoint(0);
+       mp->SetPoint(_dp0[0]+XX,_dp0[1]+YY,_dp0[2]);
+
+       mp = _manContModel->GetManualPoint(1);
+       mp->SetPoint(_dp1[0]+XX,_dp1[1]+YY,_dp0[2]);
+
+//     mp = _manContModel->GetManualPoint(2);
+//     mp->SetPoint(_dp2[0]+XX,_dp2[1]+YY,_dp0[2]);
+
+//     mp = _manContModel->GetManualPoint(3);
+//     mp->SetPoint(_dp3[0]+XX,_dp3[1]+YY,_dp0[2]);
+
+       UpdateViewPoint(0);
+       UpdateViewPoint(1);
+//     UpdateViewPoint(2);
+//     UpdateViewPoint(3);     
+
+}
+
+
+
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+manualViewBaseContour::manualViewBaseContour()
+{
+       _show_text                      = true; 
+       _textActor                      = NULL;
+       _manContModel           = NULL;
+       _wxvtkbaseview          = NULL;
+       _selected                       = false;
+       _posibleSelected        = false;
+       _viewControlPoints      = false;
+       _pts                            = NULL;
+       _pd                                     = NULL;
+       _contourVtkActor        = NULL;
+       _bboxMapper                     = NULL;
+       _range                          = 1;
+       _sizePointsContour      = 100;
+       _spc[0]                         = 1;
+       _spc[1]                         = 1;
+       _spc[2]                         = 1;
+
+       _coulorEdit_r           = 1;
+       _coulorEdit_g           = 1;
+       _coulorEdit_b           = 0;
+
+       _coulorNormal_r         = 1;    
+       _coulorNormal_g         = 0;
+       _coulorNormal_b         = 1;
+
+       _coulorSelection_r      = 0;
+       _coulorSelection_g      = 1;
+       _coulorSelection_b      = 0;
+
+       _widthline                      = 1;
+
+}
+// ----------------------------------------------------------------------------
+manualViewBaseContour::~manualViewBaseContour()
+{
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size; i++){
+               delete _lstViewPoints[i];
+       }
+       _lstViewPoints.clear();
+}
+// ----------------------------------------------------------------------------
+
+
+int manualViewBaseContour::GetType() // virtual
+{
+// Information...
+//int manualViewBaseContour::GetType()         0;
+//int manualViewContour::GetType()                     1;
+//int manualViewRoi::GetType()                         2;
+//int manualViewCircle::GetType()                      3;
+//int manualViewStar::GetType()                                4;
+
+
+       return 0;
+}
+// ----------------------------------------------------------------------------
+
+void manualViewBaseContour::Save(FILE *pFile)
+{
+       fprintf(pFile,"TypeView %d\n", GetType() );
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::Open(FILE *pFile)
+{
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour :: AddCompleteContourActor(  bool ifControlPoints )
+{
+       _viewControlPoints = ifControlPoints;
+        vtkRenderer * theRenderer = _wxvtkbaseview->GetRenderer();
+        //Adding the spline
+        AddSplineActor();
+
+        AddTextActor();
+        //Adding each control point
+        if( ifControlPoints )
+               AddControlPoints();
+        RefreshContour();
+        Refresh();
+}
+// ---------------------------------------------------------------------------
+
+void manualViewBaseContour :: RemoveCompleteContourActor()
+{      
+       vtkRenderer * theRenderer = _wxvtkbaseview->GetRenderer();
+        //Removing the spline
+       RemoveSplineActor();
+       RemoveTextActor();
+       
+       //Removing each point
+       RemoveControlPoints();
+       RefreshContour();
+       Refresh();
+}
+// ---------------------------------------------------------------------------
+manualViewBaseContour *  manualViewBaseContour :: Clone( )//virtual
+{
+       manualViewBaseContour * clone = new manualViewBaseContour();
+       CopyAttributesTo(clone);
+       return clone;
+
+}
+
+// ---------------------------------------------------------------------------
+
+void manualViewBaseContour::CopyAttributesTo( manualViewBaseContour * cloneObject)
+{
+       // Fathers object
+       //XXXX::CopyAttributesTo(cloneObject);
+       
+       cloneObject-> SetWxVtkBaseView( this->_wxvtkbaseview );
+       cloneObject-> SetSelected( this->GetSelected() );
+       cloneObject-> SetPosibleSelected( this->GetPosibleSelected() );
+       cloneObject-> SetIfViewControlPoints( this->GetIfViewControlPoints() );
+       cloneObject-> SetRange( this->GetRange() );
+       cloneObject-> SetZ( this->GetZ() );
+       cloneObject-> SetSpacing( _spc );
+       cloneObject-> SetColorNormalContour( _coulorNormal_r, _coulorNormal_g, _coulorNormal_b );
+       cloneObject-> SetColorEditContour( _coulorEdit_r, _coulorEdit_g, _coulorEdit_b );
+       cloneObject-> SetColorSelectContour( _coulorSelection_r, _coulorSelection_g, _coulorSelection_b );      
+
+       int i, size = _lstViewPoints.size(); 
+       for ( i=0; i<size; i++ )
+       {
+               cloneObject->AddPoint(  );
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour :: AddSplineActor()
+{
+       vtkRenderer * theRenderer = _wxvtkbaseview->GetRenderer();
+       if (_contourVtkActor!=NULL)
+               theRenderer->AddActor( _contourVtkActor  );
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour :: RemoveSplineActor() // virtual
+{
+       vtkRenderer * theRenderer = _wxvtkbaseview->GetRenderer();
+       if (_contourVtkActor!=NULL)
+               theRenderer->RemoveActor( _contourVtkActor );
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour :: RemoveControlPoints()
+{      
+       if (_wxvtkbaseview!=NULL){
+               vtkRenderer * theRenderer = _wxvtkbaseview->GetRenderer();
+               int i,size=_lstViewPoints.size();
+               for (i=0;i<size; i++)
+               {
+                       vtkActor * pointActor = _lstViewPoints[i]->GetVtkActor();
+                       theRenderer->RemoveActor( pointActor );
+               } // for        
+       } // if
+       SetIfViewControlPoints( false );        
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour :: AddControlPoints()
+{
+       vtkRenderer * theRenderer = _wxvtkbaseview->GetRenderer();
+       SetIfViewControlPoints( true ); 
+        if( _viewControlPoints )
+        {
+               int i,size=_lstViewPoints.size();
+               for (i=0;i<size; i++)
+               {
+                       vtkActor * pointActor = _lstViewPoints[i]->GetVtkActor();
+                       theRenderer->AddActor( pointActor );
+               }        
+        }
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::AddTextActor()
+{
+       _wxvtkbaseview->GetRenderer()->AddActor2D( _textActor );
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::RemoveTextActor()
+{
+       _wxvtkbaseview->GetRenderer()->RemoveActor2D( _textActor );
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::DeleteVtkObjects()
+{
+       if ( _contourVtkActor   != NULL )       { _contourVtkActor  -> Delete(); }
+       if ( _bboxMapper                != NULL )       { _bboxMapper           -> Delete(); }
+       if ( _pts                               != NULL )       { _pts                          -> Delete(); }
+       if ( _pd                                != NULL )       { _pd                           -> Delete(); }
+       _contourVtkActor        = NULL;
+       _bboxMapper                     = NULL;
+       _pts                            = NULL;
+       _pd                                     = NULL;
+}
+
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetWidthLine(double width)
+{
+       _widthline = width;
+       this->UpdateColorActor();
+
+       // for the control points
+       int id, size = _lstViewPoints.size();
+       for( id=0; id<size; id++)
+       {
+               this->_lstViewPoints[id]->SetWidthLine(_widthline);
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+double manualViewBaseContour::GetWidthLine()
+{
+       return _widthline;
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::ConstructVTKObjects()
+{
+//JSTG 29-02-08 -----------------------------------------------
+       //int i , nps = _sizePointsContour;
+       int i; 
+       int nps = _manContModel->GetNumberOfPointsSpline();
+//-------------------------------------------------------------
+       DeleteVtkObjects();
+       _pts = vtkPoints::New();
+       _pts->SetNumberOfPoints(nps);
+
+       for (i=0 ; i<nps ; i++){
+               _pts->SetPoint(i,       0       , 0     , 0 );
+       } 
+       // This is for the boundaring inicialisation 
+       _pts->SetPoint(0,       -1000   , -1000 , -1000 );
+       _pts->SetPoint(1,       1000    , 1000  , 1000 );
+
+       vtkCellArray *lines = vtkCellArray::New();
+       lines->InsertNextCell( nps /* +1 */ );
+       for ( i=0 ; i<nps+1 ; i++ ){
+               lines->InsertCellPoint(i % nps );
+       }
+
+       _pd = vtkPolyData::New();
+       _pd->SetPoints( _pts );
+       _pd->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+
+       _contourVtkActor        =       vtkActor::New();
+    _bboxMapper                        =       vtkPolyDataMapper::New();
+    _bboxMapper->ScalarVisibilityOff( );
+
+       _bboxMapper->SetInput(_pd);
+       _bboxMapper->ImmediateModeRenderingOn();
+       _contourVtkActor->SetMapper(_bboxMapper);
+       _contourVtkActor->GetProperty()->BackfaceCullingOff();
+
+       UpdateColorActor();
+
+       _pd->ComputeBounds();
+
+       //      Text
+       _textActor = vtkTextActor::New();
+//     _textActor->SetDisplayPosition(200, 200);
+       _textActor->SetInput("");
+       // Set coordinates to match the old vtkScaledTextActor default value
+//     _textActor->GetPosition2Coordinate()->SetCoordinateSystemToNormalizedViewport();
+//     _textActor->GetPosition2Coordinate()->SetValue( 0.2 , 0.2 );
+       _textActor->GetPositionCoordinate()->SetCoordinateSystemToWorld ();
+//     _textActor->GetPositionCoordinate()->SetValue( 0.8 , 0.8 );
+
+       vtkTextProperty *tprop = _textActor->GetTextProperty();
+       tprop->SetFontSize(14);
+       tprop->SetFontFamilyToArial();
+       tprop->SetColor(0, 0, 1);       
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::CreateNewContour()
+{
+       ConstructVTKObjects();
+       /*
+       _wxvtkbaseview->GetRenderer()->AddActor( _contourVtkActor );
+       _wxvtkbaseview->GetRenderer()->AddActor2D(_textActor);*/
+       AddCompleteContourActor();
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::UpdateViewPoint(int id) // virtual
+{  
+       manualPoint             *mp             = _manContModel->GetManualPoint(id);
+
+//EEDx6
+                       double XX=mp->GetX(),YY=mp->GetY(),ZZ=mp->GetZ();
+//                     wxVtk2DBaseView *wxvtk2Dbasevie = (wxVtk2DBaseView*)this->GetWxVtkBaseView();
+//                     wxvtk2Dbasevie->TransformCoordinate_spacing_ModelToView(XX,YY,ZZ);
+
+       _lstViewPoints[id]->SetPositionXY( XX , YY ,_range, ZZ );
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour :: UpdateViewPoints()
+{
+       int id, size = _lstViewPoints.size();
+       for( id=0; id<size; id++)
+       {
+               UpdateViewPoint( id );
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::AddPoint()
+{
+       manualViewPoint *mvp    = new manualViewPoint( this->GetWxVtkBaseView() );
+       AddPoint( mvp );
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::AddPoint( manualViewPoint * manualViewPoint )
+{
+       _lstViewPoints.push_back( manualViewPoint );
+
+       // EED 3 oct 2006
+       manualViewPoint->SetSpacing(_spc);
+
+       vtkActor *actor = manualViewPoint->CreateVtkPointActor();
+       _wxvtkbaseview->GetRenderer()->AddActor( actor );
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::InsertPoint(int id)
+{
+       manualViewPoint         *mvp    = new manualViewPoint( this->GetWxVtkBaseView() );
+
+// EED 3 oct 2006
+       mvp->SetSpacing(_spc);
+
+       std::vector<manualViewPoint*>::iterator itNum = _lstViewPoints.begin() + id;
+       _lstViewPoints.insert(itNum,mvp);
+       _wxvtkbaseview->GetRenderer()->AddActor( mvp->CreateVtkPointActor() );
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::DeleteContour()
+{
+       RemoveCompleteContourActor();
+       /*if (_contourVtkActor!=NULL){
+               _wxvtkbaseview->GetRenderer()->RemoveActor( _contourVtkActor );
+       }*/
+       DeleteVtkObjects();
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               manualViewBaseContour::DeletePoint(0);
+       }
+       Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::DeletePoint(int id) // virtual 
+{ 
+       int size=_lstViewPoints.size();
+       if ( (id>=0) && (id<size) ){
+               manualViewPoint         *mvp    =_lstViewPoints[id];
+//EED ups1
+//             _handlePicker->DeletePickList(mvp->GetVtkActor());
+               _wxvtkbaseview->GetRenderer()->RemoveActor( mvp->GetVtkActor() );
+               std::vector<manualViewPoint*>::iterator itNum = _lstViewPoints.begin() + id;
+               _lstViewPoints.erase(itNum);
+               delete mvp;
+               Refresh();
+       }
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::DeletePoint(int x, int y, int z)
+{
+       int id=GetIdPoint(x,y,z);
+       if (id!=-1){
+               DeletePoint(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetSelected(bool selected)
+{
+       _selected=selected;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetPosibleSelected(bool posibleSelected)
+{
+       _posibleSelected=posibleSelected;       
+}
+// ----------------------------------------------------------------------------
+bool manualViewBaseContour::GetEditable()
+{
+       return *_editable;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetEditable( bool * condition )
+{
+       _editable = condition;
+}
+// ----------------------------------------------------------------------------
+bool manualViewBaseContour::GetSelected()
+{
+       return _selected;
+}
+// ----------------------------------------------------------------------------
+bool manualViewBaseContour::GetPosibleSelected()
+{
+       return _posibleSelected;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::DeleteSelectedPoints()
+{
+       int i,size=_lstViewPoints.size();
+       for (i=size-1;i>=0;i--){
+               if (_lstViewPoints[i]->GetSelected()==true){
+                       DeletePoint(i);
+               }
+       }
+       Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SelectPoint(int i, bool select)
+{
+       _lstViewPoints[i]->SetSelected(select);
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SelectLstPoints()
+{
+       // ToDo
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SelectAllPoints(bool select)
+{
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               SelectPoint(i,select);
+       }
+}
+//-----------------------------------------------------------------------------
+void manualViewBaseContour:: SetIfViewControlPoints(bool ifShow)
+{      
+       _viewControlPoints = ifShow;    
+}
+// ----------------------------------------------------------------------------
+bool manualViewBaseContour:: GetIfViewControlPoints()
+{
+       return _viewControlPoints;
+}
+
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetPointPosibleSelected(int id,bool select)
+{
+       _lstViewPoints[id]->SetPosibleSelected(select);
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetPointSelected(int id,bool select)
+{
+       _lstViewPoints[id]->SetSelected(select);
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SelectAllPossibleSelected(bool select)
+{
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               SetPointPosibleSelected(i,select);
+       }
+}
+// ----------------------------------------------------------------------------
+int manualViewBaseContour::SelectPosiblePoint(int x, int y, int z)  // virtual
+{
+       SelectAllPossibleSelected(false);
+
+    int id = GetIdPoint(x,y,z);
+       if (id!=-1)
+       {
+               SetPointPosibleSelected(id,true);
+       }
+       return id;
+}
+// ----------------------------------------------------------------------------
+bool manualViewBaseContour::SelectPosibleContour(int x, int y, int z)
+{
+       bool result=false;
+       SetPosibleSelected(result);
+    int id = GetIdPoint(x,y,z);
+       if( !GetEditable() && !_selected && id!= -1)
+       {
+               result=true;
+               SetPosibleSelected(result);
+       }
+       else
+       {
+               if ( (GetEditable()==true) && (id==-1 ) && (this->_lstViewPoints.size()>=2) )
+               {
+                       if (ifTouchContour(x,y,z)==true)
+                       {
+                               result=true;
+                               SetPosibleSelected(result);
+                       }
+               }
+
+               if (GetEditable()==false)
+               {
+                       if (ifTouchContour(x,y,z)==true)
+                       {
+                               result=true;
+                               SetPosibleSelected(result);
+                       }
+               }
+       
+
+       }
+       return result;
+}
+// ----------------------------------------------------------------------------
+bool manualViewBaseContour::ifTouchContour(int x,int y, int z) // virtual
+{
+       return false;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::UnSelectPoint(int i){
+       _lstViewPoints[i]->SetSelected(false);
+       Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::UnSelectLstPoints(){
+       // ToDo
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::UnSelectAllPoints(){
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               UnSelectPoint(i);
+       }
+       Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetModel(manualContourModel *manContModel){
+       _manContModel=manContModel;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview){
+       _wxvtkbaseview = wxvtkbaseview;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::RefreshContour()  // Virtual
+{
+}
+// ----------------------------------------------------------------------------
+double* manualViewBaseContour::GetVectorPointsXManualContour(){
+       double pp[3];
+       int i,size = _sizePointsContour;
+       double *vx = (double*)malloc(sizeof(double)*size);
+       for (i=0;i<size;i++){
+               _pts->GetPoint(i,pp);
+               vx[i]=pp[0];
+       }       
+       return vx;
+}
+// ----------------------------------------------------------------------------
+double* manualViewBaseContour::GetVectorPointsYManualContour()
+{
+       double pp[3];
+       int i,size = _sizePointsContour;
+       double *vy = (double*)malloc(sizeof(double)*size);
+       for (i=0;i<size;i++){
+               _pts->GetPoint(i,pp);
+               vy[i]=pp[1];
+       }       
+       return vy;
+}
+// ----------------------------------------------------------------------------
+double* manualViewBaseContour::GetVectorPointsZManualContour()
+{
+       double pp[3];
+       int i,size = _sizePointsContour;
+       double *vz = (double*)malloc(sizeof(double)*size);
+       for (i=0;i<size;i++){
+               _pts->GetPoint(i,pp);
+               vz[i]=pp[2];
+       }       
+       return vz;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::Refresh() // virtual
+{
+       if (_contourVtkActor!=NULL){
+               RefreshContour();
+       }
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               UpdateViewPoint(i);
+               _lstViewPoints[i]->UpdateColorActor();
+       }
+       UpdateColorActor();
+
+       if (_show_text==true) 
+       {
+               RefreshText();
+       }
+
+       vtkRenderWindowInteractor *vri = _wxvtkbaseview->GetWxVTKRenderWindowInteractor ();
+       if (vri==NULL)
+       {
+               _wxvtkbaseview->GetRenWin()->Render();
+       }
+
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::RefreshText()  // virtual
+{
+       if( _textActor!=NULL)
+               _textActor -> SetInput(" ");
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetColorNormalContour(double r, double g, double b)
+{
+       _coulorNormal_r = r;
+       _coulorNormal_g = g;
+       _coulorNormal_b = b;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::GetColorNormalContour(double &r, double &g, double &b)
+{
+       r = _coulorNormal_r;
+       g = _coulorNormal_g;
+       b = _coulorNormal_b;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetColorEditContour(double r, double g, double b)
+{
+       _coulorEdit_r = r;
+       _coulorEdit_g = g;
+       _coulorEdit_b = b;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::GetColorEditContour(double &r, double &g, double &b)
+{
+       r = _coulorEdit_r;
+       g = _coulorEdit_g;
+       b = _coulorEdit_b;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetColorSelectContour(double r, double g, double b)
+{
+       _coulorSelection_r = r;
+       _coulorSelection_g = g;
+       _coulorSelection_b = b;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::GetColorSelectContour(double &r, double &g, double &b)
+{
+       r = _coulorSelection_r;
+       g = _coulorSelection_g;
+       b = _coulorSelection_b;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::UpdateColorActor()
+{
+       if (_contourVtkActor!=NULL)
+       {
+               _contourVtkActor->GetProperty()->SetLineWidth( _widthline );
+               _contourVtkActor->GetProperty()->SetDiffuseColor( _coulorNormal_r , _coulorNormal_g , _coulorNormal_b );
+               if (_posibleSelected || (_posibleSelected && GetEditable() ) )
+               {
+                       _contourVtkActor->GetProperty()->SetDiffuseColor( _coulorEdit_r , _coulorEdit_g , _coulorEdit_b );
+               }
+               if( _selected )
+               {
+                       _contourVtkActor->GetProperty()->SetDiffuseColor( _coulorSelection_r , _coulorSelection_g , _coulorSelection_b );
+               }
+       }
+}
+// ----------------------------------------------------------------------------
+int    manualViewBaseContour::GetIdPoint(int x, int y, int z) // virtual
+{
+       int ii = -1;
+       if (_manContModel!=NULL){
+               double xx = x;
+               double yy = y;
+               double zz = z;
+               TransfromeCoordViewWorld(xx,yy,zz);
+               ii=_manContModel->GetIdPoint(xx,yy,zz,_range,-1);
+       }
+       return ii;
+}
+
+// ----------------------------------------------------------------------------
+
+
+int manualViewBaseContour::GetNumberOfPoints()
+{
+       return _lstViewPoints.size();
+}
+
+// ----------------------------------------------------------------------------
+
+//JSTG 25-02-08 ---------------------------------------------------------------
+/*int manualViewBaseContour::GetNumberOfPointsSpline()
+{
+       return _sizePointsContour;
+}*/
+//----------------------------------------------------------------------------
+
+//JSTG 25-02-08 ---------------------------------------------------------------
+/*void manualViewBaseContour::SetNumberOfPointsSpline(int size)
+{
+       _sizePointsContour = size;
+}*/
+//----------------------------------------------------------------------------
+// virtual
+void manualViewBaseContour::TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type)  // Virtual
+{
+       _wxvtkbaseview->TransfromeCoordScreenToWorld(X, Y, Z, type);
+
+
+//EED 27 sep 2007
+//   //EEDx6
+//     wxVtk2DBaseView *wxvtk2Dbaseview = (wxVtk2DBaseView*)_wxvtkbaseview;
+//     wxvtk2Dbaseview->TransformCoordinate_spacing_ModelToView(X,Y,Z); 
+
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetRange(int range)
+{
+       _range=range;
+}
+// ----------------------------------------------------------------------------
+int    manualViewBaseContour::GetRange()
+{
+       return _range;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetZ(int z)
+{
+//     _Z=z;
+}
+// ----------------------------------------------------------------------------
+int    manualViewBaseContour::GetZ()
+{
+//     return _Z;
+       return 0;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::InitMove(int x, int y, int z) // virtual
+{
+
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::MoveContour(int x, int y, int z) // virtual
+{      
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::MoveContour(int horizontalUnits, int verticalUnits )// virtual
+{
+
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::GetMinMax( double &minX,double &minY, double &minZ, double &maxX, double &maxY, double &maxZ )// virtual
+{
+       double  pp[3];
+       manualPoint *mp;  
+       int i;
+       int size=_manContModel->GetSizeLstPoints();
+       minX=99999;
+       minY=99999;
+       maxX=-99999;
+       maxY=-99999;
+       bool ifFindZ = minZ!=-1.0 && maxZ!=-1.0;
+       if ( ifFindZ )
+       {
+               minZ=99999;
+               maxZ=-99999;
+       }
+       for( i = 0; i < size; i++ ) 
+       {
+               mp=_manContModel->GetManualPoint(i);
+               pp[0]=mp->GetX();
+               pp[1]=mp->GetY();
+               if ( ifFindZ )
+                       pp[2]=mp->GetZ();
+               // min X
+               if (pp[0]<minX) 
+               {
+                       minX=pp[0];
+               }
+               //min Y
+               if (pp[1]<minY) 
+               {
+                       minY=pp[1];
+               }
+               //max X
+               if (pp[0]>maxX) 
+               {
+                       maxX=pp[0];
+               }
+               // max Y
+               if (pp[1]>maxY) 
+               {
+                       maxY=pp[1];
+               }
+               if ( ifFindZ )
+               {
+                       // min Z
+                       if (pp[2]<minZ) 
+                       {
+                               minZ=pp[2];
+                       }
+                       // max Z
+                       if (pp[2]>maxZ) 
+                       {
+                               maxZ=pp[2];
+                       }
+               }               
+       }
+       if ( size<1 )
+       {
+               minX = 0;
+               maxX = 0;
+
+               minY = 0;
+               maxY = 0;
+
+               minZ = 0;
+               maxZ = 0;
+       }
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::ClearContour()
+{
+       if (_contourVtkActor!=NULL){
+               _wxvtkbaseview->GetRenderer()->RemoveActor( _contourVtkActor );
+       }
+       DeleteVtkObjects();
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               ClearPoint(0);
+       }
+       Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::ClearPoint(int id)
+{
+       DeletePoint(id);
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetVisible(bool ok)
+{
+       double opacity;
+       if (ok==true)
+       {
+               opacity=1;
+       } else {
+               opacity=0;
+       }
+
+       vtkActor *actor;
+       int i,size=_lstViewPoints.size();
+       for (i=0;i<size;i++){
+               actor = _lstViewPoints[i]->GetVtkActor();
+               actor->GetProperty()->SetOpacity( opacity );
+       }
+       _contourVtkActor->GetProperty()->SetOpacity( opacity );
+       _textActor->GetProperty()->SetOpacity( opacity );
+       _textActor->SetInput(" ");
+
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetShowText(bool ok)
+{
+       _show_text = ok;
+       if (_show_text==false)
+       {
+               _textActor->SetInput(" ");
+       }
+}
+// ----------------------------------------------------------------------------
+wxVtkBaseView *manualViewBaseContour::GetWxVtkBaseView()
+{
+       return this->_wxvtkbaseview;
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::GetSpacing(double spc[3])
+{
+       spc[0] = _spc[0];
+       spc[1] = _spc[1];
+       spc[2] = _spc[2];
+}
+// ----------------------------------------------------------------------------
+void manualViewBaseContour::SetSpacing(double spc[3])
+{
+       _spc[0] = spc[0];
+       _spc[1] = spc[1];
+       _spc[2] = spc[2];
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// _type = 0  Sagital  
+// _type = 1  Coronal 
+// _type = 2  Axial   
+// _type = -1 View 3D
+
+manualContour3VControler::manualContour3VControler(int type)
+{
+       _type=type;
+
+//EEDhh
+//     _manViewBaseCont1 = NULL;
+//     _manViewBaseCont2 = NULL;
+//     _manViewBaseCont3 = NULL;
+}
+//----------------------------------------------------------------------------
+manualContour3VControler::~manualContour3VControler()
+{
+}
+
+// ----------------------------------------------------------------------------
+manualContour3VControler * manualContour3VControler :: Clone()  // virtual 
+{
+       manualContour3VControler * clone = new manualContour3VControler( this->GetType() );
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualContour3VControler::CopyAttributesTo( manualContour3VControler * cloneObject)
+{
+       // Fathers object
+       manualContourControler::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetVtkMPRBaseData( this->GetVtkMPRBaseData() );
+
+       // Remember to add ManualViewBaseContour with "AddManualViewBaseContour"
+
+}
+// ----------------------------------------------------------------------------
+int manualContour3VControler::GetType()
+{
+       return _type;
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::AddPoint_Others()
+{
+       manualViewBaseContour *mvbc;
+       int i,size=this->_lstManualViewBaseContour.size();
+       for ( i = 0 ; i < size ; i++ )
+       {
+               mvbc = _lstManualViewBaseContour[i]; 
+               mvbc->AddPoint();
+       }
+
+// EEDhh
+//     if (_manViewBaseCont1!=NULL){
+//             _manViewBaseCont1->AddPoint(); 
+//             _manViewBaseCont2->AddPoint(); 
+//             _manViewBaseCont3->AddPoint();
+//             this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+//     }
+
+       this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::AddPoint( int x, int y, int z ) // virtual
+{
+
+       z=(int)_vtkmprbasedata->GetZ();
+       if (GetManualContourModel()!=NULL){
+               double  xx      = x;
+               double  yy      = y;
+               double  zz      = z;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz,_type);
+
+               if (_type==0)
+               {
+                       xx=_vtkmprbasedata->GetX();
+               }
+
+               if (_type==1)
+               {
+                       yy=_vtkmprbasedata->GetY();
+               }
+
+
+               int     id              = GetManualContourModel()->AddPoint(xx,yy,zz);
+               GetManualViewBaseContour()->AddPoint(); 
+               AddPoint_Others();
+
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::InsertPoint_Others(int id)
+{
+
+       manualViewBaseContour *mvbc;
+       int i,size=this->_lstManualViewBaseContour.size();
+       for ( i = 0 ; i < size ; i++ )
+       {
+               mvbc = _lstManualViewBaseContour[i]; 
+               mvbc->InsertPoint(id);
+       }
+
+/*EEDhh
+       if (_manViewBaseCont1!=NULL){
+               _manViewBaseCont1->InsertPoint(id);                             
+               _manViewBaseCont2->InsertPoint(id);                             
+               _manViewBaseCont3->InsertPoint(id);                             
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+*/
+
+       this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::InsertPoint(int x, int y, int z)
+{
+       int id=-1;
+       if (GetManualContourModel()!=NULL){
+               if (GetManualContourModel()->GetSizeLstPoints()>1){
+                       z=(int)_vtkmprbasedata->GetZ();
+                       double                          xx              = x;
+                       double                          yy              = y;
+                       double                          zz              = z;
+                       GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz,_type);
+                       if (_type==0)
+                       {
+                               xx=_vtkmprbasedata->GetX();
+                       }       
+
+                       if (_type==1)
+                       {
+                               yy=_vtkmprbasedata->GetY();
+                       }
+
+                       id      = GetManualContourModel()->InsertPoint(xx,yy,zz);
+
+                       GetManualViewBaseContour()->InsertPoint(id);    
+                       InsertPoint_Others(0);  
+
+               } else {
+                       AddPoint(x,y,z);        
+               }
+       }
+}
+// ----------------------------------------------------------------------------
+
+// EEDhh
+/*
+void manualContour3VControler::SetModelView (  manualContourModel *manContModel, 
+                                                                                               manualViewBaseContour *manViewBaseCont0, 
+                                                                                               manualViewBaseContour *manViewBaseCont1, 
+                                                                                               manualViewBaseContour *manViewBaseCont2,
+                                                                                               manualViewBaseContour *manViewBaseCont3)
+{
+       manualContourControler::SetModelView(manContModel,manViewBaseCont0);
+       _manViewBaseCont1 = manViewBaseCont1;
+       _manViewBaseCont2 = manViewBaseCont2;
+       _manViewBaseCont3 = manViewBaseCont3;
+}
+*/
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::AddManualViewBaseContour( manualViewBaseContour *manViewBaseCont )
+{
+       _lstManualViewBaseContour.push_back( manViewBaseCont );
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::SetVtkMPRBaseData (vtkMPRBaseData *vtkmprbasedata )
+{
+       _vtkmprbasedata=vtkmprbasedata;
+}
+// ----------------------------------------------------------------------------
+vtkMPRBaseData *manualContour3VControler::GetVtkMPRBaseData()
+{
+       return _vtkmprbasedata;
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::SetPoint( int id ,int x ,int y ,int z ) // virtual
+{
+       z=(int)_vtkmprbasedata->GetZ();
+       if ((GetManualViewBaseContour()!=NULL) && (id>=0)){
+               double xx = x;
+               double yy = y;
+               double zz = z;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz,_type);
+
+               if (_type==0)
+               {
+                       xx=_vtkmprbasedata->GetX();
+               }
+               if (_type==1)
+               {
+                       yy=_vtkmprbasedata->GetY();
+               }
+
+               manualPoint     *mp     = GetManualContourModel()->GetManualPoint(id);
+               mp->SetPoint(xx,yy,zz);
+
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::DeleteActualMousePoint_Others(int id)
+{
+       manualViewBaseContour *mvbc;
+       int i,size=this->_lstManualViewBaseContour.size();
+       for ( i = 0 ; i < size ; i++ )
+       {
+               mvbc = _lstManualViewBaseContour[i]; 
+               mvbc->DeletePoint(id);  
+               mvbc->Refresh();
+       }
+
+/*
+       if (_manViewBaseCont1!=NULL){
+               _manViewBaseCont1->DeletePoint(id);  
+               _manViewBaseCont2->DeletePoint(id);  
+               _manViewBaseCont3->DeletePoint(id);
+       
+               _manViewBaseCont1->Refresh();
+               _manViewBaseCont2->Refresh();
+               _manViewBaseCont3->Refresh();
+               
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+*/
+       this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::DeleteActualMousePoint(int x, int y)// virtual
+{ 
+       int id=GetManualViewBaseContour()->GetIdPoint ( x , y , GetZ() );
+       if (id!=-1){
+               manualContourBaseControler::DeleteActualMousePoint( x , y );
+               DeleteActualMousePoint_Others( id );
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::MouseMove_Others(int id) // virtual
+{
+       manualViewBaseContour *mvbc;
+       int i,size=this->_lstManualViewBaseContour.size();
+       for ( i = 0 ; i < size ; i++ )
+       {
+               mvbc = _lstManualViewBaseContour[i]; 
+               mvbc->SelectAllPossibleSelected(false);
+               if (id!=-1)
+               {       
+                       mvbc->SetPointPosibleSelected(id,true);
+               }
+               mvbc->SetPosibleSelected  (  GetManualViewBaseContour()->GetPosibleSelected()  );   
+               mvbc->Refresh();
+       }
+       
+// EEDhh
+/*     
+       if (_manViewBaseCont1!=NULL){
+               _manViewBaseCont1->SelectAllPossibleSelected(false);
+               _manViewBaseCont2->SelectAllPossibleSelected(false);
+               _manViewBaseCont3->SelectAllPossibleSelected(false);
+               if (id!=-1){            
+                       _manViewBaseCont1->SetPointPosibleSelected(id,true);
+                       _manViewBaseCont2->SetPointPosibleSelected(id,true);
+                       _manViewBaseCont3->SetPointPosibleSelected(id,true);
+               } 
+               _manViewBaseCont1->SetPosibleSelected  (  GetManualViewBaseContour()->GetPosibleSelected()  );   
+               _manViewBaseCont2->SetPosibleSelected  (  GetManualViewBaseContour()->GetPosibleSelected()  );   
+               _manViewBaseCont3->SetPosibleSelected  (  GetManualViewBaseContour()->GetPosibleSelected()  );   
+
+               _manViewBaseCont1->Refresh();
+               _manViewBaseCont2->Refresh();
+               _manViewBaseCont3->Refresh();
+
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+*/
+       this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::MouseMove(int x, int y) // virtual
+{
+       manualContourControler::MouseMove( x , y );
+       int id=GetManualViewBaseContour()->GetIdPoint(x,y,GetZ());
+       MouseMove_Others( id );
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::OnChar_Others()
+{
+       manualViewBaseContour *mvbc;
+       int i,size=this->_lstManualViewBaseContour.size();
+       for ( i = 0 ; i < size ; i++ )
+       {
+               mvbc = _lstManualViewBaseContour[i]; 
+               mvbc->Refresh();
+       }
+// EEDhh
+/*
+               _manViewBaseCont1->Refresh();
+               _manViewBaseCont2->Refresh();
+               _manViewBaseCont3->Refresh();
+*/
+       this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+}
+// ----------------------------------------------------------------------------
+bool manualContour3VControler::OnChar()
+{
+       manualContourControler::OnChar();
+       OnChar_Others();
+       return true;
+}
+// ----------------------------------------------------------------------------
+void manualContour3VControler::ResetContour() // virtual
+{
+       manualContourControler::ResetContour();
+       ResetContour_Others();
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3VControler::ResetContour_Others()
+{
+       manualViewBaseContour *mvbc;
+       int i,size=this->_lstManualViewBaseContour.size();
+       for ( i = 0 ; i < size ; i++ )
+       {
+               mvbc = _lstManualViewBaseContour[i]; 
+               mvbc->DeleteContour();
+               mvbc->CreateNewContour();
+       }
+
+// EEDhh
+/*
+       _manViewBaseCont1->DeleteContour();
+       _manViewBaseCont2->DeleteContour();
+       _manViewBaseCont3->DeleteContour();
+       _manViewBaseCont1->CreateNewContour();
+       _manViewBaseCont2->CreateNewContour();
+       _manViewBaseCont3->CreateNewContour();
+*/
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualContour3DControler::manualContour3DControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualContour3DControler::~manualContour3DControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualContour3DControler * manualContour3DControler :: Clone()  // virtual 
+{
+       manualContour3DControler * clone = new manualContour3DControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualContour3DControler::CopyAttributesTo( manualContour3DControler * cloneObject)
+{
+       // Fathers object
+       manualContourControler::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetVtkMPRBaseData( this->GetVtkMPRBaseData() );
+}
+
+// ----------------------------------------------------------------------------
+bool  manualContour3DControler::OnLeftButtonDown()
+{
+       int X,Y;
+       wxVTKRenderWindowInteractor *wxVTKiren;
+       wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetWxVTKRenderWindowInteractor();
+       wxVTKiren->GetEventPosition(X,Y);
+       MouseClickLeft(X,Y);
+       return true;
+}
+// ----------------------------------------------------------------------------
+void manualContour3DControler::ResetOrientationPlane()
+{
+       double p[3],rp[3],rn[3];
+       p[0] = this->GetVtkMPRBaseData()->GetX(  );
+       p[1] = this->GetVtkMPRBaseData()->GetY(  );
+       p[2] = this->GetVtkMPRBaseData()->GetZ(  );
+       this->GetManualContourModel()->GetNearestPointAndNormal(p,rp,rn);
+       this->GetVtkMPRBaseData()->SetNormal(rn[0],rn[1],rn[2]);
+}
+// ----------------------------------------------------------------------------
+void manualContour3DControler::MouseClickLeft(int x, int y) // virtual
+{
+       manualView3DContour *manualview3Dcontour=(manualView3DContour*)GetManualViewBaseContour();
+       int id=manualview3Dcontour->GetIdPoint2(x,y);
+       if ( (GetState()==0) && (id!=-1) )
+       {
+               manualPoint *mp = this->GetManualContourModel()->GetManualPoint(id);
+
+               this->GetVtkMPRBaseData()->SetX( mp->GetX() );
+               this->GetVtkMPRBaseData()->SetY( mp->GetY() );
+               this->GetVtkMPRBaseData()->SetZ( mp->GetZ() );
+               ResetOrientationPlane();
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+
+
+       manualContourControler::MouseClickLeft(x,y);
+
+} 
+// ----------------------------------------------------------------------------
+bool manualContour3DControler::OnChar()
+{
+       bool ok=true;
+       manualContourControler::OnChar();
+       char keyCode = _vtkInteractorStyleBaseView->GetInteractor()-> GetKeyCode();
+       if (keyCode==32){
+               ok=false;
+               ResetOrientationPlane();
+               this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+       }
+       return ok;
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3DControler::SetVtkMPRBaseData (vtkMPRBaseData *vtkmprbasedata )
+{
+       _vtkmprbasedata=vtkmprbasedata;
+}
+// ----------------------------------------------------------------------------
+vtkMPRBaseData *manualContour3DControler::GetVtkMPRBaseData()
+{
+       return _vtkmprbasedata;
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3DControler::InsertPoint(int x, int y, int z ) // virtual
+{
+       manualContourControler::InsertPoint(  x,  y,  z );
+       ResetOrientationPlane();
+}
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+manualContour3V3DControler::manualContour3V3DControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualContour3V3DControler::~manualContour3V3DControler()
+{
+}
+
+// ----------------------------------------------------------------------------
+manualContour3V3DControler * manualContour3V3DControler :: Clone()  // virtual 
+{
+       manualContour3V3DControler * clone = new manualContour3V3DControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualContour3V3DControler::CopyAttributesTo( manualContour3V3DControler * cloneObject)
+{
+       // Fathers object
+       manualContour3DControler::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetManualContour3VControler( this->GetManualContour3VControler() );
+}
+// ----------------------------------------------------------------------------
+void manualContour3V3DControler::InsertPoint(int x, int y, int z ) // virtual
+{
+       manualContour3DControler::InsertPoint(  x,  y,  z );
+       _manualcontour3Vcontroler->InsertPoint_Others(0);
+}
+// ----------------------------------------------------------------------------
+void manualContour3V3DControler::AddPoint( int x, int y, int z )
+{
+       manualContour3DControler::AddPoint(  x,  y,  z );
+       _manualcontour3Vcontroler->AddPoint_Others();
+}
+// ----------------------------------------------------------------------------
+void manualContour3V3DControler::DeleteActualMousePoint(int x, int y)
+{
+       int id = GetManualViewBaseContour()->GetIdPoint ( x , y , GetZ() );
+       manualContour3DControler::DeleteActualMousePoint( x , y );
+       _manualcontour3Vcontroler->DeleteActualMousePoint_Others(id);
+}
+// ----------------------------------------------------------------------------
+void manualContour3V3DControler::MouseMove( int x, int y )
+{
+       int ss =this->_vtkInteractorStyleBaseView->vtkInteractorStyle::GetState();
+       if ((this->GetState()!=7) && (ss!=1)){
+               manualContour3DControler::MouseMove( x , y );
+               int id = GetManualViewBaseContour()->GetIdPoint ( x , y , GetZ() );
+               _manualcontour3Vcontroler->MouseMove_Others(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContour3V3DControler::SetManualContour3VControler(manualContour3VControler *manualcontour3Vcontroler)
+{
+       _manualcontour3Vcontroler = manualcontour3Vcontroler;
+}
+// ----------------------------------------------------------------------------
+manualContour3VControler *manualContour3V3DControler::GetManualContour3VControler()
+{
+       return _manualcontour3Vcontroler;
+}
+// ----------------------------------------------------------------------------
+bool manualContour3V3DControler::OnChar() // virtual
+{
+       if (manualContour3DControler::OnChar()==false )
+       {
+               _manualcontour3Vcontroler->OnChar_Others();
+       }
+       return true;
+}
+
+// ----------------------------------------------------------------------------
+void manualContour3V3DControler::ResetContour() // virtual 
+{
+       manualContourControler::ResetContour();
+       _manualcontour3Vcontroler->ResetContour_Others();
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// _state = 0  // ..nothing..
+// _state = 1  // move with add point
+// _state = 5  // move 
+// _state = 6  // move with insert point
+// _state = 7  // move with non selection
+
+manualContourControler::manualContourControler()
+{
+       _easyCreation = true;
+       
+}
+// ----------------------------------------------------------------------------
+manualContourControler::~manualContourControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualContourControler * manualContourControler :: Clone()  // virtual 
+{
+       manualContourControler * clone = new manualContourControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+// ---------------------------------------------------------------------------
+void manualContourControler::CopyAttributesTo( manualContourControler * cloneObject)
+{
+       // Fathers object
+       manualContourBaseControler::CopyAttributesTo(cloneObject);
+       cloneObject->SetEasyCreation( this->GetEasyCreation() );
+}
+
+// ----------------------------------------------------------------------------
+void manualContourControler::Configure() //virtual
+{
+ //    this->_manContModel->SetNumberOfPointsSpline(100);
+}
+
+// ----------------------------------------------------------------------------
+void manualContourControler::MouseClickLeft(int x, int y){
+
+                       
+       bool ok = false;
+       int z   = GetZ();
+       int size= GetManualViewBaseContour()->GetNumberOfPoints();
+
+       // Insert a Control Point with shift+ClickLeft
+       int tt = GetState();
+       vtkRenderWindowInteractor *vtkrenderwindowinteractor = _vtkInteractorStyleBaseView->GetInteractor();
+//EED3131
+       if( IsEditable() )
+       {
+               if ( (_vtkInteractorStyleBaseView!=NULL) && (GetState()==0) && ( (vtkrenderwindowinteractor!=NULL) && (vtkrenderwindowinteractor->GetShiftKey()==1) ) ) 
+               { 
+                       ok=true;
+                       InsertPoint(x,y,z);
+                       size++;
+               }
+               // Start to Insert Control Points with ClickLeft (Empty contour)
+               if ((GetState()==0) && (size==0) && (_easyCreation==true) )
+               { 
+                       ok=true;
+                       SetState(1); 
+                       AddPoint(x,y,z);
+               }
+               // Continuie to Insert Control Points with ClickLeft (After being empty the contour)
+               if ((GetState()==1) && (_easyCreation==true) )  
+               { 
+                       ok=true;
+                       AddPoint(x,y,z);
+                       _bakIdPoint=GetNumberOfPointsManualContour() - 1;
+               }
+               // Insert Control Points IF Contour si Selected
+               if ((GetState()==0) && GetManualViewBaseContour()->GetPosibleSelected() )       
+               {               
+                       ok=true;
+                       InsertPoint(x,y,z);
+                       _bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);
+                       SetState(6);
+               }
+               // Chose id of Control Point to be move
+               if ( (GetState()==0 || GetState()==6) && (GetManualViewBaseContour()->GetIdPoint(x,y,z)!=-1 ) )
+               {
+                       ok=true;
+                       _bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);    
+                       SetState(5);
+               }
+               // If nothing selected _state=7
+               if ( (GetState()==0) && (GetManualViewBaseContour()->GetIdPoint(x,y,z)==-1 ) )
+               {
+                       //ok=true;
+                       _bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);    
+                       SetState(7);
+               }
+       }
+       else
+       {
+               SetPosibleToMove( true );
+               GetManualViewBaseContour()->SetSelected( GetManualViewBaseContour()->GetPosibleSelected() );
+       }       
+       if ( GetState() == 0 && GetManualViewBaseContour()->GetPosibleSelected() )
+       {               
+               SetMoving( true );
+               ok=true;                
+               GetManualViewBaseContour()->InitMove(x,y,z);
+               SetState(6);
+       }               
+       if (ok==true)
+       {
+               GetManualViewBaseContour()->Refresh();
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourControler::MouseMove(int x, int y) // virtual
+{
+       int z=GetZ();
+       GetManualViewBaseContour()->SelectPosiblePoint(x,y,z);
+       GetManualViewBaseContour()->SelectPosibleContour(x,y,z);        
+       if (GetState()==1){     SetPoint( _bakIdPoint , x , y ,z); }
+       if (GetState()==5){     SetPoint( _bakIdPoint , x , y ,z); }
+       if ( GetState()==6 && !IsEditable() && GetPosibleToMove() &&IsMoving() )
+       {               
+               GetManualViewBaseContour()->MoveContour(x,y,z);
+       }
+       if (GetState()!=7 || GetManualViewBaseContour()->GetPosibleSelected() ){
+               GetManualViewBaseContour()->Refresh();
+               this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+       }
+       if (!IsEditable())
+       {
+               GetManualViewBaseContour()->RemoveControlPoints();
+               GetManualViewBaseContour()->RemoveTextActor();
+               GetManualViewBaseContour()->Refresh();
+               this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+void manualContourControler::MouseDLeft( int x, int y)//virtual 
+{
+       manualContourBaseControler::MouseDLeft( x, y);  
+       if ( IsEditable() )
+       {
+               GetManualViewBaseContour()->AddControlPoints();
+               GetManualViewBaseContour()->AddTextActor();
+               GetManualViewBaseContour()->Refresh();
+               this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+       }       
+}
+// ----------------------------------------------------------------------------
+void manualContourControler::SetEasyCreation(bool easyCreation)
+{
+       _easyCreation=easyCreation;
+}
+// ----------------------------------------------------------------------------
+bool manualContourControler::GetEasyCreation()
+{
+       return _easyCreation;
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualContourPerpPlaneControler::manualContourPerpPlaneControler()
+{
+       _flagMouseMove = true;
+}
+// ----------------------------------------------------------------------------
+manualContourPerpPlaneControler::~manualContourPerpPlaneControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualContourPerpPlaneControler * manualContourPerpPlaneControler :: Clone()  // virtual 
+{
+       manualContourPerpPlaneControler * clone = new manualContourPerpPlaneControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualContourPerpPlaneControler::CopyAttributesTo( manualContourPerpPlaneControler * cloneObject)
+{
+       // Fathers object
+       manualContourControler::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetVtkMPRBaseData( this->GetVtkMPRBaseData() );
+       cloneObject->SetManualContour3VControler( this->GetManualContour3VControler() );
+       cloneObject->SetVtkInteractorStylePlane2D( this->GetVtkInteractorStylePlane2D() );
+}
+
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata)
+{
+       _vtkmprbasedata = vtkmprbasedata;
+}
+
+// ----------------------------------------------------------------------------
+vtkMPRBaseData *manualContourPerpPlaneControler::GetVtkMPRBaseData()
+{
+       return _vtkmprbasedata;
+}
+
+
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::InsertPoint(int x, int y, int z ) // virtual
+{
+       manualContourControler::InsertPoint(  x,  y,  z );
+       _manualcontour3Vcontroler->InsertPoint_Others(0);
+}
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::AddPoint( int x, int y, int z )
+{
+       manualContourControler::AddPoint(  x,  y,  z );
+       _manualcontour3Vcontroler->AddPoint_Others();
+}
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::DeleteActualMousePoint(int x, int y)
+{
+       int id = GetManualViewBaseContour()->GetIdPoint ( x , y , GetZ() );
+       manualContourControler::DeleteActualMousePoint( x , y );
+       _manualcontour3Vcontroler->DeleteActualMousePoint_Others(id);
+}
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::MouseMove( int x, int y )
+{
+       _flagMouseMove = true;
+       int ss =this->_vtkInteractorStyleBaseView->vtkInteractorStyle::GetState();
+       if ((this->GetState()!=7) && (ss!=1)){
+               manualContourControler::MouseMove( x , y );
+               int id = GetManualViewBaseContour()->GetIdPoint ( x , y , GetZ() );
+               if (id!=-1)
+               {
+                       _manualcontour3Vcontroler->MouseMove_Others(id);
+                       _flagMouseMove = false;
+               }
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::SetManualContour3VControler(manualContour3VControler *manualcontour3Vcontroler)
+{
+       _manualcontour3Vcontroler = manualcontour3Vcontroler;
+}
+// ----------------------------------------------------------------------------
+manualContour3VControler * manualContourPerpPlaneControler::GetManualContour3VControler()
+{
+       return _manualcontour3Vcontroler;
+}
+// ----------------------------------------------------------------------------
+bool manualContourPerpPlaneControler::OnChar() // virtual
+{
+       if (manualContourControler::OnChar()==false )
+       {
+               _manualcontour3Vcontroler->OnChar_Others();
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourPerpPlaneControler::OnMouseMove() //         virtual 
+{
+       manualContourControler::OnMouseMove();
+       return _flagMouseMove;
+}
+// ----------------------------------------------------------------------------
+bool manualContourPerpPlaneControler::OnLeftDClick() //        virtual 
+{
+       manualContourControler::OnLeftDClick();
+       return _flagMouseDClick;
+}
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::ResetContour() // virtual 
+{
+       manualContourControler::ResetContour();
+       _manualcontour3Vcontroler->ResetContour_Others();
+}
+
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::MouseDLeft( int x, int y) // virtual 
+{
+       _flagMouseDClick=true;
+       manualContourControler::MouseDLeft(x,y);
+
+       if (GetManualViewBaseContour()->ifTouchContour(x,y,0)==true)
+       {
+               _flagMouseDClick = false;
+               _vtkinteractorstyleplane2D->OnLeftDClick();
+               ResetOrientationPlane();
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+
+//     int id=GetManualViewBaseContour()->GetIdPoint(x,y,GetZ());
+//             if ( (GetState()==0) && (id!=-1) )
+//     {
+//             manualPoint *mp = this->GetManualContourModel()->GetManualPoint(id);
+//             _vtkmprbasedata->SetX( mp->GetX() );
+//             _vtkmprbasedata->SetY( mp->GetY() );
+//             _vtkmprbasedata->SetZ( mp->GetZ() );
+//             ResetOrientationPlane();
+//             this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+//     } 
+}
+
+
+
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::ResetOrientationPlane()
+{
+       double p[3],rp[3],rn[3];
+       p[0] = _vtkmprbasedata->GetX(  );
+       p[1] = _vtkmprbasedata->GetY(  );
+       p[2] = _vtkmprbasedata->GetZ(  );
+       this->GetManualContourModel()->GetNearestPointAndNormal(p,rp,rn);
+
+       _vtkmprbasedata->SetNormal(rn[0],rn[1],rn[2]);
+}
+
+// ----------------------------------------------------------------------------
+void manualContourPerpPlaneControler::SetVtkInteractorStylePlane2D(InteractorStyleMaracas *vtkinteractorstyleplane2D)
+{
+       _vtkinteractorstyleplane2D = vtkinteractorstyleplane2D;
+}
+// ----------------------------------------------------------------------------
+InteractorStyleMaracas * manualContourPerpPlaneControler::GetVtkInteractorStylePlane2D()
+{
+       return _vtkinteractorstyleplane2D;
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// _state = 0  // ..nothing..
+// _state = 5  // move point
+// _state = 6  // move all
+// _state = 7  // Empty mouse drag
+
+manualRoiControler::manualRoiControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualRoiControler::~manualRoiControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualRoiControler * manualRoiControler :: Clone()  // virtual 
+{
+       manualRoiControler * clone = new manualRoiControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualRoiControler::CopyAttributesTo( manualRoiControler * cloneObject)
+{
+       // Fathers object
+       manualContourBaseControler::CopyAttributesTo(cloneObject);
+}
+
+// ----------------------------------------------------------------------------
+void manualRoiControler::Configure() //virtual
+{
+       this->GetManualContourModel()->SetNumberOfPointsSpline(5);
+}
+
+// ----------------------------------------------------------------------------
+void manualRoiControler::MouseClickLeft(int x, int y){
+       int z = GetZ();
+       if ( (GetState()==0) && (GetManualViewBaseContour()->GetIdPoint(x,y,z)!=-1 ) ){
+               bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);     
+               SetState(5);
+       }
+       if ((GetState()==0) && (GetManualViewBaseContour()->GetPosibleSelected()==true))        { 
+               GetManualViewBaseContour()->InitMove(x,y,z);
+               SetState(6);
+       }
+       int size=GetManualViewBaseContour()->GetNumberOfPoints();
+       if (GetState()==0) { 
+               if (size==0){
+                       AddPoint(x,y,z); 
+                       AddPoint(x,y,z); 
+                       AddPoint(x,y,z); 
+                       AddPoint(x,y,z); 
+               } else {
+                       SetPoint(0,x,y,z); 
+                       SetPoint(1,x,y,z); 
+                       SetPoint(2,x,y,z); 
+                       SetPoint(3,x,y,z); 
+               }
+               bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);     
+               SetState(5);
+       }
+       GetManualViewBaseContour()->Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualRoiControler::MouseMove(int x, int y) // virtual
+{
+       int z=GetZ();
+
+//     this->_vtkInteractorStyleBaseView->
+
+       GetManualViewBaseContour()->SelectPosibleContour(x,y,z);
+       GetManualViewBaseContour()->SelectPosiblePoint(x,y,z);
+
+       if (GetState()==5){     
+               SetPoint( bakIdPoint , x , y ,z); 
+               if (bakIdPoint==0)
+               {
+                       SetPointX( 1 , x ); 
+                       SetPointY( 3 , y ); 
+               }
+               if (bakIdPoint==1)
+               {
+                       SetPointX( 0 , x ); 
+                       SetPointY( 2 , y ); 
+               }
+               if (bakIdPoint==2)
+               {
+                       SetPointX( 3 , x ); 
+                       SetPointY( 1 , y ); 
+               }
+               if (bakIdPoint==3)
+               {
+                       SetPointX( 2 , x ); 
+                       SetPointY( 0 , y ); 
+               }
+       }
+       if (GetState()==6){     
+               GetManualViewBaseContour()->MoveContour(x,y,z);
+       }
+       GetManualViewBaseContour()->Refresh();
+}
+// ----------------------------------------------------------------------------
+void manualRoiControler::DeleteActualMousePoint(int x, int y)  // virtual
+{ 
+}
+// ----------------------------------------------------------------------------
+void manualRoiControler::InitRoi(int ww, int hh, double porcentage)
+{
+       int zz;
+       manualPoint *mp;
+
+       if (GetManualContourModel()->GetSizeLstPoints() ==0)
+       {
+               zz = GetZ();
+               AddPoint(0,0,zz);
+               AddPoint(0,0,zz);
+               AddPoint(0,0,zz);
+               AddPoint(0,0,zz);
+       }
+
+       double pp1=porcentage;
+       double pp2=1-porcentage;
+
+       mp = GetManualContourModel()->GetManualPoint(2);
+       zz=(int)mp->GetZ();
+       mp->SetPoint(ww*pp1,hh*pp1,zz);
+
+       mp = GetManualContourModel()->GetManualPoint(1);
+       zz=(int)mp->GetZ();
+       mp->SetPoint(ww*pp2,hh*pp1,zz);
+
+       mp = GetManualContourModel()->GetManualPoint(0);
+       zz=(int)mp->GetZ();
+       mp->SetPoint(ww*pp2,hh*pp2,zz);
+
+       mp = GetManualContourModel()->GetManualPoint(3);
+       zz=(int)mp->GetZ();
+       mp->SetPoint(ww*pp1,hh*pp2,zz);
+
+       GetManualViewBaseContour() ->UpdateViewPoint(0);
+       GetManualViewBaseContour() ->UpdateViewPoint(1);
+       GetManualViewBaseContour() ->UpdateViewPoint(2);
+       GetManualViewBaseContour() ->UpdateViewPoint(3);
+
+       SetState(0);
+       GetManualViewBaseContour()->Refresh();  
+}      
+
+// ----------------------------------------------------------------------------
+void manualRoiControler::SetRoi(int x1, int y1,int x2, int y2)
+{
+       manualPoint *mp;
+       InitRoi( 0 , 0 , 0.2 );
+       mp = GetManualContourModel()->GetManualPoint(2);
+       mp->SetPointX(x1);
+       mp->SetPointY(y1);
+
+       mp = GetManualContourModel()->GetManualPoint(1);
+       mp->SetPointX(x2);
+       mp->SetPointY(y1);
+
+       mp = GetManualContourModel()->GetManualPoint(0);
+       mp->SetPointX(x2);
+       mp->SetPointY(y2);
+
+       mp = GetManualContourModel()->GetManualPoint(3);
+       mp->SetPointX(x1);
+       mp->SetPointY(y2);
+
+       GetManualViewBaseContour() ->UpdateViewPoint(0);
+       GetManualViewBaseContour() ->UpdateViewPoint(1);
+       GetManualViewBaseContour() ->UpdateViewPoint(2);
+       GetManualViewBaseContour() ->UpdateViewPoint(3);
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// EED08
+
+// _state = 0  // ..nothing..
+// _state = 5  // move point
+// _state = 6  // move all
+// _state = 7  // Empty mouse drag
+
+manualCircleControler::manualCircleControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualCircleControler::~manualCircleControler()
+{
+}
+// ----------------------------------------------------------------------------
+manualCircleControler * manualCircleControler :: Clone()  // virtual 
+{
+       manualCircleControler * clone = new manualCircleControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+void manualCircleControler::CopyAttributesTo( manualCircleControler * cloneObject)
+{
+       // Fathers object
+       manualContourBaseControler::CopyAttributesTo(cloneObject);
+}
+
+// ----------------------------------------------------------------------------
+void manualCircleControler::Configure() //virtual
+{
+//     this->GetManualContourModel()->SetNumberOfPointsSpline(5);
+}
+
+// ----------------------------------------------------------------------------
+void manualCircleControler::MouseClickLeft(int x, int y){
+       int z = GetZ();
+       if ( (GetState()==0) && (GetManualViewBaseContour()->GetIdPoint(x,y,z)!=-1 ) ){
+               bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);     
+               SetState(5);
+       }
+       if ((GetState()==0) && (GetManualViewBaseContour()->GetPosibleSelected()==true))        { 
+               GetManualViewBaseContour()->InitMove(x,y,z);
+               SetState(6);
+       }
+       int size=GetManualViewBaseContour()->GetNumberOfPoints();
+       if (GetState()==0) { 
+               if (size==0){
+                       AddPoint(x,y,z); 
+                       AddPoint(x,y,z); 
+//                     AddPoint(x,y,z); 
+//                     AddPoint(x,y,z); 
+               } else {
+                       SetPoint(0,x,y,z); 
+                       SetPoint(1,x,y,z); 
+//                     SetPoint(2,x,y,z); 
+//                     SetPoint(3,x,y,z); 
+               }
+               bakIdPoint = GetManualViewBaseContour()->GetIdPoint(x,y,z);     
+               SetState(5);
+       }
+       GetManualViewBaseContour()->Refresh();
+}
+// ----------------------------------------------------------------------------
+
+void manualCircleControler::MouseMove(int x, int y) // virtual
+{
+       int z=GetZ();
+
+//     this->_vtkInteractorStyleBaseView->
+
+       GetManualViewBaseContour()->SelectPosibleContour(x,y,z);
+       GetManualViewBaseContour()->SelectPosiblePoint(x,y,z);
+
+       if (GetState()==5){     
+               SetPoint( bakIdPoint , x , y ,z); 
+/*
+               if (bakIdPoint==0)
+               {
+                       SetPointX( 1 , x ); 
+                       SetPointY( 3 , y ); 
+               }
+               if (bakIdPoint==1)
+               {
+                       SetPointX( 0 , x ); 
+                       SetPointY( 2 , y ); 
+               }
+
+               if (bakIdPoint==2)
+               {
+                       SetPointX( 3 , x ); 
+                       SetPointY( 1 , y ); 
+               }
+               if (bakIdPoint==3)
+               {
+                       SetPointX( 2 , x ); 
+                       SetPointY( 0 , y ); 
+               }
+*/
+       }
+       if (GetState()==6){     
+               GetManualViewBaseContour()->MoveContour(x,y,z);
+       }
+       GetManualViewBaseContour()->Refresh();
+}
+
+
+// ----------------------------------------------------------------------------
+void manualCircleControler::DeleteActualMousePoint(int x, int y)  // virtual
+{ 
+}
+// ----------------------------------------------------------------------------
+
+void manualCircleControler::InitRoi(int ww, int hh, double porcentage)
+{
+       int zz;
+       manualPoint *mp;
+
+       if (GetManualContourModel()->GetSizeLstPoints() ==0)
+       {
+               zz = GetZ();
+               AddPoint(0,0,zz);
+               AddPoint(0,0,zz);
+//             AddPoint(0,0,zz);
+//             AddPoint(0,0,zz);
+       }
+
+       double pp1=porcentage;
+       double pp2=1-porcentage;
+
+//     mp = GetManualContourModel()->GetManualPoint(2);
+//     zz=(int)mp->GetZ();
+//     mp->SetPoint(ww*pp1,hh*pp1,zz);
+
+       mp = GetManualContourModel()->GetManualPoint(1);
+       zz=(int)mp->GetZ();
+       mp->SetPoint(ww*pp2,hh*pp1,zz);
+
+       mp = GetManualContourModel()->GetManualPoint(0);
+       zz=(int)mp->GetZ();
+       mp->SetPoint(ww*pp2,hh*pp2,zz);
+
+//     mp = GetManualContourModel()->GetManualPoint(3);
+//     zz=(int)mp->GetZ();
+//     mp->SetPoint(ww*pp1,hh*pp2,zz);
+
+       GetManualViewBaseContour() ->UpdateViewPoint(0);
+       GetManualViewBaseContour() ->UpdateViewPoint(1);
+//     GetManualViewBaseContour() ->UpdateViewPoint(2);
+//     GetManualViewBaseContour() ->UpdateViewPoint(3);
+
+       SetState(0);
+       GetManualViewBaseContour()->Refresh();  
+}      
+
+// ----------------------------------------------------------------------------
+/*
+void manualCircleControler::SetRoi(int x1, int y1,int x2, int y2)
+{
+       manualPoint *mp;
+       InitRoi( 0 , 0 , 0.2 );
+       mp = GetManualContourModel()->GetManualPoint(2);
+       mp->SetPointX(x1);
+       mp->SetPointY(y1);
+
+       mp = GetManualContourModel()->GetManualPoint(1);
+       mp->SetPointX(x2);
+       mp->SetPointY(y1);
+
+       mp = GetManualContourModel()->GetManualPoint(0);
+       mp->SetPointX(x2);
+       mp->SetPointY(y2);
+
+       mp = GetManualContourModel()->GetManualPoint(3);
+       mp->SetPointX(x1);
+       mp->SetPointY(y2);
+
+       GetManualViewBaseContour() ->UpdateViewPoint(0);
+       GetManualViewBaseContour() ->UpdateViewPoint(1);
+       GetManualViewBaseContour() ->UpdateViewPoint(2);
+       GetManualViewBaseContour() ->UpdateViewPoint(3);
+}
+*/
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+manualContourBaseControler::manualContourBaseControler()
+{
+       _manViewBaseCont        = NULL;
+       _manContModel           = NULL;
+       _state                          = 0;
+       _z                                      = -900;
+       _editable                       = true;
+       _posibleToMove          = true; 
+       _moving                         = false;
+       _created                        = false;
+       _keyBoardMoving         = false;
+}
+// ----------------------------------------------------------------------------
+manualContourBaseControler::~manualContourBaseControler()
+{
+}
+
+// ----------------------------------------------------------------------------
+manualContourBaseControler * manualContourBaseControler :: Clone()  // virtual 
+{
+       manualContourBaseControler * clone = new manualContourBaseControler();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualContourBaseControler::CopyAttributesTo( manualContourBaseControler * cloneObject)
+{
+       // Fathers object
+       InteractorStyleMaracas::CopyAttributesTo(cloneObject);
+       cloneObject->SetZ( this->GetZ() );
+       cloneObject->SetState( this->GetState() );
+       cloneObject->SetEditable( this->IsEditable() );
+       cloneObject->SetPosibleToMove( this->GetPosibleToMove() );
+       cloneObject->SetMoving( this->IsMoving() );
+       cloneObject->SetCompleteCreation( this->GetIfCompleteCreation() );
+       cloneObject->SetKeyBoardMoving( this->GetKeyBoardMoving() );
+}
+
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::Configure() //virtual
+{
+}
+
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnChar()
+{
+       if ( _vtkInteractorStyleBaseView!=NULL )
+       {
+               char keyCode = _vtkInteractorStyleBaseView->GetInteractor()-> GetKeyCode();
+
+               int X,Y;
+               wxVTKRenderWindowInteractor *_wxVTKiren;
+               _wxVTKiren= _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               _wxVTKiren->GetEventPosition(X, Y);     
+               int Z = GetZ();
+               // Delete Point
+               if ((keyCode==8) || (keyCode==127))
+               {
+
+                       if (!GetManualViewBaseContour()->GetPosibleSelected()==true)
+                       {
+                               DeleteActualMousePoint(X,Y);
+                       }
+                       GetManualViewBaseContour()->Refresh();
+                       this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+               }       
+               else
+               {
+                       // Magnet 
+                       if (keyCode==32)
+                       {
+                               Magnet(X,Y);
+                               GetManualViewBaseContour()->Refresh();
+                               this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+                       }
+                       else if( !IsEditable() )
+                       {               
+                               if ( keyCode == 'L' )
+                               {       
+                                       GetManualViewBaseContour()->MoveContour( -1, 0 );       
+                                       SetKeyBoardMoving( true );
+                               }
+                               else if ( keyCode == 'R' )
+                               {                       
+                                       GetManualViewBaseContour()->MoveContour( 1, 0 );        
+                                       SetKeyBoardMoving( true );      
+                               }
+                               else if ( keyCode == 'U' )
+                               {
+                                       GetManualViewBaseContour()->MoveContour( 0, -1 );       
+                                       SetKeyBoardMoving( true );
+                               }
+                               else if ( keyCode == 'D' )
+                               {
+                                       GetManualViewBaseContour()->MoveContour( 0, 1 );        
+                                       SetKeyBoardMoving( true );
+                               }
+                               else if ( keyCode == 'W' )//Diagonal left down
+                               {
+                                       GetManualViewBaseContour()->MoveContour( -1, 1 );       
+                                       SetKeyBoardMoving( true );
+                               }
+                               else if ( keyCode == 'Q' )//Diagonal left up
+                               {
+                                       GetManualViewBaseContour()->MoveContour( -1, -1 );      
+                                       SetKeyBoardMoving( true );
+                               }
+                               else if( keyCode == 'P' )//Diagonal right up
+                               {
+                                       GetManualViewBaseContour()->MoveContour( 1, -1 );       
+                                       SetKeyBoardMoving( true );
+                               }
+                               else if( keyCode == 'M' )//Diagonal right down
+                               {
+                                       GetManualViewBaseContour()->MoveContour( 1, 1 );        
+                                       SetKeyBoardMoving( true );
+                               }
+                               if( GetKeyBoardMoving() )
+                               {
+                                       GetManualViewBaseContour()->Refresh();
+                                       this->_vtkInteractorStyleBaseView->SetRefresh_waiting();        
+                               }
+                       }
+               }               
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnMouseMove()
+{
+       if ( _vtkInteractorStyleBaseView!=NULL)
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *_wxVTKiren;
+               _wxVTKiren= _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               _wxVTKiren->GetEventPosition( X , Y );
+
+
+               if ( (_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==0) &&
+                       (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==0) ) {
+                       MouseMove(X,Y);
+               }
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnLeftButtonDown()
+{
+       SetKeyBoardMoving( false );
+       if ( _vtkInteractorStyleBaseView!=NULL )
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X,Y);
+               
+               MouseClickLeft(X,Y);
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnLeftButtonUp()
+{
+       if ( _vtkInteractorStyleBaseView!=NULL )
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X,Y);
+               MouseReleaseLeft(X,Y);
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnLeftDClick()
+{
+       if ( _vtkInteractorStyleBaseView!=NULL )
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X,Y);
+
+               this->MouseDLeft(X,Y);
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnMiddleButtonDown() 
+{
+//     SetKeyBoardMoving( false );
+       if ( _vtkInteractorStyleBaseView!=NULL )
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X,Y);
+               GetManualViewBaseContour()->InitMove( X, Y,GetZ());
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnMiddleButtonUp()
+{
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnRightButtonDown()
+{
+       if( _vtkInteractorStyleBaseView!= NULL )
+       {
+               int X,Y;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition(X, Y);
+               
+               SetCompleteCreation( true );
+               SetKeyBoardMoving( false );
+               MouseClickRight(X,Y);
+       }
+       return true;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::OnRightButtonUp()
+{
+       return true;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetModelView(manualContourModel *manContModel, manualViewBaseContour *manViewBaseCont){
+       _manContModel           =       manContModel;
+       _manViewBaseCont        =       manViewBaseCont;
+       _manViewBaseCont->SetEditable( &_editable );
+}
+// ----------------------------------------------------------------------------
+manualContourModel* manualContourBaseControler::GetManualContourModel()
+{
+       return _manContModel;
+}
+// ----------------------------------------------------------------------------
+manualViewBaseContour* manualContourBaseControler::GetManualViewBaseContour()
+{
+       return _manViewBaseCont;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::MouseClickLeft(int x, int y) // virtual
+{  
+       
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::MouseClickRight(int x, int y)
+{
+       if (_state==1)  
+       { 
+               _state=0;
+       }
+       SetEditable( false );
+       SetPosibleToMove( false );
+       //_state = 0; 
+       _state=7;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::MouseReleaseLeft(int x, int y)
+{
+       if (_state==5){ _state = 0; }
+       if (_state==6){ _state = 0; }
+       if (_state==7){ _state = 0; }   
+       SetMoving( false );
+       GetManualViewBaseContour()->SelectPosibleContour(x,y,GetZ());
+       if( GetIfCompleteCreation() && IsEditable() && !GetManualViewBaseContour()->GetPosibleSelected() && (GetManualViewBaseContour()->GetIdPoint(x,y,GetZ())==-1)  )
+       {
+               SetEditable( false );
+               SetPosibleToMove( false );              
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::MouseDLeft(int x, int y )
+{
+       if (_state==0)  
+       { 
+               int z=GetZ();
+               GetManualViewBaseContour()->SelectPosibleContour(x,y,z);
+               GetManualViewBaseContour()->SelectPosiblePoint(x,y,z);
+               if ( GetManualViewBaseContour()->GetPosibleSelected() )
+               {
+                       _editable = true;
+               }
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::MouseMove(int x, int y) // virtual
+{
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetState(int state)
+{
+       _state=state;
+}
+// ----------------------------------------------------------------------------
+int manualContourBaseControler::GetState()
+{
+       return _state;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::IsEditable( )
+{
+       return _editable;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetEditable(  bool condition  )
+{
+       if (GetManualViewBaseContour()!=NULL) {
+               if( !condition )
+               {
+                       GetManualViewBaseContour()->RemoveControlPoints();
+               }
+               GetManualViewBaseContour()->SetSelected( condition );
+       }       
+       _editable = condition;
+}
+
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::GetPosibleToMove()
+{
+       return _posibleToMove;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetPosibleToMove( bool condition )
+{
+       _posibleToMove = condition;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::IsMoving()
+{
+       return _moving;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetMoving( bool condition )
+{
+       _moving = condition;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetCompleteCreation( bool condition )
+{
+       _created = condition;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::GetIfCompleteCreation ( )
+{
+       return _created;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetKeyBoardMoving( bool condition )
+{
+       _keyBoardMoving = condition;
+}
+// ----------------------------------------------------------------------------
+bool manualContourBaseControler::GetKeyBoardMoving(  )
+{
+       return _keyBoardMoving;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::CreateNewManualContour(){
+       _manViewBaseCont->CreateNewContour();
+}
+// ----------------------------------------------------------------------------
+int    manualContourBaseControler::GetNumberOfPointsManualContour(){
+       return _manViewBaseCont->GetNumberOfPoints();
+}
+// ----------------------------------------------------------------------------
+
+//JSTG - 25-02-08 -------------------------------------------------------------
+int    manualContourBaseControler::GetNumberOfPointsSplineManualContour(){
+       //return _manViewBaseCont->GetNumberOfPointsSpline();
+       return _manContModel->GetNumberOfPointsSpline();
+}
+// ----------------------------------------------------------------------------
+
+double* manualContourBaseControler::GetVectorPointsXManualContour(){
+       return _manViewBaseCont->GetVectorPointsXManualContour();
+}
+// ----------------------------------------------------------------------------
+double* manualContourBaseControler::GetVectorPointsYManualContour(){
+       return _manViewBaseCont->GetVectorPointsYManualContour();
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::DeleteContour(){
+       _manViewBaseCont->DeleteContour();
+       _manContModel->DeleteAllPoints(); 
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::DeleteActualMousePoint(int x, int y)// virtual
+{ 
+       if ((_manContModel!=NULL) && (_manViewBaseCont!=NULL) )
+       {
+               int id=_manViewBaseCont->GetIdPoint(x,y,GetZ());
+               if ((id!=-1) && (_manContModel->GetSizeLstPoints()>2) ){
+                       _manContModel->DeletePoint(id);
+                       _manViewBaseCont->DeletePoint(id);  
+               }
+       }
+       _state = 0;
+}
+
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::Magnet(int x, int y)
+{ 
+       if( IsEditable())
+       {
+               int id=_manViewBaseCont->GetIdPoint(x,y,GetZ());
+               if (GetManualContourModel()!=NULL){
+                       double  xx      = x;
+                       double  yy      = y;
+                       double  zz      = GetZ();
+                       GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+                       int                     id      = GetManualContourModel()->GetIdPoint(xx,yy,zz,32000,-1);
+                       if (id!=-1)
+                       {
+                               manualPoint     *mp     = GetManualContourModel()->GetManualPoint(id);
+                               mp->SetPoint(xx,yy,zz);
+                       }
+       //              GetManualViewBaseContour()->UpdateViewPoint(id);
+               }
+               _state = 0;
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetZ(int z)
+{
+       _z=z;
+}
+// ----------------------------------------------------------------------------
+int manualContourBaseControler::GetZ()
+{
+       return _z;
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::AddPoint(int x, int y, int z) // virtual
+{
+       if (GetManualContourModel()!=NULL){
+               double  xx      = x;
+               double  yy      = y;
+               double  zz      = z;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+               int     id              = GetManualContourModel()->AddPoint(xx,yy,zz);
+               GetManualViewBaseContour()->AddPoint(); 
+//             GetManualViewBaseContour()->UpdateViewPoint(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::InsertPoint(int x,int y,int z)  // virtual
+{
+//EEDzz
+       int id=-1;
+       if (GetManualContourModel()!=NULL){
+               double                          xx              = x;
+               double                          yy              = y;
+               double                          zz              = z;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+               if (GetManualContourModel()->GetSizeLstPoints()>1){
+                       id = GetManualContourModel()->InsertPoint(xx,yy,zz);
+                       GetManualViewBaseContour()->InsertPoint(id);                            
+//                     GetManualViewBaseContour()->UpdateViewPoint(id);
+               } else {
+                       GetManualContourModel()->AddPoint(xx,yy,zz);
+                       GetManualViewBaseContour()->AddPoint(); 
+//                     AddPoint(x,y,z);        
+//                     GetManualViewBaseContour()->UpdateViewPoint(id);
+               }
+       }
+}
+
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetPoint( int id ,int x , int y , int z){ // virtual
+       if ((GetManualViewBaseContour()!=NULL) && (id>=0)){
+               double xx = x;
+               double yy = y;
+               double zz = z;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+               manualPoint             *mp             = _manContModel->GetManualPoint(id);
+               mp->SetPoint(xx,yy,zz);
+               GetManualViewBaseContour()->UpdateViewPoint(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetPointX( int id ,int x  ){
+       if ((GetManualViewBaseContour()!=NULL) && (id>=0)){
+               double xx = x;
+               double yy = 0;
+               double zz = 0;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+               manualPoint             *mp             = _manContModel->GetManualPoint(id);
+               mp->SetPointX(xx);
+               GetManualViewBaseContour()->UpdateViewPoint(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetPointY( int id ,int y  ){
+       if ((GetManualViewBaseContour()!=NULL) && (id>=0)){
+               double xx = 0;
+               double yy = y;
+               double zz = 0;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+               manualPoint             *mp             = _manContModel->GetManualPoint(id);
+               mp->SetPointY(yy);
+               GetManualViewBaseContour()->UpdateViewPoint(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::SetPointZ( int id ,int z  ){
+       if ((GetManualViewBaseContour()!=NULL) && (id>=0)){
+               double xx = 0;
+               double yy = 0;
+               double zz = z;
+               GetManualViewBaseContour()->TransfromeCoordViewWorld(xx,yy,zz);
+               manualPoint             *mp             = _manContModel->GetManualPoint(id);
+               mp->SetPointZ(zz);
+               GetManualViewBaseContour()->UpdateViewPoint(id);
+       }
+}
+// ----------------------------------------------------------------------------
+void manualContourBaseControler::ResetContour() // virtual
+{
+       this->DeleteContour();
+       GetManualViewBaseContour()->CreateNewContour();
+       this->SetState(0);
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/manualContour.h b/lib/maracasVisuLib/src/interface/wxWindows/manualContour.h
new file mode 100644 (file)
index 0000000..ac750b9
--- /dev/null
@@ -0,0 +1,978 @@
+
+#ifndef MANUAL_CONTOUR_H
+#define MANUAL_CONTOUR_H
+
+
+//--
+/* // EEDxx include
+#include <vtkProperty.h> 
+#include "vtkActor.h"
+#include "vtkPoints.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageData.h"
+*/
+
+#include "vtkRenderWindow.h"
+
+#include "vtkRenderer.h"
+#include "vtkRenderWindowInteractor.h" //extremely important with VC++ don't remove !
+#include "vtkCommand.h"
+#include "vtkPolyData.h"
+#include "vtkCellArray.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkInteractorObserver.h"
+#include "vtkInteractorStyleImage.h"
+#include <vtkKochanekSpline.h> 
+
+#include <vtkCellPicker.h> 
+
+
+#include <vtkCamera.h> 
+#include <vtkPolyLine.h>
+#include <vtkDataSetMapper.h>
+#include <vtkUnstructuredGrid.h>
+
+#include "widgets/wxVTKRenderWindowInteractor.h"
+
+
+//--
+
+#include <vector>
+
+
+#include "widgets/wxVtkBaseView.h"
+#include "marTypes.h"
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+
+class manualPoint{
+public:
+       manualPoint();
+       ~manualPoint();
+       void    SetPoint(double x,double y,double z);
+       void    SetPointX(double x);
+       void    SetPointY(double y);
+       void    SetPointZ(double z);
+       double  GetX();
+       double  GetY();
+       double  GetZ();
+       virtual manualPoint * Clone();
+private:
+       double  _x;
+       double  _y;
+       double  _z;
+}; 
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualContourModel{
+public:
+       manualContourModel();
+       ~manualContourModel();
+
+       virtual manualContourModel * Clone();
+       void CopyAttributesTo( manualContourModel *cloneObject );
+       virtual void Open(FILE *ff);    // virtual
+       virtual void Save(FILE *ff);    // virtual
+       virtual GetTypeModel();                 // virtual 
+
+       int                             AddPoint(double x,double y,double z);
+       int                             InsertPoint(double x,double y,double z);
+//JSTG 25-04-08 -------------------------------------------------------
+       void                    InsertPoint_id(int id, double x,double y,double z);
+//---------------------------------------------------------------------
+       void                    AddManualPoint( manualPoint* theManualPoint );
+
+       void                    DeletePoint(int i);
+       void                    DeleteAllPoints();
+
+       void                    MovePoint(int i,double dx,double dy,double dz);
+       void                    MoveLstPoints(double dx,double dy,double dz);
+       void                    MoveAllPoints(double dx,double dy,double dz);
+
+       int                             GetIdPoint(double x, double y, double z, int i_range,int type);
+       manualPoint*    GetManualPoint(int id);
+       int                             GetSizeLstPoints();
+       int                             GetNumberOfPointsSpline();
+       void                    SetNumberOfPointsSpline(int size);
+
+       virtual void    UpdateSpline();
+       void                    SetCloseContour(bool closeContour);
+       bool                    IfCloseContour();
+//JSTG 25-02-08 -----------------------------------------------------------------
+       //void                  GetSplinePoint(double t, double &x, double &y, double &z);      //Method Original
+       //void                  GetSplineiPoint(int i, double &x, double &y, double &z);        //Method Original
+//-------------------------------------------------------------------------------
+       double                  GetPathSize();
+       double                  GetPathArea();
+
+       void                    GetNearestPointAndNormal(double *p, double *rp,  double *rn);
+       
+// JSTG 25-02-08 -----------------------------------------------------------------
+       virtual void    GetSpline_i_Point(int i, double *x, double *y, double *z);
+       void                    GetSpline_t_Point(double t, double *x, double *y, double *z);
+//--------------------------------------------------------------------------------
+
+       virtual std::vector<manualContourModel*> ExploseModel(  );
+
+
+private:
+       int                                                     _sizePointsContour;
+       std::vector<manualPoint*>       _lstPoints;
+       bool                                            _closeContour;
+    vtkKochanekSpline                  *_cntSplineX;
+    vtkKochanekSpline                  *_cntSplineY;
+    vtkKochanekSpline                  *_cntSplineZ;
+
+//JSTG 25-02-08 ----------------------------------------
+       double                  _delta_JSTG;
+//------------------------------------------------------
+
+}; 
+
+
+//--------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS manualContourModelCircle : public manualContourModel
+{
+public:
+       manualContourModelCircle();
+       ~manualContourModelCircle();
+       virtual manualContourModelCircle *Clone();
+       void CopyAttributesTo( manualContourModelCircle *cloneObject);
+       virtual void GetSpline_i_Point(int i, double *x, double *y, double *z);
+private:
+       double          _deltaAngle;
+       double          _radio;
+       double          _centerX;
+       double          _centerY;
+       double          _centerZ;
+
+       virtual int             GetTypeModel();  
+       virtual void    UpdateSpline();
+};
+
+class manualContourModelBullEyeSector : public manualContourModel
+{
+public:
+       manualContourModelBullEyeSector();
+       ~manualContourModelBullEyeSector();
+       virtual manualContourModelBullEyeSector *Clone();
+       void    CopyAttributesTo( manualContourModelBullEyeSector *cloneObject);
+       void    SetSector(      double radioA,
+                                               double radioB,
+                                               double ang,
+                                               double angDelta);
+       void GetSector(         double *radioA,
+                                               double *radioB,
+                                               double *ang,
+                                               double *angDelta);
+       void SetSize(double ww,double hh);
+       void SetCenter(double cx,double cy);
+       virtual void GetSpline_i_Point(int i, double *x, double *y, double *z);
+       virtual void Save(FILE *ff);
+       virtual void Open(FILE *ff);
+
+private:
+       double          _radioA;
+       double          _radioB;
+       double          _ang;
+       double          _angDelta;
+       double          _ww;
+       double          _hh;
+       double          _cx;
+       double          _cy;
+
+       virtual int             GetTypeModel();  
+};
+
+
+//--------------------------------------------------------
+//eed004
+class MARACASVISULIB_EXPORTS manualContourModelBullEye : public manualContourModel
+{
+public:
+       manualContourModelBullEye();
+       ~manualContourModelBullEye();
+       virtual manualContourModelBullEye *Clone();
+       void    CopyAttributesTo( manualContourModelBullEye *cloneObject);
+       virtual void Save(FILE *ff);
+       virtual void Open(FILE *ff);
+
+       int             GetNumberOfPointsSplineSectorBulleEje();
+       void    SetNumberOfPointsSplineSectorBulleEje(int);
+       void    AddSector(      double radioA,
+                                               double radioB,
+                                               double ang,
+                                               double angDelta);
+       void GetSector(         int id, 
+                                               double *radioA,
+                                               double *radioB,
+                                               double *ang,
+                                               double *angDelta);
+       manualContourModelBullEyeSector * GetModelSector(int id);
+
+       void    ResetSectors();
+       int             GetSizeOfSectorLst();
+       virtual void UpdateSpline(); // virtual
+       virtual std::vector<manualContourModel*> ExploseModel(  );
+
+
+
+private:
+       int                                                                                        _numberPointsSlineBySector;
+       std::vector<manualContourModelBullEyeSector *> _lstModelBullEyeSector;
+
+/* Borrame Eduardo
+       std::vector<double>             _lstRadioA;
+       std::vector<double>             _lstRadioB;
+       std::vector<double>             _lstAng;
+       std::vector<double>             _lstAngDelta;
+*/
+
+       virtual int             GetTypeModel();  
+};
+
+
+
+//--------------------------------------------------------
+
+//JSTG 25-02-08 ------------------------------------------
+class MARACASVISULIB_EXPORTS manualContourModelRoi : public manualContourModel
+{
+       public:
+       manualContourModelRoi();
+       ~manualContourModelRoi();
+       virtual manualContourModelRoi *Clone();
+       void CopyAttributesTo( manualContourModelRoi *cloneObject);
+private:
+       virtual int GetTypeModel();  
+};
+//--------------------------------------------------------
+
+
+class manualViewPoint{
+public:
+
+//     static int range;
+
+       manualViewPoint(wxVtkBaseView *wxvtkbaseview);
+       ~manualViewPoint();
+       void            SetSelected(bool selected);
+       void            SetPosibleSelected(bool posibleSelected);
+       bool            GetSelected();
+       bool            GetPosibleSelected();
+       void            DeleteVtkObjects();
+       vtkActor*       CreateVtkPointActor();
+       void            SetPositionXY(double x, double y, double range, double posZ);
+       vtkActor*   GetVtkActor();
+       void            UpdateColorActor();     
+       void            GetSpacing(double spc[3]);
+       void            SetSpacing(double spc[3]);
+       void            SetWidthLine( double width);
+
+
+private:
+       bool                            _selected;      
+       bool                            _posibleSelected;
+       vtkPoints                       *_pts;
+       vtkPolyData                     *_pd;
+       vtkActor                        *_pointVtkActor;
+       vtkPolyDataMapper       *_bboxMapper;
+       wxVtkBaseView           *_wxvtkbaseview;
+       double                          _widthline;
+protected:
+       double                          _spc[3];
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualViewBaseContour{
+public:
+       manualViewBaseContour();
+       ~manualViewBaseContour();
+
+       virtual int GetType();
+       virtual void Save(FILE *pFile);
+       virtual void Open(FILE *pFile);
+
+       void    AddPoint();
+       void    AddPoint( manualViewPoint * manualViewPoint );
+       void    InsertPoint(int id);
+       void    DeleteContour();
+       void    DeletePoint(int x, int y,int z);
+       virtual void    DeletePoint(int id);
+
+       virtual void    UpdateViewPoint(int id);
+       virtual void    UpdateViewPoints();
+
+       void    SetSelected(bool selected);
+       void    SetPosibleSelected(bool posibleSelected);
+       bool    GetSelected();
+       bool    GetPosibleSelected();
+       void    DeleteSelectedPoints();
+       bool    GetEditable();
+       void    SetEditable( bool * condition );
+
+
+
+       virtual int             GetIdPoint(int x, int y, int z);
+
+       void    SelectPoint(int i,bool select);
+       void    SelectLstPoints();
+       void    SelectAllPoints(bool select);
+       virtual int             SelectPosiblePoint(int x, int y ,int z);
+       bool    SelectPosibleContour(int x, int y ,int z);
+       void    SelectAllPossibleSelected(bool select);
+       void    SetPointSelected(int id,bool select);
+       void    SetPointPosibleSelected(int id,bool select);
+       void    SetIfViewControlPoints(bool ifShow);
+       bool    GetIfViewControlPoints();
+       
+       void    UnSelectPoint(int i);
+       void    UnSelectLstPoints();
+       void    UnSelectAllPoints();
+
+       void    SetModel(manualContourModel *manContModel);
+       void    SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview);
+
+       virtual void    Refresh();
+       int             GetNumberOfPoints();                                            // ??? 
+       //int           GetNumberOfPointsSpline();                              //JSTG 25-02-08 In ContourModel is the same method 
+       //void  SetNumberOfPointsSpline(int size);                      //JSTG 25-02-08 In ContourModel is the same method 
+
+       void    CreateNewContour();
+       double* GetVectorPointsXManualContour();
+       double* GetVectorPointsYManualContour();
+       double* GetVectorPointsZManualContour();
+
+       virtual bool    ifTouchContour(int x,int y, int z);
+       void    UpdateColorActor();
+
+       void    SetRange(int range);
+       int             GetRange();
+       void    SetZ(int z);
+       int             GetZ();
+
+       wxVtkBaseView *GetWxVtkBaseView();
+
+       virtual void InitMove(int x, int y, int z);
+       virtual void MoveContour(int x, int y, int z);
+       virtual void MoveContour(int horizontalUnits, int verticalUnits );
+       virtual void GetMinMax( double &minX,double &minY, double &minZ, double &maxX, double &maxY, double &maxZ );
+       virtual void TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type=2);
+
+       void    ClearContour();
+       virtual void    ClearPoint(int id);
+
+       void    SetVisible(bool ok);
+       void    SetShowText(bool ok);
+
+       void    GetSpacing(double spc[3]);
+       void    SetSpacing(double spc[3]);
+
+       void    SetColorNormalContour(double r, double g, double b);
+       void    GetColorNormalContour(double &r, double &g, double &b);
+       void    SetColorEditContour(double r, double g, double b);
+       void    GetColorEditContour(double &r, double &g, double &b);
+       void    SetColorSelectContour(double r, double g, double b);
+       void    GetColorSelectContour(double &r, double &g, double &b);
+       
+       //Addinging and removing from visualization specific actors included in the viewer contour
+       void    AddCompleteContourActor( bool ifControlPoints = false);
+       void    RemoveCompleteContourActor();
+       virtual void    AddSplineActor();
+       virtual void    RemoveSplineActor();
+       void    AddControlPoints();
+       void    RemoveControlPoints();  
+       void    AddTextActor();
+       void    RemoveTextActor();
+
+       virtual manualViewBaseContour * Clone();
+                       void                                    CopyAttributesTo( manualViewBaseContour *cloneObject );
+       virtual void                                    RefreshContour();
+                       void                                    SetWidthLine(double width);
+                       double                                  GetWidthLine();
+
+       virtual void                    ConstructVTKObjects();
+
+private:
+       int                                                             _range;
+
+       wxVtkBaseView                                   *_wxvtkbaseview;
+       bool                                                    _selected;
+       bool                                                    *_editable;
+       bool                                                    _posibleSelected;
+       bool                                                    _viewControlPoints;
+
+
+       vtkPolyData                                             *_pd;
+       vtkActor                                                *_contourVtkActor;
+       vtkPolyDataMapper                               *_bboxMapper;
+
+       double                                                  _coulorEdit_r;
+       double                                                  _coulorEdit_g;
+       double                                                  _coulorEdit_b;
+       double                                                  _coulorNormal_r;
+       double                                                  _coulorNormal_g;
+       double                                                  _coulorNormal_b;
+       double                                                  _coulorSelection_r;
+       double                                                  _coulorSelection_g;
+       double                                                  _coulorSelection_b;
+       double                                                  _widthline;
+
+       void                    DeleteVtkObjects();
+       virtual void    RefreshText();
+
+
+protected:
+
+       // text
+       bool                                                    _show_text;
+       int                                                             _id_viewPoint_for_text;
+       vtkTextActor                                    *_textActor;
+       manualContourModel                              *_manContModel;
+       vtkPoints                                               *_pts;
+// JSTG 25-02-08 --------------------------------------------
+       int                                                             _sizePointsContour;
+//-----------------------------------------------------------
+       std::vector<manualViewPoint*>   _lstViewPoints;
+       double                                                  _spc[3];
+
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualViewContour: public manualViewBaseContour
+{
+public:
+       manualViewContour();
+       ~manualViewContour();
+       virtual manualViewContour * Clone();
+       void CopyAttributesTo( manualViewContour *cloneObject );
+
+       virtual int GetType();
+       virtual void Save(FILE *pFile);
+       virtual void Open(FILE *pFile);
+
+
+       virtual void RefreshContour();
+       virtual bool ifTouchContour(int x,int y, int z);
+       virtual void InitMove(int x, int y, int z);
+       virtual void MoveContour(int x, int y, int z);  
+       virtual void MoveContour(int horizontalUnits, int verticalUnits );
+       virtual void DeletePoint(int id); 
+       virtual void ClearPoint(int id);
+                       void SetMesureScale(double mesureScale);
+private:
+       double  _mesureScale;
+       std::vector< std::vector<double> > _initialMovingPoints;
+       manualContourModel * _initialConoturModel;
+
+       virtual void    RefreshText();
+protected:
+
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class manualView3VContour: public manualViewContour
+{
+public:
+       manualView3VContour(int type);
+       ~manualView3VContour();
+       virtual manualView3VContour * Clone();
+       void CopyAttributesTo( manualView3VContour *cloneObject );
+
+       virtual void    RefreshContour();
+       virtual int             GetIdPoint(int x, int y, int z);
+       virtual void    UpdateViewPoint(int id);
+       virtual bool    ifTouchContour(int x,int y,int z);
+                       int             GetType();
+
+protected:
+private:
+       int             _type;
+       void    FilterCordinateXYZ(double &x,double &y,double &z);
+
+// JSTG 25-02-08 -------------------------------------
+       //manualContourModel                            *_manContModel;
+//----------------------------------------------------
+
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class manualView3DContour: public manualViewContour
+{
+public:
+       manualView3DContour();
+       ~manualView3DContour();
+       virtual manualView3DContour * Clone();
+       void CopyAttributesTo( manualView3DContour *cloneObject );
+
+       virtual void    TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type);
+                       void    SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata);
+
+       virtual int             SelectPosiblePoint ( int x, int y, int z );     
+                       void    SetDimensions(int w, int h, int d);
+
+                       int             GetIdPoint2(int x, int y);
+
+protected:
+       vtkMPRBaseData  *_vtkmprbasedata;
+private:
+       int _w;
+       int _h;
+       int _d;
+
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualViewRoi: public manualViewBaseContour
+{
+public:
+       manualViewRoi();
+       ~manualViewRoi();
+
+       virtual int GetType();
+       virtual manualViewRoi * Clone();
+       void CopyAttributesTo( manualViewRoi *cloneObject );
+
+       virtual void RefreshContour();
+       virtual bool ifTouchContour(int x,int y, int z);  
+       virtual void InitMove(int x, int y, int z);
+       virtual void MoveContour(int x, int y, int z);
+       void GetMinMax(double &minX,double &minY, double &maxX, double &maxY);
+
+private:
+       double                          _dp0[3];
+       double                          _dp1[3];
+       double                          _dp2[3];
+       double                          _dp3[3];
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+class MARACASVISULIB_EXPORTS manualViewBullEyeSector: public manualViewBaseContour
+{
+public:
+       manualViewBullEyeSector();
+       virtual void RefreshContour();
+};
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//EED004
+class MARACASVISULIB_EXPORTS manualViewBullEye: public manualViewRoi
+{
+public:
+       manualViewBullEye();
+       ~manualViewBullEye();
+
+       virtual int GetType();
+       virtual manualViewBullEye * Clone();
+       void CopyAttributesTo( manualViewBullEye *cloneObject );
+
+//     void UpdateColorActorBullEye();
+//     void DeleteVtkObjectsBullEye();
+       virtual void RemoveSplineActor();
+       virtual void AddSplineActor();
+       virtual void ConstructVTKObjects();
+       virtual void RefreshContour(); 
+
+private:
+
+/*EED Borrame
+       std::vector<sectorBullEye* > lstSectorBullEye;
+*/
+
+       std::vector<manualViewBaseContour* > lstSectorBullEye;
+       
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// EED08
+class MARACASVISULIB_EXPORTS manualViewCircle: public manualViewContour
+{
+public:
+       manualViewCircle();
+       ~manualViewCircle();
+
+       virtual int GetType();
+       virtual manualViewCircle * Clone();
+       void CopyAttributesTo( manualViewCircle *cloneObject );
+
+//     void RefreshContour();
+//     virtual bool ifTouchContour(int x,int y, int z);  
+       virtual void InitMove(int x, int y, int z);
+       virtual void MoveContour(int x, int y, int z);
+       void GetMinMax(double &minX,double &minY, double &maxX, double &maxY);
+
+private:
+       double                          _dp0[3];
+       double                          _dp1[3];
+//     double                          _dp2[3];
+//     double                          _dp3[3];
+};
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualContourBaseControler: public InteractorStyleMaracas
+{
+public:
+       manualContourBaseControler();
+       ~manualContourBaseControler();
+
+       virtual manualContourBaseControler * Clone();
+       void CopyAttributesTo( manualContourBaseControler *cloneObject );
+
+       virtual bool  OnChar();
+       virtual bool  OnMouseMove();
+       virtual bool  OnLeftButtonDown(); 
+       virtual bool  OnLeftButtonUp();
+       virtual bool  OnLeftDClick();
+       virtual bool  OnMiddleButtonDown(); 
+       virtual bool  OnMiddleButtonUp();
+       virtual bool  OnRightButtonDown();
+       virtual bool  OnRightButtonUp();
+
+       void    SetModelView(manualContourModel *manContModel, manualViewBaseContour *manViewBaseCont);
+       manualContourModel              * GetManualContourModel();
+       manualViewBaseContour   * GetManualViewBaseContour();
+
+
+       virtual void    MouseClickLeft(int x, int y);
+       virtual void    MouseClickRight(int x, int y);
+       virtual void    MouseDLeft(int x, int y);
+
+       virtual void    MouseMove(int x, int y);
+       virtual void    MouseReleaseLeft(int x, int y);
+
+       void    SetState(int state);
+       int             GetState();
+       bool    IsEditable();
+       void    SetEditable(  bool condition  );
+       bool    GetPosibleToMove();
+       void    SetPosibleToMove(  bool condition  );
+       bool    IsMoving();
+       void    SetMoving(  bool condition  );
+       void    SetCompleteCreation( bool condition );
+       bool    GetIfCompleteCreation ( );
+       void    SetKeyBoardMoving( bool condition );
+       bool    GetKeyBoardMoving(  );
+       
+       void    CreateNewManualContour();
+       int             GetNumberOfPointsManualContour();
+       int             GetNumberOfPointsSplineManualContour();
+       void    DeleteContour();
+       virtual void    DeleteActualMousePoint(int x, int y );
+       double* GetVectorPointsXManualContour();
+       double* GetVectorPointsYManualContour();
+       
+
+       void    SetZ(int z);
+       virtual int             GetZ();
+
+       virtual void    AddPoint(int x, int y, int z);
+       virtual void    InsertPoint(int x, int y, int z);
+
+       virtual void    SetPoint(       int id ,int x ,int y ,int z);
+                       void    SetPointX(      int id ,int x );
+                       void    SetPointY(      int id ,int y );
+                       void    SetPointZ(      int id ,int z );
+
+                       void    Magnet(int x, int y);
+       virtual void    ResetContour();
+
+       virtual void Configure();
+
+
+//EED Borrame
+//     virtual manualContourBaseControler * Clone( manualViewBaseContour * cloneView = NULL, manualContourModel * cloneModel = NULL );
+
+
+private:
+       manualViewBaseContour   *_manViewBaseCont;
+       manualContourModel              *_manContModel;
+
+       int                                             _z;
+       int                                             _state;
+       bool                                    _editable;      
+       bool                                    _posibleToMove;
+       bool                                    _moving;
+       bool                                    _created;
+       bool                                    _keyBoardMoving;
+               
+}; 
+
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualContourControler: public manualContourBaseControler
+{
+public:
+       manualContourControler();
+       ~manualContourControler();
+       virtual manualContourControler * Clone();
+       void CopyAttributesTo( manualContourControler *cloneObject );
+
+       virtual void    MouseClickLeft(int x, int y);
+       virtual void    MouseMove(int x, int y);
+       virtual void    MouseDLeft( int x, int y);              
+       void SetEasyCreation(bool easyCreation);
+       bool GetEasyCreation();
+
+       virtual void Configure();
+
+protected:
+       int             _bakIdPoint;
+private:
+       bool    _easyCreation;
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+
+
+class MARACASVISULIB_EXPORTS manualContour3VControler:  public manualContourControler
+{
+public:
+       manualContour3VControler(int type);
+       ~manualContour3VControler();
+       virtual manualContour3VControler * Clone();
+       void CopyAttributesTo( manualContour3VControler *cloneObject );
+
+       virtual bool    OnChar();       
+       virtual void    AddPoint(int x, int y, int z);
+       virtual void    InsertPoint(int x, int y, int z);
+       virtual void    MouseMove(int x, int y);
+       virtual void    ResetContour();
+
+       void AddManualViewBaseContour( manualViewBaseContour *manViewBaseCont );
+
+       vtkMPRBaseData  *GetVtkMPRBaseData();
+                       void    SetVtkMPRBaseData (vtkMPRBaseData *vtkmprbasedata );
+       virtual void    SetPoint( int id ,int x ,int y ,int z );
+
+       virtual void    DeleteActualMousePoint(int x, int y);
+
+                       void    AddPoint_Others();
+                       void    DeleteActualMousePoint_Others(int id);
+                       void    MouseMove_Others(int id);
+                       void    InsertPoint_Others(int id);
+                       void    OnChar_Others();
+                       void    ResetContour_Others();
+                       int             GetType();
+
+private:
+       int _type;
+
+       vtkMPRBaseData            *_vtkmprbasedata; 
+
+       std::vector< manualViewBaseContour* > _lstManualViewBaseContour;
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualContour3DControler:  public manualContourControler
+{
+public:
+       manualContour3DControler();
+       ~manualContour3DControler();
+       virtual manualContour3DControler * Clone();
+       void CopyAttributesTo( manualContour3DControler *cloneObject );
+
+       virtual bool OnLeftButtonDown(); 
+       virtual bool OnChar(); 
+       virtual void InsertPoint(int x, int y, int z);
+       virtual void MouseClickLeft(int x, int y);
+                       void ResetOrientationPlane();
+
+       vtkMPRBaseData  *GetVtkMPRBaseData();
+                       void    SetVtkMPRBaseData (vtkMPRBaseData *vtkmprbasedata );
+
+
+protected:
+private:
+       vtkMPRBaseData *_vtkmprbasedata; 
+
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS manualContour3V3DControler: public manualContour3DControler
+{
+public:
+       manualContour3V3DControler();
+       ~manualContour3V3DControler();
+       virtual manualContour3V3DControler * Clone();
+       void CopyAttributesTo( manualContour3V3DControler *cloneObject );
+
+       void SetManualContour3VControler(manualContour3VControler *manualcontour3Vcontroler);
+       manualContour3VControler *GetManualContour3VControler();
+
+       virtual bool OnChar();
+       virtual void AddPoint( int x, int y, int z );
+       virtual void DeleteActualMousePoint(int x, int y);
+       virtual void MouseMove(int x, int y);
+       virtual void InsertPoint(int x, int y, int z);
+       virtual void ResetContour();
+
+
+protected:
+private:
+       manualContour3VControler        *_manualcontour3Vcontroler;
+
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS manualContourPerpPlaneControler: public manualContourControler
+{
+public:
+       manualContourPerpPlaneControler();
+       ~manualContourPerpPlaneControler();
+    virtual manualContourPerpPlaneControler * Clone();
+       void CopyAttributesTo( manualContourPerpPlaneControler *cloneObject );
+
+       void SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata);
+       vtkMPRBaseData *GetVtkMPRBaseData();
+
+       virtual bool OnChar();
+       virtual bool OnMouseMove();
+       virtual bool OnLeftDClick(); 
+       virtual void AddPoint( int x, int y, int z );
+       virtual void DeleteActualMousePoint(int x, int y);
+       virtual void MouseMove(int x, int y);
+       virtual void InsertPoint(int x, int y, int z);
+       virtual void ResetContour();
+
+                       void SetManualContour3VControler(manualContour3VControler *manualcontour3Vcontroler);
+                       manualContour3VControler *GetManualContour3VControler();
+
+       virtual void MouseDLeft( int x, int y);
+                       void ResetOrientationPlane();
+                       void SetVtkInteractorStylePlane2D(InteractorStyleMaracas *vtkinteractorstyleplane2D);
+                       InteractorStyleMaracas * GetVtkInteractorStylePlane2D();
+
+private:
+       bool                                            _flagMouseMove;
+       bool                                            _flagMouseDClick;
+       InteractorStyleMaracas          *_vtkinteractorstyleplane2D;
+
+protected:
+       vtkMPRBaseData                          *_vtkmprbasedata;
+       manualContour3VControler        *_manualcontour3Vcontroler;
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS manualRoiControler: public manualContourBaseControler
+{
+public:
+       manualRoiControler();
+       ~manualRoiControler();
+       virtual manualRoiControler * Clone();
+       void CopyAttributesTo( manualRoiControler *cloneObject );
+
+       virtual void MouseClickLeft(int x, int y);
+       virtual void MouseMove(int x, int y );
+       virtual void DeleteActualMousePoint(int x, int y);
+                       void InitRoi(int ww, int hh, double porcentage);
+                       void SetRoi(int x1, int y1,int x2, int y2);
+       virtual void Configure();
+
+
+private:
+       int                                     bakIdPoint;
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// EED08
+class MARACASVISULIB_EXPORTS manualCircleControler: public manualContourControler
+{
+public:
+       manualCircleControler();
+       ~manualCircleControler();
+       virtual manualCircleControler * Clone();
+       void CopyAttributesTo( manualCircleControler *cloneObject );
+
+       virtual void MouseClickLeft(int x, int y);
+       virtual void MouseMove(int x, int y );
+       virtual void DeleteActualMousePoint(int x, int y);
+                       void InitRoi(int ww, int hh, double porcentage);
+//                     void SetRoi(int x1, int y1,int x2, int y2);
+       virtual void Configure();
+
+
+private:
+       int                                     bakIdPoint;
+};
+
+
+
+
+
+#endif // MANUAL_CONTOUR_H
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/manualContourContainer.cxx b/lib/maracasVisuLib/src/interface/wxWindows/manualContourContainer.cxx
new file mode 100644 (file)
index 0000000..98937b6
--- /dev/null
@@ -0,0 +1,738 @@
+
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: manualContourContainer.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:09 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "manualContourContainer.h"
+
+//////////////////////////////////////////////////////////////////////
+// Constructor
+//////////////////////////////////////////////////////////////////////
+
+//--------------------------------------------------------
+manualContourContainer::manualContourContainer()
+{
+
+       _manContourControlWall = NULL;
+       _mContourModelWall = NULL;
+       _mViewContourWall = NULL;
+
+
+       _manContourControlLumen = NULL;
+       _mContourModelLumen = NULL;
+       _mViewContourLumen = NULL;
+}
+
+
+
+
+//--------------------------------------------------------
+manualContourContainer::~manualContourContainer()
+{
+
+}
+
+//--------------------------------------------------------
+manualContourControler* manualContourContainer::getWallController()
+{
+       return _manContourControlWall;
+}
+
+//--------------------------------------------------------
+manualContourControler* manualContourContainer::getLumenController()
+{
+       return _manContourControlLumen;
+}
+
+//--------------------------------------------------------
+manualContourControler* manualContourContainer::getCalcController(int i)
+{
+       return _manContourControlCalc[i];
+}
+
+//--------------------------------------------------------
+manualContourControler* manualContourContainer::getHypoController(int i)
+{
+       return _manContourControlHypo[i];
+}
+
+//--------------------------------------------------------
+int manualContourContainer::addCalcificationContour(wxVtk2DBaseView    *_imageviewer2D_1)
+{
+       int tam = 0;
+       manualContourControler *tempC   = new manualContourControler();
+       manualContourModel *tempM               = new manualContourModel();
+       manualViewContour *tempV                = new manualViewContour();
+//EED 28Dic2006
+       tempV->SetRange((int)(0.6) );
+
+       _manContourControlCalc.push_back(tempC);
+       _mContourModelCalc.push_back(tempM);
+       _mViewContourCalc.push_back(tempV);
+
+       tam = _mViewContourCalc.size() - 1;
+
+       _mViewContourCalc[tam]->SetModel( _mContourModelCalc[tam] );
+       _mViewContourCalc[tam]->SetWxVtkBaseView( _imageviewer2D_1 );
+//     _mViewContourCalc[tam]->SetRange( 2 );
+       _mViewContourCalc[tam]->SetZ( 1000 );
+       _mViewContourCalc[tam]->SetColorNormalContour(0, 0.5, 0);
+       _mViewContourCalc[tam]->SetColorEditContour(1, 1, 0.33);
+       _manContourControlCalc[tam]->SetModelView( _mContourModelCalc[tam] , _mViewContourCalc[tam] );  
+       _manContourControlCalc[tam]->CreateNewManualContour();
+       _manContourControlCalc[tam]->SetActive(false);
+       _mViewContourCalc[tam]->RefreshContour();
+
+       return tam;
+}
+//--------------------------------------------------------
+int manualContourContainer::addHypodenseContour(wxVtk2DBaseView        *_imageviewer2D_1)
+{
+       int tam = 0;
+       manualContourControler *tempC = new manualContourControler();
+       manualContourModel *tempM = new manualContourModel();
+       manualViewContour *tempV = new manualViewContour();
+//EED 28Dic2006
+       tempV->SetRange( (int)(0.6) );
+
+       _manContourControlHypo.push_back(tempC);
+       _mContourModelHypo.push_back(tempM);
+       _mViewContourHypo.push_back(tempV);
+
+       tam = _mViewContourHypo.size() - 1;
+       _mViewContourHypo[tam]->SetModel( _mContourModelHypo[tam] );
+       _mViewContourHypo[tam]->SetWxVtkBaseView( _imageviewer2D_1 );
+//     _mViewContourHypo[tam]->SetRange( 2 );
+       _mViewContourHypo[tam]->SetZ( 1000 );
+       _mViewContourHypo[tam]->SetColorNormalContour(0, 0.5, 0.5);
+       _mViewContourHypo[tam]->SetColorEditContour(1, 1, 0.33);
+       _manContourControlHypo[tam]->SetModelView( _mContourModelHypo[tam] , _mViewContourHypo[tam] );  
+       _manContourControlHypo[tam]->CreateNewManualContour();
+       _manContourControlHypo[tam]->SetActive(false);
+       _mViewContourHypo[tam]->RefreshContour();
+
+       return tam;
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setWallVisibility(bool visible)
+{
+       if (_mViewContourWall != NULL)
+       {
+               _mViewContourWall->SetVisible( visible );
+               _mViewContourWall->Refresh();
+       }
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setLumenVisibility(bool visible)
+{
+       if (_mViewContourLumen != NULL)
+       {
+               _mViewContourLumen->SetVisible( visible );
+               _mViewContourLumen->Refresh();
+       }
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setCalcVisibility(bool visible)
+{
+       int i;
+       for (i = 0; i < (int)_mViewContourCalc.size(); i++)
+       {
+               _mViewContourCalc[i]->SetVisible( visible );
+               _mViewContourCalc[i]->Refresh();
+       }
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setHypoVisibility(bool visible)
+{
+       int i;
+       for (i = 0; i < (int)_mViewContourHypo.size(); i++)
+       {
+               _mViewContourHypo[i]->SetVisible( visible );
+               _mViewContourHypo[i]->Refresh();
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setWallActive()
+{
+       _manContourControlWall -> SetActive(true);
+
+       if (_manContourControlLumen != NULL)
+       {
+               _manContourControlLumen -> SetActive(false);
+       }
+       
+       int i;
+       for (i = 0; i < (int)_manContourControlCalc.size(); i++)
+       {
+               _manContourControlCalc[i] -> SetActive(false);
+       }
+       int j;
+       for (j = 0; j < (int)_manContourControlHypo.size(); j++)
+       {
+               _manContourControlHypo[j] -> SetActive(false);
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setLumenActive()
+{
+       if (_manContourControlWall != NULL)
+       {
+               _manContourControlWall -> SetActive(false);
+       }
+       _manContourControlLumen -> SetActive(true);
+
+       int i;
+       for (i = 0; i < (int)_manContourControlCalc.size(); i++)
+       {
+               _manContourControlCalc[i] -> SetActive(false);
+       }
+
+       int j;
+       for (j = 0; j < (int)_manContourControlHypo.size(); j++)
+       {
+               _manContourControlHypo[j] -> SetActive(false);
+       }
+
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setCalcActive()
+{
+       if (_manContourControlWall != NULL)
+       {
+               _manContourControlWall -> SetActive(false);
+       }
+       if (_manContourControlLumen != NULL)
+       {
+               _manContourControlLumen -> SetActive(false);
+       }
+       int i;
+       for (i = 0; i < (int)_manContourControlHypo.size(); i++)
+       {
+               _manContourControlHypo[i] -> SetActive(false);
+       }
+       int j;
+       for (j = 0; j < (int)_manContourControlCalc.size(); j++)
+       {
+               _manContourControlCalc[j] -> SetActive(true);
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setHypoActive()
+{
+       if (_manContourControlWall != NULL)
+       {
+               _manContourControlWall -> SetActive(false);
+       }
+
+       if (_manContourControlLumen != NULL)
+       {
+               _manContourControlLumen -> SetActive(false);
+       }
+
+       int i;
+       for (i = 0; i < (int)_manContourControlCalc.size(); i++)
+       {
+               _manContourControlCalc[i] -> SetActive(false);
+       }
+       
+       int j;
+       for (j = 0; j < (int)_manContourControlHypo.size(); j++)
+       {
+               _manContourControlHypo[j] -> SetActive(true);
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setCalcContourActive(int i)
+{
+       if (_manContourControlWall != NULL)
+       {
+               _manContourControlWall -> SetActive(false);
+       }
+       if (_manContourControlLumen != NULL)
+       {
+               _manContourControlLumen -> SetActive(false);
+       }
+
+       int j;
+       for (j = 0; j < (int)_manContourControlHypo.size(); j++)
+       {
+               _manContourControlHypo[j] -> SetActive(false);
+       }
+
+       _manContourControlCalc[i] -> SetActive(true);
+}
+
+//--------------------------------------------------------
+void manualContourContainer::setHypoContourActive(int i)
+{
+       if (_manContourControlWall != NULL)
+       {
+               _manContourControlWall -> SetActive(false);
+       }
+       if (_manContourControlLumen != NULL)
+       {
+               _manContourControlLumen -> SetActive(false);
+       }
+
+       int j;
+       for (j = 0; j < (int)_manContourControlCalc.size(); j++)
+       {
+               _manContourControlCalc[j] -> SetActive(true);
+       }
+
+       _manContourControlHypo[i] -> SetActive(true);
+}
+
+//--------------------------------------------------------
+int  manualContourContainer::getNumberOfCalcContours()
+{
+       return _manContourControlCalc.size();
+}
+
+//--------------------------------------------------------
+int  manualContourContainer::getNumberOfHypoContours()
+{
+       return _manContourControlHypo.size();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::inactivate()
+{
+       if (_manContourControlWall != NULL)
+       {
+               _manContourControlWall -> SetActive(false);
+       }
+       if (_manContourControlLumen != NULL)
+       {
+               _manContourControlLumen -> SetActive(false);
+       }
+
+       int i;
+       for (i = 0; i < (int)_manContourControlCalc.size(); i++)
+       {
+               _manContourControlCalc[i] -> SetActive(false);
+       }
+       int j;
+       for (j = 0; j < (int)_manContourControlHypo.size(); j++)
+       {
+               _manContourControlHypo[j] -> SetActive(false);
+       }
+}
+
+//--------------------------------------------------------
+int manualContourContainer::getNumberOfWallContourPoints()
+{
+       return _manContourControlWall->GetNumberOfPointsSplineManualContour();
+}
+
+//--------------------------------------------------------
+int manualContourContainer::getNumberOfLumenContourPoints()
+{
+       return _manContourControlLumen->GetNumberOfPointsSplineManualContour();
+}
+
+//--------------------------------------------------------
+int manualContourContainer::getNumberOfCalcContourPoints(int i)
+{
+       return _manContourControlCalc[i]->GetNumberOfPointsSplineManualContour();
+}
+
+//--------------------------------------------------------
+int manualContourContainer::getNumberOfHypoContourPoints(int i)
+{
+       return _manContourControlHypo[i]->GetNumberOfPointsSplineManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getXVectorWallPoints()
+{
+       return _manContourControlWall->GetVectorPointsXManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getXVectorLumenPoints()
+{
+       return _manContourControlLumen->GetVectorPointsXManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getXVectorCalcPoints(int i)
+{
+       return _manContourControlCalc[i]->GetVectorPointsXManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getXVectorHypoPoints(int i)
+{
+       return _manContourControlHypo[i]->GetVectorPointsXManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getYVectorWallPoints()
+{
+       return _manContourControlWall->GetVectorPointsYManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getYVectorLumenPoints()
+{
+       return _manContourControlLumen->GetVectorPointsYManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getYVectorCalcPoints(int i)
+{
+       return _manContourControlCalc[i]->GetVectorPointsYManualContour();
+}
+
+//--------------------------------------------------------
+double* manualContourContainer::getYVectorHypoPoints(int i)
+{
+       return _manContourControlHypo[i]->GetVectorPointsYManualContour();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::clear()
+{
+       clearWall();
+       clearLumen();
+       clearCalc();    
+       clearHypo();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::clearWall()
+{
+       if (_mViewContourWall != NULL)
+       {
+               _mViewContourWall->ClearContour();
+       }
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::clearLumen()
+{
+       if (_mViewContourLumen != NULL)
+       {
+               _mViewContourLumen->ClearContour();
+       }
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::clearCalc()
+{
+       int i;
+       for (i = 0; i < (int)_mViewContourCalc.size(); i++)
+       {
+               _mViewContourCalc[i] -> ClearContour();
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::clearHypo()
+{
+       int j;
+       for (j = 0; j < (int)_mViewContourHypo.size(); j++)
+       {
+               _mViewContourHypo[j] -> ClearContour();
+       }
+}
+
+
+//--------------------------------------------------------
+void manualContourContainer::refreshWall(wxVtk2DBaseView       *_imageviewer2D_1)
+{
+
+       if (_mContourModelWall == NULL)
+       {
+               return;
+       }
+
+       int size = _mContourModelWall->GetSizeLstPoints();
+       std::vector<manualPoint *> points; 
+
+       int i;
+       for (i = 0; i < size; i++)
+       {
+               points.push_back(_mContourModelWall->GetManualPoint(i));
+       }
+
+       _mContourModelWall->DeleteAllPoints();
+       _manContourControlWall->CreateNewManualContour();
+       _manContourControlWall->SetActive(false);
+       _mViewContourWall->RefreshContour();
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( 
+                                       _manContourControlWall );
+       for (i = 0; i < size; i++)
+       {
+               manualPoint* mp = points[i];
+               int     id              = _manContourControlWall->GetManualContourModel()->AddPoint(mp->GetX(),mp->GetY(),mp->GetZ());
+               _manContourControlWall->GetManualViewBaseContour()->AddPoint(); 
+               _manContourControlWall->GetManualViewBaseContour()->Refresh();
+       }
+       
+       
+}
+
+//--------------------------------------------------------
+void manualContourContainer::refreshLumen(wxVtk2DBaseView      *_imageviewer2D_1)
+{
+       if (_mContourModelLumen == NULL)
+       {
+               return;
+       }
+       int size = _mContourModelLumen->GetSizeLstPoints();
+       std::vector<manualPoint *> points; 
+
+       int i;
+       for (i = 0; i < size; i++)
+       {
+               points.push_back(_mContourModelLumen->GetManualPoint(i));
+       }
+
+       _mContourModelLumen->DeleteAllPoints();
+       _manContourControlLumen->CreateNewManualContour();
+       _manContourControlLumen->SetActive(false);
+       _mViewContourLumen->RefreshContour();
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( 
+                                       _manContourControlLumen );
+       for (i = 0; i < size; i++)
+       {
+               manualPoint* mp = points[i];
+               int     id              = _manContourControlLumen->GetManualContourModel()->AddPoint(mp->GetX(),mp->GetY(),mp->GetZ());
+               _manContourControlLumen->GetManualViewBaseContour()->AddPoint(); 
+               _manContourControlLumen->GetManualViewBaseContour()->Refresh();
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::refreshCalc(int j,wxVtk2DBaseView *_imageviewer2D_1)
+{
+
+       int size = _mContourModelCalc[j]->GetSizeLstPoints();
+       std::vector<manualPoint *> points; 
+
+       int i;
+       for (i = 0; i < size; i++)
+       {
+               points.push_back(_mContourModelCalc[j]->GetManualPoint(i));
+       }
+
+       _mContourModelCalc[j]->DeleteAllPoints();
+       _manContourControlCalc[j]->CreateNewManualContour();
+       _manContourControlCalc[j]->SetActive(false);
+       _mViewContourCalc[j]->RefreshContour();
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( 
+                                       _manContourControlCalc[j] );
+       for (i = 0; i < size; i++)
+       {
+               manualPoint* mp = points[i];
+               int     id              = _manContourControlCalc[j]->GetManualContourModel()->AddPoint(mp->GetX(),mp->GetY(),mp->GetZ());
+               _manContourControlCalc[j]->GetManualViewBaseContour()->AddPoint(); 
+               _manContourControlCalc[j]->GetManualViewBaseContour()->Refresh();
+       }
+       
+       
+
+}
+
+//--------------------------------------------------------
+void manualContourContainer::refreshHypo(int j,wxVtk2DBaseView *_imageviewer2D_1)
+{
+
+       int size = _mContourModelHypo[j]->GetSizeLstPoints();
+       std::vector<manualPoint *> points; 
+
+       int i;
+       for (i = 0; i < size; i++)
+       {
+               points.push_back(_mContourModelHypo[j]->GetManualPoint(i));
+       }
+
+       _mContourModelHypo[j]->DeleteAllPoints();
+       _manContourControlHypo[j]->CreateNewManualContour();
+       _manContourControlHypo[j]->SetActive(false);
+       _mViewContourHypo[j]->RefreshContour();
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( 
+                                       _manContourControlHypo[j] );
+       for (i = 0; i < size; i++)
+       {
+               manualPoint* mp = points[i];
+               int     id              = _manContourControlHypo[j]->GetManualContourModel()->AddPoint(mp->GetX(),mp->GetY(),mp->GetZ());
+               _manContourControlHypo[j]->GetManualViewBaseContour()->AddPoint(); 
+               _manContourControlHypo[j]->GetManualViewBaseContour()->Refresh();
+       }
+}
+
+//--------------------------------------------------------
+void manualContourContainer::restartWallContour(wxVtk2DBaseView        *_imageviewer2D_1)
+{
+       if (_manContourControlWall == NULL)
+       {
+               return;
+       }
+       delete _manContourControlWall;
+       delete _mContourModelWall;
+       delete _mViewContourWall;
+
+       _manContourControlWall  = new manualContourControler();
+       _mContourModelWall              = new manualContourModel();
+       _mViewContourWall                       = new manualViewContour();
+//EED 28Dic2006
+       _mViewContourWall->SetRange( (int)(0.6) );
+
+       _mViewContourWall->SetModel( _mContourModelWall );
+       _mViewContourWall->SetWxVtkBaseView( _imageviewer2D_1 );
+//     _mViewContourWall->SetRange( 2 );
+       _mViewContourWall->SetZ( 1000 );
+       _mViewContourWall->SetColorNormalContour(0.2, 0.6, 1);
+       _mViewContourWall->SetColorEditContour(1, 1, 0.33);
+
+       _manContourControlWall->SetModelView( _mContourModelWall , _mViewContourWall );
+       _manContourControlWall->CreateNewManualContour();
+       _manContourControlWall->SetActive(false);
+       _mViewContourWall->RefreshContour();
+}
+//--------------------------------------------------------
+void manualContourContainer::restartLumenContour(wxVtk2DBaseView       *_imageviewer2D_1)
+{
+
+       if (_manContourControlLumen == NULL)
+       {
+               return;
+       }
+       delete _manContourControlLumen;
+       delete _mContourModelLumen;
+       delete _mViewContourLumen;
+
+       _manContourControlLumen = new manualContourControler();
+       _mContourModelLumen             = new manualContourModel();
+       _mViewContourLumen                      = new manualViewContour();
+       _mViewContourLumen->SetModel( _mContourModelLumen );
+       _mViewContourLumen->SetWxVtkBaseView( _imageviewer2D_1 );
+//EED 28Dic2006
+       _mViewContourLumen->SetRange( (int)(0.6) );
+       _mViewContourLumen->SetZ( 1000 );
+       _mViewContourLumen->SetColorNormalContour(1, 0, 0);
+       _mViewContourLumen->SetColorEditContour(1, 1, 0.33);
+
+       _manContourControlLumen->SetModelView( _mContourModelLumen , _mViewContourLumen );      
+       _manContourControlLumen->CreateNewManualContour();
+       _manContourControlLumen->SetActive(false);
+       _mViewContourLumen->RefreshContour();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::restartCalcContours()
+{
+       int i;
+       for (i = 0; i < (int)_mContourModelCalc.size(); i++)
+       {
+
+               _manContourControlCalc[i] = NULL;
+               _mContourModelCalc[i] = NULL;
+               _mViewContourCalc[i] = NULL;
+
+               delete _manContourControlCalc[i];
+               delete _mContourModelCalc[i];
+               delete _mViewContourCalc[i];
+       }
+
+       _manContourControlCalc.clear(); 
+       _mContourModelCalc.clear();
+       _mViewContourCalc.clear();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::restartHypoContours()
+{
+       int i;
+       for (i = 0; i < (int)_mContourModelHypo.size(); i++)
+       {
+
+               _manContourControlHypo[i] = NULL;
+               _mContourModelHypo[i] = NULL;
+               _mViewContourHypo[i] = NULL;
+
+               delete _manContourControlHypo[i];
+               delete _mContourModelHypo[i];
+               delete _mViewContourHypo[i];
+       }
+
+       _manContourControlHypo.clear(); 
+       _mContourModelHypo.clear();
+       _mViewContourHypo.clear();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::createWallContour(wxVtk2DBaseView *_imageviewer2D_1)
+{
+       //Contorno 1
+       _manContourControlWall  = new manualContourControler();
+       _mContourModelWall      = new manualContourModel();
+       _mViewContourWall       = new manualViewContour();
+       _mViewContourWall->SetModel( _mContourModelWall );
+       _mViewContourWall->SetWxVtkBaseView( _imageviewer2D_1 );
+//EED 28Dic2006
+       _mViewContourWall->SetRange( (int)(0.6) );
+
+       _mViewContourWall->SetZ( 1000 );
+       _mViewContourWall->SetColorNormalContour(0.2, 0.6, 1);
+       _mViewContourWall->SetColorEditContour(1, 1, 0.33);
+
+       _manContourControlWall->SetModelView( _mContourModelWall , _mViewContourWall );
+       _manContourControlWall->CreateNewManualContour();
+       _manContourControlWall->SetActive(false);
+       _mViewContourWall->RefreshContour();
+}
+
+//--------------------------------------------------------
+void manualContourContainer::createLumenContour(wxVtk2DBaseView        *_imageviewer2D_1)
+{
+
+               //Contorno Lumen
+       _manContourControlLumen = new manualContourControler();
+       _mContourModelLumen             = new manualContourModel();
+       _mViewContourLumen                      = new manualViewContour();
+       _mViewContourLumen->SetModel( _mContourModelLumen );
+       _mViewContourLumen->SetWxVtkBaseView( _imageviewer2D_1 );
+//EED 28Dic2006
+       _mViewContourLumen->SetRange( (int)(0.6) );
+
+       _mViewContourLumen->SetZ( 1000 );
+       _mViewContourLumen->SetColorNormalContour(1, 0, 0);
+       _mViewContourLumen->SetColorEditContour(1, 1, 0.33);
+
+       _manContourControlLumen->SetModelView( _mContourModelLumen , _mViewContourLumen );      
+       _manContourControlLumen->CreateNewManualContour();
+       _manContourControlLumen->SetActive(false);
+       _mViewContourLumen->RefreshContour();
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/manualContourContainer.h b/lib/maracasVisuLib/src/interface/wxWindows/manualContourContainer.h
new file mode 100644 (file)
index 0000000..2d27549
--- /dev/null
@@ -0,0 +1,113 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: manualContourContainer.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef MANUAL_CONTOUR_CONTAINER_H
+#define MANUAL_CONTOUR_CONTAINER_H
+
+
+#include <vector>
+#include "manualContour.h"
+
+class manualContourContainer  
+{
+public:
+       
+       manualContourContainer();
+       virtual ~manualContourContainer();
+
+       manualContourControler* getWallController();
+       manualContourControler* getLumenController();
+       manualContourControler* getCalcController(int i);
+       manualContourControler* getHypoController(int i);
+       void createWallContour(wxVtk2DBaseView  *_imageviewer2D_1);
+       void createLumenContour(wxVtk2DBaseView *_imageviewer2D_1);
+
+       int     addCalcificationContour(wxVtk2DBaseView *_imageviewer2D_1);
+       int     addHypodenseContour(wxVtk2DBaseView     *_imageviewer2D_1);
+
+       void setWallVisibility(bool visible);
+       
+       void setLumenVisibility(bool visible);
+       void setCalcVisibility(bool visible);
+       void setHypoVisibility(bool visible);
+       void setWallActive();
+       void setLumenActive();
+       void setCalcActive();
+       void setHypoActive();
+       void setCalcContourActive(int i);
+       void setHypoContourActive(int i);
+       int  getNumberOfCalcContours();
+       int  getNumberOfHypoContours();
+       void inactivate();
+
+       int getNumberOfWallContourPoints();
+       int getNumberOfLumenContourPoints();
+       int getNumberOfCalcContourPoints(int i);
+       int getNumberOfHypoContourPoints(int i);
+
+       double* getXVectorWallPoints();
+       double* getXVectorLumenPoints();
+       double* getXVectorCalcPoints(int i);
+       double* getXVectorHypoPoints(int i);
+
+       double* getYVectorWallPoints();
+       double* getYVectorLumenPoints();
+       double* getYVectorCalcPoints(int i);
+       double* getYVectorHypoPoints(int i);
+       void clear();
+       void clearWall();
+       void clearLumen();
+       void clearCalc();
+       void clearHypo();
+       void refreshWall(wxVtk2DBaseView        *_imageviewer2D_1);
+       void refreshLumen(wxVtk2DBaseView       *_imageviewer2D_1);
+       void refreshCalc(int i, wxVtk2DBaseView *_imageviewer2D_1);
+       void refreshHypo(int i, wxVtk2DBaseView *_imageviewer2D_1);
+       
+       void restartWallContour(wxVtk2DBaseView *_imageviewer2D_1);
+       void restartLumenContour(wxVtk2DBaseView        *_imageviewer2D_1);
+       void restartCalcContours();
+       void restartHypoContours();
+
+private:
+       //Manual Contour Wall
+       
+       manualContourControler *_manContourControlWall;
+       manualContourModel              *_mContourModelWall;
+       manualViewContour               *_mViewContourWall;
+
+
+       //Manual Contour Lumen
+       manualContourControler  *_manContourControlLumen;
+       manualContourModel              *_mContourModelLumen;
+       manualViewContour                       *_mViewContourLumen;
+
+       //Manual Contour Calc
+       std::vector <manualContourControler *> _manContourControlCalc;
+       std::vector <manualContourModel *> _mContourModelCalc;
+       std::vector <manualViewContour *> _mViewContourCalc;
+
+       //Manual Contour Hypo
+       std::vector <manualContourControler *> _manContourControlHypo;
+       std::vector <manualContourModel *> _mContourModelHypo;
+       std::vector <manualViewContour *> _mViewContourHypo;    
+
+
+
+};
+
+#endif //
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/marDict.txt b/lib/maracasVisuLib/src/interface/wxWindows/marDict.txt
new file mode 100644 (file)
index 0000000..b9ef782
--- /dev/null
@@ -0,0 +1,277 @@
+MARACAS_LANGUAGE 00
+
+00 0005 MARACAS: MAgnetic Resonance Angiography Computer ASisted analysis
+00 0010 Iso Surface values
+00 0015 Iso visible 
+00 0020 Opacity (%)
+00 0025 Isovalue
+00 0030 0
+00 0035 Select
+00 0040 artery
+00 0045 1
+00 0050 Axis Extraction
+00 0055 2
+00 0060 Quantification
+00 0065 Set an initial point.
+00 0070 (Double click over the interest artery.)
+00 0073 OK
+00 0075 Start 3D
+00 0080 Plan 
+00 0085 Parameters 
+00 0090 Slice 
+00 0205 Healthy slice
+00 0210 Perpendicular section
+00 0215 Visible ring
+00 0220 Show surface
+00 0225 Opacity 
+00 0230 greyscale        
+00 0235 color
+00 0240 Isovalue 
+00 0245 Add mark contour
+00 0250 Erase marks contours
+00 0253 Erase all marks contours
+00 0255 Stenosis (area)
+00 0260 Stenosis (diameter)
+00 0265 Stenosis search
+00 0270 Automatic stenosis search
+00 0273 0 
+00 0275 Select 
+00 0280  slice
+00 0283 1 
+00 0285     Validate 
+00 0290 Healthy Slice
+00 0293 2 
+00 0295    Validate
+00 0300 End Region
+00 0303 3 
+00 0305    Find
+00 0310 Stenosis
+00 0315 Automatic 
+00 0320 Manual
+00 0325 Manual stenosis search
+00 0328 0
+00 0330 Select
+00 0335  slice
+00 0338 1
+00 0340     Validate
+00 0345 Healthy Slice
+00 0348 2
+00 0350     Select
+00 0355 other slice
+00 0360 Healthy region size
+00 0365 Healthy region size
+00 0370 Size of the healthy region  ( 2xn+1 )
+00 0373 n : 
+00 0375 Refresh healthy region
+00 0380 Total Axis Lenght
+00 0385 Seg. Length
+00 0390 Area
+00 0395 Ref. Area
+00 0400 Perimeter
+00 0405 Minimum Diameter
+00 0410 Maximum Diameter
+00 0415 Average Diameter
+00 0420 Ref Average Diam.
+00 0500 Maracas parameters...
+00 0505 Contour parameters
+00 0510 Contour calculation algorithm
+00 0515 % Thereshold
+00 0520 Debug
+00 0525 Visible Diameter?
+00 0530 Axis Parameters 
+00 0535 Extraction parameters
+00 0540 Flexion coefficient:
+00 0545 Tension coefficient:
+00 0550 Mask size (2*n+1), n:
+00 0555 Discret step for axis (1/N):
+00 0560 OK
+00 0565 Cancel
+00 0570 Default
+00 0575 Reset
+00 0580 Apply
+00 0605 The mask size was modified.
+00 0610 The threshold was modified.
+00 0615 The flexion coeficient was modified.
+00 0620 The tension coeficient was modified.
+00 0625 The discret step of the axis was modified.  
+00 0630  The axe will be regenereted and the contours will be eresed.
+00 0635  All contours will be erase. 
+00 0640  Do you want to continue?  
+00 0645 Alert  
+00 0650  %  Threshold  :  
+00 0655 Visible diameters?
+00 0660 Flexion coefficient:
+00 0665 Tension coefficient:
+00 0670 Mask size (2*n+1). n: 
+00 0675 Discret step for axis (1/N):
+00 0680 OK 
+00 0685 Cancel
+00 0690 Reset
+00 0695 Apply
+00 0700 Default
+00 0710 MARACAS Parameters...
+00 0720 Extraction parameters
+00 0725 Debug
+00 0730 Contour calculation algorithm
+00 0735 Contour Parameters
+00 0740 Axis Parameters
+00 0745 Invert slice order
+00 0800 Contour modification
+00 0803 Contour modification
+00 0805 1
+00 0810 2
+00 0815 3
+00 0820 New
+00 0825 Contour
+00 0830 Replace
+00 0835 End
+00 0840 Insert point
+00 0845 Delete point
+00 0850 Move point
+00 0855 Use mouse left button to
+00 0860 create the new contour.
+00 0865 Alert
+00 0870 This option erase all 3D contours.
+00 0875 Do you want to continue?
+00 0905 Set an initial point.
+00 0910 (Double click over the interest artery.)
+00 0915 The initial point should be far
+00 0920 of the limits of the volume.
+
+01 0005 f_MARACAS: MAgnetic Resonance Angiography Computer ASisted analysis
+01 0010 f_Iso Surfave values
+01 0015 f_Iso visible 
+01 0020 f_Opacity (%)
+01 0025 f_Isovalue
+01 0030 f_0
+01 0035 f_Select
+01 0040 f_artery
+01 0045 f_1
+01 0050 f_Axis Extraction
+01 0055 f_2
+01 0060 f_Quantification
+01 0065 f_Set an initial point.
+01 0070 f_(Double click over the interest artery.)
+01 0073 f_OK
+01 0075 f_Start 3D
+01 0080 f_Plan 
+01 0085 f_Parameters 
+01 0090 f_Slice 
+01 0205 f_Healthy slice
+01 0210 f_Perpendicular section
+01 0215 f_Visible ring
+01 0220 f_Show surface
+01 0225 f_Opacity 
+01 0230 f_greyscale   
+01 0235 f_color
+01 0240 f_Isovalue 
+01 0245 f_Add mark contour
+01 0250 f_Erase marks contours
+01 0253 f_Erase all marks contours
+01 0255 f_Stenosis (area)
+01 0260 f_Stenosis (diameter)
+01 0265 f_Stenosis search
+01 0270 f_Automatic stenosis search
+01 0273 f_0 
+01 0275 f_Select 
+01 0280 f_slice
+01 0283 f_1 
+01 0285     f_Validate 
+01 0290 f_Healthy Slice
+01 0293 f_2 
+01 0295    f_Validate
+01 0300 f_End Region
+01 0303 f_3 
+01 0305    f_Find
+01 0310 f_Stenosis
+01 0315 f_Automatic 
+01 0320 f_Manual
+01 0325 f_Manual stenosis search
+01 0328 f_0
+01 0330 f_Select
+01 0335  f_slice
+01 0338 f_1
+01 0340     f_Validate
+01 0345 f_Healthy Slice
+01 0348 f_2
+01 0350     f_Select
+01 0355 f_other slice
+01 0360 f_Healthy region size
+01 0365 f_Healthy region size
+01 0370 f_Size of the healthy region  ( 2xn+1 )
+01 0373 f_n : 
+01 0375 f_Refresh healthy region
+01 0380 f_Total Axis Lenght
+01 0385 f_Seg. Length
+01 0390 f_Area
+01 0395 f_Ref. Area
+01 0400 f_Perimeter
+01 0405 f_Minimum Diameter
+01 0410 f_Maximum Diameter
+01 0415 f_Average Diameter
+01 0420 f_Ref Average Diam.
+01 0500 f_Maracas parameters...
+01 0505 f_Contour parameters
+01 0510 f_Contour calculation algorithm
+01 0515 f_% Thereshold
+01 0520 f_Debug
+01 0525 f_Visible Diameter?
+01 0530 f_Axis Parameters 
+01 0535 f_Extraction parameters
+01 0540 f_Flexion coefficient:
+01 0545 f_Tension coefficient:
+01 0550 f_Mask size (2*n+1), n:
+01 0555 f_Discret step for axis (1/N):
+01 0560 f_OK
+01 0565 f_Cancel
+01 0570 f_Default
+01 0575 f_Reset
+01 0580 f_Apply
+01 0605 f_The mask size was modified.
+01 0610 f_The threshold was modified.
+01 0615 f_The flexion coeficient was modified.
+01 0620 f_The tension coeficient was modified.
+01 0625 f_The discret step of the axis was modified.  
+01 0630 f_ The axe will be regenereted and the contours will be eresed.
+01 0635 f_ All contours will be erase. 
+01 0640 f_ Do you want to continue?  
+01 0645 f_Alert
+01 0650 f_ %  Threshold  :  
+01 0655 f_Visible diameters?
+01 0660 f_Flexion coefficient:
+01 0665 f_Tension coefficient:
+01 0670 f_Mask size (2*n+1). n: 
+01 0675 f_Discret step for axis (1/N):
+01 0680 f_OK 
+01 0685 f_Cancel
+01 0690 f_Reset
+01 0695 f_Apply
+01 0700 f_Default
+01 0710 f_MARACAS Parameters...
+01 0720 f_Extraction parameters
+01 0725 f_Debug
+01 0730 f_Contour calculation algorithm
+01 0735 f_Contour Parameters
+01 0740 f_Axis Parameters
+01 0745 f_Invert slice order
+01 0800 f_Contour modification
+01 0803 f_Contour modification
+01 0805 f_1
+01 0810 f_2
+01 0815 f_3
+01 0820 f_New
+01 0825 f_Contour
+01 0830 f_Replace
+01 0835 f_End
+01 0840 f_Insert point
+01 0845 f_Delete point
+01 0850 f_Move point
+01 0855 f_Use mouse left button
+01 0860 f_to create the new contour.
+01 0865 f_Alert
+01 0870 f_This option erase all 3D contours.
+01 0875 f_Do you want to continue?
+01 0905 f_Set an initial point.
+01 0910 f_(Double click over the interest artery.)
+01 0915 f_The initial point should be far
+01 0920 f_of the limits of the volume.
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/marDictionary.cxx b/lib/maracasVisuLib/src/interface/wxWindows/marDictionary.cxx
new file mode 100644 (file)
index 0000000..100d2b4
--- /dev/null
@@ -0,0 +1,455 @@
+
+
+#include <stdio.h>
+#include <stdlib.h> 
+#include <string.h> 
+
+#include "marDictionary.h"
+
+
+marDictFrase::marDictFrase(int idfrase,char*frase){
+  _idfrase      = idfrase;
+  _frase=(char*)malloc(strlen(frase));
+  memcpy( _frase , frase , strlen(frase));
+  _frase[strlen(frase)-1]='\0';
+}
+//-----------------------------------------------------
+
+marDictFrase::~marDictFrase(){
+       free(_frase);
+}
+//-----------------------------------------------------
+
+int marDictFrase::GetIdFrase(){
+       return _idfrase;
+}
+//-----------------------------------------------------
+
+char* marDictFrase::GetFrase(){
+       return _frase;
+}
+//-----------------------------------------------------
+//-----------------------------------------------------
+//-----------------------------------------------------
+//-----------------------------------------------------
+
+int marDictionary::_language                                           =       0;
+std::vector<marDictFrase*>* marDictionary::_frases     =       0;
+
+//-----------------------------------------------------
+
+marDictionary::marDictionary(){
+       strcpy( _emptyStr      , "(...)"         );             
+}
+//-----------------------------------------------------
+marDictionary::~marDictionary(){
+} 
+//-----------------------------------------------------
+bool marDictionary::ExistFileDictionary(char *dictionaryFileName){
+
+       bool result=true;
+       FILE *ff=fopen(dictionaryFileName,"r");
+       if (ff==NULL){
+               result=false;
+       }
+       return result;
+}
+//-----------------------------------------------------
+void marDictionary::ResetDictionary(){
+       if (_frases!=NULL){
+               FreeDictionary();
+               delete _frases;
+       }
+       _frases=new std::vector<marDictFrase*>();
+}
+//-----------------------------------------------------
+bool marDictionary::LoadDictionaryFile(char *dictionaryFileName){
+       ResetDictionary();
+
+       bool result=false;
+
+       if ((_frases->size()==0) && (ExistFileDictionary(dictionaryFileName)==true) ){
+               long idText;
+               long idLanguage;
+               char idTextStr[50];
+               char idLanguageStr[50];
+               char text[256];
+               char line[256];
+               char name[50];
+               FILE *fileIn;
+               fileIn=fopen(dictionaryFileName,"r");
+
+               fgets(line, 256, fileIn);
+               sscanf(line,"%s %d" , name,&idLanguage);                
+
+               if (strcmp(name,"MARACAS_LANGUAGE")==0){
+                       SetLanguage(idLanguage);
+                       while (!feof(fileIn)) {
+                               fgets(line, 256, fileIn);
+                               if (strlen(line)>5){
+                                       sscanf(line,"%s %s " , idLanguageStr,idTextStr);                
+                                       sscanf(idLanguageStr,"%d " , &idLanguage);      
+                                       if (GetLanguage()==idLanguage){
+                                               sscanf(idTextStr,"%d " , &idText);              
+                                               char    *start  = line + strlen(idLanguageStr)+1 + strlen(idTextStr)+1;
+                                               int             size    = strlen(line) -  (strlen(idLanguageStr)+1 + strlen(idTextStr)+1);
+                                               memcpy(text,start,size-1);
+                                               text[size]='\0';
+                                               SetString(idText,text);
+                                       }
+                               }
+                       }
+                       result=true;
+               } else {
+               }
+               fclose(fileIn);
+       }  // if _frases->size()==0
+       return result;
+} 
+
+//-----------------------------------------------------
+void marDictionary::LoadDictionary_English(){
+       ResetDictionary();
+       SetLanguage(1);
+
+       SetString(   5 , "MARACAS: MAgnetic Resonance Angiography Computer ASisted analysis ");
+       SetString(  10 , "Iso Surface values ");
+       SetString(  15 , "Iso visible ");
+       SetString(  20 , "Opacity (%) ");
+       SetString(  25 , "Isovalue ");
+       SetString(  30 , "0 ");
+       SetString(  35 , "Select ");
+       SetString(  40 , "artery ");
+       SetString(  45 , "1 ");
+       SetString(  50 , "Axis Extraction ");
+       SetString(  55 , "2 ");
+       SetString(  60 , "Quantification ");
+       SetString(  65 , "Set an initial point. ");
+       SetString(  70 , "(Double click over the interest artery.) ");
+       SetString(  73 , "OK ");
+       SetString(  75 , "Start 3D ");
+       SetString(  80 , "Plan ");
+       SetString(  85 , "Parameters ");
+       SetString(  90 , "Slice ");
+       SetString( 205 , "Healthy slice ");
+       SetString( 210 , "Perpendicular section ");
+       SetString( 215 , "Visible ring ");
+       SetString( 220 , "Show surface ");
+       SetString( 225 , "Opacity ");
+       SetString( 230 , "grayscale         ");
+       SetString( 235 , "color ");
+       SetString( 240 , "Isovalue  ");
+       SetString( 245 , "Add mark contour ");
+       SetString( 248 , "Save Contours ");
+       SetString( 250 , "Erase marks contours ");
+       SetString( 253 , "Erase all marks contours ");
+       SetString( 255 , "Stenosis (area) ");
+       SetString( 260 , "Stenosis (diameter) ");
+       SetString( 265 , "Stenosis search ");
+       SetString( 270 , "Automatic stenosis search ");
+       SetString( 273 , "0 ");
+       SetString( 275 , "Select ");
+       SetString( 280 , " slice ");
+       SetString( 283 , "1 ");
+       SetString( 285 , "    Validate ");
+       SetString( 290 , "Healthy Slice ");
+       SetString( 293 , "2 ");
+       SetString( 295 , "   Validate ");
+       SetString( 300 , "End Region ");
+       SetString( 303 , "3 ");
+       SetString( 305 , "   Find ");
+       SetString( 310 , "stenosis ");
+       SetString( 315 , "Automatic ");
+       SetString( 320 , "Manual ");
+       SetString( 325 , "Manual stenosis search ");
+       SetString( 328 , "0 ");
+       SetString( 330 , "Select ");
+       SetString( 335 , " slice ");
+       SetString( 338 , "1 ");
+       SetString( 340 , "    Select ");
+       SetString( 345 , "other slice ");
+       SetString( 348 , "2 ");
+       SetString( 350 , "    Validate ");
+       SetString( 355 , "Healthy Slice ");
+       SetString( 360 , "Healthy region size ");
+       SetString( 365 , "Healthy region size ");
+       SetString( 370 , "Size of the healthy region  ( 2xn+1 ) ");
+       SetString( 373 , "n :  ");
+       SetString( 375 , "Refresh healthy region ");
+       SetString( 380 , "Total Axis Lenght ");
+       SetString( 385 , "Seg. Length ");
+       SetString( 390 , "Area ");
+       SetString( 395 , "Ref. Area ");
+       SetString( 400 , "Perimeter ");
+       SetString( 405 , "Minimum Diameter ");
+       SetString( 410 , "Maximum Diameter ");
+       SetString( 415 , "Average Diameter ");
+       SetString( 420 , "Ref Average Diam. ");
+       SetString( 500 , "Maracas parameters... ");
+       SetString( 505 , "Contour parameters ");
+       SetString( 510 , "Contour calculation algorithm ");
+       SetString( 515 , "% Thereshold ");
+       SetString( 520 , "Debug ");
+       SetString( 525 , "Visible Diameter? ");
+       SetString( 530 , "Axis Parameters  ");
+       SetString( 535 , "Extraction parameters ");
+       SetString( 540 , "Flexion coefficient: ");
+       SetString( 545 , "Tension coefficient: ");
+       SetString( 550 , "Mask size (2*n+1), n: ");
+       SetString( 555 , "Discret step for axis (1/N): ");
+       SetString( 560 , "OK ");
+       SetString( 565 , "Cancel ");
+       SetString( 570 , "Default ");
+       SetString( 575 , "Reset ");
+       SetString( 580 , "Apply ");
+       SetString( 605 , "The mask size was modified. ");
+       SetString( 610 , "The threshold was modified. ");
+       SetString( 615 , "The flexion coeficient was modified. ");
+       SetString( 620 , "The tension coeficient was modified. ");
+       SetString( 625 , "The discret step of the axis was modified.   ");
+       SetString( 630 , " The axe will be regenereted and the contours will be eresed. ");
+       SetString( 635 , " All contours will be erase.  ");
+       SetString( 640 , " Do you want to continue?   ");
+       SetString( 645 , "Alert   ");
+       SetString( 650 , " %  Threshold  :   ");
+       SetString( 655 , "Visible diameters? ");
+       SetString( 660 , "Flexion coefficient: ");
+       SetString( 665 , "Tension coefficient: ");
+       SetString( 670 , "Mask size (2*n+1). n:  ");
+       SetString( 675 , "Discret step for axis (1/N): ");
+       SetString( 680 , "OK  ");
+       SetString( 685 , "Cancel ");
+       SetString( 690 , "Reset ");
+       SetString( 695 , "Apply ");
+       SetString( 700 , "Default ");
+       SetString( 710 , "MARACAS Parameters... ");
+       SetString( 720 , "Extraction parameters ");
+       SetString( 725 , "Debug ");
+       SetString( 730 , "Contour calculation algorithm ");
+       SetString( 735 , "Contour Parameters ");
+       SetString( 740 , "Axis Parameters ");
+       SetString( 745 , "Invert slice order ");
+       SetString( 800 , "Contour modification ");
+       SetString( 803 , "Contour modification ");
+       SetString( 805 , "1 ");
+       SetString( 810 , "2 ");
+       SetString( 815 , "3 ");
+       SetString( 820 , "New ");
+       SetString( 825 , "Contour ");
+       SetString( 830 , "Replace ");
+       SetString( 835 , "End ");
+       SetString( 840 , "Insert point ");
+       SetString( 845 , "Delete point ");
+       SetString( 850 , "Move point ");
+       SetString( 855 , "Use mouse left button to ");
+       SetString( 860 , "create the new contour. ");
+       SetString( 865 , "Alert ");
+       SetString( 870 , "This option erase all 3D contours. ");
+       SetString( 875 , "Do you want to continue? ");
+       SetString( 905 , "Set an initial point. ");
+       SetString( 910 , "(Double click over the interest artery.) ");
+       SetString( 915 , "The initial point should be far ");
+       SetString( 920 , "of the limits of the volume. ");
+       SetString( 925 , "Threshold ");
+       SetString( 930 , "Lumen Intensity % ");
+       SetString( 935 , "Calcification Intensity % ");
+       SetString( 940 , "Contour control ");
+}
+//-----------------------------------------------------
+void marDictionary::LoadDictionary_French(){
+       ResetDictionary();
+       SetLanguage(2);
+
+       SetString(   5 , "MARACAS: MAgnetic Resonance Angiography Computer ASisted analysis ");
+       SetString(  10 , "Valeurs de l'Iso surface ");
+       SetString(  15 , "Iso visible");
+       SetString(  20 , "Opacit  (%) ");
+       SetString(  25 , "Isovalue ");
+       SetString(  30 , "0 ");
+       SetString(  35 , "Choisir  ");
+       SetString(  40 , "l'artre  ");
+       SetString(  45 , "1 ");
+       SetString(  50 , "Extraction de l'axe  ");
+       SetString(  55 , "2 ");
+       SetString(  60 , "Quantification ");
+       SetString(  65 , "Placez un premier point. ");
+       SetString(  70 , "(Double clique au-dessus de l'artre d'intrt.) ");
+       SetString(  73 , "OK ");
+       SetString(  75 , "Commencer 3D  ");
+       SetString(  80 , "Plan ");
+       SetString(  85 , "Paramtres ");
+       SetString(  90 , "Coupe  ");
+       SetString( 205 , "Coupe saine ");
+       SetString( 210 , "Section perpendiculaire ");
+       SetString( 215 , "Visibilit des anneaux ");
+       SetString( 220 , "Montrer la surface ");
+       SetString( 225 , "Opacit  ");
+       SetString( 230 , "Niveaux des gris         ");
+       SetString( 235 , "Couleur ");
+       SetString( 240 , "Isovaleur  ");
+       SetString( 245 , "Ajouter un marqueur de coupe ");
+       SetString( 248 , "Enregistre les contours ");
+       SetString( 250 , "Effacer un marqueur de coupe  ");
+       SetString( 253 , "Effacer les marquer des coupes ");
+       SetString( 255 , "Stnoses  (surface) ");
+       SetString( 260 , "Stnoses (diamtre ) ");
+       SetString( 265 , "Recherche des stnoses  ");
+       SetString( 270 , "Recherche automatique de la stnose ");
+       SetString( 273 , "0 ");
+       SetString( 275 , "Choisissez ");
+       SetString( 280 , " la coupe ");
+       SetString( 283 , "1 ");
+       SetString( 285 , "Valider la  ");
+       SetString( 290 , "coupe saine ");
+       SetString( 293 , "2 ");
+       SetString( 295 , "Valider la fin ");
+       SetString( 300 , "de la rgion ");
+       SetString( 303 , "3 ");
+       SetString( 305 , "   Chercher ");
+       SetString( 310 , "   stnoses ");
+       SetString( 315 , "Automatique ");
+       SetString( 320 , "Manuel ");
+       SetString( 325 , "Recherche manuel de la stnose ");
+       SetString( 328 , "0 ");
+       SetString( 330 , "Choisir ");
+       SetString( 335 , " la coupe ");
+       SetString( 338 , "1 ");
+       SetString( 340 , " Choisissez ");
+       SetString( 345 , "autre coupe ");
+       SetString( 348 , "2 ");
+       SetString( 350 , "Valider la ");
+       SetString( 355 , "coupe saine ");
+       SetString( 360 , "Taille de rgion saine  ");
+       SetString( 365 , "Taille de rgion saine  ");
+       SetString( 370 , "( 2xn+1 ) ");
+       SetString( 373 , "n :  ");
+       SetString( 375 , "Rgnrer la rgion saine ");
+       SetString( 380 , "Longeur total de l'axe  ");
+       SetString( 385 , "Longueur du segment ");
+       SetString( 390 , "Surface ");
+       SetString( 395 , "Surface de ref. ");
+       SetString( 400 , "Primtre ");
+       SetString( 405 , "Diamtre minimum ");
+       SetString( 410 , "Diamtre maximum ");
+       SetString( 415 , "Diamtre moyen ");
+       SetString( 420 , "Diamtre moyen de ref. ");
+       SetString( 500 , "Paramtres de MARACAS... ");
+       SetString( 505 , "Paramtres du contour ");
+       SetString( 510 , "Algorithme pour le calcule de contour ");
+       SetString( 515 , "% Seuillage ");
+       SetString( 520 , "Debug ");
+       SetString( 525 , "Montrer diamtre? ");
+       SetString( 530 , "Paramtres de l'axe  ");
+       SetString( 535 , "Paramtres d'extraction ");
+       SetString( 540 , "Coefficient de flexion: ");
+       SetString( 545 , "Coefficient de tension : ");
+       SetString( 550 , "Taille du masque (2*n+1), n: ");
+       SetString( 555 , "Pas de discrtisation pour l'axe (1/N): ");
+       SetString( 560 , "OK ");
+       SetString( 565 , "Annule ");
+       SetString( 570 , "Dfaut ");
+       SetString( 575 , "Remise ");
+       SetString( 580 , "Appliquer ");
+       SetString( 605 , "La taille de masque a t modifie. ");
+       SetString( 610 , "Le seuil a t modifi . ");
+       SetString( 615 , "Le coefficient de flexion a t modifi. ");
+       SetString( 620 , "Le coefficient de tension a t modifi . ");
+       SetString( 625 , "Le pas de discrtisations a t modifi.   ");
+       SetString( 630 , " L'axe sera rgnr et les coupes seront effaces. ");
+       SetString( 635 , " Tous les contours seront effacs. ");
+       SetString( 640 , " Voulez-vous continuer ?   ");
+       SetString( 645 , "Atention   ");
+       SetString( 650 , " %  Seuillage  :   ");
+       SetString( 655 , "Diamtres visible? ");
+       SetString( 660 , "Coefficient de flexion: ");
+       SetString( 665 , "Coefficient de tension: ");
+       SetString( 670 , "Taille du masque (2*n+1). n:  ");
+       SetString( 675 , "Pas de discrtisations pour l'axe (1/N): ");
+       SetString( 680 , "OK  ");
+       SetString( 685 , "Annule ");
+       SetString( 690 , "Rinitialisation ");
+       SetString( 695 , "Appliquez ");
+       SetString( 700 , "Dfaut ");
+       SetString( 710 , "Paramtres de MARACAS... ");
+       SetString( 720 , "Extraction de paramtres ");
+       SetString( 725 , "Debug ");
+       SetString( 730 , "Algorithme pour le calcul de contour  ");
+       SetString( 735 , "Paramtres du contour ");
+       SetString( 740 , "Paramtres de l'axe ");
+       SetString( 745 , "Invertir l'ordre des coupes ");
+       SetString( 800 , "Contour modification ");
+       SetString( 803 , "Modification du contour ");
+       SetString( 805 , "1 ");
+       SetString( 810 , "2 ");
+       SetString( 815 , "3 ");
+       SetString( 820 , "Nouveau  ");
+       SetString( 825 , "contour ");
+       SetString( 830 , "Remplacer ");
+       SetString( 835 , "Fin ");
+       SetString( 840 , "Insertion de point ");
+       SetString( 845 , "Effacement de point  ");
+       SetString( 850 , "Dplacement de point  ");
+       SetString( 855 , "Bouton gauche de la sourie  ");
+       SetString( 860 , "pour crer le contour. ");
+       SetString( 865 , "Atention ");
+       SetString( 870 , "Cette option efface tous les contours 3D. ");
+       SetString( 875 , "Voulez-vous continuer ? ");
+       SetString( 905 , "Dfinissez  un  point initial. ");
+       SetString( 910 , "(Double clique sur le vaisseau d'intrt.) ");
+       SetString( 915 , "Le point initial doit tre ");
+       SetString( 920 , "loin des bords du volume. ");
+       SetString( 925 , "Seuil ");
+       SetString( 930 , "Intensit du Lumen % ");
+       SetString( 935 , "Intensit des calcifications % ");
+       SetString( 940 , "Control du contour ");
+
+}
+//-----------------------------------------------------
+void marDictionary::LoadDictionary_Japanese (){
+       ResetDictionary();
+       SetLanguage(3);
+}
+//-----------------------------------------------------
+void marDictionary::FreeDictionary(){
+       int i,size=_frases->size();
+       for (i=0;i < size;i++){
+               marDictFrase* tmp=(*_frases)[i];
+               delete tmp;
+       }
+       _frases->clear();
+} 
+
+//-----------------------------------------------------
+void marDictionary::SetLanguage(int language){
+       _language=language;
+}
+//-----------------------------------------------------
+char* marDictionary::GetString(int idfrase){
+       int i,size;     
+       char *result=NULL;
+       size=_frases->size();
+       for (i=0;i<size;i++){
+               marDictFrase* tmp=(*_frases)[i];
+               if (tmp->GetIdFrase()==idfrase){
+                       result=tmp->GetFrase();
+               }
+       }
+       if (result==NULL){
+           sprintf(_emptyStr,"(...%d-%d...)",_language,idfrase);
+               result=_emptyStr;
+       }
+       return result;
+}
+//-----------------------------------------------------
+int    marDictionary::GetLanguage(){
+       return _language;
+}
+//-----------------------------------------------------
+void marDictionary::SetString(int id,char *ss){
+       if (_frases!=NULL){
+               marDictFrase *mf = new marDictFrase(id,ss);
+               _frases->push_back(mf);
+       }
+}
+
+//-----------------------------------------------------
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/marDictionary.h b/lib/maracasVisuLib/src/interface/wxWindows/marDictionary.h
new file mode 100644 (file)
index 0000000..341c6fe
--- /dev/null
@@ -0,0 +1,50 @@
+
+#ifndef MARDICTIONARY_H
+#define MARDICTIONARY_H
+
+
+#include <vector>
+
+
+class marDictFrase{
+public:
+       marDictFrase(int id,char*frase);
+       ~marDictFrase();
+       int             GetIdFrase();
+       char*   GetFrase();
+private:
+       int             _idfrase;
+       char    *_frase;
+};
+
+
+
+
+// Define a new application type, each program should derive a class from wxApp
+class marDictionary {
+public:
+                       marDictionary();
+                       ~marDictionary();
+       void    ResetDictionary();
+       void    SetLanguage(int language);
+       char*   GetString(int id);
+       int             GetLanguage();
+       bool    LoadDictionaryFile(char *dictionaryFileName);
+       void    LoadDictionary_English();
+       void    LoadDictionary_French();
+       void    LoadDictionary_Japanese();
+
+       void    FreeDictionary();
+
+
+private:
+                       char                                             _emptyStr[30];
+       static  int                                                      _language;     
+       static  std::vector<marDictFrase*>  *_frases;
+
+                       bool ExistFileDictionary(char *dictionaryFileName);
+                       void SetString(int id,char *ss);
+};
+
+
+#endif // MARDICTIONARY_H
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.bmp
new file mode 100644 (file)
index 0000000..bf81105
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/3D.xpm
new file mode 100644 (file)
index 0000000..86cb1f0
--- /dev/null
@@ -0,0 +1,87 @@
+/* XPM */
+static char * toolbar_triD_xpm[] = {
+"36 50 34 1",
+"      c None",
+".     c #330033",
+"+     c #993399",
+"@     c #660066",
+"#     c #663366",
+"$     c #990099",
+"%     c #000000",
+"&     c #333333",
+"*     c #003300",
+"=     c #666666",
+"-     c #666633",
+";     c #CC33CC",
+">     c #333300",
+",     c #996666",
+"'     c #999966",
+")     c #996699",
+"!     c #336633",
+"~     c #999999",
+"{     c #CC66CC",
+"]     c #CC6699",
+"^     c #CC9999",
+"/     c #CC99CC",
+"(     c #660033",
+"_     c #663399",
+":     c #993366",
+"<     c #663333",
+"[     c #003333",
+"}     c #669966",
+"|     c #330000",
+"1     c #000033",
+"2     c #CCCC99",
+"3     c #330066",
+"4     c #333366",
+"5     c #CC3399",
+"              .+@#..                ",
+"           .#$#%%..#@+@+@..         ",
+"         @+@.%%%%%%%%%%%%&@#$#$#.   ",
+"      .#$&%%%%%%.*.%%%%%%%%%%%.++   ",
+"    @+@.%%%%%%%&===-&%%%%%%%%+@.@   ",
+"   ;+@&%%%%%%%>&=,')!%%%%%%#$.%%+   ",
+"    %..+@+@&.%=='~~'#%%%%@+.%%%%#   ",
+"   #%%%%%%..#$+{]^~~&%%.+@%%%%%%+   ",
+"   @%%%%%%%%%%!)^/{]+(_:%%%%%%%%@   ",
+"   +%%%%%%%%%%<~~^~,[.+%%%%%%%%%+   ",
+"   @%%%%%%%%%%=~^~~-%%@%%%%*%%%%#   ",
+"   +%%%%%&&%%%=~'~'&%%+%%&%.%%%.@   ",
+"   #%%%%%>~&%&'~'~,&%%+&&%%%%%%%#   ",
+"   $%%%%%%<}|}^=~~'=<=#=>%%%%%%.@   ",
+"   #%%%%%%[,=~,~^~'&%%+=%1%%%&%&@   ",
+"   $%%%%%&%&=&>=~^~-%&@%&>%%'&%..   ",
+"   #%%%%%%%%%%%,~~'=&&+>=<&%#%%@&   ",
+"   @.%%%%%%%%%1}^~')'#)~~&=>%%%#.   ",
+"   #.%%%%%%%%%|,~~,&=#)=.%-&1%%@    ",
+"   ..%%%%%%%%.*~~''[%<)=<&&.%%%#    ",
+"   .#%%%%%%|%%-~~^=>=):&==-&%.%#    ",
+"   .@%%%%%%1%%=,~2=%&<_-%%%1%%.+    ",
+"    #%%%%%%%%%&~^~=%%##.%%%%%|+     ",
+"    +%%%%.%%%%-'~'=%%,3%%%%%.+1     ",
+"    @%%%%%%%%%4===<*%.#%%%%|+       ",
+"    +$4|%&%%%%>==-.&%..%%%1+1       ",
+"      .+@#&%%%%%%%%&%&@%%|+|        ",
+"         .$#(%%%%%%%&).%%+1         ",
+"            3+#.%%%%&:#%+.          ",
+"               @+@.%%&@+.           ",
+"                  #+@_51            ",
+"                    |@.             ",
+"                                    ",
+"            %%%%  %%%%%             ",
+"           %   %% %%  %%            ",
+"               %% %%  %%            ",
+"             %%%  %%  %%            ",
+"               %% %%  %%            ",
+"           %   %% %%  %%            ",
+"            %%%%  %%%%%             ",
+"                                    ",
+"                                    ",
+"                 %%%                ",
+"        %%       %%%                ",
+"   %%%  %%%     %% %%  %% %%  %%%   ",
+"  %% %% %%      %% %%  %% %% %% %%  ",
+"  %%%%% %%     %%%%%%%  %%%  %%%%%  ",
+"  %%    %%     %%   %% %% %% %%     ",
+"   %%%%  %%    %%   %% %% %%  %%%%  ",
+"                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.bmp
new file mode 100644 (file)
index 0000000..c393cb8
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF.xpm
new file mode 100644 (file)
index 0000000..ffffb07
--- /dev/null
@@ -0,0 +1,309 @@
+/* XPM */
+static char * TOOLBAR_AXIS_JF_xpm[] = {
+"44 50 256 2",
+"      c #000000",
+".     c #000033",
+"+     c #000066",
+"@     c #000099",
+"#     c #0000CC",
+"$     c #0000FF",
+"%     c #330000",
+"&     c #330033",
+"*     c #330066",
+"=     c #330099",
+"-     c #3300CC",
+";     c #3300FF",
+">     c #660000",
+",     c #660033",
+"'     c #660066",
+")     c #660099",
+"!     c #6600CC",
+"~     c #6600FF",
+"{     c #990000",
+"]     c #990033",
+"^     c #990066",
+"/     c #990099",
+"(     c #9900CC",
+"_     c #9900FF",
+":     c #CC0000",
+"<     c #CC0033",
+"[     c #CC0066",
+"}     c #CC0099",
+"|     c #CC00CC",
+"1     c #CC00FF",
+"2     c #FF0000",
+"3     c #FF0033",
+"4     c #FF0066",
+"5     c #FF0099",
+"6     c #FF00CC",
+"7     c #FF00FF",
+"8     c #003300",
+"9     c #003333",
+"0     c #003366",
+"a     c #003399",
+"b     c #0033CC",
+"c     c #0033FF",
+"d     c #333300",
+"e     c #333333",
+"f     c #333366",
+"g     c #333399",
+"h     c #3333CC",
+"i     c #3333FF",
+"j     c #663300",
+"k     c #663333",
+"l     c #663366",
+"m     c #663399",
+"n     c #6633CC",
+"o     c #6633FF",
+"p     c #993300",
+"q     c #993333",
+"r     c #993366",
+"s     c #993399",
+"t     c #9933CC",
+"u     c #9933FF",
+"v     c #CC3300",
+"w     c #CC3333",
+"x     c #CC3366",
+"y     c #CC3399",
+"z     c #CC33CC",
+"A     c #CC33FF",
+"B     c #FF3300",
+"C     c #FF3333",
+"D     c #FF3366",
+"E     c #FF3399",
+"F     c #FF33CC",
+"G     c #FF33FF",
+"H     c #006600",
+"I     c #006633",
+"J     c #006666",
+"K     c #006699",
+"L     c #0066CC",
+"M     c #0066FF",
+"N     c #336600",
+"O     c #336633",
+"P     c #336666",
+"Q     c #336699",
+"R     c #3366CC",
+"S     c #3366FF",
+"T     c #666600",
+"U     c #666633",
+"V     c #666666",
+"W     c #666699",
+"X     c #6666CC",
+"Y     c #6666FF",
+"Z     c #996600",
+"`     c #996633",
+" .    c #996666",
+"..    c #996699",
+"+.    c #9966CC",
+"@.    c #9966FF",
+"#.    c #CC6600",
+"$.    c #CC6633",
+"%.    c #CC6666",
+"&.    c #CC6699",
+"*.    c #CC66CC",
+"=.    c #CC66FF",
+"-.    c #FF6600",
+";.    c #FF6633",
+">.    c #FF6666",
+",.    c #FF6699",
+"'.    c #FF66CC",
+").    c #FF66FF",
+"!.    c #009900",
+"~.    c #009933",
+"{.    c #009966",
+"].    c #009999",
+"^.    c #0099CC",
+"/.    c #0099FF",
+"(.    c #339900",
+"_.    c #339933",
+":.    c #339966",
+"<.    c #339999",
+"[.    c #3399CC",
+"}.    c #3399FF",
+"|.    c #669900",
+"1.    c #669933",
+"2.    c #669966",
+"3.    c #669999",
+"4.    c #6699CC",
+"5.    c #6699FF",
+"6.    c #999900",
+"7.    c #999933",
+"8.    c #999966",
+"9.    c #999999",
+"0.    c #9999CC",
+"a.    c #9999FF",
+"b.    c #CC9900",
+"c.    c #CC9933",
+"d.    c #CC9966",
+"e.    c #CC9999",
+"f.    c #CC99CC",
+"g.    c #CC99FF",
+"h.    c #FF9900",
+"i.    c #FF9933",
+"j.    c #FF9966",
+"k.    c #FF9999",
+"l.    c #FF99CC",
+"m.    c #FF99FF",
+"n.    c #00CC00",
+"o.    c #00CC33",
+"p.    c #00CC66",
+"q.    c #00CC99",
+"r.    c #00CCCC",
+"s.    c #00CCFF",
+"t.    c #33CC00",
+"u.    c #33CC33",
+"v.    c #33CC66",
+"w.    c #33CC99",
+"x.    c #33CCCC",
+"y.    c #33CCFF",
+"z.    c #66CC00",
+"A.    c #66CC33",
+"B.    c #66CC66",
+"C.    c #66CC99",
+"D.    c #66CCCC",
+"E.    c #66CCFF",
+"F.    c #99CC00",
+"G.    c #99CC33",
+"H.    c #99CC66",
+"I.    c #99CC99",
+"J.    c #99CCCC",
+"K.    c #99CCFF",
+"L.    c #CCCC00",
+"M.    c #CCCC33",
+"N.    c #CCCC66",
+"O.    c #CCCC99",
+"P.    c #CCCCCC",
+"Q.    c #CCCCFF",
+"R.    c #FFCC00",
+"S.    c #FFCC33",
+"T.    c #FFCC66",
+"U.    c #FFCC99",
+"V.    c #FFCCCC",
+"W.    c #FFCCFF",
+"X.    c #00FF00",
+"Y.    c #00FF33",
+"Z.    c #00FF66",
+"`.    c #00FF99",
+" +    c #00FFCC",
+".+    c #00FFFF",
+"++    c #33FF00",
+"@+    c #33FF33",
+"#+    c #33FF66",
+"$+    c #33FF99",
+"%+    c #33FFCC",
+"&+    c #33FFFF",
+"*+    c #66FF00",
+"=+    c #66FF33",
+"-+    c #66FF66",
+";+    c #66FF99",
+">+    c #66FFCC",
+",+    c #66FFFF",
+"'+    c #99FF00",
+")+    c #99FF33",
+"!+    c #99FF66",
+"~+    c #99FF99",
+"{+    c #99FFCC",
+"]+    c #99FFFF",
+"^+    c #CCFF00",
+"/+    c #CCFF33",
+"(+    c #CCFF66",
+"_+    c #CCFF99",
+":+    c #CCFFCC",
+"<+    c #CCFFFF",
+"[+    c #FFFF00",
+"}+    c #FFFF33",
+"|+    c #FFFF66",
+"1+    c #FFFF99",
+"2+    c #FFFFCC",
+"3+    c #FFFFFF",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.              3+        P.          3+            P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.P.V V  .e P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.V 2+P.9.P   P.P.P.P.P.P.P.      3+3+    3+        P.          3+            P.P.",
+"P.P.P.V 3+3+3+P.9.l   P.P.P.P.P.P.        3+3+3+3+        P.          3+3+          P.P.",
+"P.P.P.V P.3+3+P.9.V   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.9.9.P.3+P.9.e   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.V V 9.9.9.V e   P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.P.V R.V V V e V V P.P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.9.P.R.-.V V W V #.e e P.P.P.P.P.                        P.                        P.P.",
+"P.9.U.3+3+-.-.-.#.#.#.R.f P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.9.U.2+2+3+3+R.R.R.R.-.O P.P.P.P.                        P.                        P.P.",
+"P.9.U.U.U.2+2+3+2+R.-.#.k P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.U.U.U.2+2+-.-.#.P P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.U.U.U.U.-.-.#.e P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.U.U.U.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.R.R.U.-.#.#.U P.P.P.P.    3+3+      3+3+3+    P.                        P.P.",
+"P.9.U.R.R.R.R.R.R.-.#.#.e P.P.P.P.      3+3+3+3+3+        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.v e P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.> R.R.R.{ v U P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.> { #.f P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.-.-.#.e P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.          P.P.              P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.          P.P.            P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.    P.P.              P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.    P.P.            P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.            P.P.    P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.        P.P.P.    P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.bmp
new file mode 100644 (file)
index 0000000..9a355cf
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH1.xpm
new file mode 100644 (file)
index 0000000..d710371
--- /dev/null
@@ -0,0 +1,309 @@
+/* XPM */
+static char * TOOLBAR_AXIS_JF_MH1_xpm[] = {
+"44 50 256 2",
+"      c #000000",
+".     c #000033",
+"+     c #000066",
+"@     c #000099",
+"#     c #0000CC",
+"$     c #0000FF",
+"%     c #330000",
+"&     c #330033",
+"*     c #330066",
+"=     c #330099",
+"-     c #3300CC",
+";     c #3300FF",
+">     c #660000",
+",     c #660033",
+"'     c #660066",
+")     c #660099",
+"!     c #6600CC",
+"~     c #6600FF",
+"{     c #990000",
+"]     c #990033",
+"^     c #990066",
+"/     c #990099",
+"(     c #9900CC",
+"_     c #9900FF",
+":     c #CC0000",
+"<     c #CC0033",
+"[     c #CC0066",
+"}     c #CC0099",
+"|     c #CC00CC",
+"1     c #CC00FF",
+"2     c #FF0000",
+"3     c #FF0033",
+"4     c #FF0066",
+"5     c #FF0099",
+"6     c #FF00CC",
+"7     c #FF00FF",
+"8     c #003300",
+"9     c #003333",
+"0     c #003366",
+"a     c #003399",
+"b     c #0033CC",
+"c     c #0033FF",
+"d     c #333300",
+"e     c #333333",
+"f     c #333366",
+"g     c #333399",
+"h     c #3333CC",
+"i     c #3333FF",
+"j     c #663300",
+"k     c #663333",
+"l     c #663366",
+"m     c #663399",
+"n     c #6633CC",
+"o     c #6633FF",
+"p     c #993300",
+"q     c #993333",
+"r     c #993366",
+"s     c #993399",
+"t     c #9933CC",
+"u     c #9933FF",
+"v     c #CC3300",
+"w     c #CC3333",
+"x     c #CC3366",
+"y     c #CC3399",
+"z     c #CC33CC",
+"A     c #CC33FF",
+"B     c #FF3300",
+"C     c #FF3333",
+"D     c #FF3366",
+"E     c #FF3399",
+"F     c #FF33CC",
+"G     c #FF33FF",
+"H     c #006600",
+"I     c #006633",
+"J     c #006666",
+"K     c #006699",
+"L     c #0066CC",
+"M     c #0066FF",
+"N     c #336600",
+"O     c #336633",
+"P     c #336666",
+"Q     c #336699",
+"R     c #3366CC",
+"S     c #3366FF",
+"T     c #666600",
+"U     c #666633",
+"V     c #666666",
+"W     c #666699",
+"X     c #6666CC",
+"Y     c #6666FF",
+"Z     c #996600",
+"`     c #996633",
+" .    c #996666",
+"..    c #996699",
+"+.    c #9966CC",
+"@.    c #9966FF",
+"#.    c #CC6600",
+"$.    c #CC6633",
+"%.    c #CC6666",
+"&.    c #CC6699",
+"*.    c #CC66CC",
+"=.    c #CC66FF",
+"-.    c #FF6600",
+";.    c #FF6633",
+">.    c #FF6666",
+",.    c #FF6699",
+"'.    c #FF66CC",
+").    c #FF66FF",
+"!.    c #009900",
+"~.    c #009933",
+"{.    c #009966",
+"].    c #009999",
+"^.    c #0099CC",
+"/.    c #0099FF",
+"(.    c #339900",
+"_.    c #339933",
+":.    c #339966",
+"<.    c #339999",
+"[.    c #3399CC",
+"}.    c #3399FF",
+"|.    c #669900",
+"1.    c #669933",
+"2.    c #669966",
+"3.    c #669999",
+"4.    c #6699CC",
+"5.    c #6699FF",
+"6.    c #999900",
+"7.    c #999933",
+"8.    c #999966",
+"9.    c #999999",
+"0.    c #9999CC",
+"a.    c #9999FF",
+"b.    c #CC9900",
+"c.    c #CC9933",
+"d.    c #CC9966",
+"e.    c #CC9999",
+"f.    c #CC99CC",
+"g.    c #CC99FF",
+"h.    c #FF9900",
+"i.    c #FF9933",
+"j.    c #FF9966",
+"k.    c #FF9999",
+"l.    c #FF99CC",
+"m.    c #FF99FF",
+"n.    c #00CC00",
+"o.    c #00CC33",
+"p.    c #00CC66",
+"q.    c #00CC99",
+"r.    c #00CCCC",
+"s.    c #00CCFF",
+"t.    c #33CC00",
+"u.    c #33CC33",
+"v.    c #33CC66",
+"w.    c #33CC99",
+"x.    c #33CCCC",
+"y.    c #33CCFF",
+"z.    c #66CC00",
+"A.    c #66CC33",
+"B.    c #66CC66",
+"C.    c #66CC99",
+"D.    c #66CCCC",
+"E.    c #66CCFF",
+"F.    c #99CC00",
+"G.    c #99CC33",
+"H.    c #99CC66",
+"I.    c #99CC99",
+"J.    c #99CCCC",
+"K.    c #99CCFF",
+"L.    c #CCCC00",
+"M.    c #CCCC33",
+"N.    c #CCCC66",
+"O.    c #CCCC99",
+"P.    c #CCCCCC",
+"Q.    c #CCCCFF",
+"R.    c #FFCC00",
+"S.    c #FFCC33",
+"T.    c #FFCC66",
+"U.    c #FFCC99",
+"V.    c #FFCCCC",
+"W.    c #FFCCFF",
+"X.    c #00FF00",
+"Y.    c #00FF33",
+"Z.    c #00FF66",
+"`.    c #00FF99",
+" +    c #00FFCC",
+".+    c #00FFFF",
+"++    c #33FF00",
+"@+    c #33FF33",
+"#+    c #33FF66",
+"$+    c #33FF99",
+"%+    c #33FFCC",
+"&+    c #33FFFF",
+"*+    c #66FF00",
+"=+    c #66FF33",
+"-+    c #66FF66",
+";+    c #66FF99",
+">+    c #66FFCC",
+",+    c #66FFFF",
+"'+    c #99FF00",
+")+    c #99FF33",
+"!+    c #99FF66",
+"~+    c #99FF99",
+"{+    c #99FFCC",
+"]+    c #99FFFF",
+"^+    c #CCFF00",
+"/+    c #CCFF33",
+"(+    c #CCFF66",
+"_+    c #CCFF99",
+":+    c #CCFFCC",
+"<+    c #CCFFFF",
+"[+    c #FFFF00",
+"}+    c #FFFF33",
+"|+    c #FFFF66",
+"1+    c #FFFF99",
+"2+    c #FFFFCC",
+"3+    c #FFFFFF",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.              3+        P.          3+            P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.P.V V  .e P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.V 2+P.9.P   P.P.P.P.P.P.P.      3+3+    3+        P.          3+            P.P.",
+"P.P.P.V 3+3+3+P.9.l   P.P.P.P.P.P.        3+3+3+3+        P.          3+3+          P.P.",
+"P.P.P.V P.3+3+P.9.V   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.9.9.P.3+P.9.e   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.V V 9.9.9.V e   P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.P.V R.V V V e V V P.P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.9.P.R.-.V V W V #.e e P.P.P.P.P.                        P.                        P.P.",
+"P.9.U.3+3+-.-.-.#.#.#.R.f P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.9.U.2+2+3+3+R.R.R.R.-.O P.P.P.P.                        P.                        P.P.",
+"P.9.U.U.U.2+2+3+2+R.-.#.k P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.U.U.U.2+2+-.-.#.P P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.U.U.U.U.-.-.#.e P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.U.U.U.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.R.R.U.-.#.#.U P.P.P.P.    3+3+      3+3+3+    P.                        P.P.",
+"P.9.U.R.R.R.R.R.R.-.#.#.e P.P.P.P.      3+3+3+3+3+        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.v e P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.> R.R.R.{ v U P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.> { #.f P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.-.-.#.e P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.          P.P.              P.P.P.P.      P.P.P.P.P.      P.P.    P.P.P.P.    P.P.",
+"P.P.P.          P.P.            P.P.P.P.P.        P.P.P.        P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.          P.          P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.    P.    P.    P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.              P.P.P.P.    P.P.      P.P.    P.P.                P.P.",
+"P.P.P.P.P.P.    P.P.            P.P.P.P.P.    P.P.      P.P.    P.P.                P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.  P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.            P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.        P.P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.bmp
new file mode 100644 (file)
index 0000000..750542c
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/Axis_JF_MH2.xpm
new file mode 100644 (file)
index 0000000..d74d351
--- /dev/null
@@ -0,0 +1,309 @@
+/* XPM */
+static char * TOOLBAR_AXIS_JF_MH2_xpm[] = {
+"44 50 256 2",
+"      c #000000",
+".     c #000033",
+"+     c #000066",
+"@     c #000099",
+"#     c #0000CC",
+"$     c #0000FF",
+"%     c #330000",
+"&     c #330033",
+"*     c #330066",
+"=     c #330099",
+"-     c #3300CC",
+";     c #3300FF",
+">     c #660000",
+",     c #660033",
+"'     c #660066",
+")     c #660099",
+"!     c #6600CC",
+"~     c #6600FF",
+"{     c #990000",
+"]     c #990033",
+"^     c #990066",
+"/     c #990099",
+"(     c #9900CC",
+"_     c #9900FF",
+":     c #CC0000",
+"<     c #CC0033",
+"[     c #CC0066",
+"}     c #CC0099",
+"|     c #CC00CC",
+"1     c #CC00FF",
+"2     c #FF0000",
+"3     c #FF0033",
+"4     c #FF0066",
+"5     c #FF0099",
+"6     c #FF00CC",
+"7     c #FF00FF",
+"8     c #003300",
+"9     c #003333",
+"0     c #003366",
+"a     c #003399",
+"b     c #0033CC",
+"c     c #0033FF",
+"d     c #333300",
+"e     c #333333",
+"f     c #333366",
+"g     c #333399",
+"h     c #3333CC",
+"i     c #3333FF",
+"j     c #663300",
+"k     c #663333",
+"l     c #663366",
+"m     c #663399",
+"n     c #6633CC",
+"o     c #6633FF",
+"p     c #993300",
+"q     c #993333",
+"r     c #993366",
+"s     c #993399",
+"t     c #9933CC",
+"u     c #9933FF",
+"v     c #CC3300",
+"w     c #CC3333",
+"x     c #CC3366",
+"y     c #CC3399",
+"z     c #CC33CC",
+"A     c #CC33FF",
+"B     c #FF3300",
+"C     c #FF3333",
+"D     c #FF3366",
+"E     c #FF3399",
+"F     c #FF33CC",
+"G     c #FF33FF",
+"H     c #006600",
+"I     c #006633",
+"J     c #006666",
+"K     c #006699",
+"L     c #0066CC",
+"M     c #0066FF",
+"N     c #336600",
+"O     c #336633",
+"P     c #336666",
+"Q     c #336699",
+"R     c #3366CC",
+"S     c #3366FF",
+"T     c #666600",
+"U     c #666633",
+"V     c #666666",
+"W     c #666699",
+"X     c #6666CC",
+"Y     c #6666FF",
+"Z     c #996600",
+"`     c #996633",
+" .    c #996666",
+"..    c #996699",
+"+.    c #9966CC",
+"@.    c #9966FF",
+"#.    c #CC6600",
+"$.    c #CC6633",
+"%.    c #CC6666",
+"&.    c #CC6699",
+"*.    c #CC66CC",
+"=.    c #CC66FF",
+"-.    c #FF6600",
+";.    c #FF6633",
+">.    c #FF6666",
+",.    c #FF6699",
+"'.    c #FF66CC",
+").    c #FF66FF",
+"!.    c #009900",
+"~.    c #009933",
+"{.    c #009966",
+"].    c #009999",
+"^.    c #0099CC",
+"/.    c #0099FF",
+"(.    c #339900",
+"_.    c #339933",
+":.    c #339966",
+"<.    c #339999",
+"[.    c #3399CC",
+"}.    c #3399FF",
+"|.    c #669900",
+"1.    c #669933",
+"2.    c #669966",
+"3.    c #669999",
+"4.    c #6699CC",
+"5.    c #6699FF",
+"6.    c #999900",
+"7.    c #999933",
+"8.    c #999966",
+"9.    c #999999",
+"0.    c #9999CC",
+"a.    c #9999FF",
+"b.    c #CC9900",
+"c.    c #CC9933",
+"d.    c #CC9966",
+"e.    c #CC9999",
+"f.    c #CC99CC",
+"g.    c #CC99FF",
+"h.    c #FF9900",
+"i.    c #FF9933",
+"j.    c #FF9966",
+"k.    c #FF9999",
+"l.    c #FF99CC",
+"m.    c #FF99FF",
+"n.    c #00CC00",
+"o.    c #00CC33",
+"p.    c #00CC66",
+"q.    c #00CC99",
+"r.    c #00CCCC",
+"s.    c #00CCFF",
+"t.    c #33CC00",
+"u.    c #33CC33",
+"v.    c #33CC66",
+"w.    c #33CC99",
+"x.    c #33CCCC",
+"y.    c #33CCFF",
+"z.    c #66CC00",
+"A.    c #66CC33",
+"B.    c #66CC66",
+"C.    c #66CC99",
+"D.    c #66CCCC",
+"E.    c #66CCFF",
+"F.    c #99CC00",
+"G.    c #99CC33",
+"H.    c #99CC66",
+"I.    c #99CC99",
+"J.    c #99CCCC",
+"K.    c #99CCFF",
+"L.    c #CCCC00",
+"M.    c #CCCC33",
+"N.    c #CCCC66",
+"O.    c #CCCC99",
+"P.    c #CCCCCC",
+"Q.    c #CCCCFF",
+"R.    c #FFCC00",
+"S.    c #FFCC33",
+"T.    c #FFCC66",
+"U.    c #FFCC99",
+"V.    c #FFCCCC",
+"W.    c #FFCCFF",
+"X.    c #00FF00",
+"Y.    c #00FF33",
+"Z.    c #00FF66",
+"`.    c #00FF99",
+" +    c #00FFCC",
+".+    c #00FFFF",
+"++    c #33FF00",
+"@+    c #33FF33",
+"#+    c #33FF66",
+"$+    c #33FF99",
+"%+    c #33FFCC",
+"&+    c #33FFFF",
+"*+    c #66FF00",
+"=+    c #66FF33",
+"-+    c #66FF66",
+";+    c #66FF99",
+">+    c #66FFCC",
+",+    c #66FFFF",
+"'+    c #99FF00",
+")+    c #99FF33",
+"!+    c #99FF66",
+"~+    c #99FF99",
+"{+    c #99FFCC",
+"]+    c #99FFFF",
+"^+    c #CCFF00",
+"/+    c #CCFF33",
+"(+    c #CCFF66",
+"_+    c #CCFF99",
+":+    c #CCFFCC",
+"<+    c #CCFFFF",
+"[+    c #FFFF00",
+"}+    c #FFFF33",
+"|+    c #FFFF66",
+"1+    c #FFFF99",
+"2+    c #FFFFCC",
+"3+    c #FFFFFF",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.              3+        P.          3+            P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.P.V V  .e P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.V 2+P.9.P   P.P.P.P.P.P.P.      3+3+    3+        P.          3+            P.P.",
+"P.P.P.V 3+3+3+P.9.l   P.P.P.P.P.P.        3+3+3+3+        P.          3+3+          P.P.",
+"P.P.P.V P.3+3+P.9.V   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.9.9.P.3+P.9.e   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.V V 9.9.9.V e   P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.P.V R.V V V e V V P.P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.9.P.R.-.V V W V #.e e P.P.P.P.P.                        P.                        P.P.",
+"P.9.U.3+3+-.-.-.#.#.#.R.f P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.9.U.2+2+3+3+R.R.R.R.-.O P.P.P.P.                        P.                        P.P.",
+"P.9.U.U.U.2+2+3+2+R.-.#.k P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.U.U.U.2+2+-.-.#.P P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.U.U.U.U.-.-.#.e P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.U.U.U.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.R.R.U.-.#.#.U P.P.P.P.    3+3+      3+3+3+    P.                        P.P.",
+"P.9.U.R.R.R.R.R.R.-.#.#.e P.P.P.P.      3+3+3+3+3+        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.v e P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.> R.R.R.{ v U P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.> { #.f P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.-.-.#.e P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.          P.P.              P.P.P.P.      P.P.P.P.P.      P.P.    P.P.P.P.    P.P.",
+"P.P.P.          P.P.            P.P.P.P.P.        P.P.P.        P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.          P.          P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.    P.    P.    P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.              P.P.P.P.    P.P.      P.P.    P.P.                P.P.",
+"P.P.P.P.P.P.    P.P.            P.P.P.P.P.    P.P.      P.P.    P.P.                P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.  P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.    P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.            P.P.    P.P.P.P.P.  P.P.P.    P.P.P.P.P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.        P.P.P.    P.P.P.P.P.  P.P.P.    P.P.P.P.P.P.P.    P.P.    P.P.P.P.    P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.              P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.bmp
new file mode 100644 (file)
index 0000000..ad616c3
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/MPR.xpm
new file mode 100644 (file)
index 0000000..cc1f451
--- /dev/null
@@ -0,0 +1,309 @@
+/* XPM */
+static char * TOOLBAR_MPR_xpm[] = {
+"44 50 256 2",
+"      c #000000",
+".     c #000033",
+"+     c #000066",
+"@     c #000099",
+"#     c #0000CC",
+"$     c #0000FF",
+"%     c #330000",
+"&     c #330033",
+"*     c #330066",
+"=     c #330099",
+"-     c #3300CC",
+";     c #3300FF",
+">     c #660000",
+",     c #660033",
+"'     c #660066",
+")     c #660099",
+"!     c #6600CC",
+"~     c #6600FF",
+"{     c #990000",
+"]     c #990033",
+"^     c #990066",
+"/     c #990099",
+"(     c #9900CC",
+"_     c #9900FF",
+":     c #CC0000",
+"<     c #CC0033",
+"[     c #CC0066",
+"}     c #CC0099",
+"|     c #CC00CC",
+"1     c #CC00FF",
+"2     c #FF0000",
+"3     c #FF0033",
+"4     c #FF0066",
+"5     c #FF0099",
+"6     c #FF00CC",
+"7     c #FF00FF",
+"8     c #003300",
+"9     c #003333",
+"0     c #003366",
+"a     c #003399",
+"b     c #0033CC",
+"c     c #0033FF",
+"d     c #333300",
+"e     c #333333",
+"f     c #333366",
+"g     c #333399",
+"h     c #3333CC",
+"i     c #3333FF",
+"j     c #663300",
+"k     c #663333",
+"l     c #663366",
+"m     c #663399",
+"n     c #6633CC",
+"o     c #6633FF",
+"p     c #993300",
+"q     c #993333",
+"r     c #993366",
+"s     c #993399",
+"t     c #9933CC",
+"u     c #9933FF",
+"v     c #CC3300",
+"w     c #CC3333",
+"x     c #CC3366",
+"y     c #CC3399",
+"z     c #CC33CC",
+"A     c #CC33FF",
+"B     c #FF3300",
+"C     c #FF3333",
+"D     c #FF3366",
+"E     c #FF3399",
+"F     c #FF33CC",
+"G     c #FF33FF",
+"H     c #006600",
+"I     c #006633",
+"J     c #006666",
+"K     c #006699",
+"L     c #0066CC",
+"M     c #0066FF",
+"N     c #336600",
+"O     c #336633",
+"P     c #336666",
+"Q     c #336699",
+"R     c #3366CC",
+"S     c #3366FF",
+"T     c #666600",
+"U     c #666633",
+"V     c #666666",
+"W     c #666699",
+"X     c #6666CC",
+"Y     c #6666FF",
+"Z     c #996600",
+"`     c #996633",
+" .    c #996666",
+"..    c #996699",
+"+.    c #9966CC",
+"@.    c #9966FF",
+"#.    c #CC6600",
+"$.    c #CC6633",
+"%.    c #CC6666",
+"&.    c #CC6699",
+"*.    c #CC66CC",
+"=.    c #CC66FF",
+"-.    c #FF6600",
+";.    c #FF6633",
+">.    c #FF6666",
+",.    c #FF6699",
+"'.    c #FF66CC",
+").    c #FF66FF",
+"!.    c #009900",
+"~.    c #009933",
+"{.    c #009966",
+"].    c #009999",
+"^.    c #0099CC",
+"/.    c #0099FF",
+"(.    c #339900",
+"_.    c #339933",
+":.    c #339966",
+"<.    c #339999",
+"[.    c #3399CC",
+"}.    c #3399FF",
+"|.    c #669900",
+"1.    c #669933",
+"2.    c #669966",
+"3.    c #669999",
+"4.    c #6699CC",
+"5.    c #6699FF",
+"6.    c #999900",
+"7.    c #999933",
+"8.    c #999966",
+"9.    c #999999",
+"0.    c #9999CC",
+"a.    c #9999FF",
+"b.    c #CC9900",
+"c.    c #CC9933",
+"d.    c #CC9966",
+"e.    c #CC9999",
+"f.    c #CC99CC",
+"g.    c #CC99FF",
+"h.    c #FF9900",
+"i.    c #FF9933",
+"j.    c #FF9966",
+"k.    c #FF9999",
+"l.    c #FF99CC",
+"m.    c #FF99FF",
+"n.    c #00CC00",
+"o.    c #00CC33",
+"p.    c #00CC66",
+"q.    c #00CC99",
+"r.    c #00CCCC",
+"s.    c #00CCFF",
+"t.    c #33CC00",
+"u.    c #33CC33",
+"v.    c #33CC66",
+"w.    c #33CC99",
+"x.    c #33CCCC",
+"y.    c #33CCFF",
+"z.    c #66CC00",
+"A.    c #66CC33",
+"B.    c #66CC66",
+"C.    c #66CC99",
+"D.    c #66CCCC",
+"E.    c #66CCFF",
+"F.    c #99CC00",
+"G.    c #99CC33",
+"H.    c #99CC66",
+"I.    c #99CC99",
+"J.    c #99CCCC",
+"K.    c #99CCFF",
+"L.    c #CCCC00",
+"M.    c #CCCC33",
+"N.    c #CCCC66",
+"O.    c #CCCC99",
+"P.    c #CCCCCC",
+"Q.    c #CCCCFF",
+"R.    c #FFCC00",
+"S.    c #FFCC33",
+"T.    c #FFCC66",
+"U.    c #FFCC99",
+"V.    c #FFCCCC",
+"W.    c #FFCCFF",
+"X.    c #00FF00",
+"Y.    c #00FF33",
+"Z.    c #00FF66",
+"`.    c #00FF99",
+" +    c #00FFCC",
+".+    c #00FFFF",
+"++    c #33FF00",
+"@+    c #33FF33",
+"#+    c #33FF66",
+"$+    c #33FF99",
+"%+    c #33FFCC",
+"&+    c #33FFFF",
+"*+    c #66FF00",
+"=+    c #66FF33",
+"-+    c #66FF66",
+";+    c #66FF99",
+">+    c #66FFCC",
+",+    c #66FFFF",
+"'+    c #99FF00",
+")+    c #99FF33",
+"!+    c #99FF66",
+"~+    c #99FF99",
+"{+    c #99FFCC",
+"]+    c #99FFFF",
+"^+    c #CCFF00",
+"/+    c #CCFF33",
+"(+    c #CCFF66",
+"_+    c #CCFF99",
+":+    c #CCFFCC",
+"<+    c #CCFFFF",
+"[+    c #FFFF00",
+"}+    c #FFFF33",
+"|+    c #FFFF66",
+"1+    c #FFFF99",
+"2+    c #FFFFCC",
+"3+    c #FFFFFF",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.              3+        P.          3+            P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.P.V V  .e P.P.P.P.P.P.P.P.      3+      3+        P.          3+            P.P.",
+"P.P.P.P.V 2+P.9.P   P.P.P.P.P.P.P.      3+3+    3+        P.          3+            P.P.",
+"P.P.P.V 3+3+3+P.9.l   P.P.P.P.P.P.        3+3+3+3+        P.          3+3+          P.P.",
+"P.P.P.V P.3+3+P.9.V   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.9.9.P.3+P.9.e   P.P.P.P.P.P.        3+3+            P.            3+          P.P.",
+"P.P.P.V V 9.9.9.V e   P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.P.V R.V V V e V V P.P.P.P.P.P.P.        3+              P.            3+          P.P.",
+"P.9.P.R.-.V V W V #.e e P.P.P.P.P.                        P.                        P.P.",
+"P.9.U.3+3+-.-.-.#.#.#.R.f P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.9.U.2+2+3+3+R.R.R.R.-.O P.P.P.P.                        P.                        P.P.",
+"P.9.U.U.U.2+2+3+2+R.-.#.k P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.U.U.U.2+2+-.-.#.P P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.U.U.U.U.-.-.#.e P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.U.U.U.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.9.U.R.R.R.R.R.U.-.#.#.U P.P.P.P.    3+3+      3+3+3+    P.                        P.P.",
+"P.9.U.R.R.R.R.R.R.-.#.#.e P.P.P.P.      3+3+3+3+3+        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.#.#.f P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.R.R.R.R.-.v e P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.> R.R.R.{ v U P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.> { #.f P.P.P.P.P.                        P.                        P.P.",
+"P.P.9.U.R.{ R.R.-.-.#.e P.P.P.P.P.                        P.                        P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.      P.P.P.P.P.      P.P.P.P.            P.P.P.P.P.              P.P.P.P.P.P.P.",
+"P.P.P.P.      P.P.P.P.P.      P.P.P.P.              P.P.P.P.                P.P.P.P.P.P.",
+"P.P.P.P.        P.P.P.        P.P.P.P.    P.P.P.      P.P.P.    P.P.P.P.      P.P.P.P.P.",
+"P.P.P.P.    P.  P.P.P.  P.    P.P.P.P.    P.P.P.P.    P.P.P.    P.P.P.P.P.    P.P.P.P.P.",
+"P.P.P.P.    P.    P.P.  P.    P.P.P.P.    P.P.P.P.    P.P.P.    P.P.P.P.P.    P.P.P.P.P.",
+"P.P.P.P.    P.P.  P.  P.P.    P.P.P.P.    P.P.P.      P.P.P.    P.P.P.P.      P.P.P.P.P.",
+"P.P.P.P.    P.P.      P.P.    P.P.P.P.              P.P.P.P.                P.P.P.P.P.P.",
+"P.P.P.P.    P.P.      P.P.    P.P.P.P.            P.P.P.P.P.            P.P.P.P.P.P.P.P.",
+"P.P.P.P.    P.P.P.  P.P.P.    P.P.P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.    P.P.P.P.P.P.P.",
+"P.P.P.P.    P.P.P.P.P.P.P.    P.P.P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.      P.P.P.P.P.P.",
+"P.P.P.P.    P.P.P.P.P.P.P.    P.P.P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.      P.P.P.P.P.",
+"P.P.P.P.    P.P.P.P.P.P.P.    P.P.P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.P.      P.P.P.P.",
+"P.P.P.P.    P.P.P.P.P.P.P.    P.P.P.P.    P.P.P.P.P.P.P.P.P.    P.P.P.P.P.P.      P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.bmp
new file mode 100644 (file)
index 0000000..32353d1
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/ProcessingCT.xpm
new file mode 100644 (file)
index 0000000..0e4588f
--- /dev/null
@@ -0,0 +1,309 @@
+/* XPM */
+static char * TOOLBAR_PROCESSINGCT_xpm[] = {
+"44 50 256 2",
+"      c #000000",
+".     c #000033",
+"+     c #000066",
+"@     c #000099",
+"#     c #0000CC",
+"$     c #0000FF",
+"%     c #330000",
+"&     c #330033",
+"*     c #330066",
+"=     c #330099",
+"-     c #3300CC",
+";     c #3300FF",
+">     c #660000",
+",     c #660033",
+"'     c #660066",
+")     c #660099",
+"!     c #6600CC",
+"~     c #6600FF",
+"{     c #990000",
+"]     c #990033",
+"^     c #990066",
+"/     c #990099",
+"(     c #9900CC",
+"_     c #9900FF",
+":     c #CC0000",
+"<     c #CC0033",
+"[     c #CC0066",
+"}     c #CC0099",
+"|     c #CC00CC",
+"1     c #CC00FF",
+"2     c #FF0000",
+"3     c #FF0033",
+"4     c #FF0066",
+"5     c #FF0099",
+"6     c #FF00CC",
+"7     c #FF00FF",
+"8     c #003300",
+"9     c #003333",
+"0     c #003366",
+"a     c #003399",
+"b     c #0033CC",
+"c     c #0033FF",
+"d     c #333300",
+"e     c #333333",
+"f     c #333366",
+"g     c #333399",
+"h     c #3333CC",
+"i     c #3333FF",
+"j     c #663300",
+"k     c #663333",
+"l     c #663366",
+"m     c #663399",
+"n     c #6633CC",
+"o     c #6633FF",
+"p     c #993300",
+"q     c #993333",
+"r     c #993366",
+"s     c #993399",
+"t     c #9933CC",
+"u     c #9933FF",
+"v     c #CC3300",
+"w     c #CC3333",
+"x     c #CC3366",
+"y     c #CC3399",
+"z     c #CC33CC",
+"A     c #CC33FF",
+"B     c #FF3300",
+"C     c #FF3333",
+"D     c #FF3366",
+"E     c #FF3399",
+"F     c #FF33CC",
+"G     c #FF33FF",
+"H     c #006600",
+"I     c #006633",
+"J     c #006666",
+"K     c #006699",
+"L     c #0066CC",
+"M     c #0066FF",
+"N     c #336600",
+"O     c #336633",
+"P     c #336666",
+"Q     c #336699",
+"R     c #3366CC",
+"S     c #3366FF",
+"T     c #666600",
+"U     c #666633",
+"V     c #666666",
+"W     c #666699",
+"X     c #6666CC",
+"Y     c #6666FF",
+"Z     c #996600",
+"`     c #996633",
+" .    c #996666",
+"..    c #996699",
+"+.    c #9966CC",
+"@.    c #9966FF",
+"#.    c #CC6600",
+"$.    c #CC6633",
+"%.    c #CC6666",
+"&.    c #CC6699",
+"*.    c #CC66CC",
+"=.    c #CC66FF",
+"-.    c #FF6600",
+";.    c #FF6633",
+">.    c #FF6666",
+",.    c #FF6699",
+"'.    c #FF66CC",
+").    c #FF66FF",
+"!.    c #009900",
+"~.    c #009933",
+"{.    c #009966",
+"].    c #009999",
+"^.    c #0099CC",
+"/.    c #0099FF",
+"(.    c #339900",
+"_.    c #339933",
+":.    c #339966",
+"<.    c #339999",
+"[.    c #3399CC",
+"}.    c #3399FF",
+"|.    c #669900",
+"1.    c #669933",
+"2.    c #669966",
+"3.    c #669999",
+"4.    c #6699CC",
+"5.    c #6699FF",
+"6.    c #999900",
+"7.    c #999933",
+"8.    c #999966",
+"9.    c #999999",
+"0.    c #9999CC",
+"a.    c #9999FF",
+"b.    c #CC9900",
+"c.    c #CC9933",
+"d.    c #CC9966",
+"e.    c #CC9999",
+"f.    c #CC99CC",
+"g.    c #CC99FF",
+"h.    c #FF9900",
+"i.    c #FF9933",
+"j.    c #FF9966",
+"k.    c #FF9999",
+"l.    c #FF99CC",
+"m.    c #FF99FF",
+"n.    c #00CC00",
+"o.    c #00CC33",
+"p.    c #00CC66",
+"q.    c #00CC99",
+"r.    c #00CCCC",
+"s.    c #00CCFF",
+"t.    c #33CC00",
+"u.    c #33CC33",
+"v.    c #33CC66",
+"w.    c #33CC99",
+"x.    c #33CCCC",
+"y.    c #33CCFF",
+"z.    c #66CC00",
+"A.    c #66CC33",
+"B.    c #66CC66",
+"C.    c #66CC99",
+"D.    c #66CCCC",
+"E.    c #66CCFF",
+"F.    c #99CC00",
+"G.    c #99CC33",
+"H.    c #99CC66",
+"I.    c #99CC99",
+"J.    c #99CCCC",
+"K.    c #99CCFF",
+"L.    c #CCCC00",
+"M.    c #CCCC33",
+"N.    c #CCCC66",
+"O.    c #CCCC99",
+"P.    c #CCCCCC",
+"Q.    c #CCCCFF",
+"R.    c #FFCC00",
+"S.    c #FFCC33",
+"T.    c #FFCC66",
+"U.    c #FFCC99",
+"V.    c #FFCCCC",
+"W.    c #FFCCFF",
+"X.    c #00FF00",
+"Y.    c #00FF33",
+"Z.    c #00FF66",
+"`.    c #00FF99",
+" +    c #00FFCC",
+".+    c #00FFFF",
+"++    c #33FF00",
+"@+    c #33FF33",
+"#+    c #33FF66",
+"$+    c #33FF99",
+"%+    c #33FFCC",
+"&+    c #33FFFF",
+"*+    c #66FF00",
+"=+    c #66FF33",
+"-+    c #66FF66",
+";+    c #66FF99",
+">+    c #66FFCC",
+",+    c #66FFFF",
+"'+    c #99FF00",
+")+    c #99FF33",
+"!+    c #99FF66",
+"~+    c #99FF99",
+"{+    c #99FFCC",
+"]+    c #99FFFF",
+"^+    c #CCFF00",
+"/+    c #CCFF33",
+"(+    c #CCFF66",
+"_+    c #CCFF99",
+":+    c #CCFFCC",
+"<+    c #CCFFFF",
+"[+    c #FFFF00",
+"}+    c #FFFF33",
+"|+    c #FFFF66",
+"1+    c #FFFF99",
+"2+    c #FFFFCC",
+"3+    c #FFFFFF",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.              3+3+      P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  3+          3+3+      P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.V V  .e P.P.P.P.P.P.P.P.P.P.P.P.P.P.  3+3+          3+3+    P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.V 2+P.9.P   P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.V 3+3+3+P.9.l   P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.V P.3+3+P.9.V   P.P.P.P.P.P.P.P.P.P.P.P.      3+    3+3+3+      P.P.P.P.",
+"P.P.P.P.P.P.P.P.9.9.P.3+P.9.e   P.P.P.P.P.P.P.P.P.P.P.P.    3+3+    3+3+        P.P.P.P.",
+"P.P.P.P.P.P.P.P.V V 9.9.9.V e   P.P.P.P.P.P.P.P.P.P.P.P.              3+        P.P.P.P.",
+"P.P.P.P.P.P.P.V R.V V V e V V P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.9.P.R.-.V V W V #.e e P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.9.U.3+3+-.-.-.#.#.#.R.f P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.9.U.2+2+3+3+R.R.R.R.-.O P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.9.U.U.U.2+2+3+2+R.-.#.k P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.9.U.R.U.U.U.2+2+-.-.#.P P.P.P.P.P.P.P.P.P.P.              3+3+      P.P.P.P.",
+"P.P.P.P.P.P.9.U.R.R.U.U.U.U.-.-.#.e P.P.P.P.P.P.P.P.P.P.              3+3+3+    P.P.P.P.",
+"P.P.P.P.P.P.9.U.R.R.R.U.U.U.-.#.#.f P.P.P.P.P.P.P.P.P.P.                3+      P.P.P.P.",
+"P.P.P.P.P.P.9.U.R.R.R.R.R.U.-.#.#.U P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.9.U.R.R.R.R.R.R.-.#.#.e P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.9.U.R.R.R.R.R.-.#.#.f P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.9.U.R.R.R.R.R.-.v e P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.9.U.R.> R.R.R.{ v U P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.9.U.R.{ R.R.> { #.f P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.9.U.R.{ R.R.-.-.#.e P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.              3+3+      P.P.P.P.",
+"P.P.P.P.P.          P.P.              P.P.P.P.P.P.P.P.P.              3+3+3+    P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.              3+3+      P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.                        P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.          P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.bmp
new file mode 100644 (file)
index 0000000..da02bad
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/QuantificationCT.xpm
new file mode 100644 (file)
index 0000000..6bbd02f
--- /dev/null
@@ -0,0 +1,309 @@
+/* XPM */
+static char * TOOLBAR_QUANTIFICATIONCT_xpm[] = {
+"44 50 256 2",
+"      c #000000",
+".     c #000033",
+"+     c #000066",
+"@     c #000099",
+"#     c #0000CC",
+"$     c #0000FF",
+"%     c #330000",
+"&     c #330033",
+"*     c #330066",
+"=     c #330099",
+"-     c #3300CC",
+";     c #3300FF",
+">     c #660000",
+",     c #660033",
+"'     c #660066",
+")     c #660099",
+"!     c #6600CC",
+"~     c #6600FF",
+"{     c #990000",
+"]     c #990033",
+"^     c #990066",
+"/     c #990099",
+"(     c #9900CC",
+"_     c #9900FF",
+":     c #CC0000",
+"<     c #CC0033",
+"[     c #CC0066",
+"}     c #CC0099",
+"|     c #CC00CC",
+"1     c #CC00FF",
+"2     c #FF0000",
+"3     c #FF0033",
+"4     c #FF0066",
+"5     c #FF0099",
+"6     c #FF00CC",
+"7     c #FF00FF",
+"8     c #003300",
+"9     c #003333",
+"0     c #003366",
+"a     c #003399",
+"b     c #0033CC",
+"c     c #0033FF",
+"d     c #333300",
+"e     c #333333",
+"f     c #333366",
+"g     c #333399",
+"h     c #3333CC",
+"i     c #3333FF",
+"j     c #663300",
+"k     c #663333",
+"l     c #663366",
+"m     c #663399",
+"n     c #6633CC",
+"o     c #6633FF",
+"p     c #993300",
+"q     c #993333",
+"r     c #993366",
+"s     c #993399",
+"t     c #9933CC",
+"u     c #9933FF",
+"v     c #CC3300",
+"w     c #CC3333",
+"x     c #CC3366",
+"y     c #CC3399",
+"z     c #CC33CC",
+"A     c #CC33FF",
+"B     c #FF3300",
+"C     c #FF3333",
+"D     c #FF3366",
+"E     c #FF3399",
+"F     c #FF33CC",
+"G     c #FF33FF",
+"H     c #006600",
+"I     c #006633",
+"J     c #006666",
+"K     c #006699",
+"L     c #0066CC",
+"M     c #0066FF",
+"N     c #336600",
+"O     c #336633",
+"P     c #336666",
+"Q     c #336699",
+"R     c #3366CC",
+"S     c #3366FF",
+"T     c #666600",
+"U     c #666633",
+"V     c #666666",
+"W     c #666699",
+"X     c #6666CC",
+"Y     c #6666FF",
+"Z     c #996600",
+"`     c #996633",
+" .    c #996666",
+"..    c #996699",
+"+.    c #9966CC",
+"@.    c #9966FF",
+"#.    c #CC6600",
+"$.    c #CC6633",
+"%.    c #CC6666",
+"&.    c #CC6699",
+"*.    c #CC66CC",
+"=.    c #CC66FF",
+"-.    c #FF6600",
+";.    c #FF6633",
+">.    c #FF6666",
+",.    c #FF6699",
+"'.    c #FF66CC",
+").    c #FF66FF",
+"!.    c #009900",
+"~.    c #009933",
+"{.    c #009966",
+"].    c #009999",
+"^.    c #0099CC",
+"/.    c #0099FF",
+"(.    c #339900",
+"_.    c #339933",
+":.    c #339966",
+"<.    c #339999",
+"[.    c #3399CC",
+"}.    c #3399FF",
+"|.    c #669900",
+"1.    c #669933",
+"2.    c #669966",
+"3.    c #669999",
+"4.    c #6699CC",
+"5.    c #6699FF",
+"6.    c #999900",
+"7.    c #999933",
+"8.    c #999966",
+"9.    c #999999",
+"0.    c #9999CC",
+"a.    c #9999FF",
+"b.    c #CC9900",
+"c.    c #CC9933",
+"d.    c #CC9966",
+"e.    c #CC9999",
+"f.    c #CC99CC",
+"g.    c #CC99FF",
+"h.    c #FF9900",
+"i.    c #FF9933",
+"j.    c #FF9966",
+"k.    c #FF9999",
+"l.    c #FF99CC",
+"m.    c #FF99FF",
+"n.    c #00CC00",
+"o.    c #00CC33",
+"p.    c #00CC66",
+"q.    c #00CC99",
+"r.    c #00CCCC",
+"s.    c #00CCFF",
+"t.    c #33CC00",
+"u.    c #33CC33",
+"v.    c #33CC66",
+"w.    c #33CC99",
+"x.    c #33CCCC",
+"y.    c #33CCFF",
+"z.    c #66CC00",
+"A.    c #66CC33",
+"B.    c #66CC66",
+"C.    c #66CC99",
+"D.    c #66CCCC",
+"E.    c #66CCFF",
+"F.    c #99CC00",
+"G.    c #99CC33",
+"H.    c #99CC66",
+"I.    c #99CC99",
+"J.    c #99CCCC",
+"K.    c #99CCFF",
+"L.    c #CCCC00",
+"M.    c #CCCC33",
+"N.    c #CCCC66",
+"O.    c #CCCC99",
+"P.    c #CCCCCC",
+"Q.    c #CCCCFF",
+"R.    c #FFCC00",
+"S.    c #FFCC33",
+"T.    c #FFCC66",
+"U.    c #FFCC99",
+"V.    c #FFCCCC",
+"W.    c #FFCCFF",
+"X.    c #00FF00",
+"Y.    c #00FF33",
+"Z.    c #00FF66",
+"`.    c #00FF99",
+" +    c #00FFCC",
+".+    c #00FFFF",
+"++    c #33FF00",
+"@+    c #33FF33",
+"#+    c #33FF66",
+"$+    c #33FF99",
+"%+    c #33FFCC",
+"&+    c #33FFFF",
+"*+    c #66FF00",
+"=+    c #66FF33",
+"-+    c #66FF66",
+";+    c #66FF99",
+">+    c #66FFCC",
+",+    c #66FFFF",
+"'+    c #99FF00",
+")+    c #99FF33",
+"!+    c #99FF66",
+"~+    c #99FF99",
+"{+    c #99FFCC",
+"]+    c #99FFFF",
+"^+    c #CCFF00",
+"/+    c #CCFF33",
+"(+    c #CCFF66",
+"_+    c #CCFF99",
+":+    c #CCFFCC",
+"<+    c #CCFFFF",
+"[+    c #FFFF00",
+"}+    c #FFFF33",
+"|+    c #FFFF66",
+"1+    c #FFFF99",
+"2+    c #FFFFCC",
+"3+    c #FFFFFF",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.s P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.e e P.P.P.P.P.P.P.P.v v v v P.P.P.s P.P.P.P.P...s P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.e   e P.P.P.P.P.P.P.P.v v v P.P.P.s ..P.P.P...s ..P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.e       P.P.P.P.P.P.v v v v P.P.P.s s P.s s s P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.e           e P.P.v P.P.P.P.P.P.P.s } ..P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.V               P.P.P.P.P.P.P.s s s / P.P.V V V V   P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.                e P.P.P.P.s s ..P.s V P.9.9.d.d.  P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.                  e P.s s s P.P.P.s 9.e.e.d.d.e.  P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.                      e P.V V 9.9.&.e.e.O.O.8.V P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.                      e V  .9.e.e.e.e.e.9.9.V P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.                      e 9.9.e.j.e.e.9.9. .V P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.                e   e V e.d.j.e.9.9. .V V P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.s s s e         e V 8.e.j.d.d.9.9.P.V V P.s P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.s ..e         e 8.d.j.d. .V k V P.P.P.P.s P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.s P.e         d d.d.9.V e   e P.P.P.P.P.s P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.} P.e           U  .V d       P.P.P...s / s ..P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.V r V e             e d         P...s s s ..s s s P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.O.O.9.e                 % & ^ / s P.P.P.P.P.P.P.P.s s P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.O.e.8.V               & / ^ &   e P.P.P.P.P.P.P.P.P...P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.9. .V V         & ' / / &       e P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.V s P.V       & / ' &             P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.} ..s / ' &                     P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.s } / s                           P.P.P.P.P.P.P.P...s P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.s } ..P.e e                       P.P.P.P.....s s s s P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.} P.P.P.P.P.P.V e e             P.P...s s s s ..P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.          P.P.              P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.          P.P.P.P.P.  P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.",
+"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.bmp
new file mode 100644 (file)
index 0000000..d29525c
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/add.xpm
new file mode 100644 (file)
index 0000000..1c17e61
--- /dev/null
@@ -0,0 +1,101 @@
+/* XPM */
+static char *add[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 45 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #003333",
+"O c #330000",
+"+ c #330033",
+"@ c #333300",
+"# c gray20",
+"$ c #333366",
+"% c #336633",
+"& c #336666",
+"* c #663333",
+"= c #663366",
+"- c #666633",
+"; c gray40",
+": c #666699",
+"> c #6666cc",
+", c #669966",
+"< c #669999",
+"1 c #6699cc",
+"2 c #996666",
+"3 c #cc6633",
+"4 c #ff6633",
+"5 c #cc6666",
+"6 c #ff6666",
+"7 c #996699",
+"8 c #9966cc",
+"9 c #999966",
+"0 c #cc9966",
+"q c #ff9966",
+"w c gray60",
+"e c #9999cc",
+"r c #9999ff",
+"t c #99cc99",
+"y c #99cccc",
+"u c #99ccff",
+"i c #cc9999",
+"p c #cc99cc",
+"a c #cc99ff",
+"s c #cccc99",
+"d c gray80",
+"f c #ccccff",
+"g c #ccffff",
+"h c #ffccff",
+"j c white",
+/* pixels */
+"dddddddddddddddddddddddddddddddddddd",
+"dddddddddddddddddddddddddddddddddddd",
+"dddddddddddddddddddddddddddddddddddd",
+"dd;-#ddddddddddddddddddddddddddddddd",
+"ddw2w;*odddddddddddddddddddddddddddd",
+"ddww9w9;*ddddddddddddddddddddddddddd",
+"ddiswiw9;;-##ddddddddddddddddddddddd",
+"dd560iwiw9:2;;-;*odddddddddddddddddd",
+"ddi0636iwiw9w92w,2##dddddddddddddddd",
+"ddwiwi0460iwwwwwi97;%Odddddddddddddd",
+"ddwwsiwi05460iitww9w2;;ddddddddddddd",
+"dd9w9witiii0635iiitiw92;-#dddddddddd",
+"dd;;2w9wwwwiwiq450iwiww9:;*Xdddddddd",
+"ddd*;;299w9wiwiw0650tiww9w9;=Xdddddd",
+"ddddd##;;2w99wwiw00660swiww92;-+dddd",
+"ddddddd@###;2w9wwiwi5560wsiwww2,;ddd",
+"dd               wwwsw5660witww92;dd",
+"dd d;;e<er8<eeg; 29w9iwi0560iwiww9dd",
+"dd d#;yarrfau:h# &;2w9wtii0560swiwdd",
+"dd f9:ee1r8ee1j7 O%;;29wwwi0056iwsdd",
+"dd dw7erauafrefe  O.#-;2w9wwii5450dd",
+"dd ww,eer>8e1>jw dddd##;;9w9wwti06dd",
+"dd diw>>ere8e1j7 dddddd@#;;29wwiwidd",
+"dd d:wwe>e81ewfp ddddddddO#;;29wwidd",
+"dd d9wdefrfaeeyw ddddddddddd-;;99wdd",
+"dd di9eyedeeywwp ddddddddddd.##;;2dd",
+"dd w9,wewwweww,7 dddddddddddddd##;dd",
+"dd dw2X o+ ##<sw ddddddddddddddddOdd",
+"dd j9; #;;#-;<dw ddddddddddddddddddd",
+"dd f2* #w%#-;;hw ddddddddddddddddddd",
+"dd w;;X#;-@$,wd7 ddddddddddddddddddd",
+"ddd              ddddddddddddddddddd",
+"dddddddddddddddddddddddddddddddddddd",
+"dd   ddddddddddddddddddddddddddddddd",
+"d  dd dddddddddddddddddddddddddddddd",
+"d   dddd   dd  d  d  d  dd   dd  d d",
+"dd   ddddd  d  d  d  d  d  d  d    d",
+"ddd   dd    d  d  dd   dd     d  ddd",
+"d dd  d  d  d  d  dd   dd  dddd  ddd",
+"dd   ddd    dd    ddd dddd    d  ddd",
+"dddddddddddddddddddddddddddddddddddd",
+"dddddddddddddddddddddddddddddddddddd",
+"dddddddddd   ddddddddddddddddddddddd",
+"dddddddddd   ddddddddddddddddddddddd",
+"ddddddddd  d  dd  d  dd   dddddddddd",
+"ddddddddd  d  dd  d  d  d  ddddddddd",
+"dddddddd       dd   dd     ddddddddd",
+"dddddddd  ddd  d  d  d  dddddddddddd",
+"dddddddd  ddd  d  d  dd    ddddddddd",
+"dddddddddddddddddddddddddddddddddddd"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.bmp
new file mode 100644 (file)
index 0000000..48050ae
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/area.xpm
new file mode 100644 (file)
index 0000000..4cda511
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *area[] = {
+/* columns rows colors chars-per-pixel */
+"37 37 4 1",
+"  c navy",
+". c red",
+"X c #c0c0c0",
+"o c white",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...XXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...XXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXX        XX XXXX   XXXX XXXXXXXXXX",
+"XXXXXXX XXXXX XX   XXX   XX XXXXXXXXX",
+"XXXXXXX XXXX XX XXXXXXXXX XX XXXXXXXX",
+"XXXXXXX XXX XX XXXXXXXXXXX XX XXXXXXX",
+"XXXXXXX XX XX XXXXXXXXXXXXX XX XXXXXX",
+"XXXXXXX XX XX XXXXXXXXXXXXX XX XXXXXX",
+"XXXXXXX XX XX XXXXXXXXXXXXX XX XXXXXX",
+"XXXXXXX XXX XX XXXXXXXXXXX XX XXXXXXX",
+"XXXXXXX XXXX XX XXXXXXXXX XX XXXXXXXX",
+"XXXX        X X    XXX   XX XXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXX   XXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXX                           XXXXX",
+"XXXXX ooo oo oo oo oo oo oo ooo XXXXX",
+"XXXXX ooo oo oo oo oo oo oo ooo XXXXX",
+"XXXXX oooooo ooooo ooooo oooooo XXXXX",
+"XXXXX ooooooooooooooooooooooooo XXXXX",
+"XXXXX ooooooooooooooooooooooooo XXXXX",
+"XXXXX                           XXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.bmp
new file mode 100644 (file)
index 0000000..be88e6d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/authors.xpm
new file mode 100644 (file)
index 0000000..87dd512
--- /dev/null
@@ -0,0 +1,860 @@
+/* XPM */
+static char * authors_xpm[] = {
+"1000 600 257 2",
+"      c None",
+".     c #000000",
+"+     c #000063",
+"@     c #00006B",
+"#     c #08086B",
+"$     c #101073",
+"%     c #181873",
+"&     c #18187B",
+"*     c #21217B",
+"=     c #29297B",
+"-     c #292984",
+";     c #313184",
+">     c #39398C",
+",     c #42428C",
+"'     c #424294",
+")     c #4A4A94",
+"!     c #525294",
+"~     c #52529C",
+"{     c #5A5A9C",
+"]     c #6363A5",
+"^     c #6B6B63",
+"/     c #6B6BA5",
+"(     c #6B6BAD",
+"_     c #7373AD",
+":     c #7B7B5A",
+"<     c #7B7BAD",
+"[     c #7B7BB5",
+"}     c #8484B5",
+"|     c #8C8C5A",
+"1     c #8C8CBD",
+"2     c #9494BD",
+"3     c #9494C6",
+"4     c #9C9C52",
+"5     c #9C9CC6",
+"6     c #A5A552",
+"7     c #A5A5C6",
+"8     c #A5A5CE",
+"9     c #ADADCE",
+"0     c #B5B54A",
+"a     c #B5B5D6",
+"b     c #BDBD4A",
+"c     c #BDBDD6",
+"d     c #BDBDDE",
+"e     c #C6C642",
+"f     c #C6C6DE",
+"g     c #CECEDE",
+"h     c #CECEE7",
+"i     c #D6D642",
+"j     c #D6D6E7",
+"k     c #DEDE39",
+"l     c #DEDEEF",
+"m     c #E7E739",
+"n     c #E7E7EF",
+"o     c #E7E7F7",
+"p     c #EFEF31",
+"q     c #EFEFF7",
+"r     c #F7F729",
+"s     c #F7F7F7",
+"t     c #F7F7FF",
+"u     c #FFFF00",
+"v     c #FFFF18",
+"w     c #FFFFFF",
+"x     c #FFFFFF",
+"y     c #FFFFFF",
+"z     c #FFFFFF",
+"A     c #FFFFFF",
+"B     c #FFFFFF",
+"C     c #FFFFFF",
+"D     c #FFFFFF",
+"E     c #FFFFFF",
+"F     c #FFFFFF",
+"G     c #FFFFFF",
+"H     c #FFFFFF",
+"I     c #FFFFFF",
+"J     c #FFFFFF",
+"K     c #FFFFFF",
+"L     c #FFFFFF",
+"M     c #FFFFFF",
+"N     c #FFFFFF",
+"O     c #FFFFFF",
+"P     c #FFFFFF",
+"Q     c #FFFFFF",
+"R     c #FFFFFF",
+"S     c #FFFFFF",
+"T     c #FFFFFF",
+"U     c #FFFFFF",
+"V     c #FFFFFF",
+"W     c #FFFFFF",
+"X     c #FFFFFF",
+"Y     c #FFFFFF",
+"Z     c #FFFFFF",
+"`     c #FFFFFF",
+" .    c #FFFFFF",
+"..    c #FFFFFF",
+"+.    c #FFFFFF",
+"@.    c #FFFFFF",
+"#.    c #FFFFFF",
+"$.    c #FFFFFF",
+"%.    c #FFFFFF",
+"&.    c #FFFFFF",
+"*.    c #FFFFFF",
+"=.    c #FFFFFF",
+"-.    c #FFFFFF",
+";.    c #FFFFFF",
+">.    c #FFFFFF",
+",.    c #FFFFFF",
+"'.    c #FFFFFF",
+").    c #FFFFFF",
+"!.    c #FFFFFF",
+"~.    c #FFFFFF",
+"{.    c #FFFFFF",
+"].    c #FFFFFF",
+"^.    c #FFFFFF",
+"/.    c #FFFFFF",
+"(.    c #FFFFFF",
+"_.    c #FFFFFF",
+":.    c #FFFFFF",
+"<.    c #FFFFFF",
+"[.    c #FFFFFF",
+"}.    c #FFFFFF",
+"|.    c #FFFFFF",
+"1.    c #FFFFFF",
+"2.    c #FFFFFF",
+"3.    c #FFFFFF",
+"4.    c #FFFFFF",
+"5.    c #FFFFFF",
+"6.    c #FFFFFF",
+"7.    c #FFFFFF",
+"8.    c #FFFFFF",
+"9.    c #FFFFFF",
+"0.    c #FFFFFF",
+"a.    c #FFFFFF",
+"b.    c #FFFFFF",
+"c.    c #FFFFFF",
+"d.    c #FFFFFF",
+"e.    c #FFFFFF",
+"f.    c #FFFFFF",
+"g.    c #FFFFFF",
+"h.    c #FFFFFF",
+"i.    c #FFFFFF",
+"j.    c #FFFFFF",
+"k.    c #FFFFFF",
+"l.    c #FFFFFF",
+"m.    c #FFFFFF",
+"n.    c #FFFFFF",
+"o.    c #FFFFFF",
+"p.    c #FFFFFF",
+"q.    c #FFFFFF",
+"r.    c #FFFFFF",
+"s.    c #FFFFFF",
+"t.    c #FFFFFF",
+"u.    c #FFFFFF",
+"v.    c #FFFFFF",
+"w.    c #FFFFFF",
+"x.    c #FFFFFF",
+"y.    c #FFFFFF",
+"z.    c #FFFFFF",
+"A.    c #FFFFFF",
+"B.    c #FFFFFF",
+"C.    c #FFFFFF",
+"D.    c #FFFFFF",
+"E.    c #FFFFFF",
+"F.    c #FFFFFF",
+"G.    c #FFFFFF",
+"H.    c #FFFFFF",
+"I.    c #FFFFFF",
+"J.    c #FFFFFF",
+"K.    c #FFFFFF",
+"L.    c #FFFFFF",
+"M.    c #FFFFFF",
+"N.    c #FFFFFF",
+"O.    c #FFFFFF",
+"P.    c #FFFFFF",
+"Q.    c #FFFFFF",
+"R.    c #FFFFFF",
+"S.    c #FFFFFF",
+"T.    c #FFFFFF",
+"U.    c #FFFFFF",
+"V.    c #FFFFFF",
+"W.    c #FFFFFF",
+"X.    c #FFFFFF",
+"Y.    c #FFFFFF",
+"Z.    c #FFFFFF",
+"`.    c #FFFFFF",
+" +    c #FFFFFF",
+".+    c #FFFFFF",
+"++    c #FFFFFF",
+"@+    c #FFFFFF",
+"#+    c #FFFFFF",
+"$+    c #FFFFFF",
+"%+    c #FFFFFF",
+"&+    c #FFFFFF",
+"*+    c #FFFFFF",
+"=+    c #FFFFFF",
+"-+    c #FFFFFF",
+";+    c #FFFFFF",
+">+    c #FFFFFF",
+",+    c #FFFFFF",
+"'+    c #FFFFFF",
+")+    c #FFFFFF",
+"!+    c #FFFFFF",
+"~+    c #FFFFFF",
+"{+    c #FFFFFF",
+"]+    c #FFFFFF",
+"^+    c #FFFFFF",
+"/+    c #FFFFFF",
+"(+    c #FFFFFF",
+"_+    c #FFFFFF",
+":+    c #FFFFFF",
+"<+    c #FFFFFF",
+"[+    c #FFFFFF",
+"}+    c #FFFFFF",
+"|+    c #FFFFFF",
+"1+    c #FFFFFF",
+"2+    c #FFFFFF",
+"3+    c #FFFFFF",
+"4+    c #FFFFFF",
+"5+    c #FFFFFF",
+"6+    c #FFFFFF",
+"7+    c #FFFFFF",
+"8+    c #FFFFFF",
+"9+    c #FFFFFF",
+"0+    c #FFFFFF",
+"a+    c #FFFFFF",
+"b+    c #FFFFFF",
+"c+    c #FFFFFF",
+"d+    c #FFFFFF",
+"e+    c #FFFFFF",
+"f+    c #FFFFFF",
+"g+    c #FFFFFF",
+"h+    c #FFFFFF",
+"i+    c #FFFFFF",
+"j+    c #FFFFFF",
+"k+    c #FFFFFF",
+"l+    c #FFFFFF",
+"m+    c #FFFFFF",
+"n+    c #FFFFFF",
+"o+    c #FFFFFF",
+"p+    c #FFFFFF",
+"q+    c #FFFFFF",
+"r+    c #FFFFFF",
+"s+    c #FFFFFF",
+"t+    c #FFFFFF",
+"u+    c #FFFFFF",
+"v+    c #FFFFFF",
+"w+    c #FFFFFF",
+"x+    c #FFFFFF",
+"y+    c #FFFFFF",
+"z+    c #FFFFFF",
+"A+    c #FFFFFF",
+"B+    c #FFFFFF",
+"C+    c #FFFFFF",
+"D+    c #FFFFFF",
+"E+    c #FFFFFF",
+"F+    c #FFFFFF",
+"G+    c #FFFFFF",
+"H+    c #FFFFFF",
+"+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . . . ",
+"+ @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + @ + . . . ",
+"+ + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + + @ + + + + . . . ",
+"+ @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + . . . ",
+"+ + + @ + + + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + . . . ",
+"+ + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ . . . ",
+"+ @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ + @ + + + @ + + @ + + + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + @ + + + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + + @ + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + n w w > + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + l w w , @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + q w w ; + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + ~ g g 2 + @ + + + @ g w w w - + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ / w w a + + + @ # f w w w w - + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + ~ j w f ; + @ + + $ w w w w ] $ + + + @ + + @ + + @ + + @ * 2 + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + _ w w 9 + + + @ + $ w w w / # + + @ + + + @ + + @ + + - 9 a j + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + ) g w w 9 + @ + + + $ w w _ # + @ + + @ + + + @ + + + ; a w w j + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + } w w w j ] + + @ + # _ _ + + @ + + + + @ + + + @ + ; a w w w j + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + ) [ a w w w w a + + + + + + @ + + + @ + @ + + @ + + + @ { w w w w j + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + ! ( _ f w w w w w w a + + @ + @ + + @ + + + @ + + + @ + @ + - 9 w w w w j + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + ~ ] ] j w w w w w w w w l / + + @ + + + @ + + @ + + + @ + + + + + / w w w w w j + + + @ + + + @ + + @ + + @ + @ + @ + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + ) n w w w w w w w w w w n / + @ + + + @ + + + @ + + @ + + @ + @ + * 5 w w w w w j + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + + @ n w w w w w w j l w w n / + @ + + @ + + @ + + + @ + + @ + + + + * 5 n j w w w w j + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ # > > > > > + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + n w w j f f f _ 7 w n _ + + + @ + + + @ + + @ + + + @ + + @ + * 5 w 2 { w w w w j + @ > + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + $ = ] w w w w s @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + a j j - + + + 2 w w 1 + + @ + + + @ + @ = - + @ + + + @ + + + 1 w w 2 ] w w w q a + $ w + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ # / w w w w w w w * + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + + + + @ $ 7 w w 1 + + + @ + + + @ ; w w # @ + @ + + + $ * 5 q l } { w w w g + @ = w + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ / w w w w w w w w w # @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ # + @ + @ + @ + @ + + 7 w w w } + @ + + @ + @ = w w w $ + + + + @ + 7 w w [ + + { w w w g @ - w w + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + _ w w w w w w w w w w # + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ = n + + @ + + + + + @ + 7 w w w 1 + + @ + + + - w w w w # + @ + + + @ 7 w w < + + ] w w w f = w w w + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + _ w w w w w w w w w w w $ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + ; w l + + + @ + @ + + @ 7 w w w w } @ + + + @ + = w w w w $ + + @ + + 7 w w _ @ + @ { w w f @ = w q @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + [ q q w w 9 $ % $ % ; w w w # + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ , q q w n + @ + + + + @ + 9 s w w w 1 # + + @ + + - q w w w w q $ + + @ 9 s / $ # + @ + ] w w s q q n $ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + 1 w w w 9 % + + + + % w w w $ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + ) n w w l % + + @ + @ + + + a w w w w [ + @ + + @ ; n w w w w w w % @ + + a w { + + @ ] j q w w w w j * + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ < q w w 7 * + + @ + @ % w w w # @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ ) l w w w j + @ + + + + @ + 5 q w w w w [ + + + @ > j w w w w w w w % + + 5 q _ $ + + + _ w w w w w w j + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + 2 w 5 > * + + @ + + * f w w w $ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + ] w w w j ; + + + @ + + + 5 q w w w w w [ + @ + + ) w j > ! w w w w f f c q w ! + @ + + _ w w w w w l ; + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + _ n 5 * + + @ + + + @ = w w w w # + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ ) g w w j > + @ + + @ + @ + g w w w w w 5 * + + + > g j > + * w w w w w w w w [ % + @ + + _ w w w w j > + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + _ l 5 * + @ + + @ + + * a w w w { @ + + + @ + + @ + + + @ + + @ + + + @ + # 7 7 7 $ + @ + + @ + + + @ ) g w w g , + % 2 @ + + + + @ g w 1 f w w _ + + @ > f g , + + # ] w w w w w w } $ + + + @ + _ w w g ~ , + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ / l w / + + + @ + + @ + ; w w w w + + @ + + + @ + + @ + + + @ + + @ + + @ $ 7 w w w $ + + @ + + @ + + ) g w w g , * 5 7 n + + @ + + } q } 1 l w w _ + + > f w a + @ + + $ w w w w w } % + @ + + + @ _ w w 9 + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + a w w / + @ + + + @ + + ; w w w s @ + + @ + + + @ + + @ + + + @ + + @ + $ 5 w w w w % @ + + @ + + @ ) f w w g ) - 9 w w n + + @ + + l 1 % a w w w _ + , a w w a + + + @ # _ _ q } _ $ + + + @ + + + ; 9 g ) + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ ] j w w / + + + @ + + + * 2 w w w w + @ + + @ + + + @ + + @ + + + @ + + % 2 w w w w w % + + @ + + + ) f w w w 5 = 7 w w w l + + + @ _ q = + a w w w _ > a w j [ { + @ + + + + + < # + + @ + + @ + @ + + > ) + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + f w w a > + @ + + @ + + > w w w w } @ + + @ + @ + + + @ + + @ + + + @ + ; w w w w w w % @ + + + @ , f w w w j ~ ~ w w w w n + @ + / q w ; + a w w w 9 a w w 5 + + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ ) l w w { + + + + @ + + @ > w w w q + + + @ + + + @ + + + @ + + @ + + + % } w w w w w w % + @ + + @ 7 w w w w 2 * 2 w w w w n + + ] q w 9 * + a w w w w w w j ] + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + ) l w w f > + @ + + + @ + + > w w w q + @ + + + @ + + @ + + + @ + + @ + % [ q 9 9 w w w 9 $ + + @ + + 7 w w w j } 2 w w w w w q ~ { w w 9 % + + a w w w w w j ] + + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + l w w w ! + + + @ + + + @ + > w w w q + + + @ + + @ + + @ + + + @ + + @ ) w g + % w w a # + @ + + + ; a w w l ] / w q g w w w w w w w a $ + @ + a w w w w l ] + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + l w w w ) + @ + + @ + + + $ / w w w q + @ + + ; > > > > $ + @ + + + @ $ _ w j > ! w a @ + + + @ + - c w w n { % 1 n } , w w w w w w f # + + + + a w w w n { + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ j w w l , + + @ + + @ + + ) w w w w f + + + - l w w w w { + + + @ + $ _ w w w w w q + + + @ + + * f w w w _ $ 2 w 5 + > l w w w w g @ + @ + @ + a w w w _ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + l w w , + @ + + + @ + + @ ) w w w f + + @ + n w w w w w _ # @ + + + ] w w w w w w g + @ + + @ % g w w w w } 2 w s 1 + + ; n w l g + + + + + + + a w w q ] + + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + $ j w w , @ + + @ + + + @ + , q q f + + + + $ n w w w w w w _ # + @ + { w w w w q g @ + + @ + # j w w w w w w w s } + @ + + - g + @ + @ + @ + @ + 9 q q { + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + @ + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ n w w w ) + + + + @ + + + + @ + + + + @ + + q w w w w w w w w _ + + @ ] w w w g + + + @ + + @ l w w w w w w w w } @ + + @ + + + + + + + @ + + + + + + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + n w w w , @ + @ + + @ + @ + + + @ + + @ + + q w w w w w w w w _ + + ] w w w w g @ + + + @ + l w w w w w w w w } + + + @ + + @ + @ + @ + + + @ + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + n w w w , @ + + + @ + + + @ + + + @ + + @ + q w w , g w w w w _ + + / w w w w g + @ + + + l w w , f w w w w w [ + @ + + + @ + + + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + n w w w , @ + @ + + + @ + + @ + + + @ + @ j w > * + f w w w w _ + + ( w w w w g + + @ @ j w w , @ f w w w w } $ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + f s w w ] # + + + + @ + + @ + + @ + + + $ g w w % + @ f w w w } $ + ] n w w w w s g g g g w w , # + f w w < - % + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + q w w w > + @ + @ + + @ + + + @ + + @ + $ w w ) @ + + f w w w ] + ] l w w w w w w w w w w w ) @ + + ; > > % + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + q w w w > + + + + @ + + + @ + + + @ + + $ w ) @ + @ + f w w 1 % ] j w a 1 w w w w w w w w ) @ + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ q w w w > + + @ + + + @ + + @ + + + @ $ 9 s @ + + + + f w w { + 1 w 9 ; ] w w w w w q ~ ! + + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + q w w w 9 = @ + + @ + + @ + + @ + + + % s ] + + @ + + f w w a 5 j w } + * / 2 w l ] { + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + q w w w w , + @ + + @ + + + @ + + @ $ 5 q + + + @ + + f w w w w w a , + + + * _ { + + + + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + q w w w w 7 * + @ + + + @ + + + @ % 2 q < + @ + + @ + f w w w w a , + @ + + + + @ + @ + @ + + @ + @ + + + @ + + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ q w w w w w ~ + + + @ + + @ + * ( 1 q < + @ + + + + { l w w w a , + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + 2 s w w w w 2 * @ + + @ + + * 1 w q } + + + @ + @ + g w w w f > + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + n w w w w w 2 * + + + @ % 2 w q } + + @ + + + + @ g w f 7 > + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + n w w w w w w 2 , , ) , 1 q a } + + @ + + @ + + + 2 a ; + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + @ + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + a q w w w w w w w w w w w 9 + + @ + + + @ + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + l w w w w w w w w w q j 1 + + + + @ + + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + c n s w w w q l l n < + + + @ + + + @ + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + + a q q q { + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + u u u u u u u + + + @ + + + @ + + + u u u u u u u + @ + + @ + @ + + + @ + @ + r u u u u u r + + @ + @ + + @ + @ + + @ + u u u u u u u u u u u u u u p k i 4 + @ + + + @ + + @ + + + + @ + + + r u u u u u r + + + + @ + + @ + + @ + + @ + + @ + + + @ 6 i k u u u u k e 4 @ + + @ + + @ + + + @ + + @ + + @ + r u u u u u r + + + @ + + @ + + @ + + + @ + + + @ + 4 e k u u u u p k e 4 @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + u u u u u u u | @ + + @ + + + @ + | u u u u u u u + + @ + + + + @ + + + + + 4 u u u u u u u 4 @ + + + + @ + + + + @ + + u u u u u u u u u u u u u u u u u u p : + @ + + + @ + + @ + + + @ + 4 u u u u u u u 4 @ + + + @ + + @ + + + @ + + + + @ + b r u u u u u u u u u u p 4 + + @ + + @ + + + @ + + @ + + 4 u u u u u u u 4 @ + + + @ + + + + @ + + + @ + + 0 r u u u u u u u u u u u p 4 @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + u u u u u u u b + + @ + @ + + @ + b u u u u u u u + @ + + @ + + + @ + @ + @ k u u u u u u u e + + @ + + + @ + @ + + + @ u u u u u u u u u u u u u u u u u u u r : + @ + + + @ + + @ + + + @ k u u u u u u u e + @ + + + @ + + + @ + + + @ + + : p u u u u u u u u u u u u u u i + + @ + + @ + + + @ + + @ + k u u u u u u u e + @ + + + @ + @ + + @ + + + @ i u u u u u u u u u u u u u u u e + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + u u u u u u u m + + + + + @ + + + m u u u u u u u + + + @ + + @ + + @ + + + u u u u u u u u u + @ + @ + + + @ + + @ + + u u u u u u u u u u u u u u u u u u u u p + + @ + + + @ + + @ + + @ u u u u u u u u u + + @ + + + @ + + + @ + + @ + : r u u u u u u u u u u u u u u u u e + + @ + + @ + + + @ + + @ u u u u u u u u u + + @ + + + @ + + + @ + @ + e u u u u u u u u u u u u u u u u u b @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + u u u u u u u u + @ + @ + + + @ + u u u u u u u u + @ + + + @ + + @ + + @ 6 u u u u i u u u u 6 + + + @ + + + @ + + + @ u u u u u + + + + + + + + + | k u u u u u 6 + + @ + + + @ + + @ + 6 u u u u i u u u u 6 + + @ + + + @ + + @ + + + : r u u u u u i | + + + | i u u u u u u 0 @ + + @ + + @ + + @ + 6 u u u u i u u u u 6 + + @ + + + @ + + + @ + | u u u u u p 6 : + + + | e r u u u u u ^ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + u u u u u u u u 4 + @ + + @ + + 4 u u u u u u u u + + @ + + + @ + + + @ + m u u u r + r u u u m + + @ + + @ + + + @ + + u u u u u + @ + @ + @ + @ + + @ k u u u u i + + @ + @ + + + @ + + m u u u r + r u u u m + + + @ + + @ + + + @ + @ m u u u u m : + + @ + + + + : r u u u u r + + + + @ + + @ + + + m u u u r + r u u u m + + + @ + + + @ + + + + i u u u u e + + + @ + + @ + : r u u u u e @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + u u u u p u u u e @ + + @ + + @ e u u u p u u u u + @ + + @ + + + @ + + ^ u u u u e + i u u u u ^ + + + @ + + @ + + @ + u u u u u + + @ + + + + + @ + + : u u u u r + + + + + @ + + + @ ^ u u u u e + i u u u u ^ + + @ + + + @ + + @ + 6 u u u u p + + + @ + @ + @ + + : r u u u u b @ + + + @ + + + @ ^ u u u u e + i u u u u ^ + + @ + @ + + @ + @ + p u u u u ^ + @ + + @ + + + + b u u u u m + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + u u u u e u u u p + + + + @ + + p u u u e u u u u + + + @ + + @ + + @ + b u u u u 4 + 4 u u u u b + @ + + + @ + + @ + + u u u u u + @ + + @ + @ + + + @ + u u u u u + @ + @ + + @ + + + b u u u u 4 + 4 u u u u b @ + + @ + + @ + + + + p u u u u | + + @ + + + + + @ + + b u u u u p + + @ + + + @ + + b u u u u 4 + 4 u u u u b @ + + + + @ + + @ + + u u u u u + + + + @ + + @ + + ^ u u u u u + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + u u u u b k u u u ^ + @ + + + ^ u u u k b u u u u + @ + + + @ + + @ + + p u u u r + + @ r u u u p + + @ + + + @ + + + @ u u u u u + + + @ + + + + @ + + + u u u u u + + + + @ + + @ + + p u u u r + + @ r u u u p + + + + @ + + @ + @ : u u u u m + + + + @ + @ + + + @ + ^ r k b 4 ^ + + + @ + + + @ + p u u u r + + @ r u u u p + + @ + + + @ + + + + u u u u u 6 @ + + + @ + + @ + + + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + u u u u b 0 u u u 6 + + @ + + 6 u u u 0 b u u u u + + @ + + + @ + + + | u u u u i + + + i u u u u : + + @ + + + @ + + + u u u u u + @ + + + @ + + + @ + 4 u u u u k + + @ + + + @ + + | u u u u i + + + i u u u u : @ + + + @ + + + + b u u u u b + @ + + + @ + + @ + + + + + + + + + + @ + + @ + + + | u u u u i + + + i u u u u : + + @ + + + @ + @ + k u u u u r 4 + @ + + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + u u u u b ^ u u u i + + + @ + k u u u ^ b u u u u + @ + + @ + + + @ + i u u u u 4 @ + + 4 u u u u e @ + + @ + + + @ + + u u u u u + + @ + + @ + @ + + @ k u u u u i + + + @ + + + @ + i u u u u 4 @ + + 4 u u u u e + @ + + + @ + @ + k u u u u | + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + @ + + i u u u u 4 @ + + 4 u u u u e @ + + @ + + + @ + + 0 u u u u u u p 0 ^ + + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + @ + @ + u u u u 6 + p u u r + + + + @ r u u p + 6 u u u u + + + @ + + @ + + + r u u u r + + @ + @ r u u u r + + + @ + @ + + @ + u u u u u + @ + + @ + + + : 4 m u u u u u : @ + + @ + @ + + + r u u u r + + @ + @ r u u u r + + @ + + @ + + + m u u u u ^ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + r u u u r + + @ + @ r u u u r + + + @ + @ + + + @ + p u u u u u u u u p e 6 + + @ + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + + + + u u u u | + e u u u : @ + + : u u u e + | u u u u + @ + + + @ + + @ 6 u u u u i + + + + + i u u u u 4 @ + + + + @ + + + u u u u u u u u u u u u u u u u u u u u e @ + + @ + + + + @ 6 u u u u i + + + + + i u u u u 4 @ + + @ + + @ + u u u u u + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + 6 u u u u i + + + + + i u u u u 4 @ + + + + @ + + @ + : r u u u u u u u u u u u m 0 ^ + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + @ + @ + u u u u | + 4 u u u 0 + @ + 0 u u u 4 @ | u u u u + + @ + + + @ + + k u u u u : + @ + @ + : u u u u k + @ + @ + + + @ + u u u u u u u u u u u u u u u u u u u i + + @ + + + @ + + + k u u u u : + @ + @ + : u u u u k + @ + + + @ + + u u u u u + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + k u u u u : + @ + @ + : u u u u k + @ + @ + + @ + + + + : m u u u u u u u u u u u u u i : + + + @ + + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + + u u u u | + @ r u u k + @ + k u u r + + | u u u u + @ + + @ + + + @ u u u u p + + + @ + + + p u u u u + @ + + + @ + + + u u u u u u u u u u u u u u u u u p 6 + @ + + + @ + + @ + @ u u u u p + + + @ + + + p u u u u + + @ + + + @ + u u u u u + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + u u u u p + + + @ + + + p u u u u + @ + + + @ + + @ + + + + 6 p u u u u u u u u u u u u u 0 @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + u u u u | + + k u u u + + + u u u k + @ | u u u u + + + @ + + @ + 0 u u u u e + @ + + + @ + e u u u u 0 + @ + + + @ + + u u u u u u u u u u u u u u u k ^ + + + + + @ + + @ + + @ 0 u u u u e + @ + + + @ + e u u u u 0 @ + @ + + + + u u u u u + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + 0 u u u u e + @ + + + @ + e u u u u 0 + @ + + + @ + + @ + + @ + + 4 e p u u u u u u u u u u u 0 @ + + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + u u u u | + @ 6 u u u | @ | u u u 6 + + | u u u u + @ + + + @ + + m u u u u : @ + + @ + + @ : u u u u m + + @ + + @ + + u u u u u + + + ^ 6 p u u u u u i + + @ + + + @ + + + @ + m u u u u : @ + + @ + + @ : u u u u m + + + @ + @ + p u u u u : @ + + + @ + + @ + + + + @ + + + @ + + + + @ + @ m u u u u : @ + + @ + + @ : u u u u m + + @ + + + @ + + @ + + + + @ + + : 0 i r u u u u u u u u ^ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + u u u u | + + + u u u e + e u u u + @ + | u u u u + + @ + + + @ ^ u u u u p + + + @ + + @ + + p u u u u ^ + + @ + + @ + u u u u u + @ + + + + m u u u u u e + @ + @ + + @ + + + ^ u u u u p + + + @ + + @ + + p u u u u ^ + + + @ + + k u u u u | + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ ^ u u u u p + + + @ + + @ + + p u u u u ^ + + @ + + + @ + + + @ + + + + @ + @ + + | e r u u u u u i + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + @ + + + u u u u | + @ + m u u m + m u u m + + + | u u u u + @ + + @ + + e u u u u u u u u u u u u u u u u u u u e @ + + + @ + + u u u u u + + @ + + + + p u u u u u 0 + @ + + + + @ + + e u u u u u u u u u u u u u u u u u u u e @ + + + + @ b u u u u b + + @ + + + @ + + @ + @ ^ m 6 + + + @ + + + + e u u u u u u u u u u u u u u u u u u u e @ + + @ + + + @ + + @ + @ + + + @ + + + + + + m u u u u p + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + @ + u u u u | + + + b u u u ^ u u u b + @ + | u u u u + + + @ + + @ p u u u u u u u u u u u u u u u u u u u p + + @ + + + @ u u u u u + @ + + @ + + : r u u u u r + + + @ + + @ + @ p u u u u u u u u u u u u u u u u u u u p + + @ + + + 4 u u u u k + + + @ + + + @ + + + + 0 u u r e : + + @ + @ p u u u u u u u u u u u u u u u u u u u p + + + + @ + ^ 4 b k r ^ + + @ + + + @ + @ + + ^ u u u u u + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + u u u u | + @ + : u u u i u u u : + + + | u u u u + @ + + + @ | u u u u u u u u u u u u u u u u u u u u u | + + + @ + + u u u u u + + + @ + + @ + 6 u u u u u i + @ + @ + + + | u u u u u u u u u u u u u u u u u u u u u | + + @ + @ + p u u u u | + @ + @ + + + @ + @ + p u u u u p + + + @ | u u u u u u u u u u u u u u u u u u u u u | + @ + + @ r u u u u b + + + @ + + @ + + + @ + u u u u u + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + u u u u | + + @ + p u u u u u p + + @ + | u u u u + + @ + + + i u u u u u u u u u u u u u u u u u u u u u e + @ + + @ + u u u u u + @ + + + @ + + + k u u u u u : + + + + @ + i u u u u u u u u u u u u u u u u u u u u u e + @ + + + + b u u u u p + + + + @ + + @ + + b u u u u u 0 + @ + + i u u u u u u u u u u u u u u u u u u u u u e + + @ + + k u u u u r + + @ + + @ + + @ + + 4 u u u u p + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + u u u u ^ + + + + i u u u u u e + + + @ ^ u u u u + @ + + @ + r u u u u : + + + + + + + + + + + ^ u u u u r + + @ + + + u u u u u + + @ + + + @ + @ + r u u u u k + @ + + + @ r u u u u : + + + + + + + + + + + ^ u u u u r + + + @ + + + p u u u u m ^ + + + @ + + + 0 u u u u u r + + + @ + r u u u u : + + + + + + + + + + + ^ u u u u r + + + + + 6 u u u u u m ^ + + + + @ + + + : r u u u u e + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + u u u u + @ + @ + 4 u u u u u 4 @ + + + + u u u u + + + @ + 6 u u u u m + + @ + @ + @ + @ + @ + + m u u u u 6 + + @ + + u u u u u + @ + + @ + + + + + 0 u u u u u 4 @ + @ + 6 u u u u m + + @ + @ + @ + @ + @ + + m u u u u 6 @ + + @ + + : r u u u u r e | + + @ 4 k u u u u u u 4 + @ + + 6 u u u u m + + @ + @ + @ + @ + @ + + m u u u u 6 @ + @ + + m u u u u u r e | @ + + + | i u u u u u r ^ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + u u u u + + + + @ + u u u u u + + @ + @ + u u u u + @ + + + k u u u u 0 + @ + + + @ + + + + + @ + 0 u u u u i + + + @ + u u u u u + + + @ + + @ + @ + + m u u u u p + + + + k u u u u 0 + @ + + + @ + + + + + @ + 0 u u u u i + + + @ + @ + 6 u u u u u u u u u u u u u u u u u i + + + @ + k u u u u 0 + @ + + + @ + + + + + @ + 0 u u u u i + + + + @ : r u u u u u u u u u u u u u u u u u u 6 + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ u u u u + @ + + + + k u u u i + + @ + + + u u u u + + @ + ^ u u u u u ^ + + + @ + + + @ + @ + + + ^ u u u u u ^ + + + @ u u u u u + @ + + + @ + + + @ + : u u u u u b @ + ^ u u u u u ^ + + + @ + + + @ + @ + + + ^ u u u u u ^ + + + @ + + + : r u u u u u u u u u u u u u u e @ + @ + + ^ u u u u u ^ + + + @ + + + @ + @ + + + ^ u u u u u ^ + @ + + + : r u u u u u u u u u u u u u u u u 0 + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + u u u u + + @ + @ + 0 u u u 0 @ + + + @ + u u u u + @ + + 0 u u u u k + + @ + + @ + + @ + + + @ + + m u u u u 0 @ + + + u u u u u + + @ + + + @ + + + @ + e u u u u u ^ + 0 u u u u k + + @ + + @ + + @ + + + @ + + m u u u u 0 @ + + + @ + @ + + e u u u u u u u u u u u m | + + + + @ + 0 u u u u k + + @ + + @ + + @ + + + @ + + m u u u u 0 @ + + @ + + + i u u u u u u u u u u u u u k | @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + u u u u + @ + + + @ ^ u u u ^ + + @ + + + u u u u + + + @ m u u u u 0 + @ + + + + @ + + + @ + + @ + 0 u u u u k + + @ + u u u u u + @ + + @ + + @ + + + @ + r u u u u k + m u u u u 0 + @ + + + + @ + + + @ + + @ + 0 u u u u k + + @ + + + + + @ + + 0 i r u u u r k e : + + @ + @ + + + m u u u u 0 + @ + + + + @ + + + @ + + @ + 0 u u u u k + + + + @ + + + + 6 i k r u u u u m k b : + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + + + @ + + @ + + + + + + + + @ + + @ + + + + + @ + + + + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + + @ + + + + + + + @ + + + + @ + + @ + + + + + + + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + + @ + + @ + @ + + @ + @ + + + + + + + @ + @ + + + + @ + + + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + + @ + + + @ + @ + + + + + + + + + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + @ + + + @ + @ + @ + + + @ + + + @ + + @ + @ + @ + @ + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + @ + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + @ + + + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + @ + @ + + + @ + @ + + + + @ + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + + @ + + + + + @ + @ + + + + @ + + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + u u u u u ^ + @ + + + : u u u u u @ + + + @ + + @ k u u u i + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ k + + @ + + u u u + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ u u u u u u u u u r k 0 + @ + + @ + + + @ + + + @ + + @ + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + k u u u i + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + u u u + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ u u u + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + ^ e k u u u m i : @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + k @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + k u u u i + + @ + + @ + + + @ + + ^ e k u u r k 0 ^ + + + @ + + + @ + @ + + + @ + + @ + + u u u + + + @ + + + @ + + @ + + + @ + + @ + + k @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + u u u + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + u u u + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ u u u + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + u u u u u 0 @ + + @ + 0 u u u u u + + @ + + + @ + u u u u u + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ 4 r u + @ + + @ u u u + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + u u u u u u u u u u u u m + + + + @ + + @ + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ u u u u u + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ u u u + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + u u u + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + e u u u u u u u u u e @ + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + 4 r u + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + u u u u u + + + @ + + @ + + + @ 0 u u u u u u u u r 6 + + + @ + + + @ + + @ + + + @ + + @ u u u + @ + + @ + + + @ + + @ + + + @ + + 4 r u + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + u u u @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + u u u + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + u u u + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + u u u u u k + @ + + @ k u u u u u + @ + + @ + + 6 u u u u u 6 + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + u u u + + + @ + + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + u u u u u u u u u u u u u b @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + 6 u u u u u 6 + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + u u u + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + i u u u u u u u u u u u k + + + @ + @ + + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + u u u + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + 6 u u u u u 6 @ + + @ + + @ + + 4 u u u u u u u u u u u | @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ u u u + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + + + + u u u + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ u u u + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + u u u u u r + + + @ + u u u u u u + + + @ + + @ p u u e u u m + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ u u u + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + u u u + + + + + + ^ i u u p + + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + m u u i u u k + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + u u u + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + + @ + + + @ + b u u u i 4 + + + 6 p u u u 6 @ + + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + u u u + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + m u u i u u k + + + + @ + + @ + m u u k : + + + 4 k u u k + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + u u u + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + @ + u u u + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + u u u + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + u u u m u u | + @ + | u u m u u u + @ + + + @ ^ u u r + r u u ^ + + + @ + + + @ : k u u k | + u u u + + + @ u u u + 6 m u u k : + @ + + @ + @ + 6 m u u m b + + + @ u u u u u u u u @ + u u u + + @ + + + 0 k u u r k 4 @ + @ + + + @ + @ + @ + u u u + @ + @ + + + + u u u + @ + + @ + 6 m u u m b + + + @ + + + 6 k r u u p k 6 + + @ + + + + 4 i r u r k | + + @ + + @ u u u + 6 m u u k : @ + + + @ + 0 k u u u p i ^ + + @ + + u u u + 6 m u u k : + @ + + + @ + + 0 k u u r k 4 @ + + + @ + + 6 m u u m b + + @ + + + @ + + @ + + + @ ^ u u r + r u u ^ + + + @ + @ + + u u u + 6 m u u k : @ + @ + + + : k u u k | + u u u @ + + + u u u + + @ + + + 4 i r u r k | + + @ + + @ + + : k u u k | + u u u + @ + + u u u + k u r i + + @ 0 k u u u p i ^ + + + @ + u u u @ b m u u k : @ + + + + u u u + : k u u k ^ + + @ u u r + + + + @ + + r u u + @ + + + @ + + + ^ u u u 6 + + @ + + + + m u u p + + @ + + 4 i r u r k | + + + @ + @ u u u + b p u p 4 + @ b r u m 4 + @ + + + @ + u u u + b m u u k : @ + + + @ u u u + + @ + + u u u + + u u u u u u u u + + @ + + 6 m u u m b + + + @ + + u u u + k u r i + + + + @ + + @ + + ^ u u r + r u u ^ + @ + + + @ + + u u u + @ + @ + @ ^ u u u + + @ + 6 k r u u p k 6 + @ + + + u u u + @ + + @ 6 k r u u p k 0 @ + + u u u u u u u u + @ + + 6 m u u m b + + + @ + + @ ^ e r u p b + u u u + @ + + @ + + + @ + + + @ 0 k u u u p i ^ + + + + @ u u u @ 6 m u u k : @ + + @ + @ 0 k u u u p i ^ + + @ + + u u u + @ u u r + + + @ + + @ r u u + @ + + 6 k r u u p k 6 + + + @ + u u u + + @ + + 6 k r u u p k 6 + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + u u u e u u b + + + e u u e u u u + + @ + + + b u u e + i u u 0 @ + + @ + @ + : r u u u u u 4 u u u + @ + + u u u i u u u u u r : + @ + + + + m u u u u u u m + + + u u u u u u u u + + u u u @ + + + @ m u u u u u u u e + + + @ + + + + + + + u u u + + @ + + @ + + u u u + + @ + + m u u u u u u m + + + + @ i u u u u u u u u p : + @ + @ k u u u u u u u e + + @ + + u u u i u u u u u r : + @ + + m u u u u u u u r : + + @ + u u u i u u u u u r : + @ + + + @ m u u u u u u u e + @ + + @ p u u u u u u m + + @ + + + @ + + @ + + + b u u i + i u u 0 @ + + @ + + + @ u u u i u u u u u r : + + + @ : r u u u u u 4 u u u + + @ + u u u @ + + + @ k u u u u u u u e + + @ + + @ : r u u u u u 4 u u u + + @ + u u u k u u u k + + m u u u u u u u r : + + @ + u u u i u u u u u r : + @ + + u u u | u u u u u r ^ + + k u u 4 @ + + @ + 4 u u i + + @ + + + @ + + 0 u u i + + @ + @ + + + ^ p e : + + + @ k u u u u u u u e @ + + @ + u u u k u u u u u : e u u u u u | + @ + + + + u u u i u u u u u r : + @ + + u u u + @ + @ + u u u @ + u u u u u u u u + @ + + m u u u u u u m + + + @ + u u u k u u u k + + @ + + + @ + + @ b u u i + i u u 0 @ + + @ + + + @ u u u k ^ + + + + + + + + @ + + i u u u u u u u u p : + @ + u u u + + + @ i u u u u u u u u p : + u u u u u u u u + + @ p u u u u u u m + + + + @ : r u u u u u i u u u + + + @ + + @ + + @ + + m u u u u u u u r : + @ + + u u u i u u u u u r : + + + @ p u u u u u u u r : + + @ + u u u + + k u u 4 @ + + @ + 4 u u i + + + i u u u u u u u u p : + + + u u u + @ + + i u u u u u u u u p : + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + u u u b k u m + + @ m u k b u u u + @ + + @ + p u u : + : u u p + + @ + + + + r u u u u u u r u u u + + @ + u u u u u u u u u u i + + + @ + k u u u u u u u u m + + u u u u u u u u + @ u u u + + @ + m u u u u u u u u u 4 @ + + @ + @ + @ + + u u u + @ + + + + | m u u k @ + + + k u u u u u u u u m + + @ b u u e ^ + + 4 k u u k + + + i u u u u u u u u u e @ + + @ u u u u u u u u u u i + + + b u u m ^ + + i u u i + + + + u u u u u u u u u u i + + @ + + m u u u u u u u u u 4 + @ + k u u u u u u u u m + + @ + + + @ + + @ + + p u u : + : u u p + + @ + + @ + + u u u u u u u u u u i + @ + + r u u u u u u r u u u + @ + + u u u + + @ + i u u u u u u u u u e @ + + @ + r u u u u u u r u u u + @ + + u u u u u u u 0 + b u u m ^ + + i u u i + + + + u u u u u u u u u u r + + @ + u u u r u u u u u u e + @ 6 u u k @ + + + @ k u u 6 + + + @ + + @ + @ k u u 4 + @ + + + @ + + + + + + @ + + i u u u u u u u u u e @ + + + u u u u u u u u u r u u u u u u k @ + + @ + + u u u u u u u u u u r + + + @ u u u + + + + + u u u + + u u u u u u u u + + + k u u u u u u u u m + + + + u u u u u u u 0 + @ + + @ + + + @ + p u u : + : u u p + + + + @ + + + k u u u u i 6 + @ + @ + + + @ b u u e ^ + + 4 k u u k + + + u u u + @ + b u u e ^ + + 4 k u u k + u u u u u u u u + @ k u u u u u u u u m + + @ + r u u u u u u u u u u + @ + + + @ + + @ + + b u u m ^ + + i u u i + + + @ u u u u u u u u u u i + @ + b u u k ^ + + i u u i + + + @ u u u + @ 6 u u k + @ + + @ k u u 6 + @ b u u e ^ + + 4 k u u k + @ + u u u + + + b u u e ^ + + 4 k u u k + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + u u u 4 b u u + + + u u 0 4 u u u + + + @ + : u u p + + @ r u u : + + @ + @ 0 u u u 0 + + 0 u u u u + @ + + u u u r 6 + + m u u r + + + @ 6 u u r 6 + + 6 r u u 4 @ + + u u u + + + @ + u u u + @ + 6 u u u 0 + + : m u u p + + + + @ + + + @ + u u u u u u u u u u u u u | + @ + 6 u u r 6 + + 6 r u u 4 @ + r u u + + @ + + | p e : @ + | u u u i ^ + ^ i u u u | + + + u u u r 6 + + m u u r + + @ r u u : + + + ^ u u r + + @ + u u u r 6 + + m u u r + + + @ 6 u u u 0 + + : m u u p + + 6 u u r 6 + + 6 r u u 4 @ + + @ + + + @ + + : u u p + + @ r u u : + + @ + + + @ u u u r 6 + + m u u r + + + 0 u u u 0 + + 0 u u u u + + + @ u u u + @ + | u u u i ^ + ^ i u u u | + + + 0 u u u 0 + + 0 u u u u + + + @ u u u p : + + @ + p u u : + + + ^ u u r + + @ + u u u u 0 + + 0 u u u 0 @ + + u u u r 6 + + i u u p + + + r u u + @ + + @ u u r + + @ + + @ + + + + r u u + @ + + @ + + @ + + @ + + @ + | u u u i ^ + ^ i u u u | + @ + u u u p | + e u u u r | + e u u r + + + @ + + u u u u 0 + + 0 u u u 0 @ + + u u u + @ + @ + u u u + @ + + u u u + + + @ + 6 u u r 6 + + 6 r u u 4 @ + + u u u p : + + @ + + + @ + + @ + + : u u p + + @ r u u : @ + + + @ + @ ^ r u u u u u u i 4 + @ + + + r u u + + @ + + | p e : @ + + u u u + + + r u u + + @ + + | p e : @ + + u u u + + + @ 6 u u r 6 + + 6 r u u 4 @ + 0 u u u 0 + + 0 u u u u + + @ + + + @ + + + @ p u u : + + + ^ u u r + + + + u u u r 6 + + m u u r + + + p u u : + + + ^ u u r + + + + u u u + + + r u u + + @ + + u u r + + + r u u + + @ + + | p e : @ + + u u u + @ + r u u + + @ + + | p e : @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + u u u | : u u 4 @ 4 u u : | u u u + @ + + + e u u e + @ + b u u e @ + + + + k u u b @ + @ + b u u u + + + @ u u u 6 + + + : u u u + @ + + k u u 6 + + + + 6 u u i + + @ u u u + @ + + + u u u + + + k u u b @ + @ + ^ p e : + @ + + + @ + + + + u u u u u u u u u u u r 6 + + + @ k u u 6 + + + + 6 u u i + + u u u i : + @ + + + + @ + + i u u i + + + + + k u u e @ + + u u u 6 + + + : u u u + + + + + + + @ + + + u u u + + + + u u u 6 + + + : u u u + @ + + k u u b @ + @ + ^ p e : + + k u u 6 + + + + 6 u u i + + @ + + @ + + + @ e u u e + @ + b u u e @ + + + @ + + u u u 6 + + + : u u u + + @ k u u b @ + @ + b u u u + @ + + u u u + + + i u u i + + + + + k u u e @ + @ k u u b @ + @ + b u u u + @ + + u u u 0 + @ + + @ + + + + @ + + + u u u + + + + u u u b @ + @ + b u u k + + @ u u u 6 + + + ^ u u u + @ + i u u 0 + @ + 0 u u e + + + @ + + @ + @ + u u u + + + @ + + + + @ + + @ + + + i u u i + + + + + k u u e + + + u u u 4 + + @ u u u 6 + + ^ u u u + @ + + @ + u u u b @ + @ + b u u k + @ + u u u + + @ + + u u u + + + @ u u u + @ + + @ k u u 6 + + + + 6 u u i + @ + u u u 0 + @ + + @ + + + @ + + @ + e u u e + @ + b u u e + @ + + @ + + + : p u u u u u u u p b + @ + u u u i : + @ + + + + @ + @ + u u u + @ + u u u i : + @ + + + + @ + + + u u u + @ + + k u u 6 + + + + 6 u u i + + k u u b @ + @ + b u u u + @ + + @ + + + @ + + + + + + @ + + + u u u + @ + + u u u 6 + + + : u u u + + + + + + + @ + + + u u u + @ + + u u u + @ + i u u 6 + + @ 0 u u e + @ + u u u i : + @ + + + + @ + + + u u u + + + u u u i : + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + u u u | + r u i + i u p + | u u u + + @ + @ r u u ^ + + + ^ u u r + + @ + + r u u ^ + + + @ : u u u + @ + + u u u ^ + @ + + u u u + + + @ p u u + + @ + + + u u k + + + u u u + + @ + + u u u + @ + r u u ^ + + + + + + + + @ + + @ + + @ + @ + u u u u u u u u u r 6 + + + @ + + p u u + + @ + + + u u k + + k u u u u p e 4 + @ + + + @ p u u : + + @ + @ : u u p + + + u u u ^ + @ + + u u u + @ + @ + @ + + 4 b e u u u + @ + + u u u ^ + @ + + u u u + + + @ r u u ^ + + + + + + + + @ + p u u + + @ + + + u u k + + + + @ + + @ + + r u u ^ + + + ^ u u r + + @ + + @ + u u u ^ + @ + + u u u + @ + r u u ^ + + + @ : u u u + + @ + u u u + @ + p u u : + + @ + @ : u u p + + + r u u ^ + + + @ : u u u + + @ + u u u | + + @ + + + @ + + + 4 b e u u u + @ + + u u u ^ + + + @ ^ u u r + + + u u u ^ + @ + + u u u + + + 4 u u p + + @ p u u | + @ + + + @ + + + + u u u + @ + + + @ + + + @ + + + @ + p u u : + + @ + @ : u u p + + @ u u u + @ + + u u u ^ + + + u u u + + + @ + + u u u ^ + + + @ ^ u u r + + + u u u + @ + + + u u u + @ + + u u u + + @ + + p u u + + @ + + + u u k + + + u u u | + + @ + + @ + + + @ + + @ r u u ^ + + + ^ u u r + + @ + + + @ + + + 6 k u u u u u u u k + + k u u u u p e 4 + @ + + + + + u u u + + + k u u u u p e 4 + @ + + + @ + u u u + + @ + p u u + + @ + + + u u k + + r u u ^ + + + @ ^ u u u + + + @ + + @ + + @ + @ + @ + + 4 b e u u u + + @ + u u u ^ + @ + + u u u + @ + @ + @ + + 4 b e u u u + + @ + u u u + + + 4 u u p + + + p u u | + + + k u u u u p e 4 + @ + + + @ + u u u + @ + k u u u u p e 4 + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + u u u | + k u p + p u e + | u u u + @ + + 4 u u k + + @ + + m u u 4 @ + + + u u u + + @ + + + u u u + + @ + u u u + + + + @ u u u + @ + + u u u u u u u u u u u u + @ + u u u + @ + + @ u u u + + + u u u + + @ + @ + + @ + + + @ + + @ + + + + u u u + + ^ b u u u e + + @ + + + u u u u u u u u u u u u + + : r u u u u u u r i + @ + + u u u + @ + + + + + u u u + @ + u u u + + + + @ u u u + + @ + + 0 k u u u u u u u + + @ + u u u + + + + @ u u u + @ + + u u u + + @ + @ + + @ + + @ u u u u u u u u u u u u + @ + + + @ + + @ 4 u u k + + @ + + m u u 4 @ + + + + + u u u + + + + @ u u u + + + u u u + + @ + + + u u u + @ + + u u u + + + u u u + @ + + + + + u u u + @ + u u u + + @ + + + u u u + @ + + u u u + @ + + + @ + + 0 k u u u u u u u + + @ + u u u + + @ + + + u u u + @ + u u u + + + + @ u u u + @ + + r u u : + : u u p + + + + @ + + + @ + + u u u + + @ + + @ + @ + + @ + + + + u u u + @ + + + + + u u u + + + u u u + + @ + u u u + + @ + u u u + @ + + + @ u u u + + @ + + + u u u + @ + u u u + + + @ + u u u + + @ + u u u + @ + + + u u u u u u u u u u u u + @ + u u u + @ + + + @ + + @ + + + @ 4 u u k + + @ + + m u u 4 @ + + @ + + + + @ + + + 4 e m u u u u b + : r u u u u u u r i + @ + @ + u u u + @ + : r u u u u u u r i + @ + + + u u u + @ + + u u u u u u u u u u u u + + u u u + + @ + + + u u u + @ + + + @ + + @ + + + + 0 k u u u u u u u + @ + + u u u + + + + @ u u u + + @ + + 0 k u u u u u u u + @ + + u u u + @ + + r u u : @ : u u p + + @ + : r u u u u u u r i + @ + + + u u u + + + : r u u u u u u r i + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + u u u | + 6 u u | u u 4 + | u u u + + + @ i u u u u u u u u u u u i + + @ + u u u + @ + + @ + u u u + @ + + u u u + @ + + + u u u + + @ + u u u u u u u u u u u u + + + u u u + + + @ + u u u + @ + u u u + @ + + + @ + + @ + + + @ + + + @ + + u u u + @ + + 0 u u u 0 @ + + @ + u u u u u u u u u u u u + @ + ^ e u u u u u u u r : + + u u u + + @ + @ + + u u u + + + u u u + @ + + + u u u + @ + ^ r u u u k 6 : u u u + @ + + u u u + @ + + + u u u + + @ + u u u + @ + + + @ + + @ + + u u u u u u u u u u u u + + @ + + + @ + + i u u u u u u u u u u u i + + @ + @ + u u u + @ + + + u u u + @ + u u u + @ + + @ + u u u + + + @ u u u + @ + u u u + + @ + @ + + u u u + + + u u u + @ + + @ + u u u + + + @ u u u + + + @ + + ^ r u u u k 6 : u u u + @ + + u u u + @ + + @ + u u u + + + u u u + @ + + + u u u + + @ + e u u i @ i u u b + @ + + + @ + + @ + + k u u 4 @ + + @ + + + + ^ p e : @ + u u u + + @ + @ + + u u u + @ + u u u + @ + + u u u + @ + + u u u + + @ + + + u u u + @ + + @ + u u u + + + u u u + @ + + + u u u + @ + + u u u + + + @ + u u u u u u u u u u u u + + + u u u + + + @ + + + @ + + @ + + i u u u u u u u u u u u i + + @ + + @ + + + @ + @ + @ + ^ i u u p + + ^ e u u u u u u u r : + + + u u u + + @ + ^ e u u u u u u u r : + @ + u u u + + + @ u u u u u u u u u u u u + @ u u u + @ + + @ + u u u + + @ + + + @ + + + @ ^ r u u u k 6 : u u u + + + @ u u u + @ + + + u u u + @ + ^ r u u u k 6 : u u u + + + @ u u u + + @ + e u u i + i u u b + + + @ + ^ e u u u u u u u r : + @ + u u u + @ + + ^ e u u u u u u u r : + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + u u u | + ^ u u p u u + @ | u u u + @ + + u u u u u u u u u u u u u + @ + + r u u ^ + + + + : u u u + + + @ u u u + + @ + + u u u + @ + + r u u + + + + + + + + + @ + + u u u + @ + + + u u u + + + r u u : + + @ + + + @ + + @ + + + @ + + @ + u u u + + + @ + k u u r + + + + @ r u u + + + + + + + + + @ + + + + + 4 e p u u u u m + + p u u : @ + + + @ : u u p + + @ u u u + + @ + + u u u + + + k u u e + + + + u u u + + + @ u u u + + @ + + u u u + @ + + r u u : + + @ + + + @ + + + r u u + + + + + + + + + @ + + @ + + + @ + u u u u u u u u u u u u u + @ + + + + u u u + + @ + + u u u + + + r u u ^ + + + + : u u u + @ + + u u u + + + p u u : @ + + + @ : u u p + + @ r u u ^ + + + + : u u u + @ + + u u u + @ + + @ + k u u e + + + + u u u + + + @ u u u : + + @ + ^ u u r + + @ u u u + + @ + + u u u + @ + + : u u r + r u u ^ + + @ + + @ + + + @ + e u u k @ + + + @ + @ + e u u p + + p u u : @ + + + @ : u u p + + + u u u + + + @ u u u + + + @ u u u + @ + + @ + u u u : + + @ + ^ u u r + + @ u u u + + @ + ^ u u u + + + @ u u u + @ + + + r u u + + + + + + + + + @ + + u u u + @ + + @ + + + @ + + @ + u u u u u u u u u u u u u + @ + + + r u u ^ + + @ + + + + + u u u + + + + + 4 e p u u u u m + + @ u u u + @ + + + + + 4 e p u u u u m + + + u u u + @ + + r u u + + + + + + + + + @ + r u u ^ + + + + ^ u u u + @ + + @ + + + @ + + k u u e + + + + u u u + @ + + u u u + + @ + + u u u + + + k u u e + + + + u u u + @ + + u u u + @ + + : u u r + r u u ^ + @ + + + + + + 4 e p u u u u m + + + u u u + + @ + + + + 4 e p u u u u m + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + u u u | + + m u u u k + + | u u u + + @ 6 u u u u u u u u u u u u u 6 + + + k u u b + @ + @ b u u u + @ + + u u u + @ + @ + u u u + + + + k u u 6 + @ + @ + @ + + @ + + u u u + + @ + + u u u + @ + k u u b @ + + @ ^ p e : + + @ + + + @ + + + u u u + @ + + @ ^ r u u b @ + + + k u u 6 + @ + @ + @ + + + @ + @ + @ + + + ^ e u u u + + i u u i + + @ + + k u u e + + + u u u + @ + @ + u u u + @ + u u u + @ + @ + u u u + @ + + u u u + @ + @ + u u u + + + + k u u b @ + + @ ^ p e : @ + k u u 6 + @ + @ + @ + + + @ + + @ + + + 6 u u u u u u u u u u u u u 6 + + @ + + u u u + @ + @ + u u u + @ + k u u b + @ + @ b u u u + + @ + u u u + @ + i u u i + + @ + + k u u e + + + k u u b + @ + @ b u u u + + @ + u u u + + @ + + + u u u + @ + @ + u u u + @ + + u u u i @ + + + b u u k + @ + u u u + @ + @ + u u u + + + @ + p u u k u u m + + + + @ + + @ + + + @ ^ u u u 6 + @ + + + + : u u u b + + i u u i + + @ + + k u u e + @ + u u u + @ + + u u u + @ + + u u u + + + @ + + u u u i @ + + + b u u k + @ + u u u : @ + + 6 u u u + @ + + u u u + + @ + + k u u 6 + @ + @ + @ + + @ + + u u u + + @ + + @ + + + @ + + 6 u u u u u u u u u u u u u 6 + + @ + k u u i + + + + @ + + | u u r + + @ + @ + + + ^ e u u u + + + u u u + + + @ + @ + + + + ^ e u u u + @ + u u u + + @ + k u u 6 + @ + @ + @ + + + + k u u b + @ + + b u u u + + + @ + + @ + + @ + u u u + @ + @ + u u u + + @ + u u u + @ + @ + u u u + @ + u u u + @ + @ + u u u + + @ + u u u + + + @ + p u u k u u m + + + + @ + @ + @ + + + ^ e u u u + @ + u u u + @ + + @ + @ + + + ^ e u u u + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + u u u ^ + + e u u u 0 @ + ^ u u u + @ + k u u 6 + + + + + + + 6 u u k @ + + 0 u u u 0 @ + b u u u u + + @ + u u u + + + + + u u u + @ + @ 6 u u u b + + + 0 p e : + @ + u u u : @ ^ + + u u u + + + 6 u u u 0 @ + : m u u p + + + @ + + + @ + + u u u + + @ + + + b u u r + + @ + 6 u u u b + + + 0 p e : @ + : e p : + + @ + + u u r + + | u u u i ^ + ^ i u u u | + @ + u u u + + + + + u u u + + @ u u u ^ + + + 0 u u u + + @ + u u u + + + + + u u u + @ + @ 6 u u u 0 @ + : m u u p + + 6 u u u b + + + 0 p e : @ + + @ + + @ + k u u 6 + + + + + + + 6 u u k @ + + @ + u u u + + + + + u u u + + + 0 u u u 0 @ + b u u u u + @ + + u u u + + + | u u u i ^ + ^ i u u u | + @ + 0 u u u 0 @ + b u u u u + @ + + u u u + @ + + @ + u u u ^ + + + 0 u u u + + @ + u u u u b + @ 0 u u u 6 + + + u u u + + + + + u u u + @ + + + b u u u u u 6 + @ + + + @ + + @ + + + + e u u u i | + @ ^ b u u u r + + + | u u u i ^ + ^ i u u u | + + + u u u + + @ + u u u + + @ + u u u + @ + + + @ u u u u b + @ 0 u u u 6 + + + p u u k + + 6 r u u u + + @ + u u u : @ ^ + @ 6 u u u b + + + 0 p e : + @ + u u u + @ + + + + @ + + + @ + k u u 6 + + + + + + + 6 u u k @ + + + | u u u k 4 @ + + : b r u u i + : e p : + + @ + + u u r + + @ u u u + @ + : e p : @ + + + + u u r + + + u u u : @ ^ + 6 u u u b + + + 0 p e : @ + 6 u u u 0 @ + 0 u u u u + @ + + + @ + + @ + + u u u ^ + + + 0 u u u + @ + + u u u + + + + + u u u + + @ u u u ^ + + + 0 u u u + @ + + u u u + @ + + + b u u u u u 6 + @ + + @ : e p : + + @ + + u u r + + + u u u + + + : e p : + + @ + + u u r + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + u u u + @ + 4 u u u : + @ + u u u + + ^ u u u + @ + @ + @ + + + u u u ^ + @ + r u u u u u u r u u u + @ + + u u u + @ + @ + u u u + + @ + + m u u u u u u u u u k + + @ r u u u u i + + u u u + @ + + m u u u u u u u u u 6 + @ + + @ + + @ + + u u u + @ + + + + + p u u i + + + + m u u u u u u u u u k + + k u u m 4 + + ^ e u u b + + + k u u u u u u u u u e @ + + + u u u + @ + @ + u u u + @ + k u u i + + 0 u u u u + @ + + u u u + @ + @ + u u u + + @ + + m u u u u u u u u u 6 + + @ p u u u u u u u u u k + + @ + + + + ^ u u u + @ + @ + @ + + + u u u ^ + + + @ u u u + @ + @ + u u u + @ + @ r u u u u u u r u u u + + + @ u u u + @ + + k u u u u u u u u u e @ + + @ + r u u u u u u r u u u + + + @ u u u + + + @ + + k u u i + + 0 u u u u + @ + + u u u u u u u u u u p + + @ + u u u + @ + @ + u u u + + @ + + ^ u u u u u + + + @ + + + @ + + @ + @ + @ p u u u u u u u u u u u 4 + @ + + k u u u u u u u u u e @ + @ + u u u + @ + + u u u + @ + + u u u + + @ + + + u u u u u u u u u u p + + @ + i u u u u u u u u u u + @ + + p u u u u k + + + m u u u u u u u u u k + + @ u u u + + + @ + + @ + @ + + ^ u u u + @ + @ + @ + + + u u u ^ + @ + + k u u u u u u u u u u u r ^ + k u u m 4 + + ^ e u u b + + + u u u + + @ k u u m 4 + @ ^ e u u b + @ + p u u u u k + + m u u u u u u u u u k + + + p u u u u u u u u u u + + @ + + + @ + + + @ k u u i + + 0 u u u u + + + @ u u u + @ + @ + u u u + @ + k u u i + + 0 u u u u + + + @ u u u + + @ + + ^ u u u u u + + + @ + + k u u m 4 + + ^ e u u b + @ + u u u + @ + k u u m 4 + + ^ e u u b + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + u u u + + @ + u u p + + + + u u u + @ 0 u u i + + + + @ + + @ + k u u 0 @ + + | u u u u u u 4 u u u + + + @ u u u + + @ + + u u u + @ + + + : p u u u u u u u m + + @ + e u u u u p + + u u u + + @ + ^ m u u u u u u u e + + + @ + + @ + + @ + u u u + + + @ + @ + | u u u ^ + @ + : p u u u u u u u m + + @ ^ m u u u u u u u u k + @ + @ + k u u u u u u u e + + @ + + u u u + + @ + + u u u + + + : r u u u u u u r u u 4 + @ + u u u + + @ + + u u u + @ + + + ^ m u u u u u u u e + @ + + : p u u u u u u u m + + @ + + @ + + 0 u u i + + + + @ + + @ + k u u 0 @ + + + u u u + + @ + + u u u + + @ + | u u u u u u 4 u u u + @ + + u u u + + @ + + k u u u u u u u e + + @ + + + | u u u u u u 4 u u u + @ + + u u u + @ + + + @ : r u u u u u u r u u 4 + @ + u u u i u u u u u r : + + + @ u u u + + @ + + u u u + @ + + @ + m u u u k @ + + @ + @ + + @ + + + + @ + + e u u u u u u u u r 4 + + + @ + + k u u u u u u u e + + @ + + u u u + + + @ u u u + + + @ u u u + @ + + @ + u u u i u u u u u r : + + + @ ^ r u u u u u e u u u + + + + i u u u u k + + + : p u u u u u u u m + + @ + u u u + @ + + @ + + + + @ + 0 u u i + + + + @ + + @ + k u u 0 @ + + @ + k u u u u u u u u u r : + + ^ m u u u u u u u u k + @ + + u u u + @ + ^ m u u u u u u u u k + + + + i u u u u k + + : p u u u u u u u m + + @ + : r u u u u u i u u u + @ + + @ + + + @ + + : r u u u u u u r u u 4 @ + + u u u + + @ + + u u u + + + : r u u u u u u r u u 4 @ + + u u u + @ + + @ + m u u u k @ + + + @ + ^ m u u u u u u u u k + + + + u u u + + @ ^ m u u u u u u u u k + + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + u u u + @ + + k u i + @ + + u u u + + m u u 4 + @ + + + @ + + @ 4 u u k + + + + : k u u k 4 + u u u + @ + + u u u + @ + + + u u u + + + @ + + + b m u u u k 6 + + + + + + e r u r e + + u u u + @ + + + + b m u u r k | + @ + + + @ + + @ + + + u u u + @ + + @ + + + k u u k + + + + + b m u u u k 6 + + + + + + 6 k r u u r k 6 + + + @ + + @ | k r u r k | + @ + + @ + u u u + @ + + + u u u + @ + + : k r u r k | : u u k + + + u u u + @ + + + u u u + + + @ + + + b m u u r k | + + + @ + + + b m u u u k 6 + + + + @ + + @ + m u u 4 + @ + + + @ + + @ 4 u u k + + @ + u u u + @ + + + u u u + @ + + + : k u u k 4 + u u u + + @ + u u u + @ + + @ + | k r u r k | + @ + + + @ + + : k u u k 4 + u u u + + @ + u u u + + @ + + + + : k r u r k | : u u k + + + u u u + 6 p u r i ^ + + @ + + u u u + @ + + + u u u + + + @ + + 0 u u u 4 @ + + + @ + + + + @ + @ + + + @ + ^ e k u u u k 0 + + @ + + @ + @ + | k r u r k | + @ + + + @ u u u + @ + + u u u + @ + + u u u + + + @ + + u u u + 6 p u r i ^ + + @ + + + : k u u k 0 + u u u + @ + + + e r u r i + + @ + + b m u u u k 6 + + + + + u u u + + @ + + @ + @ + + + m u u 4 + @ + + + @ + + @ 4 u u k + + + + @ + | i k u u u p k 0 + + + + + + 6 k r u u r k 6 + + + @ + u u u + + + + + 6 k r u u r k 6 + @ + @ + + e r u r i + + + + b m u u u k 6 + + + + @ + ^ i u u m b + u u u + + + @ + + @ + + @ + + : k r u r k | : u u k + @ + u u u + @ + + + u u u + @ + + : k r u r k | : u u k + @ + u u u + + + @ + + 0 u u u 4 @ + @ + + + + + 6 k r u u r k 6 + @ + @ + u u u + @ + + + 6 k r u u r k 6 + @ + @ + + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + + + + @ + @ + @ + + + + ^ u u p + + @ + + + + @ + + @ + + + + @ + + + @ + + + + + + + + + + @ + @ + @ + + + + + + @ + + + @ + + + @ + + + + + + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + @ + + @ + + + + + + + + @ + @ + + + + + + + + + + + @ + + + @ + + + + + + + + @ + + + + + + + @ + + + @ + + + + @ + @ + @ + + + + + + + + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + + + + + + @ + + + @ + + + + + + + + + + @ + + + @ + + + + + + @ + + @ + + + @ + + + + + + + @ + + + + + @ + + @ + + + + @ + + @ + @ + + + + + ^ u u p + + + + + + + @ + + + @ + + + + + + + + @ + + @ + + @ + @ + + + + + ^ u u p + + + + + + + @ + + @ + @ + @ + + + + + + + + + + @ + + u u u + + + + + + + + + + + @ + + + @ + + @ + + + + @ + + + + @ b u u r + + @ + + + @ + @ + + + + @ + + @ + + + + + + + + @ + + @ + + + @ + + + + + + + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + u u u + + + + + + + + + + + @ + + + + + + + @ + + + @ + @ + @ + + + + + + @ + + + + + + + + + + + @ + @ + + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + + + + @ + + + @ + + + + + + + + + + @ + @ + + + + + + + + + + + @ + + + + + @ + @ + + + + + + + + + + + + + + + @ + + + + + + + @ + + + + + + + + + + @ + + + + + + + + + + + + + + @ + + + @ + + @ + + @ + + + + + + + + + + + + @ + + + + + @ + + @ + + + + @ + @ + @ + + + + + + + + + + @ + + + + + @ + + + + @ b u u r + + + + @ + @ + + + + + + + + + + + + + + + + + @ + + + + + + + + + + + + + + + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + @ + + @ r e : + + @ + | m u u k + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + @ + + + @ + + @ + @ + + + + + + + @ + + @ + @ + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + p e : + @ + @ | p u u i + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ r e : + @ + @ | p u u i + + @ + @ + + + @ + + + + + + + @ + + @ + @ + @ + + @ + u u u + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + | r u u i + + + @ + + + @ + + @ + + + @ + + + @ + @ + @ + + + @ + + @ + + + @ + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + u u u + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + + + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + @ + + @ + @ + + + + @ + @ + @ + @ + + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + @ + + @ + + @ + + @ + @ + @ + + @ + @ + + @ + @ + @ + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + @ + + + @ + @ + + + @ + + @ + + + + + @ + + + @ + @ + @ + @ + + + @ + @ + + @ + @ + | r u u i + + @ + + + + @ + @ + + @ + + @ + @ + @ + @ + + + @ + @ + @ + + @ + + + @ + @ + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + k u u u u u u u u u u | + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + m u u u u u u u u u u | + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + k u u u u u u u u u u | + + @ + + @ + + + @ + @ + @ + + + @ + + @ + + + + @ + + u u u + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + u u u u u u | + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + u u u + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + @ + + @ + + + + + @ + @ + + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + + + + @ + + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + + + @ + + @ + + @ + + + @ + u u u u u u | + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + : r u u u u u u u u i + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + : r u u u u u u u u i + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + : r u u u u u u u u i + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + u u u + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + u u u u u e @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + u u u + @ + + + + @ + + + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + @ + + + @ + + + + @ + + + + u u u u u e @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + ^ e k u u u r k 4 + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + ^ e k u u u r k 4 + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + ^ e k u u u r k 4 + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + u u u + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + p u u m 0 @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + u u u + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + p u u m 0 @ + + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + @ + + + + + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + + + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + + + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + @ + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + @ + + + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + @ + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + @ + + @ + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + + @ + + @ + + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + w w w w a + + @ + + w w w w a + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ } w w n + @ + + + + @ + + @ + + + @ + + @ + 1 w w n + + + @ 1 w w q + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ 5 w w g + + @ + @ + + + @ + + @ + + @ + + @ + + + 1 w w n + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + 1 w w n + + @ + 1 w w q + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ w w w w c + + @ + + w w w w a @ + + @ + + + @ + + @ + + + @ + @ + + @ + + 1 w w q + + + @ + + @ + + + @ + 1 w w q + @ + + + @ + + @ + [ j q w w q f + + + @ + + @ + + + + @ 1 w w n + + + + @ + + 1 w w q + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + c q w w n 7 @ + + @ + + @ + @ + + + + @ + @ + + @ + @ + 1 w w n + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + 1 w w q + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ w w w w a + @ + + + w w w w a + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + 1 w w n + @ + + @ + @ + + + @ + + @ + + + / w w w w 1 + + + @ 1 w w n + + 5 n w w q l + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ } w w n + + @ + + @ + + + + @ / w w w w 1 + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + 1 w w n + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + 1 w w w w a + + @ + c w w w w 1 + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + a w w f + + + @ + + + @ + + @ + + + @ + + + a w w g @ + + + a w w g + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + w w g @ + + + @ + + @ + + + @ + + @ + + + @ + @ + a w w f + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + a w w g + @ + + a w w g + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ } w w w w c @ + + @ a w w w w 1 + + + + @ + + + @ + + @ + + @ + + + @ + + @ } w w l + @ + + + @ + @ + + + + 1 w w l + + + @ + + @ + + f w w w w w w w s [ + + @ + + + @ + + + a w w f + @ + + + @ + 1 w w l + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + [ q w w w w w w g @ + + @ + + + + @ + @ + + + + @ + / g + @ 9 w w g @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + 1 w w l + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + 1 w w w w a + + + @ a w w w w 1 + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + a w w f + + @ + + + + @ + + + @ + + + @ + n w w w w 2 + @ + + a w w f + [ w w w w w n + + + + @ + + @ + + + + @ + + @ + + + + @ + + + a w w f + + + @ + + + @ + + + n w w w w 2 + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + a w w f + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ a w w w w n + + + @ w w q w w ] + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + @ + + j w w 7 + @ + + @ + + + @ + + @ + + + @ + + j w w 9 + @ + + j w w 9 + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + l w g + + @ + + + @ + + + @ + + + @ + + @ + + + + + j w w 7 + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + j w w 9 + + @ + j w w 9 @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + c w w w w n + + @ + w w q w w ] + @ + + @ + @ + + + @ + + @ + + @ + + + @ + a w w f + + + @ + + + + @ + @ + a w w f + @ + + @ + + + j w w w w w w w w w s + @ + + @ + + @ + + j w w 7 + + @ + + + @ a w w f + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + / s w w w w w w w w 7 @ + + + @ + + + @ + + @ + + + a s l + + j w w 9 + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ a w w f + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ a w w w w n + @ + + w w q w w ] + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + j w w 7 + @ + + @ + + + @ + + + @ + + + 1 w w w w w c + + @ + j w w 7 + a w w j + + [ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + j w w 7 + @ + + + @ + + @ + 1 w w w w w a + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + j w w 7 + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + l w w q w n + @ + a w j w w w + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + + @ + + + + @ + + @ + n w w 1 + + @ + + @ + + + @ + + @ + + @ + + l w w 1 + + @ + l w w 1 + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + l w w 1 + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + l w w 1 + + + + l w w 1 + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + l w w q w l + + + c w l q w w + + + @ + + + + @ + + + @ + + + @ + + @ + + + + + + + + @ + + @ + @ + + + + + + + + + @ + + + + @ + a w w w j < + + a w w w f + + @ + + + @ + + n w w [ + + @ + @ + + + + + + + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + n w w s 5 + + l w w l + + @ + + @ + + + @ + + @ + 7 w w f + + n w w 1 + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + + + + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + l w w q w n + + + c w l q w w + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + l w w 1 + + + @ + + @ + + @ + + + @ + + n w w l w w f + + + @ n w w 1 + l w w 2 + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + l w w 1 + + @ + + + @ + + @ n w w l w w g + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + l w w 1 + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + q w w j w l + + + w w 2 w w n + / g q w w q a + @ + + w w w [ j w n + @ a q w w n 7 @ + @ + j q w w j [ + + + + w w w + + @ / g q w w q a + + @ + @ + + @ + w w w + + @ + + w w w + @ + + j q w w j [ + + + + w w w [ j w n w w w + 7 s w q 7 @ + + / g q w w q a + + + + w w w + 7 s w q 7 @ + + 1 n w s g + w w w + @ + + j q w w j [ + + w w w w w w w w + @ + + @ + + @ + + w w w + @ + @ + w w w + + @ + c q w w q a + + @ + w w w + @ + + 1 w w n + c q w w q a @ + + @ + 1 j w w w n 7 @ + + @ + + + @ + + @ + + + @ q w w j w n + @ + w w 2 w w n + / g q w w q a + @ + + + c q w w n 7 + @ + @ w w w + @ + j q w w j [ + @ + @ w w w + + + @ + + + @ s w w j + + @ + + a w w n + + w w w [ j w n w w w + + 7 w w w 7 @ w w w + @ + 1 j w w w n 7 + @ w w w w w w w w + @ + + + @ + + @ + + @ + [ w w w < + + @ ] w q n + + + / g q w w q a + + + w w w w w q + w w w + c q w q 7 + @ + @ j q w w j [ + @ + + w w w [ j w n + w w w + @ w w w + 7 q w q 7 @ + @ + j q w w j [ + + + @ + + + @ + q w w j w l + @ + w w 2 w w n + / g q w w q a + + + @ w w w + 7 s w q 7 @ + + 1 l q w w q 7 + + @ + / g q w w q a + + + w w w [ j w n + 1 n w s g @ w w w + + @ + + + @ + + @ + @ + + @ + 7 w w l } w w n + @ + + w w w w w w w w w w + + w w w [ j w n + j q w w j [ + + @ + 1 n w s g + w w w + + @ + + @ + + @ + 7 w w l } w w n + @ + + w w w + 7 s w q 7 + @ w w + + + @ q w w + + + w w l + / g q w w q a + + + @ w w w + 7 s w q 7 + @ + 1 n w s g + w w w + @ + + j q w w j [ + + @ + w w w [ j w n + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + w w w a w n + @ a w n 1 w w g [ q w w w w w w f + + 1 w w w q w w 7 [ q w w w w w w a + [ s w w w w w w < @ + [ w w n + @ < w w w w w w w f + + + + + @ + [ w w n + @ + + [ w w n + + [ w w w w w w w < @ + 1 w w w q w w a w w q j w w w w w ] + [ w w w w w w w f + @ 1 w w q j w w w w w ] + 5 w w w w w q w w n + + [ w w w w w w w < + w w w w w w w w + + @ + + @ + + @ < w w q + + + + [ w w n + + [ s w w w w w w q + + + q w w + + + @ q w w } w w w w w w w n + + + 5 w w w w w w w a @ + + @ + + + @ + + @ + + + w w w a w l + + a w n 1 w w g [ s w w w w w w f + @ < s w w w w w w a + + [ w w n + [ s w w w w w w < + + [ w w q + @ + + @ + + 7 w w q + + @ + + + + w w w + 1 w w w q w w a w w q + 7 w w w 7 + [ w w n + + 5 w w w w w w w a + w w w w w w w w + + @ + + + @ + + @ + + + f w w j + @ + + + + + + + @ < w w w w w w w f + + w w w w w j < w w q q w w w w w [ + [ s w w w w w w < + + 1 w w w q w w 7 [ w w n + 1 w w q j w w w w w ] + [ s w w w w w w [ + + @ + @ + + + w w w a w n + + c w l 1 w w g [ w w w w w w w f + + 1 w w q j w w w w w ] + 5 w w w w w w w a + + [ w w w w w w w f + 1 w w w q w w 7 5 w w w w w q w w n + @ + + @ + + + @ + + + @ + + @ q w w ] } w w n + + @ < w w q w w w w w w w + 1 w w w q w w a w w w w w w w < + + 5 w w w w w q w w n @ + + + @ + + @ + + q w w ] } w w n + + @ 1 w w q j w w w w w ] + q w 1 + + 7 w w w + @ 7 w w 7 [ w w w w w w w f + + 1 w w q j w w w w w ] + 5 w w w w w q w w n + + [ w w w w w w w < + + 1 w w w q w w 7 + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ 1 w w n } w l + + w w 7 a w w a j n l } + [ w w w + + a w w w n / + + q w w 9 + 1 w w n + w w q 1 + a w w l + + 7 w w j + + j l l } + [ w w w + @ + @ + + + 7 w w w w w w w w w w l + + w w q 1 + a w w l + + a w w w n / + 9 w w w n 1 + n w w ] + j l l } + [ w w w + + 7 w w w n 1 + n w w ] + w w w 7 + l w w w g @ + w w q 1 + a w w l + + + + + 7 w w j + + + @ + + @ + + 7 w w w w w w w w w w l + + q w w j + + l w w a + + n w w ] + @ a w w f q w w g + + l w w a @ + q w w < + a w l j + + @ + + @ + + + @ + + @ 1 w w n } w n + + w w 7 a w w a j l n } + [ w w w + + q w w 9 + 1 w w n + + 7 w w j + w w q 1 + a w w l + + 5 w w j + + + @ + @ + l w w 9 + + + @ + @ + w w w + a w w w n / + 9 w w g 7 w w w _ + + 7 w w j + + q w w [ + a w l j + + + + + 7 w w j + + + @ + + + @ + + @ + + n w w 2 + + + @ + @ + @ + + j l l } + [ w w w + + + w w w + + 7 w w w n ] + q w w } + w w q 1 + a w w l + + a w w w n / + + 7 w w j + 7 w w w n 1 + n w w ] + w w q 1 + a w w j + + + @ + + @ 1 w w n } w l + + w w 7 a w w a j l l } + [ w w w + + 7 w w w n 1 + n w w ] + q w w < + a w l j + + j l l } + [ w w w + a w w w n / + + w w w 7 + l w w w g + + @ + + + @ + + + @ + + + @ 7 w w j + + w w w + @ + 7 w w g + a w w g + + @ 9 w w w n / + w w q 1 + a w w l + + w w w 7 + l w w w g + + @ + + + @ + + 7 w w j + + w w w + @ + 7 w w w n 1 + n w w ] + n w 1 + @ q w w w 1 + n w q + j l l } + [ w w w + + 7 w w w n 1 + n w w ] + w w w 7 + l w w w g @ + w w q 1 + a w w l + + a w w w n / + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + a w w f 1 w n + c w q + j w w } + + + @ + + w w w + @ f w w q + + @ 7 w w n + + + + + + a w w 9 + + + w w w + @ f w w 9 + + + + + @ + + w w w + + + + @ + @ f w w w w w w w w w w a + c w w 7 + + + w w w + + f w w q + + + f w w w + + + a w w + + + + + @ + + w w w + @ f w w w + + + a w w + a w w g + @ ] w w w a + a w w 7 + + + w w w + @ + @ < w w j + + @ + + + @ + + @ f w w w w w w w w w w a + a w w l + + + ] w w q + + l w w 1 + / w w q a w w n + @ + ] w w q + + w w w a + + + + + + @ + + + + @ + + + @ + + a w w f 1 w n + c w q + j w w } + + + @ + + w w w + 7 w w l + + + + + + @ + f w w a a w w 9 + + + w w w + + a w w a @ + + + + + @ q w w / + @ + + + + / w w s + f w w q + + + f w w q w w n < + @ + f w w a + @ w w w 9 + + + + + @ + @ + [ w w j + + @ + + @ + + + @ + + @ + w w w + @ + + @ + + + + @ + + + + @ + + w w w + @ + w w n + @ f w w q + + + a w w 1 a w w 9 + + + w w w + + f w w q + + @ + f w w a + g w w s + + + a w w + c w w 7 + + + w w w + @ + + + @ + a w w f 1 w n + c w q + j w w } + + + @ + + w w w + @ f w w w + + + a w w + + w w w a + + + + + @ + + + + @ + + w w w + f w w q + + + a w w g + @ ] w w w a + + + @ + + + @ + + + @ + + + w w q + + @ w w w + + + f w w a + f w w a + + + g w w q + + c w w 7 + + + w w w + a w w g + @ ] w w w a + + + @ + + + @ + w w q + + @ w w w + + + f w w w + + + a w w + + l w a + 7 w w w w 1 / w w 7 + + + + @ + + w w w + @ f w w w + + + a w w + a w w g + @ ] w w w a + a w w 7 + + + w w w + + f w w q + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + n w w 7 1 w w + w w 9 + q w w / + 1 a c l q w w n + + n w w 9 + + + n w w 2 @ + @ + @ + q w w w w w w w w w + + n w w 1 + @ + 1 a c l q w w n + @ + + + @ + n w w w w w w w w w w 1 + q w w w w w w w w w + @ n w w 9 + @ + n w w a + @ + n w w ] + + 1 a c l q w w n + + n w w a + @ + n w w ] n w w 2 @ + + w w w 1 + q w w w w w w w w w + + + [ w w n + + @ < w w w w q + + n w w w w w w w w w w 1 + n w w 2 + @ + + w w w + @ f w w } + j w w 7 n w w 2 + + + + w w w + + n w w w s g / @ + + + @ + @ + + @ + + + @ + n w w 7 1 w w + w w 9 + q w w / + 1 a a l q w w n + n w w 2 @ + @ + @ + + + n w w 1 n w w w w w w w w w + @ n w w } + @ + @ + + + w w w + + + @ + @ + a w w j + n w w 9 + @ + n w w w w w n + + @ + n w w 1 + + n w w w w g ] @ + + + + [ s w q + + + + @ + + @ + + + @ + + + w w w + + @ + + + @ + + + @ + 1 a c l q w w n + + 1 w w n + + n w w 7 + @ + q w w < q w w w w w w w w w + @ n w w 9 + + + @ n w w 1 + l w w a @ + + n w w ] q w w w w w w w w w + + @ + + + + n w w 7 1 w w + w w 9 + q w w / + 1 a c l q w w n + + n w w a + @ + n w w ] + n w w w q j ] + + + @ + 1 a c l q w w n + n w w 9 + @ + n w w 2 @ + + w w w 1 + @ + + @ + + @ + @ + + @ + c w w a @ + + n w w 1 + + n w w 1 + n w w } + @ + l w w 9 @ + q w w w w w w w w w + n w w 2 @ + + w w w 1 + + @ + @ + + + c w w a @ + + n w w 1 + + n w w a + @ + n w w ] + f w a + q w n w w 1 a w s + @ + 1 a c l q w w n + + n w w a + @ + n w w ] n w w 2 @ + + w w w 1 + q w w w w w w w w w + @ n w w 9 + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + s w w / 1 w w a w s + @ w w w < q w w w w w w w g @ + w w w ] + @ + w w w ] + + + @ + + w w w w w w w w w s @ + w w w + + [ q w w w w w w w g + @ + @ + + + s w w + + + + + w w w + + w w w w w w w w w s + + w w w ] + + + w w w / + + + w w q + [ q w w w w w w w g @ + w w w / + + + w w q + w w w + + + + w w w + + w w w w w w w w w s @ + + q w q + + + + f w w w w f + + s w w + + + + + w w w + + w w w + @ + + @ w w w + + a w w 1 1 w w n + w w w + @ + @ + w w w + @ < q w w w w w 2 @ + + + @ + + + @ + @ + + + s w w / 1 w w a w s + @ w w w < q w w w w w w w j + w w w / + + + @ + + @ + s w w + w w w w w w w w w w + + s w w / + + + + @ + + w w w + @ + + + + + q w w 7 @ w w w ] + + + w w w w s w w ] + + + s w w + + @ < q w w w w w 5 + + @ + q w q + + @ + + + @ + + @ + + + @ + + w w w + @ + + @ + + @ + + [ q w w w w w w w g @ + a w w a + + s w w ] + + / w w s + w w w w w w w w w w + + w w w ] + @ + + s w w + + w w w / + @ + w w q + w w w w w w w w w s @ + + @ + @ + s w w / 1 w w a w s + @ w w w < q w w w w w w w g @ + w w w / + + + w w q + + [ n w w w w w 5 + + [ q w w w w w w w g + w w w ] + + + w w w + + + @ w w w + + + + @ + + @ + + + + @ + + w w w w w w w w w w 5 + + w w w + + w w w + @ + + w w w / + + w w w w w w w w w s + w w w + + + @ w w w + + + + + + @ + @ w w w w w w w w w w 5 + + w w w / + + + w w q + + c w n 7 w w 1 w w 9 q w a + [ q w w w w w w w g @ + w w w / + + + w w q + w w w + + + + w w w + + w w w w w w w w w s + + w w w ] + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + / w w s + 1 w w s w a + [ w w n j w w n 7 1 j w w 9 + [ w w q + + + + w w w + @ + + + @ + w w w + + + + + + @ + / w w q + + l w w n 7 1 j w w 9 + + @ + + @ / w w q + @ + @ / w w q + + w w w + + + + + + @ + [ w w q + @ + [ w w q + + @ 5 w w g + l w w n 7 1 j w w 9 + [ w w q + + @ 5 w w g + w w w + @ + 1 w w q + + w w w + + + + + + @ + + q w q < + @ + + q w w w w [ + / w w q + @ + @ / w w q + + w w w + + + @ 2 w w n + + c w w 1 n w w } + w w w + + @ + 5 w w l + + + + 1 j w w w q + @ + + + @ + + + @ + + @ / w w s + 1 w w s w a + [ w w n j w w n 7 1 j w w 9 + w w w + @ + + + @ + + / w w q + w w w + + + + + + + + / w w s + @ + @ + + @ + q w w 9 + @ + @ + j w w s + [ w w q + + @ / w w w g a w w f + @ / w w q + + + + + 1 j w w w q + + + q w q [ + + + @ + + + @ + + @ + + + @ + q w w 7 + @ + + 1 w q j + l w w n 7 1 j w w 9 + + f w w a @ / w w q + @ + 1 w w n + w w w + + + + + + + + [ w w q + + + @ / w w q + [ w w q + + + 5 w w g + w w w + + + + + + @ + + + + @ + / w w s + 1 w w s w a + [ w w n j w w n 7 1 j w w 9 + [ w w q + @ + 5 w w g @ + + + 1 j w w w q + + l w w n 7 1 j w w 9 [ w w q + @ + + w w w + @ + 1 w w q + @ + + + @ + + + @ + + + @ j w w w w w w w w w w a + / w w q + [ w w q + + + [ w w q + + @ w w w + + + + + + @ + w w w + @ + 1 w w q + @ + @ + + @ + j w w w w w w w w w w a + [ w w q + @ + 5 w w g @ + c w n q w q + q w n w w + + l w w n 7 1 j w w 9 + [ w w q + @ + 5 w w g + w w w + @ + 1 w w q + + w w w + + + + + + @ + [ w w q + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ 2 w w n + 1 w w w w / + 7 w w g w w w + + + q w w 1 + 5 w w j + @ + + w w w + + @ 1 q j / q w w ] + @ + @ + + + 5 w w j + + w w w + + + q w w 1 + + + @ + + 5 w w j + + + + 5 w w j + + q w w / + @ + @ + + @ 2 w w j + + + 5 w w j + + + f w w 7 @ w w w + + + q w w 1 + 5 w w j + + + f w w 7 @ w w w / + + j w w j + + q w w / + @ + @ + + + j w w < + @ + @ + + + + + + + + 5 w w j + + + + 5 w w j + + q w w / + @ + n w w 7 @ + 1 w w a w w j + + q w w / + + + n w w 7 c n s [ + + [ w w w + + @ + + + @ + + + @ + + 5 w w l + 1 w w w w / + 7 w w g w w w + + + q w w 1 + w w w + + @ 1 q j / + 5 w w j + q w w / + @ + @ + @ + 1 w w n + + @ + + + + @ f w w w a + + [ n w w w 2 + 5 w w j + + + 5 w w j + ] w w q + + 5 w w j + c n s [ + + [ w w w + @ j w w < + + @ + + @ + + + @ + + @ + + + @ j w w s 5 + + a q w w a + w w w + + + q w w 1 + + n w w 1 + 5 w w l + + + a w w f + q w w / + @ + @ + @ + 5 w w j + @ + + 5 w w j + 5 w w j + @ + f w w 7 @ q w w / + @ + @ + + + @ + + + + 5 w w l + 1 w w w w / + 7 w w g w w w + + + q w w 1 + 5 w w j + + + f w w 7 c n s [ + + [ w w w + + w w w + + + q w w 1 2 w w j + + @ + w w w / + + j w w j + + @ + + + @ + + @ + @ + / w w w w w w w w w w w f + 5 w w j + 5 w w j + @ + 5 w w j + + + q w w / + @ + @ + + + w w w / + + j w w j + + + + @ + + / w w w w w w w w w w w f + 5 w w j + + + f w w 7 + + 1 w w w w 7 + l w w w j + + w w w + + + q w w 1 + 5 w w j + + + f w w 7 @ w w w / + + j w w j + + q w w / + @ + @ + + @ 2 w w j + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + c w w a + + w w w j + + c w w a w w w [ + f w w w + + a w w a + + @ + g w w f + 1 n w q + j w w g + / f w g @ + a w w a @ + w w w [ + f w w w + @ + + + @ + a w w a @ + @ + a w w a @ + j w w g + / f w g @ + a w w a @ + + a w w a @ + + q w w ] + w w w [ + f w w w + + a w w a @ + + q w w ] + n w w g @ 7 w w w a @ + j w w g + / f w g @ j w w 7 + @ + + + + @ + @ + @ + + a w w a @ + @ + a w w a @ + a w w q + + j w w n + + + 1 w w w w s + + @ a w w q + + j w w n + j w w n ] + a w w l + [ w w q + + @ + + + @ + a w w a + + w w w j + + c w w a w w w [ + f w w w + + g w w f + 1 n w q + + a w w a + j w w g + / f w g + + c w w a @ + + + @ + + + / s w w w w w w w w w g @ + a w w a @ + + c w w a + + q w w < + a w w a @ j w w n ] + a w w l + j w w 7 + @ + + @ < w w q + + + @ + @ + + + [ w w w w w w w w w q + + w w w [ + f w w w + @ + w w w 1 + a w w a + @ + g w w 9 + j w w g + / f w g + + a w w a + + @ + a w w a + a w w a + + + q w w ] + j w w g + / f w g @ + + @ + @ + a w w a + + w w w j + + c w w a w w w [ + f w w w + + a w w a + @ + q w w ] j w w n ] + a w w l + + w w w [ + f w w w + c w w a @ + + + n w w g @ 7 w w w a + [ w w q + + @ + + + + + j w w 7 + + + + + 1 w w n + a w w a + a w w a + + + a w w a @ + + j w w g + / f w g @ + n w w g @ 7 w w w a + @ + + + @ + j w w 7 + + + + + 1 w w n + a w w a + @ + q w w ] + + 1 w w w q + + n w w w ] + + w w w [ + f w w w + + a w w a + @ + q w w ] + n w w g @ 7 w w w a @ + j w w g + / f w g @ + a w w a @ + [ w w q + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + n w w 5 + + w w w ] + + n w w 1 j w w w w w w w w + + n w w 1 + + + @ / s w w w w w w 5 + + w w w w w w w 2 @ + n w w 1 + + j w w w w w w w w + + @ + + + + n w w 5 + + + + n w w 5 + + + w w w w w w w 2 @ + n w w 1 + + @ n w w 2 + @ / w w q + + j w w w w w w w w + + n w w 5 + + / w w q + + 5 w w w w w s w w 1 + + + w w w w w w w 2 @ w w w w w w w w + @ + + + @ + + @ n w w 2 + + + + n w w 5 + + + q w w w w w w n ] + @ + [ w w w w a + + + + q w w w w w w n ] + + q w w w w w w s [ + f w w j + + @ + @ + + + n w w 5 + + w w w ] + + n w w 1 j w w w w w w w w + @ / s w w w w w w 5 + + n w w 5 + + w w w w w w w 2 @ + l w w 7 + + @ + + @ + + + [ s w w w w w w w a + + @ n w w } + @ + n w w 1 + + a w w g @ n w w 2 + + q w w w w w w s [ + w w w w w w w w + f w w j + @ + + + + @ + + + 7 w w w w w w w n + + + j w w w w w w w w + + + w w w w w n w w 5 + + + n w w 1 + + w w w w w w w 2 @ + n w w 1 + + + + n w w 5 + n w w 5 + @ / w w q + + + w w w w w w w 2 @ + + @ + + + n w w 5 + + w w w ] + + n w w 1 j w w w w w w w w + + n w w 5 + + / w w q + + q w w w w w w s [ + + j w w w w w w w w + n w w 1 + + @ + 5 w w w w w s w w 1 + f w w j + + + @ + @ + 1 w w n + @ + @ + + 1 w w n + n w w 1 + n w w 5 + @ + n w w 1 + + @ + w w w w w w w 2 @ + 5 w w w w w s w w 1 + + @ + + + 1 w w n + @ + @ + + 1 w w n + n w w 5 + + / w w q + @ + [ w w w 7 @ + l w w j + + @ j w w w w w w w w + + n w w 5 + + / w w q + + 5 w w w w w s w w 1 + + + w w w w w w w 2 @ + n w w 1 + + f w w j + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + s w w ] + + w w n + @ + s w w ] + j w w n 5 w w w + + s w w / + @ + + + / g s w w l } + + + + g w w w j 5 + + + s w w / + + + j w w n 5 w w w + + + @ + @ + s w w / + @ + + s w w / + @ + + g w w w j 5 + + + w w w ] + + + s w w / + + 7 w w j + + + j w w n 5 w w w + + s w w / + + 7 w w j + + + 7 q w q 2 w w w ] + @ + + g w w w j 5 + + w w w w w w w w + + + @ + + + @ + s w w / + @ + + s w w / + @ + + a q w w n a + + @ + + + w w w q + @ + @ + + a q w w n a + + @ + + a q w w q j ] + + q w w 5 + + + + + @ + + s w w / + + w w n + @ + s w w ] + j w w n 5 w w w + + + / g s w w l } + + @ q w w / + + + g w w w j 5 + + + q w w / + + + @ + + @ + + + / g q w w q f ] + @ + + s w w / + + + s w w ] + + [ w w w + s w w / + + + a q w w q j ] + + w w w w w w w w + q w w 5 + + + @ + + + @ + @ + 1 j w w w j 7 + + @ + + j w w n 5 w w w + @ + 7 q w w w s w w ] + @ + s w w ] + + + g w w w j 5 + + + s w w / + @ + + s w w / + w w w ] + + 7 w w j + + @ + g w w w j 5 + + @ + + + @ + s w w / + + w w n + @ + s w w ] + j w w n 5 w w w + + s w w / + + 7 w w j + + + a q w w q j ] + + + + j w w n 5 w w w + s w w ] + + + + + 7 q w q 2 w w w ] + q w w 5 + @ + + + + @ n w w 1 + + + + @ + + w w w + s w w / + w w w ] + + + s w w / + + + + + g w w w j 5 + + + + 7 q w q 2 w w w ] + + @ + @ + n w w 1 + + + + @ + + w w w + s w w / + + 7 w w j + + + + w w w + + + n w w 1 + + + + j w w n 5 w w w + + s w w / + + 7 w w j + + + 7 q w q 2 w w w ] + @ + + g w w w j 5 + + + w w w ] + + q w w 5 + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + + + + @ + + + + + + + + + + + + @ + + + + @ + + + @ + + @ + + + + + @ + @ + @ + + + + + + @ + + + + + @ + + + + + + + + + + @ + + @ + + + @ + + + + + @ + + + + + + + @ + @ + + + + + + @ + + + + + + @ + + + + @ + @ + + + + + @ + + + + + + + + + @ + + + + + @ + @ + + + @ + @ + + + + + + + + + + + + @ + + + + + + + @ + + + + + + + + @ + + + @ + + + + @ + + + @ + @ + + + + + @ + + + + + + + + + @ + + + @ 1 w w w } + + @ + + + + + + + + + @ + + + @ + + + + + + + + @ / w q + + @ + @ + + @ + + + + + @ + + + + + + + @ + + + + + + + + + + + + @ + + @ + + + + + + @ + + + + + + @ + @ + + + + + + @ + / w w q + @ + + + @ + + @ + + @ + + + + + + + + + + @ + + + + @ + @ + + + + @ + + + + + + + + + @ + @ + + + + + + + + + @ + + + + + + + + @ / w q + + @ + + @ + + @ + + + + + + + + + @ + + + @ + + + + + + + + + @ + + + + + + + @ + + + + + + @ + + + @ + @ + + + + + + @ + @ + + + + @ + + @ + + + + + + + + + + @ + + + + + @ + + @ + + + + + + @ + + @ + + @ + + + + @ + + + + + + + @ + + + + + + + + + + + + @ + + + + + @ + @ + + + + @ + + + + + + + + + @ + + + + + + + + + + @ + + + + @ + @ + @ + + + + + + + + + + / w s + + + + @ + + + + + + + + @ + + + @ + + + + @ + + + + + + + + + + @ + + + + + @ + @ + @ + + + + + + + @ + @ + + + + + + + + + + @ + + + + + + + + + @ + + + @ + + + + @ + + + + @ + @ + + + + @ + + + + + + @ + + + + + + @ + + + + + + + + + + @ + + + + + @ + @ + + + + @ + + + + + + + + + + + + + @ + + + + + + + @ + + + + + + @ / w q + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + @ + + + @ + @ + @ + @ + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + @ + @ + + @ + @ + @ + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + @ + + + @ + + @ + @ + + + @ + @ + @ + + @ + @ + + + + @ + @ + + + @ + @ + @ + @ + + @ + @ + @ + + @ + + @ + + + + @ + + @ + @ + @ + @ + + @ + @ + @ + @ + + + @ + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + @ + @ + @ + + + @ + + / n w w l + + @ + + @ + @ + @ + @ + + @ + + + + @ + @ + @ + + 1 n w 5 + + + @ + + + + @ + @ + + + @ + @ + @ + + + @ + @ + @ + @ + @ + @ + + @ + + @ + @ + @ + + @ + @ + @ + + + + @ + @ + @ + + + a w w f + + @ + + + @ + + @ + + @ + @ + @ + @ + @ + + @ + @ + + @ + + @ + + + @ + @ + @ + @ + + + @ + + + @ + @ + @ + + + @ + @ + @ + @ + 1 n w 5 + + + @ + + @ + + + @ + @ + @ + @ + + @ + + + @ + @ + @ + @ + + + @ + @ + @ + + + @ + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + @ + @ + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + @ + + + @ + @ + @ + @ + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + @ + @ + + @ + @ + @ + @ + @ + + + @ + @ + + + + @ + + @ + @ + @ + @ + 1 n w 5 + @ + + @ + @ + @ + @ + + @ + @ + + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + + @ + + + + @ + @ + @ + + @ + + + @ + @ + @ + @ + + + @ + @ + @ + @ + + @ + @ + + @ + @ + + @ + @ + + + + @ + @ + + @ + @ + @ + + @ + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + @ + @ + @ + @ + @ + + @ + @ + @ + + + @ + @ + @ + 1 n w 5 + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + + + + @ + + @ + w w w w w + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + q j 1 + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + + @ + + + + @ + + + + @ + + + + @ + + + + + @ + @ + + @ + + + + 7 w w w w / + + + @ + + + @ + + @ + + + + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + + + + @ + + + @ + + @ + + + + @ + + + @ + + + + + + q j 1 + + @ + + + @ + + @ + + @ + + + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + + + @ + + q j 1 + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + + @ + + + + @ + @ + + + + @ + + @ + + + + @ + + + + + @ + + + + @ + + + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + + + + q j 1 + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + q w w j < + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + @ + l w w n 5 + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + + + @ + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + @ + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + 1 w w w w w w w l } + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + 1 w w w + + + + @ w w w [ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + 1 w w n + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ } w w w w w w w q 2 + + @ 1 w w q + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ } w w w w w w w w n 2 @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + @ + @ 1 w w w w w w w w w q + @ + + @ + + @ + + 1 w w q + + @ + + + + @ + + + @ + + @ + + @ 1 w w w w w w w l } + + @ + + + @ + + + @ + + @ + + 1 w w q + + + @ + + + + @ + + @ + @ + + + @ + @ + + + 1 w w n + @ + + + @ + + @ + @ + + + @ + + @ + + + + + 1 w w q + + + @ + + @ + + @ + @ + + + @ + + 1 w w n + + 1 w w n + + @ + + @ + + @ + + + @ + + @ + 1 w w w w w w w w w q + @ + + + @ + + @ + + @ + + w w w w c + + @ + + w w w w c + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ 1 w w q + + @ + @ + + + @ + @ + + @ + + @ + + + + @ + + 1 w w w w w w w q 2 + + @ } w w n + @ + + + @ + + 1 w w q + 1 w w n + 1 w w q + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + + + + 1 w w w w w w w g [ + + + + @ + + + + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + 1 w w n + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + a w w w w w w w w w 5 + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ 9 w w w a + @ + / w w w + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + a w w f + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + a w w w w w w w w w 5 + + 1 w w l + + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + a w w w w w w w w w w 5 + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + @ + + + + a w w w w w w w w w f + + @ + + + @ + + + 1 w w l + + + + @ + + + @ + + + @ + + + @ + a w w w w w w w w w 5 + + @ + + + @ + + + @ + + + @ } w w l + @ + + + @ + + + @ + + + + @ + + + + + @ + + a w w g + + @ + + + @ + + + + @ + + + @ + + + @ + @ + a w w g + @ + + + @ + + @ + + + + @ + + + @ 9 w w f + + a w w f + + + @ + + + @ + + @ + + + @ + + a w w w w w w w w w f + + + @ + + @ + + + @ + @ 1 w w w w a + @ + + c w w w w 1 + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + 1 w w l + + + + + @ + + + + + @ + + + @ + + @ + + + @ + a w w w w w w w w w 5 + + a w w g + + @ + + + @ + 1 w w l + a w w f + 1 w w l + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + @ + a w w w w w w w w w 7 @ + + + @ + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + a w w f + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + j w w w w w w w w w n + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + j w w w n + + + 5 w w n + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + j w w 7 @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ j w w w w w w w w w n + + c w w f + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + j w w w w w w w w w w n + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + j w w w w w w w w w < + + + @ + + + @ + + c w w f + @ + + @ + @ + + @ + + + @ + + + + j w w w w w w w w w n + + + @ + + @ + @ + + + @ + + c w w f + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + j w w 9 @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + j w w 9 + + @ + + + @ + + + @ + + + @ + + + j w w 7 @ + j w w 7 + @ + + + @ + + + @ + + @ + + + @ j w w w w w w w w w < + @ + + @ + + + @ + + + + a w w w w n + + + @ w w q w w ] + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + c w w f + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + + j w w w w w w w w w n + + j w w 9 @ + + @ + + + + c w w f + j w w 7 + a w w f + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + j w w w w w w w w w s ] + @ + + @ + + @ + + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + j w w 7 + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + n w w 1 + + + 7 w w w + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + n w w w w ] + + a w w l + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + n w w [ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + l w w } + + + a w w w + + @ + + + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + l w w 1 + + + + 1 w w w + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + @ + + @ + l w w 1 + + + + + + + @ + + + @ + + + @ + + + + + @ + + @ + + + + @ + @ + + + @ + @ + n w w 1 + + + 7 w w w + @ + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + n w w 1 + + + @ + @ + + + + @ + + @ + + + @ + + + @ + l w w 1 + + @ + @ + + + @ + + @ + + @ + @ + q w w 1 + + n w w 1 + + @ + + + @ + + + @ + + @ + + + l w w } + + + + + + + @ + + + + @ + + + @ + @ + l w w q w n + @ + a w j w w w + + + + @ + + @ + + + + + @ + + + + @ + + + + @ + + + + @ + + + + + @ + + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + l w w 1 + + + a w w w + + l w w 1 + + + @ + @ + + @ + + + + n w w 1 + + + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ l w w } + + + 5 q w w f + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + n w w [ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ w w w + + @ + + w w w + + @ w w w [ j w n + w w w + @ + + w w w + + w w w + 7 s w q 7 @ + + c q w w q a + @ + + @ + + + @ + + w w w w w a + + l w w a + @ + j q w w j [ + + + w w w + + @ + 1 w w n w w w [ j w n + / g q w w q a + + + @ w w w + 7 q w q 7 + @ + + @ + + + @ + + + @ + + + @ + w w w + + @ + j q w w j [ + @ + + / g q w w q a + @ + + w w w + 7 s w q 7 + @ + + @ + + @ + w w w + @ + + + w w w + @ w w w + @ + + j q w w j [ + + + w w w [ j w n + w w w [ j w n + + j q w w j [ + + @ + + + + @ + w w w + + @ + + + w w w + + + c q w w q a + @ + + @ w w w + + + @ w w w + n w w 1 + + + 7 w w j + + @ + + + + @ + + + w w w + + @ + @ + @ + + @ w w w [ j w n + w w w + + + c q w w n 7 + + + @ + + @ + + + w w w + + @ + + w w w + + @ + a q w w q a + @ + + @ w w w + n w w 1 + + @ 7 w w j + @ + + + @ + + + @ + + w w w + + 1 l q w w q 7 @ + + + / g q w w q a + + + @ w w w 2 q w q 7 + + @ + j q w w j [ + + + + w w w + + @ w w w + + @ j q w w j [ + + + @ + + @ + + w w w + @ + @ + @ + + + @ + @ + + @ + + @ + + + q w w j w l + + + w w 2 w w n + / g q w w q a + @ + @ / g s w q 7 + w w w ] + w w w + 7 s w q 7 @ + + w w w + + w w w + 7 s w q 7 @ + + + + @ + + + @ + + @ + w w w + + @ + + w w w + @ w w w + a s w q 7 + @ + w w w + @ w w w + + w w w + @ / w w s 5 n w q 7 + @ + / w w s 5 n w q 7 @ + + + j q w w j [ + + + @ + + @ + + + w w w + @ + + + 5 w w n + @ + a q w w q a + + + @ + w w w + + + @ w w w + @ j q w w j [ + + + @ w w w + + 7 w w w 7 @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + [ w w n + + @ / g w w f + + 1 w w w q w w 7 1 w w n + + @ < w w q + 1 w w q j w w w w w ] [ s w w w w w w q + + @ + + @ + + + [ w w n w w q + + q w w } + [ s w w w w w w [ + + q w w + @ + + q w w 1 w w q w w w 7 [ s w w w w w w f + + 1 w w q j w w w w w ] + + @ + + @ + + @ + + @ + @ + + [ w w n + + [ w w w w w w w < + + [ w w w w w w w f + + 1 w w q j w w w w w ] + + @ + + @ + [ w w n + + @ + 1 w w q + [ w w n + + [ w w w w w w w < @ 1 w w s w w w 7 1 w w s w w w 7 [ s w w w w w w [ + + + @ + + + [ w w n + + @ + 5 n w w l + [ w w w w w w w q + + + 1 w w n + @ + [ w w n + 5 w w j + @ 7 w w j + + + + @ + @ + + + @ < w w q + + @ + + + + @ + 1 w w s w w w 7 [ w w n + [ q w w w w w w c @ + + @ + + + @ < w w q + + @ / g w w f + + [ s w w w w w w q + + @ < w w q + 5 w w j + + 7 w w j + + + + @ + + @ + + + @ < w w q + 5 w w w w w w w a + @ < w w w w w w w f + + [ w w w w w w w w 5 + [ s w w w w w w [ + @ < w w q + + [ w w n + [ s w w w w w w < @ + + + @ + + [ w w n + + @ + + + @ + + + @ + + + + @ + + + @ + w w w a w n + @ a w n 1 w w g [ q w w w w w w f + + [ s w w w w w g w w s + 1 w w q j w w w w w ] + [ w w n + 1 w w q j w w w w w ] + @ + + + @ + + + @ + + [ w w n + + + @ 1 w w q + [ w w q n w w w w w [ + [ w w n + [ w w n + [ w w n + + 5 w w s w w w w w 5 + + 5 w w s w w w w w 5 + [ w w w w w w w < @ + + + @ + + @ < w w q + + @ + + + w w w + [ s w w w w w w q + + + 1 w w n + @ + [ w w n [ s w w w w w w < @ + [ w w n + 7 w w w 7 @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ 7 w w w w w w w w w l + + + a w w w n / + + c w w a + @ + 7 w w g + 7 w w w n 1 + n w w ] q w w j + + l w w a + + + @ + + @ + 7 w w a q w w < + w w w / + w w q 1 + a w w j + + n w w ] + + c w w f 9 w w w n / + + j l n } + [ w w w + + 7 w w w n 1 + n w w ] + + + @ + + @ + + @ + + + + @ + 7 w w f + + w w q 1 + a w w l + + j l l } + [ w w w + + 7 w w w n 1 + n w w ] + + + @ + + + 7 w w j + + @ 7 w w w f + 7 w w j + + w w q 1 + a w w l + 9 w w w n / + + a w w w n ] + + w w q 1 + a w w j + @ + + @ + + 7 w w w w w w w w w w w ] + q w w g + + l w w a + + c w w a + + + 7 w w j + + q w w / 2 w w l + + @ + + @ + + + @ + + 7 w w w w w w w w w q + + a w w w n ] + + 7 w w j + q w w 9 + 1 w w n + + + + @ + + + 7 w w w w w w w w w j + @ + q w w j + + l w w a + + 7 w w g + + q w w / 2 w w l + + @ + + + @ + + @ + + + 7 w w g + q w w < + a w l j + + j l l } + [ w w w + + 7 w w w 7 + j w w l + w w q 1 + a w w j + + 7 w w g + @ 7 w w j + w w q 1 + a w w l + + @ + + + @ 7 w w w w w w w w w q + @ + + + @ + + + @ + + + 1 w w n } w l + + w w 7 a w w a j n l } + [ w w w + + q w w j + / n w w w n + 7 w w w n 1 + n w w ] + 7 w w j + 7 w w w n 1 + n w w ] + + @ + + @ + @ + + + @ 7 w w j + @ + 7 w w w f + 7 w w w q ] + q w w } + 7 w w j + 7 w w j + 7 w w j + + a w w w } + j w w l + + a w w w } + j w w l + w w q 1 + a w w l + + @ + + + @ + 7 w w g + @ + + @ + w w w + q w w j + + l w w a + + c w w a + + + 7 w w j q w w } + a w w l + + 7 w w j 7 w w w _ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + f w w w w w w w w q < + @ + f w w q + + + @ n w w 5 + + + f w w a + f w w w + + + a w w a w w l + + + ] w w q + @ + + + @ + + f w w 1 9 w w f [ w w w + c w w 7 + + + w w w + @ l w w } @ / s w s + g w w q + + @ + + + + @ + + w w w + @ f w w w + + + a w w + @ + + + @ + + + @ + + @ + + + @ a w w a + c w w 7 + + + w w w + + + + + @ + + w w w + @ f w w w + + + a w w + @ + + + @ + @ f w w w w w w w w w w ] + f w w a + c w w 7 + + + w w w + g w w q + + @ + f w w q + + + c w w 7 + + + w w w + + + @ + @ + f w w w w w w w w w n ] + a w w l + @ + ] w w q + + n w w 5 + @ + f w w a + + 7 w w n s w n + + + + @ + + + @ + + @ + f w w w w w w w w w f + + f w w q + + + @ f w w a 9 w w l + + + + + + + @ + + @ + @ + f w w w w w w w w q < + + a w w l + + + ] w w q + @ f w w a @ + 7 w w n s w n + + + + @ + + + @ + + @ + @ f w w a + w w w a + + + + + @ + + + + @ + + w w w + @ f w w j + + ] w w w a w w 9 + + + w w w + @ f w w a + + f w w 9 a w w 9 + + + w w w + + + @ + + + f w w w w w w w w w f + + + @ + + @ + + @ + @ + a w w f 1 w n + c w q + j w w } + + + @ + + w w w + a w w l + + + / w w w a @ g w w q + + + a w w + @ f w w a + g w w s + + + a w w + @ + + @ + + + + @ + + + f w w w w w w w w w w ] + f w w q + + + a w w 1 + f w w a + g w w 9 + f w w a + @ n w w 7 @ + ] w w w + + n w w 7 @ + ] w w w a w w 7 + + + w w w + + + @ + + + @ f w w a + + @ + + + w w w a w w l + + + ] w w q + + n w w 5 + @ + f w w a w w 7 @ + + w w w + @ f w w n w w q < + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + n w w w w w w w w w w 2 + + n w w 9 + @ + + s w w + + @ + n w w } + n w w a + @ + n w w l w w 2 + + @ + w w w + + + @ + + + @ n w w ] / w w q 2 w w n + q w w w w w w w w w + + f w w 1 + j w w 7 @ l w w 9 + + + @ + 1 a a l q w w n + + n w w a + @ + n w w ] + @ + + + @ + + + @ + + @ + + + n w w } + q w w w w w w w w w + @ + 1 a c l q w w n + + n w w a + @ + n w w ] < w w w w q + n w w w w w w w w w 7 + + n w w 1 + q w w w w w w w w w + l w w 9 + @ + + n w w 9 + @ + q w w w w w w w w w + @ + + + + + n w w w w w w w f < + + + n w w 2 + + + + w w w + @ q w w + + + @ n w w } + @ + w w w w n + @ + @ + + @ + + + @ + + + n w w w w w w w w w [ + + n w w 9 + @ + + n w w 1 n w w 2 + @ + @ + @ + + @ + + + + @ n w w w w w w w w w w 2 @ n w w 2 + @ + + w w w + + n w w 1 + + + w w w w n + @ + @ + + @ + + + @ + + + + n w w 1 + n w w w q j ] + + + @ + 1 a c l q w w n + + n w w } + @ + w w w q w w w w w w w w w + + n w w } + @ n w w } q w w w w w w w w w + @ + + @ + + n w w w w w w w w w [ + @ + + @ + + @ + + + + + n w w 7 1 w w + w w 9 + q w w / + 1 a c l q w w n + n w w 7 + @ + + w w w 5 + l w w a + @ + n w w ] + n w w 1 + l w w a @ + + n w w ] + + @ + + @ + + + @ + + n w w w w w w w w w 7 + + n w w 7 + @ + q w w [ + n w w 1 + l w w 1 + n w w 1 + + w w w + + + + w w w + @ q w w + + + + w w w q w w w w w w w w w + @ + + @ + + + n w w 1 + + + @ + 5 w w l n w w 2 + @ + + w w w + @ q w w + + + @ n w w w w w w w w w w w w + + n w w w w w n + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + w w w + + + + + a w w q + + w w w ] + + @ < w w q + + + @ q w w + @ w w w / + + + w w q w w w + @ + + + w w w + @ + + @ + + + s w w + + q w w n w w g + w w w w w w w w w s @ + a w w 1 } w w q + + w w w / + @ + [ q w w w w w w w j + + w w w / + + + w w q + + + @ + + + @ + + + @ + + @ + + s w w + @ w w w w w w w w w s + [ q w w w w w w w g @ + w w w / + + + w w q + f w w w w f + s w w w w w w q j } @ + + s w w + + w w w w w w w w w s + w w w / + + + @ w w w ] + + @ w w w w w w w w w s + + @ + @ + + s w w + + 5 w w g + @ + + w w w + @ + @ + w w w + [ w w q + @ + + s w w + + + @ a w w s / + + @ + + + + @ + + + @ + + s w w + + + + + + + + + @ w w w ] + + @ + s w w + w w w ] + + @ + + + + @ + + @ + + + w w w + + + + + a w w q + w w w + @ + + @ w w w + + s w w + + @ + a w w s / + + @ + + + @ + @ + + @ + @ + w w w + + [ n w w w w w 5 + + [ q w w w w w w w g @ + s w w + @ + + w w w w w w w w w w w w s @ + w w w + @ + w w w + w w w w w w w w w w + + @ + + @ + s w w + + + + + + + + + + + @ + + + + @ + @ + + s w w / 1 w w a w s + @ w w w < q w w w w w w w g + w w w + + + @ + w w w / + w w w / + + + w w q + + s w w + + w w w / + @ + w w q + @ + + + @ + + @ + + @ + s w w w w w w q j } @ + + s w w ] + + / w w s + + s w w + + w w w + + s w w + + / w w l + @ + + w w w + / w w n + @ + + w w w w w w w w w w w w s + + @ + + @ + + s w w + @ + + + @ j w w 9 w w w + + + @ + w w w + [ w w q + @ + + s w w w w w w w w w w w s @ + w w w w s w w ] + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + / w w q + @ + @ + + w w w + [ w w q + @ + + a w w g @ + + [ w w n + [ w w q + + @ 5 w w g w w w + + + @ 5 w w l + + @ + + @ + / w w l + + a w w w w w 9 + w w w + + + + + + @ + + a w w 1 n w w } + [ w w q + + + + l w w n 7 1 j w w 9 + [ w w q + @ + 5 w w g @ + + @ + @ + + @ + + n n w + @ < w w n + + w w w + + + + + + + @ j w w n 7 1 j w w 9 + [ w w q + + @ 5 w w g + q w w w w [ / w w q + + + + + + + + @ / w w q + + w w w + + + + + + @ < w w q + @ + + [ w w q + + + + w w w + + + + + + + @ + + @ + + / w w q + + + j w s ] + @ + w w w + + @ + 5 w w l + a w w g + + @ < w w q + @ + + q w w q + @ + + + @ + + @ + @ + + @ / w w q + @ + @ + @ + @ + [ w w q + + @ + / w w q + w w w + @ + + + @ + + + @ + + @ + / w w q + @ + @ + + w w w + w w w + + + @ 2 w w n + / w w q + + + @ n w w w + + @ + + @ + + + + @ + + + + / w w q + + + + 1 j w w w q + + l w w n 7 1 j w w 9 + / w w w + + + 5 w w l w w w + + + + + + + + / w w q + + / w w q + w w w + + + + + + + + @ + + + + / w w q + @ + @ + @ + @ + @ + + + @ + + @ + + @ / w w s + 1 w w s w a + [ w w n j w w n 7 1 j w w 9 + w w w + @ + + 1 w w s + [ w w q + @ + 5 w w g @ / w w q + [ w w q + + + 5 w w g + + @ + + + @ + + @ + + / w w q + + + + + + + + @ / w w q + @ + 1 w w n + / w w q + / w w q + / w w q + + 5 w w j + + @ 5 w w l + 5 w w j + + @ 5 w w l w w w + + + + + + @ + + + @ + + @ / w w q + + @ + + 7 w w w / w w w + @ + + 5 w w l + a w w g + + @ < w w q w w w + + + + + + @ + / w w w g a w w f + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ 2 w w l + + + + / j w w q + 5 w w j + + + @ j w w a + @ + l w w g + 5 w w j + + + f w w 7 q w w / + @ + n w w 7 + @ + + + + @ 2 w w j + + ] w w w w w 1 + q w w / + @ + @ + + + @ } w w a w w j + + 5 w w j + @ + + w w w + + + q w w 1 + 5 w w j + + + f w w 7 + @ + + + + @ + + @ + w w w 1 + j w w 9 + @ q w w / + @ + @ + + + w w w + + + q w w 1 + 5 w w j + + + f w w 7 @ + + + + + + 5 w w j + @ + @ + @ + + + 5 w w j + + q w w / + @ + @ + + 5 w w j + + @ + 5 w w j + @ + + q w w / + @ + @ + + + @ + + + @ 5 w w j + @ + ] w w j + + + q w w / + + + n w w 7 + j w w a + @ + l w w g + + + q w w w w 7 + + @ + + @ + + + + @ + + 5 w w j + + + + @ + + + + 5 w w j + + + + 5 w w j + w w w + + + 1 q l ] + + + @ + + @ 2 w w l + + + + / j w w q + q w w / + @ + n w w 7 + 5 w w j + @ + q w w w w 7 + + @ + + + @ + + + @ + @ + 5 w w j a n s [ + + [ w w w + + w w w + + + q w w 1 + 5 w w w ] + + j w w 9 q w w / + @ + @ + @ + 5 w w j + + 5 w w j + q w w / + @ + @ + @ + + + @ + + 5 w w j + + + + @ + + + + + @ + + @ + + + @ + + 5 w w l + 1 w w w w / + 7 w w g w w w + + + q w w 1 + w w w / + @ + n w w l + 5 w w j + + + f w w 7 + 5 w w j + 5 w w j + @ + f w w 7 @ + + @ + + + @ + + + @ 2 w w l + + @ + @ + @ + + 5 w w l + + + a w w f + 5 w w j + 5 w w j + 5 w w j + + c w w a @ + + j w w 9 + a w w a @ + + j w w 9 q w w / + @ + @ + + @ + + + @ + + 5 w w j + + + [ a w w w f + q w w / + + @ n w w 7 + j w w a + @ + l w w g q w w ] + @ + @ + + + 5 w w j + ] w w q + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + c w w w w w w w w w w w 7 + a w w a + @ + + l w w j + / j w w w a + a w w a @ + + q w w ] a w w q + + j w w n + + + @ + @ + + c w w a + @ + q w w w w + + j w w g + / f w g @ + + 1 w w w w w + + + c w w a + + @ + w w w [ + f w w w + + a w w a + @ + q w w ] [ w w q + + + @ + + + q w w w w w w w ] + + j w w g + / f w g @ + w w w [ + f w w w + + a w w a @ + + q w w ] + + @ + @ + + a w w a + + @ + + + @ + + c w w a @ + j w w g + / f w g @ a w w a + @ + + a w w a + + @ + j w w g + / f w g @ + + @ + + + a w w a + + + + n w w ] + + c w w q + @ j w w n + + l w w j + / j w w w 9 @ + l w w 9 w w q + [ w w q + @ + @ + + + @ a w w w w w w w w w q + @ a w w a + @ + + c w w a + g w w f + 1 q w q + + @ + + + @ + a w w w w w w w w w w w 7 + a w w q + + j w w n + @ a w w a + + l w w 9 w w q + @ < w w q + @ + + + @ + + a w w a j w w n / + a w w l + + w w w [ + f w w w + + a w w w j + 7 w w s + j w w g + / f w g + + a w w a @ + a w w a + j w w g + / f w g + @ + + @ + + c w w w w w w w w w q + @ < w w q + @ + + + @ + a w w a + + w w w j + + c w w a w w w [ + f w w w + + l w w g + / g w w w a + a w w a + @ + q w w ] + a w w a + a w w a + + + q w w ] < w w q + @ + + + @ + + c w w a + + @ + + + + @ + a w w a + @ + g w w 9 + a w w a + a w w a + a w w a @ + n w w w } + a w w q + + n w w w } + a w w q + j w w g + / f w g @ + + @ + + @ + a w w w w w w w w w w q + + a w w q + + j w w n + + l w w j + / j w w w 9 j w w g + / f w g @ + a w w a + + q w w < + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + n w w w w w w w w w w g @ + n w w 1 + + @ + a w w w w w w q w w } + n w w 5 + + / w w q + + q w w w w w w n ] + @ + + + + @ + n w w 1 + + + a w w w q + + + w w w w w w w 2 @ + + [ w w w w a + + @ n w w 1 + + + @ j w w w w w w w w + + n w w 5 + + / w w q + f w w j + @ + + + @ + 5 w w w w w w a + + @ + w w w w w w w 2 @ + j w w w w w w w w + + n w w 5 + + / w w q + + @ + + + @ + n w w 1 + + + @ + + + @ + n w w 5 + + + w w w w w w w 2 @ n w w 1 + + + @ n w w 1 + + + @ + w w w w w w w 2 @ + + + @ + + n w w 1 + @ + + 7 w w a @ + + q w w w w w w n ] + + c w w w w w w q w w } + j w w 7 + j w w 7 f w w j + + + + @ + + + n w w w w w w w w w f + + n w w 1 + + @ + n w w 5 + / s w w w w w w 2 + @ + + @ + + + n w w w w w w w w w w g @ + + q w w w w w w n ] + + n w w 5 + j w w 7 + j w w 7 + f w w j + + @ + + + @ + n w w 5 + q w w w w w w s [ + + j w w w w w w w w + + n w w l w w w w w 5 + + w w w w w w w 2 @ + n w w 1 + + n w w 1 + + w w w w w w w 2 @ + @ + + @ + n w w w w w w w w w f + + f w w f + + @ + + + + n w w 5 + + w w w ] + + n w w 1 j w w w w w w w w + + 1 w w w w w w s w w 9 + n w w 5 + + / w w q + + n w w 5 + n w w 5 + @ / w w q + f w w j + + + @ + + @ + n w w 1 + + + @ + @ + + + n w w 5 + + + n w w 1 + n w w 5 + n w w 1 + n w w 5 + + s w w n w w w w w < + @ s w w n w w w w w < + + w w w w w w w 2 @ + + + @ + + + n w w w w w w w w w l + + + + q w w w w w w n ] + @ a w w w w w w q w w } + w w w w w w w 2 @ + n w w 1 + + a w w g + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + s w w w w w w w s l 7 + + @ q w w / + + + + + j q w q a + q w w + + w w w ] + + 7 w w j + + + a q w w n a + + @ + + @ + + + + s w w + + @ + ] w w w n + @ + + g w w w j 5 + + @ + + w w w q + + @ + s w w ] + @ + + + j w w n 5 w w w + + s w w / + + 7 w w j + q w w 5 + + + @ + + + + 5 n w w q 7 + + @ + + + g w w w j 5 + + + + j w w n 5 w w w + + s w w / + + 7 w w j + + + @ + + + @ q w w / + @ + + @ + + + @ q w w / + @ + + g w w w j 5 + + w w w ] + @ + + s w w / + @ + + + + g w w w j 5 + + @ + + @ + + s w w / + + @ + @ w w q + + + + a q w w n a + + @ + + j q w q a + q w w + j w w 7 + @ } w w n q w w 2 + @ + + + @ + + s w w w w w w w w w [ + + s w w / + + + + s w w ] + + / g s w w l } @ + + + @ + + @ + w w w w w w w w q l 7 + + @ + + a q w w n a + + @ + w w w ] j w w 7 + @ } w w n + q w w 5 + + + @ + + + + s w w / + + a q w w q j ] + + + + j w w n 5 w w w + + s w w / a w w n 1 + + + + g w w w j 5 + + + s w w / + + w w w ] + + + g w w w j 5 + + + + + @ + + s w w w w w w w w w [ + + q w w [ + + + @ + @ + s w w / + + w w n + @ + s w w ] + j w w n 5 w w w + + + 5 n w w j 1 s w w + + s w w / + + 7 w w j + + s w w / + w w w ] + + 7 w w j + q w w 5 + + @ + + @ + + s w w ] + @ + + + + @ + + s w w / + @ + s w w ] + s w w / + w w w ] + w w w ] + / w w q + j w w j < + + / w w q + j w w j < + @ + + g w w w j 5 + + + @ + + @ + + s w w w w w w q j 1 + + @ + + + a q w w n a + + @ + + j q w q a + q w w + + + g w w w j 5 + + + s w w / + + [ w w w + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + + + + @ + + @ + + + + + + @ + @ + + + + + + + @ + + + @ + + + + + + @ + + + + @ + + + + + + + + @ + + + @ + + @ + @ + + + @ + + + + + + + + @ + + @ + + + + + + + @ + + 1 w w w 1 + + + + @ + + + + + @ + + + + + + + + + + @ + + + + + @ + @ + + + + / w s + + @ + + @ + @ + + + + + + + @ + + + @ + @ + + + + + + @ + + + + + + + + + + @ + + + + + @ + @ + + + @ + + + @ + + + + + + @ + + + @ + + @ + + + + + + + + @ + @ + + + + + + @ + + + + + + + @ + + + + + + @ + @ + @ + + + + + + @ + + @ + + @ + + + + @ + + + + + + + + @ + + + + + + + + @ + + @ + + + + + + + + + @ + + + + + @ + + + + + / w s @ + + @ + + @ + @ + + + + + + + + + + + + @ + + + + @ + @ + + + + + @ + + @ + + + + + + + @ + + + @ + + + + + + + + + + + + + @ + + + + + + + + + + @ + + + + + + + + + + + @ + + + + + @ / w q + + @ + + @ + @ + + + + + + + + + + + + + + + @ + + + + + + + + + + @ + + + + + + + + + + + @ + @ + + + + + + @ + @ + + + + @ + + + + + + @ + @ + + + + + @ + @ + + + @ + + + + + + + + + + + + + @ + + + + + @ + + @ + + + + + @ + + + + + + + @ + + + + + + + + + + + + + @ + + + + + + + [ w w n + @ + + + + @ + @ + + + + @ + + + + + + + + + + @ + + + + + / w s + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + + + + @ + + + + + + + + + + + + + + + 5 w w g + + + + + + @ + 5 w w g + + + + + + @ + + @ + + + + + + + @ + + @ + + @ + + + + + + + + + + + @ + + @ + + + + + + + + @ + + + @ + + + + + + + + @ + @ + @ + + + + + + @ + + + + @ + + + + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + @ + @ + + + @ + + @ + @ + + + @ + + @ + @ + @ + + + @ + + @ + @ + @ + + @ + @ + + @ + @ + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + @ + + + @ + + @ + @ + @ + + + / n w w l + + @ + + + @ + @ + + + @ + @ + @ + @ + @ + + @ + @ + + @ + + + @ + 1 n w 5 + + + @ + + + + @ + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + @ + + @ + + @ + + @ + + @ + @ + @ + + + @ + + + @ + + @ + @ + @ + @ + + + + @ + @ + @ + + + @ + @ + @ + + @ + @ + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + @ + @ + + @ + @ + @ + @ + + @ + + + @ + @ + @ + @ + + + @ + @ + + + @ + @ 1 n w 5 + + + @ + + + @ + + @ + @ + @ + @ + @ + + + @ + @ + + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + @ + @ + @ + + @ + + @ + @ + @ + @ + @ + + @ + @ + @ + + @ + @ + + + @ + @ + 1 n w 5 + + + @ + + + + @ + @ + @ + @ + @ + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + @ + @ + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + @ + + @ + + @ + @ + + + + @ + + + @ + @ + @ + @ + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + @ + @ + + + @ + @ + @ + @ + @ + @ + + @ w q l 1 + @ < q w w 7 + + @ + @ + + + + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + 1 n w 5 + + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + @ + + + @ + @ + + + @ + @ + @ + @ + @ + @ + @ + + a w w 7 @ + @ + @ + + + a w w 7 @ + @ + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + @ + @ + @ + @ + + + @ + + @ + @ + @ + + + @ + + + @ + @ + @ + @ + + + + @ + + @ + @ + + @ + @ + + + @ + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ w w w w w + + + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + @ + + @ + + @ n j 1 + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + @ + + @ + q j } + + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + + @ + + @ + + @ + + + + + @ + + + + @ + + + + + @ + + @ + + @ + + @ + + q j 1 + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + + + @ + + + @ + + q w w w w w w w w n + @ + + + + @ + @ + + + + @ + + + + @ + + + + + @ + + + + @ n j 1 + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + @ + + + + + @ + + + + + @ + n w w ] + + + @ + + @ + n w w ] + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + q w w j < + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + a n w w w w l 9 + + + @ + @ + + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + s w q + @ + + + @ + + + s w q + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + @ + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + 7 l w w s j 1 + + + @ w w w w w w w w j < + + @ + w w w w w w w w w w w + @ + + + l w w w l + + + @ + + w w w w w w w w w w w + w w w + + + @ + c q w w w l 7 + + @ + + + @ + + @ + + @ + w w w + + @ + + + w w w + @ + w w w w w + @ + + @ w w w w w + w w w w w w w w j < + + @ + @ + + + @ + + @ 7 l w w s j 1 + + @ + w w w a + + @ + + w w w + @ w w w w w w w w j < + @ + + + @ + c q w w w l 7 @ + + @ + + + + @ + / w w w w w w + @ + + / w w w w w w + + @ + + + @ n w w + + + + / w w w w w w + @ + + + + @ + + + @ + + + w w w + @ w w w a + @ + @ + w w w + + @ + c q w w w l 7 @ + + + @ + + @ j w w w n + @ + + + @ + + @ + + + / w w w w w w + + + @ + c q w q a + @ + + + / g s w w g ] + + + @ + + + + @ + + + @ + @ 7 q w w n 5 + + + @ + 7 q w q 7 + + @ + + + 7 q w w n 5 + + @ + / g s w w g ] + + + + @ + n w w + + + @ + + @ + + q w w [ + + @ + + [ w w q + w w w + + w w w + @ w w w + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ w w w + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + w w w + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + w w w w w w w w w w + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + j w w w w w w w g @ + + w w w w w w w w w s [ + + + w w w w w w w w w w w + + @ + + w w w w w + @ + + + @ w w w w w w w w w w w + w w w + @ + + q w w w w w w w g @ + + @ + + + @ + + @ + + w w w + @ + + @ + w w w + + + w w w w w < + + @ < w w w w w + w w w w w w w w w s [ + + + + @ + + + @ + j w w w w w w w g @ + + w w w w + + + @ + w w w + + w w w w w w w w w s [ + @ + + @ n w w w w w w w g @ + + + @ + + @ + 7 w w w w w w + + + @ 7 w w w w w w + @ + + @ + 7 w w w + @ + + 7 w w w w w w + + + @ + + @ + @ + + @ + + w w w + + w w w w + + + + + w w w + @ + q w w w w w w w g @ + + + @ + + w w w w w + + + @ + + + @ + + @ + 7 w w w w w w + @ + + j w w w w w j + + @ < w w w w w w s / @ + + @ + @ + + @ + + + @ j w w w w w w 2 @ + + j w w w w w f + + @ + j w w w w w w 2 @ + [ s w w w w w w ] + @ + + 7 w w w + @ + + @ + + @ + f w w 9 + @ + + @ 9 w w f + w w w + @ w w w + + w w w + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + w w w + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + w w w + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ w w w w w w w w w w + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + f w w w w w w w w w 7 @ + w w w w w w w w w w l + + @ w w w w w w w w w w w + + + @ 5 w w w w w 5 + + @ + + w w w w w w w w w w w + w w w + + @ 9 w w w w w w w w w 7 @ + + @ + + + @ + + + @ w w w + + + @ + + w w w + @ + w w w w w a + + + a w w w w w + w w w w w w w w w w l + + @ + + @ + + + f w w w w w w w w w 7 @ + w w w w a @ + + + w w w + @ w w w w w w w w w w j + + @ + a w w w w w w w w w 7 @ + + @ + + + @ j w w 9 + + + @ + + + j w w 9 + + + @ + + + + 7 w w w w + + @ + j w w 9 + + + @ + + @ + + + @ + + + @ + + w w w + @ w w w w a + @ + + w w w + + a w w w w w w w w w 7 @ + + + @ 5 w w w w w 5 + + + @ + + + @ + + @ j w w 9 + + + @ + + [ w w j + l w w < + + l w w a + a w w g + + @ + + + + @ + + @ + 1 w w j + l w w q + @ 9 w w f + l w w [ + + 1 w w j + l w w q + + l w w a + a w w g + + @ 7 w w w w + + @ + + + @ + + [ w w n + + + @ + q w w < + + + @ + + w w w + @ w w w + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + w w w + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + w w w + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + w w w w w w w w w w + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + [ w w w a + + 1 n w w q + + w w w + + + + a w w w + + + w w w + + + + + + + + @ + + + j w w l w w g + @ + + @ + + + + w w w + + + + @ w w w + + + q w w g + + / l w w q + + + + @ + + + @ + + + w w w + @ + + + @ w w w + + + w w w w w j + @ + n w s w w w + w w w + + + + a w w w + + + @ + + @ + [ w w w a + + 1 n w w q + + w w w w w + + @ + w w w + + w w w + + + + a w w w + + + + q w w g + + / l w w q + + + + @ + + + s w w [ + @ + + @ + + s w w [ + @ + + + @ [ n w w w w w + @ + + s w w [ + @ + + @ + + @ + + + @ + + + @ + w w w + + w w w w w + + @ + w w w + @ n w w j + + / l w w q + + @ + + j w w l w w g @ + + @ + @ + + + @ + s w w [ + @ + + + @ f w w } + 1 w w f + + n q w + + + w w w + + + @ + @ + + + @ + + j w w ] + < q f 5 + + q w w ] + < w w f + + j w w ] + < q f 5 + + n q w + + + w w s @ < n w w w w w + @ + + @ + + + @ + q w w / + @ + / w w q + @ + + + @ + w w w + + w w w + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + w w w + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + w w w + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + + @ + w w w + + + + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + + @ + + + f w w j + + + + [ q f < + @ w w w + @ + + + w w w + @ + w w w + @ + @ + @ + + @ + @ + q w w ] w w w + + + @ + + @ + + w w w + @ + + + w w w + @ + w w w + @ + + / w w w + @ + + @ + @ + + @ + + w w w + + @ + + + w w w + @ + w w w l w w + + + w w l w w w + w w w + @ + + + w w w + @ + + @ + + + f w w j + + + + [ q f < + @ w w w n w a + + + w w w + @ w w w + @ + + + w w w + @ + + w w w + @ + + / w w w + @ + + @ + @ < w w w + + + + @ + @ < w w w + + + + @ + + w w w n w w w + + + [ w w w + + + + @ + + @ + + @ + + @ + + + @ w w w + + w w w n w a + + + w w w + + w w w + + @ + / w w w + + + @ + q w w ] w w w + + + + @ + + @ + + [ w w s + + + + @ + + n w w + + + w w n + + + + + + @ + w w w + @ + + + + @ + + + @ + l w w + + + + + + + @ w w w + + + w w n + + l w w + + + + + + + @ + + + + @ + w w w + w w w n w w w + + + @ + + @ + + + f w w a + + + a w w f + + w w w + + w w w + @ w w w + + @ + + j s w s g / @ + + w w w + @ + + w w w + w w w 5 q w q + w w w / j w w g @ + @ + + 1 j w w w q 2 @ + + w w w + j s w q a + + @ w w w + j s w q a + + @ + j s w s g / @ + + + + @ + @ + + + 7 n w w j 1 + + + @ j s w s g / + + @ + + j s w j / w w w + @ + + j s w s g / @ + [ w w q + + @ q w w [ + @ + + + @ + @ + + + w w w + @ + @ + @ + + @ w w w 5 q w n + + 1 j w w w q 2 @ + + w w w + j s w q a + @ + + @ 7 n w w j 1 + + + @ j q w w g ] + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + q w w < + @ + + + + + + @ + w w w + + @ + a w w q + + + w w w + + @ + + + @ + + + + [ w w n + n w w < @ + + + @ + + @ w w w + + @ + + w w w + + + q w w l 2 @ + + + + + + + @ + + + + @ + + @ + w w w + @ + + @ + w w w + + + w w w a w w 1 + 1 w w a w w w + w w w + + @ + a w w q + + + @ + + @ + q w w < + @ + + + + + + @ + w w w < w w + @ + w w w + + w w w + + @ + a w w q + + @ + q w w l 2 @ + + + + + + + @ + + + + a w w q q w l < + + + a w w q q w l < + @ + w w n + w w w + @ + a w w q q w l < + + @ + + + + @ + + @ + + + w w w + @ w w w < w w + @ + w w w + @ n w w n 2 + + + + + + @ + + + [ w w n + n w w < @ + + + @ + + + @ 9 w w q q w n [ + + @ q w w + @ + w w s @ + @ + @ + + 7 w w q + + + @ + + + @ + + + + w w n a w w j / + @ + w w w + @ + w w w + @ w w n a w w j / @ + + + @ + + + 7 w w q + w w n + w w w + @ + + + @ + + @ + 5 w w n + @ + q w w 2 + @ w w w + + w w w + + w w w + @ + @ w w w w w w s ] + + w w w + + @ + w w w + w w w w w w l + w w w w w w w w n + + @ 5 w w w w w w w 5 + + w w w q w w w w w a + + w w w q w w w w w a + + w w w w w w s ] + @ + + + @ + + @ j w w w w w w 1 + + w w w w w w s ] + + @ n w w w w s w w w + + @ w w w w w w s ] + + a w w a + a w w a + + + @ + + @ + + + @ + w w w + + @ + + + + @ + w w w w w w l + 5 w w w w w w w 5 + + w w w q w w w w w a + @ + j w w w w w w 1 + + w w w w w w s / + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + @ + + w w w + + + @ + @ + @ + + + w w w w w w w w w w a + @ + w w w w w w w w w w + @ + + a w w a + a w w a + + @ + + + @ + w w w + @ + @ + w w w + @ + 5 w w w w w n 9 / @ + @ + + + @ + + + @ + + + w w w + + + @ + + w w w + @ + w w w 5 n w a + a w n 5 w w w + w w w w w w w w w w a + @ + + + @ + + w w w + + + @ + @ + @ + + + w w w + j w g + + w w w + @ w w w w w w w w w w a + + + @ 2 w w w w w n 9 / @ + @ + + + @ + + l w w w w w w s @ + + l w w w w w w s + + + q 7 + + w w w + + + l w w w w w w s @ + + + @ + + + @ + + @ + + w w w + + w w w + j w g + + w w w + + 5 w w w w w l a ] + + + @ + + c w w a + a w w a + @ + + + @ + + + l w w w w w w q + + + w w w + + + w w w + + + @ + + @ q w w 7 + @ + + @ + + @ + @ + + w w w w w w w q + + + q w w / + / w w w + + w w w w w w w q + + @ + + @ + @ q w w 7 + q 7 + + w w w + + @ + + + @ + + + + w w w + + + w w s @ + + w w w + @ w w w + + w w w + + + f w w 2 + a w w f + + w w w + @ + + w w w + w w w n + + / + w w w n + + q w w a + + q w a + + a w w n + + w w w n ] + j w w q + + w w w n ] + j w w q + f w w 2 + c w w f + + @ + + + @ + 7 w w n / + j w n + f w w 2 + c w w f + @ a w w n / + q w w w + + f w w 2 + a w w f + + + q w s 1 w w q + + @ + + @ + + + @ + + + w w w w w w w w w + + + w w w n + + / + q w a + + a w w n + + w w w n ] + j w w q + + 7 w w n / + j w n + f w w 5 + a w w f + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + w w w + @ + + @ + + + + @ + w w w w w w w w w q + + + + w w w w w w w w w w + + @ + q w w < + ] w w q + + + @ + + + + w w w + + + + + w w w + + + + 7 w w w w w w w a + + + @ + + @ + + + @ + + w w w + @ + + + @ w w w + + + w w w 1 f w n + q w f } w w w + w w w w w w w w w q + + + + @ + + + @ w w w + @ + + @ + + + + @ + w w w + ] w w / + w w w + + w w w w w w w w w q + + @ + + + 7 w w w w w w w a + + + @ + + @ + j q w } + l w w g @ + j q w } + l w w g @ + + + @ + w w w + @ + j q w } + l w w g + @ + + @ + + + @ + + @ + w w w + @ w w w + ] w w / + w w w + @ + 7 w w w w w w w a + @ + @ + q w w < + ] w w q + + @ + + + @ + + l q q 1 + l w w j + + w w w + @ + w w w + @ + + + @ n w w q + + + @ + + @ + + + + @ + w w w j + j w w a @ + f w w j + j w w w + + w w w j + j w w a + + + @ + + n w w q + + + + @ + w w w + @ + + @ + + + @ + + g w w 7 @ 7 w w j + + + w w w + + w w w + @ w w w + @ + q w w + + + w w q + + w w w + + + @ w w w + w w w 5 + + + @ w w w 5 + + 5 w w n + @ + + + + @ + w w w + @ w w w } + + + w w w + @ w w w } + + + w w w + q w w + + @ w w n + @ + + @ + + + n w w 1 + + ] n 1 + q w w + + @ w w n + + q w w 2 + @ 2 w w w + @ n w w + + + w w q + @ + 1 w w w w w } + @ + + @ + + @ + + @ + + w w w w w w w w w + @ + w w w 5 + + @ + + + + + @ + w w w + + w w w 1 + + + w w w + @ n w w 1 + + ] n 1 + q w w + + + w w q + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + w w w + + @ + + + @ + + + @ w w w w w w w s 5 + + @ + + w w w w w w w w w w + @ + + w w q + + + q w w ] + + + @ + @ + w w w + @ + @ + w w w + @ + @ + + a j w w w w w a + + + @ + + @ + + + @ + w w w + + @ + + + w w w + @ + w w w 1 2 w w / w w 2 1 w w w + w w w w w w w w 2 + + @ + + + @ + + + w w w + + + @ + + @ + + + @ w w w + + j w g + w w w + @ w w w w w w w s 5 + + + + @ + @ + + a j w w w w w a + + + @ + + + + + + @ + ] w w q + + + + + + @ ] w w q + @ + + + @ w w w + + + + + + + @ ] w w q + + @ + + @ + + + @ + + + w w w + + w w w + + j w g + w w w + + + @ + a j w w w w w a + + + + w w q + + + q w w ] + + @ + + @ + + + + + + + ] w w q + + w w w + + + w w w + + @ + + j w w w 2 + @ + + @ + + @ + @ + + + w w w ] + ] w w q + + + q w w w w w w w + + w w w ] + ] w w q + @ + + + j w w w 2 + @ + + + @ w w w + + + @ + + @ + + @ + 5 w w j + l w w 2 + @ + w w w + @ w w w + + w w w + + + w w w w w w w w w + + w w w + @ + + w w w + w w w + @ + + + w w w + + @ + w w w + + + @ / a l n w w w + + w w w + @ + + w w w + + w w w + @ + + w w w + w w w w w w w w w + + + @ + + @ + w w w + + @ + + + + w w w w w w w w w + @ w w w + + + @ w w w + + w w w w w w w w w + + + + f w w w f + + + @ + + + @ + + + + @ + w w w w w w w w w + + + w w w + @ + + + @ + / c j q w w w + + w w w + + @ + w w w + + w w w + + @ + + + + w w w w w w w w w + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + q w w 1 + + + @ + + @ + + + w w w + + j w w n + + + @ + w w w + + + + + + + @ + + 7 w w w w w w w w w 7 @ + + @ + + + w w w + + @ + + w w w + + @ + + + + + + 1 j w w q + @ + + @ + + @ + + + @ w w w + + + @ + + w w w + + + w w w 1 / w w g w w / 1 w w w + w w w + + j w w n + @ + @ + + @ + @ + q w w 1 + + + @ + + @ + + + w w w + @ ] w w / w w w + + w w w + + j w w n + @ + + @ + + + @ + + + 1 j w w q + @ + + @ + @ + @ + + + + w w w + @ + + @ + + + w w w + + @ + + + w w w + @ + @ + @ + + + w w w + @ + + + @ + @ + + @ + + w w w + @ w w w + + ] w w / w w w + @ + + + + + + 1 j w w q + @ + 7 w w w w w w w w w 7 @ + + @ + + @ + @ + @ + + + w w w + + w w w + @ + w w w + + + @ a w w w 7 @ + + @ + + + @ + + + + @ + w w w + + + w w w + @ + / j w w a n w s @ + w w w + + + w w w + + + @ a w w w 7 @ + + @ + + + w w w + @ + + + @ + + @ + + + w w w ] w w s + @ + + w w w + + w w w + @ w w w + @ + w w w w w w w w w + @ w w w + + @ + w w w + w w w + + @ + + w w w + + + + w w w + @ + n w w w w w w w + + w w w + + @ + w w w + @ w w w + + @ + w w w + w w w w w w w w w + @ + + + @ + + w w w + @ + + @ + + w w w w w w w w w + + w w w + @ + + w w w + @ w w w w w w w w w + @ + + 1 w w w / + @ + + + @ + + + @ + + + @ w w w + + + + + + @ + + w w w + + + @ + + n w w w w w w w + + w w w + @ + + w w w + @ w w w + + + @ + @ + w w w w w w w w w + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + g w w j + @ + + 1 q f [ + + w w w + @ + l w w a @ + + + w w w + @ + @ + @ + + + @ l w w w w w w w w w j + @ + + + @ + w w w + @ + + + w w w + @ + w w w ] + + + + w w w + + + @ + + + @ + @ + + q w w 1 + + @ + [ w w w + + @ w w w } + q w w w q + 1 w w w + w w w + @ + l w w a + + + @ + + + + + g w w j + @ + + 1 q f < @ + w w w + + + f w j w w w + + w w w + @ + l w w a + @ + + + w w w ] + + + + w w w + + + @ + + + + + @ + @ + w w w + + @ + + @ + + w w w + @ + + @ + w w w + + @ + + + + @ + w w w + + + @ + + + + @ + + @ + w w w + + w w w + @ + f w j w w w + + w w w ] + + + + w w w + + @ j w w w w w w w w w l + + + + @ + + + + @ + + @ + w w w + @ n w w + + + w w l + @ + [ w w w 9 + + + @ + + @ + + + @ + + + @ n w w + @ + w w w + + + + + + + + w w n + + n w w + @ + w w w + @ + [ w w w 9 + + + @ + @ + + w w w + + @ + + + @ + + + @ + j w w n w w j + + + @ w w w + + w w w + + w w w + + + w w w + + + + + + @ + w w w + @ + + w w w + w w w + @ + + @ w w w + @ + + w w w + + j w w n a ] w w w + + w w w + @ + + w w w + + w w w + @ + + w w w + w w w + + + + + + @ + + @ + + + @ w w w + + + @ + + @ w w w + + + + + + @ + w w w + + @ + w w w + + w w w + + + + + + + + @ + n w w w g @ + + @ + + @ + + @ + @ + + w w w + @ + @ + + @ + + w w w + @ + + @ j w w n a ] w w w + + w w w + + + @ w w w + + w w w + @ + + + + + w w w + + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + @ 1 w w w a + + 1 q w w n + + w w w + + + + w w q / + @ + w w w + + @ + + + + @ + + s w w w w w w w w w w + + + @ + + + w w w + + + @ + w w w + + + j w w q ] + @ j w w q + @ + + + @ + + + + @ + n w w s 5 + + [ n w w l + + + w w w 1 + l w w w j + 1 w w w + w w w + + + + s w w ] + + + @ + @ + @ 1 w w w a + + 1 q w w q + + w w w + @ + + w w w w w + + w w w + + + + w w s / + + @ + j w w q ] + @ j w w q + @ + + + @ + n n w + + [ w w n + + n n w + @ < w w n + + + @ + + w w w + @ + n n w + + [ w w n + @ + + @ + @ + + + @ + + w w w + @ w w w + + + + w w w w w + + j w w q ] + @ j w w q + @ + w w w w w w w w w w q + @ + + + @ + @ n n w + + [ w w n + + f w w 1 + 1 w w f + + + q w w j + + @ + + + @ + + @ + + @ + + + f w w [ + / w w n @ + 7 j q + @ / w w f + + f w w [ + / w w n + + @ q w w j + + @ + + + + @ + w w w + @ + + @ + + + @ + + + 7 w w w w w 7 @ + + + w w w + @ w w w + + w w w + @ + q w w [ + @ + @ + + + w w w + + + [ w w w + w w w + + + @ + w w w 5 + + 5 w w l + + w w w + + + w w w + @ w w w + + + @ w w w + + w w w + + + @ w w w + q w w [ + @ + @ + + + @ + + @ + + n w w 2 @ + / l 1 + q w w < @ + @ + + + @ n w w 2 @ + 5 w w w + + q w w [ + @ + @ + @ + + 7 w w s w w 1 + + + @ + + @ + + + + @ + w w w + + + + @ + + @ + w w w + + @ + + w w w + + + w w w + @ w w w + @ + + w w w + @ n w w 2 + @ / l 1 + q w w [ + @ + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + j w w w w w w w w w 5 + + w w w + @ + + a w w j + + + w w w w w w w w w w w + 1 w w l + + + + + n w w 2 @ + + @ + + w w w + @ + + + w w w + @ + 1 w w w w w w w w w a + + w w w + @ + @ + + + 7 w w w w w w w w w w 7 + @ + w w w + + a w w w 9 + + w w w + w w w + @ + @ a w w g @ + + + @ + + + + j w w w w w w w w w 5 + + w w w + + @ + a w w w w + @ w w w + @ + + a w w j + + + @ } w w w w w w w w w a + + @ + + @ + g w w j + l w w 7 @ + g w w j + l w w 7 @ + + + @ + w w w + + + g w w j + l w w 7 + + w w w + + + @ + + + @ w w w + + w w w + @ + + a w w w w + @ 1 w w w w w w w w w a + + 1 w w j + + + + + n w w 5 + + @ + + + + g w w j + l w w 7 + @ } w w l + l w w < + @ 7 w w j + + + + @ + w w w + + + @ + @ + + 1 w w j + f w w a + @ q w w g + l w w < + + 1 w w j + f w w a @ + 7 w w j + + + + @ + @ + + + w w w + + + @ + + @ + + @ + @ + w w w w w + + @ + + w w w + + w w w + @ w w w + + + f w w j + 5 w w l + + q w w g @ / n w w w + w w w + @ + + + w w w q ] + q w w 9 + @ s w w 5 + j w w w + + w w w + @ + + w w w + @ w w w + @ + + w w w + f w w j + 5 w w l + + + @ + + @ + 7 w w q ] + j w q + f w w j + 5 w w l + + a w w q ] / n w w w + @ f w w j + 5 w w l + + @ w w q ] s w q + @ + w w w + + @ + + + + w w w + @ + + + @ + + + w w w + @ + + + w w w 2 @ j w w w + + w w w + + + @ w w w + + 7 w w q ] + j w q + f w w j + 5 w w l + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + l w w w w w w w g + @ + w w w + + @ + + w w w < @ + w w w w w w w w w w w + f w w 9 + @ + @ + a w w f + + @ + + @ w w w + + @ + + w w w + + + + j w w w w w w w l + + @ w w w + + + + @ + @ + j w w w w w w w w g @ + + + w w w + @ } w w w 1 + + w w w + w w w + + + + + w w w < @ + + + @ + @ + + l w w w w w w w g + + @ w w w + + + + + w w w w + + w w w + + + @ + w w w < @ + + + j w w w w w w w l + + @ + + @ + + / s w w w w w j + + + / s w w w w w j + + @ + + + + w w w + @ + / s w w w w w j + @ + w w w + @ + + @ + + + w w w + @ w w w + + @ + + w w w w + + + j w w w w w w w l + + @ f w w 9 + @ + @ + a w w f + + + @ + @ + / s w w w w w j + + + @ j w w w w w g + @ + l w w w w w w w w + w w w + @ + + + + @ + + j w w w w w n + + + 1 w w w w w w f + @ + + j w w w w w n + + + l w w w w w w w w + + + @ + w w w + @ + + + @ + + @ + + + + l w w w j + + @ + + w w w + @ w w w + + w w w + @ + / q w w w w w s [ + + a w w w w w q w w w + w w w + + @ + + w w w s w w w w n + + + f w w w w w s w w [ + w w w + + @ + w w w + + w w w + + + @ w w w + / q w w w w w q [ + @ + + + @ + + + j w w w w w w 2 + / q w w w w w s [ + + + q w w w w q w w w + + / q w w w w w q [ + + f w w 7 + a w w a + + w w w + @ + @ + @ + w w w + + @ + + + @ + + w w w + + + @ + f w w w w w s w w [ + w w w + @ + + w w w + @ + j w w w w w w 2 + / q w w w w w q [ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + 7 n w w s j 1 + + + + w w w + @ + + + a w w n + + w w w w w w w w w w w + q w w / + + + + + [ w w q + + + @ + + w w w + @ + + @ w w w + @ + + + 5 j w w w n a + + + + w w w + @ + + + @ + + + 5 j w w w w l 7 + + @ + + w w w + + + w w w + @ + w w w + w w w + @ + @ + a w w n + @ + + + @ + + + + 7 n w w s j 1 + @ + + w w w + @ + @ + a w w w + @ w w w + @ + + + a w w n + + @ + + 5 j w w w n a + + + + @ + + + @ + / g s w q a + + @ + @ / g s w q a + + @ + + @ + + w w w + + @ + / g s w q a + + + + w w w + + @ + + @ + + w w w + + w w w + @ + + @ a w w w + @ + + 5 j w w w n a + + + + q w w / + + + + + [ w w q + @ + + @ + + + / g s w q a + @ + + + + f w w q a + + + + s w w w w w w w w + w w w + + @ + @ + + + @ + a q w n a + + @ + + 1 n w w q 2 + + + + @ + a q w n a + + @ + s w w w w w w w w + @ + + + w w w + + @ + + + @ + + + @ + + 7 w w w 7 @ + + @ + w w w + + w w w + @ w w w + + + + + f q w w j [ + + + + c q w w g ] w w w + w w w + @ + + @ w w w < l w w g + @ + + + c w w q a / w w j + w w w + @ + + w w w + @ w w w + @ + + w w w + + + f q w w j < + + + + @ + + + @ + + 7 q w w j 1 + + + + f q w w j [ + + @ + + j w w j < w w w + @ + + f q w w j < + + [ w w n + + + q w w [ + w w w + + + + + + + w w w + @ + @ + + @ + + w w w + @ + + + + c w w q a / w w j + w w w + + @ + w w w + + + + 7 q w w j 1 + + + + f q w w j [ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + + + @ + + @ + @ + + + + @ + + @ + + + + + + @ + + + + + + + + + + + @ + + + + @ + @ + + + + + + + @ + + + @ + + + @ + + + + + + @ + + @ + + + + + + + + + + @ + + + + s + @ + @ + + + @ + + + + + + + + + @ + + @ + + + + @ + + + + @ + + + + + + @ + + + @ + + + + + + + + + + @ + + + @ + @ + + + + + @ + + + + + @ + + + @ + + + + + + + @ + + + + + @ + + @ + + + + + + @ + + @ + + + + + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + + + @ + + + + @ + @ + + + q + @ + + + + @ + + + + @ + + + + @ + + + + + + + @ + + + @ + + + + + + + + @ + + + + + @ + @ + @ + + + + + + + + @ + + @ + + @ + + + + @ + + @ + + + + + + + @ + @ + + + + + + + + + @ + + + q + @ + + + + @ + + + + + + + + + @ + + + + + + + + + @ + @ + + + + + + + + + @ + + + + + + + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + + + @ + + + + @ + + + + @ + @ + + + + + + + + + @ + + @ + + + + + + + @ + + + + @ + + + + + + + + + + + @ + + @ + + @ + + + + + + + + + + + @ + + + @ + + + @ + + + + @ + + + + + @ + @ + + + + + + @ + @ + + + @ + + + @ + + + + + + + + @ + + + + + + + + + @ + + + + + + + + + + + @ + + + + + + + + @ + + + + + + + @ + + + + + + + + q + @ + @ + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + + + + + + + + + @ + + + + + + @ + @ + + + + + + + + @ + + + + + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + @ + @ + @ + @ + + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + @ + @ + + + @ + + @ + @ + @ + @ + + @ + @ / j a + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + @ + + + @ + + + @ + @ + @ + @ + + @ + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + @ + + @ + @ + + @ + @ + + @ + + / j c + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + @ + + + @ + + + @ + @ + @ + + @ + @ + @ + + + + @ + + @ + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + @ + @ + @ + @ + + + @ / j a + + @ + @ + + @ + @ + @ + + @ + + + @ + @ + @ + @ + + @ + + @ + @ + @ + @ + + + @ + @ + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + @ + @ + @ + + @ + + + @ + @ + @ + + + @ + + + @ + @ + @ + @ + @ + + + @ + + @ + + + @ + @ + @ + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + @ + @ + + @ + @ + @ + @ + @ + + + @ + @ + @ + @ + @ + + + @ + @ + @ + + @ + @ + @ + @ + + + @ + @ + @ / j a + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + @ + @ + @ + + + @ + @ + @ + + @ + + @ + @ + @ + + @ + @ + @ + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + l f + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + + @ + l f + @ + + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + l f + + @ + + + + @ + + + + + @ + + @ + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + l f + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + @ + @ + + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + @ + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + w w w + + @ + + + @ + + @ + + + @ + + @ + + w w w + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ w w w + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + / 9 n w w w q g 5 + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + l + + @ + w w w + @ + + + + @ + + @ + + + @ + + + @ w w w + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ w w w + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + j s w w j @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + w w w + @ + + @ + + + @ + + @ + + + @ + + + w w w + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + w w w + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + f w w w w w w w w w n [ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + 5 s w + + + + w w w + + @ + @ + + + @ + @ + + + @ + + + w w w + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + w w w + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + l w w w w j + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + w w w + + + @ + + @ + + + @ + + @ + + + @ + w w w + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + w w w + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + q w w g 5 + + + [ 9 w w q [ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + w w w + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + w w w + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + w w w < + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + w w w + @ + + + @ + + @ + + + @ + + @ + + + w w w + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + + @ + w w w + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + n w n [ + + + @ + + + + q w n + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ w w w + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + w w w + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + w w w + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + + @ + @ + + + @ + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + w w w / j w w a + 1 q w s 7 @ + @ + 1 j w w w q 2 + + @ w w w 5 q w q + + + 7 n w w j 1 + + + @ + j s w s g / @ + w w w + + @ + 1 j w w w q 2 + + @ + + @ + + w w w + f w w q 7 @ + + @ + j q w w g ] @ + + w w w 5 q w q w w w + j s w q a @ + + @ 1 j w w w q 2 + + @ w w w + j s w q a @ + + @ + j s w j / w w w + + + @ j q w w g ] + + w w w w w w w w + + + a w q + + 5 q w f 1 w w f + q w 7 + @ + 7 n w w j 1 + + @ w w w 5 q w q + + + j s w s g / @ + + 1 j w w w q 2 @ + w w w w w w + + w w w + @ + 5 l w w w l } @ + + @ + @ + + w w w + @ + w w w + j s w q a + + + 5 l w w w l } + @ + + 1 l w w w n 5 + @ + + + @ + + + + w w w + w w w + + @ + + w w w + @ + 5 n w w q 2 + @ + @ w w w + j s w q a + + @ + + @ + w w w w w w + w w w 5 q w q + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + + @ + @ + + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + w w w w w w w w l w w w w w 7 @ + 5 w w w w w w w 5 + + w w w w w w l + + j w w w w w w 1 + + + w w w w w w s ] + w w w + @ + 5 w w w w w w w 5 + + + @ + + @ w w w q w w w w w 9 @ + + w w w w w w s / + + w w w w w w l w w w n w w w w w a + @ 2 w w w w w w w 5 + + w w w q w w w w w a + + + q w w w w s w w w + @ + w w w w w w s / + w w w w w w w w + @ + w w 5 + 5 w w w w g w w 7 + 7 w l + + j w w w w w w 1 + + w w w w w w l + + w w w w w w s ] + 5 w w w w w w w 5 + w w w w w w + @ w w w + + a w w w w w w w 5 + + + + + @ + w w w + + + w w w q w w w w w a @ 9 w w w w w w w 5 + + 5 w w w w w w w 2 + + @ + + + @ + + w w w + j w w 2 + + @ 5 w w g + + j w w w w w w f + + + w w w q w w w w w a + + @ + + + w w w w w w + w w w w w w l + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + @ + + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + w w w j + 7 w w w l + 9 w w q + + q w a + + a w w n + + w w w n + + / + 7 w w n / + j w n + @ f w w 2 + a w w f + w w w + + + q w a + + a w w n + @ + + + @ + w w w n / + a w w q + + f w w 5 + a w w f + + w w w n + + / w w w n ] + j w w q + + q w a + + a w w n + + w w w n ] + j w w q + @ a w w n / + q w w w + + f w w 5 + a w w f + + + + + 7 w w l + + 7 w n + + w w w w w w w w [ + / w s + 7 w w n / + j w n + + w w w n + + / + f w w 2 + c w w f + q w a + + a w w n + + w w w + + @ + w w w + @ s w w [ + 5 w w q + + @ + + + + w w w + @ + w w w n ] + j w w q + w w w < + 5 w w q + + q w a + + a w w q + + + @ + + @ + + w w w + 5 w w g @ + + j w w 2 @ 1 w w n / ] n w w 1 + + w w w n ] + j w w q + + + @ + + + w w w + + @ w w w n + + / + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + + w w w [ + + w w w < + + w w w + @ + + + + @ + w w w + @ w w w 5 + + + @ n w w 1 + + ] n 1 + + q w w + + + w w q + w w w + @ + + + + + @ + w w w + + + @ + + + w w w 1 + + + w w w + + q w w + + + w w q + + w w w 5 + + + w w w 1 + + + w w w + + + + + + @ + w w w + @ w w w } + + + w w w + + q w w 2 + + 5 w w w + + q w w + + + w w q + @ + @ / s w q + + @ j w 9 @ 9 w w q + 5 w w w + + + w w + n w w 1 + + ] n 1 + + w w w 5 + + + @ n w w @ + + w w q + + + + + @ + w w w + + w w w + @ + + w w w + + w w w a + + + + + + @ + @ + @ + w w w + + + w w w 1 + + + w w w + w w w a + + + + + + @ + + + + @ + w w w + @ + + @ + + @ + w w w + + q w w + + @ q w q + + l w w 2 + + 5 w w j + + w w w 1 + + + w w w + @ + + @ + + w w w + @ + w w w 5 + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + w w w + + @ w w w + @ + w w w + + + @ / a l n w w w + + w w w + + @ + + w w w + + @ + + + + @ w w w w w w w w w + w w w + + @ + + / c j q w w w + @ + + @ + + w w w + + @ + w w w + @ w w w w w w w w w + + w w w + @ + + w w w + + @ + w w w + @ + @ / a l n w w w + + w w w + @ + + w w w + @ w w w + @ + + w w w + @ w w w w w w w w w + + + + q w w } + @ + n w 1 + n w w 2 + + w w n + @ + w w + w w w + + @ + + + + @ w w w + + @ + + w w w w w w w w w + @ + / c j q w w w + + w w w + + + @ w w w + + n w w w w q 7 @ + + + + + @ + + w w w + @ + w w w + + @ + w w w + n w w w w q 7 @ + + + @ + / c j q w w w + + w w w w w w + w w w + @ a w w 7 + 7 w w a @ + s w w + @ + + w w w + + w w w + + @ + w w w + + @ + + @ + w w w + + + w w w + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ w w w + + + w w w + + + w w w + @ + n w w w w w w w + + w w w + + + @ + w w w + @ + + @ + + + w w w w w w w w w + w w w + @ + + n w w w w w w w + + + @ + + @ w w w + + + @ w w w + + w w w w w w w w w + @ w w w + + @ + w w w + @ + + w w w + + @ n w w w w w w w + + w w w + + @ + w w w + + w w w + + + @ w w w + + w w w w w w w w w + @ + c w w f + + + + w w + + s w w + @ + w w f + + 5 w n + w w w + @ + + @ + + + w w w + + + @ + w w w w w w w w w + + n w w w w w w w + + w w w + @ + + w w w + @ + a q w w w w n @ + @ + + + @ + w w w + + + w w w + @ + + w w w + + a q w w w w n @ + + + n w w w w w w w + + w w w w w w + w w w + + / w w l + l w w / + + w w w + + @ + w w w + + w w w + @ + + w w w + @ + + + + + w w w + @ + w w w + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + w w w + @ + w w w + @ + w w w + + j w w n a ] w w w + + w w w + @ + + + w w w + + + @ + + @ + w w w + + + + + + @ w w w + + + j w w n a ] w w w + @ + + + @ + w w w + @ + + w w w + @ w w w + + + + + + @ + w w w + + + + w w w + + + @ w w w + + j w w n 9 / w w w + @ w w w + + + @ w w w + + w w w + @ + + w w w + @ w w w + + + + + + @ + 1 w w n + @ + @ + w w + @ w w w + + 7 w w 7 @ + n w 9 + w w w + + + @ + + @ + w w w + @ + + + w w w + + + + + + @ j w w n a ] w w w + + w w w + + @ + w w w + + + + + [ f s w w n + + @ + + + + w w w + @ + w w w + + + @ w w w + + + + [ f s w w n + @ j w w n a ] w w w + + w w w w w w + w w w + @ + l w w ] w w n + + + w w w + + + + w w w + + w w w + + + @ w w w + + + @ + @ + w w w + + + w w w + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ w w w + + + w w w + + + w w w + @ w w w + + + w w w + @ w w w + + @ + + n w w 2 @ + / l 1 + + q w w [ + @ + @ + + w w w + @ + w w w + + + w w w + + + @ + + + w w w + + @ + w w w + + q w w < @ + @ + + + + w w w + @ + + w w w + @ + + w w w + @ w w w + + + w w w + + w w w + @ + + w w w + @ n w w 2 + @ 5 w w w + + q w w < @ + @ + + + + q w w < + + + + + w w + + w w w 5 + s w w [ + 7 w s @ + n w w 2 @ + / l 1 + + w w w + + @ + + q w w [ + @ + @ + + w w w + + + w w w + @ w w w + + + + w w w + @ + @ + + + [ w w w + + + @ + @ + w w w + + + w w w + @ + + w w w + @ + + + + [ w w w + + w w w + + + w w w + @ + + + + + + @ w w w + + + 7 w w n w w 7 + @ + j w w 5 + @ 5 w w j + + w w w + @ + + w w w + @ + + @ + + w w w + @ + w w w + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + + w w w + @ + w w w + @ + w w w + + w w w 2 + j w w w + + w w w + @ + + @ 7 w w q ] + j w q + + f w w j + 5 w w l + w w w + + + w w w 2 @ j w w w + @ w w w + @ w w w + + + + w w w + @ f w w j + 5 w w l + + w w w + + @ + w w w + + @ + w w w + + w w w 2 @ j w w w + + w w w + + @ + w w w + + a w w q ] / n w w w + + f w w j + 5 w w l + l w w 7 + @ + @ + + q w 1 + n w w w w w w w + a w w 5 + + 7 w w q ] + j w q + + w w w + @ + + @ f w w j + 5 w w l + w w w 2 @ j w w w + + w w w + @ + + w w w + + s w w 2 @ } w w q + @ w w w + + w w w + @ + w w w + + @ + w w w + q w w 5 + 1 w w q + + w w w 2 @ j w w w + + + @ + @ + + + w w w + @ + + w w w w q + + + @ 2 w w q ] / n w w 1 + + w w w + + @ + w w w + w w w + + @ w w w + + + w w w + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + w w w + + + w w w + + + w w w + @ f w w w w w s w w [ + w w w + + + @ + + j w w w w w w 2 + @ / q w w w w w q [ + w w w + @ + f w w w w w s w w [ + w w w + + w w w + @ + + w w w + + / q w w w w w s [ + + w w w + @ + + w w w + @ + + w w w + @ f w w w w w q w w [ + w w w + @ + + w w w + @ + q w w w w q w w w + @ / q w w w w w s [ + w w w w w w w w + @ g w a + 5 w w w w l w w w w w 7 + + @ + j w w w w w w 2 + @ w w w + + + @ + / q w w w w w q [ + f w w w w w s w w [ + l w w w j @ + w w w + @ } w w w w w w w 5 + + w w w + @ w w w + + + w w w + @ + + w w w + 1 w w w w w w w 2 @ + f w w w w w s w w [ + + @ + + @ + + w w w + + @ + f w w w f + @ + + + j w w w w w w g + + @ w w w + + + + w w w + w w w + @ + w w w + @ + w w w + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + w w w + @ + w w w + @ + w w w + + + a w w q a / w w j + w w w + @ + + + @ + 7 q w w j 1 + + + + + f q w w j < + + w w w + + + + c w w q a / w w j + w w w + @ w w w + + @ + w w w + @ + + f q w w j < + @ + w w w + + + @ w w w + + + @ w w w + + + a w w q a / w w j + w w w + + + @ w w w + + + + j w w j < w w w + + + + f q w w j [ + + w w w w w w w w + + 1 w w + + 7 w q 9 ] q w q j ] + + @ + + + 7 q w w j 1 + + + w w w + @ + + + + + f q w w j < + + + a w w q a / w w j + < n w w l + + w w w + + + [ j w w w j 1 + + + w w w + + w w w + @ + w w w + + + @ w w w + + [ j w w w j 1 + + + + a w w q a / w w j + + + @ + + @ + w w w + @ + + [ w w w < + + @ + + + 7 q w w n 7 @ + + + w w w + @ + + w w w + w w w + + + w w w + + + w w w + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + + @ + + + + + @ + + + + + + + + + + + + + + @ + + @ + + + @ + + + + + + + @ + @ + + + + + + @ + + + + @ + @ + + @ + + + + + + + + + + + + @ + + + + @ + + + + + @ + + + @ + + + + + @ + + + + + + @ + + + + + + @ + + + + + + @ + + + + + + + + + + + + + + + @ + + + + + + @ + + @ + + + + + + + + @ + @ + + + + + + + + + + + + + + + + @ + + + n w g @ + + + + + + + + + + [ w w l + @ + + + + + + + @ + + + + @ + + @ + @ + + + + + + @ + @ + + + + + + + + + + + + + + + + + @ + + + @ + + + + + + + + + + @ + + + + @ + + + + @ + + + + + @ + + + + + + @ + + + + + + + + + @ + + + + + + + + + + + @ + + + @ + + + + + + @ + + + / w w n + @ + + @ + @ + + + + + @ + + @ + + + + @ + @ + + + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + @ + @ + @ + @ + @ + @ + + + @ + + @ + + + @ + @ + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + @ + @ + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + @ + @ + @ + + @ + @ + @ + + @ + @ + @ + @ + @ + @ + @ + @ + + @ + @ + @ + + @ + + + @ + @ + @ + + @ + + + @ + @ + @ + @ + @ + @ + @ + + + @ + + [ w w g + @ + @ + @ + + @ 1 s w q < + + @ + @ + @ + + + @ + @ + + + @ + + + @ + @ + @ + + + + @ + @ + @ + @ + @ + @ + @ + @ + + + @ + + @ + @ + + @ + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + @ + @ + + @ + + @ + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + + + @ + @ + + + @ + + l w w 9 + + @ + + + + @ + @ + + + @ + + @ + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + + @ + + @ + + + + + @ + + + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + + + @ + + @ + + + 7 w w s f 1 + + + / 2 l w w q 9 + @ + + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + + + @ + + + + @ + + @ + + @ + + + w w w w q + @ + + @ + @ + + + + @ + + + @ + + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + @ + @ + [ l w w w w w w w w w w n < + + + @ + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + w w q l ] + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + + + [ f n q w w w q g 1 + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + @ + + + + + + + + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + w w w + + @ + + @ + + + @ + l + + @ + + l + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ < w q + + [ w q + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + + @ + l + @ + w w w + + + @ + + @ + + @ + + + @ + + + + @ w w w + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + w w w + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + j s w w j + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + w w w + @ + + + + @ + + 5 q w + + + 5 s w + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + a w g @ + a w g @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + 5 q w + + + w w w + @ + + + @ + + @ + + @ + + + @ + + + w w w + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + w w w + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ j w w w w l + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + w w w + + + @ + + + @ + w w w + @ + w w w + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + l w 2 + + l w 2 + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + + w w w + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ w w w + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + + @ + + w w w [ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + w w w + @ + + @ + + + @ w w w + + + w w w + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + w w + @ + w w + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + w w w + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + w w w + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + w w w + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + + w w w + f w w q 7 @ + w w w w w w w w w w w w + @ w w w [ j w w j + + @ + + w w w + + @ 1 w n + + 1 w n + q w n + + @ q w w + + + n w q q w n + @ + q w w + + @ n w q q w n + + @ q w w + + + n w q + + @ + + @ + + @ 7 n w w j 1 + + w w w 5 q w q + + + j q w w g ] + + + @ 1 j w w w q 2 + @ w w w w w w + w w w + + + @ 2 n w w w j 1 + + + @ + @ + + w w w + + w w w + j s w q a @ + + + 5 l w w w l } @ + + + 1 l w w w n 5 + + + @ + + @ + + w w w + w w w + + @ + + w w w + + @ 2 q w w n 5 + + + + w w w + j s w q a + + @ + + + + w w w w w w + + w w w 5 q w q + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + w w w q w w w w w 9 + w w w w w w w w w w w w + + w w w w w w w w n + + @ + w w w + @ + a w f + + c w f + f w w + + / w w w [ + + w w f f w w + + / w w w [ + + w w f f w w + + / w w w < @ + w w f + + + @ + + @ + j w w w w w w 1 + w w w w w w l + + w w w w w w s / @ + 5 w w w w w w w 5 + w w w w w w + w w w + @ + a w w w w w w w 5 + + + @ + + + w w w + @ w w w q w w w w w a + @ 9 w w w w w w w 2 @ + 5 w w w w w w w 2 @ + + + @ + + @ w w w + j w w 2 @ + + 5 w w g @ + j w w w w w w f + @ + w w w q w w w w w a + + @ + @ + w w w w w w + @ w w w s w w l + + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + w w w n / + a w w q + + w w w + + + w w w + + @ + w w w n / + q w w 9 + + + w w w + + + q w 1 + + q w 1 + 5 w w 1 + 7 w w w 7 + 1 w w 5 2 w w 1 + 7 w w w 7 + 1 w w 5 2 w w 1 + 7 w w w 7 + 1 w w 5 + @ + + + @ + 7 w w n / + j w n + w w w n + + / + f w w 5 + a w w f + + q w a + + a w w n + + w w w + + @ w w w + + + w w w < + 5 w w q + + @ + + @ + w w w + + w w w n ] + j w w q + + w w w < + 5 w w q + + q w 9 + + a w w q + + @ + + + @ + w w w + 5 w w g + @ + j w w 2 + 1 w w n / ] n w w 1 + + w w w n ] + j w w q + + + @ + + + w w w + + @ + w w w q + + / + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ w w w } + + + w w w + + w w w + @ + w w w + @ + + w w w 5 + + 5 w w l + @ + + + + @ + + w w + + @ w w + + + w w f + j w w w g @ a w w + + w w f + j w w w g @ a w w + + w w f + j w w w g @ a w w + + + + @ + + + n w w 1 + + ] n 1 + w w w 5 + + + @ n w w + + + w w q + + + + + + @ + w w w + + w w w + @ + w w w + @ + w w w a + + + + + + @ + + + + + w w w + @ w w w } + + + w w w + + w w w a + + + + + + @ + + + @ + + w w w + + + @ + + + + w w w + + q w w + + + s w q + + l w w 2 + + 5 w w j + + w w w 1 + + + w w w + @ + + + @ + w w w + @ + + w w w 5 + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + w w w + @ + + w w w + @ w w w + + + w w w + + + @ w w w + + + + w w w + + + @ + + @ + 5 w l + + 5 w l + + @ j w n + q w n w q + q w j + + j w q + q w n w q + q w j + + j w q + q w n w q + q w j + + @ + + @ + + w w w + + @ + + + + w w w + @ + + + w w w w w w w w w + @ + @ / a l n w w w + + w w w + + + w w w + + + n w w w w q 7 @ + + + @ + @ + + w w w + + w w w + @ + + w w w + @ n w w w w q 7 @ + + + @ + / a l n w w w + @ w w w w w w w w w + @ a w w 7 @ 7 w w a @ + s w w + @ + + w w w + + w w w + + @ + w w w + + @ + + + @ w w w + + + @ w w w + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + w w w + + @ + w w w + + w w w + @ + w w w + @ + + w w w + @ + + w w w + @ + + @ + + + f w a + + f w 9 + @ + 7 w w / w w 1 w w < w w 7 + @ 7 w w ] w w } w w [ w w 7 + @ 7 w w ] w w } w w [ w w 7 + @ + + + + @ + w w w + @ + + @ + + w w w + + @ + + w w w w w w w w w + + + n w w w w w w w + + w w w + @ + w w w + @ + + a q w w w w n @ + + + @ + + @ w w w + + w w w + + @ + w w w + + + a q w w w w n @ + + + n w w w w w w w + + w w w w w w w w w + + / w w l + l w w / + + w w w + + @ + w w w + + w w w + @ + + w w w + @ + + @ + + w w w + @ + + w w w + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + w w w + @ + + w w w + @ w w w + + + w w w + + @ + w w w + + @ + w w w + + @ + + @ + + q w < + @ q w < + + @ / w w g w q + q w j w w ] + + / w w g w q + q w j w w ] + + / w w g w q + q w j w w ] + + + @ + + + @ w w w + + + @ + + @ w w w + + + @ + w w w + + + + + + @ + j w w n a ] w w w + + w w w + + + w w w + + @ + + + [ f s w w n + @ + + + @ + w w w + @ w w w + + + @ w w w + @ + + + [ f s w w n + @ j w w n a ] w w w + + w w w w w w w w w + @ + l w w ] w w n + + + w w w + + + + w w w + + w w w + + + @ w w w + + + @ + + @ w w w + + @ + w w w + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + w w w + + + @ w w w + + w w w + @ + w w w + @ + + w w w 5 + + 5 w w l + + + @ + + @ / w q + + / w s + @ + + + q w w w g + j w w w n + @ + + q w w w g @ j w w w n + + @ + q w w w g @ j w w w n + + @ + + @ + + + n w w 2 @ + / l 1 + w w w + @ + + + q w w [ + @ + @ + + @ w w w + + + w w w + @ w w w + @ + w w w + @ + + @ + + + [ w w w + + + @ + + + w w w + + w w w + @ + + w w w + + + @ + + + [ w w w + + w w w + + + w w w + @ + + + + + + w w w + + + 7 w w n w w 7 + @ + j w w 5 + @ 5 w w j + + w w w + @ + + w w w + @ + + + @ + w w w + @ + + w w w + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + w w w + @ + + w w w + @ w w w + + + w w w + + + @ w w w n / + q w w 9 + @ + w w w + 7 w l + + 7 w l + + @ + + f w w w 7 @ 7 w w w f + + + @ f w w w 7 + 7 w w w f + + + + f w w w 7 + 7 w w w f + + + w w w + @ + 7 w w q ] + j w q + w w w + + @ + + f w w j + 5 w w l + + w w w 2 + j w w w + + w w w + + + w w w + + + s w w 2 @ } w w q + w w w + @ + w w w + @ w w w + + @ + w w w + @ q w w 5 + 1 w w q + + w w w 2 @ j w w w + + + @ + @ + + w w w + @ + + w w w w q + + + @ 2 w w q ] / n w w 1 + + w w w + + @ + w w w + + w w w + + w w w + + + @ w w w + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + w w w + + @ + w w w + + l w w w j + l w w w j + + w w w q w w w w n + + + @ w w w + j w 7 + @ j w 7 + + + @ + [ w w w [ + / w w w [ + @ + + [ w w w [ + / w w w [ + @ + + [ w w w [ + / w w w [ + @ + w w w + + @ + j w w w w w w 2 + w w w + @ + + @ / q w w w w w q [ + + f w w w w w s w w [ + l w w w j + w w w + @ + 1 w w w w w w w 5 + w w w + + + w w w + + w w w + @ + + w w w + + 1 w w w w w w w 2 @ + f w w w w w s w w [ + + @ + + @ + w w w + + @ + f w w w f + @ + + + j w w w w w w g + + @ w w w + + + + w w w + @ w w w + + w w w + @ + + w w w + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ w w w + + + + w w w + @ < n w w l + < n w w l + + w w w + l w q j + @ + + + w w w + s w ] + + s w ] + @ + + + + w w q + + + q w w + + + + @ + w w q + + + q w w + + + @ + + w w q + + + q w w + + + + w w w + @ + + + 7 q w w j 1 + + w w w + + + @ + + + f q w w j < + + @ + a w w q a / w w j + < n w w l + w w w + + + + [ j w w w j 1 + + w w w + @ + w w w + @ w w w + + + @ w w w + + + [ j w w w j 1 + + + + a w w q a / w w j + + + @ + + + w w w + @ + + [ w w w < + + @ + + + 7 q w w n 7 @ + + + w w w + @ + + w w w + + w w w + @ w w w + + @ + w w w + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + @ + + + + @ + + + + + + + + + + + + @ + + w w w + + + + + + + @ + + + + @ + + + @ + + @ + + + + @ + @ + + + + @ + + + + + + @ + + + + + + + @ + + + + + + @ + + + @ + + + @ + + + + + + @ + + + + @ + + + @ + + + + + + + + @ + + + @ + + + + @ + + + + + + @ + + + + + + + + + + + + + + @ + + + + + + + @ + @ + + + + + + + + + + + + + @ + + + + + @ + + + + + @ + + + + + @ + @ + + + + + + + + + @ + + + + + + + + + + + @ + + + @ + + + + @ + + + @ / w w n + @ + + @ + @ + + + + + @ + + @ + + + + @ + @ + + + + @ + + + + @ + + + + @ + + + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + @ + + + + @ + @ + + + @ + @ + @ + @ + @ + + + @ + w w w + @ + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + @ + + @ + @ + @ + + + @ + @ + @ + + + @ + + + @ + + @ + @ + @ + + @ + @ + + + @ + + @ + @ + @ + @ + + + @ + + @ + @ + + @ + @ + @ + + @ + @ + @ + @ + @ + @ + @ + + + @ + @ + @ + + + + @ + @ + @ + @ + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + @ + @ + + @ + @ + @ + @ + @ + + @ + @ + + @ + @ + + + @ + + l w w 9 + + @ + + + + @ + @ + + + @ + + @ + @ + + + + + @ + + + @ + @ + + + @ + + + @ + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + w w w + + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + + + @ + + @ + + @ + + + + @ + + @ + + + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + + + @ + + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + w w w w q + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + w w w + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + w w q l ] + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + @ + + + + @ + + @ + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + + @ + + + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + @ + + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + + @ + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + + + @ + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + + + @ + + @ + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + + @ + + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + @ + + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + + @ + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + @ + + @ + + + + @ + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + + @ + + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + + @ + + + + @ + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + @ + + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + @ + + + + @ + @ + + + @ + @ + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + @ + @ + + @ + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + + @ + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + + + @ + + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + @ + + + @ + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + + @ + + + + + @ + + + @ . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + @ + @ + + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + @ + @ + + @ + @ + + @ + @ + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + @ + + @ + + + + @ + + + + @ + + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + @ + + + @ + + + @ + @ + + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + @ + + @ + + @ + @ + + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + + @ + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + + + @ + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + @ + @ + + @ + + @ + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + @ + + + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + . . . ",
+"+ + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + + + @ + + + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + + + @ + + + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + @ + + + @ + + + + @ + + + + @ + + + + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + + + @ + + + @ + + + + @ + + + @ + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + + + @ + + + + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + + @ + + @ + + @ + @ + + + @ + + + + @ + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + + + @ + + @ + . . . ",
+"+ @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + + @ + + + @ + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + @ + + @ + @ + + @ + @ + + @ + @ + + @ + + + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + + @ + @ + + + + @ + + + @ + @ + + + + @ + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + . . . ",
+"+ + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + @ + + @ + + @ + @ + + + + @ + + @ + @ + + @ + + + + @ + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + @ + + + @ + + + + @ + + + + @ + + @ + + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + @ + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + @ + + + @ + + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + + @ + + + @ + + + @ + + + + @ + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + + @ + @ + + @ + @ + + + @ + @ + + + @ + + @ + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + + @ + @ + + + @ + + + @ + + @ + + + @ + + + @ + @ + + + @ + . . . ",
+"+ @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + + @ + + + + @ + + + + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + + @ + + @ + + + + @ + @ + + @ + + + + @ + + + @ + + @ + @ + + @ + + @ + @ + + + @ + + @ + + + + @ + + + + + @ + + + @ + @ + + + @ + + + @ + + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + + @ + @ + + + @ + + @ + + @ + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + @ + + @ + + + + + @ + + + @ + + @ + + @ + + + + @ + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + + @ + @ + + @ + + @ + + + @ + + + @ + + @ + + + @ + + @ + @ + + @ + @ + + + @ + + @ + + @ + + @ + + + + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + + @ + @ + + @ + @ + + @ + + + @ + + @ + + + @ + @ + + + @ + + @ + + + @ + + + @ + + + @ + + @ + + @ + + + @ + + @ + + + @ + + @ + + @ + + + @ + + + @ + + + @ + + + + @ + @ + + @ + + + @ + + @ + + + @ + + + @ + + @ + @ + + @ + + @ + + + + @ + + + + @ + + + @ + + @ + + @ + + + @ + + @ + + @ + + @ + + + @ + + @ + @ + + + @ + + @ + + + + @ + + @ + + + + @ + + + @ + + + @ + + @ + + + @ + + + @ + + @ + + + . . . "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.bmp
new file mode 100644 (file)
index 0000000..dbb6004
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/back.xpm
new file mode 100644 (file)
index 0000000..7d07646
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *back[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 16 1",
+"  c black",
+". c #000033",
+"X c gray20",
+"o c #000066",
+"O c #333366",
+"+ c #666633",
+"@ c gray40",
+"# c #333399",
+"$ c #666699",
+"% c #999966",
+"& c gray60",
+"* c #9999cc",
+"= c #cccc99",
+"- c gray80",
+"; c #ccccff",
+": c #ffffcc",
+/* pixels */
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"-----------------;--;---------------",
+"---------------;$#$#$O*-------------",
+"------;-----;--&o.o.o.O*------------",
+"----;$$-----*O#ooo@..ooo*-----------",
+"-----Oo$---*o.oooX@$#Oo.O*----------",
+"----;#.o*--oooO@+O@=;$oooo*---------",
+"-----$..#&#o.O+%&=&--$.oo.O---------",
+"-----$ooooooO@@&;---;$ooooO@--------",
+"----;$.ooooo@%&------$.ooo.@--------",
+"-----$ooooooX$:------#ooooO@=-------",
+"----;#.ooooo.$;-----#oooooO@@&------",
+"-----$.ooOoo.O*---*#.oooooO@@&:-----",
+"-----&.O+OX@OO+&-*OoooooO@X@&-------",
+"------&=&=&&=&@---#o.oooO@%&--------",
+"------:--;---------$o.oo.@&---------",
+"--------------------$ooOOX----------",
+"--------------------;$oO+@----------",
+"---------------------;$+@-----------",
+"----------------------:&&-----------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"--     -----------------------------",
+"--  --  -------  -------------------",
+"--  --  --   --   --   --  -  -  - -",
+"--     --  -  -  --  -  -  -  -    -",
+"--    ---     -  --  -  -  -  -  ---",
+"--  -  --  ----  --  -  -  -  -  ---",
+"--  --  --    --  --   ---    -  ---",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.bmp
new file mode 100644 (file)
index 0000000..f799c38
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/bright.xpm
new file mode 100644 (file)
index 0000000..894da88
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *toolbar_bright_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 15 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #330033",
+"O c #333300",
+"+ c gray20",
+"@ c gray40",
+"# c #666699",
+"$ c #33ff33",
+"% c #669966",
+"& c #996699",
+"* c #999966",
+"= c gray60",
+"- c gray80",
+"; c white",
+/* pixels */
+"------------------------------------",
+"------------------------------------",
+"------------------ -----------------",
+"------------------ -----------------",
+"------------------ -----------------",
+"------------------ -----------------",
+"--------- ----------------- --------",
+"---------- -----     ----- ---------",
+"----------- --  ;;;;;  -- ----------",
+"------------- ;;;;;;;;; ------------",
+"------------ ;;;;;;;;;;; -----------",
+"----------- ;;;;;;;;;;;;; ----------",
+"----------- ;;;;;;;;;;;;; ----------",
+"---------- ;;;;;;;;;;;;;;; ---------",
+"---------- ;;;;;;;;;;;;;;; ---------",
+"-----    -                 -    ----",
+"----------                 ---------",
+"----------                 ---------",
+"-----------               ----------",
+"-----------               ----------",
+"------------             -----------",
+"-------------           ------------",
+"----------- --         -- ----------",
+"---------- -----     ----- ---------",
+"--------- ----------------- --------",
+"------------------ -----------------",
+"------------------ -----------------",
+"------------------ -----------------",
+"------------------ -----------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"------------------------------------",
+"---------+++++++--------------------",
+"----------------+-------------------",
+"-----------------+------------------",
+"---------------+ ++ =---------------",
+"--------------+;;+$$ =--------------",
+"-------------+;;;o$$$+@-------------",
+"------------- ;;;+$$$ =-------------",
+"-------------++ + + ++@-------------",
+"-------------o;;;;;;;X&-------------",
+"-------------X;;;;;;;o%-------------",
+"-------------+;;;;;;;+@-------------",
+"-------------o;;;;;;;X&-------------",
+"-------------X;;;;;;;o%-------------",
+"--------------+;;;;;O#--------------",
+"-------------- ;;;;;.*--------------",
+"---------------+ + +*---------------"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.bmp
new file mode 100644 (file)
index 0000000..58f5561
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/clear.xpm
new file mode 100644 (file)
index 0000000..439ba05
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *toolbar_clear_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"37 37 4 1",
+"  c navy",
+". c red",
+"X c #c0c0c0",
+"o c white",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXX...XXXXXXXXXXX...XXXXXXXXXX",
+"XXXXXXXXXXX...XXXXXXXXX...XXXXXXXXXXX",
+"XXXXXXXXXXXX...XXXXXXX...XXXXXXXXXXXX",
+"XXXXXXXXXXXXX...XXXXX...XXXXXXXXXXXXX",
+"XXXXX         ...   ...         XXXXX",
+"XXXXX ooo oo oo... ...oo oo ooo XXXXX",
+"XXXXX ooo oo oo ..... oo oo ooo XXXXX",
+"XXXXX oooooo oooo...oooo oooooo XXXXX",
+"XXXXX oooooooooo.....oooooooooo XXXXX",
+"XXXXX ooooooooo...o...ooooooooo XXXXX",
+"XXXXX         ...   ...         XXXXX",
+"XXXXXXXXXXXXX...XXXXX...XXXXXXXXXXXXX",
+"XXXXXXXXXXXX...XXXXXXX...XXXXXXXXXXXX",
+"XXXXXXXXXXX...XXXXXXXXX...XXXXXXXXXXX",
+"XXXXXXXXXX...XXXXXXXXXXX...XXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.bmp
new file mode 100644 (file)
index 0000000..62d1f80
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/colours.xpm
new file mode 100644 (file)
index 0000000..391ad1d
--- /dev/null
@@ -0,0 +1,13 @@
+/* XPM */
+static char *colours[] = {
+/* columns rows colors chars-per-pixel */
+"6 1 6 1",
+"  c black",
+". c blue",
+"X c magenta",
+"o c #808080",
+"O c #c0c0c0",
+"+ c white",
+/* pixels */
+" oO+.X"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.bmp
new file mode 100644 (file)
index 0000000..d492225
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/connect.xpm
new file mode 100644 (file)
index 0000000..626f329
--- /dev/null
@@ -0,0 +1,87 @@
+/* XPM */
+static char * toolbar_connect_xpm[] = {
+"44 50 34 1",
+"      c None",
+".     c #666666",
+"+     c #CCCCCC",
+"@     c #999900",
+"#     c #999999",
+"$     c #FFFFFF",
+"%     c #FFFF99",
+"&     c #666699",
+"*     c #FFFFCC",
+"=     c #000000",
+"-     c #FFCC99",
+";     c #CCCC66",
+">     c #FFCCFF",
+",     c #FFCCCC",
+"'     c #996666",
+")     c #333333",
+"!     c #336666",
+"~     c #669966",
+"{     c #663366",
+"]     c #000033",
+"^     c #999966",
+"/     c #FFCC00",
+"(     c #FF6600",
+"_     c #CC6600",
+":     c #333366",
+"<     c #CCCCFF",
+"[     c #336633",
+"}     c #663333",
+"|     c #669999",
+"1     c #996699",
+"2     c #666633",
+"3     c #CC3300",
+"4     c #660000",
+"5     c #990000",
+"              ..+++@@@                      ",
+"              #$.#+@$$@@                    ",
+"              .$$$..%%$$@@                  ",
+"              .$$$$$.&%%$$@@  @@@@@         ",
+"        @@@   #$*$$$$$..%%$$@@$$$$$==       ",
+"        @$$@@ .$$*$*$$$$.&%%$$%%-%%-;=      ",
+"         @$*$@@$$$*$$*$$$$..%%%-%%--;=      ",
+"         @$%%$$@@$$>*$$*$$$$.&%%%-%%-;=     ",
+"         @$%%%%$*@@$$*$$*$$$$$..%%---;=     ",
+"          @$%%%%%$$@@$$,$$*$*$$$.&%-%;=     ",
+"          @$%%%%%%%$*@@$$*$$$*$$$$.%-;=     ",
+"          @$..')%%%-%$$@@$$*+$+$+$.-;=      ",
+"          @.*+#!=-%%%%-$*@@$$+$+$$~-;=      ",
+"          .$$$+#{=%-%%%%-$>@@$+$+$&-;=      ",
+"          .+$$+#.=%%-%-%%%-$*=$+$$.-;]      ",
+"          ##+$+#)=%%%-%-%-%%;=+$+$.;=       ",
+"          ..###.)=%-%%-%-%%-;=$++$^;=       ",
+"         ./...)..-%-%-%--%-%%;=,$.-;=       ",
+"        #+/(..&._))%-%-%%%-%-;=+$&;=        ",
+"        #-$$(((___/:%-%---%-%;=<$~;=        ",
+"        #-**$$////([%--%-%-%-;=,$.;=        ",
+"        #---**$*/(_}---%--%--;=+$'=.        ",
+"        #-/---**((_!%%---%-%%;=<$.=.#       ",
+"        #-//----((_)--%-------;=$|=.1##     ",
+"        #-///---(__:-%--%----%;=$'=.~.|#    ",
+"        #-/////-(__2;;-%--%---;=$.)..'#     ",
+"        #-//////(__)==;;%-----;=$=)..#      ",
+"         #-/////(__:  ==;;----;=)=..#       ",
+"         #-/////(3)     ==;;%-;===.#        ",
+"         #-/4///532       ==;;-;=).         ",
+"         #-/5//45_:         ==;;=)          ",
+"         #-/5//((_)           ===           ",
+"                                            ",
+"            ==    ==                        ",
+"            ==            ==                ",
+"            ==    ==  === ===  ===          ",
+"            ==    == ==   ==  == ==         ",
+"            ==    ==  ==  ==  =====         ",
+"            ==    ==   == ==  ==            ",
+"            ===== == ===   ==  ====         ",
+"                                            ",
+"                                            ",
+"  =====             ==                      ",
+"  ==  ==        ==                 ==       ",
+"  ==  ==   ===  === ==  ===  ====  ===  === ",
+"  ==  ==     == ==  == == == == == ==  ==   ",
+"  =====    ==== ==  == ===== == == ==   ==  ",
+"  ==      == == ==  == ==    == == ==    == ",
+"  ==       ====  == ==  ==== == ==  == ===  ",
+"                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.bmp
new file mode 100644 (file)
index 0000000..a9bbd8a
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/continue.xpm
new file mode 100644 (file)
index 0000000..34dde7b
--- /dev/null
@@ -0,0 +1,94 @@
+/* XPM */
+static char *continue[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 38 1",
+"  c black",
+". c #003333",
+"X c #330000",
+"o c #333300",
+"O c gray20",
+"+ c #336633",
+"@ c #660000",
+"# c #663333",
+"$ c #666633",
+"% c gray40",
+"& c #666699",
+"* c green",
+"= c #33cc00",
+"- c #66cc33",
+"; c #66cc66",
+": c #996666",
+"> c #cc0000",
+", c #cc3300",
+"< c #cc3333",
+"1 c red",
+"2 c #ff3300",
+"3 c #ff3333",
+"4 c #cc6633",
+"5 c #ff6633",
+"6 c #cc6666",
+"7 c #ff6666",
+"8 c #999933",
+"9 c #999966",
+"0 c #99cc00",
+"q c #99cc33",
+"w c #99cc66",
+"e c #cc9933",
+"r c #cc9966",
+"t c gray60",
+"y c #99cc99",
+"u c #cc9999",
+"i c #cccc99",
+"p c gray80",
+/* pixels */
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pp%$Oppppppppppppppppppppppppppppppp",
+"ppt:t%#.pppppppppppppppppppppppppppp",
+"pptt9t9%#ppppppppppppppppppppppppppp",
+"ppuitut9%%$OOppppppppppppppppppppppp",
+"pp67rutut9&:%%$Opp%%%%%%%ppppppppppp",
+"ppur747utut9t9%%%%*******%%ppppppppp",
+"pptutur57rutttu9%**%%%%%***%pppppppp",
+"ppttiutur657ru21t%%:9%Op%%**%p%%pppp",
+"pp9t9tuyuuur7>212tttt:%Oo.%**%*%pppp",
+"pp%%:t9ttttut212>uitut9t:%%%***%pppp",
+"ppp#%%:99t9tut21uyututttt%*****%pppp",
+"pppppOO%%:t9t9tyutuyuyutu%%%***%Xppp",
+"pppppppoOOO%:ttutituutiuyutt%%%%,Xpp",
+"pppppppppppO+%9t9tuyuyutuyuutut4<%pp",
+"ppppppppppppp%%:%9tututituyuyur39tpp",
+"pppppppppppppXOo%%9t9tutiutuuy44utpp",
+"ppppppppppppppppp%%:%9t9tu9i=-0wwtpp",
+"pppppppppppppppppXOO%%:9t9tt;e8-qwpp",
+"pppppppppppppppppppppOO%%9t9t36utupp",
+"pppppppppppppppppppppppXO%%:64ttitpp",
+"pppppppppppppppppppppppppoO%,69ttupp",
+"pppppppppppppppppppppppppppO<%%99tpp",
+"pppppppppppppppppppppppppppX@O#%%9pp",
+"pppppppppppppppppppppppppppppppoO%pp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pp    pppppppppppppppppp  pppppppppp",
+"p  ppp ppppppppppppp  pppppppppppppp",
+"p  pppppp   pp    pp   p  p    ppppp",
+"p  ppppp  p  p  p  p  pp  p  p  pppp",
+"p  ppppp  p  p  p  p  pp  p  p  pppp",
+"p  ppp p  p  p  p  p  pp  p  p  p  p",
+"pp    ppp   pp  p  pp  p  p  p  p  p",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"ppppppppppp   pppppppppppppppppppppp",
+"ppppppppppp   pppppppppppppppppppppp",
+"pppppppppp  p  pp  p  pp   ppppppppp",
+"pppppppppp  p  pp  p  p  p  pppppppp",
+"ppppppppp       pp   pp     pppppppp",
+"ppppppppp  ppp  p  p  p  ppppppppppp",
+"ppppppppp  ppp  p  p  pp    pppppppp",
+"pppppppppppppppppppppppppppppppppppp"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.bmp
new file mode 100644 (file)
index 0000000..3d7f9ee
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo.xpm
new file mode 100644 (file)
index 0000000..3593e0f
--- /dev/null
@@ -0,0 +1,279 @@
+/* XPM */
+static char * creatis_logo_xpm[] = {
+"84 20 256 2",
+"      c #FFFFFF",
+".     c #000099",
+"+     c #000000",
+"@     c #000000",
+"#     c #000000",
+"$     c #000000",
+"%     c #000000",
+"&     c #000000",
+"*     c #000000",
+"=     c #000000",
+"-     c #000000",
+";     c #000000",
+">     c #000000",
+",     c #000000",
+"'     c #000000",
+")     c #000000",
+"!     c #000000",
+"~     c #000000",
+"{     c #000000",
+"]     c #000000",
+"^     c #000000",
+"/     c #000000",
+"(     c #000000",
+"_     c #000000",
+":     c #000000",
+"<     c #000000",
+"[     c #000000",
+"}     c #000000",
+"|     c #000000",
+"1     c #000000",
+"2     c #000000",
+"3     c #000000",
+"4     c #000000",
+"5     c #000000",
+"6     c #000000",
+"7     c #000000",
+"8     c #000000",
+"9     c #000000",
+"0     c #000000",
+"a     c #000000",
+"b     c #000000",
+"c     c #000000",
+"d     c #000000",
+"e     c #000000",
+"f     c #000000",
+"g     c #000000",
+"h     c #000000",
+"i     c #000000",
+"j     c #000000",
+"k     c #000000",
+"l     c #000000",
+"m     c #000000",
+"n     c #000000",
+"o     c #000000",
+"p     c #000000",
+"q     c #000000",
+"r     c #000000",
+"s     c #000000",
+"t     c #000000",
+"u     c #000000",
+"v     c #000000",
+"w     c #000000",
+"x     c #000000",
+"y     c #000000",
+"z     c #000000",
+"A     c #000000",
+"B     c #000000",
+"C     c #000000",
+"D     c #000000",
+"E     c #000000",
+"F     c #000000",
+"G     c #000000",
+"H     c #000000",
+"I     c #000000",
+"J     c #000000",
+"K     c #000000",
+"L     c #000000",
+"M     c #000000",
+"N     c #000000",
+"O     c #000000",
+"P     c #000000",
+"Q     c #000000",
+"R     c #000000",
+"S     c #000000",
+"T     c #000000",
+"U     c #000000",
+"V     c #000000",
+"W     c #000000",
+"X     c #000000",
+"Y     c #000000",
+"Z     c #000000",
+"`     c #000000",
+" .    c #000000",
+"..    c #000000",
+"+.    c #000000",
+"@.    c #000000",
+"#.    c #000000",
+"$.    c #000000",
+"%.    c #000000",
+"&.    c #000000",
+"*.    c #000000",
+"=.    c #000000",
+"-.    c #000000",
+";.    c #000000",
+">.    c #000000",
+",.    c #000000",
+"'.    c #000000",
+").    c #000000",
+"!.    c #000000",
+"~.    c #000000",
+"{.    c #000000",
+"].    c #000000",
+"^.    c #000000",
+"/.    c #000000",
+"(.    c #000000",
+"_.    c #000000",
+":.    c #000000",
+"<.    c #000000",
+"[.    c #000000",
+"}.    c #000000",
+"|.    c #000000",
+"1.    c #000000",
+"2.    c #000000",
+"3.    c #000000",
+"4.    c #000000",
+"5.    c #000000",
+"6.    c #000000",
+"7.    c #000000",
+"8.    c #000000",
+"9.    c #000000",
+"0.    c #000000",
+"a.    c #000000",
+"b.    c #000000",
+"c.    c #000000",
+"d.    c #000000",
+"e.    c #000000",
+"f.    c #000000",
+"g.    c #000000",
+"h.    c #000000",
+"i.    c #000000",
+"j.    c #000000",
+"k.    c #000000",
+"l.    c #000000",
+"m.    c #000000",
+"n.    c #000000",
+"o.    c #000000",
+"p.    c #000000",
+"q.    c #000000",
+"r.    c #000000",
+"s.    c #000000",
+"t.    c #000000",
+"u.    c #000000",
+"v.    c #000000",
+"w.    c #000000",
+"x.    c #000000",
+"y.    c #000000",
+"z.    c #000000",
+"A.    c #000000",
+"B.    c #000000",
+"C.    c #000000",
+"D.    c #000000",
+"E.    c #000000",
+"F.    c #000000",
+"G.    c #000000",
+"H.    c #000000",
+"I.    c #000000",
+"J.    c #000000",
+"K.    c #000000",
+"L.    c #000000",
+"M.    c #000000",
+"N.    c #000000",
+"O.    c #000000",
+"P.    c #000000",
+"Q.    c #000000",
+"R.    c #000000",
+"S.    c #000000",
+"T.    c #000000",
+"U.    c #000000",
+"V.    c #000000",
+"W.    c #000000",
+"X.    c #000000",
+"Y.    c #000000",
+"Z.    c #000000",
+"`.    c #000000",
+" +    c #000000",
+".+    c #000000",
+"++    c #000000",
+"@+    c #000000",
+"#+    c #000000",
+"$+    c #000000",
+"%+    c #000000",
+"&+    c #000000",
+"*+    c #000000",
+"=+    c #000000",
+"-+    c #000000",
+";+    c #000000",
+">+    c #000000",
+",+    c #000000",
+"'+    c #000000",
+")+    c #000000",
+"!+    c #000000",
+"~+    c #000000",
+"{+    c #000000",
+"]+    c #000000",
+"^+    c #000000",
+"/+    c #000000",
+"(+    c #000000",
+"_+    c #000000",
+":+    c #000000",
+"<+    c #000000",
+"[+    c #000000",
+"}+    c #000000",
+"|+    c #000000",
+"1+    c #000000",
+"2+    c #000000",
+"3+    c #000000",
+"4+    c #000000",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     . . . .       . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     . . . .       . . . . . . . . . .       . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                 . . . . . . . . . . . . . .           . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                 . . . . . . . . . . . . . . .           . . . . ",
+". . . . . . . . . . . .             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       . . . . . .     . . . . . . .   . .       . .   . ",
+". . . . . . . . .         . .       . . . . . . . . . . . . . . . . . . . . . . . . . . . .       . . . . . .         . . . . .         . . .     . . . .     .     . . ",
+". . . . . . .       . . . . .       . . . . . . . . . . . . . . . . . . . . . . . . . .       . . . . . . .         . . . .                     . . .           . . . . ",
+". . . . . .     . . . . . .         . . . . . . . . . . . . . . .     . . . . . . .         .   . . . . .           . .     . . . .         . . . . .       . . . . . . ",
+". . . .       . . . . . . .       . . . . . . . . . . . . .           . . . . .         .       . . .     . .             . . . . . . . . . . . . . . . . . . . . . . . ",
+". . .       . . . . . . .       . . . . . . . . . . . . .     .     . . . . .       .     .           . . .           . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . .     . . . . . . . .       . . .         . . . . .           . . . .         .     . .         . . . .       . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". .       . . . . . . . . . . . . .             . . .       . . . . .     .         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". .       . . . . . . . . . . . .   . . .       . .                   . .       . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+".         . . . . . . . . . . .   . . . .     .     . .           . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". .         . . . . . . . .   . . . . .         . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". .             . .       . . . . . . .     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . .                 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo2.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo2.bmp
new file mode 100644 (file)
index 0000000..6e316bf
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/creatis_logo2.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.bmp
new file mode 100644 (file)
index 0000000..079cb0d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cross.xpm
new file mode 100644 (file)
index 0000000..8d1e059
--- /dev/null
@@ -0,0 +1,18 @@
+/* XPM */
+static char *cross[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 2 1",
+"  c black",
+". c #c0c0c0",
+/* pixels */
+" ........ ",
+"   ....   ",
+".   ..   .",
+"..      ..",
+"...    ...",
+"...    ...",
+"..      ..",
+".   ..   .",
+"   ....   ",
+"  ......  "
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.bmp
new file mode 100644 (file)
index 0000000..9920039
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/cutter.xpm
new file mode 100644 (file)
index 0000000..ac35cd4
--- /dev/null
@@ -0,0 +1,322 @@
+/* XPM */
+static char * vesselstoolbar_cutter_xpm[] = {
+"50 50 269 2",
+"      c None",
+".     c #E7C89A",
+"+     c #D79853",
+"@     c #CF8D3D",
+"#     c #D59A53",
+"$     c #E7C79A",
+"%     c #F8F4EA",
+"&     c #DBA04F",
+"*     c #C97C12",
+"=     c #B6681F",
+"-     c #A86127",
+";     c #AB5E26",
+">     c #BE6018",
+",     c #D0965A",
+"'     c #FAF8EC",
+")     c #DCB978",
+"!     c #C9892B",
+"~     c #BB9C83",
+"{     c #D0CCC7",
+"]     c #E1DBDF",
+"^     c #D9D3D0",
+"/     c #B69E91",
+"(     c #A9662B",
+"_     c #DBAD7A",
+":     c #F2E8D2",
+"<     c #CFA043",
+"[     c #CFC4B1",
+"}     c #D1BDB4",
+"|     c #BB7537",
+"1     c #F8F1E1",
+"2     c #DABC8E",
+"3     c #DEC07E",
+"4     c #FAF8FA",
+"5     c #B46E2B",
+"6     c #E9DCBD",
+"7     c #F5F1E7",
+"8     c #CB8638",
+"9     c #E0B55D",
+"0     c #FCF9EB",
+"a     c #EFE3D3",
+"b     c #BA7824",
+"c     c #E6DCC2",
+"d     c #F8F0D6",
+"e     c #E3D1A3",
+"f     c #D39B4D",
+"g     c #D58A32",
+"h     c #DB9730",
+"i     c #DDC57C",
+"j     c #FDF5E3",
+"k     c #FFFCFD",
+"l     c #FEFEFD",
+"m     c #FEFCF6",
+"n     c #EFDCC3",
+"o     c #C88D3A",
+"p     c #DCA852",
+"q     c #EAE6DD",
+"r     c #F2E4D5",
+"s     c #E1BA7B",
+"t     c #DDA755",
+"u     c #D79734",
+"v     c #D58A22",
+"w     c #D9861A",
+"x     c #D8871A",
+"y     c #D6841B",
+"z     c #D07E18",
+"A     c #D48818",
+"B     c #D59227",
+"C     c #DFA751",
+"D     c #E0A85C",
+"E     c #D49438",
+"F     c #D28319",
+"G     c #E09E3C",
+"H     c #D6C29D",
+"I     c #E5E5E5",
+"J     c #D7D7D7",
+"K     c #CBCBCB",
+"L     c #C2C2C2",
+"M     c #B6B6B6",
+"N     c #ADADAD",
+"O     c #ABABAB",
+"P     c #B0B0B0",
+"Q     c #B5B5B5",
+"R     c #B7B7B7",
+"S     c #BABABA",
+"T     c #BEBEBE",
+"U     c #C0C0C0",
+"V     c #C5C5C5",
+"W     c #C6C6C6",
+"X     c #C8C8C8",
+"Y     c #C7C7C7",
+"Z     c #C4C4C4",
+"`     c #AEAEAE",
+" .    c #B8B8B8",
+"..    c #CACACA",
+"+.    c #B4B4B4",
+"@.    c #A9A9A9",
+"#.    c #A4A59F",
+"$.    c #A98255",
+"%.    c #DB8B1E",
+"&.    c #D78A1A",
+"*.    c #D88719",
+"=.    c #D4801A",
+"-.    c #D17A1C",
+";.    c #CC7620",
+">.    c #C66F22",
+",.    c #C16826",
+"'.    c #B76521",
+").    c #B26321",
+"!.    c #BB6B28",
+"~.    c #C47120",
+"{.    c #D38624",
+"].    c #E0AB47",
+"^.    c #CAB380",
+"/.    c #E3E6DF",
+"(.    c #797979",
+"_.    c #878787",
+":.    c #AAAAAA",
+"<.    c #CECECE",
+"[.    c #DCDCDC",
+"}.    c #E9E9E9",
+"|.    c #EBEBEB",
+"1.    c #EDEDED",
+"2.    c #EAEAEA",
+"3.    c #E8E8E8",
+"4.    c #E6E6E6",
+"5.    c #E2E2E2",
+"6.    c #D2D2D2",
+"7.    c #BBBBBB",
+"8.    c #A4A4A4",
+"9.    c #BDBDBD",
+"0.    c #8C8C8C",
+"a.    c #8F8F8F",
+"b.    c #9F9F9F",
+"c.    c #A9A8A6",
+"d.    c #AF9A8A",
+"e.    c #AE7A3C",
+"f.    c #AB8257",
+"g.    c #B28A66",
+"h.    c #B3927C",
+"i.    c #B69A8F",
+"j.    c #B4A193",
+"k.    c #B3A194",
+"l.    c #AB998E",
+"m.    c #A08876",
+"n.    c #977767",
+"o.    c #936F59",
+"p.    c #9D6A3C",
+"q.    c #C7975C",
+"r.    c #C2B9A4",
+"s.    c #EDEDEA",
+"t.    c #E7E7E7",
+"u.    c #D0D0D0",
+"v.    c #B1B1B1",
+"w.    c #B2B2B2",
+"x.    c #B9B9B9",
+"y.    c #C3C3C3",
+"z.    c #CDCDCD",
+"A.    c #CFCFCF",
+"B.    c #A6A6A6",
+"C.    c #969696",
+"D.    c #8D8D8D",
+"E.    c #AFAFAF",
+"F.    c #CBCBC6",
+"G.    c #C89C71",
+"H.    c #D59126",
+"I.    c #D5922F",
+"J.    c #D59533",
+"K.    c #D9A047",
+"L.    c #DCA764",
+"M.    c #DAAC72",
+"N.    c #DAAC75",
+"O.    c #D6A973",
+"P.    c #D7A76F",
+"Q.    c #D8975A",
+"R.    c #CE8136",
+"S.    c #C67A20",
+"T.    c #CC8A32",
+"U.    c #EAC494",
+"V.    c #DBDBDB",
+"W.    c #D6D6D6",
+"X.    c #C9C9C9",
+"Y.    c #BCBCBC",
+"Z.    c #A3A3A3",
+"`.    c #A2A2A2",
+" +    c #ACACAC",
+".+    c #A7A7A7",
+"++    c #A5A1A2",
+"@+    c #AF8058",
+"#+    c #CC851D",
+"$+    c #D48719",
+"%+    c #DA8816",
+"&+    c #DC8B1A",
+"*+    c #D98A1C",
+"=+    c #D7881E",
+"-+    c #CC7927",
+";+    c #BD6B15",
+">+    c #D17A13",
+",+    c #CC6F15",
+"'+    c #C1631E",
+")+    c #BE6123",
+"!+    c #BA6220",
+"~+    c #C6691D",
+"{+    c #D7934E",
+"]+    c #FAF6E7",
+"^+    c #E3DFDE",
+"/+    c #C7BAAE",
+"(+    c #BEA28A",
+"_+    c #B18761",
+":+    c #B2763C",
+"<+    c #C17924",
+"[+    c #C87D18",
+"}+    c #CF8324",
+"|+    c #D98F26",
+"1+    c #CD8929",
+"2+    c #AF7D43",
+"3+    c #AA886F",
+"4+    c #A78A78",
+"5+    c #A4744C",
+"6+    c #B66326",
+"7+    c #C16420",
+"8+    c #E0B07E",
+"9+    c #F0ECED",
+"0+    c #CCC3BD",
+"a+    c #B0804E",
+"b+    c #C57B1D",
+"c+    c #DAA34A",
+"d+    c #CAB9A2",
+"e+    c #CBC1B9",
+"f+    c #B2713A",
+"g+    c #C37430",
+"h+    c #FAF3E3",
+"i+    c #E4D9CC",
+"j+    c #CC984F",
+"k+    c #D6C693",
+"l+    c #D5BEAB",
+"m+    c #BA681F",
+"n+    c #F4E3D3",
+"o+    c #C7A061",
+"p+    c #E8CB95",
+"q+    c #F0E9E3",
+"r+    c #BF782E",
+"s+    c #EFE3D9",
+"t+    c #DCC3AD",
+"u+    c #DEA959",
+"v+    c #FBF3E4",
+"w+    c #E0C3A7",
+"x+    c #C99854",
+"y+    c #C8A16C",
+"z+    c #F0DBA7",
+"A+    c #F8F6DE",
+"B+    c #FBF6E9",
+"C+    c #F1E1CA",
+"D+    c #E3B67F",
+"E+    c #D2903F",
+"F+    c #D6C7AB",
+"G+    c #E2D9D9",
+"H+    c #BF9151",
+"I+    c #D38C26",
+"J+    c #D58B23",
+"K+    c #CF8E1A",
+"L+    c #D6891E",
+"M+    c #D49B46",
+"N+    c #C7B19C",
+"O+    c #E6E7E0",
+"P+    c #B9A992",
+"Q+    c #BC976A",
+"R+    c #BF9565",
+"S+    c #C0A07C",
+"T+    c #CAC2BB",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                  . + @ # $         ",
+"                                                                              % & * = - ; > , '     ",
+"                                                                              ) ! ~ { ] ^ / ( _     ",
+"                                                                            : < [           } | 1   ",
+"                                                                            2 3 4             5 6   ",
+"                                                                          7 8 9 0           a b c   ",
+"                                                                      d e f g h i j k l m n o p q   ",
+"                                                              r s t u v w x y z A B C D E F G H     ",
+"      I J K L M N O O N P Q R S T U V W X Y Z `  ...L +.N @.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.    ",
+"    O (._.:.T <.[.I }.|.1.2.3.4.5.V V V L 6.7.8.T 9.@.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.      ",
+"      t.u.T v.v.v.w.x.9.T U y.X z.<.u.A.z.<.V :.B.C.D.E.U ..F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.        ",
+"                          3.5.V.W.u.X.L Y.R +.` Z.`. +@.@..+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+    ",
+"                                                              ^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+    ",
+"                                                                      9+0+a+b+c+d+        e+f+g+h+  ",
+"                                                                          i+j+k+            l+m+n+  ",
+"                                                                            o+p+            q+r+s+  ",
+"                                                                            t+u+v+          w+x+    ",
+"                                                                              y+p z+A+B+C+D+E+F+    ",
+"                                                                              G+H+I+J+K+L+M+N+      ",
+"                                                                                O+P+Q+R+S+T+        ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.bmp
new file mode 100644 (file)
index 0000000..fbaeb0d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/del_axis.xpm
new file mode 100644 (file)
index 0000000..d5ad02f
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static char *axistoolbar_erase_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 39 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #003333",
+"O c #330000",
+"+ c #333300",
+"@ c gray20",
+"# c #336633",
+"$ c #660000",
+"% c #663333",
+"& c #666633",
+"* c gray40",
+"= c #000099",
+"- c #3366ff",
+"; c #666699",
+": c #00ff66",
+"> c #669966",
+", c #993333",
+"< c #996666",
+"1 c #cc3333",
+"2 c #ff3333",
+"3 c #cc6633",
+"4 c #ff6633",
+"5 c #cc6666",
+"6 c #ff6666",
+"7 c #999933",
+"8 c #999966",
+"9 c #99cc66",
+"0 c #cc9933",
+"q c #cc9966",
+"w c #ff9966",
+"e c gray60",
+"r c #99cc99",
+"t c #cc9999",
+"y c #cccc99",
+"u c gray80",
+"i c #ccccff",
+"p c #ffffcc",
+"a c white",
+/* pixels */
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uu*&@uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uue<e*%ouuuuuuuuuuuuuuuuuuuuu  uuuuu",
+"uuee8e8*%uuuuuuuuuuuuuuuuuu @*u* uuu",
+"uutyete8**&@@uuuuuuuuuuuuu ---**u uu",
+"uu56qtete8;<**&@uuuuuuuuu -----**a u",
+"uutq636tete8e8***@@uOuuu --------= u",
+"uuetetq46qteeet8<>*,1Ou --------==+u",
+"uueeytetq546qteeet813*@+i------===.u",
+"uu8e8etrtttq63wtet828< ipi----=== uu",
+"uu**<e8eeeetet5qrt33t auiuii-===+uuu",
+"uuu%**<88e8etey8::::9 aapuau===  uuu",
+"uuuuu@@**<e88eee:07::9 aiaue==++  uu",
+"uuuuuuu+@@@*<e8et15tr65 epae  8**Ouu",
+"uuuuuuuuuuu@#*<854etetq   . etee<*uu",
+"uuuuuuuuuuuuu@@*13e8etetqtetrteee8uu",
+"uuuuuuuuuuuuuuu%,*<e8etetrtetrttreuu",
+"uuuuuuuuuuuuuuuO$+@*<8e8eteyetrettuu",
+"uuuuuuuuuuuuuuuuuuu@**>e8eeetetrteuu",
+"uuuuuuuuuuuuuuuuuuuuX@%%*88e8etqeyuu",
+"uuuuuuuuuuuuuuuuuuuuuuuo@**<e8eeyeuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuO@&*<eeetuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuo%**88euu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuu@#*<*uu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuO@*uu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@uu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuu   u   uuuuuuuuuuuuuuuuuuuuu",
+"u     u  uu  uuuuuuuuuuuuuuuuuuuuuuu",
+"u  uuuu  uu  uuuuuuuuuuuuuuuuuuuuuuu",
+"u  uuuu   u   u   uuu   uu   uu  u u",
+"u    uu  uu  uuuu  u  uuu  u  u    u",
+"u  uuuu  uu  uu    u  uuu     u  uuu",
+"u  uuuu  uu  u  u  u  uuu  uuuu  uuu",
+"u     u  uu  uu    uu   uu    u  uuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuu   uuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuuu   uuuuuuuuuuuuuuuuuuuuuu",
+"uuuuuuuuuu  u  uu  u  uu   uuuuuuuuu",
+"uuuuuuuuuu  u  uu  u  u  u  uuuuuuuu",
+"uuuuuuuuu       uu   uu     uuuuuuuu",
+"uuuuuuuuu  uuu  u  u  u  uuuuuuuuuuu",
+"uuuuuuuuu  uuu  u  u  uu    uuuuuuuu",
+"uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.bmp
new file mode 100644 (file)
index 0000000..8859e1b
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/disable.xpm
new file mode 100644 (file)
index 0000000..375518e
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+static char *disable[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 2 1",
+"  c black",
+". c #c0c0c0",
+/* pixels */
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . "
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.bmp
new file mode 100644 (file)
index 0000000..2d36871
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/excel.xpm
new file mode 100644 (file)
index 0000000..3646851
--- /dev/null
@@ -0,0 +1,77 @@
+/* XPM */
+static char *excel[] = {
+/* columns rows colors chars-per-pixel */
+"44 50 21 1",
+"  c black",
+". c #000033",
+"X c #333300",
+"o c gray20",
+"O c #333366",
+"+ c #006666",
+"@ c #666633",
+"# c gray40",
+"$ c #009999",
+"% c cyan",
+"& c #996666",
+"* c #cc0000",
+"= c #999966",
+"- c #cccc66",
+"; c gray60",
+": c #9999cc",
+"> c #cccc99",
+", c #ffff99",
+"< c gray80",
+"1 c #ffffcc",
+"2 c white",
+/* pixels */
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<*********<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<#<<<<<<<<<*****<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<#;o#<<<<<<<<***<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<#;#;#o#<<<<<<<*<<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<#;#;#222#o<<<<<<<<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<#;#;#222222##<<<<<<<<<<<<<<<<",
+"<<<<<<<<<<<<<<#;#;#222222222o#<<<<<<<<<<<<<<",
+"<<<<<<<<<<<<<#;#;#1<1<1<1<1<1<#O<<<<<<<<<<<<",
+"<<<<<<<<<<<<#;#;#,-,-,-,-,-,-,#@#o<<<<<<<<<<",
+"<<<<<<<<<<<#;#;#<o#-,-,-,-,-,#O@O= <<<<<<<<<",
+"<<<<<<<<<<#;#;#;#<<o#-------#o=O=. <<<<<<<<<",
+"<<<<<<<<<#;#;#;;;#;<<o#----#O=O=.o <<<<<<<<<",
+"<<<<<<<<#;#;#;  #;#;#<<O@-#o=O=.o <<<<<<<<<<",
+"<<<<<<<#;#;#; 2<  ;;###><O     o <<<     <<<",
+"<<<<<<< <<#; 2< #<# ###### 2222 <<< %%%% <<<",
+"<<<<<<< ;;2 2<X o:<<  ##### $%%2 < %$+; <<<<",
+"<<<<<<<<  ; 22 o<><><: ####o +%%2 %+$# <<<<<",
+"<<<<<<<<<<  ;;22:<:<< ;###oX  $%%2 $& <<<<<<",
+"<<<<<<<<<<<<  ;;22>< ;;O=.o << +%%2  <<<<<<<",
+"<<<<<<<<<<<<<<  ;;2 ;###oX <<<  $%%2 <<<<<<<",
+"<<<<<<<<<<<<<<<<  ; ;:=.X <<< %$ +%%2    <<<",
+"<<<<<<<<<<<<<<<<<<  ;;oo <<< %+$+ $%%2 $ <<<",
+"<<<<<<<<<<<<<<<<<<<<  o <<< %$+$+$ +%%2 <<<<",
+"<<<<<<<<<<<<<<<<<<<<<< <<< ;#;#;#;# $%%2 <<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<           +$+$ <<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     <<",
+"<<<<<<   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",
+"<<<<<  << <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",
+"<<<<<   <<<<<   <<  <  <  <  <<   <<  < <<<<",
+"<<<<<<   <<<<<<  <  <  <  <  <  <  <    <<<<",
+"<<<<<<<   <<<    <  <  <<   <<     <  <<<<<<",
+"<<<<< <<  <<  <  <  <  <<   <<  <<<<  <<<<<<",
+"<<<<<<   <<<<    <<    <<< <<<<    <  <<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",
+"<<  <<<<  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",
+"<<   <<   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",
+"<<        <<   <<<   <  <  <  < <<   <<<   <",
+"<< <   <  <  <  <  <<<  <  <    <  <  <  <<<",
+"<< << <<  <     <<  <<  <  <  <<<     <<  <<",
+"<< <<<<<  <  <<<<<<  <  <  <  <<<  <<<<<<  <",
+"<< <<<<<  <<    <   <<<    <  <<<<    <   <<",
+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.bmp
new file mode 100644 (file)
index 0000000..989d49a
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/exit.xpm
new file mode 100644 (file)
index 0000000..3396dda
--- /dev/null
@@ -0,0 +1,27 @@
+/* XPM */
+static char *exit[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 5 1",
+"  c #800000",
+". c red",
+"X c #808080",
+"o c #c0c0c0",
+"O c white",
+/* pixels */
+"ooooo     oooooo",
+"ooo  .....  oooo",
+"oo ......... ooo",
+"o ..O.....O.. oo",
+"o .OOO...OOO. Xo",
+" ...OOO.OOO... o",
+" ....OOOOO.... X",
+" .....OOO..... X",
+" ....OOOOO.... X",
+" ...OOO.OOO... X",
+"o .OOO...OOO. XX",
+"o ..O.....O.. Xo",
+"oo ......... XXo",
+"ooo  .....  XXoo",
+"ooooX     XXXooo",
+"ooooooXXXXXooooo"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.bmp
new file mode 100644 (file)
index 0000000..f185634
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/extract.xpm
new file mode 100644 (file)
index 0000000..6b57e1e
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static char *axistoolbar_extract_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 39 1",
+"  c black",
+". c #003300",
+"X c #003333",
+"o c #330000",
+"O c #333300",
+"+ c gray20",
+"@ c #333366",
+"# c #336633",
+"$ c #660000",
+"% c #663333",
+"& c #666600",
+"* c #666633",
+"= c gray40",
+"- c #666699",
+"; c #00ff66",
+": c #669966",
+"> c #990000",
+", c #993333",
+"< c #996666",
+"1 c #cc3333",
+"2 c red",
+"3 c #ff3333",
+"4 c #cc6633",
+"5 c #ff6633",
+"6 c #cc6666",
+"7 c #ff6666",
+"8 c #999900",
+"9 c #999933",
+"0 c #999966",
+"q c #99cc66",
+"w c #cc9933",
+"e c #cc9966",
+"r c #ff9966",
+"t c yellow",
+"y c gray60",
+"u c #99cc99",
+"i c #cc9999",
+"p c #cccc99",
+"a c gray80",
+/* pixels */
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aa=*+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aay<y=%Xaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aayy0y0=%aaaaaaaaaaaaaaaaaaaaaa  aaa",
+"aaipyiy0==*++aaaaaaaaaaaaaaaaa 22 aa",
+"aa67eiyiy0-<==*+aaaaaaaaaaaaa 22y> a",
+"aaie747iyiy0y0===++aoaaaaaaaa 2y>$ a",
+"aayiyie57eiyyyi0<:=,1oaaaaaa yy>$ aa",
+"aayypiyie657eiyyyi014=+oaaa yi&  aaa",
+"aa0y0yiuiiie74riyi030<0==. yt8  aaaa",
+"aa==<y0yyyyiyi6eui44iyy0< yt&   aaaa",
+"aaa%==<00y0yiyp0;;;;quyy yt8 O   aaa",
+"aaaaa++==<y00yyy;w9;;qi= t& <=@O  aa",
+"aaaaaaaO+++=<y0yi16iu76 <  yy00==oaa",
+"aaaaaaaaaaa+#=<065yiyie  =ipyiyy<=aa",
+"aaaaaaaaaaaaa++=14y0yiyieiyiuiyyy0aa",
+"aaaaaaaaaaaaaaa%,=<y0yiyiuiyiuiiuyaa",
+"aaaaaaaaaaaaaaao$O+=<0y0yiypyiuyiiaa",
+"aaaaaaaaaaaaaaaaaaa+==:y0yyyiyiuiyaa",
+"aaaaaaaaaaaaaaaaaaaa.+%%=00y0yieypaa",
+"aaaaaaaaaaaaaaaaaaaaaaaX+==<y0yypyaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaao+*=<yyyiaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaX%==00yaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa+#=<=aa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao+=aa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+aa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  a",
+"aa  aaa aaaaaaaaaaaaaaaaaaaaaaaaa  a",
+"aa   aa aaaaaaaaaaaaaaaaaaaaaaaaa  a",
+"aa    a aa   aa  a  a  a  aa   aa  a",
+"aa a    a  a  a  a  a  a  a  a  a  a",
+"aa aa   a  a  a  a  aa   aa     a  a",
+"aa aaa  a  a  a  a  aa   aa  aaaa  a",
+"aa aaaa aa   aaa    aaa aaaa    a  a",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaa   aaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaa   aaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaa  a  aa  a  aa   aaaaaaaaa",
+"aaaaaaaaaa  a  aa  a  a  a  aaaaaaaa",
+"aaaaaaaaa       aa   aa     aaaaaaaa",
+"aaaaaaaaa  aaa  a  a  a  aaaaaaaaaaa",
+"aaaaaaaaa  aaa  a  a  aa    aaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.bmp
new file mode 100644 (file)
index 0000000..a5f62e7
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/help.xpm
new file mode 100644 (file)
index 0000000..4a99351
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *toolbar_help_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 9 1",
+"  c black",
+". c gray40",
+"X c blue",
+"o c #666699",
+"O c #999966",
+"+ c yellow",
+"@ c gray60",
+"# c gray80",
+"$ c white",
+/* pixels */
+"##@.@.@.@.@.@.@.@.@.################",
+"##.$$$$$$$$$$$$$$$$@ ###############",
+"##@$$$$$$$$$$$$$$$$.@ ##############",
+"##.$$$$$$$$$$$$$$$$@@@ #############",
+"##@$$$$$$$$$$$$$$$$.$#. ############",
+"##.$$$$$$$$$$$$$$$$@$$#. ###########",
+"##@$$$#########$$$$.      ##########",
+"##.$$$$$$$$$$$$$$$$$$$$$# ##########",
+"##@$$$$$$$$$$$$$$$$$$$$$# ##########",
+"##.$$$$$$$$$$$$$$$$$$$$$# ##########",
+"##@$$$#@#@#@#@#@##@###$$@ ##########",
+"##.$$$$$$$$$$$$$$$$$$$$$# ##########",
+"##@$$$#############@##$$# ##########",
+"##.$$$$$$$$$$$$$$$$$.@..@.@#########",
+"##@$$$#@#@#@#@#@#@@.#$$+$$$.@#######",
+"##.$$$$$$$$$$$$$$@$$$+$$$+$$$.######",
+"##@$$$##########.$$+$#XXXX$+$$@#####",
+"##.$$$$$$$$$$$$.$+$$$X#$XXX$$+$.####",
+"##@$$$#@#@#@#@@#$$$+$XX$XXX+$$$#.###",
+"##.$$$$$$$$$$$.$$+$$$.X$XXO$$+$$ @##",
+"##@$$$########.+$$$+$$$OXo$+$$$+ .##",
+"##.$$$$$$$$$$$.$$+$$$+$XO+$$$+$$ @##",
+"##@$$$#@#@#@##.#$$$+$$$Xo$$+$$$# .##",
+"##.$$$$$$$$$$$$@$+$$$+$$$+$$$+$ @.##",
+"##@$$$######@##@@$$+$$$XX$$+$$ .@###",
+"##.$$$$$$$$$$$$$$.#$$+$XX+$$# @.####",
+"##@$$$$$$$$$$$$$$$  #$$+$$$  .@#####",
+"##.$$$$$$$$$$$$$$$$$  .$$  @.@######",
+"##@##@##@#@##@######## +$ .@########",
+"##                      $ @#########",
+"########################  .#########",
+"######################### @#########",
+"####################################",
+"####################################",
+"####################################",
+"####################################",
+"####################################",
+"####################################",
+"####################################",
+"####################################",
+"####################################",
+"######################  ############",
+"#########   ####  ####  ############",
+"#########   ##########  ############",
+"########  #  ###  ##    ##   #######",
+"########  #  ###  #  #  #  #  ######",
+"#######       ##  #  #  #     ######",
+"#######  ###  ##  #  #  #  #########",
+"#######  ###  ##  ##    ##    ######",
+"####################################"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.bmp
new file mode 100644 (file)
index 0000000..5360d82
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/imagebrowser.xpm
new file mode 100644 (file)
index 0000000..3ecf2cc
--- /dev/null
@@ -0,0 +1,76 @@
+/* XPM */
+static char * toolbar_imagebrowser_xpm[] = {
+"44 50 23 1",
+"      c None",
+".     c #000000",
+"+     c #CCCCCC",
+"@     c #666666",
+"#     c #996666",
+"$     c #333333",
+"%     c #FFFFCC",
+"&     c #999999",
+"*     c #336666",
+"=     c #FFFFFF",
+"-     c #663366",
+";     c #FFCC00",
+">     c #FF6600",
+",     c #666699",
+"'     c #CC6600",
+")     c #FFCC99",
+"!     c #333366",
+"~     c #336633",
+"{     c #663333",
+"]     c #666633",
+"^     c #CC3300",
+"/     c #660000",
+"(     c #990000",
+"                                            ",
+"              ......... ......... ......... ",
+"              ...+..... ...+..... ...+..... ",
+"              ....+.... ....+.... ....+.... ",
+"              .....+++. .....+++. .....+++. ",
+"              ..+.+.... ..+.+.... ..+.+.... ",
+"     @@#$     ...++.... ...++.... ...++.... ",
+"    @%+&*.    ...+..... ...+..... ...+..... ",
+"   @===+&-.   ....+.... ....+.... ....+.... ",
+"   @+==+&@.   ......... ......... ......... ",
+"   &&+=+&$.                                 ",
+"   @@&&&@$.   ......... ......... ......... ",
+"  @;@@@$@@    ...+..... ...+..... ...+..... ",
+" &+;>@@,@'$$  ....+.... ....+.... ....+.... ",
+" &)==>>>''';! .....+++. .....+++. .....+++. ",
+" &)%%==;;;;>~ ..+.+.... ..+.+.... ..+.+.... ",
+" &)))%%=%;>'{ ...++.... ...++.... ...++.... ",
+" &);)))%%>>'* ...+..... ...+..... ...+..... ",
+" &);;))))>>'$ ....+.... ....+.... ....+.... ",
+" &);;;)))>''! ......... ......... ......... ",
+" &);;;;;)>'']                               ",
+" &);;;;;;>''$ ......... ......... ......... ",
+"  &);;;;;>''! ...+..... ...+..... ...+..... ",
+"  &);;;;;>^$  ....+.... ....+.... ....+.... ",
+"  &);/;;;(^]  .....+++. .....+++. .....+++. ",
+"  &);(;;/('!  ..+.+.... ..+.+.... ..+.+.... ",
+"  &);(;;>>'$  ...++.... ...++.... ...++.... ",
+"              ...+..... ...+..... ...+..... ",
+"              ....+.... ....+.... ....+.... ",
+"              ......... ......... ......... ",
+"                                            ",
+"                                            ",
+"         ..                                 ",
+"   ....  ..                                 ",
+"  ..   . ..                                 ",
+"  ..     ....   ...   .. .  ....  ...  .. . ",
+"  ..     .. ..    ..  .... .. .. .. .. .... ",
+"  ..     .. ..  ....  ..   .. .. ..... ..   ",
+"  ..   . .. .. .. ..  ..   .. .. ..    ..   ",
+"   ....  .. ..  ....  ..    ....  .... ..   ",
+"                              ..            ",
+"    ..                   .  ...             ",
+"    ..           ...    .        ..         ",
+"    ..          ..  .                       ",
+"    ..  ...     ...    ...  .. . ..  ...    ",
+"    ..    ..     ...  .. .. .... .. .. ..   ",
+"    ..  ....      ... ..... ..   .. .....   ",
+"    .. .. ..    .  .. ..    ..   .. ..      ",
+"    ..  ....     ...   .... ..   ..  ....   ",
+"                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.bmp
new file mode 100644 (file)
index 0000000..f8b7fbb
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/intensity.xpm
new file mode 100644 (file)
index 0000000..253c248
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *toolbar_intensity_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"37 37 4 1",
+"  c navy",
+". c red",
+"X c #c0c0c0",
+"o c white",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX....XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXX        XXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXX XXXXXXX XXXXXXXXXXXXXX XXXX",
+"XXXXXXXXX XXXXXX X XX X XX X    X XXX",
+"XXXXXXXXX XXXXX XXX  XXX  XXXX XXX XX",
+"XXXXXXXXX XXXXX XXX  XXX XXXX XXXX XX",
+"XXXXXXXXX XXXXX XX XX X XXXX    XX XX",
+"XXXXXXXXX XXXXXX XXXXXXXXXXXXXXXX XXX",
+"XXXXXXXXX XXXXXXX XXXXXXXXXXXXXX XXXX",
+"XXXXXX        XXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXX                           XXXXX",
+"XXXXX ooo oo oo oo oo oo oo ooo XXXXX",
+"XXXXX ooo oo oo oo oo oo oo ooo XXXXX",
+"XXXXX oooooo ooooo ooooo oooooo XXXXX",
+"XXXXX ooooooooooooooooooooooooo XXXXX",
+"XXXXX ooooooooooooooooooooooooo XXXXX",
+"XXXXX                           XXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.bmp
new file mode 100644 (file)
index 0000000..49fef5d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/linear.xpm
new file mode 100644 (file)
index 0000000..3330403
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *linear[] = {
+/* columns rows colors chars-per-pixel */
+"37 37 5 1",
+"  c black",
+". c navy",
+"X c red",
+"o c #c0c0c0",
+"O c white",
+/* pixels */
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooo ooooooooooooooooooooooooooooooo",
+"oooo   oooooooooooooooooooooooXXXoooo",
+"ooo o o ooooooooooooooooooooooXooXooo",
+"ooooo ooooooooooooooooooooooooXXXoooo",
+"ooooo ooooooooooooooooooooooooXooXooo",
+"ooooo ooooooooooooooooooooooooXooXooo",
+"ooooo ooooooooooooooooooooooooooooooo",
+"ooooo ooooooooooooooooooooooooooooooo",
+"ooooo ooooooooooooooooooooooooooooooo",
+"ooooo ooooooooooooooooooooooooooooooo",
+"ooooo oooooooooo.oooo.ooooooooooooooo",
+"ooooo ooooooooo..oooo..oooooooooooooo",
+"ooooo oooo.ooo.oo.oo.o.oooooooooooooo",
+"ooooo ooo..ooo.oo...ooo..oooooooooooo",
+"ooooo ooo.o.o..ooooooooo.oo..oooooooo",
+"ooooo oo..oo.ooooooooooo...oo.ooooooo",
+"ooooo oo.oooooooooooooooooooo.ooooooo",
+"ooooo o..oooooooooooooooooooo. oooooo",
+"ooooo o.oooooooooooooooooooooo. ooooo",
+"ooo                              oooo",
+"ooooo ooooooooooooooooooooooooo ooooo",
+"oooooooooooooooooooooooooooooo oooooo",
+"ooooo...........................ooooo",
+"ooooo.OOO.OO.OO.OO.OO.OO.OO.OOO.ooooo",
+"ooooo.OOO.OO.OO.OO.OO.OO.OO.OOO.ooooo",
+"ooooo.OOOOOO.OOOOO.OOOOO.OOOOOO.ooooo",
+"ooooo.OOOOOOOOOOOOOOOOOOOOOOOOO.ooooo",
+"ooooo.OOOOOOOOOOOOOOOOOOOOOOOOO.ooooo",
+"ooooo...........................ooooo",
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.bmp
new file mode 100644 (file)
index 0000000..25d719e
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/loadexp.xpm
new file mode 100644 (file)
index 0000000..c10b3c5
--- /dev/null
@@ -0,0 +1,73 @@
+/* XPM */
+static char *loadexp[] = {
+/* columns rows colors chars-per-pixel */
+"44 50 17 1",
+"  c black",
+". c #000033",
+"X c #333300",
+"o c gray20",
+"O c #333366",
+"+ c #666633",
+"@ c gray40",
+"# c #cc0000",
+"$ c #999966",
+"% c #cccc66",
+"& c gray60",
+"* c #9999cc",
+"= c #cccc99",
+"- c #ffff99",
+"; c gray80",
+": c #ffffcc",
+"> c white",
+/* pixels */
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#####;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;#######;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;#########;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;@;;;;;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;@&o@;;;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;@&@&@o@;;;;;;###;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;@&@&@>>>@o;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;@&@&@>>>>>>@@;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;@&@&@>>>>>>>>>o@;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;@&@&@:;:;:;:;:;:;@O;;;;;;;;;;;",
+";;;;;;;;;;;;;@&@&@-%-%-%-%-%-%-@+@o;;;;;;;;;",
+";;;;;;;;;;;;@&@&@;o@%-%-%-%-%-@O+O$ ;;;;;;;;",
+";;;;;;;;;;;@&@&@&@;;o@%%%%%%%@o$O$. ;;;;;;;;",
+";;;;;;;;;;@&@&@&&&@&;;o@%%%%@O$O$.o ;;;;;;;;",
+";;;;;;;;;@&@&@&  @&@&@;;O+%@o$O$.o ;;;;;;;;;",
+";;;;;;;;@&@&@& >;  &&@@@=;O@@@@oo ;;;;;;;;;;",
+";;;;;;;; ;;@& >; @;@ @@@@@@@@@o. ;;;;;;;;;;;",
+";;;;;;;; &&> >;X o*;;  @@@@@@oX ;;;;;;;;;;;;",
+";;;;;;;;;  & >> o;=;=;* @@@@o. ;;;;;;;;;;;;;",
+";;;;;;;;;;;  &&>>*;*;; &@@@oX ;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;  &&>>=; &&O$.o ;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;  &&> &@@@oX ;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;  & &*$.X ;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;  &&oo ;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;  o ;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;    ;;  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;  ;;; ;  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;  ;;;;;    ;;;   ;;  ; ;;    ;;   ;;  ; ;;",
+";;  ;;;;;  ;  ;;;;  ;    ;  ;  ;  ;  ;    ;;",
+";;  ;;;;;  ;  ;;    ;  ;;;  ;  ;     ;  ;;;;",
+";;  ;;; ;  ;  ;  ;  ;  ;;;  ;  ;  ;;;;  ;;;;",
+";;;    ;;  ;  ;;    ;  ;;;;    ;;    ;  ;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;  ;;;   ;;;;;;;;;;;;;;",
+";;;;   ;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;",
+";;;;   ;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;",
+";;;  ;  ;;    ;;;   ;;  ;  ;  ;;   ;;   ;;;;",
+";;;  ;  ;;  ;  ;;;;  ;  ;  ;  ;  ;;;  ;  ;;;",
+";;       ;  ;  ;;    ;  ;  ;  ;;  ;;     ;;;",
+";;  ;;;  ;  ;  ;  ;  ;  ;;   ;;;;  ;  ;;;;;;",
+";;  ;;;  ;  ;  ;;    ;  ;;;  ;;   ;;;    ;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.bmp
new file mode 100644 (file)
index 0000000..461948d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logo.xpm
new file mode 100644 (file)
index 0000000..580ea18
--- /dev/null
@@ -0,0 +1,94 @@
+/* XPM */
+static char *logo[] = {
+/* columns rows colors chars-per-pixel */
+"54 50 38 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #003333",
+"O c #330000",
+"+ c #330033",
+"@ c #333300",
+"# c gray20",
+"$ c #330066",
+"% c #333366",
+"& c #336633",
+"* c #660033",
+"= c #663333",
+"- c #660066",
+"; c #663366",
+": c #666633",
+"> c gray40",
+", c blue",
+"< c #663399",
+"1 c #00ff33",
+"2 c #669966",
+"3 c #993366",
+"4 c #996666",
+"5 c #cc0033",
+"6 c #990099",
+"7 c #993399",
+"8 c #996699",
+"9 c #cc3399",
+"0 c #cc33cc",
+"q c #cc6699",
+"w c #cc66cc",
+"e c #999966",
+"r c gray60",
+"t c #cc9999",
+"y c #cc99cc",
+"u c #cccc99",
+"i c gray80",
+"p c white",
+/* pixels */
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiii+7-;++iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiii+;6;  ++;-7-7-++iiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiii-7-+            #-;6;6;+ii iiiiiiiiiiiiiiiiiiii",
+"iiii+;6#      +X+           +77i   iiiiiiiiiiiiiiiiiii",
+"ii-7-+       #>>>:#        7-+-ii iiiiiiiiiiiiii11iiii",
+"i07-#       @#>4e8&      ;6+  7ii ii6ii6ii6ii6i1pp1rii",
+"ii ++7-7-#+ >>erre;    -7+    ;ii iiiii1iii5551555p1ii",
+"i;      ++;67wqtrr#  +7-      7ii iiii1p111ii1pp6pp515",
+"i-          &8tywq7*<3        -ii ii61ppp5511ppppppp51",
+"i7          =rrtr4o+7         7ii i11i555ppppppppppppp",
+"i-          >rtrr:  -    X    ;ii 1555pppppppp,,,,pppp",
+"i7     ##   >rere#  7  # +   +-ii 5p6pp6pp6pp,pp6p,6pp",
+"i;     @r# #erer4#  7##       ;ii ppp,,p,,pp,pppppp,pp",
+"i6      =2O2t>rre>=>;>@      +-ii p,,pp,pp,,pppppppp,p",
+"i;      o4>r4rtre#  7> .   # #-ii ,pppppppppppppppppp,",
+"i6     # #>#@>rtr: #- #@  e# ++ii pp6pp6pp6pp6pp6pp6pp",
+"i;           4rre>##7@>=# ;  -#ii pppppppppppppppppppp",
+"i-+         .2tre8e;8rr#>@   ;+ii pppppppppppppppppppp",
+"i;+         O4rr4#>;8>+ :#.  -iii pp6pp6pp6pp6pp6pp6pp",
+"i++        +Xrreeo =8>=##+   ;iii pppppppppppppppppppp",
+"i+;      O  :rrt>@>83#>>:# + ;iii ppppppppppppppppppp ",
+"i+-      .  >4ru> #=<:   .  +7iii                     ",
+"ii;         #rtr>  ;;+     O7iiiiiiiiiiiiiiiiiiiiiiii ",
+"ii7    +    :ere>  4$     +7.iiiiiiiiiiiiiiiiiiiiiiiii",
+"ii-         %>>>=X +;    O7iiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii76%O #    @>>:+# ++   .7.iiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiii+7-;#        # #-  O7Oiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiii+6;*       #8+  7.iiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiii$7;+    #3; 7+iiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiii-7-+  #-7+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiii;7-<9.iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiO-+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"  iii   iii   iii     iiii   iiiii    iiii   iiii    i",
+"  iii   iii   iii  ii  iii   iiii  ii  iii   iii  ii  ",
+"   i    ii  i  ii  ii  ii  i  ii  iiiiiii  i  ii  iiii",
+"   i    ii  i  ii  ii  ii  i  ii  iiiiiii  i  ii    ii",
+" i i i  ii  i  ii     iii  i  ii  iiiiiii  i  iiii    ",
+" i   i  i       i  i  ii       i  iiiiii       iiiii  ",
+" i   i  i  iii  i  ii  i  iii  ii  ii  i  iii  i  ii  ",
+" ii ii  i  iii  i  iii    iii  iii    ii  iii  ii    i",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logocreatis.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logocreatis.bmp
new file mode 100644 (file)
index 0000000..a19f870
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/logocreatis.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.bmp
new file mode 100644 (file)
index 0000000..6b574c0
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/pan.xpm
new file mode 100644 (file)
index 0000000..dc2568b
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char *toolbar_pan_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 18 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #330033",
+"O c #333300",
+"+ c gray20",
+"@ c #000066",
+"# c gray40",
+"$ c #000099",
+"% c #666699",
+"& c #33ff33",
+"* c #669966",
+"= c #66ff66",
+"- c #996699",
+"; c #999966",
+": c gray60",
+"> c gray80",
+", c white",
+/* pixels */
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>$>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>@,@>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>$,,,$>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>@,,,,,@>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>$,,,,,,,$>>>>>>>>>>>>>",
+">>>>>>>>>>>>>@$@$,,,@$@@>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>@,,,$###>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>$,,,@#>>>>>>>>>>>>>>",
+">>>>>>>>>>$#>>>>@,,,$#>>>>$>>>>>>>>>",
+">>>>>>>>>@$#>>>>$,,,@#>>>>@$>>>>>>>>",
+">>>>>>>>$,@#>>>>@,,,$#>>>>$,@>>>>>>>",
+">>>>>>>@,,$@$@$@$,,,@$@$@$@,,$>>>>>>",
+">>>>>>$,,,,,,,,,,,,,,,,,,,,,,,@>>>>>",
+">>>>>@,,,,,,,,,,,,,,,,,,,,,,,,,$>>>>",
+">>>>>>$,,,,,,,,,,,,,,,,,,,,,,,@#>>>>",
+">>>>>>>@,,@$@$@$@,,,@$@$@$@,,$#>>>>>",
+">>>>>>>>$,$#>>>>$,,,$#>>>>$,@#>>>>>>",
+">>>>>>>>>@@#>>>>@,,,@#>>>>@$#>>>>>>>",
+">>>>>>>>>>$#>>>>$,,,$#>>>>@#>>>>>>>>",
+">>>>>>>>>>>>>>>>@,,,@#>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>$,,,$#>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>$@$@,,,@$@$>>>>>>>>>>>>",
+">>>>>>>>>>>>>>@,,,,,,,@#>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>$,,,,,$#>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>@,,,@#>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>$,@#>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>@#>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>+++++++>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>+ ++ :>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>+&&+,, :>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>+&&&o,,,+#>>>>>>>>>>>>>",
+">>>>>>>>>>>>> &=&+,,, :>>>>>>>>>>>>>",
+">>>>>>>>>>>>>++ + + ++#>>>>>>>>>>>>>",
+">>>>>>>>>>>>>o,,,,,,,X->>>>>>>>>>>>>",
+">>>>>>>>>>>>>X,,,,,,,o*>>>>>>>>>>>>>",
+">>>>>>>>>>>>>+,,,,,,,+#>>>>>>>>>>>>>",
+">>>>>>>>>>>>>o,,,,,,,X->>>>>>>>>>>>>",
+">>>>>>>>>>>>>X,,,,,,,o*>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>+,,,,,O%>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>> ,,,,,.;>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>+ + +;>>>>>>>>>>>>>>>"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.bmp
new file mode 100644 (file)
index 0000000..255a657
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/params.xpm
new file mode 100644 (file)
index 0000000..80f9f69
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * toolbar_params_xpm[] = {
+"44 50 21 1",
+"      c None",
+".     c #996666",
+"+     c #666699",
+"@     c #666666",
+"#     c #996699",
+"$     c #000000",
+"%     c #FFFFFF",
+"&     c #FFFFCC",
+"*     c #999999",
+"=     c #669999",
+"-     c #999966",
+";     c #CCCCCC",
+">     c #9999CC",
+",     c #CCCC99",
+"'     c #660000",
+")     c #990000",
+"!     c #669966",
+"~     c #CC9999",
+"{     c #99CCCC",
+"]     c #CC99CC",
+"^     c #99CC99",
+"                                            ",
+"                                            ",
+"                                            ",
+"         .+.+.@#@#@#@#@#@#@#@#@#@$%         ",
+"         @%%%%%%%%%%%%%%%%%%%%%%%$%&        ",
+"         #%%%%%%%%%%%%%%%%%%%%%%%$*%        ",
+"         =%%$$$$%%%%%%%%%%%%%%%%%$*%        ",
+"         .%%$%%$%$*$*$*$-$*$*$-%;$*%        ",
+"         @%%$%%$%%%%%%%%%%%%%%%>%$*%        ",
+"         .%%$$$$%%%%%%%%%%%%%%;%;$*%        ",
+"         @%%%%%%%%%%%%%%%%%%%>%,%$*%        ",
+"         -%%%%%%%%%%%%%%%%%%;%;%;$*%        ",
+"         @%%$$$$%%%%'%%%%%%>%,%>%$*%        ",
+"         .%%$%%$%$*'*$@$+$-$-$*%,$*%        ",
+"         +%%$%%$%%'%%%%%%;%;%>%;%$*%        ",
+"         *%%$$$$%)%%%%%%;%>%;%,%;$*%        ",
+"         +%%'%%%'*%%%%%;%,%;%;%>%$*%        ",
+"         .%')'%)'%%%%%;%>%;%*%;%;$*%        ",
+"         @%%)')'.%%%%;%,%;%;%;%,%$*%        ",
+"         .%%$)')%$=$@$@$+$@$@$+%;$*%        ",
+"         !%%$%'$%%%;%;%;%;%;%;%,%$*%        ",
+"         #%%$$$$%%;%;%;%;%;%;%;%;$*%        ",
+"         +%%%%%%%;%~%{%~%{%~%{%]%$*%        ",
+"         .%%%%%%;%{%;%;%;%,%;%,%{$*%        ",
+"         !%%%%%;%~%;%~%{%]%{%]%;%$*%        ",
+"         .%%%%;%{%;%{%;%,%;%,%{%~$*%        ",
+"         +%%%;%~%;%~%;%]%{%]%;%;%$*%        ",
+"         #%%;%{%;%{%;%^%;%,%{%~%;$*%        ",
+"         +$$$$$$$$$$$$$$$$$$$$$$$$*%        ",
+"           ***********************>&        ",
+"                                            ",
+"                                            ",
+"  $$$$$                                     ",
+"  $$  $$                                    ",
+"  $$  $$   $$$  $$ $  $$$  $$$$ $$   $$$    ",
+"  $$  $$     $$ $$$$    $$ $$ $$ $$ $$      ",
+"  $$$$$    $$$$ $$    $$$$ $$ $$ $$  $$     ",
+"  $$      $$ $$ $$   $$ $$ $$ $$ $$   $$ $$ ",
+"  $$       $$$$ $$    $$$$ $$ $$ $$ $$$  $$ ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            ",
+"                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.bmp
new file mode 100644 (file)
index 0000000..fe6f145
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/plans.xpm
new file mode 100644 (file)
index 0000000..0361566
--- /dev/null
@@ -0,0 +1,83 @@
+/* XPM */
+static char *toolbar_plans_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"44 50 27 1",
+"  c black",
+". c #330000",
+"X c #330033",
+"o c #333300",
+"O c gray20",
+"+ c #663333",
+"@ c #660066",
+"# c #666633",
+"$ c gray40",
+"% c #990066",
+"& c #993366",
+"* c #996666",
+"= c #cc3300",
+"- c #cc6666",
+"; c #990099",
+": c #993399",
+"> c #996699",
+", c #cc0099",
+"< c #cc3399",
+"1 c #cc6699",
+"2 c #999966",
+"3 c #cc9966",
+"4 c #ff9966",
+"5 c gray60",
+"6 c #cc9999",
+"7 c #cccc99",
+"8 c gray80",
+/* pixels */
+"8888888888888888888888888888:888888888888888",
+"8888888888888888888888888888:888888888888888",
+"8888888OO88888888888====8888:8888888>:888888",
+"8888888O  O8888888888===8888:>8888>::>888888",
+"8888888O    88888888====8888::88:::>88888888",
+"8888888O     O8888====8=8888>::::>8888888888",
+"8888888O       O88==88888888:,:>888888888888",
+"8888888$         888888888:::;>88$$$$$ 88888",
+"88888888          O88888:::>8:*$855233 88888",
+"88888888            O8:::>888:>5663436 88888",
+"88888888             @:888$$$:16444655 88888",
+"88888888              O8$$$551<667762$888888",
+"88888888              O$*55666<66552$8888888",
+"88888888              O5566466<55*$$88888888",
+"88888888          O  O$6344655:*$$8888888888",
+"88888:88O       O$$$$*-43655$$:>888888888888",
+"88888:::O      O$2634335558$$8::888888888888",
+"888888:>O      O23433*$+$$8888::888888888888",
+"888888:8O      o3355$O O888888>:888888888888",
+"888888,8O       #*$#o   8888>::;:>8888888888",
+"88888$&$O        Oo     88>:::>>:::>88888888",
+"88888552O              X::::>8888>:::>888888",
+"88888775O           .X%;:>888888888>::888888",
+"88888762$         X@;%X O888888888888>888888",
+"888885*$$      X@;;@X   O8888888888888888888",
+"88888$:8$    X@;@X       8888888888888888888",
+"888888,8$ X@;%@X         8888888888888888888",
+"888888,>:%;@X            $888888888888888888",
+"88888:,;:X               $888888888>>:888888",
+"88888:,>8$OO             O88888>>:::::888888",
+"888888,8888888$$OO       O88>:::::>>88888888",
+"888888,8888888888888$$OOOO88::>>888888888888",
+"88888888888888888888888888888888888888888888",
+"88888    88888888888888888888888888888888888",
+"8888  888 8888888888888888888888888888888888",
+"8888  888888   88  8  8    888   888   88888",
+"8888  88888  8  8  8  8  8  8  8  8  8888888",
+"8888  88888  8  8  8  8  8  8     88  888888",
+"8888  888 8  8  8  8  8  8  8  888888  88888",
+"88888    888   888    8    888    8   888888",
+"88888888888888888888888  8888888888888888888",
+"88888888888888888888888  8  8888888888888888",
+"88888888888888888  8888888  8888888888888888",
+"88888888888888888888888888  8888888888888888",
+"88888   88  8  88  88   88  88   888   88888",
+"8888888  8  8  88  8888  8  8  8  8  8888888",
+"88888    88   888  88    8  8     88  888888",
+"8888  8  8  8  88  8  8  8  8  888888  88888",
+"88888    8  8  88  88    8  88    8   888888",
+"88888888888888888888888888888888888888888888"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.bmp
new file mode 100644 (file)
index 0000000..0090641
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/quant.xpm
new file mode 100644 (file)
index 0000000..8f066a9
--- /dev/null
@@ -0,0 +1,78 @@
+/* XPM */
+static char *toolbar_quant_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"54 50 22 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #003333",
+"O c #330000",
+"+ c #330033",
+"@ c #333300",
+"# c gray20",
+"$ c #336633",
+"% c #336666",
+"& c #663333",
+"* c #666633",
+"= c gray40",
+"- c blue",
+"; c #00ff33",
+": c #cc0033",
+"> c #990099",
+", c gray60",
+"< c #99cc99",
+"1 c gray80",
+"2 c #ffccff",
+"3 c white",
+/* pixels */
+"111111111111111111111111111111111111111111111111111111",
+"1>>>>>>>>>>>>>>>>>>>>111111111111111111111111111111111",
+"1>                 #>111111111111111111111111111111111",
+"1> >>>>>>>>>>>>>>>>>>>>1111111111111111111111111111111",
+"1> >                 #>1111111111111111111111111111111",
+"1> > >>>>>>>>>>>>>>>>>>>>11111111111111111111111111111",
+"1> > >                 #>11111111111111111111111111111",
+"1> > > >>>>>>>>>>>>>>>>>>>>111111111111111111111111111",
+"1> > > >                 #>111111111111111111111111111",
+"1> > > >            # #   >111111111111111111111111111",
+"1> > > >           ## #   >1 1111111111111111111111111",
+"1> > > >         ####  ## >   111111111111111111111111",
+"1> > > >     #   #### # # >1 33333333333331;;333311111",
+"1> > > >  # #  ##&=%OoOo  >1 33>33>33>33>3;33;,1311111",
+"1> > > >   :## #;;;#O . O >1 33333;333:::;:::3;1311111",
+"1> > > >  #:## ;12;*. X o@>1 3333;3;;;11;33>33:;:11111",
+"1> > > >   :=#;,332;X  O##>1 33>;333::;;3333333:;11111",
+"1> > > >  #:=#;1333;#+  ##>1 3;;1:::333333333333311111",
+"1> > > >   :# ;1331;+X  .@>1 ;:::33333333----333311111",
+"1> > > >   : o*;13<&X+X+  >1 :3>33>33>33-33>3->3311111",
+"1> > > >   :  #%;;;#  .@.@>1 333--3--33-333333-3311111",
+"1>>> > >      O##$#     ##>1 3--33-33--33333333-311111",
+"111> > >     .@.X+      X+>1 -333333333333333333-11111",
+"111>>> >    @.# O         >1 33>33>33>33>33>33>3311111",
+"11111> >   #.@# o       +X>1 3333333333333333333311111",
+"11111>>>  ####------      >1 3333333333333333333311111",
+"1111111> .###             >1 33>33>33>33>33>33>3311111",
+"1111111>>>>>>>>>>>>>>>>>>>>1 3333333333333333333311111",
+"1111111111111111111111111111 3333333333333333333 11111",
+"1111111111111111111111111111                      1111",
+"111111111111111111111111111111111111111111111111 11111",
+"111111111111111111111111111111111111111111111111111111",
+"111111111111111111111111111111111111111111111111111111",
+"111111    11111111111111111111111111111111111111111111",
+"11111  111 11111111111111  111111111111111111111111111",
+"11111  1111111   11    11   11   11  1  1  1 11   1111",
+"11111  111111  1  1  1  1  11  1  1  1  1    1  111111",
+"11111  111111  1  1  1  1  11  1  1  1  1  1111  11111",
+"11111  111 11  1  1  1  1  11  1  1  1  1  11111  1111",
+"111111    1111   11  1  11  11   111    1  111   11111",
+"111111111111111111111111111111111111111111111111111111",
+"111111111111111111111111111111111111111111111111   111",
+"111   111111111     111111111111111111111111  1  11111",
+"11  1  1111111  111  1111111111111111111  11111  11111",
+"11  1  1 11111  111  1  1  11   11    11   1  1   1111",
+"111   11 11111  111  1  1  1111  1  1  1  11  1  11111",
+"11  1   111111  111  1  1  11    1  1  1  11  1  11111",
+"11  11  111111  111  1  1  1  1  1  1  1  11  1  11  1",
+"111   1  111111     111    11    1  1  11  1  1  11  1",
+"11111111111111111  11111111111111111111111111111111111"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.bmp
new file mode 100644 (file)
index 0000000..a672e92
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redblue.xpm
new file mode 100644 (file)
index 0000000..7804615
--- /dev/null
@@ -0,0 +1,37 @@
+/* XPM */
+static char *redblue[] = {
+/* columns rows colors chars-per-pixel */
+"80 28 3 1",
+"  c blue",
+". c red",
+"X c #c6c6c6",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      XXXXXXX",
+"XXXXXXX........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX        XXXXXX",
+"XXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX          XXXXX",
+"XXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX            XXXX",
+"XXXX.............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             XXXX",
+"XXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX              XXX",
+"XXXX...........................................................              XXX",
+"XXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX              XXX",
+"XXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX              XXX",
+"XXXX.............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             XXXX",
+"XXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX            XXXX",
+"XXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX          XXXXX",
+"XXXXXXX........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX        XXXXXX",
+"XXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      XXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.bmp
new file mode 100644 (file)
index 0000000..807c7e1
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/redgreen.xpm
new file mode 100644 (file)
index 0000000..92d5ed8
--- /dev/null
@@ -0,0 +1,37 @@
+/* XPM */
+static char *redgreen[] = {
+/* columns rows colors chars-per-pixel */
+"80 28 3 1",
+"  c green",
+". c red",
+"X c #c6c6c6",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      XXXXXXX",
+"XXXXXXX........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX        XXXXXX",
+"XXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX          XXXXX",
+"XXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX            XXXX",
+"XXXX.............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             XXXX",
+"XXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX              XXX",
+"XXXX...........................................................              XXX",
+"XXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX              XXX",
+"XXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX              XXX",
+"XXXX.............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             XXXX",
+"XXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX            XXXX",
+"XXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX          XXXXX",
+"XXXXXXX........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX        XXXXXX",
+"XXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      XXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.bmp
new file mode 100644 (file)
index 0000000..0a7b8e8
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/rotate.xpm
new file mode 100644 (file)
index 0000000..95bdaf0
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static char *toolbar_rotate_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 39 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #003333",
+"O c #330000",
+"+ c #330033",
+"@ c #333300",
+"# c gray20",
+"$ c #330066",
+"% c #333366",
+"& c #336633",
+"* c #660033",
+"= c #663333",
+"- c #660066",
+"; c #663366",
+": c #666633",
+"> c gray40",
+", c #663399",
+"< c #666699",
+"1 c #33ff33",
+"2 c #669966",
+"3 c #66ff66",
+"4 c #993366",
+"5 c #996666",
+"6 c #ff0033",
+"7 c #990099",
+"8 c #993399",
+"9 c #996699",
+"0 c #cc3399",
+"q c #cc33cc",
+"w c #cc6699",
+"e c #cc66cc",
+"r c #999966",
+"t c gray60",
+"y c #cc9999",
+"u c #cc99cc",
+"i c #cccc99",
+"p c gray80",
+"a c white",
+/* pixels */
+"ppppppppppppppp+8-;++ppppppppppppppp",
+"pppppppppppp+;7;  ++;-8-8-++pppppppp",
+"pppppppppp-8-6666666      #-;7;7;+pp",
+"ppppppp+;7#    66666           +88pp",
+"ppppp-8-+      66666:#        8-+-pp",
+"ppppq8-#       66>669&      ;7+  8pp",
+"ppppp ++8-8-#+ 6>rttr;    -8+    ;pp",
+"pppp;      ++;68ewytt#  +8-      8pp",
+"pppp-         6&9yuew8*,4        -pp",
+"pppp8         6=ttyt5o+8         8pp",
+"pppp-         6>tytt:  -    X    ;pp",
+"pppp8     ##  6>trtr#  8  # +   +-pp",
+"pppp;     @t# 6rtrt5#  8##       666",
+"p6pp7      =2O6y>ttr>=>;>@    666666",
+"p66p;      o56t5tytr#  8> .   # 6666",
+"pp667     # #6#@>tyt: #- #@  r666666",
+"ppp66        6  5ttr>##8@>=# 66 -#p6",
+"pppp666      6 .2ytr9r;9tt#666  ;+pp",
+"pppp;+6666   6 O5tt5#>666666#.  -ppp",
+"pppp++   666666666666666>=##+   ;ppp",
+"pppp+;      O6 :tty>@>94#>>:# + ;ppp",
+"pppp+-      .6 >5ti> #=,:   .  +8ppp",
+"ppppp;       6 #tyt>  ;;+     O8pppp",
+"ppppp8    +  6 :rtr>  5$     +8.pppp",
+"ppppp-       6 %>>>=X +;    O8pppppp",
+"ppppp87%O #   6@>>:+# ++   .8.pppppp",
+"ppppppp+8-;#  6     # #-  O8Oppppppp",
+"pppppppppp+7;*6      #9+  8.pppppppp",
+"ppppppppppppp$86+    #4; 8+ppppppppp",
+"ppppppppppppppp6-8-+  #-8+pppppppppp",
+"ppppppppppppppp66pp;8-,0.ppppppppppp",
+"pppppppppppppppp66pppO-+pppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"pppppppppppppppppppppppppppppppppppp",
+"ppppppppp#######pppppppppppppppppppp",
+"pppppppppppppppp#ppppppppppppppppppp",
+"ppppppppppppppppp#pppppppppppppppppp",
+"ppppppppppppppp# ## tppppppppppppppp",
+"pppppppppppppp#11#aa tpppppppppppppp",
+"ppppppppppppp#111+aaa#>ppppppppppppp",
+"ppppppppppppp 131#aaa tppppppppppppp",
+"ppppppppppppp## # # ##>ppppppppppppp",
+"ppppppppppppp+aaaaaaaX9ppppppppppppp",
+"pppppppppppppXaaaaaaa+2ppppppppppppp",
+"ppppppppppppp#aaaaaaa#>ppppppppppppp",
+"ppppppppppppp+aaaaaaaX9ppppppppppppp",
+"pppppppppppppXaaaaaaa+2ppppppppppppp",
+"pppppppppppppp#aaaaa@<pppppppppppppp",
+"pppppppppppppp aaaaa.rpppppppppppppp",
+"ppppppppppppppp# # #rppppppppppppppp"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.bmp
new file mode 100644 (file)
index 0000000..517517e
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/save.xpm
new file mode 100644 (file)
index 0000000..f6b498a
--- /dev/null
@@ -0,0 +1,73 @@
+/* XPM */
+static char *save[] = {
+/* columns rows colors chars-per-pixel */
+"44 50 17 1",
+"  c black",
+". c #000033",
+"X c #333300",
+"o c gray20",
+"O c #333366",
+"+ c #666633",
+"@ c gray40",
+"# c #cc0000",
+"$ c #999966",
+"% c #cccc66",
+"& c gray60",
+"* c #9999cc",
+"= c #cccc99",
+"- c #ffff99",
+"; c gray80",
+": c #ffffcc",
+"> c white",
+/* pixels */
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;#########;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;#######;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;@;;;;;;;;;#####;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;@&o@;;;;;;;;###;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;@&@&@o@;;;;;;;#;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;@&@&@>>>@o;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;@&@&@>>>>>>@@;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;@&@&@>>>>>>>>>o@;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;@&@&@:;:;:;:;:;:;@O;;;;;;;;;;;;",
+";;;;;;;;;;;;@&@&@-%-%-%-%-%-%-@+@o;;;;;;;;;;",
+";;;;;;;;;;;@&@&@;o@%-%-%-%-%-@O+O$ ;;;;;;;;;",
+";;;;;;;;;;@&@&@&@;;o@%%%%%%%@o$O$. ;;;;;;;;;",
+";;;;;;;;;@&@&@&&&@&;;o@%%%%@O$O$.o ;;;;;;;;;",
+";;;;;;;;@&@&@&  @&@&@;;O+%@o$O$.o ;;;;;;;;;;",
+";;;;;;;@&@&@& >;  &&@@@=;O@@@@oo ;;;;;;;;;;;",
+";;;;;;; ;;@& >; @;@ @@@@@@@@@o. ;;;;;;;;;;;;",
+";;;;;;; &&> >;X o*;;  @@@@@@oX ;;;;;;;;;;;;;",
+";;;;;;;;  & >> o;=;=;* @@@@o. ;;;;;;;;;;;;;;",
+";;;;;;;;;;  &&>>*;*;; &@@@oX ;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;  &&>>=; &&O$.o ;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;  &&> &@@@oX ;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;  & &*$.X ;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;  &&oo ;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;  o ;;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;;;;   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;;;  ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;;;   ;;;;   ;;  ;  ;  ;  ;;   ;;  ; ;;;;;",
+";;;;;;   ;;;;;  ;  ;  ;  ;  ;  ;  ;    ;;;;;",
+";;;;;;;   ;;    ;  ;  ;;   ;;     ;  ;;;;;;;",
+";;;;; ;;  ;  ;  ;  ;  ;;   ;;  ;;;;  ;;;;;;;",
+";;;;;;   ;;;    ;;    ;;; ;;;;    ;  ;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+";;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;",
+";;;;   ;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;",
+";;;;   ;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;",
+";;;  ;  ;;    ;;;   ;;  ;  ;  ;;   ;;   ;;;;",
+";;;  ;  ;;  ;  ;;;;  ;  ;  ;  ;  ;;;  ;  ;;;",
+";;       ;  ;  ;;    ;  ;  ;  ;;  ;;     ;;;",
+";;  ;;;  ;  ;  ;  ;  ;  ;;   ;;;;  ;  ;;;;;;",
+";;  ;;;  ;  ;  ;;    ;  ;;;  ;;   ;;;    ;;;",
+";;;;;;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.bmp
new file mode 100644 (file)
index 0000000..a1d1dc0
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/stl.xpm
new file mode 100644 (file)
index 0000000..6c1472a
--- /dev/null
@@ -0,0 +1,55 @@
+/* XPM */
+static char * vesselstoolbar_stl_xpm[] = {
+"50 50 2 1",
+"      c None",
+".     c #000000",
+"                                                  ",
+"                                                  ",
+"                                .....             ",
+"                               ......             ",
+"                          ...........             ",
+"                         ............             ",
+"                       ..............             ",
+"      ..........    .................             ",
+"     ............ .................  .....        ",
+"     .........................       .....        ",
+"     .........................       .....        ",
+"     .........................       .....        ",
+"     ...... ..................       .....        ",
+"     .....       .....   .....       .....        ",
+"     .....               .....       .....        ",
+"     ......              .....       .....        ",
+"     .......             .....       .....        ",
+"     .........           .....       .....        ",
+"     ............        .....      ......        ",
+"      .............      .....      ......        ",
+"       ............      .....      ......        ",
+"        ............     .....      ......        ",
+"          ..........     .....      .....         ",
+"             .......     .....      .....         ",
+"              ......     .....      .....         ",
+"               .....     .....      .....         ",
+"               .....     ......    ......         ",
+"              ......     ......    ......         ",
+"             .......     ......    ......         ",
+"            ........     ......    ......         ",
+"           .........    .......   ......          ",
+"         ..........     .......   ................",
+"        ..........      .......   ................",
+".................       .......   ................",
+"................        .......   ................",
+"...............           .....   ................",
+".............                     ........        ",
+"............                                      ",
+"........                                          ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                                                  "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.bmp
new file mode 100644 (file)
index 0000000..dfb8443
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/subtract.xpm
new file mode 100644 (file)
index 0000000..1143b78
--- /dev/null
@@ -0,0 +1,79 @@
+/* XPM */
+static char *subtract[] = {
+/* columns rows colors chars-per-pixel */
+"44 50 23 1",
+"  c black",
+". c gray20",
+"X c #333366",
+"o c #336633",
+"O c #336666",
+"+ c #660000",
+"@ c #663333",
+"# c #663366",
+"$ c #666633",
+"% c gray40",
+"& c #666699",
+"* c #990000",
+"= c #996666",
+"- c #cc3300",
+"; c red",
+": c #cc6600",
+"> c #ff6600",
+", c #ffcc00",
+"< c gray60",
+"1 c #ffcc99",
+"2 c gray80",
+"3 c #ffffcc",
+"4 c white",
+/* pixels */
+"22222222222222222222222222222222222222222222",
+"222222222222222222222222         2         2",
+"222222222222222222222222   2   4 2 4 2  4  2",
+"222222222222222222222222    2    2    2    2",
+"222222222222222222222222 4   222 2   4 222 2",
+"222222222222222222222222  2 2    2  4 2    2",
+"22222%%=.222222222222222 4 22  4 2   24  4 2",
+"2222%32<O 22222222222222   2     2 4 2     2",
+"222%4442<# 2222222222222 4  2 4  2    44   2",
+"222%2442<% 2222222222222         2         2",
+"222<<242<. 222222222222222222222222222222222",
+"222%%<<<%. 2222222222222         2         2",
+"22%,%%%.%%22222222222222 4 2     24  2  4  2",
+"2<2,>%%&%:..222222222222    2    2  4 2    2",
+"2<144>>>:::,X222;;;;;;22 4   242 2     222 2",
+"2<13344,,,,>o222;;;;;;22  2 2    24 2 2    2",
+"2<1113343,>:@22222222222   42 4  2   22  4 2",
+"2<1,11133>>:O22222222222 4 2     2   2     2",
+"2<1,,1111>>:.22222222222    2    2 4  2 4  2",
+"2<1,,,111>::X22222222222         2         2",
+"2<1,,,,,1>::$2222222222222222222222222222222",
+"2<1,,,,,,>::.22222222222         2         2",
+"22<1,,,,,>::X22222222222   2     2   2     2",
+"22<1,,,,,>-.222222222222    2    2    2    2",
+"22<1,+,,,*-$2222;;;;;;22     222 2     222 2",
+"22<1,*,,+*:X2222;;;;;;22  2 2    2  2 2    2",
+"22<1,*,,>>:.222222222222   22    2   22    2",
+"2222222222222222;;;;;;22   2     2   2     2",
+"2222222222222222;;;;;;22    2    2    2    2",
+"222222222222222222222222         2         2",
+"22222222222222222222222222222222222222222222",
+"22222222222222222222222222222222222222222222",
+"22222222222222222222222222222222222222222222",
+"2222222   2222222222222222222222222222222222",
+"222222  22 222222222222222222  2222222222222",
+"222222   2222   22  2  22   2   2  2 2222222",
+"2222222   22  2  2  2  2  222  22    2222222",
+"22222222   2  2  2  2  22  22  22  222222222",
+"222222 22  2  2  2  2  222  2  22  222  2222",
+"2222222   222   222    2   222  2  222  2222",
+"22222222222222222222222222222222222222222222",
+"222222222222222222222 2222222222222222222222",
+"2222    222222222222 22222222  2222222222222",
+"222 222  22222222222222222222222222222222222",
+"222 222  22222   22   22  2 2  22   222   22",
+"222222  22222  222  2  2    2  2  2  2  2222",
+"22222  2222222  22     2  222  2     22  222",
+"2222  222222222  2  2222  222  2  222222  22",
+"222      2222   222    2  222  22    2   222",
+"22222222222222222222222222222222222222222222"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.bmp
new file mode 100644 (file)
index 0000000..3673eda
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/tick.xpm
new file mode 100644 (file)
index 0000000..b003061
--- /dev/null
@@ -0,0 +1,18 @@
+/* XPM */
+static char *tick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 2 1",
+"  c black",
+". c #c0c0c0",
+/* pixels */
+"..........",
+"........ .",
+".......   ",
+"......    ",
+".....    .",
+"  ..    ..",
+"       ...",
+".     ....",
+"..   .....",
+"... ......"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.bmp
new file mode 100644 (file)
index 0000000..a3e27ba
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/vessels.xpm
new file mode 100644 (file)
index 0000000..a3fbfc9
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * vesselstoolbar_extract_xpm[] = {
+"50 50 3 1",
+"      c None",
+".     c #000000",
+"+     c #FF0000",
+"                      .                           ",
+"                    ..    ++                      ",
+"                   ..    ++     .                 ",
+"                  ..     +     .                  ",
+"                 ..     ++    ..                  ",
+"                ..     ++     .                   ",
+"               ..     ++     ..                   ",
+"               .     ++     ..                    ",
+"              .      +     ..                     ",
+"              .     ++    ..                      ",
+"             ..    ++    ..                       ",
+"             .     +     .                        ",
+"            ..    +      .                        ",
+"            .    ++      ..                       ",
+"           ..    +        .                       ",
+"           .    ++        .                       ",
+"           .    +         ..                      ",
+"          ..    +          .                      ",
+"          .     +          ..                     ",
+"          ..     +          ..                    ",
+"           .     ++          ..                   ",
+"           ..     ++          ...                 ",
+"            ...    +++          ...               ",
+"              ..     +++          ..              ",
+"               ..      +++         ..             ",
+"                ..       +++        ..            ",
+"                 ..        +         .            ",
+"                   .       +         .            ",
+"                   ..      +         .            ",
+"                    .      +         .            ",
+"                    .      +         .            ",
+"                    .      +         .            ",
+"                    .      +        ..            ",
+"                    .      +        .             ",
+"                   ..      +       ..             ",
+"                   .       +       .              ",
+"                  ..      ++      ..              ",
+"                  .       +       .               ",
+"                 ..      ++      ..               ",
+"                ..       +       .                ",
+"               .        ++       .                ",
+"              .        ++       ..                ",
+"             ..        +        .                 ",
+"            ..        ++       ..                 ",
+"                     ++       ..                  ",
+"                    ++        .                   ",
+"                             .                    ",
+"                                                  ",
+"                                                  ",
+"                                                  "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.bmp
new file mode 100644 (file)
index 0000000..8d3ac23
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/wizard.xpm
new file mode 100644 (file)
index 0000000..a7674fd
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static char *wizard[] = {
+/* columns rows colors chars-per-pixel */
+"50 50 39 1",
+"  c black",
+". c gray20",
+"X c #663300",
+"o c #666600",
+"O c #666633",
+"+ c #cc3300",
+"@ c #ff3300",
+"# c #cc6600",
+"$ c #cc6633",
+"% c #ff6600",
+"& c #ff6633",
+"* c #ff6666",
+"= c #999900",
+"- c #999933",
+"; c #cc9900",
+": c #cc9933",
+"> c #ff9900",
+", c #ff9933",
+"< c #cc9966",
+"1 c #cccc00",
+"2 c #cccc33",
+"3 c #ccff33",
+"4 c #ffcc00",
+"5 c #ffcc33",
+"6 c yellow",
+"7 c #ffff33",
+"8 c #cccc66",
+"9 c #ccff66",
+"0 c #ffcc66",
+"q c #ffff66",
+"w c gray60",
+"e c #ccff99",
+"r c #ffcc99",
+"t c #ffff99",
+"y c gray80",
+"u c #ccffcc",
+"i c #ffcccc",
+"p c #ffffcc",
+"a c white",
+/* pixels */
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyp0:,;yyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy0555r;$;#ryyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyp55707rq4$;;$yyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyp5qtqtqqqq4#;#;yyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyy0tttpt9,qq5q;##;yyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyy0ttippprr,q3q;>##iyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyy0ppaapiptr$%#$;;##yyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyytrpaaaapp0756+%$###yyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyrtpaaaaptt5,q6#@;;#yyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyqrapaaapp0tqqq#$;##iyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyrqpaapaiptq9q+%;>##pyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyr0rtpirptqq0##01;##yyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyy50trp<0ttet#04;;##yyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyy552qt:*tpr#&54>##,yyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyy0>5qqr:tpp#555>##yyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyy4255q#pti%52>##ryyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyp>530ttptu04###yyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyy5457qtrp05###pyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyy>5270t80;:##yyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyy0445q05::##pyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy>:545:,###yyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy5>42;:###yyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy;7677666;yyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy.o:w-o   yyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy;1qap54=;yyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyy.o0<oX   yyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyy;;02;;=yyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyoO   yyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyy   yyyyyyyyyyyyy  yyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyy   yyyyyyyyyyyyyyyyyyyyy  yyyyyyyyyyyyyy  yyy",
+"yyyy  y  yyy   yy   y  yy   y   yy   yy    yy   yy",
+"yyyy  y  yy  yyy  yyy  y  yyy  yyyyy  y  y  y  yyy",
+"yyy       yy  yyy  yy  yy  yy  yyy    y  y  y  yyy",
+"yyy  yyy  yyy  yyy  y  yyy  y  yy  y  y  y  y  yyy",
+"yyy  yyy  y   yy   yy  y   yyy  yy    y  y  yy  yy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
+"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.bmp
new file mode 100644 (file)
index 0000000..63575b1
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps/zoom.xpm
new file mode 100644 (file)
index 0000000..4ae3bf1
--- /dev/null
@@ -0,0 +1,76 @@
+/* XPM */
+static char *toolbar_zoom_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"36 50 20 1",
+"  c black",
+". c #000033",
+"X c #003300",
+"o c #330033",
+"O c #333300",
+"+ c gray20",
+"@ c gray40",
+"# c #666699",
+"$ c #6666ff",
+"% c #33ff33",
+"& c #669966",
+"* c #996699",
+"= c #999966",
+"- c gray60",
+"; c #9999cc",
+": c #9999ff",
+"> c #cccc99",
+", c gray80",
+"< c #ccccff",
+"1 c white",
+/* pixels */
+",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,,,,,    ,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,,,, +@+ ,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,,,  - + ,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,, +@+   ,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,  - +   ,,,",
+",,,,,,,,,,,,,,,,,,,,,,,, +@+     ,,,",
+",,,,,,,,,,,,,,,,,,,,,,,  - +    @,,,",
+",,,,,,,,,,,,,,,,,,,,,,    +    -@,,,",
+",,,,,,,,,,,,,,,,,,,,, ,11,    @@,,,,",
+",,,,,,,,,,,          ,11,-,  @@,,,,,",
+",,,,,,,,   1111111111  ,-,- @-,,,,,,",
+",,,,,,  111111111111111  - -@,,,,,,,",
+",,,,, 11111          1111 @@,,,,,,,,",
+",,,, 111   ;;;;;;;;;;  111 ,,,,,,,,,",
+",,, 111 ;;;;;;;;;;;;;;; 111 ,,,,,,,,",
+",, 111 ;;;;<:::::::::;>: 111 @,,,,,,",
+",, 11 ;;;:<1<########:;;; 11 -@,,,,,",
+",, 11 ;;:##<::::::::1##:; 11 @@-,,,,",
+",, 11 ;:#::::::::$::1::#: 11 @-@,,,,",
+",, 111 #:::$:::::111:::: 111 @@-@,,,",
+",,  111 ::::::$:::::::: 111  @-@@,,,",
+",, ; 111  :::<::::::   111 ; -@@-,,,",
+",, ;; 1111          11111 ;; @-@,,,,",
+",, ;;;  111111111111111  ;;; @@-,,,,",
+",, ;;;;;   111111111   ;;;;; -@,,,,,",
+",,, ;;;;<<<         ;;;;;;; -@=,,,,,",
+",,,, ;;;<<<<<<<1;1;;;;;;;; @@-,,,,,,",
+",,,,, ;;<<<<<<<1;1;;;;;;; -@-,,,,,,,",
+",,,,,,  <<<<<<<1;1;;;;;  -@-,,,,,,,,",
+",,,,,,,,   <<<<1;1;;   -@@,,,,,,,,,,",
+",,,,,,,,,,,         @-@,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,",
+",,,,,,,,,+++++++,,,,,,,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,,+,,,,,,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,,,+,,,,,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,+ ++ -,,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,+11+%% -,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,+111o%%%+@,,,,,,,,,,,,,",
+",,,,,,,,,,,,, 111+%%% -,,,,,,,,,,,,,",
+",,,,,,,,,,,,,++ + + ++@,,,,,,,,,,,,,",
+",,,,,,,,,,,,,o1111111X*,,,,,,,,,,,,,",
+",,,,,,,,,,,,,X1111111o&,,,,,,,,,,,,,",
+",,,,,,,,,,,,,+1111111+@,,,,,,,,,,,,,",
+",,,,,,,,,,,,,o1111111X*,,,,,,,,,,,,,",
+",,,,,,,,,,,,,X1111111o&,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,+11111O#,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,, 11111.=,,,,,,,,,,,,,,",
+",,,,,,,,,,,,,,,+ + +=,,,,,,,,,,,,,,,"
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_01.xcf b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_01.xcf
new file mode 100644 (file)
index 0000000..72f93e5
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_01.xcf differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_02.xcf b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_02.xcf
new file mode 100644 (file)
index 0000000..03cb2bd
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/maracas_02.xcf differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.bmp
new file mode 100644 (file)
index 0000000..d5943d0
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_CTQuantification.xpm
new file mode 100644 (file)
index 0000000..ca46c98
--- /dev/null
@@ -0,0 +1,820 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_CTQuantification_xpm[] = {
+"100 100 717 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #787AD5",
+"Y.    c #726FC3",
+"Z.    c #686AA3",
+"`.    c #CACDF7",
+" +    c #444682",
+".+    c #4A5092",
+"++    c #888ECF",
+"@+    c #CFD2FC",
+"#+    c #504E4C",
+"$+    c #99938A",
+"%+    c #C4BBAF",
+"&+    c #D7CCBE",
+"*+    c #FF0000",
+"=+    c #D4CABC",
+"-+    c #CBC2B5",
+";+    c #999289",
+">+    c #404479",
+",+    c #474688",
+"'+    c #9793D7",
+")+    c #CCCFFA",
+"!+    c #D3D2F7",
+"~+    c #D8D7FC",
+"{+    c #DAD9FE",
+"]+    c #6F6B66",
+"^+    c #AFA79C",
+"/+    c #CCC2B6",
+"(+    c #D9CFC0",
+"_+    c #D3C9BB",
+":+    c #AAA298",
+"<+    c #7A7570",
+"[+    c #9095D6",
+"}+    c #6B0000",
+"|+    c #6B0100",
+"1+    c #DBDFFC",
+"2+    c #908A82",
+"3+    c #AFA79D",
+"4+    c #E66158",
+"5+    c #E4D9CB",
+"6+    c #D1C7BA",
+"7+    c #B3ABA0",
+"8+    c #9D968D",
+"9+    c #373736",
+"0+    c #8C8ED6",
+"a+    c #E1E1F9",
+"b+    c #605D59",
+"c+    c #A19A91",
+"d+    c #CAC0B3",
+"e+    c #F66F65",
+"f+    c #DED3C4",
+"g+    c #B9B1A5",
+"h+    c #E4E3FB",
+"i+    c #938D85",
+"j+    c #C3BAAE",
+"k+    c #F26C62",
+"l+    c #DCD1C3",
+"m+    c #D1C7B9",
+"n+    c #BFB7AA",
+"o+    c #2B2D4A",
+"p+    c #EBE7F9",
+"q+    c #716D68",
+"r+    c #B3ABA1",
+"s+    c #EB665D",
+"t+    c #E1D6C7",
+"u+    c #D6CBBE",
+"v+    c #C0B7AB",
+"w+    c #484878",
+"x+    c #423F76",
+"y+    c #6B0200",
+"z+    c #E5E4FC",
+"A+    c #E8EDFD",
+"B+    c #99928A",
+"C+    c #D34F48",
+"D+    c #E3D8C9",
+"E+    c #DAD0C1",
+"F+    c #C3BAAD",
+"G+    c #918B82",
+"H+    c #BEB6AA",
+"I+    c #FA7369",
+"J+    c #DBD1C2",
+"K+    c #C8BEB1",
+"L+    c #A29B91",
+"M+    c #5C5955",
+"N+    c #000000",
+"O+    c #89847C",
+"P+    c #F06A61",
+"Q+    c #DCD2C3",
+"R+    c #C6BDB0",
+"S+    c #A49C93",
+"T+    c #252547",
+"U+    c #545284",
+"V+    c #8685D3",
+"W+    c #78736D",
+"X+    c #B9B1A6",
+"Y+    c #E0D5C7",
+"Z+    c #C7BEB1",
+"`+    c #A19A90",
+" @    c #5E5B57",
+".@    c #6F6C66",
+"+@    c #B7AEA3",
+"@@    c #E56058",
+"#@    c #A39C92",
+"$@    c #282340",
+"%@    c #5E403A",
+"&@    c #B2AA9F",
+"*@    c #E76159",
+"=@    c #DACFC2",
+"-@    c #C9C0B3",
+";@    c #A09A90",
+">@    c #6B0300",
+",@    c #6B0400",
+"'@    c #6C4D46",
+")@    c #9E7C71",
+"!@    c #EA655C",
+"~@    c #D7CDBF",
+"{@    c #CBC1B4",
+"]@    c #9F988F",
+"^@    c #353457",
+"/@    c #7777C4",
+"(@    c #785951",
+"_@    c #A27F74",
+":@    c #EF6960",
+"<@    c #DAD0C2",
+"[@    c #C5BCB0",
+"}@    c #9C968D",
+"|@    c #5E5D9C",
+"1@    c #7D5D55",
+"2@    c #A58277",
+"3@    c #F36D64",
+"4@    c #C1B9AC",
+"5@    c #5A5FA2",
+"6@    c #6F73BF",
+"7@    c #432622",
+"8@    c #84635B",
+"9@    c #A9877A",
+"0@    c #F87167",
+"a@    c #C6A293",
+"b@    c #C9BFB2",
+"c@    c #A29C92",
+"d@    c #6B0600",
+"e@    c #6B0900",
+"f@    c #6B0800",
+"g@    c #664740",
+"h@    c #947268",
+"i@    c #B49084",
+"j@    c #F77066",
+"k@    c #C49F91",
+"l@    c #B08C80",
+"m@    c #08050A",
+"n@    c #6B0A00",
+"o@    c #6B0500",
+"p@    c #6B1000",
+"q@    c #6B0B00",
+"r@    c #795951",
+"s@    c #A58276",
+"t@    c #F26C63",
+"u@    c #C9A495",
+"v@    c #BD998C",
+"w@    c #AB887C",
+"x@    c #2A2E55",
+"y@    c #0A0B14",
+"z@    c #080D1A",
+"A@    c #1D1B32",
+"B@    c #6B0C00",
+"C@    c #6B0E00",
+"D@    c #6B1900",
+"E@    c #6B2900",
+"F@    c #6B2C00",
+"G@    c #63493E",
+"H@    c #937367",
+"I@    c #AE8A7E",
+"J@    c #B99588",
+"K@    c #A17F73",
+"L@    c #21233F",
+"M@    c #111122",
+"N@    c #6B0700",
+"O@    c #6B2D00",
+"P@    c #6B5C00",
+"Q@    c #4A4629",
+"R@    c #89815E",
+"S@    c #A29474",
+"T@    c #F16B62",
+"U@    c #F36D63",
+"V@    c #C29E8F",
+"W@    c #563833",
+"X@    c #6B2A00",
+"Y@    c #6B6700",
+"Z@    c #72783C",
+"`@    c #7E8A4D",
+" #    c #95995A",
+".#    c #F46E64",
+"+#    c #C29D8F",
+"@#    c #85645C",
+"##    c #422522",
+"$#    c #6F73CC",
+"%#    c #6B6500",
+"&#    c #7C884A",
+"*#    c #6C9556",
+"=#    c #F16B61",
+"-#    c #CAB696",
+";#    c #BC9B8A",
+">#    c #9E7B70",
+",#    c #6B3200",
+"'#    c #928F51",
+")#    c #E9645B",
+"!#    c #F26D63",
+"~#    c #8FA667",
+"{#    c #ABA565",
+"]#    c #AD977D",
+"^#    c #8A6A60",
+"/#    c #5E3F3A",
+"(#    c #6B4400",
+"_#    c #A2A061",
+":#    c #78A566",
+"<#    c #7AA667",
+"[#    c #859759",
+"}#    c #A09872",
+"|#    c #77614F",
+"1#    c #6B4900",
+"2#    c #A8A565",
+"3#    c #87A465",
+"4#    c #769B5D",
+"5#    c #6D894C",
+"6#    c #727438",
+"7#    c #554B32",
+"8#    c #6B1200",
+"9#    c #9B99EA",
+"0#    c #6B4700",
+"a#    c #9E985A",
+"b#    c #828C4F",
+"c#    c #6E7C40",
+"d#    c #575C23",
+"e#    c #6B6600",
+"f#    c #6B3000",
+"g#    c #6B5400",
+"h#    c #6B6000",
+"i#    c #6B5D00",
+"j#    c #6B4300",
+"k#    c #6B1E00",
+"l#    c #6B1100",
+"m#    c #0B070D",
+"n#    c #625F5A",
+"o#    c #8B857D",
+"p#    c #363961",
+"q#    c #110D1B",
+"r#    c #494845",
+"s#    c #847F78",
+"t#    c #A49D93",
+"u#    c #C1B8AC",
+"v#    c #858078",
+"w#    c #A49D94",
+"x#    c #F56E64",
+"y#    c #484986",
+"z#    c #7A766F",
+"A#    c #E8625A",
+"B#    c #F56F65",
+"C#    c #D9CEC0",
+"D#    c #E0D6C7",
+"E#    c #16152B",
+"F#    c #6C6863",
+"G#    c #B6AEA3",
+"H#    c #EF6A60",
+"I#    c #DDD3C4",
+"J#    c #535491",
+"K#    c #7275CE",
+"L#    c #514F4D",
+"M#    c #B0A89D",
+"N#    c #E35E56",
+"O#    c #CCC3B5",
+"P#    c #BAB2A7",
+"Q#    c #7C7771",
+"R#    c #DD5951",
+"S#    c #DAD1C2",
+"T#    c #CEC5B7",
+"U#    c #C5BCAF",
+"V#    c #807B75",
+"W#    c #979188",
+"X#    c #BCB4A8",
+"Y#    c #E56057",
+"Z#    c #D8CEBF",
+"`#    c #D6CCBE",
+" $    c #CFC5B7",
+".$    c #8C867F",
+"+$    c #403F3E",
+"@$    c #7F7A74",
+"#$    c #A9A198",
+"$$    c #D7CDBE",
+"%$    c #D2C9BB",
+"&$    c #CDC4B7",
+"*$    c #B7AFA4",
+"=$    c #989289",
+"-$    c #5C5A56",
+";$    c #484645",
+">$    c #D5CBBD",
+",$    c #D2C8BA",
+"'$    c #C4BBAE",
+")$    c #B8AFA4",
+"!$    c #A09990",
+"~$    c #79756F",
+"{$    c #6E6A65",
+"]$    c #D3CABB",
+"^$    c #D5CABD",
+"/$    c #BDB4A9",
+"($    c #A8A198",
+"_$    c #88827B",
+":$    c #434140",
+"<$    c #AAA398",
+"[$    c #C6BCAF",
+"}$    c #DED4C5",
+"|$    c #D6CBBD",
+"1$    c #75716B",
+"2$    c #C8BFB1",
+"3$    c #D9CFC1",
+"4$    c #DACFC0",
+"5$    c #CAC1B4",
+"6$    c #A8A197",
+"7$    c #79746E",
+"8$    c #050208",
+"9$    c #817C75",
+"0$    c #B1A99E",
+"a$    c #C9BFB3",
+"b$    c #F36E64",
+"c$    c #E0D6C6",
+"d$    c #CDC3B6",
+"e$    c #A7A096",
+"f$    c #7D7972",
+"g$    c #847F77",
+"h$    c #ACA59A",
+"i$    c #F97368",
+"j$    c #DFD4C5",
+"k$    c #ABA399",
+"l$    c #363535",
+"m$    c #4F4D4A",
+"n$    c #313260",
+"o$    c #868179",
+"p$    c #A8A196",
+"q$    c #F67066",
+"r$    c #D8CDBF",
+"s$    c #23211F",
+"t$    c #5B5955",
+"u$    c #65615D",
+"v$    c #77736D",
+"w$    c #7C7871",
+"x$    c #A59E94",
+"y$    c #C6BDB1",
+"z$    c #D5CBBE",
+"A$    c #DFD5C6",
+"B$    c #E6DBCC",
+"C$    c #807B74",
+"D$    c #5B5854",
+"E$    c #7D7872",
+"F$    c #87817A",
+"G$    c #8A847D",
+"H$    c #15121F",
+"I$    c #09060C",
+"J$    c #63605B",
+"K$    c #9B958C",
+"L$    c #DED2C4",
+"M$    c #F77167",
+"N$    c #BDB5A9",
+"O$    c #969087",
+"P$    c #65625D",
+"Q$    c #4E4C4A",
+"R$    c #7E7973",
+"S$    c #8F8982",
+"T$    c #9F988E",
+"U$    c #42413F",
+"V$    c #8D8880",
+"W$    c #E2D7C8",
+"X$    c #C8BFB2",
+"Y$    c #B4ACA0",
+"Z$    c #8E8880",
+"`$    c #67635E",
+" %    c #4E4C49",
+".%    c #7B7770",
+"+%    c #8C877F",
+"@%    c #9B948C",
+"#%    c #9A938A",
+"$%    c #958F86",
+"%%    c #D34F47",
+"&%    c #D1C8BA",
+"*%    c #DCD2C4",
+"=%    c #D4CABD",
+"-%    c #B0A79D",
+";%    c #8D877F",
+">%    c #6B6762",
+",%    c #686560",
+"'%    c #857F78",
+")%    c #969088",
+"!%    c #A39B91",
+"~%    c #ADA59A",
+"{%    c #CB4741",
+"]%    c #D04C45",
+"^%    c #1D203B",
+"/%    c #514F4C",
+"(%    c #8F8A82",
+"_%    c #C4BCAF",
+":%    c #D6CDBE",
+"<%    c #DFD4C6",
+"[%    c #DBD0C2",
+"}%    c #D0C7B9",
+"|%    c #B5ADA2",
+"1%    c #7C7872",
+"2%    c #504E4B",
+"3%    c #595753",
+"4%    c #817D75",
+"5%    c #9E978E",
+"6%    c #AEA69B",
+"7%    c #BAB2A6",
+"8%    c #D14D46",
+"9%    c #CD4942",
+"0%    c #ACA49A",
+"a%    c #B8B0A4",
+"b%    c #CCC3B6",
+"c%    c #D7CEBF",
+"d%    c #E0D5C6",
+"e%    c #CEC4B7",
+"f%    c #BEB5A9",
+"g%    c #999389",
+"h%    c #726E69",
+"i%    c #595653",
+"j%    c #4F4D4B",
+"k%    c #54514E",
+"l%    c #5C5956",
+"m%    c #716D67",
+"n%    c #908B83",
+"o%    c #9B948B",
+"p%    c #AEA69C",
+"q%    c #D24E47",
+"r%    c #D45049",
+"s%    c #CE4A44",
+"t%    c #B0A99D",
+"u%    c #9D978D",
+"v%    c #A79F96",
+"w%    c #474B93",
+"x%    c #D0C6B9",
+"y%    c #DDD2C4",
+"z%    c #CFC5B8",
+"A%    c #BCB3A8",
+"B%    c #A79F95",
+"C%    c #928D84",
+"D%    c #938E85",
+"E%    c #8F8981",
+"F%    c #908B82",
+"G%    c #948E85",
+"H%    c #A29B92",
+"I%    c #B0A99E",
+"J%    c #BBB3A8",
+"K%    c #DA554E",
+"L%    c #D9554E",
+"M%    c #BDB4A8",
+"N%    c #9C958C",
+"O%    c #53514E",
+"P%    c #CDC4B6",
+"Q%    c #D2C8BB",
+"R%    c #D4CBBC",
+"S%    c #C6BCB0",
+"T%    c #BFB6AA",
+"U%    c #BAB1A6",
+"V%    c #B6AEA2",
+"W%    c #BCB3A7",
+"X%    c #CF4C45",
+"Y%    c #D7534B",
+"Z%    c #DB574F",
+"`%    c #C2B9AD",
+" &    c #B5AEA2",
+".&    c #9A938B",
+"+&    c #B7AFA3",
+"@&    c #F36C63",
+"#&    c #F46D64",
+"$&    c #DED3C5",
+"%&    c #C7BFB2",
+"&&    c #E35F56",
+"*&    c #E45F56",
+"=&    c #E05C53",
+"-&    c #938C84",
+";&    c #837E76",
+">&    c #6368AC",
+",&    c #BBB2A6",
+"'&    c #EA645B",
+")&    c #E25D54",
+"!&    c #E35E55",
+"~&    c #E05B53",
+"{&    c #CAC1B3",
+"]&    c #BBB3A6",
+"^&    c #ACA499",
+"/&    c #928B83",
+"(&    c #7E7972",
+"_&    c #555350",
+":&    c #78746E",
+"<&    c #979088",
+"[&    c #A9A298",
+"}&    c #C7BDB0",
+"|&    c #D2C9BA",
+"1&    c #D1C8B9",
+"2&    c #CFC6B8",
+"3&    c #CCC2B5",
+"4&    c #CBC2B4",
+"5&    c #ADA59B",
+"6&    c #989189",
+"7&    c #67645F",
+"8&    c #B9B0A5",
+"9&    c #C2B8AC",
+"0&    c #CDC3B5",
+"a&    c #D2C7BA",
+"b&    c #D5CCBD",
+"c&    c #DDD2C3",
+"d&    c #C8BEB2",
+"e&    c #8A857D",
+"f&    c #827E77",
+"g&    c #6A6661",
+"h&    c #32386C",
+"i&    c #3B3A39",
+"j&    c #6C6963",
+"k&    c #918C83",
+"l&    c #B4ACA1",
+"m&    c #B8AFA3",
+"n&    c #827D76",
+"o&    c #9E978D",
+"p&    c #AEA79B",
+"q&    c #B2AB9F",
+"r&    c #AAA297",
+"s&    c #A9A196",
+"t&    c #948E86",
+"u&    c #8F8A81",
+"v&    c #75706B",
+"w&    c #5D5A57",
+"x&    c #736F69",
+"y&    c #87827A",
+"z&    c #928C84",
+"A&    c #968F87",
+"B&    c #958E86",
+"C&    c #8C877E",
+"D&    c #87827B",
+"E&    c #7F7A73",
+"F&    c #7E7A73",
+"G&    c #454342",
+"H&    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.O.O.I.I.I.I.I.J.I.J.F.D.z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.A.F.J.I.I.O.T.U.V.V.U.W.T.T.T.I.K.I.K.F.D.x.p.o.d.. 6.i + <.g.z 4 5 X.Y.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y Z.5.f.p.y.D.E.I.K.V.T.T.T.`.`.`.`.U.W.W.U.T.T.T.K.J.E.D.z.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ). +.+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u Z.++f.o.x.D.F.J.K.T.V.`.U.@+@+#+$+%+&+*+*+=+-+;+T.V.I.I.D.y.z.p.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.>+,+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w  +O S.'+5.p.y.x.E.K.I.T.`.U.@+)+!+~+{+]+^+/+*+*+(+_+:+<+U.O.K.K.F.A.z.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $. +#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.S.[+e.p.x.z.D.J.I.}+|+|+)+!+!+!+1+1+1+2+3+4+*+5+6+7+8+9+W.I.I.I.E.A.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 0+5.b.p.y.D.J.I.}+}+}+}+}+~+~+1+~+1+a+b+c+d+*+e+f+_+g+b+`.W.O.I.E.D.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.x.p.z.D.I.}+}+}+}+}+}+}+1+1+h+a+a+1+i+j+*+k+l+m+n+b+U.`.V.I.E.D.y.p.f.d.i + r.@ ' z 4 4 # &., 2.% 2.% L.L.{ n $ n v $ L o+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u Z.5.. d.x.x.y.}+}+}+}+}+}+}+}+}+}+|+a+p+p+h+q+r+s+*+t+u+v+b+U.`.W.T.J.D.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f * { L.( v ( ( { n - K 0 9 a w+P a                     ",
+"                      # ' * (.P x+u ~.4.i 5.f.o.q.}+}+}+}+}+}+}+}+}+}+}+}+y+z+a+A+z+B+C+*+D+E+F+b+@+U.`.I.I.E.D.z.p.f.d.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+p+A+A+G+H+*+I+J+K+L+M+U.`.V.I.J.F.A.p.b.N+N+N+N+N+N+N+4 X.N+N+N+N+N+N+N+N+N+N+M.].n n n V t.[ .+{.a 0 O %                 ",
+"                    % , ( @.R c H.e 0+! ! 5.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+p+p+O+v+P+*+Q+R+S+b+@+U.U.O.I.E.y.p.N+N+N+N+N+N+N+' # # &.N+N+N+N+N+N+N+N+v n ( ( ( M.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H.T+| U+V+A i c.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+p+W+X+4+*+Y+Z+`+ @@+`.T.O.I.D.A.p.N+N+! i N.3 }.}.5 # # , 2./ N+N+% % n v v n n { { ]./.O a /..+a !.O %               ",
+"                  ( : S ; k.T+H.U+4.i 6.}+}+}+}+}+}+}+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+.@+@@@*+Q+Z+#@b+!+W.V.O.J.F.y.p.N+N+i ) <.~ z 7.4 # # , % / N+N+{ { L.h $ M.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.$@[ -.y }+}+}+}+}+}+}+}+}+}+|+|+|+}+}+|+y+}+}+}+}+}+}+}+%@&@*@*+=@-@;@b+!+`.T.O.K.D.y.p.N+N+6.) <.' 3 4 4 # # & 2.2.N+N+% { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+>@,@|+}+}+|+}+}+'@)@!@*+~@{@]@b+@+U.V.O.I.E.A.q.N+N+! ! r.@ ' ' 4 # # & , ( N+N+{ % ( n ( M.( ( ( ( ].#.^@g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H./@}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+|+}+}+}+}+}+(@_@:@*+<@[@}@b+)+`.T.J.K.F.A.p.N+N+i A r.@ 3 ' X.# # # , , N+N+{ * % v { n n n n ( $ ].P.!.k.w+0 |.| V             ",
+"                {.3.{.$.O d Y |@-.@ }+}+}+}+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+1@2@3@*+Q+4@;@b+)+U.T.I.E.D.y.p.N+N++ ) <.g.}.B 5 # # % , ( N+N+% h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| 5@6@g.@ }+}+}+}+|+,@>@}+}+}+}+}+}+}+}+|+>@>@|+|+}+}+7@8@9@*+0@a@b@c@b+`.V.T.I.F.A.x.o.N+N+! A @ 3 ' 8.4 # &.& , , N+N+{ L.L.n v n n n ( ( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ G.O ~._.V+@ N.) }+}+}+}+,@d@>@}+}+}+}+}+}+}+|+,@e@f@,@}+}+g@h@i@*+j@k@l@b+)+W.T.O.I.E.D.q.o.N+N+N+N+N+N+N+7.%.# & , 2.% N+N+% { v M.$ M.( ( n ].( { $ j.u !.k F m@m@(           ",
+"              = ; {.( S 3.X 5@6@:.~ @ ) + }+}+}+|+n@n@o@|+}+}+}+}+}+}+y+e@p@q@>@}+r@s@t@*+u@v@w@b+`.T.I.I.J.D.y.p.f.. N+N+N+N+N+N+N+# # , , , f N+N+% ( h.n { n n ( ( n ( n M.^ X x@t y@z@A@C.          ",
+"            a H | ~.$.8 .+|._.T 3 g.[.<.i ! }+}+|+,@B@C@f@y+}+}+}+}+}+}+d@D@E@F@G@H@I@t@*+u@J@K@b+}+}+I.K.F.z.x.f.f.. 6.+ @ g.3 ' %.# # , 2./ 2./ { { h.( ( ( h ( n n ( ].( { S u B.>+e k.| a %         ",
+"            h v e L@y@M@H } U B z 2 @ r.A . . }+y+y+o@f@e@o@|+}+}+}+}+}+N@O@P@Q@R@S@T@U@*+V@i@h@W@}+}+}+J.y.y.p.d.! 6.i ) @ 2 z z 4 # , , 2.( , % % L.h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.$@r q /@8.}.g.~ [.) y ! 5.}+|+|+y+y+|+}+}+}+}+}+}+|+X@Y@Z@`@ #k+.#*++#I@@###|+}+}+}+x.o.f.b.. y ) @ 2 3 4 4 5 # # &., 2.* f { { h v M.( ( n n ( { ( ].( M.P /.*.w+c H I (         ",
+"            , 3 ~ @ $#; O ).B 7.' ' 3 ~ ) i + ! d.}+}+|+|+|+|+}+}+}+}+}+|+p@%#&#*#=#.#*+-#;#>#r@}+}+|+}+}+}+p.e.c.. + A <.' }.4 4 # # , , 2.2.( % % { h n n n ( ( ].( n ( n n { >+$./.o  .L p S         ",
+"            , ~ ~ # v P d H./@8.%.8.' ~ 2 @ ! . 5.f.}+}+|+|+>@y+}+}+|+|+}+,@,#'#)#!#*+~#{#]#^#/#}+}+|+|+|+}+|+c.! + i g.~ 3 ' 4 # # , # ( 2.2.f { * ( v ( h M.n n ( ].( { ( ( ( O ,+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.}+}+}+|+>@|+}+}+}+}+}+N@(#_#*+:#<#[#}#|#|+}+}+}+|+|+}+}+|+! ) <.g.' z 8.4 # # , , , 2.f % % h.v v n n ( ( n ( ].( n n n { =. +N H.~.$@A@;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. d.}+}+}+}+|+}+}+}+}+}+}+o@1#2#3#4#5#6#7#8#}+}+}+|+|+}+}+}+|+y @ ~ 3 4 4 9.# , , 2.% f % * { ( h $ ( ( n n ( n ( ].( ( M.( Q.P  +P X q F ;         ",
+"            ' , n n S O | X # # $#5 B 7.}.3 @ N.+ + 5.9#e.}+}+|+|+|+}+}+|+|+}+}+>@0#a#b#c#d#e#E@o@}+}+}+|+|+}+}+|+|+' 2 ' 4 4 # # , % , ( , % ( * { v v v M.( n ( n ( n n { n $ n...N w+k t M@;         ",
+"            # ( v % _ b  .|.9.$## 9.# 4 7.' @ 2 A i + . . d.5.|+y+>@|+}+y+,@>@}+}+o@f#g#h#i#j#k#,@}+}+}+}+}+}+}+}+y+,@z B %.# # # , , , 2.* * { % ( $ $ $ { n ( n ( n ( ( ( h n >+).>+g | s y@;         ",
+"            v ( 2.* {.^@| u T # , # # 5 4 7.3 g.~ A y i . c.c.d.y+y+|+|+y+,@o@>@}+}+y+B@l#p@n@|+}+}+}+}+}+}+}+}+}+}+}+|+4 4 # , , 2.% 2.f % % { h.v n n ( ( n ( n ( n n ].n h $ Q.O O u A@z@m#*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ N.) y y ! n#o#y+|+}+y+o@o@>@|+}+}+y+>@,@>@|+}+}+}+|+}+}+}+}+}+}+}+}+}+# # , # ( 2.f % { { ( h { ( ( ].n ( n ( n ( ( ( ( { n W 1.p#p M@q#y@;         ",
+"            , 5 # , _ g Y c 5 , , , &.Y.# %.X.B z 2 ~ 2 + ) r#s#t#u#y+|+|+,@>@|+}+}+}+>@>@|+}+}+}+}+|+|+|+}+}+}+}+}+}+}+}+|+, % & , 2.* ( % * v M.v v ( ( n ( n ( n n n n ( ( L. +b u L M@y@y@;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A N.v#w#=#x#*+|+}+|+>@|+}+}+}+|+,@>@}+}+}+|+>@,@y+}+}+}+}+}+}+}+|+|+|+X.# # &.# , 2.L.( { $ $ n n ( n ( n ( ( ( M.n v { y#P.} d ` q#M@;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 z#;@A#B#*+C#D#}+}+}+}+}+}+}+}+|+,@y+}+}+}+y+>@y+|+}+}+}+}+}+}+|+>@|+|+|+f L.( * * , * v n ( ( n ( n ( n n n n M.M.( ( .+!.u t s q#E#;         ",
+"            ( B 5 # S l.x@Y 5@, , % 2.% , & # # 5 %.4 8.F#$+G#H#*+J+D#I#_+}+}+}+}+}+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+}+|+}+}+y+>@|+}+|+% * ( { $ L.% L.n n ( n ( n ( ( ( ( n v h.v j.^@T+F G z@G x         ",
+"            ; 5 4 / /.o X t.J#, 2.2., 2.% , # & # # K#L#O+M#N#*+J+Y+t+~@O#P#}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+y+|+}+|+|+2.( * h.% { { { { f % n ( n ( n n n v ( ].L.h M.P.k. .q E#y@q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # Q##@R#*+(+(+S#~@T#U#:+V#}+}+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+|+}+% , 2.% h { { ( ( ( ( { % n ( n ( ( ( $ v h v n  +g X  .$@s y@I M.        ",
+"            i., h {.e a #.Q.a , * * * / 2./ 2.2., &.n#W#X#Y#*+C#Z#`# $U#&@.$+$' }+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+, f 2.* { % ( n n n n ( { % v ( n n n n $ n ( % ( n.O Y c A@y@m@l.*         ",
+"            6 = .+g O _ 8 D l 2.* % % { / 2.% % 2., @$#$K+s+*+$$%$&$U#*$=$-$4 4 4 }+|+y+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+, % * % { % % * v M.h ( ( { ( { f n ( ( ( ( n v h.{ ,.g J  .Z q#m@y@V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ ;$i+P#T#H#*+>$,$'$)$!$~$8.9.%.%.# |+d@,@|+}+}+}+}+}+}+}+}+}+}+}+}+}+2.2.( * % ( / % L.{ { n ].( ].( ( L.* n n v ( M.h ( ( x+g k.R.s y@m@F =           ",
+"              M 7 {.0 a a =.O 5@* ( { { { % * / / {$]@'$]$.#*+Z#^$/$($_$:$# # # Y.# # |+y+|+}+}+}+}+y+}+}+}+|+}+}+}+2./ f * % { * ( { { L.( ( ( ].( ].].{ % v h $ v { v h.: ^@l X L@E#y@m@L@S           ",
+"              v.{.v.H.P H.w+ +5@v % L.L.{ ( % % * ~$<$[$~@.#*+}$|$v+#$1$, # & # &., & &., }+}+}+}+}+y+y+}+}+|+|+, 2.f ( % { L.{ { % % { v n n ( { ( ( ( { ( { n $ v ( L.( V R J Y L@E#y@m@g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % Q#M#2$3$U@*+4$&+5$6$7$2., , , , , , , # % }+}+}+}+}+,@|+}+|+* / / % * { L.{ ( { { { % ( ( ( ].( { n ].( v / ( v ( h.{ 8 x@Y u I T+z@8$z@V             ",
+"                0 !.J ).^ C G./..+w ( { ( % L.{ { 9$0$a$$$b$*+c$E+d$e$f$f 2.f % % , / % 2.% , |+|+|+}+|+,@}+% ( % 2.% ( * { * ( % L.{ h.v n ( ].( ( ( ].$ ( , M.h.L.{ +.^ x@p  .o+A@m@m@Z ;             ",
+"                a g H.a l L@L@I R P.+.( v { { L.L.g$h$d+m+E+*+i$j$_+k$s#/ % 2., , % f 2.2./ / 2.>@y+|+}+, L.{ * ( * * f ( L.v h.{ l$m$L.n ( n ( ].].{ ( n n / v h h.% M.c p | p F q#m@y@[ %             ",
+"                  ~.s y@q#| Q M P.n$,.^ ( ( { { L.o$p$n+`#C#q$*+D+r$g+8+s$2.L.L.2.% * * { * % % * o@o@% , L.L.{ L.% ( / { L.L.t$u$v$g$% n ( { ( ( ( n ( h M.f v ( h.n V ` t Y T+E#y@m@s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { w$x$y$z$A$b$*+B$E+-@7+C$% * * * { % % % L.{ { ( * L.{ , { { { { { { ( % D$]+E$F$G$i+{ ( n ( ].n ].( v n v 2.L.* v w t F H$m@m@I$m@m@| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { J$K$j+%$I#L$M$*+A$m+N$O$P$% ( % { { * ( * L.{ L.{ ( { , ( ( ( ( ( v Q$7$1$R$9$S$}@T$n ( ].( ( ( n $ ( n ( 2.L.h.].W F g Q R.y@8$m@y@$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( U$V$*$-+3$W$b$*+D+`#X$Y$Z$`${ * ( % L.{ L.{ % { { { ( / { v v v  %`$.%+%@%#%2+$%%%*+( n ( n n n h n v L.* * * v < F H k.0 Y r m@m@L@;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n Q#;@/$&%}$*%P+*+I#=%4@-%;%>%{ { { { { ( { ( ( ( v ( % h $ $ ,%'%)%!%~%M#6${%*+*+]%( n ( ( M.n ( v { h * f h.w t ^%E !. .s y@m@q#.+%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( /%(%0$_%:%<%H#*+[%>$}%4@|%@%1%2%( ( ( v ( { v v ( n { { 3%4%5%6$6%Y$7%8%*+*+9%p$0%n ( n n { ( v M.L.{ * f ,.R.L p Y p z@m@8$m@T+;                   ",
+"                        | L@q R.k H.[ | L c < ,.{ n ].1$]@a%b%c%d%U@*+J+>$e%X$f%k$g%v#.%h%J$i%j%k%l%,%m%1$n%o%t#p%)$H+q%r%*+s%t%S+u%v%n ( h ( v v v { L.% * C w% .k } L M@y@m@m@M@{.                    ",
+"                        l A@A@| 3.#.O R. .E | w%( ( ( n 2+e$u#x%l+y%*+M$l+~@_+z%{@A%M#B%]@K$C%D%E%F%G%K$H%p$I%J%A%K%L%*+*+M%X+^+S+$%N%( v n v v h ( % { f U N p l.w+u M@y@m@m@y@X ^                     ",
+"                          ^@ .~.@.8 g d O k.X |.G.].M.( O%W#^+y$P%Q%`#*+B#t+*%~@R%>$,$S%T%7%U%)$+@V%V%a%W%X#X%Y%Z%Z%*+`%W%P# &6%.&2+2+$ ( n M.v h.{ * * m ,+$@b 3.7 p y@y@m@y@p _                       ",
+"                          7 b ^@^.$.l } a 1 ..j.=.V ^ n ( .@8++&4@Z+e%*+*+@&#&t@k+$&$&<@>$Q% $'$%&b@&&*&=&*+*+*+*+*+R+T%a%V%7+6%-&;&W+v v L.v L.( % { >&m.E H.M a l.F y@m@m@r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( v$o%0$,&u#5$_+*+*+*+*+B#.#U@T@:@'&)&!&*+*+*+*+~&T#T#e%{&j+]&Y$^&8+/&(&>%_&h v ( { * { v *.q c >+.+7 O T+y@m@m@z@[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { :&<&[&&@W%}&T#&%|&C#*+*+*+*+*+*+*+*+*+_+1&2&e%d$3&4&}&T%5&L+6&G$z#2%( L.v L.* % % C N  .| ^.a v.a p z@8$8$y@c V                           ",
+"                                k L F r I $.- = _ a R } E = n n 7&-&#@~%7+8&9&K+0&a&b&E+c&E+}%4&[@b%-+d&Z+R+j+4@H+g+[&B+e&f&g&9+h.{ ( { % * * ]  +q | =.a e 0 j E#m@m@m@H i.                            ",
+"                                $.Y q G A@l.V C V [ u } q $@h&S ( i&j&k&8+[&l&+@U%'$-@d$x%6+Z+T%`%4@T%W%g+m&G#6$L+#%F%n&,%2.% 2., , Y., / ].6 P.T+R.[ y#e l.Y s m@m@m@t {.{                             ",
+"                                  3.| s M@I k.0 0.!.| $@q !.Y R.,+].( n m$v#o&]@`+:+p&+&8&,&q&h$M#<$r&s&N%.&t&2+u&v& @h.( * { L.L.{ L.v n w | | d $@Q $.O c s m@m@m@F 7 S                               ",
+"                                    Q L@q#M@F } |.T+c M@d /.[ b } $@6 ].( $ w&m%1$x&:&y&z&A&B&C%E%C&D&E&F&7${$ @G&L.v L.* ( % v { L.n 8 j c k c K l ^.~.t z@y@y@y@^%3.S                                 ",
+"                                      Q  .F z@` L@A@r y@3.w w%w%>+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { L.v h v L.v { n ^ #.w%u.T+} X ^.X |.~.H H&m#m@m@y@A@a ^                                   ",
+"                                        3.| ` y@G F q#y@S x w 8 G./.N l.R T+h&,+'.< 6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` y@m@m#m@y@L@7 ^                                     ",
+"                                            u H&z@z@m@s 3.< #.#.; - ; #..+w+>+P.|.Y  +N #.= ^ n v v ( * v { L.h.h C < '.$@| X M Q G.#.[ R.M T+E#z@m@8$m@m@z@ .{.                                        ",
+"                                              b F m#8$t R.^@^.v.= $ n 8 _ _ V {.>+B.R | | $@T+L F M@H&H&M@M@M@M@s F R.~.[ Q /.< _ i._ a s  .r q#y@y@m@m@r ~..+                                          ",
+"                                                a A@m@s E#Z x@k.e {.$._ ^ n = {.=.1.[ j.x@} u |.b ~.L@q t.k |.[ [ ^.P a $..+_ : 3.o O l.I$q#y@m@m@m@y@F 0 _                                             ",
+"                                                  3.| A@s E#A@Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.J#7 J#V : @.@.v..+9 7 a t.T+T+G m@8$m@y@y@M@I 3.;                                               ",
+"                                                      0 | ` M@M@` F $@| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).^@ .A@s y@m@m@m@m@r p e #.                                                  ",
+"                                                          H.p z@y@q#z@M@A@p L@A@F H q t.b t.^@J } O 0 l.O e @.3.l.} u | T+Z F z@m#m#m@m@m@z@t H./.                                                      ",
+"                                                              H.R.` y@y@q#q#q#y@z@H&H&r F F | T+A@t A@q $@| | T+L A@F M@z@m@m#y@m@I$m@y@$@^.$.                                                          ",
+"                                                                $.H.t.A@M@y@m@m#8$y@y@y@y@z@M@z@y@m#y@z@r z@z@y@y@m#m@m@m@y@m#m#z@F x@e $.;                                                             ",
+"                                                                      a O } t H&m@8$m@m@y@y@m#m#m@m@m@y@m#m@m@m#m#y@I$m#y@r F x@H.a V                                                                   ",
+"                                                                            3.H.H.I q G M@z@y@m@m@m@m@m@y@m@y@z@s F p x@[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.bmp
new file mode 100644 (file)
index 0000000..860d13e
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_IRMQuantification.xpm
new file mode 100644 (file)
index 0000000..0fd8ebd
--- /dev/null
@@ -0,0 +1,820 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_IRMQuantification_xpm[] = {
+"100 100 717 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #787AD5",
+"Y.    c #726FC3",
+"Z.    c #686AA3",
+"`.    c #CACDF7",
+" +    c #444682",
+".+    c #4A5092",
+"++    c #888ECF",
+"@+    c #CFD2FC",
+"#+    c #504E4C",
+"$+    c #99938A",
+"%+    c #C4BBAF",
+"&+    c #D7CCBE",
+"*+    c #FF0000",
+"=+    c #D4CABC",
+"-+    c #CBC2B5",
+";+    c #999289",
+">+    c #404479",
+",+    c #474688",
+"'+    c #9793D7",
+")+    c #CCCFFA",
+"!+    c #D3D2F7",
+"~+    c #D8D7FC",
+"{+    c #DAD9FE",
+"]+    c #6F6B66",
+"^+    c #AFA79C",
+"/+    c #CCC2B6",
+"(+    c #D9CFC0",
+"_+    c #D3C9BB",
+":+    c #AAA298",
+"<+    c #7A7570",
+"[+    c #9095D6",
+"}+    c #6B0000",
+"|+    c #6B0100",
+"1+    c #DBDFFC",
+"2+    c #908A82",
+"3+    c #AFA79D",
+"4+    c #E66158",
+"5+    c #E4D9CB",
+"6+    c #D1C7BA",
+"7+    c #B3ABA0",
+"8+    c #9D968D",
+"9+    c #373736",
+"0+    c #8C8ED6",
+"a+    c #E1E1F9",
+"b+    c #605D59",
+"c+    c #A19A91",
+"d+    c #CAC0B3",
+"e+    c #F66F65",
+"f+    c #DED3C4",
+"g+    c #B9B1A5",
+"h+    c #E4E3FB",
+"i+    c #938D85",
+"j+    c #C3BAAE",
+"k+    c #F26C62",
+"l+    c #DCD1C3",
+"m+    c #D1C7B9",
+"n+    c #BFB7AA",
+"o+    c #2B2D4A",
+"p+    c #EBE7F9",
+"q+    c #716D68",
+"r+    c #B3ABA1",
+"s+    c #EB665D",
+"t+    c #E1D6C7",
+"u+    c #D6CBBE",
+"v+    c #C0B7AB",
+"w+    c #484878",
+"x+    c #423F76",
+"y+    c #6B0200",
+"z+    c #E5E4FC",
+"A+    c #E8EDFD",
+"B+    c #99928A",
+"C+    c #D34F48",
+"D+    c #E3D8C9",
+"E+    c #DAD0C1",
+"F+    c #C3BAAD",
+"G+    c #918B82",
+"H+    c #BEB6AA",
+"I+    c #FA7369",
+"J+    c #DBD1C2",
+"K+    c #C8BEB1",
+"L+    c #A29B91",
+"M+    c #5C5955",
+"N+    c #000000",
+"O+    c #89847C",
+"P+    c #F06A61",
+"Q+    c #DCD2C3",
+"R+    c #C6BDB0",
+"S+    c #A49C93",
+"T+    c #252547",
+"U+    c #545284",
+"V+    c #8685D3",
+"W+    c #78736D",
+"X+    c #B9B1A6",
+"Y+    c #E0D5C7",
+"Z+    c #C7BEB1",
+"`+    c #A19A90",
+" @    c #5E5B57",
+".@    c #9B99EA",
+"+@    c #6F6C66",
+"@@    c #B7AEA3",
+"#@    c #E56058",
+"$@    c #A39C92",
+"%@    c #282340",
+"&@    c #5E403A",
+"*@    c #B2AA9F",
+"=@    c #E76159",
+"-@    c #DACFC2",
+";@    c #C9C0B3",
+">@    c #A09A90",
+",@    c #6B0300",
+"'@    c #6B0400",
+")@    c #6C4D46",
+"!@    c #9E7C71",
+"~@    c #EA655C",
+"{@    c #D7CDBF",
+"]@    c #CBC1B4",
+"^@    c #9F988F",
+"/@    c #353457",
+"(@    c #7777C4",
+"_@    c #785951",
+":@    c #A27F74",
+"<@    c #EF6960",
+"[@    c #DAD0C2",
+"}@    c #C5BCB0",
+"|@    c #9C968D",
+"1@    c #5E5D9C",
+"2@    c #7D5D55",
+"3@    c #A58277",
+"4@    c #F36D64",
+"5@    c #C1B9AC",
+"6@    c #5A5FA2",
+"7@    c #6F73BF",
+"8@    c #432622",
+"9@    c #84635B",
+"0@    c #A9877A",
+"a@    c #F87167",
+"b@    c #C6A293",
+"c@    c #C9BFB2",
+"d@    c #A29C92",
+"e@    c #6B0600",
+"f@    c #6B0900",
+"g@    c #6B0800",
+"h@    c #664740",
+"i@    c #947268",
+"j@    c #B49084",
+"k@    c #F77066",
+"l@    c #C49F91",
+"m@    c #B08C80",
+"n@    c #08050A",
+"o@    c #6B0A00",
+"p@    c #6B0500",
+"q@    c #6B1000",
+"r@    c #6B0B00",
+"s@    c #795951",
+"t@    c #A58276",
+"u@    c #F26C63",
+"v@    c #C9A495",
+"w@    c #BD998C",
+"x@    c #AB887C",
+"y@    c #2A2E55",
+"z@    c #0A0B14",
+"A@    c #080D1A",
+"B@    c #1D1B32",
+"C@    c #6B0C00",
+"D@    c #6B0E00",
+"E@    c #6B1900",
+"F@    c #6B2900",
+"G@    c #6B2C00",
+"H@    c #63493E",
+"I@    c #937367",
+"J@    c #AE8A7E",
+"K@    c #B99588",
+"L@    c #A17F73",
+"M@    c #21233F",
+"N@    c #111122",
+"O@    c #6B0700",
+"P@    c #6B2D00",
+"Q@    c #6B5C00",
+"R@    c #4A4629",
+"S@    c #89815E",
+"T@    c #A29474",
+"U@    c #F16B62",
+"V@    c #F36D63",
+"W@    c #C29E8F",
+"X@    c #563833",
+"Y@    c #6B2A00",
+"Z@    c #6B6700",
+"`@    c #72783C",
+" #    c #7E8A4D",
+".#    c #95995A",
+"+#    c #F46E64",
+"@#    c #C29D8F",
+"##    c #85645C",
+"$#    c #422522",
+"%#    c #6F73CC",
+"&#    c #6B6500",
+"*#    c #7C884A",
+"=#    c #6C9556",
+"-#    c #F16B61",
+";#    c #CAB696",
+">#    c #BC9B8A",
+",#    c #9E7B70",
+"'#    c #6B3200",
+")#    c #928F51",
+"!#    c #E9645B",
+"~#    c #F26D63",
+"{#    c #8FA667",
+"]#    c #ABA565",
+"^#    c #AD977D",
+"/#    c #8A6A60",
+"(#    c #5E3F3A",
+"_#    c #6B4400",
+":#    c #A2A061",
+"<#    c #78A566",
+"[#    c #7AA667",
+"}#    c #859759",
+"|#    c #A09872",
+"1#    c #77614F",
+"2#    c #6B4900",
+"3#    c #A8A565",
+"4#    c #87A465",
+"5#    c #769B5D",
+"6#    c #6D894C",
+"7#    c #727438",
+"8#    c #554B32",
+"9#    c #6B1200",
+"0#    c #6B4700",
+"a#    c #9E985A",
+"b#    c #828C4F",
+"c#    c #6E7C40",
+"d#    c #575C23",
+"e#    c #6B6600",
+"f#    c #6B3000",
+"g#    c #6B5400",
+"h#    c #6B6000",
+"i#    c #6B5D00",
+"j#    c #6B4300",
+"k#    c #6B1E00",
+"l#    c #6B1100",
+"m#    c #0B070D",
+"n#    c #625F5A",
+"o#    c #8B857D",
+"p#    c #363961",
+"q#    c #110D1B",
+"r#    c #494845",
+"s#    c #847F78",
+"t#    c #A49D93",
+"u#    c #C1B8AC",
+"v#    c #858078",
+"w#    c #A49D94",
+"x#    c #F56E64",
+"y#    c #484986",
+"z#    c #7A766F",
+"A#    c #E8625A",
+"B#    c #F56F65",
+"C#    c #D9CEC0",
+"D#    c #E0D6C7",
+"E#    c #16152B",
+"F#    c #6C6863",
+"G#    c #B6AEA3",
+"H#    c #EF6A60",
+"I#    c #DDD3C4",
+"J#    c #535491",
+"K#    c #7275CE",
+"L#    c #514F4D",
+"M#    c #B0A89D",
+"N#    c #E35E56",
+"O#    c #CCC3B5",
+"P#    c #BAB2A7",
+"Q#    c #7C7771",
+"R#    c #DD5951",
+"S#    c #DAD1C2",
+"T#    c #CEC5B7",
+"U#    c #C5BCAF",
+"V#    c #807B75",
+"W#    c #979188",
+"X#    c #BCB4A8",
+"Y#    c #E56057",
+"Z#    c #D8CEBF",
+"`#    c #D6CCBE",
+" $    c #CFC5B7",
+".$    c #8C867F",
+"+$    c #403F3E",
+"@$    c #7F7A74",
+"#$    c #A9A198",
+"$$    c #D7CDBE",
+"%$    c #D2C9BB",
+"&$    c #CDC4B7",
+"*$    c #B7AFA4",
+"=$    c #989289",
+"-$    c #5C5A56",
+";$    c #484645",
+">$    c #D5CBBD",
+",$    c #D2C8BA",
+"'$    c #C4BBAE",
+")$    c #B8AFA4",
+"!$    c #A09990",
+"~$    c #79756F",
+"{$    c #6E6A65",
+"]$    c #D3CABB",
+"^$    c #D5CABD",
+"/$    c #BDB4A9",
+"($    c #A8A198",
+"_$    c #88827B",
+":$    c #434140",
+"<$    c #AAA398",
+"[$    c #C6BCAF",
+"}$    c #DED4C5",
+"|$    c #D6CBBD",
+"1$    c #75716B",
+"2$    c #C8BFB1",
+"3$    c #D9CFC1",
+"4$    c #DACFC0",
+"5$    c #CAC1B4",
+"6$    c #A8A197",
+"7$    c #79746E",
+"8$    c #050208",
+"9$    c #817C75",
+"0$    c #B1A99E",
+"a$    c #C9BFB3",
+"b$    c #F36E64",
+"c$    c #E0D6C6",
+"d$    c #CDC3B6",
+"e$    c #A7A096",
+"f$    c #7D7972",
+"g$    c #847F77",
+"h$    c #ACA59A",
+"i$    c #F97368",
+"j$    c #DFD4C5",
+"k$    c #ABA399",
+"l$    c #363535",
+"m$    c #4F4D4A",
+"n$    c #313260",
+"o$    c #868179",
+"p$    c #A8A196",
+"q$    c #F67066",
+"r$    c #D8CDBF",
+"s$    c #23211F",
+"t$    c #5B5955",
+"u$    c #65615D",
+"v$    c #77736D",
+"w$    c #7C7871",
+"x$    c #A59E94",
+"y$    c #C6BDB1",
+"z$    c #D5CBBE",
+"A$    c #DFD5C6",
+"B$    c #E6DBCC",
+"C$    c #807B74",
+"D$    c #5B5854",
+"E$    c #7D7872",
+"F$    c #87817A",
+"G$    c #8A847D",
+"H$    c #15121F",
+"I$    c #09060C",
+"J$    c #63605B",
+"K$    c #9B958C",
+"L$    c #DED2C4",
+"M$    c #F77167",
+"N$    c #BDB5A9",
+"O$    c #969087",
+"P$    c #65625D",
+"Q$    c #4E4C4A",
+"R$    c #7E7973",
+"S$    c #8F8982",
+"T$    c #9F988E",
+"U$    c #42413F",
+"V$    c #8D8880",
+"W$    c #E2D7C8",
+"X$    c #C8BFB2",
+"Y$    c #B4ACA0",
+"Z$    c #8E8880",
+"`$    c #67635E",
+" %    c #4E4C49",
+".%    c #7B7770",
+"+%    c #8C877F",
+"@%    c #9B948C",
+"#%    c #9A938A",
+"$%    c #958F86",
+"%%    c #D34F47",
+"&%    c #D1C8BA",
+"*%    c #DCD2C4",
+"=%    c #D4CABD",
+"-%    c #B0A79D",
+";%    c #8D877F",
+">%    c #6B6762",
+",%    c #686560",
+"'%    c #857F78",
+")%    c #969088",
+"!%    c #A39B91",
+"~%    c #ADA59A",
+"{%    c #CB4741",
+"]%    c #D04C45",
+"^%    c #1D203B",
+"/%    c #514F4C",
+"(%    c #8F8A82",
+"_%    c #C4BCAF",
+":%    c #D6CDBE",
+"<%    c #DFD4C6",
+"[%    c #DBD0C2",
+"}%    c #D0C7B9",
+"|%    c #B5ADA2",
+"1%    c #7C7872",
+"2%    c #504E4B",
+"3%    c #595753",
+"4%    c #817D75",
+"5%    c #9E978E",
+"6%    c #AEA69B",
+"7%    c #BAB2A6",
+"8%    c #D14D46",
+"9%    c #CD4942",
+"0%    c #ACA49A",
+"a%    c #B8B0A4",
+"b%    c #CCC3B6",
+"c%    c #D7CEBF",
+"d%    c #E0D5C6",
+"e%    c #CEC4B7",
+"f%    c #BEB5A9",
+"g%    c #999389",
+"h%    c #726E69",
+"i%    c #595653",
+"j%    c #4F4D4B",
+"k%    c #54514E",
+"l%    c #5C5956",
+"m%    c #716D67",
+"n%    c #908B83",
+"o%    c #9B948B",
+"p%    c #AEA69C",
+"q%    c #D24E47",
+"r%    c #D45049",
+"s%    c #CE4A44",
+"t%    c #B0A99D",
+"u%    c #9D978D",
+"v%    c #A79F96",
+"w%    c #474B93",
+"x%    c #D0C6B9",
+"y%    c #DDD2C4",
+"z%    c #CFC5B8",
+"A%    c #BCB3A8",
+"B%    c #A79F95",
+"C%    c #928D84",
+"D%    c #938E85",
+"E%    c #8F8981",
+"F%    c #908B82",
+"G%    c #948E85",
+"H%    c #A29B92",
+"I%    c #B0A99E",
+"J%    c #BBB3A8",
+"K%    c #DA554E",
+"L%    c #D9554E",
+"M%    c #BDB4A8",
+"N%    c #9C958C",
+"O%    c #53514E",
+"P%    c #CDC4B6",
+"Q%    c #D2C8BB",
+"R%    c #D4CBBC",
+"S%    c #C6BCB0",
+"T%    c #BFB6AA",
+"U%    c #BAB1A6",
+"V%    c #B6AEA2",
+"W%    c #BCB3A7",
+"X%    c #CF4C45",
+"Y%    c #D7534B",
+"Z%    c #DB574F",
+"`%    c #C2B9AD",
+" &    c #B5AEA2",
+".&    c #9A938B",
+"+&    c #B7AFA3",
+"@&    c #F36C63",
+"#&    c #F46D64",
+"$&    c #DED3C5",
+"%&    c #C7BFB2",
+"&&    c #E35F56",
+"*&    c #E45F56",
+"=&    c #E05C53",
+"-&    c #938C84",
+";&    c #837E76",
+">&    c #6368AC",
+",&    c #BBB2A6",
+"'&    c #EA645B",
+")&    c #E25D54",
+"!&    c #E35E55",
+"~&    c #E05B53",
+"{&    c #CAC1B3",
+"]&    c #BBB3A6",
+"^&    c #ACA499",
+"/&    c #928B83",
+"(&    c #7E7972",
+"_&    c #555350",
+":&    c #78746E",
+"<&    c #979088",
+"[&    c #A9A298",
+"}&    c #C7BDB0",
+"|&    c #D2C9BA",
+"1&    c #D1C8B9",
+"2&    c #CFC6B8",
+"3&    c #CCC2B5",
+"4&    c #CBC2B4",
+"5&    c #ADA59B",
+"6&    c #989189",
+"7&    c #67645F",
+"8&    c #B9B0A5",
+"9&    c #C2B8AC",
+"0&    c #CDC3B5",
+"a&    c #D2C7BA",
+"b&    c #D5CCBD",
+"c&    c #DDD2C3",
+"d&    c #C8BEB2",
+"e&    c #8A857D",
+"f&    c #827E77",
+"g&    c #6A6661",
+"h&    c #32386C",
+"i&    c #3B3A39",
+"j&    c #6C6963",
+"k&    c #918C83",
+"l&    c #B4ACA1",
+"m&    c #B8AFA3",
+"n&    c #827D76",
+"o&    c #9E978D",
+"p&    c #AEA79B",
+"q&    c #B2AB9F",
+"r&    c #AAA297",
+"s&    c #A9A196",
+"t&    c #948E86",
+"u&    c #8F8A81",
+"v&    c #75706B",
+"w&    c #5D5A57",
+"x&    c #736F69",
+"y&    c #87827A",
+"z&    c #928C84",
+"A&    c #968F87",
+"B&    c #958E86",
+"C&    c #8C877E",
+"D&    c #87827B",
+"E&    c #7F7A73",
+"F&    c #7E7A73",
+"G&    c #454342",
+"H&    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.O.O.I.I.I.I.I.J.I.J.F.D.z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.A.F.J.I.I.O.T.U.V.V.U.W.T.T.T.I.K.I.K.F.D.x.p.o.d.. 6.i + <.g.z 4 5 X.Y.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y Z.5.f.p.y.D.E.I.K.V.T.T.T.`.`.`.`.U.W.W.U.T.T.T.K.J.E.D.z.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ). +.+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u Z.++f.o.x.D.F.J.K.T.V.`.U.@+@+#+$+%+&+*+*+=+-+;+T.V.I.I.D.y.z.p.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.>+,+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w  +O S.'+5.p.y.x.E.K.I.T.`.U.@+)+!+~+{+]+^+/+*+*+(+_+:+<+U.O.K.K.F.A.z.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $. +#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.S.[+e.p.x.z.D.J.I.}+|+|+)+!+!+!+1+1+1+2+3+4+*+5+6+7+8+9+W.I.I.I.E.A.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 0+5.b.p.y.D.J.I.}+}+}+}+}+~+~+1+~+1+a+b+c+d+*+e+f+_+g+b+`.W.O.I.E.D.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.x.p.z.D.I.}+}+}+}+}+}+}+1+1+h+a+a+1+i+j+*+k+l+m+n+b+U.`.V.I.E.D.y.p.f.d.i + r.@ ' z 4 4 # &., 2.% 2.% L.L.{ n $ n v $ L o+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u Z.5.. d.x.x.y.}+}+}+}+}+}+}+}+}+}+|+a+p+p+h+q+r+s+*+t+u+v+b+U.`.W.T.J.D.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f * { L.( v ( ( { n - K 0 9 a w+P a                     ",
+"                      # ' * (.P x+u ~.4.i 5.f.o.q.}+}+}+}+}+}+}+}+}+}+}+}+y+z+a+A+z+B+C+*+D+E+F+b+@+U.`.I.I.E.D.z.p.f.d.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+p+A+A+G+H+*+I+J+K+L+M+U.`.N+N+N+N+N+N+N+N+! i @ N+N+N+N+N+N+, % 2.f N+N+N+L.M.M.].N+N+N+V t.[ .+{.a 0 O %                 ",
+"                    % , ( @.R c H.e 0+! ! 5.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+p+p+O+v+P+*+Q+R+S+b+@+U.U.N+N+N+N+N+N+5.i ) r.N+N+N+N+N+N+N+, 2.2.N+N+N+{ v n ( N+N+N+^ t.O $.{.{.a } {.                ",
+"                  - n h.= H.T+| U+V+A i c.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+p+W+X+4+*+Y+Z+`+ @@+`.T.O.I.N+N+p.f..@! i N.N+N+}.5 # N+N+2./ f N+N+N+N+v v N+N+N+N+]./.O a /..+a !.O %               ",
+"                  ( : S ; k.T+H.U+4.i 6.}+}+}+}+}+}+}+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}++@@@#@*+Q+Z+$@b+!+W.V.O.J.N+N+p.o.! i ) <.N+N+7.4 # N+N+% / f N+N+N+N+N+N+N+N+N+N+( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.%@[ -.y }+}+}+}+}+}+}+}+}+}+|+|+|+}+}+|+y+}+}+}+}+}+}+}+&@*@=@*+-@;@>@b+!+`.T.O.K.N+N+p.o.b.6.) <.N+N+4 4 # N+N+2.2.2.N+N+{ N+N+N+N+].N+N+n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+,@'@|+}+}+|+}+}+)@!@~@*+{@]@^@b+@+U.V.O.I.N+N+q.o.! ! ! r.N+N+N+N+N+N+N+, ( f N+N+% ( N+N+M.( N+N+( ].#./@g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.(@}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+|+}+}+}+}+}+_@:@<@*+[@}@|@b+)+`.T.J.K.N+N+p.o.. i A r.N+N+N+N+N+N+# , , 2.N+N+* % v { n n N+N+( $ ].P.!.k.w+0 |.| V             ",
+"                {.3.{.$.O d Y 1@-.@ }+}+}+}+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+2@3@4@*+Q+5@>@b+)+U.T.I.E.N+N+p.f.. + ) <.N+N+B N+N+# % , ( / N+N+h { n ( ( ( N+N+].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| 6@7@g.@ }+}+}+}+|+'@,@}+}+}+}+}+}+}+}+|+,@,@|+|+}+}+8@9@0@*+a@b@c@d@b+`.V.T.I.F.N+N+o.5.5.! A @ N+N+8.N+N+N+& , , / N+N+L.L.n v n n N+N+( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ G.O ~._.V+@ N.) }+}+}+}+'@e@,@}+}+}+}+}+}+}+|+'@f@g@'@}+}+h@i@j@*+k@l@m@b+)+W.T.O.I.E.N+N+o..@! ) ) @ N+N+7.%.N+N+N+2.% / N+N+{ v M.$ M.( N+N+].( { $ j.u !.k F n@n@(           ",
+"              = ; {.( S 3.X 6@7@:.~ @ ) + }+}+}+|+o@o@p@|+}+}+}+}+}+}+y+f@q@r@,@}+s@t@u@*+v@w@x@b+`.T.I.I.N+N+N+N+N+N+6.y A ~ N+N+4 # # N+N+, f ( N+N+( h.n { n n N+N+n ( n M.^ X y@t z@A@B@C.          ",
+"            a H | ~.$.8 .+|._.T 3 g.[.<.i ! }+}+|+'@C@D@g@y+}+}+}+}+}+}+e@E@F@G@H@I@J@u@*+v@K@L@b+}+}+I.N+N+N+N+N+N+N+N++ @ g.N+N+%.# # N+N+/ 2./ N+N+h.( ( ( h ( N+N+( ].( { S u B.>+e k.| a %         ",
+"            h v e M@z@N@H } U B z 2 @ r.A . . }+y+y+p@g@f@p@|+}+}+}+}+}+O@P@Q@R@S@T@U@V@*+W@j@i@X@}+}+}+J.y.y.p.d.! 6.i ) @ 2 z z 4 # , , 2.( , % % L.h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.%@r q (@8.}.g.~ [.) y ! 5.}+|+|+y+y+|+}+}+}+}+}+}+|+Y@Z@`@ #.#k++#*+@#J@##$#|+}+}+}+x.o.f.b.. y ) @ 2 3 4 4 5 # # &., 2.* f { { h v M.( ( n n ( { ( ].( M.P /.*.w+c H I (         ",
+"            , 3 ~ @ %#; O ).B 7.' ' 3 ~ ) i + ! d.}+}+|+|+|+|+}+}+}+}+}+|+q@&#*#=#-#+#*+;#>#,#s@}+}+|+}+}+}+p.e.c.. + A <.' }.4 4 # # , , 2.2.( % % { h n n n ( ( ].( n ( n n { >+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.(@8.%.8.' ~ 2 @ ! . 5.f.}+}+|+|+,@y+}+}+|+|+}+'@'#)#!#~#*+{#]#^#/#(#}+}+|+|+|+}+|+c.! + i g.~ 3 ' 4 # # , # ( 2.2.f { * ( v ( h M.n n ( ].( { ( ( ( O ,+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.}+}+}+|+,@|+}+}+}+}+}+O@_#:#*+<#[#}#|#1#|+}+}+}+|+|+}+}+|+! ) <.g.' z 8.4 # # , , , 2.f % % h.v v n n ( ( n ( ].( n n n { =. +N H.~.%@B@;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. d.}+}+}+}+|+}+}+}+}+}+}+p@2#3#4#5#6#7#8#9#}+}+}+|+|+}+}+}+|+y @ ~ 3 4 4 9.# , , 2.% f % * { ( h $ ( ( n n ( n ( ].( ( M.( Q.P  +P X q F ;         ",
+"            ' , n n S O | X # # %#5 B 7.}.3 @ N.+ + 5..@e.}+}+|+|+|+}+}+|+|+}+}+,@0#a#b#c#d#e#F@p@}+}+}+|+|+}+}+|+|+' 2 ' 4 4 # # , % , ( , % ( * { v v v M.( n ( n ( n n { n $ n...N w+k t N@;         ",
+"            # ( v % _ b  .|.9.%## 9.# 4 7.' @ 2 A i + . . d.5.|+y+,@|+}+y+'@,@}+}+p@f#g#h#i#j#k#'@}+}+}+}+}+}+}+}+y+'@z B %.# # # , , , 2.* * { % ( $ $ $ { n ( n ( n ( ( ( h n >+).>+g | s z@;         ",
+"            v ( 2.* {./@| u T # , # # 5 4 7.3 g.~ A y i . c.c.d.y+y+|+|+y+'@p@,@}+}+y+C@l#q@o@|+}+}+}+}+}+}+}+}+}+}+}+|+4 4 # , , 2.% 2.f % % { h.v n n ( ( n ( n ( n n ].n h $ Q.O O u B@A@m#*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ N.) y y ! n#o#y+|+}+y+p@p@,@|+}+}+y+,@'@,@|+}+}+}+|+}+}+}+}+}+}+}+}+}+# # , # ( 2.f % { { ( h { ( ( ].n ( n ( n ( ( ( ( { n W 1.p#p N@q#z@;         ",
+"            , 5 # , _ g Y c 5 , , , &.Y.# %.X.B z 2 ~ 2 + ) r#s#t#u#y+|+|+'@,@|+}+}+}+,@,@|+}+}+}+}+|+|+|+}+}+}+}+}+}+}+}+|+, % & , 2.* ( % * v M.v v ( ( n ( n ( n n n n ( ( L. +b u L N@z@z@;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A N.v#w#-#x#*+|+}+|+,@|+}+}+}+|+'@,@}+}+}+|+,@'@y+}+}+}+}+}+}+}+|+|+|+X.# # &.# , 2.L.( { $ $ n n ( n ( n ( ( ( M.n v { y#P.} d ` q#N@;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 z#>@A#B#*+C#D#}+}+}+}+}+}+}+}+|+'@y+}+}+}+y+,@y+|+}+}+}+}+}+}+|+,@|+|+|+f L.( * * , * v n ( ( n ( n ( n n n n M.M.( ( .+!.u t s q#E#;         ",
+"            ( B 5 # S l.y@Y 6@, , % 2.% , & # # 5 %.4 8.F#$+G#H#*+J+D#I#_+}+}+}+}+}+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+}+|+}+}+y+,@|+}+|+% * ( { $ L.% L.n n ( n ( n ( ( ( ( n v h.v j./@T+F G A@G x         ",
+"            ; 5 4 / /.o X t.J#, 2.2., 2.% , # & # # K#L#O+M#N#*+J+Y+t+{@O#P#}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+y+|+}+|+|+2.( * h.% { { { { f % n ( n ( n n n v ( ].L.h M.P.k. .q E#z@q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # Q#$@R#*+(+(+S#{@T#U#:+V#}+}+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+|+}+% , 2.% h { { ( ( ( ( { % n ( n ( ( ( $ v h v n  +g X  .%@s z@I M.        ",
+"            i., h {.e a #.Q.a , * * * / 2./ 2.2., &.n#W#X#Y#*+C#Z#`# $U#*@.$+$' }+}+|+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+, f 2.* { % ( n n n n ( { % v ( n n n n $ n ( % ( n.O Y c B@z@n@l.*         ",
+"            6 = .+g O _ 8 D l 2.* % % { / 2.% % 2., @$#$K+s+*+$$%$&$U#*$=$-$4 4 4 }+|+y+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+, % * % { % % * v M.h ( ( { ( { f n ( ( ( ( n v h.{ ,.g J  .Z q#n@z@V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ ;$i+P#T#H#*+>$,$'$)$!$~$8.9.%.%.# |+e@'@|+}+}+}+}+}+}+}+}+}+}+}+}+}+2.2.( * % ( / % L.{ { n ].( ].( ( L.* n n v ( M.h ( ( x+g k.R.s z@n@F =           ",
+"              M 7 {.0 a a =.O 6@* ( { { { % * / / {$^@'$]$+#*+Z#^$/$($_$:$# # # Y.# # |+y+|+}+}+}+}+y+}+}+}+|+}+}+}+2./ f * % { * ( { { L.( ( ( ].( ].].{ % v h $ v { v h.: /@l X M@E#z@n@M@S           ",
+"              v.{.v.H.P H.w+ +6@v % L.L.{ ( % % * ~$<$[${@+#*+}$|$v+#$1$, # & # &., & &., }+}+}+}+}+y+y+}+}+|+|+, 2.f ( % { L.{ { % % { v n n ( { ( ( ( { ( { n $ v ( L.( V R J Y M@E#z@n@g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % Q#M#2$3$V@*+4$&+5$6$7$2., , , , , , , # % }+}+}+}+}+'@|+}+|+* / / % * { L.{ ( { { { % ( ( ( ].( { n ].( v / ( v ( h.{ 8 y@Y u I T+A@8$A@V             ",
+"                0 !.J ).^ C G./..+w ( { ( % L.{ { 9$0$a$$$b$*+c$E+d$e$f$f 2.f % % , / % 2.% , |+|+|+}+|+'@}+% ( % 2.% ( * { * ( % L.{ h.v n ( ].( ( ( ].$ ( , M.h.L.{ +.^ y@p  .o+B@n@n@Z ;             ",
+"                a g H.a l M@M@I R P.+.( v { { L.L.g$h$d+m+E+*+i$j$_+k$s#/ % 2., , % f 2.2./ / 2.,@y+|+}+, L.{ * ( * * f ( L.v h.{ l$m$L.n ( n ( ].].{ ( n n / v h h.% M.c p | p F q#n@z@[ %             ",
+"                  ~.s z@q#| Q M P.n$,.^ ( ( { { L.o$p$n+`#C#q$*+D+r$g+8+s$2.L.L.2.% * * { * % % * p@p@% , L.L.{ L.% ( / { L.L.t$u$v$g$% n ( { ( ( ( n ( h M.f v ( h.n V ` t Y T+E#z@n@s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { w$x$y$z$A$b$*+B$E+;@7+C$% * * * { % % % L.{ { ( * L.{ , { { { { { { ( % D$]+E$F$G$i+{ ( n ( ].n ].( v n v 2.L.* v w t F H$n@n@I$n@n@| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { J$K$j+%$I#L$M$*+A$m+N$O$P$% ( % { { * ( * L.{ L.{ ( { , ( ( ( ( ( v Q$7$1$R$9$S$|@T$n ( ].( ( ( n $ ( n ( 2.L.h.].W F g Q R.z@8$n@z@$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( U$V$*$-+3$W$b$*+D+`#X$Y$Z$`${ * ( % L.{ L.{ % { { { ( / { v v v  %`$.%+%@%#%2+$%%%*+( n ( n n n h n v L.* * * v < F H k.0 Y r n@n@M@;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n Q#>@/$&%}$*%P+*+I#=%5@-%;%>%{ { { { { ( { ( ( ( v ( % h $ $ ,%'%)%!%~%M#6${%*+*+]%( n ( ( M.n ( v { h * f h.w t ^%E !. .s z@n@q#.+%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( /%(%0$_%:%<%H#*+[%>$}%5@|%@%1%2%( ( ( v ( { v v ( n { { 3%4%5%6$6%Y$7%8%*+*+9%p$0%n ( n n { ( v M.L.{ * f ,.R.L p Y p A@n@8$n@T+;                   ",
+"                        | M@q R.k H.[ | L c < ,.{ n ].1$^@a%b%c%d%V@*+J+>$e%X$f%k$g%v#.%h%J$i%j%k%l%,%m%1$n%o%t#p%)$H+q%r%*+s%t%S+u%v%n ( h ( v v v { L.% * C w% .k } L N@z@n@n@N@{.                    ",
+"                        l B@B@| 3.#.O R. .E | w%( ( ( n 2+e$u#x%l+y%*+M$l+{@_+z%]@A%M#B%^@K$C%D%E%F%G%K$H%p$I%J%A%K%L%*+*+M%X+^+S+$%N%( v n v v h ( % { f U N p l.w+u N@z@n@n@z@X ^                     ",
+"                          /@ .~.@.8 g d O k.X |.G.].M.( O%W#^+y$P%Q%`#*+B#t+*%{@R%>$,$S%T%7%U%)$@@V%V%a%W%X#X%Y%Z%Z%*+`%W%P# &6%.&2+2+$ ( n M.v h.{ * * m ,+%@b 3.7 p z@z@n@z@p _                       ",
+"                          7 b /@^.$.l } a 1 ..j.=.V ^ n ( +@8++&5@Z+e%*+*+@&#&u@k+$&$&[@>$Q% $'$%&c@&&*&=&*+*+*+*+*+R+T%a%V%7+6%-&;&W+v v L.v L.( % { >&m.E H.M a l.F z@n@n@r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( v$o%0$,&u#5$_+*+*+*+*+B#+#V@U@<@'&)&!&*+*+*+*+~&T#T#e%{&j+]&Y$^&8+/&(&>%_&h v ( { * { v *.q c >+.+7 O T+z@n@n@A@[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { :&<&[&*@W%}&T#&%|&C#*+*+*+*+*+*+*+*+*+_+1&2&e%d$3&4&}&T%5&L+6&G$z#2%( L.v L.* % % C N  .| ^.a v.a p A@8$8$z@c V                           ",
+"                                k L F r I $.- = _ a R } E = n n 7&-&$@~%7+8&9&K+0&a&b&E+c&E+}%4&}@b%-+d&Z+R+j+5@H+g+[&B+e&f&g&9+h.{ ( { % * * ]  +q | =.a e 0 j E#n@n@n@H i.                            ",
+"                                $.Y q G B@l.V C V [ u } q %@h&S ( i&j&k&8+[&l&@@U%'$;@d$x%6+Z+T%`%5@T%W%g+m&G#6$L+#%F%n&,%2.% 2., , Y., / ].6 P.T+R.[ y#e l.Y s n@n@n@t {.{                             ",
+"                                  3.| s N@I k.0 0.!.| %@q !.Y R.,+].( n m$v#o&^@`+:+p&+&8&,&q&h$M#<$r&s&N%.&t&2+u&v& @h.( * { L.L.{ L.v n w | | d %@Q $.O c s n@n@n@F 7 S                               ",
+"                                    Q M@q#N@F } |.T+c N@d /.[ b } %@6 ].( $ w&m%1$x&:&y&z&A&B&C%E%C&D&E&F&7${$ @G&L.v L.* ( % v { L.n 8 j c k c K l ^.~.t A@z@z@z@^%3.S                                 ",
+"                                      Q  .F A@` M@B@r z@3.w w%w%>+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { L.v h v L.v { n ^ #.w%u.T+} X ^.X |.~.H H&m#n@n@z@B@a ^                                   ",
+"                                        3.| ` z@G F q#z@S x w 8 G./.N l.R T+h&,+'.< 6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` z@n@m#n@z@M@7 ^                                     ",
+"                                            u H&A@A@n@s 3.< #.#.; - ; #..+w+>+P.|.Y  +N #.= ^ n v v ( * v { L.h.h C < '.%@| X M Q G.#.[ R.M T+E#A@n@8$n@n@A@ .{.                                        ",
+"                                              b F m#8$t R./@^.v.= $ n 8 _ _ V {.>+B.R | | %@T+L F N@H&H&N@N@N@N@s F R.~.[ Q /.< _ i._ a s  .r q#z@z@n@n@r ~..+                                          ",
+"                                                a B@n@s E#Z y@k.e {.$._ ^ n = {.=.1.[ j.y@} u |.b ~.M@q t.k |.[ [ ^.P a $..+_ : 3.o O l.I$q#z@n@n@n@z@F 0 _                                             ",
+"                                                  3.| B@s E#B@Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.J#7 J#V : @.@.v..+9 7 a t.T+T+G n@8$n@z@z@N@I 3.;                                               ",
+"                                                      0 | ` N@N@` F %@| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 )./@ .B@s z@n@n@n@n@r p e #.                                                  ",
+"                                                          H.p A@z@q#A@N@B@p M@B@F H q t.b t./@J } O 0 l.O e @.3.l.} u | T+Z F A@m#m#n@n@n@A@t H./.                                                      ",
+"                                                              H.R.` z@z@q#q#q#z@A@H&H&r F F | T+B@t B@q %@| | T+L B@F N@A@n@m#z@n@I$n@z@%@^.$.                                                          ",
+"                                                                $.H.t.B@N@z@n@m#8$z@z@z@z@A@N@A@z@m#z@A@r A@A@z@z@m#n@n@n@z@m#m#A@F y@e $.;                                                             ",
+"                                                                      a O } t H&n@8$n@n@z@z@m#m#n@n@n@z@m#n@n@m#m#z@I$m#z@r F y@H.a V                                                                   ",
+"                                                                            3.H.H.I q G N@A@z@n@n@n@n@n@z@n@z@A@s F p y@[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.bmp
new file mode 100644 (file)
index 0000000..cf6fe15
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Information.xpm
new file mode 100644 (file)
index 0000000..adf3da1
--- /dev/null
@@ -0,0 +1,977 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_Information_xpm[] = {
+"100 100 874 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #787AD5",
+"Y.    c #726FC3",
+"Z.    c #686AA3",
+"`.    c #CACDF7",
+" +    c #444682",
+".+    c #4A5092",
+"++    c #888ECF",
+"@+    c #CFD2FC",
+"#+    c #D3D2F7",
+"$+    c #CCCFFA",
+"%+    c #404479",
+"&+    c #474688",
+"*+    c #9793D7",
+"=+    c #8EA1BB",
+"-+    c #E3EFF7",
+";+    c #CBDCEB",
+">+    c #DFE5EA",
+",+    c #EBEBED",
+"'+    c #EDEDED",
+")+    c #EEEEED",
+"!+    c #EEEDEE",
+"~+    c #EAEBEE",
+"{+    c #E3EBF1",
+"]+    c #D5E3F2",
+"^+    c #687E9D",
+"/+    c #1A315D",
+"(+    c #9095D6",
+"_+    c #B0BACA",
+":+    c #D0D6DE",
+"<+    c #F5F4F2",
+"[+    c #F5F3F0",
+"}+    c #F7F6F5",
+"|+    c #FDFCFC",
+"1+    c #FFFFFF",
+"2+    c #FEFFFF",
+"3+    c #F9F9F9",
+"4+    c #F8F8F7",
+"5+    c #F4FAFD",
+"6+    c #8E9DB4",
+"7+    c #152D5A",
+"8+    c #8C8ED6",
+"9+    c #D7E0EA",
+"0+    c #E2E6EA",
+"a+    c #FBF9F5",
+"b+    c #FAF8F6",
+"c+    c #F6F8F8",
+"d+    c #FBFCFC",
+"e+    c #BBC2CA",
+"f+    c #AAAFBD",
+"g+    c #F4F7F6",
+"h+    c #FBFDFF",
+"i+    c #F6F9FD",
+"j+    c #F9FAFC",
+"k+    c #F1F9FE",
+"l+    c #8598B3",
+"m+    c #BBD6EF",
+"n+    c #CBD8E7",
+"o+    c #E8E7E7",
+"p+    c #F0F0EE",
+"q+    c #F4F5F6",
+"r+    c #FDFEFE",
+"s+    c #3D5278",
+"t+    c #00003B",
+"u+    c #00003D",
+"v+    c #021D57",
+"w+    c #F7FAFA",
+"x+    c #FCFFFF",
+"y+    c #F1F7FD",
+"z+    c #F2F6F9",
+"A+    c #FBFFFF",
+"B+    c #B2C2D6",
+"C+    c #27416D",
+"D+    c #2B2D4A",
+"E+    c #D2DDE8",
+"F+    c #E6E5E2",
+"G+    c #E9EAEB",
+"H+    c #F3F8FA",
+"I+    c #C9D1DF",
+"J+    c #000048",
+"K+    c #001B84",
+"L+    c #001A8D",
+"M+    c #000063",
+"N+    c #708AB4",
+"O+    c #FAFFFF",
+"P+    c #F4F9FE",
+"Q+    c #E7EDF6",
+"R+    c #F8FBFF",
+"S+    c #CBDDEF",
+"T+    c #253F6B",
+"U+    c #484878",
+"V+    c #423F76",
+"W+    c #CAD8E6",
+"X+    c #E3E3E2",
+"Y+    c #E6E8EB",
+"Z+    c #F1F4F9",
+"`+    c #FAFDFF",
+" @    c #F5FAFF",
+".@    c #F6FCFF",
+"+@    c #E3EAF3",
+"@@    c #000862",
+"#@    c #002F9C",
+"$@    c #4E86DF",
+"%@    c #002FA3",
+"&@    c #99AED4",
+"*@    c #F1F9FF",
+"=@    c #ECF6FF",
+"-@    c #F1FAFF",
+";@    c #EFF7FD",
+">@    c #E1EBF5",
+",@    c #EEF6FC",
+"'@    c #ACC2D9",
+")@    c #001240",
+"!@    c #0E234E",
+"~@    c #BED1E4",
+"{@    c #DCDEDE",
+"]@    c #E2E5E9",
+"^@    c #EDF2F8",
+"/@    c #F5FBFF",
+"(@    c #F2F9FF",
+"_@    c #F4FAFF",
+":@    c #F3F9FF",
+"<@    c #F6FDFF",
+"[@    c #859DC7",
+"}@    c #1A49AA",
+"|@    c #5185E3",
+"1@    c #6387C9",
+"2@    c #F4FCFF",
+"3@    c #EDF7FF",
+"4@    c #EAF5FF",
+"5@    c #E9F3FF",
+"6@    c #E9F5FF",
+"7@    c #F8FEFF",
+"8@    c #E9F4FC",
+"9@    c #DDE9F5",
+"0@    c #EBF8FF",
+"a@    c #6B85A7",
+"b@    c #AAC7E7",
+"c@    c #CBD4DE",
+"d@    c #DCDEE0",
+"e@    c #E4EBF1",
+"f@    c #FDFFFF",
+"g@    c #F2F8FF",
+"h@    c #F0F7FF",
+"i@    c #F0F9FF",
+"j@    c #F3FCFF",
+"k@    c #F7FFFF",
+"l@    c #EAF6FF",
+"m@    c #E8F4FF",
+"n@    c #E6F4FF",
+"o@    c #E4F1FF",
+"p@    c #E1F2FF",
+"q@    c #F4FFFF",
+"r@    c #DCEBF9",
+"s@    c #DEEAF6",
+"t@    c #C5DBEC",
+"u@    c #233B67",
+"v@    c #061A47",
+"w@    c #252547",
+"x@    c #545284",
+"y@    c #8685D3",
+"z@    c #A7C1DE",
+"A@    c #D4D7DA",
+"B@    c #DBE1E8",
+"C@    c #ECF3FB",
+"D@    c #EFF8FF",
+"E@    c #EDF8FF",
+"F@    c #EEF7FF",
+"G@    c #F9FFFF",
+"H@    c #F6FFFF",
+"I@    c #F5FEFF",
+"J@    c #E5F1FB",
+"K@    c #E9F7FF",
+"L@    c #E5F3FF",
+"M@    c #E4F2FF",
+"N@    c #E3F1FF",
+"O@    c #E1F0FF",
+"P@    c #E0EFFF",
+"Q@    c #DFF0FF",
+"R@    c #E9F9FF",
+"S@    c #D2E1F3",
+"T@    c #E1F2FE",
+"U@    c #536A8F",
+"V@    c #001442",
+"W@    c #132853",
+"X@    c #9B99EA",
+"Y@    c #B9CBDA",
+"Z@    c #D2D8DD",
+"`@    c #DFE5EE",
+" #    c #F2FBFF",
+".#    c #F1FBFF",
+"+#    c #EBF4FF",
+"@#    c #EBF6FF",
+"##    c #EAF3FF",
+"$#    c #EBF7FF",
+"%#    c #EFFBFF",
+"&#    c #6981A7",
+"*#    c #1E376F",
+"=#    c #2B4984",
+"-#    c #314F85",
+";#    c #13336D",
+">#    c #00114F",
+",#    c #889CBD",
+"'#    c #F5FFFF",
+")#    c #E0F0FF",
+"!#    c #DDEFFF",
+"~#    c #DEEFFF",
+"{#    c #DCEEFF",
+"]#    c #DAEBFF",
+"^#    c #E1F3FF",
+"/#    c #EDFEFF",
+"(#    c #D3E5F9",
+"_#    c #D2E2F2",
+":#    c #ACC7E1",
+"<#    c #0B2150",
+"[#    c #102551",
+"}#    c #282340",
+"|#    c #B7C3CF",
+"1#    c #CAD3DA",
+"2#    c #DEE8F3",
+"3#    c #EEFAFF",
+"4#    c #E6F2FF",
+"5#    c #E7F2FF",
+"6#    c #E7F4FF",
+"7#    c #E7F5FF",
+"8#    c #879FC8",
+"9#    c #042C81",
+"0#    c #000B7C",
+"a#    c #001C8A",
+"b#    c #00208D",
+"c#    c #000A6D",
+"d#    c #7A95C0",
+"e#    c #DEF0FF",
+"f#    c #DBEDFF",
+"g#    c #DAEDFF",
+"h#    c #D8EDFF",
+"i#    c #D8EAFF",
+"j#    c #D7EBFF",
+"k#    c #E4F8FF",
+"l#    c #D5E8FA",
+"m#    c #C7D8EB",
+"n#    c #BBD2E7",
+"o#    c #0E2350",
+"p#    c #0F244F",
+"q#    c #B6C1CC",
+"r#    c #C3CDD7",
+"s#    c #DAE6F3",
+"t#    c #EAF7FF",
+"u#    c #E2EFFF",
+"v#    c #E2F2FF",
+"w#    c #E4F4FF",
+"x#    c #1F4793",
+"y#    c #002692",
+"z#    c #00309F",
+"A#    c #001984",
+"B#    c #7F9CC9",
+"C#    c #F2FFFF",
+"D#    c #DBEEFF",
+"E#    c #D7ECFF",
+"F#    c #D5EBFF",
+"G#    c #D4EBFF",
+"H#    c #D4E9FF",
+"I#    c #D3E9FF",
+"J#    c #DAF1FF",
+"K#    c #CEE4F9",
+"L#    c #BDD3E6",
+"M#    c #BDD4E6",
+"N#    c #353457",
+"O#    c #7777C4",
+"P#    c #B6C2CD",
+"Q#    c #BEC9D6",
+"R#    c #D6E4F2",
+"S#    c #E5F4FF",
+"T#    c #DFEFFF",
+"U#    c #E3F4FF",
+"V#    c #4D6CA2",
+"W#    c #001C87",
+"X#    c #00309D",
+"Y#    c #001A82",
+"Z#    c #7C9AC8",
+"`#    c #EDFFFF",
+" $    c #D5EAFF",
+".$    c #D4E8FF",
+"+$    c #D1E9FF",
+"@$    c #D2E9FF",
+"#$    c #D1E7FF",
+"$$    c #D6EDFF",
+"%$    c #CAE1F9",
+"&$    c #B8CEE4",
+"*$    c #BDD3E7",
+"=$    c #102550",
+"-$    c #5E5D9C",
+";$    c #B2C0CC",
+">$    c #BCC8D6",
+",$    c #D1E1F1",
+"'$    c #DDF0FF",
+")$    c #D9EDFF",
+"!$    c #DCF0FF",
+"~$    c #EBFBFF",
+"{$    c #43639B",
+"]$    c #001D85",
+"^$    c #00309C",
+"/$    c #7B9AC8",
+"($    c #E9FEFF",
+"_$    c #D3EBFF",
+":$    c #CFE8FF",
+"<$    c #D0E8FF",
+"[$    c #D0E6FF",
+"}$    c #CDE8FF",
+"|$    c #CEE7FF",
+"1$    c #CDE7FF",
+"2$    c #D1EBFF",
+"3$    c #C7E0F9",
+"4$    c #B6CEE4",
+"5$    c #B7CFE6",
+"6$    c #0F2450",
+"7$    c #5A5FA2",
+"8$    c #6F73BF",
+"9$    c #A6B7C9",
+"0$    c #B8C6D3",
+"a$    c #CCDBEE",
+"b$    c #DAECFF",
+"c$    c #D8ECFF",
+"d$    c #D9EFFF",
+"e$    c #E6FAFF",
+"f$    c #42619B",
+"g$    c #001C86",
+"h$    c #7998C8",
+"i$    c #E6FCFF",
+"j$    c #D0E9FF",
+"k$    c #CBE6FF",
+"l$    c #CAE4FF",
+"m$    c #CCE6FF",
+"n$    c #CBE5FF",
+"o$    c #CAE5FF",
+"p$    c #C1DAF5",
+"q$    c #B5CCE3",
+"r$    c #A9C6E2",
+"s$    c #0E244F",
+"t$    c #9FB8D0",
+"u$    c #B2BFCD",
+"v$    c #BED0E2",
+"w$    c #D2E9FC",
+"x$    c #D7EEFF",
+"y$    c #D2EAFF",
+"z$    c #D3EAFF",
+"A$    c #D2E7FF",
+"B$    c #D5EDFF",
+"C$    c #E1F8FF",
+"D$    c #41629B",
+"E$    c #001D86",
+"F$    c #001B82",
+"G$    c #7797C8",
+"H$    c #E3FBFF",
+"I$    c #CAE3FF",
+"J$    c #C9E4FF",
+"K$    c #C7E4FF",
+"L$    c #C8E2FF",
+"M$    c #C7E3FF",
+"N$    c #C9E5FF",
+"O$    c #C5E2FF",
+"P$    c #B4CFEB",
+"Q$    c #B0C6DE",
+"R$    c #93B6D8",
+"S$    c #0D2450",
+"T$    c #112551",
+"U$    c #08050A",
+"V$    c #6A87AA",
+"W$    c #AABCC9",
+"X$    c #B1C4D5",
+"Y$    c #C7DAF1",
+"Z$    c #D4ECFF",
+"`$    c #CEE8FF",
+" %    c #CFE7FF",
+".%    c #D2EBFF",
+"+%    c #DEF6FF",
+"@%    c #40619B",
+"#%    c #001C82",
+"$%    c #7596C8",
+"%%    c #DFF8FF",
+"&%    c #C6E3FF",
+"*%    c #C4E1FF",
+"=%    c #C5E3FF",
+"-%    c #C4E0FF",
+";%    c #C6E4FF",
+">%    c #B9D8F6",
+",%    c #ABC5E0",
+"'%    c #ABC6DE",
+")%    c #516D95",
+"!%    c #061A48",
+"~%    c #2A2E55",
+"{%    c #0A0B14",
+"]%    c #080D1A",
+"^%    c #1D1B32",
+"/%    c #263F6C",
+"(%    c #A7C0D6",
+"_%    c #A9BACA",
+":%    c #B4C9DF",
+"<%    c #C9E0FB",
+"[%    c #CDE6FF",
+"}%    c #CAE6FF",
+"|%    c #CEE9FF",
+"1%    c #DCF4FF",
+"2%    c #3E619B",
+"3%    c #001C81",
+"4%    c #7497CA",
+"5%    c #DAF6FF",
+"6%    c #C3E2FF",
+"7%    c #C2E1FF",
+"8%    c #C1E1FF",
+"9%    c #C0E0FF",
+"0%    c #C0E2FF",
+"a%    c #BBDDFD",
+"b%    c #ACC9E7",
+"c%    c #A3BFD7",
+"d%    c #92B5D4",
+"e%    c #203B69",
+"f%    c #091C47",
+"g%    c #142954",
+"h%    c #21233F",
+"i%    c #111122",
+"j%    c #7190B4",
+"k%    c #A7BACA",
+"l%    c #A5B8CC",
+"m%    c #B3CCE3",
+"n%    c #C6E1FD",
+"o%    c #CDE9FF",
+"p%    c #C8E4FF",
+"q%    c #CDEBFF",
+"r%    c #DFFBFF",
+"s%    c #42649F",
+"t%    c #002A97",
+"u%    c #00187E",
+"v%    c #698DC1",
+"w%    c #E1FFFF",
+"x%    c #C4E4FF",
+"y%    c #C0E1FF",
+"z%    c #BCDEFF",
+"A%    c #BDDEFF",
+"B%    c #BFE1FF",
+"C%    c #B9DCFD",
+"D%    c #AAC7E8",
+"E%    c #9EB9D5",
+"F%    c #9EBDD8",
+"G%    c #567CA7",
+"H%    c #071947",
+"I%    c #112651",
+"J%    c #152A55",
+"K%    c #091F4D",
+"L%    c #83A2BF",
+"M%    c #9CB0C2",
+"N%    c #A2B7CC",
+"O%    c #B1CAE3",
+"P%    c #C2DEFA",
+"Q%    c #C8E7FF",
+"R%    c #C7E5FF",
+"S%    c #CAE8FF",
+"T%    c #BAD9F4",
+"U%    c #183E89",
+"V%    c #002E9A",
+"W%    c #0A3EA6",
+"X%    c #033099",
+"Y%    c #1C438D",
+"Z%    c #B6D8F1",
+"`%    c #C3E5FF",
+" &    c #BFDFFF",
+".&    c #BBE0FF",
+"+&    c #BCDFFF",
+"@&    c #B6DAFE",
+"#&    c #A7C7E8",
+"$&    c #99B7D4",
+"%&    c #96B3CD",
+"&&    c #739AC0",
+"*&    c #0E2452",
+"=&    c #0F224D",
+"-&    c #6F73CC",
+";&    c #385885",
+">&    c #88A8C5",
+",&    c #99AEC2",
+"'&    c #9DB4CE",
+")&    c #ABC6E1",
+"!&    c #B9D7F6",
+"~&    c #D3F3FF",
+"{&    c #7C9FCF",
+"]&    c #000766",
+"^&    c #00279A",
+"/&    c #1B50BE",
+"(&    c #2B5FCC",
+"_&    c #285DCC",
+":&    c #1A4EBD",
+"<&    c #02308F",
+"[&    c #80A8DA",
+"}&    c #C3E7FF",
+"|&    c #B8DCFF",
+"1&    c #AFD3F8",
+"2&    c #A2C3E6",
+"3&    c #95B5D3",
+"4&    c #94B2CD",
+"5&    c #78A0C6",
+"6&    c #223F6D",
+"7&    c #365683",
+"8&    c #7A9CBD",
+"9&    c #98B0C5",
+"0&    c #98B1C8",
+"a&    c #9EBAD6",
+"b&    c #A9C7E6",
+"c&    c #B3D4F6",
+"d&    c #BEE1FF",
+"e&    c #B0D2F8",
+"f&    c #9DC1F1",
+"g&    c #B1D8FF",
+"h&    c #A9D0FA",
+"i&    c #A4CAF6",
+"j&    c #A3CAF6",
+"k&    c #BDE5FF",
+"l&    c #A7D0FF",
+"m&    c #A7CDF7",
+"n&    c #B1D5F8",
+"o&    c #A1C5E8",
+"p&    c #98BADA",
+"q&    c #91B1CF",
+"r&    c #92B0CE",
+"s&    c #6F95BE",
+"t&    c #244373",
+"u&    c #0A1E48",
+"v&    c #132651",
+"w&    c #071B47",
+"x&    c #132A59",
+"y&    c #6084AA",
+"z&    c #8CADC6",
+"A&    c #95ADC3",
+"B&    c #94AECA",
+"C&    c #98B5D3",
+"D&    c #9BBAD8",
+"E&    c #A5C5E5",
+"F&    c #B1D5F5",
+"G&    c #B6D9F9",
+"H&    c #B8DBFA",
+"I&    c #BEE3FF",
+"J&    c #C0E7FF",
+"K&    c #BBE2FF",
+"L&    c #B0D5F8",
+"M&    c #9EC1E4",
+"N&    c #93B5D7",
+"O&    c #8FADCC",
+"P&    c #8EADCA",
+"Q&    c #83A9CB",
+"R&    c #567FAC",
+"S&    c #102754",
+"T&    c #132753",
+"U&    c #0B1D49",
+"V&    c #0C2250",
+"W&    c #28436E",
+"X&    c #678CB1",
+"Y&    c #85A2BF",
+"Z&    c #8DAAC4",
+"`&    c #8BAAC4",
+" *    c #85A6C7",
+".*    c #86AACA",
+"+*    c #89ABCC",
+"@*    c #91B2D3",
+"#*    c #9FC2E7",
+"$*    c #ADD4FC",
+"%*    c #A6CDF3",
+"&*    c #96B8DB",
+"**    c #90AFCF",
+"=*    c #89ACCB",
+"-*    c #80A5C5",
+";*    c #608AB4",
+">*    c #264371",
+",*    c #0C214F",
+"'*    c #0C1F4B",
+")*    c #0B1E4B",
+"!*    c #041844",
+"~*    c #254271",
+"{*    c #3A5A85",
+"]*    c #5F7EA3",
+"^*    c #799ABC",
+"/*    c #7B9BBC",
+"(*    c #7F9FBF",
+"_*    c #81A0C0",
+":*    c #8AADCD",
+"<*    c #9FC6EE",
+"[*    c #9CC3EC",
+"}*    c #8AAFD4",
+"|*    c #6C92B9",
+"1*    c #3F628E",
+"2*    c #284B7B",
+"3*    c #061844",
+"4*    c #0B1E4A",
+"5*    c #11244F",
+"6*    c #000000",
+"7*    c #122753",
+"8*    c #0C204B",
+"9*    c #061945",
+"0*    c #0D2452",
+"a*    c #1D3662",
+"b*    c #203762",
+"c*    c #314A74",
+"d*    c #7190B3",
+"e*    c #89AACC",
+"f*    c #99C3EC",
+"g*    c #A2CBF4",
+"h*    c #80A5CE",
+"i*    c #183462",
+"j*    c #011340",
+"k*    c #0B1D47",
+"l*    c #122752",
+"m*    c #AAAAAA",
+"n*    c #142854",
+"o*    c #112550",
+"p*    c #0D214C",
+"q*    c #0B1F4B",
+"r*    c #051744",
+"s*    c #35507E",
+"t*    c #8CB2D3",
+"u*    c #94BEE6",
+"v*    c #A7D2FB",
+"w*    c #7CA8D7",
+"x*    c #0E2450",
+"y*    c #0E224D",
+"z*    c #555555",
+"A*    c #0B070D",
+"B*    c #102450",
+"C*    c #0E2451",
+"D*    c #6591BE",
+"E*    c #91BAE0",
+"F*    c #A5CFF9",
+"G*    c #71A1D5",
+"H*    c #0C2350",
+"I*    c #11234E",
+"J*    c #777777",
+"K*    c #888888",
+"L*    c #363961",
+"M*    c #110D1B",
+"N*    c #0C1F4A",
+"O*    c #0B2452",
+"P*    c #5C8AB9",
+"Q*    c #A1CCF3",
+"R*    c #6EA1D6",
+"S*    c #0E2552",
+"T*    c #99FFCB",
+"U*    c #0D1E49",
+"V*    c #102A59",
+"W*    c #70A2D3",
+"X*    c #72AADF",
+"Y*    c #102957",
+"Z*    c #122550",
+"`*    c #484986",
+" =    c #0D1E47",
+".=    c #16305D",
+"+=    c #355D91",
+"@=    c #152B57",
+"#=    c #16152B",
+"$=    c #0F214B",
+"%=    c #142853",
+"&=    c #535491",
+"*=    c #7275CE",
+"==    c #666666",
+"-=    c #996666",
+";=    c #333333",
+">=    c #444444",
+",=    c #C0C0C0",
+"'=    c #CCCCCC",
+")=    c #999999",
+"!=    c #336666",
+"~=    c #7477CB",
+"{=    c #663366",
+"]=    c #7D80CE",
+"^=    c #00CC00",
+"/=    c #BBBBBB",
+"(=    c #FD0000",
+"_=    c #050208",
+":=    c #FFCC00",
+"<=    c #FF6600",
+"[=    c #666699",
+"}=    c #CC6600",
+"|=    c #DDDDDD",
+"1=    c #313260",
+"2=    c #FFCC99",
+"3=    c #333366",
+"4=    c #336633",
+"5=    c #15121F",
+"6=    c #09060C",
+"7=    c #663333",
+"8=    c #EEEEEE",
+"9=    c #222222",
+"0=    c #1D203B",
+"a=    c #666633",
+"b=    c #474B93",
+"c=    c #CC3300",
+"d=    c #660000",
+"e=    c #990000",
+"f=    c #32386C",
+"g=    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.O.O.I.I.I.I.I.J.I.J.F.D.z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.A.F.J.I.I.O.T.U.V.V.U.W.T.T.T.I.K.I.K.F.D.x.p.o.d.. 6.i + <.g.z 4 5 X.Y.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y Z.5.f.p.y.D.E.I.K.V.T.T.T.`.`.`.`.U.W.W.U.T.T.T.K.J.E.D.z.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ). +.+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u Z.++f.o.x.D.F.J.K.T.V.`.U.@+@+U.@+U.@+#+#+T.$+`.T.V.I.I.D.y.z.p.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.%+&+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w  +O S.*+5.p.y.x.E.K.I.T.=+-+;+>+,+'+)+)+!+~+{+]+^+/+@+T.U.O.K.K.F.A.z.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $. +#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.S.(+e.p.x.z.D.J.I.T._+:+<+[+}+|+1+1+1+1+2+3+4+1+5+6+7+`.W.I.I.I.E.A.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 8+5.b.p.y.D.J.I.9+0+a+b+c+d+1+1+1+e+f+g+1+1+h+i+j+1+k+l+`.W.O.I.E.D.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.x.p.z.D.m+n+o+p+q+r+1+1+1+1+s+t+u+v+w+1+1+1+x+y+z+A+B+C+V.I.E.D.y.p.f.d.i + r.@ ' z 4 4 # &., 2.% 2.% L.L.{ n $ n v $ L D+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u Z.5.. d.x.x.y.F.E+F+G+H+1+1+1+1+1+I+J+K+L+M+N+1+O+1+1+1+P+Q+R+S+T+T.J.D.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f * { L.( v ( ( { n - K 0 9 a U+P a                     ",
+"                      # ' * (.P V+u ~.4.i 5.f.o.q.D.W+X+Y+Z+1+1+`+ @.@1++@@@#@$@%@&@1+*@=@-@1+1+;@>@,@'@)@!@E.D.z.p.f.d.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.x.~@{@]@^@1+1+/@(@_@:@<@1+[@}@|@1@O+2@3@4@5@6@7@1+8@9@0@a@)@J.F.A.p.b.d.! i @ 3 3 B 4 X.# , % 2.f ( f L.L.M.M.].n n n V t.[ .+{.a 0 O %                 ",
+"                    % , ( @.R c H.e 8+! ! 5.f.y.b@c@d@e@f@1+g@h@*@i@i@j@O+1+1+k@1+k@l@m@m@n@o@p@q@1+r@s@t@u@v@E.y.p.o.5.i ) r.2 ' ' # # &., , 2.2./ ( { { v n ( ( ( M.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H.w@| x@y@A i c.5.f.q.z@A@B@C@f@D@E@F@3@E@i@G@H@G@2+I@J@K@K@L@M@N@O@P@Q@H@R@S@T@U@V@W@A.p.f.X@! i N.3 }.}.5 # # , 2./ f * % % n v v n n { { ]./.O a /..+a !.O %               ",
+"                  ( : S ; k.w@H.x@4.i 6.! b.f.x.Y@Z@`@ #.#+#@###5@$#%#&#*#=#-#;#>#,#'#N@)#!#~#{#]#^#/#(#_#:#<#[#y.p.o.! i ) <.~ z 7.4 # # , % / f % { { L.h $ M.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.}#[ -.y A 6.5.b.f.x.|#1#2#3#$#4#5#6#L@7#%#8#9#0#a#b#c#d#'#e#{#f#g#h#i#j#k#l#m#n#o#p#y.p.o.b.6.) <.' 3 4 4 # # & 2.2.2.% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.y@) i 6.d.f.o.q#r#s#t#L@M@N@N@u#v#w#'#'#x#y#z#A#B#C#D#h#E#F#G#H#I#J#K#L#M#o#p#A.q.o.! ! ! r.@ ' ' 4 # # & , ( f * { % ( n ( M.( ( ( ( ].#.N#g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.O#[.N.+ i c.d.p.P#Q#R#S#O@)#T#T#~#!#!#U#q@V#W#X#Y#Z#`#E# $.$+$+$@$#$$$%$&$*$=$p#A.p.o.. i A r.@ 3 ' X.# # # , , 2.% { * % v { n n n n ( $ ].P.!.k.U+0 |.| V             ",
+"                {.3.{.$.O d Y -$-.@ A i ! ! o.p.;$>$,$^#'${#{#f#g#)$h#!$~${$]$^$Y#/$($_$:$<$[$}$|$1$2$3$4$5$6$p#y.p.f.. + ) <.g.}.B 5 # # % , ( / f % h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| 7$8$g.@ i . . f.o.9$0$a$'$D#b$c$E#j#G#F#d$e$f$g$^$Y#h$i$j$|$k$l$m$n$o$}$p$q$r$s$6$x.o.5.5.! A @ 3 ' 8.4 # &.& , , / { { L.L.n v n n n ( ( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ G.O ~._.y@@ N.) i 5.e.o.t$u$v$w$x$ $G#y$z$A$+$B$C$D$E$X#F$G$H$1$I$J$K$L$M$N$O$P$Q$R$S$T$q.o.X@! ) ) @ ' z 7.%.# & , 2.% / % % { v M.$ M.( ( n ].( { $ j.u !.k F U$U$(           ",
+"              = ; {.( S 3.X 7$8$:.~ @ ) + . 5.f.V$W$X$Y$Z$z$:$<$`$ %1$.%+%@%E$^$#%$%%%N$&%*%=%-%=%;%>%,%'%)%!%W@p.f.. 6.y A ~ }.B 4 # # , , , f ( f % ( h.n { n n ( ( n ( n M.^ X ~%t {%]%^%C.          ",
+"            a H | ~.$.8 .+|._.T 3 g.[.<.i ! b.f./%(%_%:%<%+$}$[%}%n$l$|%1%2%]$^$3%4%5%&%6%7%8%9%0%a%b%c%d%e%f%g%f.f.. 6.+ @ g.3 ' %.# # , 2./ 2./ { { h.( ( ( h ( n n ( ].( { S u B.%+e k.| a %         ",
+"            h v e h%{%i%H } U B z 2 @ r.A . . b.f.j%k%l%m%n%o%N$p%;%p%q%r%s%A#t%u%v%w%x%y%z%A%B%C%D%E%F%G%H%I%J%d.! 6.i ) @ 2 z z 4 # , , 2.( , % % L.h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.}#r q O#8.}.g.~ [.) y ! 5.f.K%L%M%N%O%P%Q%;%=%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&g%J%b.. y ) @ 2 3 4 4 5 # # &., 2.* f { { h v M.( ( n n ( { ( ].( M.P /.*.U+c H I (         ",
+"            , 3 ~ @ -&; O ).B 7.' ' 3 ~ ) i + ! d.d.;&>&,&'&)&!&7%x%~&{&]&^&/&(&_&:&<&[&}&|&1&2&3&4&5&6&f%W@J%e.c.. + A <.' }.4 4 # # , , 2.2.( % % { h n n n ( ( ].( n ( n n { %+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.O#8.%.8.' ~ 2 @ ! . 5.f.f.7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&J%f.c.! + i g.~ 3 ' 4 # # , # ( 2.2.f { * ( v ( h M.n n ( ].( { ( ( ( O &+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.w&x&y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&f%T&J%J%b.6.! ) <.g.' z 8.4 # # , , , 2.f % % h.v v n n ( ( n ( ].( n n n { =. +N H.~.}#^%;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. d.U&V&W&X&Y&Z&`& *.*+*@*#*$*%*&***=*-*;*>*,*'*W@J%J%b.! ! A y @ ~ 3 4 4 9.# , , 2.% f % * { ( h $ ( ( n n ( n ( ].( ( M.( Q.P  +P X q F ;         ",
+"            ' , n n S O | X # # -&5 B 7.}.3 @ N.+ + 5.X@e.f.)*!*~*{*]*^*/*(*_*:*<*[*}*|*1*2*3*4*5*g%J%f.! c.i + N.@ ' 2 ' 4 4 # # , % 6*6*6*% ( * { v v v M.( n ( n ( n n { n $ n...N U+k t i%;         ",
+"            # ( v % _ b  .|.9.-&# 9.# 4 7.' @ 2 A i + . . d.5.7*8*9*0*a*b*c*d*e*f*g*h*i*j*k*l*g%J%J%f.. 5.6.i i @ ~ 3 z B %.# # # , , 6*m*m*6*6*% ( $ $ $ { n ( n ( n ( ( ( h n %+).%+g | s {%;         ",
+"            v ( 2.* {.N#| u T # , # # 5 4 7.3 g.~ A y i . c.c.d.f.n*o*p*q*r*s*t*u*v*w*x*y*g%J%J%b.X@! 6.y ! ) i r.~ ' }.4 4 # , , 2.% 6*z*z*m*m*6*6*n n ( ( n ( n ( n n ].n h $ Q.O O u ^%]%A**.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ N.) y y ! . d.e.5.f.f.B*C*D*E*F*G*H*I*J%f.e.b.6.i + i ) y <.A ' ' 4 B # # , # ( 6*z*J*J*z*z*m*K*6*6*].n ( n ( n ( ( ( ( { n W 1.L*p i%M*{%;         ",
+"            , 5 # , _ g Y c 5 , , , &.Y.# %.X.B z 2 ~ 2 + ) y . 6.c.c.X@b.b.N*O*P*Q*R*S*5*. . 5.! + i + ) V.r.2 @ g.3 4 # , , % & , 6*z*J*T*J*J*z*z*K*K*6*6*( n ( n n n n ( ( L. +b u L i%{%{%;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A N.i y + y ! ! ! 5.b.U*V*W*X*Y*Z*J%y ) ) y @ A r.@ ~ @ 3 z ' 4 # 8.7.X.# # 6*z*J*T*T*T*J*J*z*z*K*K*6*6*n ( ( ( M.n v { `*P.} d ` M*i%;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 g.2 A N.A ) i ) y ! i  =.=+=@=l*J%) A r.r.3 A 2 2 3 ' ' 4 3 2 4 # 2.2./ 6*z*J*T*T*T*T*T*T*J*J*z*z*K*K*6*6*n n M.M.( ( .+!.u t s M*#=;         ",
+"            ( B 5 # S l.~%Y 7$, , % 2.% , & # # 5 %.4 8.}.' 3 @ 2 @ 2 @ N.i A ) ) Z*$=%=J%J%@ 2 2 ~ ' ' @ 3 ' z }.3 ' z % % 2.2.f 6*z*J*T*T*T*T*T*T*T*T*J*J*z*z*K*K*6*( n v h.v j.N#w@F G ]%G x         ",
+"            ; 5 4 / /.o X t.&=, 2.2., 2.% , # & # # *=%.4 ' z 3 ' g.2 2 ' @ g.@ 3 ' 2 A 2 @ @ g.2 3 }.z ' 3 4 7.2 @ 7.%.# # , , 2.6*z*J*T*T*T*T*T*T*T*T*T*T*J*J*====6*( ].L.h M.P.k. .q #={%q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # *=4 # X.4 }.2 3 3 3 2 3 2 g.g.3 g.3 2 z ' 7.4 B 5 7.4 ' 3 %.4 2 %.& , , % 6*z*J*T*T*T*T*T*T*T*T*T*T*T*T*T*K*==6*v h v n  +g X  .}#s {%I M.        ",
+"            i., h {.e a #.Q.a , * * * / 2./ 2.2., &.&.9.# # 4 %.4 4 4 ' 7.}.z ' }.' z ' 7.4 7.4 4 4 4 5 # # ====-=;=5 # % , , f 6*z*J*T*T*T*T*T*T*T*T*T*T*T*T*K*==>=6*n ( % ( n.O Y c ^%{%U$l.*         ",
+"            6 = .+g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # # *=%.4 9.4 %.4 4 4 4 X.7.4 4 B %.B # # Y.# ==,='=)=!=6*% , % * % 6*z*J*T*T*T*T*T*T*T*T*T*T*T*T*K*==>=6*v h.{ ,.g J  .Z M*U${%V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.# 9.# # # B 8.9.%.%.# B %.9.# # # # # # ~===,=,=,='=)={=6*2.( * 6*z*J*T*T*T*T*T*T*T*T*T*T*T*T*T*K*==>=6*h ( ( V+g k.R.s {%U$F =           ",
+"              M 7 {.0 a a =.O 7$* ( { { { % * / / % 2.2., 2., , , # # # # # # # Y.# # # # # &., &.& , ]==='=,=,='=)===6*f * % 6*z*K*K*K*T*T*T*T*T*T*T*T*T*T*K*==>=6*{ v h.: N#l X h%#={%U$h%S           ",
+"              v.{.v.H.P H.U+ +7$v % L.L.{ ( % % * / f f % 2./ 2., , , , , # & # &., & &., , , , , / % % )=)='=,='=)=;=6*% { L.K*6*K*^=K*K*K*T*T*T*T*T*T*T*T*K*==>=6*( L.( V R J Y h%#={%U$g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % % { / 2.% / 2.2.2.2.% 2., , , , , , , # % , % % 2., 2.====)=)=)===;=6*{ 6*6*>=/=/=(=K*K*K*K*K*T*T*T*T*T*T*K*==>=6*h.{ 8 ~%Y u I w@]%_=]%V             ",
+"                0 !.J ).^ C G./..+w ( { ( % L.{ { % % * * / f / / 2.2.2.f 2.f % % , / % 2.% , , % 2./ ==:=======;=====6*6*/=K*K*>=>=/=/=K*K*K*K*K*K*T*T*T*K*==>=6*L.{ +.^ ~%p  .D+^%U$U$Z ;             ",
+"                a g H.a l h%h%I R P.+.( v { { L.L.{ * ( L.% % { f f / / / % 2., , % f 2.2./ / 2.* % )='=:=<=====[===}=;=;=K*|===K*K*>=>=/=/=K*K*K*K*K*K*T*K*==>=6*h.% M.c p | p F M*U${%[ %             ",
+"                  ~.s {%M*| Q M P.1=,.^ ( ( { { L.( { { { { % L.% { % % * 2.L.L.2.% * * { * % % * % )=2=,=,=<=<=<=}=}=}=:=3===K*|===K*K*>=>=/=/=K*z*K*K*K*K*==>=6*h.n V ` t Y w@#={%U$s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % L.% % { { { % { { % % * * * { % % % L.{ { ( * )=2=,=,=,=,=:=:=:=:=<=4=K*/===K*|===K*K*>=>=/=/=K*z*K*==>=6** v w t F 5=U$U$6=U$U$| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { { { { { L.( % { L.( * { ( % ( % { { * ( * L.{ L.{ )=2=2=2=,=,=,=,=:=<=}=7=J*J*K*/===K*|===K*K*>=>=/=/=K*==6*6*h.].W F g Q R.{%_=U${%$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { % { { ( % { { { * ( % L.{ L.{ % { { )=2=:=2=2=2=,=,=<=<=}=!=8=1+J*K*K*|===K*|===K*K*>=>=/=6*9=>=>=< F H k.0 Y r U$U$h%;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { ( { { { { { ( { ( ( ( )=2=:=:=2=2=2=2=<=<=}=;=/=/=z*J*|===K*|===K*|===K*K*>=>=6*9=>=>=0=E !. .s {%U$M*.+%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( ( v ( ( ( ( ( v ( { v v )=2=:=:=:=2=2=2=<=}=}=3=z*J*J*K*K*K*|===K*|===K*K*K*z*z*6*9=9=>=p Y p ]%U$_=U$w@;                   ",
+"                        | h%q R.k H.[ | L c < ,.{ n ].( ( n n ( $ v v v v v M.v v v v v ( n ( $ $ n )=2=:=:=:=:=:=2=<=}=}=a=J*z*K*K*K*K*K*K*|===K*K*z*z*>=>=6*9=>=>=} L i%{%U$U$i%{.                    ",
+"                        l ^%^%| 3.#.O R. .E | b=( ( ( n n ( ( ].{ $ ( $ $ $ { $ $ ( ( ( ].( n { { ( )=2=:=:=:=:=:=:=<=}=}=;=/=/=K*K*K*K*K*K*K*K*z*z*>=>=6*6*9=>=>=U+u i%{%U$U${%X ^                     ",
+"                          N# .~.@.8 g d O k.X |.G.].M.( n n ( ( { ].{ { { ( ].{ ].].].( n ( ( ( n ( ( )=2=:=:=:=:=:=<=}=}=3=====/=/=K*K*K*K*z*z*>=>=6*6*9=9=>=b 3.7 p {%{%U${%p _                       ",
+"                          7 b N#^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( ( ( ].( ( ( ( ( n ( n ].].( n ].)=2=:=:=:=:=:=<=c=;=6*========/=/=z*z*>=>=6*6*9=9=>=E H.M a l.F {%U$U$r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( ( ].].].^ ].( { ^ n n n ( n ( ( ( n ( ( ( )=2=:=d=:=:=:=e=c=a=z*6*6*========>=>=6*6*9=9=>=q c %+.+7 O w@{%U$U$]%[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { ( ( ( ( ( n ( ( ( ( ( n ( n n n ( n n n )=2=:=e=:=:=d=e=}=3={ n z*6*6*====6*6*9=9=>=N  .| ^.a v.a p ]%_=_={%c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { { { ( ].{ n n n ( n ( ( ( n ( ( ( ( )=2=:=e=:=:=<=<=}=;=% v h h.z*6*6*9=9=>=]  +q | =.a e 0 j #=U$U$U$H i.                            ",
+"                                $.Y q G ^%l.V C V [ u } q }#f=S ( ( ( ].( ( ( ( ( n ( n n n ( n n n n ( n ( ( n h v v ( ( 2.% 2., , Y.>=>=].6 P.w@R.[ `*e l.Y s U$U$U$t {.{                             ",
+"                                  3.| s i%I k.0 0.!.| }#q !.Y R.&+].( n ].n n n ( n ( ( ( n ( ( ( ( n ( v v ( { $ n v h.( * { L.L.{ L.v n w | | d }#Q $.O c s U$U$U$F 7 S                               ",
+"                                    Q h%M*i%F } |.w@c i%d /.[ b } }#6 ].( $ ( $ n ( n n n M.v n n n h v $ $ v M.{ L.v L.* ( % v { L.n 8 j c k c K l ^.~.t ]%{%{%{%0=3.S                                 ",
+"                                      Q  .F ]%` h%^%r {%3.w b=b=%+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { L.v h v L.v { n ^ #.b=u.w@} X ^.X |.~.H g=A*U$U${%^%a ^                                   ",
+"                                        3.| ` {%G F M*{%S x w 8 G./.N l.R w@f=&+'.< 6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` {%U$A*U${%h%7 ^                                     ",
+"                                            u g=]%]%U$s 3.< #.#.; - ; #..+U+%+P.|.Y  +N #.= ^ n v v ( * v { L.h.h C < '.}#| X M Q G.#.[ R.M w@#=]%U$_=U$U$]% .{.                                        ",
+"                                              b F A*_=t R.N#^.v.= $ n 8 _ _ V {.%+B.R | | }#w@L F i%g=g=i%i%i%i%s F R.~.[ Q /.< _ i._ a s  .r M*{%{%U$U$r ~..+                                          ",
+"                                                a ^%U$s #=Z ~%k.e {.$._ ^ n = {.=.1.[ j.~%} u |.b ~.h%q t.k |.[ [ ^.P a $..+_ : 3.o O l.6=M*{%U$U$U${%F 0 _                                             ",
+"                                                  3.| ^%s #=^%Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.&=7 &=V : @.@.v..+9 7 a t.w@w@G U$_=U${%{%i%I 3.;                                               ",
+"                                                      0 | ` i%i%` F }#| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).N# .^%s {%U$U$U$U$r p e #.                                                  ",
+"                                                          H.p ]%{%M*]%i%^%p h%^%F H q t.b t.N#J } O 0 l.O e @.3.l.} u | w@Z F ]%A*A*U$U$U$]%t H./.                                                      ",
+"                                                              H.R.` {%{%M*M*M*{%]%g=g=r F F | w@^%t ^%q }#| | w@L ^%F i%]%U$A*{%U$6=U${%}#^.$.                                                          ",
+"                                                                $.H.t.^%i%{%U$A*_={%{%{%{%]%i%]%{%A*{%]%r ]%]%{%{%A*U$U$U${%A*A*]%F ~%e $.;                                                             ",
+"                                                                      a O } t g=U$_=U$U${%{%A*A*U$U$U${%A*U$U$A*A*{%6=A*{%r F ~%H.a V                                                                   ",
+"                                                                            3.H.H.I q G i%]%{%U$U$U$U$U${%U${%]%s F p ~%[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.bmp
new file mode 100644 (file)
index 0000000..1b60d71
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ListPatient_Voi.xpm
new file mode 100644 (file)
index 0000000..b5642ce
--- /dev/null
@@ -0,0 +1,359 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_ListPatient_Voi_xpm[] = {
+"100 100 256 2",
+"      c #000100",
+".     c #090200",
+"+     c #08040A",
+"@     c #160304",
+"#     c #1A001A",
+"$     c #0C0A14",
+"%     c #1F0503",
+"&     c #0F110C",
+"*     c #260708",
+"=     c #10101F",
+"-     c #00019C",
+";     c #330404",
+">     c #2D002A",
+",     c #400000",
+"'     c #310B0B",
+")     c #171917",
+"!     c #530000",
+"~     c #1D1C00",
+"{     c #1A182E",
+"]     c #600000",
+"^     c #3E0F0F",
+"/     c #191C38",
+"(     c #4A0147",
+"_     c #6B0002",
+":     c #580037",
+"<     c #6D0000",
+"[     c #232138",
+"}     c #481616",
+"|     c #2A2710",
+"1     c #232341",
+"2     c #800000",
+"3     c #511516",
+"4     c #2C2D01",
+"5     c #282927",
+"6     c #431743",
+"7     c #8D0000",
+"8     c #342433",
+"9     c #940001",
+"0     c #5B1A1A",
+"a     c #6F006F",
+"b     c #2A2A4D",
+"c     c #980100",
+"d     c #7C0059",
+"e     c #A50000",
+"f     c #383800",
+"g     c #681C1A",
+"h     c #333432",
+"i     c #323154",
+"j     c #AF0200",
+"k     c #2827AB",
+"l     c #6C2600",
+"m     c #6B2121",
+"n     c #B80000",
+"o     c #880085",
+"p     c #32345C",
+"q     c #443245",
+"r     c #343565",
+"s     c #C50000",
+"t     c #782324",
+"u     c #732726",
+"v     c #464500",
+"w     c #D00000",
+"x     c #A00576",
+"y     c #40423F",
+"z     c #3C3D68",
+"A     c #DA0001",
+"B     c #6B3900",
+"C     c #E40000",
+"D     c #7F2C2B",
+"E     c #3E4075",
+"F     c #683938",
+"G     c #4D4B28",
+"H     c #F00000",
+"I     c #424472",
+"J     c #F70000",
+"K     c #434481",
+"L     c #633A65",
+"M     c #8C2F31",
+"N     c #873232",
+"O     c #504A49",
+"P     c #9A159C",
+"Q     c #C60099",
+"R     c #FF0000",
+"S     c #585800",
+"T     c #494A79",
+"U     c #624C34",
+"V     c #9D246B",
+"W     c #4F524E",
+"X     c #674845",
+"Y     c #4A4C83",
+"Z     c #923737",
+"`     c #4E4F8F",
+" .    c #3B693E",
+"..    c #A9229A",
+"+.    c #376666",
+"@.    c #4E519C",
+"#.    c #9B3C3C",
+"$.    c #A13B3E",
+"%.    c #676500",
+"&.    c #9A2F9A",
+"*.    c #CB3400",
+"=.    c #52559F",
+"-.    c #993497",
+";.    c #5158AD",
+">.    c #5757A8",
+",.    c #5F5F68",
+"'.    c #665F5E",
+").    c #973D97",
+"!.    c #A34747",
+"~.    c #AE4343",
+"{.    c #5C5D9D",
+"].    c #646663",
+"^.    c #815574",
+"/.    c #5F5BB4",
+"(.    c #737500",
+"_.    c #5A60B6",
+":.    c #706E35",
+"<.    c #5C5FBD",
+"[.    c #984A98",
+"}.    c #81615C",
+"|.    c #686598",
+"1.    c #6065BC",
+"2.    c #6D706B",
+"3.    c #965494",
+"4.    c #6864BE",
+"5.    c #C54B49",
+"6.    c #6F7458",
+"7.    c #BE4E4E",
+"8.    c #CD4940",
+"9.    c #77706B",
+"0.    c #C64D50",
+"a.    c #996567",
+"b.    c #848400",
+"c.    c #696DC5",
+"d.    c #A16170",
+"e.    c #C85554",
+"f.    c #CD5355",
+"g.    c #D75349",
+"h.    c #CE6503",
+"i.    c #96669B",
+"j.    c #7275BB",
+"k.    c #C45E5E",
+"l.    c #876EB0",
+"m.    c #7174CD",
+"n.    c #CE5B59",
+"o.    c #7575C2",
+"p.    c #CD5B5E",
+"q.    c #7476CA",
+"r.    c #908F00",
+"s.    c #857F78",
+"t.    c #828184",
+"u.    c #D55F5E",
+"v.    c #8D8072",
+"w.    c #9E709D",
+"x.    c #D46164",
+"y.    c #659967",
+"z.    c #7A7DC4",
+"A.    c #797BD5",
+"B.    c #C164A5",
+"C.    c #7E7ED3",
+"D.    c #D26867",
+"E.    c #7E80CD",
+"F.    c #A57D78",
+"G.    c #989A00",
+"H.    c #6C9593",
+"I.    c #FE6700",
+"J.    c #8D8F64",
+"K.    c #9F7F91",
+"L.    c #DC686B",
+"M.    c #8C9556",
+"N.    c #9E8968",
+"O.    c #799E5E",
+"P.    c #B58067",
+"Q.    c #8385DA",
+"R.    c #ED675F",
+"S.    c #DB6E6D",
+"T.    c #979089",
+"U.    c #A78A84",
+"V.    c #888ECF",
+"W.    c #DA7778",
+"X.    c #D07699",
+"Y.    c #E27473",
+"Z.    c #8C8ED6",
+"`.    c #A8A800",
+" +    c #E27579",
+".+    c #8A8EE3",
+"++    c #F66F66",
+"@+    c #A39A64",
+"#+    c #8E8FDE",
+"$+    c #979896",
+"%+    c #9394D6",
+"&+    c #BE9463",
+"*+    c #9599CE",
+"=+    c #E67F80",
+"-+    c #A19E99",
+";+    c #9798E8",
+">+    c #B6B500",
+",+    c #B39C97",
+"'+    c #ACA295",
+")+    c #BF9E87",
+"!+    c #EA8986",
+"~+    c #D69195",
+"{+    c #E5926A",
+"]+    c #D49B69",
+"^+    c #9E9FE8",
+"/+    c #CA9998",
+"(+    c #E88E8C",
+"_+    c #CD98CA",
+":+    c #C1C400",
+"<+    c #DD9F8A",
+"[+    c #FA986E",
+"}+    c #EE9796",
+"|+    c #AAAAF0",
+"1+    c #BBB1A5",
+"2+    c #BBB893",
+"3+    c #96CC98",
+"4+    c #F39F9E",
+"5+    c #B3B3F1",
+"6+    c #D1D100",
+"7+    c #FEA572",
+"8+    c #9BCCCC",
+"9+    c #D2B99D",
+"0+    c #F4A8A9",
+"a+    c #C8BDB1",
+"b+    c #C7C498",
+"c+    c #CDCB67",
+"d+    c #BABBF5",
+"e+    c #DDDC00",
+"f+    c #FFCC06",
+"g+    c #F6B2B0",
+"h+    c #D0CC96",
+"i+    c #D2C7BA",
+"j+    c #E5E300",
+"k+    c #C6C5F7",
+"l+    c #F7BABC",
+"m+    c #E8E500",
+"n+    c #CED0CC",
+"o+    c #CDCDF8",
+"p+    c #DCD1C4",
+"q+    c #FBC4C4",
+"r+    c #FECD97",
+"s+    c #D6D5FA",
+"t+    c #FBCFCF",
+"u+    c #FFCBFF",
+"v+    c #FBD5D6",
+"w+    c #E2DFF0",
+"x+    c #FFFF01",
+"y+    c #E0E1FB",
+"z+    c #FBE1DF",
+"A+    c #EAEBFC",
+"B+    c #FFFE7A",
+"C+    c #FFEAED",
+"D+    c #FCFF97",
+"E+    c #FFFECD",
+"F+    c #FEFFFC",
+"G+    c #FFFFFF",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+;+.+Q.q./.4.q.1.;.;.;././.@./.q.q.c.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+C..+;+Q..+Q..+C.1.` ;.c.<.@./.@.;.;.` 4.4.;.z i i b i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+<.` =.;.c.Q.Q.Q.Q.C.q.4.=.Y ;.@.I T T @.Y z b 1 i I 1.C./.z 4.` i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Q.C.Q.#+C.;.T p p z ` 1.1.1.;.z p z i b 1 1 = = / p ;.1.1.4.;./.i _.4.C.4.<.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+#+Q.C.Q.#+#+C.q./.T b { { [ b i 1 [ 1 1 = { / i I ` @.@.z T I Y K p Y C.c.;.Y T i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+/.1.C.4.C.Q.C.q.o.@.` E r b [ { = { = = = [ b p I p z p z i z i i E I z b _.;.Y Y ;.Y I i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+q.C.` C.q.q.q.q._.@.K E E z z j.Q.z..+Q.Q.Q.q.o.q.1.1.o._._.1.` =.` I p p i [ Y z p Y _.;.I ` ` i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+#+C.q._.z q.1.1.4.@.` K |.{.E.#+#+Z.Z..+Q.E.Q.Q.Q.C.C.C.q.q.q.q.q.q.c.1.4.4.T p b b z r T ;.;.I z ` 4.4.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+#+Q.c.4.I Y q.4.;.@.K Y z.#+^+#+.+.+#+;+#+.+.+;+.+#+.+Q.Q.Q.C.q.q.q.q.q.q.1.4.c.=.=.1 p r I Y E Y z =.C.4.4.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+;+.+q.@.` p ;._.@.` T Z.;+;+;+;+^+^+^+;+;+^+^+;+#+;+#+;+#+#+Q.Q..+C.C.q.q.q.q.q.c.1.1.=.` z p p z I I <.q.c.q.q.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+#+Q.C.;.I E r ;.` T #+^+^+Z.^+^+^+^+^+|+^+^+|+|+;+^+;+;+;+;+.+Z.Q.Q.Q.Q.C.q.C.q.q.q.4.4.4.4./.;.E i i z ;.q.q.q.c.4.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+c.q.q.q./.I z r E ` j.^+^+^+^+^+|+5+|+|+|+|+|+|+^+|+|+^+^+^+;+;+^+.+.+#+.+C.Q.C.q.q.q.q.q.q.4.1._.4./.r b z Y @.;.<.4.c.c.4.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+C.C.q.=.@.` p b p T ^+^+^+^+|+|+|+|+5+d+d+5+d+5+5+|+5+|+5+^+|+^+;+;+^+.+#+#+Q.Q.E.C.C.C.q.c.q.c.c.1./.4.<.@.p p r Y @.4.q.q.4.;.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Q.;+#+C.;.p I p b z ^+^+^+|+|+5+5+5+d+d+5+d+d+d+d+5+d+5+5+|+|+|+^+^+^+;+;+;+.+Q.Q.C.Q.C.q.q.q.c.q.4.c.4.4.<._./.r i I Y ;.q.q./.;.<.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Q.#+#+Q.C.@.p p b i ^+^+^+|+5+5+5+d+d+d+d+k+k+k+d+d+k+d+d+d+d+5+d+|+^+^+^+#+^+^+#+Q.C.C.C.C.q.q.q.q.4.q.c.1.4._./.<.E r E ` ;.c./.4.4./.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+C.#+.+q.q.1.Y i 1 |.^+^+|+|+|+5+5+k+d+k+k+o+k+k+k+k+k+k+k+d+d+d+d+5+5+|+^+^+^+;+#+.+.+.+Q.Q.q.C.C.q.q.q.1.c.c.4.4.4._.<.;.I K @.;.1.c.;./.<.i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Q..+q.c.4.@.p b j.%+^+^+5+5+5+d+d+k+k+k+k+o+o+s+o+o+k+k+o+k+k+k+d+d+d+5+|+^+^+^+;+^+.+.+C.Q.C.q.C.c.c.q.c.4.c.1._.4.4././.@.I K ` _.;.` /.;.i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Q.#+Q.c._.;.I p |.V.].].|+5+d+G.G.G.k+o+o+o+s+o+o+k+s+s+s+k+o+o+k+k+d+d+5+5+|+|+^+^+;+Z.#+.+C.E.C.q.q.q.c.c.q.1.c.4.4.1.4././.;.E K ;.` /./.Y Y i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+Q..+Q.C.q.;.K z |.%+;+$+F+].$+d+G.F+F+G.G.s+o+s+s+s+s+s+s+s+s+o+o+k+k+k+d+5+5+|+|+^+^+;+;+#+#+Q.C.C.C.C.q.q.4.4.4.q.4.<.1.1._.4.;.;.K K @.;.=.T T /.i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+/.Q.#+Q.q.1.` T |.%+^+|+'.F+F+F+'.'.D+D+F+F+G.G.y+y+A+s+s+s+s+s+s+s+s+s+k+k+d+d+d+|+^+^+;+;+#+.+.+Q.Q.C.q.q.q.q.c.q.1._.1.4.<.4._.<.;.` r E =.;.Y Y ` 4.i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+4.C..+C.4.Y r T Z.^+;+^+].F+F+F+F+F+'.|.D+D+F+F+G.G.y+y+G.G.G.G.G.s+o+o+o+k+k+d+5+5+|+^+^+;+;+.+.+C.Q.C.q.q.q.c.4.c.c.4.1.1.1.4./.<.<.<.@.i z Y ` ` ` ` i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+c.C.q.q.q.;.r G.G.G.^+|+^+$+F+E+F+F+F+F+F+'.'.D+D+F+F+G.G.F+F+F+F+F+    o+o+s+k+d+5+5+5+^+^+^+#+#+Q.Q.C.C.C.q.q.q.q.c.4.c.4.4.4.1._.4._.1./.1 1 Y ;.` T T ;.i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+Q.C._.@.;.T i G.F+F+G.G.|+].F+F+E+F+E+F+F+F+F+'.|.D+D+F+F+D+D+r+D+D+r+c+  k+o+k+k+d+5+|+|+^+^+;+#+.+.+C.C.C.q.q.c.q.c.c.c.1.1.4.<.1.<.<.1._.;.1 T ` T T I T i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+q.C.1.Y I E p i E.r.F+E+F+G.r.F+F+F+E+F+F+E+F+F+F+F+'.'.D+D+D+r+D+D+r+r+c+  s+o+s+d+d+5+5+|+^+^+^+.+#+Q..+Q.q.C.q.q.4.c.4.c.4.4._.1._.1._.<.<./.b p I Y T T T =.i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+;.C.q.;.Y p i i z.#+G.F+D+D+F+F+G.G.F+F+u+E+F+F+E+F+F+F+F+'.{.D+D+D+r+D+D+r+c+  o+o+k+d+d+5+|+|+;+^+;+#+Q.Q.Q.q.C.C.q.q.4.4.c.<.c.4.4.4./._._.1._.@.i I ` ` T T z 4.i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+4.c.<.Y p b I T Z.;+G.F+D+D+D+D+F+E+G.G.F+F+E+F+F+E+F+F+F+F+F+'.,.D+D+r+r+r+c+  s+o+o+k+d+5+|+^+^+;+#+.+.+C.C.C.q.q.c.q.q.c.4.c.<.1._.4.4.<.<.<.4./.i z ` Y ` T i ` i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+;._.1./.I b b Y Z.#+#+;+G.F+D+D+D+D+D+F+F+G.G.F+F+t+F+F+E+F+E+F+F+F+'.{.D+r+D+n+  o+o+k+k+d+5+|+|+|+;+;+#+.+Q.Q.C.q.q.q.c.c.c.4.4.4.4._._.1._././.1./.` z Y ` ` T z z 4.i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+<.@./.;.p b T T o.#+;+;+r.F+D+D+D+D+D+D+D+F+E+G.G.F+F+E+F+F+F+E+F+F+F+F+'.D+r++ s+s+k+k+k+d+d+|+^+^+;+#+.+.+E.C.C.C.q.q.c.4.c.c.4.<.1.4.4./.4.<.<.<.<./.i I Y ` Y z z ;.i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+4._.=./.I 1 z z.#+#+;+^+G.F+'.].d.h D+D+D+r+D+F+F+G.G.F+F+E+n+F+n+F+n+F+'.r+c+  s+s+s+k+k+d+5+|+|+^+;+;+.+.+C.Q.q.C.q.q.q.c.c.c.4.4._.1.4./.1._._._._.<.K E I T =.z z T i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+` 1.4.=.@.I b T {.Z.Q.;+;+G.].E+n+$++.+ r+D+D+D+D+r+F+E+G.G.F+F+n+F+n+F+F+y.r+c+  s+o+k+k+k+d+5+|+|+^+;+;+;+Q..+C.C.q.q.q.c.c.<.c.c.4.4.<._.<./.<.<.<.<./.=.i z T T z i z <.i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+@.@./.` z i i T o.Z.Q..+.+'.F+F+F+n+$+L $ D+r+D+D+D+D+r+F+u+r.r.F+n+A+n+F+|.r+c+  s+s+o+k+5+d+5+|+|+^+;+#+#+Q..+Q.C.C.q.q.q.c.c.c.4.1.1.4.1.1._._._._.<././.z z z T T i b @.i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+` Y Y Y z 1 b {.l.Q..+;+;+].n+F+F+w+$+'.+ D+D+r+D+r+D+D+D+r+F+E++ F+n+F+F+].r+c+  s+o+o+o+d+d+5+|+^+^+;+.+.+.+Q.C.C.C.q.q.4.q.<.1.c.4.4.1._.<.<.<.<.<._.1.<.` i z T T z 1 I i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+` ` ` z {.=.z b {.q.Q.Q.;+;+$+$+n+F+n+$+h + D+D+D+r+D+r+D+r+D+D+c+  n+F+n+F+].c+  s+s+o+k+k+d+5+|+|+|+;+^+;+#+Q.Q.C.C.C.q.q.c.c.q.1.1._.4.4._.1./.4./.<.<._././.r r r I z b i 4.i+i+i+i+i+",
+"i+i+i+i+i+i+i+` /.` ` @.@.z b j.z.Q..+.+;+'.,.$+$+$+'.h $ D+r+D+D+r+D+r+D+D+r+c++ F+n+n+F+@+c+  s+o+k+k+k+d+5+5+|+^+;+;+.+#+Q.C.C.C.q.q.c.q.4.4.c.4.4.1.1.4./.4.<.<._./.<.<./.E i z p { . + <.i+i+i+i+i+",
+"i+i+i+i+i+i+i+;./.` <./.Y z {.o.E.Q.Q..+].f+'.'.,.h ,.'.r+D+r+D+r+D+r+r+D+r+D+D+c++ q+F+].r+c+  s+o+k+d+d+d+5+|+|+^+;+#+#+#+Q.C.q.C.q.q.c.q.c.c.<.4.4.<.1._._._._.<.<.1.<._././.p p / $ = { =.i+i+i+i+i+",
+"i+i+i+i+i+i+T [ 1 i ` ;.` p {.q.Q.Q.Q.$+n+f+I.].].|.].h.h q D+r+D+r+D+D+D+r+D+r+c++ n+F+|.c+  s+o+s+k+k+d+5+|+|+^+^+;+;+.+E.Q.Q.C.q.q.q.q.c.4.q.4.1.1.1.<.<.<.4.<.1._.<._.<.4./.i r E T z b T 4.i+i+i+i+",
+"i+i+i+i+i+i+4.1.T 1 + = [ i o.q.Q.C.Q.$+r+F+F+I.I.I.h.h.h.f+E D+r+D+r+r+r+D+r+D+c++ k+F+y.c+  o+o+k+k+d+5+|+|+|+;+^+#+.+#+.+Q.E.Q.C.q.4.q.c.<.c.4.4.4.4.4._._._.<.<./.<._.<._.<.I =.=.T p 1 z 4.i+i+i+i+",
+"i+i+i+i+i+i+1..+#+q.;.1 = / o.q.C.Q.Q.$+r+E+E+F+F+f+f+f+f+I. .D+r+r+D+r+D+r+D+r+c++ t+F+].c+  k+k+k+d+d+5+|+^+^+;+;+#+.+.+C.Q.C.q.q.q.q.c.q.4.c.c.4.<.4.1.4.<.<._._.<.1.<._.<./.Y ` @.T b [ 1 <.i+i+i+i+",
+"i+i+i+i+i+i+c.Q.Q.Q.q.;.z I q.C.C.Q.Q.$+r+r+r+E+E+F+E+f+I.h.F r+r+r+D+r+r+D+r+r+c+. n+F+a.  ].k+d+d+5+5+|+|+|+^+;+;+#+.+.+C.C.C.C.q.q.q.c.c.c.<.4.4._.4._._._.<.<._.<._.<._.4./.E ` @.z b 1 1 /.i+i+i+i+",
+"i+i+i+i+i+i+q.Q.Q.q.1.T 1 T o.C.C.C.C.$+r+f+r+r+r+E+E+I.I.h.,.D+D+r+r+r+D+r+D+D+c+  k+F+].  '.$+d+d+d+|+|+^+^+;+;+.+.+Q.E.Q.C.q.q.q.c.q.<.c.c.1.1.c.<.1.<.4.4.4._.<._.<._.<.<.4.E K ` z b 1 1 /.i+i+i+i+",
+"i+i+i+i+i+i+q.Q.C.1./.I i Y q.q.C.C.C.$+r+f+f+r+r+r+r+I.I.h.h r+r+D+r+r+r+r+r+r+r+c+  F+H.  ].i.d+|+                  Q.                  4.                  <._.<./.<./._._._.I K ` I i [ { /.i+i+i+i+",
+"i+i+i+i+i+i+C.E.1./.;.z b I C.q.q.C.C.$+r+f+f+f+r+r+r+I.h.h.K r+D+r+r+D+r+r+r+r+D+c+  F+a.  '.y.5+|+      n+          .+      n+          c.      n+          _.<._.<._.<.<./.<.E I K T p 1 { /.i+i+i+i+",
+"i+i+i+i+i+i+C.q./._./.z b p q.q.q.C.q.$+r+f+f+f+f+f+r+I.h.h.:.c+c+r+D+r+r+D+r+r+r+c+  F+].h ].].|+|+    +   n+        C.    +   n+        q.    +   n+        _.<._.<.1._.1.4.<.E E @.T p / = ;.i+i+i+i+",
+"i+i+i+i+i+i+q.<.1.4.;.z b p q.q.q.q.q.$+r+f+f+f+f+f+f+I.h.h.h $ $ c+h+D+r+r+r+r+r+c+  F+$ h ].'.;+^+        + n+n+n+  E.        + n+n+n+  <.        + n+n+n+  <./.<._.<.<.<./._.E I I z b = $ /.i+i+i+i+",
+"i+i+i+i+i+i+1.<.c.1.` i 1 i q.q.4.q.q.C.$+r+f+f+f+f+f+I.h.h.r ;+^+@ . c+c+r+r+r+r+c+  h + '.,.$+;+;+    n+  n++ +     C.    n+  n++ +     4.    n+  n++ +     <.1.<._._.<._.4./.E z z i / $ $ @.i+i+i+i+",
+"i+i+i+i+i+i+1.c.c.1.Y z b i C.q.q.q.q.q.$+r+f+f+f+f+f+I.*.h ;+;+^+^+;++ $ c+c+D+r+c+      ].-+|+;+;+    + n+n+        q.    + n+n+        1.    + n+n+        _.<.4.<.<.<.<./._.E r z 1 = $ $ /.i+i+i+i+",
+"i+i+i+i+i+i+q.q.q.q.@.z i b q.c.c.c.c.q.$+r+f+_ f+f+f+9 *.:.#+;+;+;+;+;+;++ + c+c+r+c+  h ].;+;+;+;+    + n++         C.    + n++         4.    + n++         _.<._._._.1.<.<.<.K i p 1 = $ $ ;.i+i+i+i+",
+"i+i+i+i+i+i+c.q.C.c./.Y p b q.q.4.q.c.q.$+r+f+9 f+f+] 9 h.r .+.+.+;+;+;+;+^+;++   c+c+  h ;+.+.+.+.+    + + n+        q.    + + n+        4.    + + n+        <._.<.<.<./.1.1.4.` r i 1 { = = /.i+i+i+i+",
+"i+i+i+i+i+i+c.C.C.q.4.` i 1 1.c.4.c.4.q.$+r+f+9 f+f+I.I.h.h Q..+Q..+.+;+.+;+;+;+.+    + .+;+.+#+.+Q.      +           C.      +           1.      +           <._.4._._./.4.<.<.` p p / = = { ;.i+i+i+i+",
+"i+i+i+i+i+i+<.q.C.q.;.z p i {.q.q.4.c.4.c.q.q.q.q.q.C.C.C.C.Q.Q.Q.Q.Q.Q..+.+.+.+#+.+;+.+Q.Q..+C.Q.Q.C.C.Q.Q.C.Q.C.Q.C.Q.4.4.1.c.c.4.4.4.<.1./.4.4.4.<._.<._.<._.<.<.<.<._.4.1.1.z p 1 { { $ { /.i+i+i+i+",
+"i+i+i+i+i+i+/.q.C.c.` z i i ` c.c.c.c.c.4.q.q.q.q.q.q.C.C.C.Q.Q.C.Q.Q.C.C..+Q.Q.Q.C.Q..+Q.Q.Q.Q.Q.Q.                  q.                  1.                  /._._.1.<._.4.4.<.r z b / { $ / <.i+i+i+i+",
+"i+i+i+i+i+i+@.c.c./.T I T z I q.c.4.c.4.c.4.c.c.q.q.q.q.x+x+B+C.C.Q.Q.Q.Q.C.Q.Q.Q.Q.Q.Q.Q.C.Q.C.C.q.      n+          C.      n+          _.      n+          <.<.<./.1.4._._.Y z p b 1 = $ b /.i+i+i+i+",
+"i+i+i+i+i+i+` q.4.` T T @.E T q.1.4.c.c.c.c.c.c.c.q.c.q.x+x+B+C.C.C.C.C.C.C.C.C.C.C.C.C.C.q.C.C.C.C.    +   n+        q.    +   n+        _.    +   n+        _._.4./._.<.4.<.E z 1 p / $ + z 1.i+i+i+i+",
+"i+i+i+i+i+i+;.;.` z z ;.;.Y z 4.c.4.4._.c.c.4.4.4.c.q.4.x+x+B+q.q.q.q.q.C.C.C.C.C.C.C.C.C.C.C.q.q.q.        + n+n+n+  4.        + n+n+n+  4.        + n+n+n+  <.<.<._.1.1._.=.z z b [ $ + $ @.q.i+i+i+i+",
+"i+i+i+i+i+i+i+Y I T T @.;.I z =.c.4.4.4.4.4.c.c.c.c.c.q.x+x+B+q.q.q.q.q.q.C.q.q.q.q.q.C.q.q.q.q.q.q.    n+  n++ +     c.    n+  n++ +     1.    n+  n++ +     4.1.<.4.4.<.<.E z z 1 { $ + { ;.i+i+i+i+i+",
+"i+i+i+i+i+i+i+I Y Y I T I I z {.1.<.4.1.4.4.4.c.4.4.c.4.x+x+B+4.q.q.q.q.q.x+q.q.q.q.q.q.q.q.q.c.q.c.    + n+n+        4.    + n+n+        <.    + n+n+        4./.4._.1.4.=.i z p / { $ & 1 /.i+i+i+i+i+",
+"i+i+i+i+i+i+i+Y ` Y T T I T K {.1.4.<.4.1.<.4.4.4.c.c.4.x+x+B+B+q.q.c.c.B+x+x+x+q.q.c.c.c.c.q.c.q.c.    + n++         <.    + n++         _.    + n++         _./.4.<.4.<.@.i i i 1 { $ + z <.i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+T T z z T ;.` =.` 1.4._.4.1.1.1.4.4.1.c.  x+x+B+q.4.4.4.  x+x+x+x+c.c.q.q.4.c.4.<.c.    + + n+        1.    + + n+        <.    + + n+        <.1.<.4.1.;.p i i b / = $ $ @.i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+T i i E /./.@.` ` ;.<.1.<.4.4.1.4.4.4.1.c.x+x+B+B+c.q.c.c.B+B+x+x+x+x+4.c.4.q.c.4.c.      +           <.      +           /.      +           4.1.4._.1.;.p 1 b i {   + [ /.i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+T z T T i [ 1 b r r 1.<.1.1.1.<.4.1.1.<.4.  x+x+B+B+B+1.c.    B+x+x+x+x+q.4.1.c.1.4._.4.q.<.1.1.<.c.1.c.<.4.1.1.1._.4.<._.<._.<._./._.<._._.c.1.4.1.4.4.b [ i 1 = = + $ z 4.i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i { $ = 1 Y I r r =._.<.<.1.1.4.<.1._.1.1.  x+x+x+B+B+B+B+B+B+x+x+x+x+x+c.4.4.c.4.                  c.                  <.                  1.<.1._.;.{ / i b { $   = @.i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i [ T 1.q.c.` i z p ;./.1.<.<._.1.4.4.4.4.1.  x+x+x+x+x+x+B+B+x+x+x+x+x+x+1.4.<.c.      n+          <.      n+          _.      n+          4.1.1.;./ { $   +     $ b /.i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+` I =.;.1.<.` I r i =._._.1.<._.1.1.<.1.<.<.4.    x+x+x+x+x+x+x+x+x+x+x+  4._.4.1.    +   n+        <.    +   n+        _.    +   n+        4.4._.E { I Y 1 $ $   $ ` 4.i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+I ` =.=.Y Y Y T b b ;.4.<.4.<.<.<.<.<.1.1.1.4.1.  $       x+x+x+x+    4._.4.4._.        + n+n+n+  <.        + n+n+n+  <.        + n+n+n+  1.1.@.{ [ z T b = + + 1 ;.i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+` T T I p T z p b b K ;./.4._._._.4.<.<.<.4.<.<.<.1.1.x+x+x+x+x+  1.4.<.4.<.<.<.    n+  n++ +     <.    n+  n++ +     <.    n+  n++ +     1.;./ / 1 p b { $   = ` 4.i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+z z i i b i 1 b b 1 E _.<.<.<.<.<._./.<.<.1.1.<.<.x+x+x+x+x+  <.<.<.1.<._.4.1.    + n+n+        1.    + n+n+        _.    + n+n+        =.1 1 1 i [ =     + 1 /.i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+b 1 1 1 p T z b 1 b @.=.4._._.<.<._._.<./.1.1.<.  x+x+x+  1.1.1.<._.<.<.<._.    + n++         _.    + n++         4.    + n++         @.b p i 1 = $   $ = ` i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+z { { b Y @.z 1 1 b b @.<.<.<.4._.<.<._.1.4.<./.<.      <.<.<.<._.<._._.4.<.    + + n+        <.    + + n+        _.    + + n+        [ z T i = $ $ + $ p ;.i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i b i Y ;.z b z z p p @._./.<._._.<.<._._.1.1._.<._.1./._._.<._.<.<.<._.<.      +           _.      +           _.      +           z Y Y 1 $ $   $ 1 ;.i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+Y z i I ` z b T ` E r I @._._.<.<._.;.<.<.<.<.<._.<.<.<.<.<._.<._._._.<.4._._.1.<._.4.<._.<.<._._.1._.<.1.4.1.4.4.4.4.<.4.1.{.E b T I T I { $   + = Y _.i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+T z i z i b Y @.@.K r z r _._.<.<._._._._./.<.1._._._._.<._.<.<.<./.<.<.<.<.<.<.1._.4.1._.<.<./.<.1./._._.4.1.<._.c.<.4.;./ b E ` Y z 1 $ $   = z _.i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+z i b / 1 r @.;.` ` r p r ;.4.<.<.<.<.<.<._.<.<.<.<.<.4.<._._._.<._._._._.<._.<.<.1.<.c.1./.4.4./.1.<.4.1.4.c.4.4.;.` b b I Y Y T 1 = $   $ i ;.i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+p [ { = i K /.;.;.T p i 1 ;.1./._.4.1.<././._./._.<._.<.<.<._.<.<.<.<._.<._./.<._.<.<.c.1.4.1.4.1.<.<._.4.c.4.` K / b I T T T p {     $ / ` i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+` i 1 { { z @.;.@.z i i 1 1 r /.<.<.<._.<.<.<.<.<._.<.<.1._.<._.<._.<.<.4.<.<._.4.1.1.<.<.c.4.4.c.c.q.q.c._.=.r b 1 z K T z i =   $   / ` 1.i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y b = = i z T T z b 1 1 z b 1 K _.<._._._.1./.<.4.<.<.<._.<.<.<.<._.<.4.1.<.4.<./.1.1.<.c.1.4.4._.4._.<.;.i b 1 1 Y Y I b = $     { Y /.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y 1 = = { i p b b = 1 ` z z p 1 =._.<./.<./._.<._./._.4.1.1._._.4.1././.1./.4.4.1.4.1.<.4.4.1.4./.;.p b p b [ z T i / = $ $ $ / Y /.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y b { $ { 1 / = + ` ;.@.K E z i 1 =.;.=.;.;./.<.<._./.4.4.4._._.1.1.4.1.4.1.4.1.4.1.1._._.;.@.r 1 p p I z p i [ $ +   + $ [ T _.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y b { + { { = $ /.;.;./.@.@.` z p b r K E =.=.;.<._._.4._.<.4.1.<.4.4._.<.1.<._./.@.E 1 b i z b r T z [ { { $ + $   $ 1 Y _.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+p = $ = + = Y =.@.@.;.;.;.;.` T K r p i K ` ;.;.;._.1.1.<.c._.1.4.1.4.;.=.E 1 b p I Y ` ;.z 1 E b / $   $   + = 1 ` i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i { +   / 1 i I K /.<./.;.;.;.@.` E r p b b 1 b 1 { = = = = = = = { { 1 p z Y ` @.@.@.@.I { 1 = = $ $   $ = p ` i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+T / + { { [ i z I ` Y @.;._.;.` I r z r b i i p z i 1 1 p p p z z I I Y ` ` @.@.Y I I z   =   +   + $ { T =.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y b { = { { [ 1 i p Y @./.;.` z I I z p p p z z z i Y {.Y ` @.@.Y Y Y ` ` ` T i 1 1 { $   $ $ $ = i Y ;.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+T b { = = { { [ b i z T z i r z z z z i T z T ;.;.;.@.;./.@.z z Y T I i b / = $   +     { [ T =.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+I 1 =   = = = [ [ 1 [ { [ 1 i z i i i i z T z z T Y Y z p p 1 1 [ { $ + $ + +   = / T =.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+T 1 { $ $ = $ $ $ $ = $ = { [ b b { / [ 1 1 b b b 1 { { { $ $ $ $ + $   $ b I Y i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+` T i { = $ + +   + $ $ $ $ = $ $ +   = = = $   + + +   + $ + + $ { p T Y ;.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+T I p / = $ + + + $ $ $ + + +   $ + + $ $ + $ $ $ $ = { p I T @.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y T I i 1 { { = $ + + + + + $   $ = = { [ i z T Y @.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+Y T I I T z z z z z I z z T T Y ` =.i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+",
+"i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+"};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.bmp
new file mode 100644 (file)
index 0000000..1b705b4
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Logo.xpm
new file mode 100644 (file)
index 0000000..a045f40
--- /dev/null
@@ -0,0 +1,355 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_Logo_xpm[] = {
+"100 100 252 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #787AD5",
+"Y.    c #726FC3",
+"Z.    c #686AA3",
+"`.    c #CACDF7",
+" +    c #444682",
+".+    c #4A5092",
+"++    c #888ECF",
+"@+    c #CFD2FC",
+"#+    c #D3D2F7",
+"$+    c #CCCFFA",
+"%+    c #404479",
+"&+    c #474688",
+"*+    c #9793D7",
+"=+    c #D8D7FC",
+"-+    c #DAD9FE",
+";+    c #D6D5FA",
+">+    c #9095D6",
+",+    c #DBDFFC",
+"'+    c #8C8ED6",
+")+    c #E1E1F9",
+"!+    c #E4E3FB",
+"~+    c #2B2D4A",
+"{+    c #EBE7F9",
+"]+    c #E8EDFD",
+"^+    c #484878",
+"/+    c #423F76",
+"(+    c #E5E4FC",
+"_+    c #252547",
+":+    c #545284",
+"<+    c #8685D3",
+"[+    c #EDEAFC",
+"}+    c #9B99EA",
+"|+    c #282340",
+"1+    c #353457",
+"2+    c #7777C4",
+"3+    c #5E5D9C",
+"4+    c #5A5FA2",
+"5+    c #6F73BF",
+"6+    c #08050A",
+"7+    c #DFDFF3",
+"8+    c #2A2E55",
+"9+    c #0A0B14",
+"0+    c #080D1A",
+"a+    c #1D1B32",
+"b+    c #000099",
+"c+    c #21233F",
+"d+    c #111122",
+"e+    c #6F73CC",
+"f+    c #1515A1",
+"g+    c #696CC2",
+"h+    c #2828A9",
+"i+    c #020299",
+"j+    c #9AA1E1",
+"k+    c #0B070D",
+"l+    c #363961",
+"m+    c #110D1B",
+"n+    c #9BA0ED",
+"o+    c #878AE2",
+"p+    c #484986",
+"q+    c #16152B",
+"r+    c #8E92DF",
+"s+    c #7275CE",
+"t+    c #050208",
+"u+    c #313260",
+"v+    c #15121F",
+"w+    c #09060C",
+"x+    c #1D203B",
+"y+    c #474B93",
+"z+    c #6368AC",
+"A+    c #32386C",
+"B+    c #13101D",
+"C+    c #535491",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.O.O.I.I.I.I.I.J.I.J.F.D.z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.A.F.J.I.I.O.T.U.V.V.U.W.T.T.T.I.K.I.K.F.D.x.p.o.d.. 6.i + <.g.z 4 5 X.Y.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y Z.5.f.p.y.D.E.I.K.V.T.T.T.`.`.`.`.U.W.W.U.T.T.T.K.J.E.D.z.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ). +.+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u Z.++f.o.x.D.F.J.K.T.V.`.U.@+@+U.@+U.@+#+#+T.$+`.T.V.I.I.D.y.z.p.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.%+&+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w  +O S.*+5.p.y.x.E.K.I.T.`.U.@+$+#+=+-+=+;+;+;+=+@+U.@+T.U.O.K.K.F.A.z.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $. +#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.S.>+e.p.x.z.D.J.I.T.T.U.$+#+#+#+,+,+,+-+-+-+=+;+=+#+@+`.W.I.I.I.E.A.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 '+5.b.p.y.D.J.I.I.W.`.`.#+=+=+,+=+,+)+)+)+)+,+-+-+#+$+`.`.W.O.I.E.D.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.x.p.z.D.I.T.U.T.$+@+;+=+,+,+!+)+)+,+)+,+,+)+,+=+;+U.U.`.V.I.E.D.y.p.f.d.i + r.@ ' z 4 4 # &., 2.% 2.% L.L.{ n $ n v $ L ~+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u Z.5.. d.x.x.y.F.K.T.$+W.#+#+,+-+!+)+)+{+{+!+]+)+)+)+,+,+=+;+U.`.W.T.J.D.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f * { L.( v ( ( { n - K 0 9 a ^+P a                     ",
+"                      # ' * (.P /+u ~.4.i 5.f.o.q.D.J.I.V.T.#+#+,+-+)+)+!+{+(+)+]+(+{+(+!+!+,+,+=+@+U.`.I.I.E.D.z.p.f.d.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.x.D.I.I.T.`.U.@+,+)+!+{+)+]+]+{+]+]+]+{+{+!+)+,+-+=+U.`.V.I.J.F.A.p.b.d.! i @ 3 3 B 4 X.# , % 2.f ( f L.L.M.M.].n n n V t.[ .+{.a 0 O %                 ",
+"                    % , ( @.R c H.e '+! ! 5.f.y.y.F.J.V.T.$+#+;+;+,+)+(+]+]+]+]+{+{+]+]+)+{+)+,+,+;+@+U.U.O.I.E.y.p.o.5.i ) r.2 ' ' # # &., , 2.2./ ( { { v n ( ( ( M.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H._+| :+<+A i c.5.f.q.y.E.I.T.T.`.#+;+,+!+{+(+[+{+]+]+]+{+[+]+(+!+)+,+=+;+@+`.T.O.I.D.A.p.f.}+! i N.3 }.}.5 # # , 2./ f * % % n v v n n { { ]./.O a /..+a !.O %               ",
+"                  ( : S ; k._+H.:+4.i 6.! b.f.x.D.E.I.I.W.`.#+#+,+,+)+]+[+]+[+{+[+]+]+]+]+{+!+,+)+=+#+W.V.O.J.F.y.p.o.! i ) <.~ z 7.4 # # , % / f % { { L.h $ M.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.|+[ -.y A 6.5.b.f.x.y.J.I.T.W.`.#+;+,+!+!+(+[+]+]+]+{+[+[+[+]+{+)+,+)+;+#+`.T.O.K.D.y.p.o.b.6.) <.' 3 4 4 # # & 2.2.2.% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.<+) i 6.d.f.o.A.E.K.I.U.U.U.=+-+,+)+]+]+[+]+[+]+]+]+]+(+(+!+,+=+;+@+U.V.O.I.E.A.q.o.! ! ! r.@ ' ' 4 # # & , ( f * { % ( n ( M.( ( ( ( ].#.1+g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.2+[.N.+ i c.d.p.q.F.K.I.W.`.#+;+!+!+!+{+[+{+]+]+[+{+[+]+]+{+)+,+-+;+$+`.T.J.K.F.A.p.o.. i A r.@ 3 ' X.# # # , , 2.% { * % v { n n n n ( $ ].P.!.k.^+0 |.| V             ",
+"                {.3.{.$.O d Y 3+-.@ A i ! ! o.p.y.y.I.I.T.`.U.#+;+,+!+(+]+]+[+{+]+]+]+{+{+)+!+,+=+#+$+U.T.I.E.D.y.p.f.. + ) <.g.}.B 5 # # % , ( / f % h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| 4+5+g.@ i . . f.o.z.A.J.I.V.`.#+;+=+,+(+(+[+]+]+{+[+[+[+)+(+!+)+,+#+#+`.V.T.I.F.A.x.o.5.5.! A @ 3 ' 8.4 # &.& , , / { { L.L.n v n n n ( ( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ G.O ~._.<+@ N.) i 5.e.o.y.y.J.I.O.T.`.#+;+-+)+(+{+[+[+]+]+]+(+]+)+!+-+#+#+$+W.T.O.I.E.D.q.o.}+! ) ) @ ' z 7.%.# & , 2.% / % % { v M.$ M.( ( n ].( { $ j.u !.k F 6+6+(           ",
+"              = ; {.( S 3.X 4+5+:.~ @ ) + . 5.f.y.y.E.K.K.W.`.`.#+#+,+,+,+(+(+(+(+]+)+)+,+)+;+;+#+`.T.I.I.J.D.y.p.f.. 6.y A ~ }.B 4 # # , , , f ( f % 7+7+n { n n ( ( n ( n M.^ X 8+t 9+0+a+C.          ",
+"            a H | ~.$.8 .+|._.T 3 g.[.<.i ! b.f.o.x.y.E.I.O.T.U.#+#+@+;+,+,+(+(+!+,+,+!+=+;+;+#+`.`.V.I.K.F.z.x.f.f.. 6.+ @ g.3 ' %.# 7+7+2./ 2./ 7+7+7+b+b+( h ( n n ( ].( { S u B.%+e k.| a %         ",
+"            h v e c+9+d+H } U B z 2 @ r.A . . b.f.z.y.y.J.K.T.T.`.U.;+#+-+,+=+=+!+,+;+=+,+;+#+$+U.T.T.I.J.y.y.p.d.! 6.i ) @ 2 z z 4 7+7+b+b+( , 7+7+7+b+b+n n n ( ( n ( n 7+7+7+M : C.a k q b %         ",
+"            * ) A 8.#.|+r q 2+8.}.g.~ [.) y ! 5.f.p.z.D.E.I.I.I.V.`.U.U.#+#+,+;+#+#+;+#+#+#+`.W.T.V.K.J.D.x.o.f.b.. y ) @ 7+7+7+7+7+7+7+7+, 2.* f b+b+b+v M.( ( n n ( 7+7+7+7+7+b+/.*.^+c H I (         ",
+"            , 3 ~ @ e+; O ).B 7.' ' 3 ~ ) i + ! d.d.p.y.z.y.K.I.T.T.`.`.U.W.#+U.#+#+#+`.`.U.T.V.I.I.J.D.y.x.p.e.c.. + 7+7+7+7+7+7+7+7+b+b+b+2.( % % { h n n n ( ( ].7+7+7+7+7+b+b+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.2+8.%.8.' 7+7+7+7+7+7+f.f.o.x.D.E.J.K.I.K.T.T.`.`.`.`.U.`.U.T.T.T.I.I.J.E.y.x.p.f.c.! + i g.b+b+b+7+7+7+b+b+( 2.2.f 7+7+( v ( h M.n n 7+].b+7+7+7+b+O 7+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7+7+7+7+b+b+7+7+7+b+f.f.p.y.y.y.J.I.K.I.O.I.T.T.I.V.I.V.I.I.I.J.J.D.D.y.f.7+7+7+! ) <.g.' z 7+7+7+7+b+, , 2.f 7+7+7+7+v n n 7+7+n ( b+( 7+7+f+7+7+ +b+H.~.|+a+;         ",
+"            ' z * S > o | =.7+7+7+b+b+b+b+@ 7+7+7+b+. d.f.o.A.y.y.F.J.J.K.K.J.K.I.I.I.I.I.I.J.F.D.x.f.7+7+7+b+b+b+y @ ~ 3 7+7+7+7+b+b+2.% 7+7+7+7+7+7+7+7+7+7+b+b+n 7+7+7+7+7+g+b+b+ +P X q F ;         ",
+"            ' , n n S O | 7+7+b+b+b+B 7.}.7+7+7+7+b+5.}+e.f.f.o.z.y.D.y.E.J.J.K.7+7+J.J.E.E.D.y.y.7+7+7+7+h+7++ N.@ ' 2 7+7+7+7+7+b+% 7+7+, b+b+b+7+7+7+7+b+b+b+( n 7+7+7+b+b+b+n...N ^+k t d+;         ",
+"            # ( v % _ 7+7+7+b+b+# 9.# 4 7.7+7+7+b+b++ . . d.5.o.p.z.q.y.y.7+7+7+7+7+b+y.z.y.z.7+7+7+7+h+7+7+7+b+@ ~ 7+7+B b+7+7+7+7+7+7+b+b+* { % ( b+b+b+b+n ( n ( n b+b+b+h n %+).%+g | s 9+;         ",
+"            v ( 2.* 7+7+7+b+b+# , # # 5 7+7+7+b+b+A y i . c.c.d.f.o.f.o.7+7+i+7+7+b+b+y.f.p.7+7+7+h+7+7+j+7+7+7+7+7+' b+b+7+7+7+7+7+b+b+b+% % { h.v n n ( ( n ( n ( n n ].n h $ Q.O O u a+0+k+*.        ",
+"            * , , { 7+7+b+b+8., & , # # 7+7+7+b+g.@ 7+7+7+7+! . d.e.5.7+7+7+7+7+b+b+f.f.7+7+7+7+7+7+7+b+b+7+7+7+7+b+b+4 B 7+7+7+b+b+b+f % { { ( h { ( ( ].n ( n ( n ( ( ( ( { n W 1.l+p d+m+9+;         ",
+"            , 5 # 7+7+7+b+c 5 , , , &.Y.# b+b+b+z 7+7+7+7+7+7+. 6.c.7+7+7+b+b+b+b+f.7+7+n+7+7+7+7+o+b+b+) V.b+b+b+b+3 4 # , b+b+b+, 2.* ( % * v M.v v ( ( n ( n ( n n n n ( ( L. +b u L d+9+9+;         ",
+"            , 5 4 7+7+7+b+| T & % , , # # # # 4 7+' b+b+7+7+7+b++ 7+7+7+7+7+7+7+7+7+. b+7+7+7+b+b+b+@ A r.@ ~ @ 3 z ' 4 # 8.7.X.# # &.# , 2.L.( { $ $ n n ( n ( n ( ( ( M.n v { p+P.} d ` m+d+;         ",
+"            f ' 7+7+7+7+b+K U , , 2./ , & # 5 7+4 b+7.' 7+7+f+7+7+A b+7+7+7+7+7+b+b+b+! ) b+b+b+r.r.3 A 2 2 3 ' ' 4 3 2 4 # 2.2./ f L.( * * , * v n ( ( n ( n ( n n n n M.M.( ( .+!.u t s m+q+;         ",
+"            ( B 5 7+7+7+7+Y 4+, , % 2.% , 7+# # b+%.4 7+7+7+7+r+b+b+2 @ b+b+b+b+b+) i ) 2 <.@ 2 2 ~ ' ' @ 3 ' z }.3 ' z % % 2.2.f % % * ( { $ L.% L.n n ( n ( n ( ( ( ( n v h.v j.1+_+F G 0+G x         ",
+"            ; 5 4 7+7+7+7+7+7+, 2.7+7+7+% , b+& # # s+7+7+b+b+b+' g.2 2 ' @ g.@ 3 ' 2 A 2 @ @ g.2 3 }.z ' 3 4 7.2 @ 7.%.# # , , 2.( * h.% { { { { f % n ( n ( n n n v ( ].L.h M.P.k. .q q+9+q (         ",
+"            #., # = 7+7+7+7+7+7+7+7+b+b+b+% , , & # # s+b+b+X.4 }.2 3 3 3 2 3 2 g.g.3 g.3 2 z ' 7.4 B 5 7.4 ' 3 %.4 2 %.& , , % , 2.% h { { ( ( ( ( { % n ( n ( ( ( $ v h v n  +g X  .|+s 9+I M.        ",
+"            i., h {.e b+b+b+b+b+b+b+b+/ 2./ 2.2., &.&.9.# # 4 %.4 4 4 ' 7.}.z ' }.' z ' 7.4 7.4 4 4 4 5 # # 4 7.& 4 5 # % , , f 2.* { % ( n n n n ( { % v ( n n n n $ n ( % ( n.O Y c a+9+6+l.*         ",
+"            6 = .+g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # # s+%.4 9.4 %.4 4 4 4 X.7.4 4 B %.B # # Y.# &.7., , &.# % , % * % { % % * v M.h ( ( { ( { f n ( ( ( ( n v h.{ ,.g J  .Z m+6+9+V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.# 9.# # # B 8.9.%.%.# B %.9.# # # # # # , Y.9.&.% & Y., 2.2.( * % ( / % L.{ { n ].( ].( ( L.* n n v ( M.h ( ( /+g k.R.s 9+6+F =           ",
+"              M 7 {.0 a a =.O 4+* ( { { { % * / / % 2.2., 2., , , # # # # # # # Y.# # # # # &., &.& , , , # 2.2., / 2./ f * % { * ( { { L.( ( ( ].( ].].{ % v h $ v { v h.: 1+l X c+q+9+6+c+S           ",
+"              v.{.v.H.P H.^+ +4+v % L.L.{ ( % % * / f f % 2./ 2., , , , , # & # &., & &., , , , , / % % & , / % , 2.f ( % { L.{ { % % { v n n ( { ( ( ( { ( { n $ v ( L.( V R J Y c+q+9+6+g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % % { / 2.% / 2.2.2.2.% 2., , , , , , , # % , % % 2., 2.# % / * / / % * { L.{ ( { { { % ( ( ( ].( { n ].( v / ( v ( h.{ 8 8+Y u I _+0+t+0+V             ",
+"                0 !.J ).^ C G./..+w ( { ( % L.{ { % % * * / f / / 2.2.2.f 2.f % % , / % 2.% , , % 2./ * # * % ( % 2.% ( * { * ( % L.{ h.v n ( ].( ( ( ].$ ( , M.h.L.{ +.^ 8+p  .~+a+6+6+Z ;             ",
+"                a g H.a l c+c+I R P.+.( v { { L.L.{ * ( L.% % { f f / / / % 2., , % f 2.2./ / 2.* % { % , L.{ * ( * * f ( L.v h.{ { % L.n ( n ( ].].{ ( n n / v h h.% M.c p | p F m+6+9+[ %             ",
+"                  ~.s 9+m+| Q M P.u+,.^ ( ( { { L.( { { { { % L.% { % % * 2.L.L.2.% * * { * % % * % { % , L.L.{ L.% ( / { L.L.% % ( { % n ( { ( ( ( n ( h M.f v ( h.n V ` t Y _+q+9+6+s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % L.% % { { { % { { % % * * * { % % % L.{ { ( * L.{ , { { { { { { ( % h.{ { { { { { ( n ( ].n ].( v n v 2.L.* v w t F v+6+6+w+6+6+| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { { { { { L.( % { L.( * { ( % ( % { { * ( * L.{ L.{ ( { , ( ( ( ( ( v { ( % L.L.% ( ( n ( ].( ( ( n $ ( n ( 2.L.h.].W F g Q R.9+t+6+9+$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { % { { ( % { { { * ( % L.{ L.{ % { { { ( / { v v v v ( ( n { ( { { n { ( n ( n n n h n v L.* * * v < F H k.0 Y r 6+6+c+;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { ( { { { { { ( { ( ( ( v ( % h $ $ $ n { ( ].{ ( ( ( ( n ( n ( ( M.n ( v { h * f h.w t x+E !. .s 9+6+m+.+%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( ( v ( ( ( ( ( v ( { v v ( n { { { { { ( ( { ( ( ].].n ].( n ( n n { ( v M.L.{ * f ,.R.L p Y p 0+6+t+6+_+;                   ",
+"                        | c+q R.k H.[ | L c < ,.{ n ].( ( n n ( $ v v v v v M.v v v v v ( n ( $ $ n ( ( ( L.( ( n ].( { ^ ( ( ( ( n ( n ( h ( v v v { L.% * C y+ .k } L d+9+6+6+d+{.                    ",
+"                        l a+a+| 3.#.O R. .E | y+( ( ( n n ( ( ].{ $ ( $ $ $ { $ $ ( ( ( ].( n { { ( n { n { 2.].( ( ].( ( { { n n ( n ( v n v v h ( % { f U N p l.^+u d+9+6+6+9+X ^                     ",
+"                          1+ .~.@.8 g d O k.X |.G.].M.( n n ( ( { ].{ { { ( ].{ ].].].( n ( ( ( n ( ( ( ( { ( * n ( ].{ ( ( ( ( n ( n $ ( n M.v h.{ * * m &+|+b 3.7 p 9+9+6+9+p _                       ",
+"                          7 b 1+^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( ( ( ].( ( ( ( ( n ( n ].].( n ].n { ( n % ( n ( ( ^ ].n n ( v h v v L.v L.( % { z+m.E H.M a l.F 9+6+6+r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( ( ].].].^ ].( { ^ n n n ( n ( ( ( n ( ( ( ( ^ ( { n % * ].( ( M.( v $ n n h v ( { * { v *.q c %+.+7 O _+9+6+6+0+[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { ( ( ( ( ( n ( ( ( ( ( n ( n n n ( n n n ].( n ( ( { ( 2.h.n { n $ v ( L.v L.* % % C N  .| ^.a v.a p 0+t+t+9+c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { { { ( ].{ n n n ( n ( ( ( n ( ( ( ( n ( ].n ( n ( ( 2.* % v h h.{ ( { % * * ]  +q | =.a e 0 j q+6+6+6+H i.                            ",
+"                                $.Y q G a+l.V C V [ u } q |+A+S ( ( ( ].( ( ( ( ( n ( n n n ( n n n n ( n ( ( n h v v ( ( 2.% 2., , Y., / ].6 P._+R.[ p+e l.Y s 6+6+6+t {.{                             ",
+"                                  3.| s d+I k.0 0.!.| |+q !.Y R.&+].( n ].n n n ( n ( ( ( n ( ( ( ( n ( v v ( { $ n v h.( * { L.L.{ L.v n w | | d |+Q $.O c s 6+6+6+F 7 S                               ",
+"                                    Q c+m+d+F } |._+c d+d /.[ b } |+6 ].( $ ( $ n ( n n n M.v n n n h v $ $ v M.{ L.v L.* ( % v { L.n 8 j c k c K l ^.~.t 0+9+9+9+x+3.S                                 ",
+"                                      Q  .F 0+` c+a+r 9+3.w y+y+%+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { L.v h v L.v { n ^ #.y+u._+} X ^.X |.~.H B+k+6+6+9+a+a ^                                   ",
+"                                        3.| ` 9+G F m+9+S x w 8 G./.N l.R _+A+&+'.< 6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` 9+6+k+6+9+c+7 ^                                     ",
+"                                            u B+0+0+6+s 3.< #.#.; - ; #..+^+%+P.|.Y  +N #.= ^ n v v ( * v { L.h.h C < '.|+| X M Q G.#.[ R.M _+q+0+6+t+6+6+0+ .{.                                        ",
+"                                              b F k+t+t R.1+^.v.= $ n 8 _ _ V {.%+B.R | | |+_+L F d+B+B+d+d+d+d+s F R.~.[ Q /.< _ i._ a s  .r m+9+9+6+6+r ~..+                                          ",
+"                                                a a+6+s q+Z 8+k.e {.$._ ^ n = {.=.1.[ j.8+} u |.b ~.c+q t.k |.[ [ ^.P a $..+_ : 3.o O l.w+m+9+6+6+6+9+F 0 _                                             ",
+"                                                  3.| a+s q+a+Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.C+7 C+V : @.@.v..+9 7 a t._+_+G 6+t+6+9+9+d+I 3.;                                               ",
+"                                                      0 | ` d+d+` F |+| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).1+ .a+s 9+6+6+6+6+r p e #.                                                  ",
+"                                                          H.p 0+9+m+0+d+a+p c+a+F H q t.b t.1+J } O 0 l.O e @.3.l.} u | _+Z F 0+k+k+6+6+6+0+t H./.                                                      ",
+"                                                              H.R.` 9+9+m+m+m+9+0+B+B+r F F | _+a+t a+q |+| | _+L a+F d+0+6+k+9+6+w+6+9+|+^.$.                                                          ",
+"                                                                $.H.t.a+d+9+6+k+t+9+9+9+9+0+d+0+9+k+9+0+r 0+0+9+9+k+6+6+6+9+k+k+0+F 8+e $.;                                                             ",
+"                                                                      a O } t B+6+t+6+6+9+9+k+k+6+6+6+9+k+6+6+k+k+9+w+k+9+r F 8+H.a V                                                                   ",
+"                                                                            3.H.H.I q G d+0+9+6+6+6+6+6+9+6+9+0+s F p 8+[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.bmp
new file mode 100644 (file)
index 0000000..d737176
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_ManualRegistration.xpm
new file mode 100644 (file)
index 0000000..5aa6935
--- /dev/null
@@ -0,0 +1,738 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_ManualRegistration_xpm[] = {
+"100 100 635 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #5C5C5C",
+"M.    c #474747",
+"N.    c #A3A3A3",
+"O.    c #E2E2E2",
+"P.    c #AEAEAE",
+"Q.    c #000084",
+"R.    c #0000E1",
+"S.    c #0000FA",
+"T.    c #0000E5",
+"U.    c #6763BD",
+"V.    c #635FB8",
+"W.    c #888CE1",
+"X.    c #C3C2F4",
+"Y.    c #282828",
+"Z.    c #888888",
+"`.    c #CECECE",
+" +    c #CDCDCD",
+".+    c #C7C7C7",
+"++    c #000091",
+"@+    c #0000FD",
+"#+    c #0000C5",
+"$+    c #373766",
+"%+    c #3B4074",
+"&+    c #232344",
+"*+    c #656396",
+"=+    c #C5C4F5",
+"-+    c #CFCAF7",
+";+    c #C7C6F8",
+">+    c #CAC8FA",
+",+    c #525252",
+"'+    c #949494",
+")+    c #7E7E7E",
+"!+    c #E5E5E5",
+"~+    c #9F9F9F",
+"{+    c #4C4C4C",
+"]+    c #000087",
+"^+    c #0000DE",
+"/+    c #0000FF",
+"(+    c #0000D0",
+"_+    c #726FC3",
+":+    c #686AA3",
+"<+    c #CACDF7",
+"[+    c #5F5F5F",
+"}+    c #9C9C9C",
+"|+    c #777777",
+"1+    c #E6E6E6",
+"2+    c #AFAFAF",
+"3+    c #242424",
+"4+    c #424242",
+"5+    c #0000C3",
+"6+    c #0000EE",
+"7+    c #000025",
+"8+    c #00008A",
+"9+    c #0000D5",
+"0+    c #0000FE",
+"a+    c #444682",
+"b+    c #4A5092",
+"c+    c #888ECF",
+"d+    c #CFD2FC",
+"e+    c #D3D2F7",
+"f+    c #CCCFFA",
+"g+    c #A1A1A1",
+"h+    c #919191",
+"i+    c #848484",
+"j+    c #8F8F8F",
+"k+    c #404040",
+"l+    c #0000B5",
+"m+    c #0000D3",
+"n+    c #0000FC",
+"o+    c #000036",
+"p+    c #00009E",
+"q+    c #0000DC",
+"r+    c #0000B7",
+"s+    c #404479",
+"t+    c #474688",
+"u+    c #9793D7",
+"v+    c #D8D7FC",
+"w+    c #DAD9FE",
+"x+    c #D6D5FA",
+"y+    c #6D6D6D",
+"z+    c #626262",
+"A+    c #B9B9B9",
+"B+    c #D9D9D9",
+"C+    c #A7A7A7",
+"D+    c #353535",
+"E+    c #000000",
+"F+    c #000096",
+"G+    c #0000C6",
+"H+    c #0000ED",
+"I+    c #00006B",
+"J+    c #0000A5",
+"K+    c #0000E8",
+"L+    c #0000F5",
+"M+    c #000063",
+"N+    c #9095D6",
+"O+    c #DBDFFC",
+"P+    c #6B6B6B",
+"Q+    c #717171",
+"R+    c #C6C6C6",
+"S+    c #D7D7D7",
+"T+    c #969696",
+"U+    c #1C1C1C",
+"V+    c #0000AD",
+"W+    c #0000F6",
+"X+    c #000092",
+"Y+    c #0000BA",
+"Z+    c #0000D8",
+"`+    c #8C8ED6",
+" @    c #E1E1F9",
+".@    c #656565",
+"+@    c #696969",
+"@@    c #D8D8D8",
+"#@    c #E1E1E1",
+"$@    c #929292",
+"%@    c #7F7F7F",
+"&@    c #000052",
+"*@    c #0000D2",
+"=@    c #000085",
+"-@    c #0000E6",
+";@    c #00003C",
+">@    c #E4E3FB",
+",@    c #585858",
+"'@    c #D1D1D1",
+")@    c #C8C8C8",
+"!@    c #616161",
+"~@    c #0000BC",
+"{@    c #0000DD",
+"]@    c #0000FB",
+"^@    c #00009B",
+"/@    c #0000C8",
+"(@    c #0000B9",
+"_@    c #2B2D4A",
+":@    c #EBE7F9",
+"<@    c #E8EDFD",
+"[@    c #838383",
+"}@    c #3E3E3E",
+"|@    c #BABABA",
+"1@    c #858585",
+"2@    c #141414",
+"3@    c #000048",
+"4@    c #0000D1",
+"5@    c #0000E0",
+"6@    c #000042",
+"7@    c #0000A4",
+"8@    c #484878",
+"9@    c #423F76",
+"0@    c #E5E4FC",
+"a@    c #898989",
+"b@    c #010101",
+"c@    c #C2C2C2",
+"d@    c #FAFAFA",
+"e@    c #8C8C8C",
+"f@    c #00007B",
+"g@    c #000054",
+"h@    c #00009C",
+"i@    c #0000F7",
+"j@    c #0000E2",
+"k@    c #000080",
+"l@    c #383838",
+"m@    c #939393",
+"n@    c #434343",
+"o@    c #999999",
+"p@    c #DFDFDF",
+"q@    c #0000AE",
+"r@    c #000033",
+"s@    c #0000A7",
+"t@    c #000059",
+"u@    c #787AD5",
+"v@    c #4A4A4A",
+"w@    c #9E9E9E",
+"x@    c #C0C0C0",
+"y@    c #FCFCFC",
+"z@    c #A9A9A9",
+"A@    c #CFCFCF",
+"B@    c #B0B0B0",
+"C@    c #0000EF",
+"D@    c #0000E9",
+"E@    c #000021",
+"F@    c #00008E",
+"G@    c #0000CE",
+"H@    c #252547",
+"I@    c #545284",
+"J@    c #8685D3",
+"K@    c #EDEAFC",
+"L@    c #6C6C6C",
+"M@    c #D0D0D0",
+"N@    c #F6F6F6",
+"O@    c #727272",
+"P@    c #B6B6B6",
+"Q@    c #F3F3F3",
+"R@    c #0000EB",
+"S@    c #0000E7",
+"T@    c #000051",
+"U@    c #000068",
+"V@    c #0000E4",
+"W@    c #8B8B8B",
+"X@    c #979797",
+"Y@    c #E8E8E8",
+"Z@    c #D3D3D3",
+"`@    c #A0A0A0",
+" #    c #FDFDFD",
+".#    c #414141",
+"+#    c #0000EA",
+"@#    c #00006C",
+"##    c #0000A0",
+"$#    c #000056",
+"%#    c #282340",
+"&#    c #F5F5F5",
+"*#    c #7A7A7A",
+"=#    c #F2F2F2",
+"-#    c #373737",
+";#    c #0000D7",
+">#    c #00007C",
+",#    c #0000D6",
+"'#    c #757575",
+")#    c #C4C4C4",
+"!#    c #E0E0E0",
+"~#    c #7C7C7C",
+"{#    c #ACACAC",
+"]#    c #0000DA",
+"^#    c #00009D",
+"/#    c #000061",
+"(#    c #0000A6",
+"_#    c #000069",
+":#    c #353457",
+"<#    c #7777C4",
+"[#    c #818181",
+"}#    c #A4A4A4",
+"|#    c #F0F0F0",
+"1#    c #CACACA",
+"2#    c #0000C4",
+"3#    c #747474",
+"4#    c #000060",
+"5#    c #0000C2",
+"6#    c #5E5D9C",
+"7#    c #828282",
+"8#    c #DDDDDD",
+"9#    c #9A9A9A",
+"0#    c #B5B5B5",
+"a#    c #171717",
+"b#    c #000024",
+"c#    c #5A5FA2",
+"d#    c #6F73BF",
+"e#    c #959595",
+"f#    c #B1B1B1",
+"g#    c #F1F1F1",
+"h#    c #CCCCCC",
+"i#    c #0000CF",
+"j#    c #BEBEBE",
+"k#    c #00005F",
+"l#    c #000002",
+"m#    c #0000BB",
+"n#    c #0000F9",
+"o#    c #BBBBBB",
+"p#    c #878787",
+"q#    c #B2B2B2",
+"r#    c #0000CB",
+"s#    c #0000E3",
+"t#    c #08050A",
+"u#    c #808080",
+"v#    c #B7B7B7",
+"w#    c #0000DB",
+"x#    c #8E8E8E",
+"y#    c #BFBFBF",
+"z#    c #222222",
+"A#    c #00005D",
+"B#    c #0000F8",
+"C#    c #2A2E55",
+"D#    c #0A0B14",
+"E#    c #080D1A",
+"F#    c #1D1B32",
+"G#    c #7D7D7D",
+"H#    c #A2A2A2",
+"I#    c #0000EC",
+"J#    c #545454",
+"K#    c #0000F3",
+"L#    c #0000F1",
+"M#    c #21233F",
+"N#    c #111122",
+"O#    c #00008C",
+"P#    c #707070",
+"Q#    c #9D9D9D",
+"R#    c #00006F",
+"S#    c #00009A",
+"T#    c #5D5D5D",
+"U#    c #B8B8B8",
+"V#    c #000077",
+"W#    c #0000B3",
+"X#    c #000055",
+"Y#    c #6F73CC",
+"Z#    c #0000AA",
+"`#    c #6A6A6A",
+" $    c #000082",
+".$    c #4E4E4E",
+"+$    c #000067",
+"@$    c #676767",
+"#$    c #000094",
+"$$    c #252525",
+"%$    c #686868",
+"&$    c #313131",
+"*$    c #000099",
+"=$    c #0000AF",
+"-$    c #000072",
+";$    c #7B7B7B",
+">$    c #000014",
+",$    c #4B4B4B",
+"'$    c #1B1B1B",
+")$    c #000053",
+"!$    c #0000D4",
+"~$    c #0000C9",
+"{$    c #0000A9",
+"]$    c #636363",
+"^$    c #333333",
+"/$    c #000081",
+"($    c #000070",
+"_$    c #000083",
+":$    c #000062",
+"<$    c #9B99EA",
+"[$    c #00008D",
+"}$    c #0000CC",
+"|$    c #0000D9",
+"1$    c #0000AC",
+"2$    c #00007D",
+"3$    c #0000B8",
+"4$    c #000071",
+"5$    c #000095",
+"6$    c #00007E",
+"7$    c #000029",
+"8$    c #000026",
+"9$    c #0000A8",
+"0$    c #5B5B5B",
+"a$    c #0000CA",
+"b$    c #00002F",
+"c$    c #0B070D",
+"d$    c #0000B4",
+"e$    c #000046",
+"f$    c #1A1A1A",
+"g$    c #989898",
+"h$    c #D2D2D2",
+"i$    c #000098",
+"j$    c #363961",
+"k$    c #110D1B",
+"l$    c #0000C0",
+"m$    c #000073",
+"n$    c #4F4F4F",
+"o$    c #0000BD",
+"p$    c #0000B0",
+"q$    c #00003A",
+"r$    c #767676",
+"s$    c #2E2E2E",
+"t$    c #0000BE",
+"u$    c #484986",
+"v$    c #0000CD",
+"w$    c #00004A",
+"x$    c #0000B1",
+"y$    c #16152B",
+"z$    c #0000BF",
+"A$    c #E4E4E4",
+"B$    c #ABABAB",
+"C$    c #535491",
+"D$    c #7275CE",
+"E$    c #0000DF",
+"F$    c #CBCBCB",
+"G$    c #A5A5A5",
+"H$    c #000038",
+"I$    c #0000A3",
+"J$    c #000032",
+"K$    c #000090",
+"L$    c #232323",
+"M$    c #464646",
+"N$    c #484848",
+"O$    c #363636",
+"P$    c #646464",
+"Q$    c #595959",
+"R$    c #00005C",
+"S$    c #0000C1",
+"T$    c #C9C9C9",
+"U$    c #AAAAAA",
+"V$    c #B4B4B4",
+"W$    c #000005",
+"X$    c #6F6F6F",
+"Y$    c #C5C5C5",
+"Z$    c #D5D5D5",
+"`$    c #5E5E5E",
+" %    c #0C0C0C",
+".%    c #00007A",
+"+%    c #EAEAEA",
+"@%    c #BCBCBC",
+"#%    c #FBFBFB",
+"$%    c #000023",
+"%%    c #C3C3C3",
+"&%    c #606060",
+"*%    c #000065",
+"=%    c #0000AB",
+"-%    c #0000F2",
+";%    c #FEFEFE",
+">%    c #C1C1C1",
+",%    c #0000B6",
+"'%    c #D4D4D4",
+")%    c #EBEBEB",
+"!%    c #3F3F3F",
+"~%    c #050208",
+"{%    c #0000C7",
+"]%    c #000039",
+"^%    c #00009F",
+"/%    c #FFFFFF",
+"(%    c #E9E9E9",
+"_%    c #DADADA",
+":%    c #000076",
+"<%    c #00002A",
+"[%    c #00008F",
+"}%    c #000097",
+"|%    c #797979",
+"1%    c #313260",
+"2%    c #000050",
+"3%    c #9B9B9B",
+"4%    c #000079",
+"5%    c #444444",
+"6%    c #E3E3E3",
+"7%    c #454545",
+"8%    c #15121F",
+"9%    c #09060C",
+"0%    c #00006A",
+"a%    c #0000A2",
+"b%    c #000058",
+"c%    c #000078",
+"d%    c #8A8A8A",
+"e%    c #393939",
+"f%    c #00004C",
+"g%    c #0000F4",
+"h%    c #0000B2",
+"i%    c #0000F0",
+"j%    c #000093",
+"k%    c #ADADAD",
+"l%    c #E7E7E7",
+"m%    c #535353",
+"n%    c #00004B",
+"o%    c #00006E",
+"p%    c #8D8D8D",
+"q%    c #868686",
+"r%    c #1D203B",
+"s%    c #00008B",
+"t%    c #000089",
+"u%    c #0000A1",
+"v%    c #00001A",
+"w%    c #00007F",
+"x%    c #909090",
+"y%    c #EFEFEF",
+"z%    c #00005A",
+"A%    c #474B93",
+"B%    c #000011",
+"C%    c #A6A6A6",
+"D%    c #00000E",
+"E%    c #00004D",
+"F%    c #6368AC",
+"G%    c #D6D6D6",
+"H%    c #00006D",
+"I%    c #000074",
+"J%    c #A8A8A8",
+"K%    c #000045",
+"L%    c #B3B3B3",
+"M%    c #00005E",
+"N%    c #000088",
+"O%    c #32386C",
+"P%    c #000043",
+"Q%    c #343434",
+"R%    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.L.M.N.O.P.d.c.! ! + r.g.' z Q.R.S.T.& &.% 2.% U.( v ^ u.Y =.7 8 # # V._ (                                 ",
+"                                  ~ W.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.X.X.I.I.I.I.I.J.I.L.Y.Z.`. +.+5.. 5.! ) [.' 2 ++T.@+#+# & % , 2.h.h n v ( W $+%+/.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } &+*+5.f.o.z.A.F.J.I.I.X.=+-+;+;+-+>+=+=+=+I.K.,+'+)+ +!+~+{+d.. 6.i + <.g.]+^+/+(+_+&.& 2./ / h.% V.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y :+5.f.p.y.D.E.I.K.;+=+=+=+<+<+<+<+-+>+>+-+=+=+[+}+|+1+2+3+4+f.e.]+5+6+/+7+8+9+0+#+# & , 2.% 2.h.{ % h n ].V ).a+b+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u :+c+f.o.x.D.F.J.K.=+;+<+-+d+d+-+d+-+d+e+e+=+f+<+|+g+h+!+i+j+k+p.f.l+m+n+/+o+p+q+@+r+# # , , , f 2.% v v h V.].#.s+t+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w a+O *+u+5.p.y.x.E.K.I.=+<+-+d+f+e+v+w+v+x+x+x+v+d+-+d+y+z+A+B+y+C+D+E+F+G+H+/+/+I+J+K+L+M+5 # # , % % , % ( v v n h w < $.a+#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.*+N+e.p.x.z.D.J.I.=+=+-+f+e+e+e+O+O+O+w+w+w+v+x+v+e+P+Q+R+S+j+T+U+L.V+(+W+/+/+X+Y+Z+V+E+4 # , , , 2.f { * U.( U.n ( C 1 1.'.: < v.7 {.U.                      ",
+"                          % ' @ 4 U.Q $+0 `+5.b.p.y.D.J.I.I.>+<+<+e+v+v+O+v+O+ @ @ @ @O+w+w+e+.@+@@@#@$@%@L.&@l+*@K+0+=@Y+-@Z+;@8.4 # # , 2./ 2.% * h.{ U.$ ( V.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= $+J w.5.f.x.p.z.D.I.=+-+=+f+d+x+v+O+O+>@ @ @O+ @O+O+ @O+v+i+,@'@)@T+!@L.=@~@{@]@/+^@/@n+(@' z 4 4 # &., 2.% 2.% U.U.{ n $ n v $ L _@3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u :+5.. d.x.x.y.F.K.=+f+>+e+e+O+w+>@ @ @:@:@>@<@ @ @ @O+O+[@}@|@B+1@2@3@V+4@5@/+6@^@6+/+7@' ' 8.5 # &., , 2.f * { U.( v ( ( { n - K 0 9 a 8@P a                     ",
+"                      # ' * (.P 9@u ~.4.i 5.f.o.q.D.J.I.;+=+e+e+O+w+ @ @>@:@0@ @<@0@:@0@>@>@O+a@b@i+c@d@e@f@5+6+0+]@g@h@i@j@k@@ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.x.D.I.I.=+<+-+d+O+ @>@:@ @<@<@:@<@<@<@:@:@>@l@m@N.n@o@p@'@q@9+^+i@/+r@s@S./+t@3 3 B 4 u@# , % 2.f ( f U.U.V.V.].n n n V t.[ b+{.a 0 O %                 ",
+"                    % , ( @.R c H.e `+! ! 5.f.y.y.F.J.;+=+f+e+x+x+O+ @0@<@<@<@<@:@:@<@<@ @:@v@w@x@y@,+z@A@B@*@C@/+D@E@F@G@/+K+2 ' ' # # &., , 2.2./ ( { { v n ( ( ( V.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H.H@| I@J@A i c.5.f.q.y.E.I.=+=+<+e+x+O+>@:@0@K@:@<@<@<@:@K@<@0@>@L@~+M@N@4+O@P@Q@4+/+R@S@T@U@Y+S.V@3 }.}.5 # # , 2./ f * % % n v v n n { { ]./.O a /.b+a !.O %               ",
+"                  ( : S ; k.H@H.I@4.i 6.! b.f.x.D.E.I.I.>+<+e+e+O+O+ @<@K@<@K@:@K@<@<@<@<@:@W@X@Y@p@Z@z+`@ #.#/++#5+o.@###S@R@$#z 7.4 # # , % / f % { { U.h $ V.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  U.^ i.x l.%#[ -.y A 6.5.b.f.x.y.J.I.=+>+<+e+x+O+>@>@0@K@<@<@<@:@K@K@K@<@.@}+2+&#1+P@*#B@=#-#*@;#p.o.>#7@,#/+s@3 4 4 # # & 2.2.2.% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.J@) i 6.d.f.o.A.E.K.I.-+-+-+v+w+O+ @<@<@K@<@K@<@<@<@<@0@'#C+)# #!#e@~#{#&#,+]#^#q.o./#(#(+/+_#' ' 4 # # & , ( f * { % ( n ( V.( ( ( ( ].#.:#g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.<#[.W.+ i c.d.p.q.F.K.I.>+<+e+x+>@>@>@:@K@:@<@<@K@:@K@<@<@[#}#1+|#1#2#3#`@Y@,+l+A.p.o.4#5#L+/+@ 3 ' u@# # # , , 2.% { * % v { n n n n ( $ ].$+!.k.8@0 |.| V             ",
+"                {.3.{.$.O d Y 6#-.@ A i ! ! o.p.y.y.I.I.=+<+-+e+x+O+>@0@<@<@K@:@<@<@<@:@:@7#{#8#x@9#K+%@`@0#a#b#y.p.f.q@9+/+K+g.}.B 5 # # % , ( / f % h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| c#d#g.@ i . . f.o.z.A.J.I.;+<+e+x+v+O+0@0@K@<@<@:@K@K@K@ @0@e#f#g#h#i#D@1@j#j#k#A.x.o.l#m#*@n#Y+3 ' 8.4 # &.& , , / { { U.U.n v n n n ( ( n $ ].$+!.j.=.k.Y } U.          ",
+"              {.= {.{._ G.O ~._.J@@ W.) i 5.e.o.y.y.J.I.X.=+<+e+x+w+ @0@:@K@K@<@<@<@0@<@L@}+o#|#*@-@]@p#q#|@E.D.q.o.7@r#s#S.@ ' z 7.%.# & , 2.% / % % { v V.$ V.( ( n ].( { $ j.u !.k F t#t#(           ",
+"              = ; {.( S 3.X c#d#:.~ @ ) + . 5.f.y.y.E.K.K.>+<+<+e+e+O+O+O+0@0@0@0@<@ @ @u#}+v#O.5@w#]@x#y#o#z#y.p.A#m#q+B#V+~ }.B 4 # # , , , f ( f % ( h.n { n n ( ( n ( n V.^ X C#t D#E#F#C.          ",
+"            a H | ~.$.8 b+|._.T 3 g.[.<.i ! b.f.o.x.y.E.I.X.=+-+e+e+d+x+O+O+0@0@>@O+O+>@G#H#R+(+R.I#i@u#v#P.J#x.f.X+r#K#L#@ g.3 ' %.# # , 2./ 2./ { { h.( ( ( h ( n n ( ].( { S u B.s+e k.| a %         ",
+"            h v e M#D#N#H } U B z 2 @ r.A . . b.f.z.y.y.J.K.=+=+<+-+x+e+w+O+v+v+>@O+x+v+j+}#O#]#0+H+5+P#g+Q#[#p.E@l+]#/+5+@ 2 z z 4 # , , 2.( , % % U.h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.%#r q <#8.}.g.~ [.) y ! 5.f.p.z.D.E.I.I.I.;+<+-+-+e+e+O+x+e+e+x+e+H#R#w#/+/+T.S#T#u#U#m@f.V#W#{@S.X#2 3 4 4 5 # # &., 2.* f { { h v V.( ( n n ( { ( ].( V.P /.*.8@c H I (         ",
+"            , 3 ~ @ Y#; O ).B 7.' ' 3 ~ ) i + ! d.d.p.y.z.y.K.I.=+=+<+<+-+>+e+-+e+e+e+<+g+]#s#W+W+s@Z#.#`#N.x#[+ $q@G+]#4#' }.4 4 # # , , 2.2.( % % { h n n n ( ( ].( n ( n n { s+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.<#8.%.8.' ~ 2 @ ! . 5.f.f.o.x.D.E.J.K.I.K.=+=+<+<+<+<+-+<+.$+$C@K#n+@$M+#$~@$$.$%$&$*$=$/@R@-$3 ' 4 # # , # ( 2.2.f { * ( v ( h V.n n ( ].( { ( ( ( O t+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.f.p.y.y.y.J.I.K.I.X.I.=+=+I.;+I.;$^@9+i@@+/@X+>$e@,$.$J#'$)$O##+r+' z 8.4 # # , , , 2.f % % h.v v n n ( ( n ( ].( n n n { =.a+N H.~.%#F#;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. d.f.o.A.y.y.F.J.J.K.K.J.K.I.I.I.z#5+!$/+~${$I+a@e#P#]$^$/$($_$>#:$3 4 4 9.# , , 2.% f % * { ( h $ ( ( n n ( n ( ].( ( V.( %+P a+P X q F ;         ",
+"            ' , n n S O | X # # Y#5 B 7.}.3 @ W.+ + 5.<$e.f.f.o.z.y.D.y.E.J.J.K.J.K.J.[$}$|$/+*@^@t@~#O.f@H+!$G+1$2$@#2 ' 4 4 # # , % , ( , % ( * { v v v V.( n ( n ( n n { n $ n...N 8@k t N#;         ",
+"            # ( v % _ b  .|.9.Y## 9.# 4 7.' @ 2 A i + . . d.5.o.p.z.q.y.y.D.E.y.F.y.F.{$G@D@/+3$4$Q+`@p#Y+5$/@6$t@7$3 z B %.# # # , , , 2.* * { % ( $ $ $ { n ( n ( n ( ( ( h n s+).s+g | s D#;         ",
+"            v ( 2.* {.:#| u T # , # # 5 4 7.3 g.~ A y i . c.c.d.f.o.f.o.p.y.y.x.y.y.8$V@5@K#n#9$g@0$'+z@}$a$b$i r.~ ' }.4 4 # , , 2.% 2.f % % { h.v n n ( ( n ( n ( n n ].n h $ %+O O u F#E#c$*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ W.) y y ! . d.e.5.f.f.e.o.o.f.o.*${@D@S.w#d$e$f$g$h$(@/@i$<.A ' ' 4 B # # , # ( 2.f % { { ( h { ( ( ].n ( n ( n ( ( ( ( { n W 1.j$p N#k$D#;         ",
+"            , 5 # , _ g Y c 5 , , , &._+# %.u@B z 2 ~ 2 + ) y . 6.c.c.<$b.b.d.f.f.f.l$]@L#/+D@m$n$^$.@ +o$0+i#2 @ g.3 4 # , , % & , 2.* ( % * v V.v v ( ( n ( n ( n n n n ( ( U.a+b u L N#D#D#;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A W.i y + y ! ! ! 5.b.. . . r#j@]@/+p$q$,+r$s$y#t$n+,#@ 3 z ' 4 # 8.7.u@# # &.# , 2.U.( { $ $ n n ( n ( n ( ( ( V.n v { u$$+} d ` k$N#;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 g.2 A W.A ) i ) y ! i y i v$,#0+H+G+w$m@+@7+A+{$L+x$' ' 4 3 2 4 # 2.2./ f U.( * * , * v n ( ( n ( n ( n n n n V.V.( ( b+!.u t s k$y$;         ",
+"            ( B 5 # S l.C#Y c#, , % 2.% , & # # 5 %.4 8.}.' 3 @ 2 @ 2 @ W.i A ) ) ) z$|$/+/+~$A$`.,$2#B$t$/+G+z }.3 ' z % % 2.2.f % % * ( { $ U.% U.n n ( n ( n ( ( ( ( n v h.v j.:#H@F G E#G x         ",
+"            ; 5 4 / /.o X t.C$, 2.2., 2.% , # & # # D$%.4 ' z 3 ' g.2 2 ' @ g.@ 3 ' Y+E$/+Y+s@F$~+G@b$G$j@@+9$7.2 @ 7.%.# # , , 2.( * h.% { { { { f % n ( n ( n n n v ( ].U.h V.$+k. .q y$D#q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # D$4 # u@4 }.2 3 3 3 2 3 2 g.H$/@]#0+m+G+|$w#I$'+J$Z+-@K$3 %.4 2 %.& , , % , 2.% h { { ( ( ( ( { % n ( n ( ( ( $ v h v n a+g X  .%#s D#I V.        ",
+"            i., h {.e a #.%+a , * * * / 2./ 2.2., &.&.9.# # 4 %.4 4 4 ' 7.}.z ' }./$}$9+R.~@G@#$E$U@$@I+5@~$L$7.& M$N$O$P$Q$R$f 2.* { % ( n n n n ( { % v ( n n n n $ n ( % ( n.O Y c F#D#t#l.*         ",
+"            6 = b+g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # # D$%.4 9.4 %.4 4 4 S#S$4@/+(+H+x$1$T$T#_#6+Q.}#n$n@e@U$V$q#`.p$% { % % * v V.h ( ( { ( { f n ( ( ( ( n v h.{ ,.g J  .Z k$t#D#V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.# 9.# # # B 8.9.%.%.F+|$H+;#!$G+W$l$F+X$m@W#h@Y${#o@Z.q#T$Z$'@`$ %( / % U.{ { n ].( ].( ( U.* n n v ( V.h ( ( 9@g k.&+s D#t#F =           ",
+"              M 7 {.0 a a =.O c#* ( { { { % * / / % 2.2., 2., , , # # # # # # # _+_$6+]@-@m+6$Z$.%q$;@_$5@*@+%@%#%c@T+$%q#%%m@;$&%T#{ { U.( ( ( ].( ].].{ % v h $ v { v h.: :#l X M#y$D#t#M#S           ",
+"              v.{.v.H.P H.8@a+c#v % U.U.{ ( % % * / f f % 2./ 2., , , , , # & # &.s@+#/+6+d$*% +g@I+/$=%E$-%l+A@ #;%j#z@o@>%Y@w@h+X$% { v n n ( { ( ( ( { ( { n $ v ( U.( V R J Y M#y$D#t#g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % % { / 2.% / 2.2.2.2.% 2., , , *$a$L+/+s#,%b#J+r+9$l$R.]@B#a$+#'%L@@$n+B$)% +P.B+.+r$!%( ( ( ].( { n ].( v / ( v ( h.{ 8 C#Y u I H@E#~%E#V             ",
+"                0 !.J ).^ C G./.b+w ( { ( % U.{ { % % * * / f / / 2.2.2.f 2.f % {%i@]@T.5@]%^@,%*@L+W+/+/+K#L#/+!$^%=%a$j+`@)#Q@/%(%_%$@,@n ( ].( ( ( ].$ ( , V.h.U.{ +.^ C#p  ._@F#t#t#Z ;             ",
+"                a g H.a l M#M#I R $++.( v { { U.U.{ * ( U.% % { f f / / / % 2.:%w#/+@+i#<%[%}%t$-@/+/+/+/+/+]#++=@W#{$r++$|%z@+% +Z@!+#@'+1@E+( ].].{ ( n n / v h h.% V.c p | p F k$t#D#[ %             ",
+"                  ~.s D#k$| Q M $+1%,.^ ( ( { { U.( { { { { % U.% { % % * 2.2%(#q+i@V@]%[%s@~$K+n#/+/+/+K#9+U#3%m#;#|$+#5#4%5%P+q#/%=#}+A$6%c@( ( ( n ( h V.f v ( h.n V ` t Y H@y$D#t#s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % U.% % { { { % { { % _$V+a$j@@+T@O#~${@S./+n+W+/+V@o$V#}#y#&$/@w##$,%m#X#L.7%u#U#}#`.@%T$B$2@].( v n v 2.U.* v w t F 8%t#t#9%t#t#| $               ",
+"                  1 0 < = h.( 1 O $+Y : ^ n v ( { { { { { U.( % { U.( 0%#$a%I$a$/+K+b%p+;#6+/+/+/+n#Z+^#_$%%W@|%c%(#,%S./+n+i#L.L.l@`#w@d%%%e%c@G$&%$ ( n ( 2.U.h.].W F g Q &+D#~%t#D#$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { o+f%R$]+[%++j@g%R@I+##h%l$L#i%/+/+C@=%G+j%$@]$v v >#,%/+E$;#0+O#L.L.L.P$o@k%{#l%3#k%m%v U.* * * v < F H k.0 Y r t#t#M#;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( n%t@e$^#d$7@^@^###]+m+M+Z#Y+5@/+R#p+j@H+V+o%p%q%|+$ $ $ n c%^#E$/+/+r#T@.#|+( T#i+|@T#q#i+v { h * f h.w t r%E !. .s D#t#k$b+%                 ",
+"                      l.k.t.Y j Y | | | &+n.^ ( ( ( ( ( n F@i$7@s%t%#$a%1${$u%<%a%+#/@a%s%v%h%6+6$/#Z.N.[#l@{ { { ( ( w%,%{@5#S$i@B$( n ( {+Z.V$9#x%y%U.{ * f ,.&+L p Y p E#t#~%t#H@;                   ",
+"                        | M#q &+k H.[ | L c < ,.{ n ].( ( L.R#(#s@[%^#p+*%r@/#u%~$~$z%L++$;#i$W# +L@g+{#B$U.( ( n ].( $#++V@=%-%n#a$( n ( h ( %$[#v { U.% * C A% .k } L N#D#t#t#N#{.                    ",
+"                        l F#F#| 3.#.O &+ .E | A%( ( ( n n L.T.+#g%V@I$[%c%M+[%m#o$!$V@/+v$E$_#;@3+)+}#o@`#{ 2.].( ( ].( f@7@}%a$n#T.n ( v n v v h ( % { f U N p l.8@u N#D#t#t#D#X ^                     ",
+"                          :# .~.@.8 g d O k.X |.G.].V.( L./+/+/+/+K+w#t$~$2#t$S@0+/+G@q@i@{%B%+%P+C%V$P#( { ( * n ( ].{ D%5$,%~@{$R.n $ ( n V.v h.{ * * m t+%#b 3.7 p D#D#t#D#p _                       ",
+"                          7 b :#^.$.l } a 1 ..j.=.V ^ n L./++#/+@+L#S.]@-%R@E$I#B#/+/+H+=$o%Y@!#}#1+N..#{ ( n % ( n ( ( ^ :$W#2#v$1$E%v v U.v U.( % { F%m.E H.M a l.F D#t#t#r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n /+/+/+/+/+D@L+j@*@R@0+n#R@L+6+Z+5$P@G%@@S+@@%@( ^ ( { n % * ].( ( V.^#9$H%{%F@h v ( { * { v *.q c s+b+7 O H@D#t#t#E#[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.n+s#n++#/+/+i@,#5#|$5@K#H+~@I%+$~+0#{#B@J%r$]$].( n ( ( { ( 2.h.n { A#Z#s@s%U.v U.* % % C N  .| ^.a v.a p E#~%~%D#c V                           ",
+"                                k L F r I $.- = _ a R } E = n m#r+(#x$*@}$G+z$p$}$.%K%q%g+P.0#L%[@.@( n ( ].n ( n ( ( 2.* % M%N%0%{ ( { % * * ] a+q | =.a e 0 j y$t#t#t#H i.                            ",
+"                                $.Y q G F#l.V C V [ u } q %#O%S ( ( V+##F@7@G@G@=$P%q#X@Z.o@7#p#O@Q%n ( n ( ( n h v v ( ( 2.% 2., , _+, / ].6 $+H@&+[ u$e l.Y s t#t#t#t {.{                             ",
+"                                  3.| s N#I k.0 0.!.| %#q !.Y &+t+].( n ].n n n f#{#x%7#'+1@C+C+n$( n ( v v ( { $ n v h.( * { U.U.{ U.v n w | | d %#Q $.O c s t#t#t#F 7 S                               ",
+"                                    Q M#k$N#F } |.H@c N#d /.[ b } %#6 ].( $ ( $ n ( n n n V.v n n n h v $ $ v V.{ U.v U.* ( % v { U.n 8 j c k c K l ^.~.t E#D#D#D#r%3.S                                 ",
+"                                      Q  .F E#` M#F#r D#3.w A%A%s+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { U.v h v U.v { n ^ #.A%u.H@} X ^.X |.~.H R%c$t#t#D#F#a ^                                   ",
+"                                        3.| ` D#G F k$D#S x w 8 G./.N l.R H@O%t+'.< 6 w ( n { { n ( h { ( h U.{ ( h.( n - #.m.d | ~.g | $+D !.p t ` D#t#c$t#D#M#7 ^                                     ",
+"                                            u R%E#E#t#s 3.< #.#.; - ; #.b+8@s+$+|.Y a+N #.= ^ n v v ( * v { U.h.h C < '.%#| X M Q G.#.[ &+M H@y$E#t#~%t#t#E# .{.                                        ",
+"                                              b F c$~%t &+:#^.v.= $ n 8 _ _ V {.s+B.R | | %#H@L F N#R%R%N#N#N#N#s F &+~.[ Q /.< _ i._ a s  .r k$D#D#t#t#r ~.b+                                          ",
+"                                                a F#t#s y$Z C#k.e {.$._ ^ n = {.=.1.[ j.C#} u |.b ~.M#q t.k |.[ [ ^.P a $.b+_ : 3.o O l.9%k$D#t#t#t#D#F 0 _                                             ",
+"                                                  3.| F#s y$F#Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.C$7 C$V : @.@.v.b+9 7 a t.H@H@G t#~%t#D#D#N#I 3.;                                               ",
+"                                                      0 | ` N#N#` F %#| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).:# .F#s D#t#t#t#t#r p e #.                                                  ",
+"                                                          H.p E#D#k$E#N#F#p M#F#F H q t.b t.:#J } O 0 l.O e @.3.l.} u | H@Z F E#c$c$t#t#t#E#t H./.                                                      ",
+"                                                              H.&+` D#D#k$k$k$D#E#R%R%r F F | H@F#t F#q %#| | H@L F#F N#E#t#c$D#t#9%t#D#%#^.$.                                                          ",
+"                                                                $.H.t.F#N#D#t#c$~%D#D#D#D#E#N#E#D#c$D#E#r E#E#D#D#c$t#t#t#D#c$c$E#F C#e $.;                                                             ",
+"                                                                      a O } t R%t#~%t#t#D#D#c$c$t#t#t#D#c$t#t#c$c$D#9%c$D#r F C#H.a V                                                                   ",
+"                                                                            3.H.H.I q G N#E#D#t#t#t#t#t#D#t#D#E#s F p C#[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.bmp
new file mode 100644 (file)
index 0000000..a29f14d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Params.xpm
new file mode 100644 (file)
index 0000000..ebe2d85
--- /dev/null
@@ -0,0 +1,405 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_Params_xpm[] = {
+"100 100 302 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #787AD5",
+"Y.    c #726FC3",
+"Z.    c #686AA3",
+"`.    c #CACDF7",
+" +    c #444682",
+".+    c #4A5092",
+"++    c #888ECF",
+"@+    c #CFD2FC",
+"#+    c #D3D2F7",
+"$+    c #CCCFFA",
+"%+    c #404479",
+"&+    c #474688",
+"*+    c #9793D7",
+"=+    c #D8D7FC",
+"-+    c #DAD9FE",
+";+    c #D6D5FA",
+">+    c #9095D6",
+",+    c #DBDFFC",
+"'+    c #8C8ED6",
+")+    c #E1E1F9",
+"!+    c #E4E3FB",
+"~+    c #2B2D4A",
+"{+    c #EBE7F9",
+"]+    c #E8EDFD",
+"^+    c #484878",
+"/+    c #423F76",
+"(+    c #E5E4FC",
+"_+    c #252547",
+":+    c #545284",
+"<+    c #8685D3",
+"[+    c #EDEAFC",
+"}+    c #9B99EA",
+"|+    c #282340",
+"1+    c #353457",
+"2+    c #7777C4",
+"3+    c #996666",
+"4+    c #666699",
+"5+    c #666666",
+"6+    c #996699",
+"7+    c #000000",
+"8+    c #908DD0",
+"9+    c #5E5D9C",
+"0+    c #FFFFFF",
+"a+    c #9C9FD8",
+"b+    c #8581C1",
+"c+    c #5A5FA2",
+"d+    c #6F73BF",
+"e+    c #95959C",
+"f+    c #777BC5",
+"g+    c #669999",
+"h+    c #999999",
+"i+    c #7E7AC8",
+"j+    c #08050A",
+"k+    c #999966",
+"l+    c #CCCCCC",
+"m+    c #807DC9",
+"n+    c #2A2E55",
+"o+    c #0A0B14",
+"p+    c #080D1A",
+"q+    c #1D1B32",
+"r+    c #9999CC",
+"s+    c #7276C3",
+"t+    c #21233F",
+"u+    c #111122",
+"v+    c #7470C3",
+"w+    c #CCCC99",
+"x+    c #6C70C1",
+"y+    c #6F73CC",
+"z+    c #6D71C1",
+"A+    c #660000",
+"B+    c #7174C6",
+"C+    c #7E82C9",
+"D+    c #7976C4",
+"E+    c #333333",
+"F+    c #990000",
+"G+    c #7478C5",
+"H+    c #FFFFCC",
+"I+    c #336666",
+"J+    c #7571BF",
+"K+    c #663366",
+"L+    c #7378C2",
+"M+    c #0B070D",
+"N+    c #7275C6",
+"O+    c #363961",
+"P+    c #110D1B",
+"Q+    c #8286CB",
+"R+    c #669966",
+"S+    c #827FC5",
+"T+    c #484986",
+"U+    c #FFCC00",
+"V+    c #7F81CB",
+"W+    c #16152B",
+"X+    c #FF6600",
+"Y+    c #CC6600",
+"Z+    c #CC9999",
+"`+    c #99CCCC",
+" @    c #CC99CC",
+".@    c #777BC3",
+"+@    c #535491",
+"@@    c #7275CE",
+"#@    c #FFCC99",
+"$@    c #333366",
+"%@    c #827FCA",
+"&@    c #336633",
+"*@    c #663333",
+"=@    c #696EC0",
+"-@    c #7073C5",
+";@    c #99CC99",
+">@    c #696CC2",
+",@    c #696DBC",
+"'@    c #666633",
+")@    c #7274BF",
+"!@    c #050208",
+"~@    c #CC3300",
+"{@    c #313260",
+"]@    c #15121F",
+"^@    c #09060C",
+"/@    c #1D203B",
+"(@    c #474B93",
+"_@    c #6368AC",
+":@    c #32386C",
+"<@    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.O.O.I.I.I.I.I.J.I.J.F.D.z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.A.F.J.I.I.O.T.U.V.V.U.W.T.T.T.I.K.I.K.F.D.x.p.o.d.. 6.i + <.g.z 4 5 X.Y.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y Z.5.f.p.y.D.E.I.K.V.T.T.T.`.`.`.`.U.W.W.U.T.T.T.K.J.E.D.z.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ). +.+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u Z.++f.o.x.D.F.J.K.T.V.`.U.@+@+U.@+U.@+#+#+T.$+`.T.V.I.I.D.y.z.p.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.%+&+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w  +O S.*+5.p.y.x.E.K.I.T.`.U.@+$+#+=+-+=+;+;+;+=+@+U.@+T.U.O.K.K.F.A.z.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $. +#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.S.>+e.p.x.z.D.J.I.T.T.U.$+#+#+#+,+,+,+-+-+-+=+;+=+#+@+`.W.I.I.I.E.A.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 '+5.b.p.y.D.J.I.I.W.`.`.#+=+=+,+=+,+)+)+)+)+,+-+-+#+$+`.`.W.O.I.E.D.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.x.p.z.D.I.T.U.T.$+@+;+=+,+,+!+)+)+,+)+,+,+)+,+=+;+U.U.`.V.I.E.D.y.p.f.d.i + r.@ ' z 4 4 # &., 2.% 2.% L.L.{ n $ n v $ L ~+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u Z.5.. d.x.x.y.F.K.T.$+W.#+#+,+-+!+)+)+{+{+!+]+)+)+)+,+,+=+;+U.`.W.T.J.D.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f * { L.( v ( ( { n - K 0 9 a ^+P a                     ",
+"                      # ' * (.P /+u ~.4.i 5.f.o.q.D.J.I.V.T.#+#+,+-+)+)+!+{+(+)+]+(+{+(+!+!+,+,+=+@+U.`.I.I.E.D.z.p.f.d.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.x.D.I.I.T.`.U.@+,+)+!+{+)+]+]+{+]+]+]+{+{+!+)+,+-+=+U.`.V.I.J.F.A.p.b.d.! i @ 3 3 B 4 X.# , % 2.f ( f L.L.M.M.].n n n V t.[ .+{.a 0 O %                 ",
+"                    % , ( @.R c H.e '+! ! 5.f.y.y.F.J.V.T.$+#+;+;+,+)+(+]+]+]+]+{+{+]+]+)+{+)+,+,+;+@+U.U.O.I.E.y.p.o.5.i ) r.2 ' ' # # &., , 2.2./ ( { { v n ( ( ( M.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H._+| :+<+A i c.5.f.q.y.E.I.T.T.`.#+;+,+!+{+(+[+{+]+]+]+{+[+]+(+!+)+,+=+;+@+`.T.O.I.D.A.p.f.}+! i N.3 }.}.5 # # , 2./ f * % % n v v n n { { ]./.O a /..+a !.O %               ",
+"                  ( : S ; k._+H.:+4.i 6.! b.f.x.D.E.I.I.W.`.#+#+,+,+)+]+[+]+[+{+[+]+]+]+]+{+!+,+)+=+#+W.V.O.J.F.y.p.o.! i ) <.~ z 7.4 # # , % / f % { { L.h $ M.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.|+[ -.y A 6.5.b.f.x.y.J.I.T.W.`.#+;+,+!+!+(+[+]+]+]+{+[+[+[+]+{+)+,+)+;+#+`.T.O.K.D.y.p.o.b.6.) <.' 3 4 4 # # & 2.2.2.% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.<+) i 6.d.f.o.A.E.K.I.U.U.U.=+-+,+)+]+]+[+]+[+]+]+]+]+(+(+!+,+=+;+@+U.V.O.I.E.A.q.o.! ! ! r.@ ' ' 4 # # & , ( f * { % ( n ( M.( ( ( ( ].#.1+g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.2+[.N.+ i c.d.p.q.F.K.I.W.`.#+;+!+!+!+{+[+{+]+]+[+{+[+]+]+{+)+,+3+4+3+4+3+5+6+5+6+5+6+5+6+5+6+5+6+5+6+5+6+5+6+5+7+8+{ * % v { n n n n ( $ ].P.!.k.^+0 |.| V             ",
+"                {.3.{.$.O d Y 9+-.@ A i ! ! o.p.y.y.I.I.T.`.U.#+;+,+!+(+]+]+[+{+]+]+]+{+{+)+!+,+5+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+7+a+b+h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| c+d+g.@ i . . f.o.z.A.J.I.V.`.#+;+=+,+(+(+[+]+]+{+[+[+[+)+(+!+)+,+6+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+7+e+f+L.L.n v n n n ( ( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ G.O ~._.<+@ N.) i 5.e.o.y.y.J.I.O.T.`.#+;+-+)+(+{+[+[+]+]+]+(+]+)+!+-+#+g+0+0+7+7+7+7+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+7+h+i+{ v M.$ M.( ( n ].( { $ j.u !.k F j+j+(           ",
+"              = ; {.( S 3.X c+d+:.~ @ ) + . 5.f.y.y.E.K.K.W.`.`.#+#+,+,+,+(+(+(+(+]+)+)+,+)+;+;+3+0+0+7+0+0+7+0+7+h+7+h+7+h+7+k+7+h+7+h+7+k+0+l+7+h+m+( h.n { n n ( ( n ( n M.^ X n+t o+p+q+C.          ",
+"            a H | ~.$.8 .+|._.T 3 g.[.<.i ! b.f.o.x.y.E.I.O.T.U.#+#+@+;+,+,+(+(+!+,+,+!+=+;+;+#+5+0+0+7+0+0+7+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+r+0+7+h+s+h.( ( ( h ( n n ( ].( { S u B.%+e k.| a %         ",
+"            h v e t+o+u+H } U B z 2 @ r.A . . b.f.z.y.y.J.K.T.T.`.U.;+#+-+,+=+=+!+,+;+=+,+;+#+$+3+0+0+7+7+7+7+0+0+0+0+0+0+0+0+0+0+0+0+0+0+l+0+l+7+h+v+h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.|+r q 2+8.}.g.~ [.) y ! 5.f.p.z.D.E.I.I.I.V.`.U.U.#+#+,+;+#+#+;+#+#+#+`.W.5+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+r+0+w+0+7+h+x+h v M.( ( n n ( { ( ].( M.P /.*.^+c H I (         ",
+"            , 3 ~ @ y+; O ).B 7.' ' 3 ~ ) i + ! d.d.p.y.z.y.K.I.T.T.`.`.U.W.#+U.#+#+#+`.`.U.T.V.k+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+l+0+l+0+l+7+h+z+h n n n ( ( ].( n ( n n { %+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.2+8.%.8.' ~ 2 @ ! . 5.f.f.o.x.D.E.J.K.I.K.T.T.`.`.`.`.U.`.U.T.T.T.I.5+0+0+7+7+7+7+0+0+0+0+A+0+0+0+0+0+0+r+0+w+0+r+0+7+h+B+v ( h M.n n ( ].( { ( ( ( O &+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.f.p.y.y.y.J.I.K.I.O.I.T.T.I.V.I.V.I.I.I.J.3+0+0+7+0+0+7+0+7+h+A+h+7+5+7+4+7+k+7+k+7+h+0+w+7+h+C+v n n ( ( n ( ].( n n n { =. +N H.~.|+q+;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. d.f.o.A.y.y.F.J.J.K.K.J.K.I.I.I.I.I.I.J.F.4+0+0+7+0+0+7+0+0+A+0+0+0+0+0+0+l+0+l+0+r+0+l+0+7+h+D+$ ( ( n n ( n ( ].( ( M.( Q.P  +P X q F ;         ",
+"            ' , n n S O | X # # y+5 B 7.}.3 @ N.+ + 5.}+e.f.f.o.z.y.D.5+5+3+E+K.J.K.J.J.E.E.D.y.h+0+0+7+7+7+7+0+F+0+0+0+0+0+0+l+0+r+0+l+0+w+0+l+7+h+G+v v M.( n ( n ( n n { n $ n...N ^+k t u+;         ",
+"            # ( v % _ b  .|.9.y+# 9.# 4 7.' @ 2 A i + . . d.5.o.p.z.5+H+l+h+I+7+F.y.F.y.z.y.z.z.4+0+0+A+0+0+0+A+h+0+0+0+0+0+l+0+w+0+l+0+l+0+r+0+7+h+J+$ $ { n ( n ( n ( ( ( h n %+).%+g | s o+;         ",
+"            v ( 2.* {.1+| u T # , # # 5 4 7.3 g.~ A y i . c.c.d.f.5+0+0+0+l+h+K+7+y.x.y.f.p.p.q.3+0+A+F+A+0+F+A+0+0+0+0+0+l+0+r+0+l+0+h+0+l+0+l+7+h+L+n ( ( n ( n ( n n ].n h $ Q.O O u q+p+M+*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ N.) y y ! . d.5+l+0+0+l+h+5+7+o.f.f.o.f.f.e.5+0+0+F+A+F+A+3+0+0+0+0+l+0+w+0+l+0+l+0+l+0+w+0+7+h+N+( ].n ( n ( n ( ( ( ( { n W 1.O+p u+P+o+;         ",
+"            , 5 # , _ g Y c 5 , , , &.Y.# %.X.B z 2 ~ 2 + ) y . 6.h+h+l+0+l+h+E+7+f.e.e.d.. . 5.3+0+0+7+F+A+F+0+7+g+7+5+7+5+7+4+7+5+7+5+7+4+0+l+7+h+Q+( ( n ( n ( n n n n ( ( L. +b u L u+o+o+;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A N.i y + 5+5+h+h+h+5+E+7+. . . i ! y ) R+0+0+7+0+A+7+0+0+0+l+0+l+0+l+0+l+0+l+0+l+0+w+0+7+h+S+n n ( n ( n ( ( ( M.n v { T+P.} d ` P+u+;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 g.2 A 5+U+5+5+5+E+5+5+y i y ! ) i ) A 6+0+0+7+7+7+7+0+0+l+0+l+0+l+0+l+0+l+0+l+0+l+0+l+7+h+V+( n ( n ( n n n n M.M.( ( .+!.u t s P+W+;         ",
+"            ( B 5 # S l.n+Y c+, , % 2.% , & # # 5 %.4 8.}.' 3 h+l+U+X+5+5+4+5+Y+E+E+i ) 2 <.@ 2 4+0+0+0+0+0+0+0+l+0+Z+0+`+0+Z+0+`+0+Z+0+`+0+ @0+7+h+.@n ( n ( n ( ( ( ( n v h.v j.1+_+F G p+G x         ",
+"            ; 5 4 / /.o X t.+@, 2.2., 2.% , # & # # @@%.4 ' z h+#@0+0+X+X+X+Y+Y+Y+U+$@A 2 @ @ g.3+0+0+0+0+0+0+l+0+`+0+l+0+l+0+l+0+w+0+l+0+w+0+`+7+h+%@n ( n ( n n n v ( ].L.h M.P.k. .q W+o+q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # @@4 # X.h+#@H+H+0+0+U+U+U+U+X+&@g.3 2 z ' R+0+0+0+0+0+l+0+Z+0+l+0+Z+0+`+0+ @0+`+0+ @0+l+0+7+h+s+% n ( n ( ( ( $ v h v n  +g X  .|+s o+I M.        ",
+"            i., h {.e a #.Q.a , * * * / 2./ 2.2., &.&.9.# # 4 h+#@#@#@H+H+0+H+U+X+Y+*@' 7.4 7.4 3+0+0+0+0+l+0+`+0+l+0+`+0+l+0+w+0+l+0+w+0+`+0+Z+7+h+=@% v ( n n n n $ n ( % ( n.O Y c q+o+j+l.*         ",
+"            6 = .+g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # h+#@U+#@#@#@H+H+X+X+Y+I+7.4 4 B %.4+0+0+0+l+0+Z+0+l+0+Z+0+l+0+ @0+`+0+ @0+l+0+l+0+7+h+-@{ f n ( ( ( ( n v h.{ ,.g J  .Z P+j+o+V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.h+#@U+U+#@#@#@#@X+X+Y+E+%.9.# # # 6+0+0+l+0+`+0+l+0+`+0+l+0+;@0+l+0+w+0+`+0+Z+0+l+7+h+>@( L.* n n v ( M.h ( ( /+g k.R.s o+j+F =           ",
+"              M 7 {.0 a a =.O c+* ( { { { % * / / % 2.2., 2., h+#@U+U+U+#@#@#@X+Y+Y+$@# # # &., 4+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+h+,@].{ % v h $ v { v h.: 1+l X t+W+o+j+t+S           ",
+"              v.{.v.H.P H.^+ +c+v % L.L.{ ( % % * / f f % 2./ h+#@U+U+U+U+U+#@X+Y+Y+'@&., , , , , / h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+r+)@( { ( { n $ v ( L.( V R J Y t+W+o+j+g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % % { / 2.% / h+#@U+U+U+U+U+U+X+Y+Y+E+, # % , % % 2., 2.# % / * / / % * { L.{ ( { { { % ( ( ( ].( { n ].( v / ( v ( h.{ 8 n+Y u I _+p+!@p+V             ",
+"                0 !.J ).^ C G./..+w ( { ( % L.{ { % % * * / f / h+#@U+U+U+U+U+X+Y+Y+$@% 2.% , , % 2./ * # * % ( % 2.% ( * { * ( % L.{ h.v n ( ].( ( ( ].$ ( , M.h.L.{ +.^ n+p  .~+q+j+j+Z ;             ",
+"                a g H.a l t+t+I R P.+.( v { { L.L.{ * ( L.% % { h+#@U+U+U+U+U+X+~@E+f 2.2./ / 2.* % { % , L.{ * ( * * f ( L.v h.{ { % L.n ( n ( ].].{ ( n n / v h h.% M.c p | p F P+j+o+[ %             ",
+"                  ~.s o+P+| Q M P.{@,.^ ( ( { { L.( { { { { % L.h+#@U+A+U+U+U+F+~@'@* * { * % % * % { % , L.L.{ L.% ( / { L.L.% % ( { % n ( { ( ( ( n ( h M.f v ( h.n V ` t Y _+W+o+j+s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % L.% % { { h+#@U+F+U+U+A+F+Y+$@% % % L.{ { ( * L.{ , { { { { { { ( % h.{ { { { { { ( n ( ].n ].( v n v 2.L.* v w t F ]@j+j+^@j+j+| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { { { { { L.( % h+#@U+F+U+U+X+X+Y+E+{ * ( * L.{ L.{ ( { , ( ( ( ( ( v { ( % L.L.% ( ( n ( ].( ( ( n $ ( n ( 2.L.h.].W F g Q R.o+!@j+o+$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { % { { ( % { { { * ( % L.{ L.{ % { { { ( / { v v v v ( ( n { ( { { n { ( n ( n n n h n v L.* * * v < F H k.0 Y r j+j+t+;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { ( { { { { { ( { ( ( ( v ( % h $ $ $ n { ( ].{ ( ( ( ( n ( n ( ( M.n ( v { h * f h.w t /@E !. .s o+j+P+.+%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( ( v ( ( ( ( ( v ( { v v ( n { { { { { ( ( { ( ( ].].n ].( n ( n n { ( v M.L.{ * f ,.R.L p Y p p+j+!@j+_+;                   ",
+"                        | t+q R.k H.[ | L c < ,.{ n ].( ( n n ( $ v v v v v M.v v v v v ( n ( $ $ n ( ( ( L.( ( n ].( { ^ ( ( ( ( n ( n ( h ( v v v { L.% * C (@ .k } L u+o+j+j+u+{.                    ",
+"                        l q+q+| 3.#.O R. .E | (@( ( ( n n ( ( ].{ $ ( $ $ $ { $ $ ( ( ( ].( n { { ( n { n { 2.].( ( ].( ( { { n n ( n ( v n v v h ( % { f U N p l.^+u u+o+j+j+o+X ^                     ",
+"                          1+ .~.@.8 g d O k.X |.G.].M.( n n ( ( { ].{ { { ( ].{ ].].].( n ( ( ( n ( ( ( ( { ( * n ( ].{ ( ( ( ( n ( n $ ( n M.v h.{ * * m &+|+b 3.7 p o+o+j+o+p _                       ",
+"                          7 b 1+^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( ( ( ].( ( ( ( ( n ( n ].].( n ].n { ( n % ( n ( ( ^ ].n n ( v h v v L.v L.( % { _@m.E H.M a l.F o+j+j+r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( ( ].].].^ ].( { ^ n n n ( n ( ( ( n ( ( ( ( ^ ( { n % * ].( ( M.( v $ n n h v ( { * { v *.q c %+.+7 O _+o+j+j+p+[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { ( ( ( ( ( n ( ( ( ( ( n ( n n n ( n n n ].( n ( ( { ( 2.h.n { n $ v ( L.v L.* % % C N  .| ^.a v.a p p+!@!@o+c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { { { ( ].{ n n n ( n ( ( ( n ( ( ( ( n ( ].n ( n ( ( 2.* % v h h.{ ( { % * * ]  +q | =.a e 0 j W+j+j+j+H i.                            ",
+"                                $.Y q G q+l.V C V [ u } q |+:@S ( ( ( ].( ( ( ( ( n ( n n n ( n n n n ( n ( ( n h v v ( ( 2.% 2., , Y., / ].6 P._+R.[ T+e l.Y s j+j+j+t {.{                             ",
+"                                  3.| s u+I k.0 0.!.| |+q !.Y R.&+].( n ].n n n ( n ( ( ( n ( ( ( ( n ( v v ( { $ n v h.( * { L.L.{ L.v n w | | d |+Q $.O c s j+j+j+F 7 S                               ",
+"                                    Q t+P+u+F } |._+c u+d /.[ b } |+6 ].( $ ( $ n ( n n n M.v n n n h v $ $ v M.{ L.v L.* ( % v { L.n 8 j c k c K l ^.~.t p+o+o+o+/@3.S                                 ",
+"                                      Q  .F p+` t+q+r o+3.w (@(@%+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { L.v h v L.v { n ^ #.(@u._+} X ^.X |.~.H <@M+j+j+o+q+a ^                                   ",
+"                                        3.| ` o+G F P+o+S x w 8 G./.N l.R _+:@&+'.< 6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` o+j+M+j+o+t+7 ^                                     ",
+"                                            u <@p+p+j+s 3.< #.#.; - ; #..+^+%+P.|.Y  +N #.= ^ n v v ( * v { L.h.h C < '.|+| X M Q G.#.[ R.M _+W+p+j+!@j+j+p+ .{.                                        ",
+"                                              b F M+!@t R.1+^.v.= $ n 8 _ _ V {.%+B.R | | |+_+L F u+<@<@u+u+u+u+s F R.~.[ Q /.< _ i._ a s  .r P+o+o+j+j+r ~..+                                          ",
+"                                                a q+j+s W+Z n+k.e {.$._ ^ n = {.=.1.[ j.n+} u |.b ~.t+q t.k |.[ [ ^.P a $..+_ : 3.o O l.^@P+o+j+j+j+o+F 0 _                                             ",
+"                                                  3.| q+s W+q+Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.+@7 +@V : @.@.v..+9 7 a t._+_+G j+!@j+o+o+u+I 3.;                                               ",
+"                                                      0 | ` u+u+` F |+| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).1+ .q+s o+j+j+j+j+r p e #.                                                  ",
+"                                                          H.p p+o+P+p+u+q+p t+q+F H q t.b t.1+J } O 0 l.O e @.3.l.} u | _+Z F p+M+M+j+j+j+p+t H./.                                                      ",
+"                                                              H.R.` o+o+P+P+P+o+p+<@<@r F F | _+q+t q+q |+| | _+L q+F u+p+j+M+o+j+^@j+o+|+^.$.                                                          ",
+"                                                                $.H.t.q+u+o+j+M+!@o+o+o+o+p+u+p+o+M+o+p+r p+p+o+o+M+j+j+j+o+M+M+p+F n+e $.;                                                             ",
+"                                                                      a O } t <@j+!@j+j+o+o+M+M+j+j+j+o+M+j+j+M+M+o+^@M+o+r F n+H.a V                                                                   ",
+"                                                                            3.H.H.I q G u+p+o+j+j+j+j+j+o+j+o+p+s F p n+[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.bmp
new file mode 100644 (file)
index 0000000..e4dc3c6
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Processing.xpm
new file mode 100644 (file)
index 0000000..b021115
--- /dev/null
@@ -0,0 +1,476 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_Processing_xpm[] = {
+"100 100 373 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #E3E3E3",
+"J.    c #C1C1C1",
+"K.    c #9C9C9C",
+"L.    c #898989",
+"M.    c #828282",
+"N.    c #E9E9E9",
+"O.    c #6763BD",
+"P.    c #635FB8",
+"Q.    c #888CE1",
+"R.    c #A6A6A6",
+"S.    c #7B7B7B",
+"T.    c #C6C6C6",
+"U.    c #FAFAFA",
+"V.    c #FFFFFF",
+"W.    c #F1F1F1",
+"X.    c #D9D9D9",
+"Y.    c #B8B8B8",
+"Z.    c #949494",
+"`.    c #737272",
+" +    c #AFAFAF",
+".+    c #EFF0EF",
+"++    c #373766",
+"@+    c #3B4074",
+"#+    c #232344",
+"$+    c #656396",
+"%+    c #D4D4D4",
+"&+    c #626262",
+"*+    c #E1E1E1",
+"=+    c #EEEEEE",
+"-+    c #E6E6E6",
+";+    c #ECECEC",
+">+    c #F8F8F8",
+",+    c #F9F9F9",
+"'+    c #CBCBCB",
+")+    c #787AD5",
+"!+    c #726FC3",
+"~+    c #5A5A5A",
+"{+    c #A1A1A1",
+"]+    c #BDBDBD",
+"^+    c #CECDCE",
+"/+    c #F5F5F5",
+"(+    c #FCFCFC",
+"_+    c #FEFEFE",
+":+    c #DEDEDE",
+"<+    c #525252",
+"[+    c #444682",
+"}+    c #4A5092",
+"|+    c #484848",
+"1+    c #AAAAAA",
+"2+    c #F3F3F3",
+"3+    c #ACACAC",
+"4+    c #8B8B8B",
+"5+    c #6B6B6B",
+"6+    c #404479",
+"7+    c #474688",
+"8+    c #414141",
+"9+    c #F7F6F6",
+"0+    c #FDFDFD",
+"a+    c #6F6F6F",
+"b+    c #9D9D9D",
+"c+    c #B3B3B3",
+"d+    c #B7B7B7",
+"e+    c #7F7F7F",
+"f+    c #6D6D6D",
+"g+    c #757575",
+"h+    c #DCDCDC",
+"i+    c #C2C2C2",
+"j+    c #606060",
+"k+    c #707070",
+"l+    c #82829E",
+"m+    c #3E3E3E",
+"n+    c #B9B9B9",
+"o+    c #7D7D7D",
+"p+    c #909090",
+"q+    c #797979",
+"r+    c #717171",
+"s+    c #EFEFEF",
+"t+    c #2B2D4A",
+"u+    c #D0D0D0",
+"v+    c #D2D2D2",
+"w+    c #8C8C8C",
+"x+    c #808080",
+"y+    c #484878",
+"z+    c #423F76",
+"A+    c #F7F7F7",
+"B+    c #A2A2A2",
+"C+    c #9B9B9B",
+"D+    c #DBDBDB",
+"E+    c #A0A0A0",
+"F+    c #C0C0C0",
+"G+    c #767676",
+"H+    c #A7A7A7",
+"I+    c #7C7C7C",
+"J+    c #6E6E6E",
+"K+    c #D3D3D3",
+"L+    c #A3A3A3",
+"M+    c #737373",
+"N+    c #CDCDCD",
+"O+    c #D5D5D5",
+"P+    c #787878",
+"Q+    c #252547",
+"R+    c #BFBFBF",
+"S+    c #7A7A7A",
+"T+    c #BCBCBC",
+"U+    c #8D8D8D",
+"V+    c #B1B1B1",
+"W+    c #C4C4C4",
+"X+    c #939393",
+"Y+    c #5F5F5F",
+"Z+    c #CCCCCC",
+"`+    c #9F9F9F",
+" @    c #888888",
+".@    c #B5B5B5",
+"+@    c #282340",
+"@@    c #C7C7C7",
+"#@    c #B4B4B4",
+"$@    c #EDEDED",
+"%@    c #EAEAEA",
+"&@    c #BABABA",
+"*@    c #727272",
+"=@    c #696969",
+"-@    c #353457",
+";@    c #747474",
+">@    c #6C6C6C",
+",@    c #8E8E8E",
+"'@    c #5E5D9C",
+")@    c #8F8F8F",
+"!@    c #5A5FA2",
+"~@    c #C9C9C9",
+"{@    c #8A8A8A",
+"]@    c #BEBEBE",
+"^@    c #CACACA",
+"/@    c #818181",
+"(@    c #838383",
+"_@    c #08050A",
+":@    c #6F73BF",
+"<@    c #F6F6F6",
+"[@    c #2A2E55",
+"}@    c #0A0B14",
+"|@    c #080D1A",
+"1@    c #1D1B32",
+"2@    c #C3C3C3",
+"3@    c #ABABAB",
+"4@    c #676767",
+"5@    c #BBBAEA",
+"6@    c #21233F",
+"7@    c #111122",
+"8@    c #7777C4",
+"9@    c #6F73CC",
+"0@    c #B0B2E5",
+"a@    c #989898",
+"b@    c #919191",
+"c@    c #DFDFDF",
+"d@    c #777777",
+"e@    c #A5A5A5",
+"f@    c #969696",
+"g@    c #DEDFEF",
+"h@    c #979797",
+"i@    c #000000",
+"j@    c #BDBCEC",
+"k@    c #9B99EA",
+"l@    c #555555",
+"m@    c #0B070D",
+"n@    c #363961",
+"o@    c #110D1B",
+"p@    c #E0DFF0",
+"q@    c #C7C6F8",
+"r@    c #99FFCB",
+"s@    c #484986",
+"t@    c #16152B",
+"u@    c #535491",
+"v@    c #7275CE",
+"w@    c #666666",
+"x@    c #DBDCEC",
+"y@    c #A8AAE0",
+"z@    c #996666",
+"A@    c #333333",
+"B@    c #444444",
+"C@    c #999999",
+"D@    c #336666",
+"E@    c #7477CB",
+"F@    c #663366",
+"G@    c #7D80CE",
+"H@    c #00CC00",
+"I@    c #BBBBBB",
+"J@    c #FD0000",
+"K@    c #050208",
+"L@    c #FFCC00",
+"M@    c #FF6600",
+"N@    c #666699",
+"O@    c #CC6600",
+"P@    c #DDDDDD",
+"Q@    c #313260",
+"R@    c #FFCC99",
+"S@    c #333366",
+"T@    c #336633",
+"U@    c #15121F",
+"V@    c #09060C",
+"W@    c #663333",
+"X@    c #222222",
+"Y@    c #1D203B",
+"Z@    c #666633",
+"`@    c #474B93",
+" #    c #CC3300",
+".#    c #660000",
+"+#    c #990000",
+"@#    c #32386C",
+"##    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.I.J.K.L.L.M.L.L.L.L.M.L.L.K.J.N.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% O.( v ^ u.Y =.7 8 # # P._ (                                 ",
+"                                  ~ Q.) ~ %.V |.u c J f.I.R.S.S.K.T.N.U.V.V.V.V.V.U.W.X.Y.Z.`.S. +.+z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W ++@+/.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } #+$+%+M.&+Z.*+V.V.V.=+-+-+;+>+V.V.V.V.V.V.V.,+'+M.&+Z.N.p.o.d.. 6.i + <.g.z 4 5 )+!+&.& 2./ / h.% P.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y *+S.~+{+U.V.,+*+T.]+^+I./+(+_+V.V.V.V.V.V.V.V.V.V.:+M.<+R.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ).[+}+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u R.|+M..+V..+^+1+1+^+2+V.V.V.3+4+V.V.V.V.V.V.V.V.V.V.V.V.'+~+5+*+f.d.c.y ) Q.' z B 4 # # , , , f 2.% v v h P.].#.6+7+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w [+=+`.8+Y.V.9+'+1+R.J.2+V.V.0+V.-+a+b+V.V.V.V.V.V.V.V.V.V.V.V.V.2+S.|+'+f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $.[+#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 *+~+|+X.V.*+c+R.1+X.V.V.V.d+a+e+M.a+f+g+a+h+V.V.V.V.V.V.V.V.V.V.V.V.L.8+T.b.. i ) r.@ z }.4 # , , , 2.f { * O.( O.n ( C 1 1.'.: < v.7 {.O.                      ",
+"                          % ' @ 4 O.Q I.<+|+:+V.%+R.R.1+-+V.V.V.V.i+j+a+a+a+a+k+k+V.V.V.V.V.V.V.V.V.V.V.V.V.V.M.8+X.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ O.$ ( P.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= l+&+m+^+V.^+R.R.1+-+V.V.V.V.V.n+o+k+k+p+q+a+r+'+s+V.V.V.V.V.V.V.V.V.V.V.V.U.&+~+d.i + r.@ ' z 4 4 # &., 2.% 2.% O.O.{ n $ n v $ L t+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a M.8+{+V.u+R.R.R.X.V.V.V.V.V.v+a+a+a+w+V.v+k+a+a+x+V.V.V.V.V.V.V.V.V.V.V.V.V.:+m+Z.5.i ) @ ' ' 8.5 # &., , 2.f * { O.( v ( ( { n - K 0 9 a y+P a                     ",
+"                      # ' * (.P z+J.8+&+V.I.R.R.R.J.V.V.V.V.V.V.A+B+e+a+C+V.>+a+k+n+D+V.V.V.V.V.V.V.V.V.V.V.V.V.V.Z.8+I.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} &+m+'+U.c+R.R.1+.+V.V.V.V.V.V.V.V.E+a+a+F+{+a+G+V.V.0+V.V.V.V.V.V.V.V.V.V.V.V.V.N.8+Z.! i @ 3 3 B 4 )+# , % 2.f ( f O.O.P.P.].n n n V t.[ }+{.a 0 O %                 ",
+"                    % , ( @.R c '+m+~+V.X.R.R.R.J.V.V.V.V.V.V.V.V.H+a+r+I+k+J+J+a+K+L+M+N+O+P+Z.V.V.V.V.V.V.V.V.V.V.S.<+i ) r.2 ' ' # # &., , 2.2./ ( { { v n ( ( ( P.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H.Q+| L.8+{+V.Y.R.R.R.*+V.V.V.V.V.V.V.V.R+S+%+T+k+U+V+L.W+B+a+4+C+a+X+V.V.;+V.V.V.V.V.V.V.Y.8+X.i Q.3 }.}.5 # # , 2./ f * % % n v v n n { { ]./.O a /.}+a !.O %               ",
+"                  ( : S ; k.Q+H.&+m+X.=+1+R.R.1+2+V.V.V.V.V.V.V.V.V.V.V.V.Y+Z+a+k+`+ @a+a+k+k+M.H+a+a+U.V.V.V.V.V.V.X.8+.@) <.~ z 7.4 # # , % / f % { { O.h $ P.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  O.^ i.x l.+@[ <+8+/+:+R.R.R.c+(+V.V.V.V.V.V.V.V.V.V.V.V.@@(+G+a+k+a+a+a+a+a+k+a+k+k+V.V.V.V.V.V.V..+8+K.) <.' 3 4 4 # # & 2.2.2.% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a |+|+V.X.R.R.R.#@0+V.V.V.V.V.V.V.V.V.V.V.V.$@%@&@*@a+k+a+a+k+a+k+a+=@R.%@s+V.V.V.V.V./+8+Z.! r.@ ' ' 4 # # & , ( f * { % ( n ( P.( ( ( ( ].#.-@g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.<+8+U.:+R.R.R.c+(+V.V.V.V.V.V.V.V.V.V.V.V.P+P+;@r+k+a+>@,@M.*@a+a+k+*@P+S.V.V.V.V.V.;+8+{+A r.@ 3 ' )+# # # , , 2.% { * % v { n n n n ( $ ].++!.k.y+0 |.| V             ",
+"                {.3.{.$.O d Y '@&+m+-+;+R.R.R.1+/+V.V.V.V.V.V.V.V.V.V.V.V.`+k+k+a+a+>@V.V.V.V.*@k+a+k+a+)@V.V.V.V.V.u+8+]+) <.g.}.B 5 # # % , ( / f % h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| !@L.m+J.U.c+R.R.R.*+V.V.V.V.V.V.V.V.V.V.V.V._+~@k+a+a+S.V.V.V.V.{@k+a+a+]@/+V.V.V.V.V.{+8+*+A @ 3 ' 8.4 # &.& , , / { { O.O.n v n n n ( ( n $ ].++!.j.=.k.Y } O.          ",
+"              {.= {.{._ G.O ~._.T.8+S.V.^+R.R.R.T.V.V.V.V.V.V.V.V.V.V.V.V.^@4+a+a+k+J+V.V.V.V./@a+a+a+(@F+V.V.V.V.0+~+&+) ) @ ' z 7.%.# & , 2.% / % % { v P.$ P.( ( n ].( { $ j.u !.k F _@_@(           ",
+"              = ; {.( S 3.X !@:@:.~+|+2+2+1+R.R.1+2+V.V.V.V.V.V.V.V.V.V.V.k+k+a+k+k+a+<@V.V.0+f+a+k+a+a+f+V.V.V.V.J.8+1+y A ~ }.B 4 # # , , , f ( f % ( h.n { n n ( ( n ( n P.^ X [@t }@|@1@C.          ",
+"            a H | ~.$.8 }+|._.T 3 T.8+Z.V.X.R.R.R.T.V.V.V.V.V.V.V.V.V.V.V.2@F+3@*@a+k+a+>@4@a+k+a+>@p+Y.d+V.V.V.,+~+<+5@+ @ g.3 ' %.# # , 2./ 2./ { { h.( ( ( h ( n n ( ].( { S u B.6+e k.| a %         ",
+"            h v e 6@}@7@H } U B z 2 L.m+:+V.T.R.R.R.-+V.V.V.V.V.V.V.V.V.V.V.V.]@a+a+k+k+k+a+a+k+a+a+3+V.V.V.V.V.Z.8+Y.i ) @ 2 z z 4 # , , 2.( , % % O.h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.+@r q 8@8.}.g.~ 5+~+>+(+T.R.R. +/+V.V.V.V.V.V.V.V.V.V.V.a+k+g+M+a+a+a+a+P+o+a+a+V.V.V.V. +8+M.y ) @ 2 3 4 4 5 # # &., 2.* f { { h v P.( ( n n ( { ( ].( P.P /.*.y+c H I (         ",
+"            , 3 ~ @ 9@; O ).B 7.' ' 3 0@5+5+_+_+u+R.R.Y.>+V.V.V.V.V.V.V.V.V.V.k+;@h+a@a+k+k+k+b@c@d@k+,+V.V.1+8+5+. + A <.' }.4 4 # # , , 2.2.( % % { h n n n ( ( ].( n ( n n { 6+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.8@8.%.8.' ~ 2 M.`./+V.I.#@R.Y.9+V.V.V.V.V.V.V.V.V.V.V.V.e@a+#@R+k+f@V.V.V.V..+L.8+`.g@+ i g.~ 3 ' 4 # # , # ( 2.2.f { * ( v ( h P.n n ( ].( { ( ( ( O 7+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 c+S.%+V.>+X. +c+;+V.V.V.V.V.V.V.V.V.V.V.V+L.s+>+h@b+V.V.9+c+<+m+Z.6.! ) <.g.' z 8.4 # # , , , 2.f % % h.v v n n ( ( n ( ].( n n n { =.[+N H.~.+@1@;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A -+R.c+2+V.U.:+'+N._+V.V.V.V.V.V.V.V.V.V.V.V.V.V.>+X.Z.<+8+5+'+! ! A y @ ~ 3 4 4 9.# , , 2.% f % * { ( h $ ( ( n n ( n ( ].( ( P.( @+P [+P X q F ;         ",
+"            ' , n n S O | X # # 9@5 B 7.}.3 @ Q.+ *+T.%+2+V.V.9+_+V.V.V.V.V.V.V.V.V.V.*+1+Z.`.<+8+8+S.T.! c.i + Q.@ ' 2 ' 4 4 # # , % i@i@i@% ( * { v v v P.( n ( n ( n n { n $ n...N y+k t 7@;         ",
+"            # ( v % _ b  .|.9.9@# 9.# 4 7.' @ 2 A i + j@-+-+=+-+V.V.V.V.V.V.V.V.V.V.V.L.8+<+5+Z.J.=+f.. 5.6.i i @ ~ 3 z B %.# # # , , i@1+1+i@i@% ( $ $ $ { n ( n ( n ( ( ( h n 6+).6+g | s }@;         ",
+"            v ( 2.* {.-@| u T # , # # 5 4 7.3 g.~ A y i . c.c.-+-+-+-+-+K.>+V.V.V.V.V.Z.8+-+p.q.b.k@! 6.y ! ) i r.~ ' }.4 4 # , , 2.% i@l@l@1+1+i@i@n n ( ( n ( n ( n n ].n h $ @+O O u 1@|@m@*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ Q.) y y ! . d.e.5.-+8+Z.V.V.V.V.V.J.8+J.f.e.b.6.i + i ) y <.A ' ' 4 B # # , # ( i@l@d@d@l@l@1+ @i@i@].n ( n ( n ( ( ( ( { n W 1.n@p 7@o@}@;         ",
+"            , 5 # , _ g Y c 5 , , , &.!+# %.)+B z 2 ~ 2 + ) y . 6.c.c.p@&+8+1+V.V.V.V.=+|+`.. 5.! + i + ) q@r.2 @ g.3 4 # , , % & , i@l@d@r@d@d@l@l@ @ @i@i@( n ( n n n n ( ( O.[+b u L 7@}@}@;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A Q.i y + y ! ! -+~+8+{+V.V.V.V.Z.m+u+) ) y @ A r.@ ~ @ 3 z ' 4 # 8.7.)+# # i@l@d@r@r@r@d@d@l@l@ @ @i@i@n ( ( ( P.n v { s@++} d ` o@7@;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 g.2 A Q.A ) i ) I.&+8+M.;+V.V.;+|+&+A r.r.3 A 2 2 3 ' ' 4 3 2 4 # 2.2./ i@l@d@r@r@r@r@r@r@d@d@l@l@ @ @i@i@n n P.P.( ( }+!.u t s o@t@;         ",
+"            ( B 5 # S l.[@Y !@, , % 2.% , & # # 5 %.4 8.}.' 3 @ 2 @ 2 @ Q.i .+M.m+<+c+9+V.]+8+L.2 ~ ' ' @ 3 ' z }.3 ' z % % 2.2.f i@l@d@r@r@r@r@r@r@r@r@d@d@l@l@ @ @i@( n v h.v j.-@Q+F G |@G x         ",
+"            ; 5 4 / /.o X t.u@, 2.2., 2.% , # & # # v@%.4 ' z 3 ' g.2 2 ' @ g.@ .@<+8+~+R.-+L.m+1+3 }.z ' 3 4 7.2 @ 7.%.# # , , 2.i@l@d@r@r@r@r@r@r@r@r@r@r@d@d@w@w@i@( ].O.h P.++k. .q t@}@q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # v@4 # )+4 }.2 3 3 3 2 3 2 g.x@R.<+8+8+&+m+8+.@B 5 7.4 ' 3 %.4 2 %.& , , % i@l@d@r@r@r@r@r@r@r@r@r@r@r@r@r@ @w@i@v h v n [+g X  .+@s }@I P.        ",
+"            i., h {.e a #.@+a , * * * / 2./ 2.2., &.&.9.# # 4 %.4 4 4 ' 7.}.z ' }.' z ' J.L.~+8+8+|+y@5 # # w@w@z@A@5 # % , , f i@l@d@r@r@r@r@r@r@r@r@r@r@r@r@ @w@B@i@n ( % ( n.O Y c 1@}@_@l.*         ",
+"            6 = }+g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # # v@%.4 9.4 %.4 4 4 4 )+7.4 4 B *+T.'+# !+# w@F+Z+C@D@i@% , % * % i@l@d@r@r@r@r@r@r@r@r@r@r@r@r@ @w@B@i@v h.{ ,.g J  .Z o@_@}@V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.# 9.# # # B 8.9.%.%.# B %.9.# # # # # # E@w@F+F+F+Z+C@F@i@2.( * i@l@d@r@r@r@r@r@r@r@r@r@r@r@r@r@ @w@B@i@h ( ( z+g k.#+s }@_@F =           ",
+"              M 7 {.0 a a =.O !@* ( { { { % * / / % 2.2., 2., , , # # # # # # # !+# # # # # &., &.& , G@w@Z+F+F+Z+C@w@i@f * % i@l@ @ @ @r@r@r@r@r@r@r@r@r@r@ @w@B@i@{ v h.: -@l X 6@t@}@_@6@S           ",
+"              v.{.v.H.P H.y+[+!@v % O.O.{ ( % % * / f f % 2./ 2., , , , , # & # &., & &., , , , , / % % C@C@Z+F+Z+C@A@i@% { O. @i@ @H@ @ @ @r@r@r@r@r@r@r@r@ @w@B@i@( O.( V R J Y 6@t@}@_@g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % % { / 2.% / 2.2.2.2.% 2., , , , , , , # % , % % 2., 2.w@w@C@C@C@w@A@i@{ i@i@B@I@I@J@ @ @ @ @ @r@r@r@r@r@r@ @w@B@i@h.{ 8 [@Y u I Q+|@K@|@V             ",
+"                0 !.J ).^ C G./.}+w ( { ( % O.{ { % % * * / f / / 2.2.2.f 2.f % % , / % 2.% , , % 2./ w@L@w@w@w@A@w@w@i@i@I@ @ @B@B@I@I@ @ @ @ @ @ @r@r@r@ @w@B@i@O.{ +.^ [@p  .t+1@_@_@Z ;             ",
+"                a g H.a l 6@6@I R +++.( v { { O.O.{ * ( O.% % { f f / / / % 2., , % f 2.2./ / 2.* % C@Z+L@M@w@w@N@w@O@A@A@ @P@w@ @ @B@B@I@I@ @ @ @ @ @ @r@ @w@B@i@h.% P.c p | p F o@_@}@[ %             ",
+"                  ~.s }@o@| Q M ++Q@,.^ ( ( { { O.( { { { { % O.% { % % * 2.O.O.2.% * * { * % % * % C@R@F+F+M@M@M@O@O@O@L@S@w@ @P@w@ @ @B@B@I@I@ @l@ @ @ @ @w@B@i@h.n V ` t Y Q+t@}@_@s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % O.% % { { { % { { % % * * * { % % % O.{ { ( * C@R@F+F+F+F+L@L@L@L@M@T@ @I@w@ @P@w@ @ @B@B@I@I@ @l@ @w@B@i@* v w t F U@_@_@V@_@_@| $               ",
+"                  1 0 < = h.( 1 O ++Y : ^ n v ( { { { { { O.( % { O.( * { ( % ( % { { * ( * O.{ O.{ C@R@R@R@F+F+F+F+L@M@O@W@d@d@ @I@w@ @P@w@ @ @B@B@I@I@ @w@i@i@h.].W F g Q #+}@K@_@}@$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { % { { ( % { { { * ( % O.{ O.{ % { { C@R@L@R@R@R@F+F+M@M@O@D@=+V.d@ @ @P@w@ @P@w@ @ @B@B@I@i@X@B@B@< F H k.0 Y r _@_@6@;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { ( { { { { { ( { ( ( ( C@R@L@L@R@R@R@R@M@M@O@A@I@I@l@d@P@w@ @P@w@ @P@w@ @ @B@B@i@X@B@B@Y@E !. .s }@_@o@}+%                 ",
+"                      l.k.t.Y j Y | | | #+n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( ( v ( ( ( ( ( v ( { v v C@R@L@L@L@R@R@R@M@O@O@S@l@d@d@ @ @ @P@w@ @P@w@ @ @ @l@l@i@X@X@B@p Y p |@_@K@_@Q+;                   ",
+"                        | 6@q #+k H.[ | L c < ,.{ n ].( ( n n ( $ v v v v v P.v v v v v ( n ( $ $ n C@R@L@L@L@L@L@R@M@O@O@Z@d@l@ @ @ @ @ @ @P@w@ @ @l@l@B@B@i@X@B@B@} L 7@}@_@_@7@{.                    ",
+"                        l 1@1@| 3.#.O #+ .E | `@( ( ( n n ( ( ].{ $ ( $ $ $ { $ $ ( ( ( ].( n { { ( C@R@L@L@L@L@L@L@M@O@O@A@I@I@ @ @ @ @ @ @ @ @l@l@B@B@i@i@X@B@B@y+u 7@}@_@_@}@X ^                     ",
+"                          -@ .~.@.8 g d O k.X |.G.].P.( n n ( ( { ].{ { { ( ].{ ].].].( n ( ( ( n ( ( C@R@L@L@L@L@L@M@O@O@S@w@w@I@I@ @ @ @ @l@l@B@B@i@i@X@X@B@b 3.7 p }@}@_@}@p _                       ",
+"                          7 b -@^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( ( ( ].( ( ( ( ( n ( n ].].( n ].C@R@L@L@L@L@L@M@ #A@i@w@w@w@w@I@I@l@l@B@B@i@i@X@X@B@E H.M a l.F }@_@_@r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( ( ].].].^ ].( { ^ n n n ( n ( ( ( n ( ( ( C@R@L@.#L@L@L@+# #Z@l@i@i@w@w@w@w@B@B@i@i@X@X@B@q c 6+}+7 O Q+}@_@_@|@[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { ( ( ( ( ( n ( ( ( ( ( n ( n n n ( n n n C@R@L@+#L@L@.#+#O@S@{ n l@i@i@w@w@i@i@X@X@B@N  .| ^.a v.a p |@K@K@}@c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { { { ( ].{ n n n ( n ( ( ( n ( ( ( ( C@R@L@+#L@L@M@M@O@A@% v h h.l@i@i@X@X@B@] [+q | =.a e 0 j t@_@_@_@H i.                            ",
+"                                $.Y q G 1@l.V C V [ u } q +@@#S ( ( ( ].( ( ( ( ( n ( n n n ( n n n n ( n ( ( n h v v ( ( 2.% 2., , !+B@B@].6 ++Q+#+[ s@e l.Y s _@_@_@t {.{                             ",
+"                                  3.| s 7@I k.0 0.!.| +@q !.Y #+7+].( n ].n n n ( n ( ( ( n ( ( ( ( n ( v v ( { $ n v h.( * { O.O.{ O.v n w | | d +@Q $.O c s _@_@_@F 7 S                               ",
+"                                    Q 6@o@7@F } |.Q+c 7@d /.[ b } +@6 ].( $ ( $ n ( n n n P.v n n n h v $ $ v P.{ O.v O.* ( % v { O.n 8 j c k c K l ^.~.t |@}@}@}@Y@3.S                                 ",
+"                                      Q  .F |@` 6@1@r }@3.w `@`@6+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { O.v h v O.v { n ^ #.`@u.Q+} X ^.X |.~.H ##m@_@_@}@1@a ^                                   ",
+"                                        3.| ` }@G F o@}@S x w 8 G./.N l.R Q+@#7+'.< 6 w ( n { { n ( h { ( h O.{ ( h.( n - #.m.d | ~.g | ++D !.p t ` }@_@m@_@}@6@7 ^                                     ",
+"                                            u ##|@|@_@s 3.< #.#.; - ; #.}+y+6+++|.Y [+N #.= ^ n v v ( * v { O.h.h C < '.+@| X M Q G.#.[ #+M Q+t@|@_@K@_@_@|@ .{.                                        ",
+"                                              b F m@K@t #+-@^.v.= $ n 8 _ _ V {.6+B.R | | +@Q+L F 7@####7@7@7@7@s F #+~.[ Q /.< _ i._ a s  .r o@}@}@_@_@r ~.}+                                          ",
+"                                                a 1@_@s t@Z [@k.e {.$._ ^ n = {.=.1.[ j.[@} u |.b ~.6@q t.k |.[ [ ^.P a $.}+_ : 3.o O l.V@o@}@_@_@_@}@F 0 _                                             ",
+"                                                  3.| 1@s t@1@Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.u@7 u@V : @.@.v.}+9 7 a t.Q+Q+G _@K@_@}@}@7@I 3.;                                               ",
+"                                                      0 | ` 7@7@` F +@| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).-@ .1@s }@_@_@_@_@r p e #.                                                  ",
+"                                                          H.p |@}@o@|@7@1@p 6@1@F H q t.b t.-@J } O 0 l.O e @.3.l.} u | Q+Z F |@m@m@_@_@_@|@t H./.                                                      ",
+"                                                              H.#+` }@}@o@o@o@}@|@####r F F | Q+1@t 1@q +@| | Q+L 1@F 7@|@_@m@}@_@V@_@}@+@^.$.                                                          ",
+"                                                                $.H.t.1@7@}@_@m@K@}@}@}@}@|@7@|@}@m@}@|@r |@|@}@}@m@_@_@_@}@m@m@|@F [@e $.;                                                             ",
+"                                                                      a O } t ##_@K@_@_@}@}@m@m@_@_@_@}@m@_@_@m@m@}@V@m@}@r F [@H.a V                                                                   ",
+"                                                                            3.H.H.I q G 7@|@}@_@_@_@_@_@}@_@}@|@s F p [@[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.bmp
new file mode 100644 (file)
index 0000000..3d64424
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_STLFormat.xpm
new file mode 100644 (file)
index 0000000..7652d4c
--- /dev/null
@@ -0,0 +1,576 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_STLFormat_xpm[] = {
+"100 100 473 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #000000",
+"y.    c #B0ACF1",
+"z.    c #AEAAEF",
+"A.    c #39376C",
+"B.    c #50539C",
+"C.    c #B4B4F2",
+"D.    c #4A4E97",
+"E.    c #404776",
+"F.    c #B2B2F0",
+"G.    c #BBBEF5",
+"H.    c #B9B8F7",
+"I.    c #B6B6F4",
+"J.    c #BEB9F2",
+"K.    c #ACB0F3",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #ADA9EE",
+"Y.    c #787AD5",
+"Z.    c #726FC3",
+"`.    c #686AA3",
+" +    c #CACDF7",
+".+    c #444682",
+"++    c #4A5092",
+"@+    c #888ECF",
+"#+    c #CFD2FC",
+"$+    c #D3D2F7",
+"%+    c #404479",
+"&+    c #474688",
+"*+    c #9793D7",
+"=+    c #CCCFFA",
+"-+    c #D6D5FA",
+";+    c #D8D7FC",
+">+    c #9095D6",
+",+    c #DBDFFC",
+"'+    c #DAD9FE",
+")+    c #8C8ED6",
+"!+    c #E1E1F9",
+"~+    c #CE0000",
+"{+    c #F50000",
+"]+    c #F10000",
+"^+    c #950000",
+"/+    c #2B2D4A",
+"(+    c #EBE7F9",
+"_+    c #E4E3FB",
+":+    c #E8EDFD",
+"<+    c #AC0000",
+"[+    c #ED0000",
+"}+    c #FD0000",
+"|+    c #D10000",
+"1+    c #484878",
+"2+    c #423F76",
+"3+    c #E5E4FC",
+"4+    c #580000",
+"5+    c #D90000",
+"6+    c #FC0000",
+"7+    c #EB0000",
+"8+    c #A40000",
+"9+    c #E80000",
+"0+    c #F40000",
+"a+    c #D30000",
+"b+    c #450000",
+"c+    c #CD0000",
+"d+    c #F70000",
+"e+    c #252547",
+"f+    c #545284",
+"g+    c #8685D3",
+"h+    c #3B0000",
+"i+    c #EDEAFC",
+"j+    c #9B99EA",
+"k+    c #870000",
+"l+    c #DE0000",
+"m+    c #F80000",
+"n+    c #E10000",
+"o+    c #840000",
+"p+    c #630000",
+"q+    c #AF0000",
+"r+    c #C40000",
+"s+    c #B40000",
+"t+    c #890000",
+"u+    c #400000",
+"v+    c #6C0000",
+"w+    c #820000",
+"x+    c #4E0000",
+"y+    c #B60000",
+"z+    c #EC0000",
+"A+    c #EF0000",
+"B+    c #C60000",
+"C+    c #410000",
+"D+    c #282340",
+"E+    c #900000",
+"F+    c #EE0000",
+"G+    c #F30000",
+"H+    c #D50000",
+"I+    c #CF0000",
+"J+    c #C90000",
+"K+    c #AE0000",
+"L+    c #300000",
+"M+    c #DA0000",
+"N+    c #A20000",
+"O+    c #350000",
+"P+    c #9F0000",
+"Q+    c #D60000",
+"R+    c #DB0000",
+"S+    c #C70000",
+"T+    c #AB0000",
+"U+    c #830000",
+"V+    c #8A0000",
+"W+    c #E00000",
+"X+    c #353457",
+"Y+    c #7777C4",
+"Z+    c #B10000",
+"`+    c #CB0000",
+" @    c #DF0000",
+".@    c #F00000",
+"+@    c #E20000",
+"@@    c #B70000",
+"#@    c #8D0000",
+"$@    c #550000",
+"%@    c #680000",
+"&@    c #7E0000",
+"*@    c #9A0000",
+"=@    c #D20000",
+"-@    c #710000",
+";@    c #5E5D9C",
+">@    c #AA0000",
+",@    c #D70000",
+"'@    c #EA0000",
+")@    c #E50000",
+"!@    c #A00000",
+"~@    c #4F0000",
+"{@    c #7B0000",
+"]@    c #920000",
+"^@    c #A90000",
+"/@    c #B80000",
+"(@    c #990000",
+"_@    c #C50000",
+":@    c #CC0000",
+"<@    c #360000",
+"[@    c #5A5FA2",
+"}@    c #6F73BF",
+"|@    c #A10000",
+"1@    c #DC0000",
+"2@    c #F20000",
+"3@    c #FB0000",
+"4@    c #E90000",
+"5@    c #AD0000",
+"6@    c #460000",
+"7@    c #7D0000",
+"8@    c #BC0000",
+"9@    c #7F0000",
+"0@    c #520000",
+"a@    c #CA0000",
+"b@    c #C20000",
+"c@    c #5D0000",
+"d@    c #F60000",
+"e@    c #980000",
+"f@    c #6F0000",
+"g@    c #B30000",
+"h@    c #B00000",
+"i@    c #A30000",
+"j@    c #2D0000",
+"k@    c #8B0000",
+"l@    c #C00000",
+"m@    c #A60000",
+"n@    c #08050A",
+"o@    c #E30000",
+"p@    c #C10000",
+"q@    c #7A0000",
+"r@    c #DD0000",
+"s@    c #9B0000",
+"t@    c #C30000",
+"u@    c #650000",
+"v@    c #2A2E55",
+"w@    c #0A0B14",
+"x@    c #080D1A",
+"y@    c #1D1B32",
+"z@    c #BE0000",
+"A@    c #A70000",
+"B@    c #4C0000",
+"C@    c #5F0000",
+"D@    c #750000",
+"E@    c #D80000",
+"F@    c #E60000",
+"G@    c #F90000",
+"H@    c #FA0000",
+"I@    c #9E0000",
+"J@    c #790000",
+"K@    c #21233F",
+"L@    c #111122",
+"M@    c #8F0000",
+"N@    c #2F0000",
+"O@    c #530000",
+"P@    c #380000",
+"Q@    c #3D0000",
+"R@    c #340000",
+"S@    c #BB0000",
+"T@    c #A80000",
+"U@    c #3A0000",
+"V@    c #E40000",
+"W@    c #7C0000",
+"X@    c #2B0000",
+"Y@    c #670000",
+"Z@    c #BA0000",
+"`@    c #940000",
+" #    c #3F0000",
+".#    c #D40000",
+"+#    c #810000",
+"@#    c #B20000",
+"##    c #8E0000",
+"$#    c #E70000",
+"%#    c #BF0000",
+"&#    c #6A0000",
+"*#    c #6F73CC",
+"=#    c #6E0000",
+"-#    c #570000",
+";#    c #960000",
+">#    c #5C0000",
+",#    c #700000",
+"'#    c #1E0000",
+")#    c #110000",
+"!#    c #470000",
+"~#    c #330000",
+"{#    c #540000",
+"]#    c #930000",
+"^#    c #5E0000",
+"/#    c #9D0000",
+"(#    c #590000",
+"_#    c #A50000",
+":#    c #770000",
+"<#    c #440000",
+"[#    c #600000",
+"}#    c #610000",
+"|#    c #740000",
+"1#    c #4D0000",
+"2#    c #3C0000",
+"3#    c #3E0000",
+"4#    c #260000",
+"5#    c #B90000",
+"6#    c #2A0000",
+"7#    c #8C0000",
+"8#    c #0E0000",
+"9#    c #660000",
+"0#    c #BD0000",
+"a#    c #230000",
+"b#    c #390000",
+"c#    c #970000",
+"d#    c #D00000",
+"e#    c #290000",
+"f#    c #6D0000",
+"g#    c #690000",
+"h#    c #760000",
+"i#    c #510000",
+"j#    c #280000",
+"k#    c #0B070D",
+"l#    c #0D0000",
+"m#    c #780000",
+"n#    c #FE0000",
+"o#    c #140000",
+"p#    c #363961",
+"q#    c #110D1B",
+"r#    c #220000",
+"s#    c #910000",
+"t#    c #FF0000",
+"u#    c #860000",
+"v#    c #484986",
+"w#    c #C80000",
+"x#    c #16152B",
+"y#    c #4A0000",
+"z#    c #535491",
+"A#    c #7275CE",
+"B#    c #4B0000",
+"C#    c #500000",
+"D#    c #1F0000",
+"E#    c #B50000",
+"F#    c #720000",
+"G#    c #850000",
+"H#    c #200000",
+"I#    c #0B0000",
+"J#    c #370000",
+"K#    c #730000",
+"L#    c #270000",
+"M#    c #5A0000",
+"N#    c #050208",
+"O#    c #560000",
+"P#    c #313260",
+"Q#    c #9C0000",
+"R#    c #420000",
+"S#    c #800000",
+"T#    c #15121F",
+"U#    c #09060C",
+"V#    c #5B0000",
+"W#    c #640000",
+"X#    c #250000",
+"Y#    c #1D203B",
+"Z#    c #180000",
+"`#    c #474B93",
+" $    c #210000",
+".$    c #6B0000",
+"+$    c #320000",
+"@$    c #2E0000",
+"#$    c #880000",
+"$$    c #430000",
+"%$    c #1A0000",
+"&$    c #6368AC",
+"*$    c #480000",
+"=$    c #1C0000",
+"-$    c #32386C",
+";$    c #010000",
+">$    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.x.x.x.x.x.x.x.y.z.x.x.x.x.x.x.x.x.x.x.c.! x.x.A @ ' 2 7.4 4 # # , , / * h.v S A.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : B.$.X u u (.5.f.x.x.x.x.x.x.x.x.C.C.C.x.x.x.x.x.x.x.x.f.5.b.x.x.i y 3 3 z 7.4 4 # & , 2./ * { h.{ D.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b E.j | ^.e.f.x.x.x.F.C.F.G.H.I.G.G.G.H.H.J.x.x.y.z.K.p.o.d.x.x.! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.x.x.x.I.H.H.G.G.O.O.G.G.G.G.G.x.x.H.C.F.z.q.f.x.x.5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.y.x.x.G.G.O.T.U.V.V.U.W.T.T.T.x.x.G.J.C.F.X.p.x.x.. 6.i + <.g.z 4 5 Y.Z.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y `.5.f.p.K.F.I.G.x.x.x.x.x.x. + + +U.W.W.U.x.x.T.J.H.I.F.z.x.x.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V )..+++n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u `.@+f.o.X.F.C.H.J.x.x.x.x.x.x.x.#+U.#+$+$+T.x.x.T.V.G.G.F.K.x.x.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.%+&+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w .+O S.*+5.p.K.X.I.J.G.T. +U.#+=+$+x.x.x.-+-+-+;+#+x.x.T.U.O.J.J.C.x.x.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $..+#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 E.S.>+e.p.X.z.F.H.G.T.T.U.=+$+$+$+,+x.x.'+'+'+;+-+x.x.#+ +W.G.G.G.x.x.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 )+5.b.p.K.F.H.G.G.W. + +$+;+;+,+x.x.x.!+!+!+,+'+x.x.=+ + +W.O.G.x.x.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.X.p.z.F.G.T.U.T.x.x.x.x.x.x.x.x.!+,+!+,+,+!+x.x.-+U.U. +V.G.x.x.x.x.x.x.x.+ r.@ ' z ~+{+]+^+, 2.% 2.% L.L.{ n $ n v $ L /+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u `.5.. d.X.X.K.C.J.T.=+W.x.x.x.x.x.x.x.x.(+_+:+!+!+!+x.x.;+-+U. +W.T.x.x.x.x.x.x.x.x.) @ ' ' <+[+}+|+, , 2.f * { L.( v ( ( { n - K 0 9 a 1+P a                     ",
+"                      # ' * (.P 2+u ~.4.i 5.f.o.q.F.H.G.V.T.$+$+,+'+!+!+_+(+3+!+:+3+(+3+_+_+,+,+;+#+U. +G.G.I.F.z.p.f.d.) A @ @ z 4+5+6+7+^+/ / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = E.|.} t.4.i . . d.p.X.F.G.G.T. +U.#+,+!+_+(+!+:+:+(+:+:+:+(+(+_+!+,+'+;+U. +V.G.H.C.y.p.b.d.! i @ 3 3 B 8+9+0+a+b+2.f ( f L.L.M.M.].n n n V t.[ ++{.a 0 O %                 ",
+"                    % , ( @.R c E.e )+! ! 5.f.K.K.C.H.V.T.=+$+-+-+,+!+3+:+:+:+:+(+(+:+:+!+(+!+,+,+-+#+U.U.O.G.I.K.p.o.5.i ) r.2 ' ' # c+d+0+<+2.2./ ( { { v n ( ( ( M.^ t.O $.{.{.a } {.                ",
+"                  - n h.= E.e+| f+g+A i c.5.f.q.K.I.G.T.T. +$+-+,+_+(+h+i+(+:+:+:+(+i+:+3+_+!+,+;+-+#+ +T.O.G.F.y.p.f.j+! i N.3 }.}.5 k+l+m+n+o+f * % % n v v n n { { ]./.O a /.++a !.O %               ",
+"                  ( : S ; k.e+E.f+4.i 6.! b.f.X.F.I.G.G.W. +$+$+,+p+q+r+s+t+u+v+w+w+x+:+:+(+_+,+!+;+$+W.V.O.H.C.K.p.o.! i ) <.~ z 7.4 # y+z+A+B+C+% { { L.h $ M.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.D+[ -.y A 6.5.b.f.X.K.H.G.T.W. +$+-+,+E+c+F+G+H+t+H+I+J+K+L+:+(+!+,+!+-+$+ +T.O.J.F.K.p.o.b.6.) <.' 3 4 4 # b+J+7+M+N+% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % B.B.M Y a _.g+) i 6.d.f.o.y.I.J.G.U.U.U.;+p+O+P+Q+[+Q+^+R+S+T+U+:+3+3+_+,+;+-+#+U.V.O.G.I.y.q.o.! ! ! r.@ ' ' 4 # # V+~+W+B+o+{ % ( n ( M.( ( ( ( ].#.X+g e a o |.O (             ",
+"                D.6 ^ {.k.u Y E.Y+[.N.+ i c.d.p.q.C.J.G.W. +k+Z+`+ @F+.@+@I+@@#@$@(+i+:+:+(+!+,+'+-+=+ +T.H.J.C.y.p.o.. i A r.@ 3 ' %@&@# # *@`+=@y+-@* % v { n n n n ( $ ].P.!.k.1+0 |.| V             ",
+"                {.3.{.$.O d Y ;@-.@ A i ! ! o.p.K.K.G.G.T.>@,@'@{+d+)@J+!@~@i+(+:+:+:+(+(+!+_+,+;+$+=+U.T.G.I.F.K.p.f.. + ) <.b+{@]@^@/@(@% , 8+_@:@^@<@{ n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| [@}@g.@ i . . f.o.z.y.H.G.|@1@2@3@6+4@5@6@i+:+:+(+i+i+i+!+3+_+!+,+$+$+ +V.T.G.C.y.X.o.5.5.! A 7@^@y+8@r+`+B+9@, 0@:@a@b@V+L.n v n n n ( ( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ D.O ~._.g+@ N.) i 5.e.o.K.K.H.c@S+F+d@F+1@P+!+3+(+i+i+e@y+:+3+:+!+_+'+$+$+=+W.T.O.G.I.F.q.o.j+! ) f@g@r+@@h@J+M++@1@i@j@k@l@b@m@j@M.$ M.( ( n ].( { $ j.u !.k F n@n@(           ",
+"              = ; {.( S 3.X [@}@:.~ @ ) + . 5.f.K.K.I.U+a+9+o@p@q@$+,+,+,+3+{@o@_@6@!+!+,+!+-+-+$+ +T.G.G.H.F.K.p.f.. 6.y *@:@~+Z+k@8@r@'@G+d+)@s@K+t@q+u@n { n n ( ( n ( n M.^ X v@t w@x@y@B.          ",
+"            a H | ~.$.8 ++|._.T 3 g.[.<.i ! b.f.o.X.K.w+z@J+A@B@$+$+#+-+,+C@5+{+p@D@,+_+;+-+-+$+ + +V.G.J.C.z.X.f.f.. 6.+ A@E@W+S+&@k+=@F@G+G@}+H@4@I@s+J@( ( h ( n n ( ].( { S u A.%+e k.| a %         ",
+"            h v e K@w@L@H } U B z 2 @ r.A . . b.f.z.K.c@M@o+N@p+O@<@P@Q@R@S@R+R+@@k+-+;+,+-+$+=+U.T.T.G.H.K.K.p.d.! 6.i ) T@n+[+l+N+U@T@I+V@A+d+H@6+F+W@9@n n n ( ( n ( n ( n ( M : B.a k q b %         ",
+"            * ) A 8.#.D+r q Y+8.}.g.~ [.) y ! 5.f.p.z.X@%@Y@P+|+Z@`@%@ #e@,@.#b@^@+#-+$+$+$+ +W.T.V.J.H.F.X.o.f.b.. y ) @ I@V@d@4@@#b+~@##Z+S+E@$#A+'@%#&#M.( ( n n ( { ( ].( M.P /.*.1+c H I (         ",
+"            , 3 ~ @ *#; O ).B 7.' ' 3 ~ ) i + ! d.d.p.K.=#m@r@0+W+h@&@-#Z@a@S@8+;#f@$+ + +U.T.V.G.G.H.F.K.X.p.e.c.. + A >#w+l+H@7+T@@@,#'#)#!#+#K+~+9+$#N+n n ( ( ].( n ( n n { %+$./.o  .L p S         ",
+"            , ~ ~ # v P d E.Y+8.%.8.' ~ 2 @ ! . 5.f.f.o.~#(@|+V@~+A@^+p+<+5@P+*@M@6@{#U.T.T.T.G.G.H.I.K.X.p.f.c.! + i W@y+<@:@H@F@]#E+^#&@|@/#I@y+B@@@$#r@T@M.n n ( ].( { ( ( ( O &+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.f.p.(#T@z@@@@#q+k+5@_#s@M@^#p@<+W@O+G.G.H.H.F.F.K.f.b.b.6.! ) :#`+[+c+T+z+Q+7@<#[#k+*@(@#@e@^+}#w+M+V@_@J@n ( ].( n n n { =..+N E.~.D+y@;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. d.f.o.|#i@@@b@Z@ #e@!@M@C@.# @E@S@E+{#H.C.F.X.f.o.o.b.! ! A y b@F+5+1#-#Q+r@U+, 2.2#x+3#4#{ ( h $ ( 5#7+F+/@n ( ].( ( M.( Q.P .+P X q F ;         ",
+"            ' , n n S O | X # # *#5 B 7.}.3 @ N.+ + 5.j+e.f.6#7#s+p@@@^+8#=#,#8@o@.@A+l+p@(@9#K.K.o.V.f.! c.i + N.M@7+A+9@4 4 l@.@0#% , ( , % ( * { v v v M.=#J+[+a@a#n n { n $ n...N 1+k t L@;         ",
+"            # ( v % _ b  .|.9.*## 9.# 4 7.' @ 2 A i + . . d.5.9#e@i@^+-@b#2#c#d#z+m+H@0+V@J+i@u@d.f.f.. 5.6.i i @ r+3@:@B %.# |@F@~+M@, 2.* * { % ( $ $ $ { n ( U+R+l@e#( ( h n %+).%+g | s w@;         ",
+"            v ( 2.* {.X+| u T # , # # 5 4 7.3 g.~ A y i . c.c.d.f#:#g#1#3#h#K+H+z+m+6+3@d@4@c+|@i#j+! 6.y ! ) i r.n+0+e@4 4 # `@M+F@d#,#f % % { h.v n n ( ( n ( n j#5+p@].n h $ Q.O O u y@x@k#*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ N.) y y ! . d.e.5.l#6@m#N+_@ @A+m+n#n#d+9+a@]@6.i + i ) y <.9#]+A+o#B # # s@l+G@7+!@% { { ( h { ( ( ].n ( n ( n ~@V@S+( { n W 1.p#p L@q#w@;         ",
+"            , 5 # , _ g Y c 5 , , , &.Z.# %.Y.B z 2 ~ 2 + ) y . 6.c.c.j+b.b.r#s#z@r@]+}+t#3@{+n+/@&#i + ) V.r.2 ;#d+o@4 # , , T+$#3@]+<+( % * v M.v v ( ( n ( n ( n n u#+@P+( L..+b u L L@w@w@;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A N.i y + y ! ! ! 5.b.. &@z@o@d@}+n#H@F+d#;#@ A r.@ ~ @ Z+H@E@4 # 8.7.8@F+}+G+Z+, 2.L.( { $ $ n n ( n ( n ( ( ( A@`+v { v#P.} d ` q#L@;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 g.2 A N.A ) i ) y ! i y 7#d#F+G@6+H@2@l+h@B@A 2 2 3 ' w#m+1@2 4 # 2.J+]+}+]+5#* * , * v n ( ( n ( n ( n n n n M.B+Z@( ++!.u t s q#x#;         ",
+"            ( B 5 # S l.v@Y [@, , % 2.% , & # # 5 %.4 8.}.' 3 @ 2 @ 2 @ N.i A ) ) L+s++@]+d@d@2@o@z@&#' @ 3 ' 8#E@m+ @z % % y#a@9+.@$#S@8#{ $ L.% L.n n ( n ( n ( ( ( ( n v l+v j.X+e+F G x@G x         ",
+"            ; 5 4 / /.o X t.z#, 2.2., 2.% , # & # # A#%.4 ' z 3 ' g.2 2 ' @ g.@ 3 ' ]#=@F@[+.@A+n+l@W@z ' 3 4 u@W+H@l+%.# # o+r+R+$#n+/@B#{ { { { f % n ( n ( n n n v ( ].L.!@g@P.k. .q x#w@q (         ",
+"            #., # = ^.M E.O =.# f % / % , % , , & # # A#4 # Y.4 }.2 3 3 3 2 3 2 g.g.{@r+5+o@4@9+R+z@+#5 7.4 ' e@'@3@E@%.& , !@d#9+2@o@@@C#{ ( ( ( ( { % n ( n ( ( ( $ v h v n D#g X  .D+s w@I M.        ",
+"            i., h {.e a #.Q.a , * * * / 2./ 2.2., &.&.9.# # 4 %.4 4 4 ' 7.}.z ' }.' W@5#|+1@+@ @|+E#7@5 # # 4 s+]+H@J+# % F#z@9+H@0+l+y+b+n n n n ( { % v ( n n n n $ n ( % ( n.O Y c y@w@n@l.*         ",
+"            6 = ++g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # # A#%.4 9.4 %.4 4 4 4 G#@@I+1@W+E@J+<+F#Z.# &.H#a@2@]+5#% (#(@a@7+V@|+b@!@v M.h ( ( { ( { f n ( ( ( ( n v h.{ ,.g J  .Z q#n@w@V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.# 9.# # # B 8.9.%.%.# ]@S@a+o@)@M+b@N+9#, Z.9.J@|+9++@o#C#v+##T+g@m@|@!@D@{ { n ].( ].( ( L.* n n v ( M.h ( ( 2+g k.R.s w@n@F =           ",
+"              M 7 {.0 a a =.O [@* ( { { { % * / / % 2.2., 2., , , # # # # # # # Z.I#*@%#M+'@'@E@8@e@4+, , # u#^@R@c@,#7@W@h#9@:#G#`@W@{ L.( ( ( ].( ].].{ % v h $ v { v h.: X+l X K@x#w@n@K@S           ",
+"              v.{.v.E.P E.1+.+[@v % L.L.{ ( % % * / f f % 2./ 2., , , , , # & # &.6@|@S++@[+F@a+S@`@C+% & e#J#K#E+|@Z+5#_#D@u@C@{@-@% { v n n ( { ( ( ( { ( { n $ v ( L.( V R J Y K@x#w@n@g (           ",
+"                a E.b g a _ /./.] { { { % h.{ { % % { / 2.% / 2.2.2.2.% 2., , , , C@^@c+o@F@5+w#h@W@N@L#u+K#*@@#0#w#a+R+z@v+M#-#9#{ { % ( %@K#C#<@{ n ].( v / ( v ( h.{ 8 v@Y u I e+x@N#x@V             ",
+"                0 !.J ).^ C D./.++w ( { ( % L.{ { % % * * / f / / 2.2.2.f 2.f % % h#K+`+Q+~+/@s@&#Q@O#D@^+@#B+I+H+R+o@7+r+p+4+O#O#L.{ h.y+d#I+@#k+i#( ].$ ( , M.h.L.{ +.^ v@p  ./+y@n@n@Z ;             ",
+"                a g E.a l K@K@I R P.+.( v { { L.L.{ * ( L.% % { f f / / / % 2., , G#h@r+B+g@`@K#=#G#*@K+p@~+E@ @o@F@[+0+S+^#4+O#O@{ ]#F@]+0+'@ @~+A@(#( n n / v h h.% M.c p | p F q#n@w@[ %             ",
+"                  ~.s w@q#| Q M P.P#,.^ ( ( { { L.( { { { { % L.% { % % * 2.L.L.2.#@^@/@/@5@Q#s@T@y+l@a@.#R+o@'@F+.@{+3@w#c@4+O#$@( @@H@{+'@V@F@'@ @m@R#h M.f v ( h.n V ` t Y e+x#w@n@s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % L.% % { { { % { { % % * * u+V+i@s+5#E#E#0#J+~+.#5+W+9+A+{+G@d+G@}+r+^#4+4+O#{ { t@d+o@|+n+[+A+~+S#n v 2.L.* v w t F T#n@n@U#n@n@| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { { { { { L.( % { L.( * { ( % ( }#G#i@S@_@_@J+=@Q+,@r@V@z+G+m+6+}+3@3@m+b@M#M#V#-#( ( n i@*@`@r@2@G+l+/#R@( 2.L.h.].W F g Q R.w@N#n@w@$.%               ",
+"                    P 9 B.B.7 7 Q E.c | 8 h ( v ( ( ( ( ( { { { % { { ( % { { r#W#7#Z+a@=@.#,@r@r@W+9+]+m+H@}+n#}+6+H@]+y+~@p+}#M#X#{ ( n ( n c+.@2@R+<+[#* * * v < F H k.0 Y r n@n@K@;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { {#+#<+a@M++@V@)@F@$#z+0+3@}+}+6+6+H@d+0+r@U+$@w+%@>#U@n ( n ( ( +#1@+@:@s+7@* f h.w t Y#E !. .s w@n@q#++%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( B@7@g@.#n+9+A+]+[+'@A+d+n#}+3@d+{+{+2@z+5+N+~#Q#8+F#>#3#( n ( n n { ;#Z@%#_@s#* f ,.R.L p Y p x@n@N#n@e+;                   ",
+"                        | K@q R.k E.[ | L c < ,.{ n ].( ( n n ( $ v v v v h+D@s+1@]+{+m+H@H@G+[+2@6+6+d@[+4@F@9+F@Q+A@ #m@.#b@m#V#h+( n ( h ( Z#D@|@z@t@k@* C `# .k } L L@w@n@n@L@{.                    ",
+"                        l y@y@| 3.#.O R. .E | `#( ( ( n n ( ( ].{ $ ( $  $v+5#o@G@6+}+n#n#6+{+F+G+H@F+5+t@0#J+|+I+h@.$M@5+7+H++#V#+$n ( v n v W#c#7#t+1#f U N p l.1+u L@w@n@n@w@X ^                     ",
+"                          X+ .~.@.8 g d O k.X |.D.].M.( n n ( ( { ].{ { u@b@7+3@t#}+6+3@6+3@0+F+G+[+I+t+ #y#@$%@#$J@`@c+F+{+5+G#p+$$n $ ( n %$`@F#i#* * m &+D+b 3.7 p w@w@n@w@p _                       ",
+"                          7 b X+^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( -#t@[+6+n#6+3@H@H@H@G@2@7+F+|+(#9#m@%#S@*@&@^+S+$#d+{+M+^+=#U@h v v L.v $@!#% { &$m.E E.M a l.F w@n@n@r 3.n                       ",
+"                            e !.b k.I | Q *.D.'.s.j.1.n n ( ( ].].].y#l@G+n#}+3@H@H@3@3@H@0+$#=@`@b+]#5#Q+o@W+~+q+|@p@7+{+F+R+>@m#n n h v ( { * { v *.q c %+++7 O e+w@n@n@x@[ -                         ",
+"                              o Y | q q O D.8 /.$.[ j 1.- n { ( ( @$Z+'@6+H@m+G@3@6+}+G@.@r@I@R###s+a@M+)@F@r@p@#$*$V#_#:@~+z@|@p+( L.v L.* % % C N  .| ^.a v.a p x@N#N#w@c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { -@w#r@+@o@F+d@3@}+6+]+H+S#%@Q#5#a@.#R+R+d#I@^#H#( ( 2.* !#0@=$h.{ ( { % * * ] .+q | =.a e 0 j x#n@n@n@H i.                            ",
+"                                $.Y q G y@l.V C V [ u } q D+-$S ( ;$N+<+h@%#Q+]+3@}+m+R+:#-@^+T@s+%#_@B+g@D@6@n h v v ( ( 2.% 2., , Z., / ].6 P.e+R.[ v#e l.Y s n@n@n@t {.{                             ",
+"                                  3.| s L@I k.0 0.!.| D+q !.Y R.&+].<#/#/@8@S@~+o@7+1@+#v+7#;#s@_#>@>@i@u#c@( { $ n v h.( * { L.L.{ L.v n w | | d D+Q $.O c s n@n@n@F 7 S                               ",
+"                                    Q K@q#L@F } |.e+c L@d /.[ b } D+6 ].l@|+b@8+]@9@J#D@+#K#K##@|@s@s#S#^#$ v M.{ L.v L.* ( % v { L.n 8 j c k c K l ^.~.t x@w@w@w@Y#3.S                                 ",
+"                                      Q  .F x@` K@y@r w@3.w `#`#%+[ t.q x+p@%#@#]##$#$-@{ S 9###J@{ n v v v { L.v h v L.v { n ^ #.`#u.e+} X ^.X |.~.H >$k#n@n@w@y@a ^                                   ",
+"                                        3.| ` w@G F q#w@S x w 8 D./.N l.R e+^#q@S#p+6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` w@n@k#n@w@K@7 ^                                     ",
+"                                            u >$x@x@n@s 3.< #.#.; - ; #.++1+%+P.|.Y .+N #.= ^ n v v ( * v { L.h.h C < '.D+| X M Q D.#.[ R.M e+x#x@n@N#n@n@x@ .{.                                        ",
+"                                              b F k#N#t R.X+^.v.= $ n 8 _ _ V {.%+A.R | | D+e+L F L@>$>$L@L@L@L@s F R.~.[ Q /.< _ i._ a s  .r q#w@w@n@n@r ~.++                                          ",
+"                                                a y@n@s x#Z v@k.e {.$._ ^ n = {.=.1.[ j.v@} u |.b ~.K@q t.k |.[ [ ^.P a $.++_ : 3.o O l.U#q#w@n@n@n@w@F 0 _                                             ",
+"                                                  3.| y@s x#y@Z K ~.X e #.- _ {.l.E.).g |.|.b O O X b 3.z#7 z#V : @.@.v.++9 7 a t.e+e+G n@N#n@w@w@L@I 3.;                                               ",
+"                                                      0 | ` L@L@` F D+| J ^.P g ~.X O b O l X E.g Q ; = = V - S < [ g a 0 ).X+ .y@s w@n@n@n@n@r p e #.                                                  ",
+"                                                          E.p x@w@q#x@L@y@p K@y@F H q t.b t.X+J } O 0 l.O e @.3.l.} u | e+Z F x@k#k#n@n@n@x@t E./.                                                      ",
+"                                                              E.R.` w@w@q#q#q#w@x@>$>$r F F | e+y@t y@q D+| | e+L y@F L@x@n@k#w@n@U#n@w@D+^.$.                                                          ",
+"                                                                $.E.t.y@L@w@n@k#N#w@w@w@w@x@L@x@w@k#w@x@r x@x@w@w@k#n@n@n@w@k#k#x@F v@e $.;                                                             ",
+"                                                                      a O } t >$n@N#n@n@w@w@k#k#n@n@n@w@k#n@n@k#k#w@U#k#w@r F v@E.a V                                                                   ",
+"                                                                            3.E.E.I q G L@x@w@n@n@n@n@n@w@n@w@x@s F p v@[ E.3.B.                                                                        ",
+"                                                                                    {.a 0 M E.g k.b l b [ g O P E.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.bmp
new file mode 100644 (file)
index 0000000..7e91254
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_Tests.xpm
new file mode 100644 (file)
index 0000000..afe9fce
--- /dev/null
@@ -0,0 +1,660 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_Tests_xpm[] = {
+"100 100 557 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #B2B2F0",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B9B8F7",
+"K.    c #BEB9F2",
+"L.    c #6763BD",
+"M.    c #635FB8",
+"N.    c #888CE1",
+"O.    c #C3C2F4",
+"P.    c #373766",
+"Q.    c #3B4074",
+"R.    c #232344",
+"S.    c #656396",
+"T.    c #C5C4F5",
+"U.    c #CFCAF7",
+"V.    c #C7C6F8",
+"W.    c #CAC8FA",
+"X.    c #787AD5",
+"Y.    c #726FC3",
+"Z.    c #686AA3",
+"`.    c #CACDF7",
+" +    c #444682",
+".+    c #4A5092",
+"++    c #888ECF",
+"@+    c #CFD2FC",
+"#+    c #D3D2F7",
+"$+    c #CCCFFA",
+"%+    c #404479",
+"&+    c #474688",
+"*+    c #9793D7",
+"=+    c #D8D7FC",
+"-+    c #DAD9FE",
+";+    c #D6D5FA",
+">+    c #9095D6",
+",+    c #DBDFFC",
+"'+    c #8C8ED6",
+")+    c #E1E1F9",
+"!+    c #E4E3FB",
+"~+    c #2B2D4A",
+"{+    c #EBE7F9",
+"]+    c #E8EDFD",
+"^+    c #484878",
+"/+    c #423F76",
+"(+    c #E5E4FC",
+"_+    c #252547",
+":+    c #545284",
+"<+    c #8685D3",
+"[+    c #EDEAFC",
+"}+    c #9B99EA",
+"|+    c #282340",
+"1+    c #353457",
+"2+    c #7777C4",
+"3+    c #5E5D9C",
+"4+    c #5A5FA2",
+"5+    c #6F73BF",
+"6+    c #08050A",
+"7+    c #2A2E55",
+"8+    c #0A0B14",
+"9+    c #080D1A",
+"0+    c #1D1B32",
+"a+    c #21233F",
+"b+    c #111122",
+"c+    c #6F73CC",
+"d+    c #FCFF00",
+"e+    c #000000",
+"f+    c #BCB9C5",
+"g+    c #DDE05F",
+"h+    c #F2F421",
+"i+    c #FAFD05",
+"j+    c #F9FC0B",
+"k+    c #F1F32A",
+"l+    c #DDDE71",
+"m+    c #C4BFDC",
+"n+    c #C5C6B3",
+"o+    c #DFE258",
+"p+    c #F1F420",
+"q+    c #F9FC08",
+"r+    c #FBFD07",
+"s+    c #F1F41C",
+"t+    c #DBDF46",
+"u+    c #C3C387",
+"v+    c #9B99D0",
+"w+    c #8E8C8E",
+"x+    c #C2C544",
+"y+    c #E8EB1A",
+"z+    c #F6F907",
+"A+    c #F8FB05",
+"B+    c #EAED16",
+"C+    c #CCD03A",
+"D+    c #A3A26B",
+"E+    c #686BAF",
+"F+    c #CDCE7B",
+"G+    c #FBFE03",
+"H+    c #F6F912",
+"I+    c #C3C4BF",
+"J+    c #AFABEC",
+"K+    c #DDE05E",
+"L+    c #F8FB09",
+"M+    c #6A6EC2",
+"N+    c #C1C44B",
+"O+    c #E8EA35",
+"P+    c #9E9F96",
+"Q+    c #44455A",
+"R+    c #2B2C1E",
+"S+    c #787A03",
+"T+    c #FAFD00",
+"U+    c #EAED0C",
+"V+    c #A2A6D0",
+"W+    c #CBCD7A",
+"X+    c #EBEE2F",
+"Y+    c #989880",
+"Z+    c #414050",
+"`+    c #191A1E",
+" @    c #333406",
+".@    c #878903",
+"+@    c #F0F301",
+"@@    c #555483",
+"#@    c #7D81CF",
+"$@    c #AEB165",
+"%@    c #DDE025",
+"&@    c #797C68",
+"*@    c #2D2E41",
+"=@    c #131417",
+"-@    c #323205",
+";@    c #878802",
+">@    c #35376E",
+",@    c #5459A9",
+"'@    c #0B070D",
+")@    c #929AC6",
+"!@    c #F9FC06",
+"~@    c #ECEF26",
+"{@    c #575874",
+"]@    c #020203",
+"^@    c #8B8D00",
+"/@    c #7A7B0A",
+"(@    c #7D7EB8",
+"_@    c #F1F31E",
+":@    c #535350",
+"<@    c #151500",
+"[@    c #B3B500",
+"}@    c #060509",
+"|@    c #EAEC18",
+"1@    c #3D3E41",
+"2@    c #040407",
+"3@    c #363961",
+"4@    c #110D1B",
+"5@    c #C4C770",
+"6@    c #8F9056",
+"7@    c #232234",
+"8@    c #7978B6",
+"9@    c #9896E5",
+"0@    c #9DA2B2",
+"a@    c #BEC000",
+"b@    c #111118",
+"c@    c #9395D9",
+"d@    c #121200",
+"e@    c #1B1C2D",
+"f@    c #6C6AA5",
+"g@    c #8589DA",
+"h@    c #868ADC",
+"i@    c #A2A1C9",
+"j@    c #404169",
+"k@    c #07070B",
+"l@    c #F9FC04",
+"m@    c #131425",
+"n@    c #464A8B",
+"o@    c #585BB4",
+"p@    c #595CB8",
+"q@    c #4A4E95",
+"r@    c #2B2D59",
+"s@    c #050509",
+"t@    c #E2E533",
+"u@    c #161706",
+"v@    c #171825",
+"w@    c #8C93DE",
+"x@    c #9F9DE5",
+"y@    c #E8EB00",
+"z@    c #53527D",
+"A@    c #EAEC26",
+"B@    c #B2B400",
+"C@    c #272700",
+"D@    c #787FC3",
+"E@    c #797DCA",
+"F@    c #25263F",
+"G@    c #E4E722",
+"H@    c #5652A1",
+"I@    c #5457AD",
+"J@    c #1A1C35",
+"K@    c #484986",
+"L@    c #F3F610",
+"M@    c #F9FC00",
+"N@    c #242639",
+"O@    c #B1B594",
+"P@    c #ECEF1B",
+"Q@    c #D2D649",
+"R@    c #C1C274",
+"S@    c #A3A1A0",
+"T@    c #8783D3",
+"U@    c #989C7E",
+"V@    c #E6EA16",
+"W@    c #C6C940",
+"X@    c #A7AA64",
+"Y@    c #848988",
+"Z@    c #5F62B9",
+"`@    c #16152B",
+" #    c #FBFD03",
+".#    c #0B0B12",
+"+#    c #ACB097",
+"@#    c #D8DB06",
+"##    c #F1F413",
+"$#    c #B0B282",
+"%#    c #91957F",
+"&#    c #D7DA05",
+"*#    c #EEF110",
+"=#    c #9C9F71",
+"-#    c #535491",
+";#    c #F7FA09",
+">#    c #0A0A00",
+",#    c #565990",
+"'#    c #2A2B00",
+")#    c #686900",
+"!#    c #9A9C00",
+"~#    c #CDCF00",
+"{#    c #ADB07D",
+"]#    c #3E417A",
+"^#    c #9B9F6B",
+"/#    c #7275CE",
+"(#    c #E4E723",
+"_#    c #2E2F00",
+":#    c #555593",
+"<#    c #131322",
+"[#    c #161600",
+"}#    c #9D9F00",
+"|#    c #D9DC03",
+"1#    c #46487D",
+"2#    c #3E4080",
+"3#    c #0E0F1E",
+"4#    c #D9DB02",
+"5#    c #373971",
+"6#    c #BFC259",
+"7#    c #878900",
+"8#    c #7174CB",
+"9#    c #6265AF",
+"0#    c #45477C",
+"a#    c #2D2E51",
+"b#    c #202125",
+"c#    c #F6F900",
+"d#    c #46487E",
+"e#    c #F8FB06",
+"f#    c #090900",
+"g#    c #4C4F9D",
+"h#    c #373A6E",
+"i#    c #29274A",
+"j#    c #1D1E22",
+"k#    c #36396D",
+"l#    c #878AAD",
+"m#    c #FAFD03",
+"n#    c #F5F800",
+"o#    c #3B3C00",
+"p#    c #6063AC",
+"q#    c #8184C2",
+"r#    c #D0D345",
+"s#    c #DBDE34",
+"t#    c #898CB5",
+"u#    c #8487B2",
+"v#    c #D6D900",
+"w#    c #10111D",
+"x#    c #E8EA1A",
+"y#    c #313200",
+"z#    c #D5D92F",
+"A#    c #79769E",
+"B#    c #7A7EA8",
+"C#    c #0D0E1B",
+"D#    c #B1B46B",
+"E#    c #9DA02D",
+"F#    c #8A8DA9",
+"G#    c #787DC6",
+"H#    c #817EC9",
+"I#    c #9391A1",
+"J#    c #BEC161",
+"K#    c #F4F70C",
+"L#    c #FAFD02",
+"M#    c #CBCE48",
+"N#    c #9A9D91",
+"O#    c #7C7FBC",
+"P#    c #7275CB",
+"Q#    c #7A7DBF",
+"R#    c #95998E",
+"S#    c #E3E424",
+"T#    c #696A00",
+"U#    c #030305",
+"V#    c #C2C54D",
+"W#    c #595CB6",
+"X#    c #C4C840",
+"Y#    c #898D80",
+"Z#    c #696CAD",
+"`#    c #5A5FB4",
+" $    c #676AB0",
+".$    c #8A8D86",
+"+$    c #E1E223",
+"@$    c #020204",
+"#$    c #9EA262",
+"$$    c #F1F410",
+"%$    c #686BBD",
+"&$    c #252643",
+"*$    c #FBFE02",
+"=$    c #AFB351",
+"-$    c #0F101D",
+";$    c #7D80A7",
+">$    c #F5F809",
+",$    c #F3F60B",
+"'$    c #ACB04E",
+")$    c #0E0F1C",
+"!$    c #4C4E60",
+"~$    c #7E7F00",
+"{$    c #C1C300",
+"]$    c #E7EA00",
+"^$    c #F9FC01",
+"/$    c #F5F807",
+"($    c #E4E720",
+"_$    c #C5C84C",
+":$    c #8B8E6F",
+"<$    c #37385B",
+"[$    c #06070C",
+"}$    c #7175C0",
+"|$    c #9CA085",
+"1$    c #9EA000",
+"2$    c #D2D400",
+"3$    c #F0F304",
+"4$    c #F4F709",
+"5$    c #E1E322",
+"6$    c #BDC04F",
+"7$    c #6C6F74",
+"8$    c #131424",
+"9$    c #3D3F73",
+"0$    c #84819C",
+"a$    c #BCBF16",
+"b$    c #EDF000",
+"c$    c #E9EC05",
+"d$    c #D9DA28",
+"e$    c #666BB6",
+"f$    c #919679",
+"g$    c #F3F609",
+"h$    c #DFE222",
+"i$    c #B7BB49",
+"j$    c #63656E",
+"k$    c #111222",
+"l$    c #383B6E",
+"m$    c #3C3F72",
+"n$    c #080910",
+"o$    c #010102",
+"p$    c #31335D",
+"q$    c #5855A2",
+"r$    c #040509",
+"s$    c #05060B",
+"t$    c #010101",
+"u$    c #2E305A",
+"v$    c #050208",
+"w$    c #5E61B1",
+"x$    c #343662",
+"y$    c #18192E",
+"z$    c #090910",
+"A$    c #050408",
+"B$    c #11111F",
+"C$    c #292B4D",
+"D$    c #474986",
+"E$    c #6763BB",
+"F$    c #676BC0",
+"G$    c #474A85",
+"H$    c #272647",
+"I$    c #121221",
+"J$    c #06060B",
+"K$    c #06060A",
+"L$    c #121323",
+"M$    c #2C2A50",
+"N$    c #4B4E9B",
+"O$    c #52559D",
+"P$    c #1B1C38",
+"Q$    c #16172B",
+"R$    c #585BB6",
+"S$    c #3B3E78",
+"T$    c #222346",
+"U$    c #101020",
+"V$    c #05050A",
+"W$    c #2D2F54",
+"X$    c #514E97",
+"Y$    c #313260",
+"Z$    c #15121F",
+"`$    c #09060C",
+" %    c #1D203B",
+".%    c #474B93",
+"+%    c #6368AC",
+"@%    c #32386C",
+"#%    c #13101D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.q.q.y.x.D.E.F.F.F.D.y.y.D.z.y.o.p.f.5.b.! ) i y 3 3 z 7.4 4 # & , 2./ * { h.{ G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.F.D.I.J.E.I.I.I.J.J.K.D.D.A.z.y.p.o.d.c.! ! + r.g.' z ' 5 # # & &.% 2.% L.( v ^ u.Y =.7 8 # # M._ (                                 ",
+"                                  ~ N.) ~ %.V |.u c J f.f.o.y.y.D.E.J.J.I.I.O.O.I.I.I.I.I.J.I.J.F.D.z.q.f.5.. 5.! ) [.' 2 8.}.5 # # & % , 2.h.h n v ( W P.Q./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } R.S.5.f.o.z.A.F.J.I.I.O.T.U.V.V.U.W.T.T.T.I.K.I.K.F.D.x.p.o.d.. 6.i + <.g.z 4 5 X.Y.&.& 2./ / h.% M.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y Z.5.f.p.y.D.E.I.K.V.T.T.T.`.`.`.`.U.W.W.U.T.T.T.K.J.E.D.z.p.f.e.b.! i <.' ~ }.4 4 # & , 2.% 2.h.{ % h n ].V ). +.+n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u Z.++f.o.x.D.F.J.K.T.V.`.U.@+@+U.@+U.@+#+#+T.$+`.T.V.I.I.D.y.z.p.f.d.c.y ) N.' z B 4 # # , , , f 2.% v v h M.].#.%+&+_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w  +O S.*+5.p.y.x.E.K.I.T.`.U.@+$+#+=+-+=+;+;+;+=+@+U.@+T.U.O.K.K.F.A.z.p.f.b.! y A 2 2 }.4 5 # # , % % , % ( v v n h w < $. +#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 +.1 H.S.>+e.p.x.z.D.J.I.T.T.U.$+#+#+#+,+,+,+-+-+-+=+;+=+#+@+`.W.I.I.I.E.A.p.f.b.. i ) r.@ z }.4 # , , , 2.f { * L.( L.n ( C 1 1.'.: < v.7 {.L.                      ",
+"                          % ' @ 4 L.Q P.0 '+5.b.p.y.D.J.I.I.W.`.`.#+=+=+,+=+,+)+)+)+)+,+-+-+#+$+`.`.W.O.I.E.D.z.p.e.b.! ) @ ' 3 8.4 # # , 2./ 2.% * h.{ L.$ ( M.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= P.J w.5.f.x.p.z.D.I.T.U.T.$+@+;+=+,+,+!+)+)+,+)+,+,+)+,+=+;+U.U.`.V.I.E.D.y.p.f.d.i + r.@ ' z 4 4 # &., 2.% 2.% L.L.{ n $ n v $ L ~+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a u Z.5.. d.x.x.y.F.K.T.$+W.#+#+,+-+!+)+)+{+{+!+]+)+)+)+,+,+=+;+U.`.W.T.J.D.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f * { L.( v ( ( { n - K 0 9 a ^+P a                     ",
+"                      # ' * (.P /+u ~.4.i 5.f.o.q.D.J.I.V.T.#+#+,+-+)+)+!+{+(+)+]+(+{+(+!+!+,+,+=+@+U.`.I.I.E.D.z.p.f.d.) A @ @ z %.4 # , , / / f % % { h.n v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.p.x.D.I.I.T.`.U.@+,+)+!+{+)+]+]+{+]+]+]+{+{+!+)+,+-+=+U.`.V.I.J.F.A.p.b.d.! i @ 3 3 B 4 X.# , % 2.f ( f L.L.M.M.].n n n V t.[ .+{.a 0 O %                 ",
+"                    % , ( @.R c H.e '+! ! 5.f.y.y.F.J.V.T.$+#+;+;+,+)+(+]+]+]+]+{+{+]+]+)+{+)+,+,+;+@+U.U.O.I.E.y.p.o.5.i ) r.2 ' ' # # &., , 2.2./ ( { { v n ( ( ( M.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H._+| :+<+A i c.5.f.q.y.E.I.T.T.`.#+;+,+!+{+(+[+{+]+]+]+{+[+]+(+!+)+,+=+;+@+`.T.O.I.D.A.p.f.}+! i N.3 }.}.5 # # , 2./ f * % % n v v n n { { ]./.O a /..+a !.O %               ",
+"                  ( : S ; k._+H.:+4.i 6.! b.f.x.D.E.I.I.W.`.#+#+,+,+)+]+[+]+[+{+[+]+]+]+]+{+!+,+)+=+#+W.V.O.J.F.y.p.o.! i ) <.~ z 7.4 # # , % / f % { { L.h $ M.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  L.^ i.x l.|+[ -.y A 6.5.b.f.x.y.J.I.T.W.`.#+;+,+!+!+(+[+]+]+]+{+[+[+[+]+{+)+,+)+;+#+`.T.O.K.D.y.p.o.b.6.) <.' 3 4 4 # # & 2.2.2.% % { { v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.<+) i 6.d.f.o.A.E.K.I.U.U.U.=+-+,+)+]+]+[+]+[+]+]+]+]+(+(+!+,+=+;+@+U.V.O.I.E.A.q.o.! ! ! r.@ ' ' 4 # # & , ( f * { % ( n ( M.( ( ( ( ].#.1+g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.2+[.N.+ i c.d.p.q.F.K.I.W.`.#+;+!+!+!+{+[+{+]+]+[+{+[+]+]+{+)+,+-+;+$+`.T.J.K.F.A.p.o.. i A r.@ 3 ' X.# # # , , 2.% { * % v { n n n n ( $ ].P.!.k.^+0 |.| V             ",
+"                {.3.{.$.O d Y 3+-.@ A i ! ! o.p.y.y.I.I.T.`.U.#+;+,+!+(+]+]+[+{+]+]+]+{+{+)+!+,+=+#+$+U.T.I.E.D.y.p.f.. + ) <.g.}.B 5 # # % , ( / f % h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| 4+5+g.@ i . . f.o.z.A.J.I.V.`.#+;+=+,+(+(+[+]+]+{+[+[+[+)+(+!+)+,+#+#+`.V.T.I.F.A.x.o.5.5.! A @ 3 ' 8.4 # &.& , , / { { L.L.n v n n n ( ( n $ ].P.!.j.=.k.Y } L.          ",
+"              {.= {.{._ G.O ~._.<+@ N.) i 5.e.o.y.y.J.I.O.T.`.#+;+-+)+(+{+[+[+]+]+]+(+]+)+!+-+#+#+$+W.T.O.I.E.D.q.o.}+! ) ) @ ' z 7.%.# & , 2.% / % % { v M.$ M.( ( n ].( { $ j.u !.k F 6+6+(           ",
+"              = ; {.( S 3.X 4+5+:.~ @ ) + . 5.f.y.y.E.K.K.W.`.`.#+#+,+,+,+(+(+(+(+]+)+)+,+)+;+;+#+`.T.I.I.J.D.y.p.f.. 6.y A ~ }.B 4 # # , , , f ( f % ( h.n { n n ( ( n ( n M.^ X 7+t 8+9+0+C.          ",
+"            a H | ~.$.8 .+|._.T 3 g.[.<.i ! b.f.o.x.y.E.I.O.T.U.#+#+@+;+,+,+(+(+!+,+,+!+=+;+;+#+`.`.V.I.K.F.z.x.f.f.. 6.+ @ g.3 ' %.# # , 2./ 2./ { { h.( ( ( h ( n n ( ].( { S u B.%+e k.| a %         ",
+"            h v e a+8+b+H } U B z 2 @ r.A . . b.f.z.y.y.J.K.T.T.`.U.;+#+-+,+=+=+!+,+;+=+,+;+#+$+U.T.T.I.J.y.y.p.d.! 6.i ) @ 2 z z 4 # , , 2.( , % % L.h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.|+r q 2+8.}.g.~ [.) y ! 5.f.p.z.D.E.I.I.I.V.`.U.U.#+#+,+;+#+#+;+#+#+#+`.W.T.V.K.J.D.x.o.f.b.. y ) @ 2 3 4 4 5 # # &., 2.* f { { h v M.( ( n n ( { ( ].( M.P /.*.^+c H I (         ",
+"            , 3 ~ @ c+; O ).B d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+T.T.`.`.U.W.#+U.#+#+#+`.`.U.T.V.I.I.J.D.y.x.p.e.c.. + d+d+d+}.4 4 # # , , 2.2.( % % { h n n n ( ( ].( n ( n n { %+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.2+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+K.I.K.T.T.`.`.`.`.U.`.U.T.T.T.I.I.J.E.y.x.p.f.c.! + i d+d+d+' 4 # # , # ( 2.2.f { * ( v ( h M.n n ( ].( { ( ( ( O &+1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.e+e+e+e+e+d+d+d+e+e+e+e+e+e+e+e+e+K.I.O.I.T.T.I.V.I.V.I.I.I.J.J.D.D.y.f.b.b.6.! ) <.d+d+d+e+e+# # , , , 2.f % % h.v v n n ( ( n ( ].( n n n { =. +N H.~.|+0+;         ",
+"            ' z * S > o | =.4 B 5 e+e+e+e+e+d+d+d+e+e+e+e+e+e+e+e+e+J.J.K.K.J.K.I.I.I.I.I.I.J.F.D.x.f.o.o.b.! ! A y @ d+d+d+e+e+# , , 2.% f % * { ( h $ ( ( n n ( n ( ].( ( M.( Q.P  +P X q F ;         ",
+"            ' , n n S O | X # # c+5 B 7.}.3 d+d+d+e+e+}+e.f.f.o.f+g+h+i+j+k+l+m+J.K.J.J.E.E.n+o+p+q+r+s+t+u+v++ N.d+d+d+d+d+d+d+d+d+% , ( , w+x+y+z+A+B+C+D+E+n ( n ( n n { n $ n...N ^+k t b+;         ",
+"            # ( v % _ b  .|.9.c+# 9.# 4 7.' d+d+d+e+e+. . d.5.F+G+d+d+d+d+d+d+H+I+y.F.y.J+K+d+d+d+d+d+d+d+d+L+i @ d+d+d+d+d+d+d+d+d+, , M+N+d+d+d+d+d+d+d+d+z+( n ( n ( ( ( h n %+).%+g | s 8+;         ",
+"            v ( 2.* {.1+| u T # , # # 5 4 7.d+d+d+e+e+i . c.u+d+d+O+P+Q+R+S+T+d+U+V+x.y.W+d+d+X+Y+Z+`+ @.@+@d+@@#@~ ' d+d+d+e+e+e+e+e+e+$@d+d+%@&@*@=@-@;@+@d+>@,@( n n ].n h $ Q.O O u 0+9+'@*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 d+d+d+e+e+) y )@!@d+~@{@]@e+e+e+^@d+d+/@(@f._@d+d+:@e+e+e+e+e+<@[@e+}@' ' d+d+d+e+e+e+e+e+e+|@d+d+1@e+e+e+e+e+<@[@e+2@n ( ( ( ( { n W 1.3@p b+4@8+;         ",
+"            , 5 # , _ g Y c 5 , , , &.Y.# %.d+d+d+e+e+2 + 5@d+d+6@e+e+7@8@9@0@d+d+a@b@c@i+d+d+d@e+e@f@g@h@i@j@k@e+g.3 d+d+d+e+e+& , 2.* l@d+d+d@e+m@n@o@p@q@r@s@e+n n n n ( ( L. +b u L b+8+8+;         ",
+"            , 5 4 # ; @.b | T & % , , # # # d+d+d+e+e+g.A t@d+d+u@e+v@w@! 5.x@d+d+y@e+z@A@d+d+B@C@D@@ A r.@ ~ E@F@z ' d+d+d+e+e+# # &.# G@d+d+B@C@H@$ n n ( n I@J@( ( ( M.n v { K@P.} d ` 4@b+;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # d+d+d+e+e+' 2 L@d+d+d+d+d+d+d+d+d+d+d+M@e+N@O@d+d+d+d+P@Q@R@S@T@3 ' ' 4 3 d+d+d+e+e+/ f L.( U@d+d+d+d+V@W@X@Y@Z@n ( n n n n M.M.( ( .+!.u t s 4@`@;         ",
+"            ( B 5 # S l.7+Y 4+, , % 2.% , & d+d+d+e+e+8.}. #d+d+d+d+d+d+d+d+d+d+d+d+e+.#2 +#@#d+d+d+d+d+d+##$#z }.3 ' d+d+d+e+e+f % % * ( %#&#d+d+d+d+d+d+*#=#n ( ( ( ( n v h.v j.1+_+F G 9+G x         ",
+"            ; 5 4 / /.o X t.-#, 2.2., 2.% , d+d+d+e+e+%.4 ;#d+d+>#e+e+e+e+e+e+e+e+e+e+]@2 @ ,#'#)#!#~#T+d+d+d+{#2 @ 7.d+d+d+e+e+2.( * h.% { ]#'#)#!#~#T+d+d+d+^#n n v ( ].L.h M.P.k. .q `@8+q (         ",
+"            #., # = ^.M H.O =.# f % / % , % d+d+d+e+e+/#4 (#d+d+_#e+e+e+e+e+e+e+e+e+e+e+3 2 z :#<#e+e+[#}#d+d+|#1#4 2 d+d+d+e+e+, 2.% h { { ( 2#3#e+e+[#}#d+d+4#5#( $ v h v n  +g X  .|+s 8+I M.        ",
+"            i., h {.e a #.Q.a , * * * / 2./ d+d+d+e+e+9.# 6#d+d+7#e+8#' 7.}.z ' }.' z ' 7.4 7.4 4 9#0#a#b#d+d+c#e+d#5 e#d+d+f#e+2.* { % ( n n n n g#h#i#j#d+d+c#e+k#$ n ( % ( n.O Y c 0+8+6+l.*         ",
+"            6 = .+g O _ 8 D l 2.* % % { / 2.d+d+d+e+e+, 9.l#m#d+n#o#p#9.4 %.4 4 q#r#X.7.s#t#B %.B # # Y.u#d+d+v#e+w## x#d+d+y#e+{ % % * z#A#h ( ( { ( { B#d+d+v#e+C#n v h.{ ,.g J  .Z 4@6+8+V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * d+d+d+e+e+, % # D#d+d+n#E#F#G#H#I#J#K#d+B %.d+L#M#N#O#P#Q#R#S#d+d+T#e+U#, V#d+d+B@[#W#/ % L.d+L#X#Y#Z#`# $.$+$d+d+T#e+@$M.h ( ( /+g k.R.s 8+6+F =           ",
+"              M 7 {.0 a a =.O 4+* ( { { { % d+d+d+e+e+2., 2., #$n#d+d+d+d+d+d+d+d+$$%$&$K#d+d+d+d+d+d+d+d+*$=$e+e+-$2.;$>$d+d+d+d+d+{ { ,$d+d+d+d+d+d+d+d+*$'$e+e+)${ v h.: 1+l X a+`@8+6+a+S           ",
+"              v.{.v.H.P H.^+ +4+v % L.L.{ ( d+d+d+e+e+f % 2./ 2.!$~${$]$^$/$($_$:$<$[$e+}$|$1$2$3$L#4$5$6$7$8$e+e+9$f ( 0$a$b$M@c$d$% { e$f$1$2$3$L#g$h$i$j$k$e+e+l$( L.( V R J Y a+`@8+6+g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { e+e+e+/ 2.% / 2.2.m$U#e+e+e+e+e+e+e+e+n$# % [$e+e+e+e+e+e+e+e+o$p$/ % * { q$r$e+e+e+e+e+( ( s$e+e+e+e+e+e+e+e+t$u$( h.{ 8 7+Y u I _+9+v$9+V             ",
+"                0 !.J ).^ C G./..+w ( { ( % L.{ e+e+e+* * / f / / 2.w$x$y$z$]@A$B$C$D$E$2.% F$G$H$I$J$o$K$L$M$N$% 2.% ( * { O$P$J$o$n$Q$v n R$S$T$U$V$o$s@b+W$X$h.L.{ +.^ 7+p  .~+0+6+6+Z ;             ",
+"                a g H.a l a+a+I R P.+.( v { { L.L.{ * ( L.% % { f f / / / % 2., , % f 2.2./ / 2.* % { % , L.{ * ( * * f ( L.v h.{ { % L.n ( n ( ].].{ ( n n / v h h.% M.c p | p F 4@6+8+[ %             ",
+"                  ~.s 8+4@| Q M P.Y$,.^ ( ( { { L.( { { { { % L.% { % % * 2.L.L.2.% * * { * % % * % { % , L.L.{ L.% ( / { L.L.% % ( { % n ( { ( ( ( n ( h M.f v ( h.n V ` t Y _+`@8+6+s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % L.% % { { { % { { % % * * * { % % % L.{ { ( * L.{ , { { { { { { ( % h.{ { { { { { ( n ( ].n ].( v n v 2.L.* v w t F Z$6+6+`$6+6+| $               ",
+"                  1 0 < = h.( 1 O P.Y : ^ n v ( { { { { { L.( % { L.( * { ( % ( % { { * ( * L.{ L.{ ( { , ( ( ( ( ( v { ( % L.L.% ( ( n ( ].( ( ( n $ ( n ( 2.L.h.].W F g Q R.8+v$6+8+$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { % { { ( % { { { * ( % L.{ L.{ % { { { ( / { v v v v ( ( n { ( { { n { ( n ( n n n h n v L.* * * v < F H k.0 Y r 6+6+a+;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { ( { { { { { ( { ( ( ( v ( % h $ $ $ n { ( ].{ ( ( ( ( n ( n ( ( M.n ( v { h * f h.w t  %E !. .s 8+6+4@.+%                 ",
+"                      l.k.t.Y j Y | | | R.n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( ( v ( ( ( ( ( v ( { v v ( n { { { { { ( ( { ( ( ].].n ].( n ( n n { ( v M.L.{ * f ,.R.L p Y p 9+6+v$6+_+;                   ",
+"                        | a+q R.k H.[ | L c < ,.{ n ].( ( n n ( $ v v v v v M.v v v v v ( n ( $ $ n ( ( ( L.( ( n ].( { ^ ( ( ( ( n ( n ( h ( v v v { L.% * C .% .k } L b+8+6+6+b+{.                    ",
+"                        l 0+0+| 3.#.O R. .E | .%( ( ( n n ( ( ].{ $ ( $ $ $ { $ $ ( ( ( ].( n { { ( n { n { 2.].( ( ].( ( { { n n ( n ( v n v v h ( % { f U N p l.^+u b+8+6+6+8+X ^                     ",
+"                          1+ .~.@.8 g d O k.X |.G.].M.( n n ( ( { ].{ { { ( ].{ ].].].( n ( ( ( n ( ( ( ( { ( * n ( ].{ ( ( ( ( n ( n $ ( n M.v h.{ * * m &+|+b 3.7 p 8+8+6+8+p _                       ",
+"                          7 b 1+^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( ( ( ].( ( ( ( ( n ( n ].].( n ].n { ( n % ( n ( ( ^ ].n n ( v h v v L.v L.( % { +%m.E H.M a l.F 8+6+6+r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( ( ].].].^ ].( { ^ n n n ( n ( ( ( n ( ( ( ( ^ ( { n % * ].( ( M.( v $ n n h v ( { * { v *.q c %+.+7 O _+8+6+6+9+[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { ( ( ( ( ( n ( ( ( ( ( n ( n n n ( n n n ].( n ( ( { ( 2.h.n { n $ v ( L.v L.* % % C N  .| ^.a v.a p 9+v$v$8+c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { { { ( ].{ n n n ( n ( ( ( n ( ( ( ( n ( ].n ( n ( ( 2.* % v h h.{ ( { % * * ]  +q | =.a e 0 j `@6+6+6+H i.                            ",
+"                                $.Y q G 0+l.V C V [ u } q |+@%S ( ( ( ].( ( ( ( ( n ( n n n ( n n n n ( n ( ( n h v v ( ( 2.% 2., , Y., / ].6 P._+R.[ K@e l.Y s 6+6+6+t {.{                             ",
+"                                  3.| s b+I k.0 0.!.| |+q !.Y R.&+].( n ].n n n ( n ( ( ( n ( ( ( ( n ( v v ( { $ n v h.( * { L.L.{ L.v n w | | d |+Q $.O c s 6+6+6+F 7 S                               ",
+"                                    Q a+4@b+F } |._+c b+d /.[ b } |+6 ].( $ ( $ n ( n n n M.v n n n h v $ $ v M.{ L.v L.* ( % v { L.n 8 j c k c K l ^.~.t 9+8+8+8+ %3.S                                 ",
+"                                      Q  .F 9+` a+0+r 8+3.w .%.%%+[ t.q ,.8 < 8 8 $ ( ( { S h h h { n v v v { L.v h v L.v { n ^ #..%u._+} X ^.X |.~.H #%'@6+6+8+0+a ^                                   ",
+"                                        3.| ` 8+G F 4@8+S x w 8 G./.N l.R _+@%&+'.< 6 w ( n { { n ( h { ( h L.{ ( h.( n - #.m.d | ~.g | P.D !.p t ` 8+6+'@6+8+a+7 ^                                     ",
+"                                            u #%9+9+6+s 3.< #.#.; - ; #..+^+%+P.|.Y  +N #.= ^ n v v ( * v { L.h.h C < '.|+| X M Q G.#.[ R.M _+`@9+6+v$6+6+9+ .{.                                        ",
+"                                              b F '@v$t R.1+^.v.= $ n 8 _ _ V {.%+B.R | | |+_+L F b+#%#%b+b+b+b+s F R.~.[ Q /.< _ i._ a s  .r 4@8+8+6+6+r ~..+                                          ",
+"                                                a 0+6+s `@Z 7+k.e {.$._ ^ n = {.=.1.[ j.7+} u |.b ~.a+q t.k |.[ [ ^.P a $..+_ : 3.o O l.`$4@8+6+6+6+8+F 0 _                                             ",
+"                                                  3.| 0+s `@0+Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3.-#7 -#V : @.@.v..+9 7 a t._+_+G 6+v$6+8+8+b+I 3.;                                               ",
+"                                                      0 | ` b+b+` F |+| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).1+ .0+s 8+6+6+6+6+r p e #.                                                  ",
+"                                                          H.p 9+8+4@9+b+0+p a+0+F H q t.b t.1+J } O 0 l.O e @.3.l.} u | _+Z F 9+'@'@6+6+6+9+t H./.                                                      ",
+"                                                              H.R.` 8+8+4@4@4@8+9+#%#%r F F | _+0+t 0+q |+| | _+L 0+F b+9+6+'@8+6+`$6+8+|+^.$.                                                          ",
+"                                                                $.H.t.0+b+8+6+'@v$8+8+8+8+9+b+9+8+'@8+9+r 9+9+8+8+'@6+6+6+8+'@'@9+F 7+e $.;                                                             ",
+"                                                                      a O } t #%6+v$6+6+8+8+'@'@6+6+6+8+'@6+6+'@'@8+`$'@8+r F 7+H.a V                                                                   ",
+"                                                                            3.H.H.I q G b+9+8+6+6+6+6+6+8+6+8+9+s F p 7+[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.bmp
new file mode 100644 (file)
index 0000000..6bf6c98
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_bl_VascularTree.xpm
new file mode 100644 (file)
index 0000000..4ed1756
--- /dev/null
@@ -0,0 +1,541 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_bl_VascularTree_xpm[] = {
+"100 100 438 2",
+"      c #CED0CC",
+".     c #9997E7",
+"+     c #8C90E5",
+"@     c #8488DC",
+"#     c #7174CD",
+"$     c #615DB6",
+"%     c #6965BF",
+"&     c #6D71CA",
+"*     c #6468C0",
+"=     c #5057AD",
+"-     c #545AB0",
+";     c #5755AC",
+">     c #5455A5",
+",     c #6B6FC8",
+"'     c #7D7ED9",
+")     c #8A8EE2",
+"!     c #9198E6",
+"~     c #8387DB",
+"{     c #5E63BB",
+"]     c #4E5496",
+"^     c #575DB3",
+"/     c #676BC3",
+"(     c #5C5FBD",
+"_     c #5353A3",
+":     c #51549E",
+"<     c #4D519A",
+"[     c #353D6A",
+"}     c #302F52",
+"|     c #2B2A4C",
+"1     c #454C8D",
+"2     c #8581D7",
+"3     c #7F84D8",
+"4     c #7679D3",
+"5     c #7477D0",
+"6     c #4F529B",
+"7     c #4B4E84",
+"8     c #5757A8",
+"9     c #535195",
+"0     c #474973",
+"a     c #4B4A7B",
+"b     c #373A62",
+"c     c #282C53",
+"d     c #242642",
+"e     c #434A79",
+"f     c #666AC2",
+"g     c #3C3F68",
+"h     c #6662BC",
+"i     c #9391E1",
+"j     c #322F58",
+"k     c #33365E",
+"l     c #393C64",
+"m     c #646BBC",
+"n     c #5B60B7",
+"o     c #3E416A",
+"p     c #222540",
+"q     c #1F213D",
+"r     c #141626",
+"s     c #121324",
+"t     c #1B1D38",
+"u     c #2D3158",
+"v     c #6065BD",
+"w     c #5C5CAD",
+"x     c #5B59B1",
+"y     c #878FDC",
+"z     c #7C81D4",
+"A     c #8D8CDC",
+"B     c #7479CC",
+"C     c #605FB1",
+"D     c #44487D",
+"E     c #282749",
+"F     c #1A192F",
+"G     c #17162C",
+"H     c #211F36",
+"I     c #2C2C4E",
+"J     c #3A385C",
+"K     c #292442",
+"L     c #24203D",
+"M     c #444373",
+"N     c #4C4B8E",
+"O     c #423D68",
+"P     c #464575",
+"Q     c #474B81",
+"R     c #36325C",
+"S     c #5E5BB3",
+"T     c #6F75C7",
+"U     c #6B6CB8",
+"V     c #544F9A",
+"W     c #3C3F79",
+"X     c #343760",
+"Y     c #2E2D4F",
+"Z     c #232138",
+"`     c #1A1527",
+" .    c #29294B",
+"..    c #464379",
+"+.    c #6564B6",
+"@.    c #4E4A81",
+"#.    c #4A54A2",
+"$.    c #4D4E8B",
+"%.    c #7578D1",
+"&.    c #6E72CB",
+"*.    c #4F50A0",
+"=.    c #403F6F",
+"-.    c #7275BB",
+";.    c #7B83CF",
+">.    c #6A68BB",
+",.    c #5558A2",
+"'.    c #42447F",
+").    c #424171",
+"!.    c #3B3761",
+"~.    c #343356",
+"{.    c #4F508D",
+"].    c #595EB5",
+"^.    c #42456E",
+"/.    c #504E92",
+"(.    c #52558B",
+"_.    c #6564A3",
+":.    c #7F7FCD",
+"<.    c #868ADE",
+"[.    c #8786D4",
+"}.    c #817DD3",
+"|.    c #31345C",
+"1.    c #343563",
+"2.    c #686CC4",
+"3.    c #494D83",
+"4.    c #7A7DC4",
+"5.    c #9899E2",
+"6.    c #9594E4",
+"7.    c #797CD6",
+"8.    c #7D7ACF",
+"9.    c #7875CA",
+"0.    c #4D4E79",
+"a.    c #8789D1",
+"b.    c #9C9AEB",
+"c.    c #9A98E9",
+"d.    c #979DEC",
+"e.    c #9C9EE7",
+"f.    c #9FA0EA",
+"g.    c #8286DA",
+"h.    c #6266BE",
+"i.    c #565398",
+"j.    c #3A3A69",
+"k.    c #3B3D66",
+"l.    c #40436C",
+"m.    c #3E3B71",
+"n.    c #373C70",
+"o.    c #A1A2EC",
+"p.    c #A3A4EE",
+"q.    c #A7A7F2",
+"r.    c #878BE0",
+"s.    c #3E3D6D",
+"t.    c #323154",
+"u.    c #2F305E",
+"v.    c #524E86",
+"w.    c #7674B5",
+"x.    c #ADA9EE",
+"y.    c #ACB0F3",
+"z.    c #AEAAEF",
+"A.    c #B0ACF1",
+"B.    c #39376C",
+"C.    c #50539C",
+"D.    c #000000",
+"E.    c #B6B6F4",
+"F.    c #B4B4F2",
+"G.    c #4A4E97",
+"H.    c #404776",
+"I.    c #BBBEF5",
+"J.    c #B2B2F0",
+"K.    c #635FB8",
+"L.    c #888CE1",
+"M.    c #B9B8F7",
+"N.    c #C3C2F4",
+"O.    c #373766",
+"P.    c #3B4074",
+"Q.    c #232344",
+"R.    c #656396",
+"S.    c #C7C6F8",
+"T.    c #C5C4F5",
+"U.    c #BEB9F2",
+"V.    c #686AA3",
+"W.    c #CACDF7",
+"X.    c #444682",
+"Y.    c #4A5092",
+"Z.    c #888ECF",
+"`.    c #CFCAF7",
+" +    c #CFD2FC",
+".+    c #404479",
+"++    c #474688",
+"@+    c #9793D7",
+"#+    c #CCCFFA",
+"$+    c #DAD9FE",
+"%+    c #D8D7FC",
+"&+    c #D6D5FA",
+"*+    c #E1E100",
+"=+    c #E6E600",
+"-+    c #E5E500",
+";+    c #DADA00",
+">+    c #7A7A00",
+",+    c #C8C800",
+"'+    c #A2A200",
+")+    c #AEAE00",
+"!+    c #6F6F00",
+"~+    c #D3D2F7",
+"{+    c #DBDFFC",
+"]+    c #CAC8FA",
+"^+    c #656500",
+"/+    c #B0B000",
+"(+    c #909000",
+"_+    c #6763BD",
+":+    c #C5C500",
+"<+    c #D4D400",
+"[+    c #D8D800",
+"}+    c #CBCB00",
+"|+    c #E3E300",
+"1+    c #E4E400",
+"2+    c #E1E1F9",
+"3+    c #595900",
+"4+    c #898900",
+"5+    c #B1B100",
+"6+    c #424200",
+"7+    c #B3B300",
+"8+    c #D6D600",
+"9+    c #9E9E00",
+"0+    c #E2E200",
+"a+    c #DBDB00",
+"b+    c #5B5B00",
+"c+    c #222200",
+"d+    c #7C7C00",
+"e+    c #E4E3FB",
+"f+    c #B4B400",
+"g+    c #686800",
+"h+    c #2B2D4A",
+"i+    c #BABA00",
+"j+    c #D2D200",
+"k+    c #DDDD00",
+"l+    c #E0E000",
+"m+    c #949400",
+"n+    c #919100",
+"o+    c #848400",
+"p+    c #D9D900",
+"q+    c #EBE7F9",
+"r+    c #E8EDFD",
+"s+    c #DCDC00",
+"t+    c #BFBF00",
+"u+    c #444400",
+"v+    c #484878",
+"w+    c #423F76",
+"x+    c #787800",
+"y+    c #9F9F00",
+"z+    c #9B9B00",
+"A+    c #666600",
+"B+    c #191900",
+"C+    c #E5E4FC",
+"D+    c #585800",
+"E+    c #777700",
+"F+    c #ACAC00",
+"G+    c #969600",
+"H+    c #BEBE00",
+"I+    c #DFDF00",
+"J+    c #5E5E00",
+"K+    c #787AD5",
+"L+    c #A1A100",
+"M+    c #575700",
+"N+    c #8C8ED6",
+"O+    c #BDBD00",
+"P+    c #2E2E00",
+"Q+    c #8C8C00",
+"R+    c #A5A500",
+"S+    c #414471",
+"T+    c #252547",
+"U+    c #545284",
+"V+    c #8685D3",
+"W+    c #8B8B00",
+"X+    c #EDEAFC",
+"Y+    c #9B99EA",
+"Z+    c #ABAB00",
+"`+    c #5D5D00",
+" @    c #CECE00",
+".@    c #BCBC00",
+"+@    c #606000",
+"@@    c #B5B500",
+"#@    c #B8B800",
+"$@    c #282340",
+"%@    c #3A3A00",
+"&@    c #AFAF00",
+"*@    c #939300",
+"=@    c #ADAD00",
+"-@    c #C4C400",
+";@    c #3C3C00",
+">@    c #D7D700",
+",@    c #CDCD00",
+"'@    c #A8A800",
+")@    c #AAAA00",
+"!@    c #616100",
+"~@    c #707000",
+"{@    c #353457",
+"]@    c #7777C4",
+"^@    c #C6C600",
+"/@    c #696900",
+"(@    c #1B1B00",
+"_@    c #434300",
+":@    c #2A2A00",
+"<@    c #5E5D9C",
+"[@    c #6C6C00",
+"}@    c #7B7B00",
+"|@    c #B9B900",
+"1@    c #858500",
+"2@    c #5A5FA2",
+"3@    c #6F73BF",
+"4@    c #6E6E00",
+"5@    c #D0CDDA",
+"6@    c #B6B600",
+"7@    c #979700",
+"8@    c #8D8D00",
+"9@    c #CFCF00",
+"0@    c #454500",
+"a@    c #9C9C00",
+"b@    c #797900",
+"c@    c #808000",
+"d@    c #555500",
+"e@    c #08050A",
+"f@    c #636300",
+"g@    c #565600",
+"h@    c #6D6D00",
+"i@    c #747400",
+"j@    c #2A2E55",
+"k@    c #0A0B14",
+"l@    c #080D1A",
+"m@    c #1D1B32",
+"n@    c #A6A600",
+"o@    c #D5D500",
+"p@    c #9D9D00",
+"q@    c #D3D300",
+"r@    c #545400",
+"s@    c #373700",
+"t@    c #21233F",
+"u@    c #111122",
+"v@    c #727200",
+"w@    c #B2B200",
+"x@    c #3F3F00",
+"y@    c #999900",
+"z@    c #989800",
+"A@    c #181800",
+"B@    c #8A8A00",
+"C@    c #838300",
+"D@    c #6F73CC",
+"E@    c #C2C200",
+"F@    c #A0A000",
+"G@    c #A3A300",
+"H@    c #868600",
+"I@    c #CCCC00",
+"J@    c #646400",
+"K@    c #767600",
+"L@    c #6A6A00",
+"M@    c #333300",
+"N@    c #888800",
+"O@    c #626200",
+"P@    c #D1D100",
+"Q@    c #535300",
+"R@    c #A7A700",
+"S@    c #DEDE00",
+"T@    c #CACA00",
+"U@    c #7E7E00",
+"V@    c #9A9A00",
+"W@    c #5C5C00",
+"X@    c #2F2F00",
+"Y@    c #0B070D",
+"Z@    c #5A5A00",
+"`@    c #D0D000",
+" #    c #929200",
+".#    c #484800",
+"+#    c #202000",
+"@#    c #717100",
+"##    c #8E8E00",
+"$#    c #7F7F00",
+"%#    c #959500",
+"&#    c #363961",
+"*#    c #110D1B",
+"=#    c #726FC3",
+"-#    c #080800",
+";#    c #878700",
+">#    c #4F4F00",
+",#    c #4C4C00",
+"'#    c #1D1D00",
+")#    c #323200",
+"!#    c #484986",
+"~#    c #C9C900",
+"{#    c #A4A400",
+"]#    c #16152B",
+"^#    c #474700",
+"/#    c #535491",
+"(#    c #7275CE",
+"_#    c #C3C300",
+":#    c #242400",
+"<#    c #C0C000",
+"[#    c #C7C700",
+"}#    c #393900",
+"|#    c #303000",
+"1#    c #525200",
+"2#    c #5F5F00",
+"3#    c #1E1E00",
+"4#    c #414100",
+"5#    c #050208",
+"6#    c #A9A900",
+"7#    c #464473",
+"8#    c #313260",
+"9#    c #353500",
+"0#    c #282800",
+"a#    c #111100",
+"b#    c #C1C100",
+"c#    c #8F8F00",
+"d#    c #15121F",
+"e#    c #09060C",
+"f#    c #1F1F00",
+"g#    c #676700",
+"h#    c #4D4D00",
+"i#    c #757500",
+"j#    c #B7B700",
+"k#    c #4A4A00",
+"l#    c #1D203B",
+"m#    c #818100",
+"n#    c #262600",
+"o#    c #474B93",
+"p#    c #4E4E00",
+"q#    c #6368AC",
+"r#    c #737300",
+"s#    c #6B6B00",
+"t#    c #494900",
+"u#    c #BBBB00",
+"v#    c #7D7D00",
+"w#    c #32386C",
+"x#    c #343400",
+"y#    c #252500",
+"z#    c #3B3B00",
+"A#    c #464600",
+"B#    c #4B4B00",
+"C#    c #13101D",
+"D#    c #383562",
+"E#    c #3D3D00",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                    . + @ # $ % & * = = - ; ; > $ & # ,                                                                                 ",
+"                                                                            ' ) ! @ ) @ ~ ' { ] ^ / ( _ ; : = < ] % % _ [ } } |                                                                         ",
+"                                                                      ( 1 < ; & 2 2 ~ 3 4 5 % 6 7 8 9 0 a a _ a b c d } e f ' ; g h 9                                                                   ",
+"                                                                2 2 ~ i 2 ^ a j k l 9 h m n = o c o b | p q r s t u > v v v w x } n / 4 % (                                                             ",
+"                                                              y z 4 ~ y A z B C D E F G H I J K H L t s F t c M N : N O P M Q N R a 4 , _ Q a                                                           ",
+"                                                          S f 2 % z 3 2 T U V 1 W X Y Z ` s r r s r H  .u O b l b l b k J J ..g [ I +.= Q @.#.Q P                                                       ",
+"                                                      # 4 $.%.&.# B , n *.1 ..=.o o -.z ;.2 z 3 3 B B T m >.>.+.+.+.] ,.'.).!.~.b p Q O b @.n > ).$.{.                                                  ",
+"                                                  i 4 # ].^.%.* % h _ /.Q (._.:.A <.y y <.<.[.2 2 2 }.2 ' 4 %.# , , , , m * C ..|.| Y b 1.a 8 _ M O {.% %                                               ",
+"                                                i @ 2.% ).3., v - < Q 7 4.y 5.6.i i i 5.y + ) ! ) y @ 3 3 3 7.4 8.9.# , , 2.% f ,.6 E X k M Q Q 3.).#.4 % h                                             ",
+"                                              ! ) # #.] j 8 ^ #.$.0.a.. 5.b.c.d.e.d.5.c.f.f.! 6.! 6.! i A g.g.g.' ' B 4 # &.& 2.h.v : i.j.!.k k.M ).h 5 2.5 #                                           ",
+"                                            A g.8.8 l.m.n._ N a i 5.5.5.f.f.o.o.p.p.o.o.o.q.b.f.b.. ! ! + y r.g.3 2 4 4 4 # &., 2.* % n - *.s.t.} j.w , # # , %                                         ",
+"                                        , # # # ^ P s.u.m.v.w.d.f.f.f.o.x.y.z.A.z.A.z.z.z.x.q.o.f.f.b.c.! i i A @ ' 2 7.4 4 # # , , / * h.v S B.E l @.V 8 ( % , , h                                     ",
+"                                      ' ' # : C.$.X u u (.5.f.f.f.D.D.D.D.D.E.F.D.D.D.D.D.D.D.y.o.p.f.D.D.D.) i y 3 3 D.D.D.4 # D.D.2./ * { D.D.G.j |.j.Q #.% , 5 % 8                                   ",
+"                                    g.! y ' 8 b H.j | ^.e.f.o.x.x.D.D.D.D.D.E.I.D.D.D.D.D.D.J.A.z.y.p.D.D.D.D.! + r.D.D.D.D.5 # D.D.&.% 2.% D.D.v ^ u.Y =.7 8 # # K._ (                                 ",
+"                                  ~ L.) ~ %.V |.u c J f.f.o.y.y.J.E.M.M.D.D.N.N.D.D.I.I.I.M.I.M.F.J.z.D.D.D.D.D.! D.D.D.D.D.}.5 D.D.& % , 2.D.D.n v ( W O.P./.C h.$ % % $                               ",
+"                                4 ) A 4 # m Q } Q.R.5.f.o.z.A.F.M.I.I.N.D.D.S.S.D.D.T.T.T.I.U.I.U.F.J.D.D.o.D.D.6.D.D.<.D.D.4 5 D.D.&.& 2./ D.D.% K.n ].8 s.D V > * f = ; (                             ",
+"                                ~ + # * % *.!.Y V.5.f.p.y.J.E.I.U.S.T.T.D.D.W.W.D.D.D.D.D.D.D.T.U.M.E.D.D.p.f.D.D.D.i <.D.D.}.4 D.D.D.D.D.D.D.D.{ % h n ].V ).X.Y.n > 9 ; >                             ",
+"                              g.) ~ 2.n w =.u V.Z.f.o.x.J.F.M.U.T.S.W.`.D.D.`. +D.D.D.D.D.D.W.T.S.I.I.D.D.z.p.D.D.D.y ) D.D.z B D.D.D.D.D.D.D.D.% v v h K.].#..+++_ /.8 h 3.@.                          ",
+"                            @ ) ~ 2 2.w X.O R.@+5.p.y.x.E.U.I.T.W.`. +#+D.D.$+%+D.D.&+%+ +`. +T.`.N.U.D.D.A.z.p.D.b.! y D.D.2 }.D.D.# # , % D.D.% ( v v n h w < $.X.#.w 8 0 a ;                         ",
+"                          $ ~ A 3 5 *+=+=+-+-+;+>+,+'+)+!+I.T.T.`.#+~+~+D.D.{+{+D.D.$+%+&+%+~+ +W.]+I.D.D.E.A.p.f.b.. i D.D.@ z D.D.# , , , D.D.{ * ^+/+-+-+(+C 1 1.'.: < v.7 {._+                      ",
+"                          % ' @ 4 _+:+<+[+-+}+-+|+-+|+1+-+I.]+W.D.D.D.D.D.D.{+2+D.D.2+{+$+$+~+D.W.W.]+D.D.E.J.z.p.e.b.! D.D.' 3 D.D.# # , 2.D.D.% 3+4+-+-+5+6+K.S /.u O 7 9 {.{.9                       ",
+"                        / %.B # 9.= 7+8+9+<+0+1+a+*+0+=+-+b+c+#+d+D.D.D.D.e+2+2+D.D.{+{+2+{+%+D.`.`.W.D.D.E.J.y.p.f.d.i D.D.@ ' D.D.4 # &., D.D.2.3+f+0+,+g+$ n v $ L h+3._ {.a 0 8                     ",
+"                        3 4 $ #.w a 6+V.i+j+<+k+=+l+*+=+-+m+n+o+-+=+p+e+2+2+q+q+e+r+2+2+2+{+{+D.&+`.W.]+T.M.J.y.x.f.f.5.i ) @ ' ' 8.5 # &., , 2.f 3+s+t+=+u+( ( { n - K 0 9 a v+P a                     ",
+"                      # ' * (.P w+u ~.4.i u+x+y+;+0+0+1+-+-+z+m+A+d+B+2+e+q+C+2+r+C+q+C+D.D.D.D.D.D.D.W.I.I.E.J.z.p.f.d.) A @ @ z %.4 # , , / / D+E+0+=+-+F+v n ( ( S  .X P 7 a 0 0 :                   ",
+"                    = %.# = H.|.} t.4.i . . d.G+H+I+|+l+-+-+-+J+{+2+e+q+2+r+r+q+r+r+r+q+q+e+2+D.$+%+`.W.S.I.M.F.A.p.b.d.! i @ 3 3 B 4 K+# , % 2.D+L+1+-+-+M+K.].n n n V t.[ Y.{.a 0 O %                 ",
+"                    % , ( @.R c H.e N+! ! 5.f.y.t+O+1+0+-+-+-+-+P+{+2+C+r+r+r+r+q+q+r+r+2+q+2+D.{+&+ +`.`.N.I.E.y.p.o.5.i ) r.2 ' ' # # &., , 2.3+Q+l+R+|+S+n ( ( ( K.^ t.O $.{.{.a } {.                ",
+"                  - n h.= H.T+| U+V+A i c.5.f.q.A+[+l+1+|+-+-+W+)+e+q+C+X+q+r+r+r+q+X+r+C+e+2+D.%+&+ +W.T.N.I.J.A.p.f.Y+! i L.3 }.}.5 # # , 2./ 3+j+0+-+Z+v v n n { { ]./.O a /.Y.a !.O %               ",
+"                  ( : S ; k.T+H.U+4.i 6.! b.f.x.`+ @0+*+=+.@(+-+[+3+2+r+X+r+X+q+X+r+r+r+r+q+e+{+2+%+~+]+S.N.M.F.y.p.o.! i ) <.~ z 7.4 # # , % / +@@@.@#@R+h $ K.( ( ( ( = b M 7 9 7 l.k.8               ",
+"                  _+^ i.x l.$@[ -.y A 6.5.b.%@&@*@I+*+l+|+8+0+0+t+(+=@%@X+r+r+r+q+X+X+X+r+q+2+{+2+&+~+W.T.N.U.J.y.p.o.b.6.) <.' 3 4 4 # # & 2.g+^+-+-+-@{ v { n ].].n n ( '.s.l.a 9 O b 0               ",
+"                9 { % C.C.M Y a _.V+) i 6.;@>@,@'@,+I+l+0+-+I+0+-+1+*+)@r+X+r+X+r+r+r+r+C+C+e+{+%+&+ +`.S.N.I.E.A.q.o.! ! ! r.@ ' ' 4 # # & , !@p+'@Q+~@( n ( K.( ( ( ( ].#.{@g e a o |.O (             ",
+"                G.6 ^ {.k.u Y H.]@[.L.+ i ^@*+/@(@_@H+.@I+=+*+*+=+5+5+}+X+q+r+r+X+q+X+r+r+q+2+{+$+&+#+W.T.M.U.F.A.p.o.. i A r.@ 3 ' K+# # # , g+8+G+-+:@% v { n n n n ( $ ].O.!.k.v+0 |.| V             ",
+"                {.3.{.$.O d Y <@-.@ A i ! [@o.p.y.y.I.}@I+*+|+0+0+1+|+|@r+r+X+q+r+r+r+q+q+2+e+{+%+~+#+`.T.I.E.J.y.p.f.. + ) <.g.}.B 5 # # % 3+1@0+-+)+h { n ( ( ( ( ( ].{ ( N u [ D a k.K M             ",
+"              i.9 {.O ] 6 k.| 2@3@g.@ i . . f.o.z.A.M.I.4@;+l+|+-+0+-+'@5@r+r+q+X+X+X+2+C+e+2+{+~+~+W.S.T.I.F.A.x.o.5.5.! A @ 3 ' 8.4 # &.& Q+6@7@8@9@_+_+n v n n n ( ( n $ ].O.!.j.=.k.Y } _+          ",
+"              {.= {.{._ G.O ~._.V+@ L.) i 5.e.o.y.y.M.I.0@a@I+1+0+l+=+-+.@X+X+r+r+r+C+r+2+e+$+~+~+#+]+T.N.I.E.J.q.o.Y+! ) ) @ ' z 7.%.# & , b@x+c@i+d@{ v K.$ K.( ( n ].( { $ j.u !.k F e@e@(           ",
+"              = ; {.( S 3.X 2@3@:.~ @ ) + . 5.f.y.y.E.U.U.f@I+I+k+ @&@/+g@C+C+C+C+r+2+2+{+2+&+&+~+W.T.I.I.M.J.y.p.f.. 6.y A ~ }.B 4 # # , D+h@ @L+s+i@( h.n { n n ( ( n ( n K.^ X j@t k@l@m@C.          ",
+"            a H | ~.$.8 Y.|._.T 3 g.[.<.i ! b.f.o.x.y.E.I.N.n@1@/@o@1+-+*@{+C+C+e+{+{+e+%+&+&+~+W.W.S.I.U.F.z.x.f.f.. 6.+ @ g.3 ' %.# # , D+p@q@^@r@s@h.( ( ( h ( n n ( ].( { S u B..+e k.| a %         ",
+"            h v e t@k@u@H } U B z 2 @ r.A . . b.f.z.y.y.M.U.b+v@h@a+-+w@6+x@%+%+e+{+&+%+{+&+~+#+`.T.T.I.M.y.y.p.d.! 6.i ) @ 2 z z 4 # , , 3+y@)+l+a@_+h.h.n n n ( ( n ( n ( n ( M : C.a k q b %         ",
+"            * ) A 8.#.$@r q ]@8.}.g.~ [.) y ! 5.f.p.z.J.M+>@D.z@1+-+I+&@-+A@{+&+~+~+&+~+~+~+W.]+T.S.U.M.J.x.o.f.b.. y ) @ 2 3 4 4 5 # # &.3+B@7@7+C@{ h v K.( ( n n ( { ( ].( K.P /.*.v+c H I (         ",
+"            , 3 ~ @ D@; O ).B 7.' ' 3 ~ ) i + ! d.d.p.y.5+-+3+E@-+-+I+o@-+4@~+`.~+~+~+W.W.`.T.S.I.I.M.J.y.x.p.e.c.. + A <.' }.4 4 # # , , 3+<+F@)+E@{ h n n n ( ( ].( n ( n n { .+$./.o  .L p S         ",
+"            , ~ ~ # v P d H.]@8.%.8.' ~ 2 @ ! . 5.f.f.o.s+H+o+l+0+-+*+E+-+G@W.W.W.`.W.`.T.T.T.I.I.M.E.y.x.p.f.c.! + i g.~ 3 ' 4 # # , # ( 3+y+l+Q+H@( v ( h K.n n ( ].( { ( ( ( O ++1 l.| q q S         ",
+"            5 ~ 8.* = P u D B 4 7.7.' 3 ~ 2 r.) 6.. f.f.5+1+E+*+*+=+k+I@-+J@T.T.I.S.I.S.I.I.I.M.M.J.J.y.f.b.b.6.! ) <.g.' z 8.4 # # , , , G+H@0+-+F@S+v n n ( ( n ( ].( n n n { =.X.N H.~.$@m@;         ",
+"            ' z * S > o | =.4 B 5 8.7.' 2 @ A i y 6.. `+=@<+K@0+-+*+=+-+-+J@M.U.I.I.I.I.I.I.M.F.J.x.f.o.o.b.! ! A y @ ~ 3 4 4 9.# , , 2.% L@'+*+j+-+M@$ ( ( n n ( n ( ].( ( K.( P.P X.P X q F ;         ",
+"            ' , n n S O | X # # D@5 B 7.}.3 @ L.+ + 5.Y+R+`+h@>@>@[+|+-+N@:@O@U.P@U.M.M.E.E.J.y.y.o.S.f.! c.i + L.@ ' 2 ' 4 4 # # , % , ( , 7@*+1+(+9@v v K.( n ( n ( n n { n $ n...N v+k t u@;         ",
+"            # ( v % _ b  .|.9.D@# 9.# 4 7.' @ 2 A i + . Q@+@R@S@-+7@^@7@v@I+P@^+,+v@F.y.z.y.z.z.d.f.f.. 5.6.i i @ ~ 3 z B %.# # # , , , 2.* O@*+0+-+T@$ $ { n ( n ( n ( ( ( h n .+)..+g | s k@;         ",
+"            v ( 2.* {.{@| u T # , # # 5 4 7.3 g.~ A y i 3+[@U@V@>@;+m+(+4@J@)+W@~@i@X@y.f.p.p.q.b.Y+! 6.y ! ) i r.~ ' }.4 4 # , , 2.% 2.f % % z+1+-+-+-+( ( n ( n ( n n ].n h $ P.O O u m@l@Y@*.        ",
+"            * , , { {.b | t.8., & , # # 4 4 }.3 g.@ L.) y Z@U@G+`@ #.#&@+#@###Z+$#-+%#.@Z@f.f.e.b.6.i + i ) y <.A ' ' 4 B # # , # ( 2.f % { 3+s+-+o@##o@].n ( n ( n ( ( ( ( { n W 1.&#p u@*#k@;         ",
+"            , 5 # , _ g Y c 5 , , , &.=## %.K+B z 2 ~ 2 + ) _@_@u+g@^+-#@@/+h@7+;#-+l+>#_@. . 5.! + i + ) S.r.2 @ g.3 4 # , , % & , 2.* ( % * h@;+;+-+*@( n ( n ( n n n n ( ( _+X.b u L u@k@k@;         ",
+"            , 5 4 # ; @.b | T & % , , # # # # 4 4 ' 3 g.A L.i _@_@_@6+_@,#'#p@-+*+-+ @-+-+)#y ) ) y @ A r.@ ~ @ 3 z ' 4 # 8.7.K+# # &.# , 2._+7@L+-+-+-+n ( n ( n ( ( ( K.n v { !#O.} d ` *#u@;         ",
+"            f ' 7.# v $.~.K U , , 2./ , & # 5 4 4 8.7.' 2 g.2 A L.A ) i E+J@z@~#q@I+-+{#R@-+) A r.r.3 A 2 2 3 ' ' 4 3 2 4 # 2.2./ f _+( * * , v@N@=+-+-+n ( n ( n n n n K.K.( ( Y.!.u t s *#]#;         ",
+"            ( B 5 # S l.j@Y 2@, , % 2.% , & # # 5 %.4 8.}.' 3 @ 2 @ 2 @ L.^+9+W+[+w@5+-+-+-+^#2 2 ~ ' ' @ 3 ' z }.3 ' z % % 2.2.f % % * ( { $ [@{#-+-+-+( n ( n ( ( ( ( n v h.v j.{@T+F G l@G x         ",
+"            ; 5 4 / /.o X t./#, 2.2., 2.% , # & # # (#%.4 ' z 3 ' g.2 2 ' @ !+H@t+}+_#-+-+-+)+g.2 3 }.z ' 3 4 7.2 @ 7.%.# # , , 2.( * h.% { { 3+[+o@k+$#( n ( n n n v ( ]._+h K.O.k. .q ]#k@q (         ",
+"            #., # = ^.M H.O =.# f % / % , % , , & # # (#4 # K+4 }.2 3 3 3 2 4@9+[+0+I+s+Q+G@1+' 7.4 B 5 7.4 ' 3 %.4 2 %.& , , % , 2.% h { { ( ##1+-+l+^+n ( n ( ( ( $ v h v n X.g X  .$@s k@I K.        ",
+"            i., h {.e a #.P.a , * * * / 2./ 2.2., &.&.9.# # 4 %.4 4 4 ' 7.}.4@h@*+1+-+*+-+-+-+4 4 4 4 5 # # 4 7.d@t+=@|@p+-+n+x+-@0+R+n+}@@#x+_#l+-+-+:#v ( n n n n $ n ( % ( n.O Y c m@k@e@l.*         ",
+"            6 = Y.g O _ 8 D l 2.* % % { / 2.% % 2., , , 9.# # # (#%.4 9.4 %.4@4@o@o@1+-+-+-+Q+%.B # # =## &.:#8@<#*+-+ @=+*+1+1+s+>@ @{#G+t+I+z@k+p++@{ f n ( ( ( ( n v h.{ ,.g J  .Z *#e@k@V ,         ",
+"              7 M e e 6 = ).[ : / * % % % * 2.2./ 2.2., % # &.# 9.# # # B 8.9.4@,+-@[+8+|@0+h@# # # # , =#5+1+0+|@0+=+I+=+S@1+l+*+0+o@[#l+*+-+9@Z+a@z@( _+* n n v ( K.h ( ( w+g k.Q.s k@e@F =           ",
+"              M 7 {.0 a a =.O 2@* ( { { { % * / / % 2.2., 2., , , # # # # # # }#6@z+j+1+|+[+f+, &.& , , o@a+=+k+a+|+[+>@o@*@9@3+b@y+j+l+0+*@-@Z+&@Z@].].{ % v h $ v { v h.: {@l X t@]#k@e@t@S           ",
+"              v.{.v.H.P H.v+X.2@v % _+_+{ ( % % * / f f % 2./ 2., , , , , # & # '+}@*+1+-+-+P+, , / % f@.@0+=+-+a+E@,@|#1#4+u+@#E+(+I@u+Z@ #(+2#{ ( ( ( { ( { n $ v ( _+( V R J Y t@]#k@e@g (           ",
+"                a H.b g a _ /./.] { { { % h.{ { % % { / 2.% / 2.2.2.2.% 2., , , b+4+*+1+#@=+h@% % 2.d@B@0+=+-+d+;+3#4#* { _+{ ( { { { % ( ( ( ].( { n ].( v / ( v ( h.{ 8 j@Y u I T+l@5#l@V             ",
+"                0 !.J ).^ C G./.Y.w ( { ( % _+{ { % % * * / f / / 2.2.2.f 2.f % 3+<+-+k+6#Z+4+, % 2.z+1+0+1+K@>@7#2.% ( * { * ( % _+{ h.v n ( ].( ( ( ].$ ( , K.h._+{ +.^ j@p  .h+m@e@e@Z ;             ",
+"                a g H.a l t@t@I R O.+.( v { { _+_+{ * ( _+% % { f f / / / % 2.^#B@a+8+(+S@-+Q+2.* %@L+=+S@S@p+'#( * * f ( _+v h.{ { % _+n ( n ( ].].{ ( n n / v h h.% K.c p | p F *#e@k@[ %             ",
+"                  ~.s k@*#| Q M O.8#,.^ ( ( { { _+( { { { { % _+% { % % * 2.9#:+;#=+0+T@i@7+1#% 0#a#$#-+d@b#^+{ _+% 3+W@{ _+_+% % ( { % n ( { ( ( ( n ( h K.f v ( h.n V ` t Y T+]#k@e@s 6               ",
+"                  t.Z M { &.f 1 b [ |.8 n v ( ( { { % _+% % { { { % { { % 3+b#^@&@l+|+P@G@c#n+.#%#H+-+Z@a+)@{ { { { $#-+S@o+{ { { { { { ( n ( ].n ].( v n v 2._+* v w t F d#e@e@e#e@e@| $               ",
+"                  1 0 < = h.( 1 O O.Y : ^ n v ( { { { { { _+( % { _+( * { !@7+*+p+<#1@W+U@f#.#g#L@&@T@}+b@L@( 3#( {#n+l+-+-+h#_+% ( ( n ( ].( ( ( n $ ( n ( 2._+h.].W F g Q Q.k@5#e@k@$.%               ",
+"                    P 9 C.C.7 7 Q H.c | 8 h ( v ( ( ( ( ( { { { % { { ( % O@W+[#*+i#0+j# @z+/@}+y@A+v@k#!@g@3+#@:+n+(+`@-+-+9+{ { n { ( n ( n n n h n v _+* * * v < F H k.0 Y r e@e@t@;                 ",
+"                    $.a a ^.!.0 O ~.| | '.^ $ n ].n n v ( ( { { ( ( { { { { { >+l+p@6+z+|+L+N@|+S@k+-+n+g#I+*+|@P@*+^@v@i@4+g+( ( ( n ( n ( ( K.n ( v { h * f h.w t l#E !. .s k@e@*#Y.%                 ",
+"                      l.k.t.Y j Y | | | Q.n.^ ( ( ( ( ( n n ( ( v v ( ( ( ( ( v i#b@E+d+.@o@R+P@|+|+*+*@c#E@x+W+$#k#A+c#v@F@m#].n ].( n ( n n { ( v K._+{ * f ,.Q.L p Y p l@e@5#e@T+;                   ",
+"                        | t@q Q.k H.[ | L c < ,.{ n ].( ( n n ( $ v v v v v K.v Z+K@l+S@l+>@*+<#;#~#L@n@#@u+n#m#-+ @:+E+*+G@-+|@( n ( n ( h ( v v v { _+% * C o# .k } L u@k@e@e@u@{.                    ",
+"                        l m@m@| 3.#.O Q. .E | o#( ( ( n n ( ( ].{ $ ( $ $ $ { $ $ +@g#>@j+h@1+N@|+*+j#i+*+<+*+0+o@-@@#*+-+-+a@d+=@( n ( v n v v h ( % { f U N p l.v+u u@k@e@e@k@X ^                     ",
+"                          {@ .~.@.8 g d O k.X |.G.].K.( n n ( ( { ].{ { { ( ].{ ].d@2#I+ @t+i+k+=+Z+k+[+I+J@I@_#[@>@0+f+-+-+1+J@9+( n $ ( n K.v h.{ * * m ++$@b 3.7 p k@k@e@k@p _                       ",
+"                          7 b {@^.$.l } a 1 ..j.=.V ^ n ( ( n ^ ( ( ( ( ( ].( ( ( }@*@S@-+l+S@}+3+p#6#-+w@h@[+n+g@0+a+-+-+-+-+K@[@g@h v v _+v _+( % { q#m.E H.M a l.F k@e@e@r 3.n                       ",
+"                            e !.b k.I | Q *.G.'.s.j.1.n n ( ( ].].].^ ].( { ^ n n O@i+r#*+s+<+## #-+`@a@s#)@0+R+-+-+-+-+-+-+-@!+J@J@n h v ( { * { v *.q c .+Y.7 O T+k@e@e@l@[ -                         ",
+"                              o Y | q q O G.8 /.$.[ j 1.- n { ( ( ( ( ( n ( ( ( ( ( c#)#$#+#$#+@p+s+t#~@u#r#*+S@-+=+1+.@-+4+E@7+v#J@_+v _+* % % C N  .| ^.a v.a p l@5#5#k@c V                           ",
+"                                k L F r I $.- = _ a R } E = n n { { { ( ].{ n n n J@j+k+q@K@.@L+'@g+#@@#I@9+$#4+}+p+*+^@z+-+L@c#7+!@( { % * * ] X.q | =.a e 0 j ]#e@e@e@H i.                            ",
+"                                $.Y q G m@l.V C V [ u } q $@w#S ( ( ( ].( ( ( ( ( n 3+M@a+m#Z+g+l+z@6#*+b+@#g+x#f+1+S@0+-+K@^@J@D+d@=#, / ].6 O.T+Q.[ !#e l.Y s e@e@e@t {.{                             ",
+"                                  3.| s u@I k.0 0.!.| $@q !.Y Q.++].( n ].n n n ( n ( ( J@y#^#4@^@f+z#g#~#/+G@I@b@w@a+R+y@<+K@^+J@{ _+v n w | | d $@Q $.O c s e@e@e@F 7 S                               ",
+"                                    Q t@*#u@F } |.T+c u@d /.[ b } $@6 ].( $ ( $ n ( n n n K.v G@*+I@;#A#u+3+9@k+S@u+R@~@z+-+^+i@i#_+n 8 j c k c K l ^.~.t l@k@k@k@l#3.S                                 ",
+"                                      Q  .F l@` t@m@r k@3.w o#o#.+[ t.q ,.8 < 8 8 $ ( ( { S h J+B#~#_@^@o@p+J@T@6#6#Z+*+}@M@r#^ #.o#u.T+} X ^.X |.~.H C#Y@e@e@k@m@a ^                                   ",
+"                                        3.| ` k@G F *#k@S x w 8 G./.N l.R T+w#++'.< 6 w ( n { { n ( M+;#b+Z@D+H@;+#@k#d+%#*+D#d | ~.g | O.D !.p t ` k@e@Y@e@k@t@7 ^                                     ",
+"                                            u C#l@l@e@s 3.< #.#.; - ; #.Y.v+.+O.|.Y X.N #.= ^ n v v ( F+1#}+l+&@c#3+b#o@1#E#X M Q G.#.[ Q.M T+]#l@e@5#e@e@l@ .{.                                        ",
+"                                              b F Y@5#t Q.{@^.v.= $ n 8 _ _ V {..+B.R | | $@T+L F u@C#C#u@_@u@u@;#U@_@~.[ Q /.< _ i._ a s  .r *#k@k@e@e@r ~.Y.                                          ",
+"                                                a m@e@s ]#Z j@k.e {.$._ ^ n = {.=.1.[ j.j@} u |.b ~.t@q t.k |.[ [ ^.P a $.Y._ : 3.o O l.e#*#k@e@e@e@k@F 0 _                                             ",
+"                                                  3.| m@s ]#m@Z K ~.X e #.- _ {.l.H.).g |.|.b O O X b 3./#7 /#V : @.@.v.Y.9 7 a t.T+T+G e@5#e@k@k@u@I 3.;                                               ",
+"                                                      0 | ` u@u@` F $@| J ^.P g ~.X O b O l X H.g Q ; = = V - S < [ g a 0 ).{@ .m@s k@e@e@e@e@r p e #.                                                  ",
+"                                                          H.p l@k@*#l@u@m@p t@m@F H q t.b t.{@J } O 0 l.O e @.3.l.} u | T+Z F l@Y@Y@e@e@e@l@t H./.                                                      ",
+"                                                              H.Q.` k@k@*#*#*#k@l@C#C#r F F | T+m@t m@q $@| | T+L m@F u@l@e@Y@k@e@e#e@k@$@^.$.                                                          ",
+"                                                                $.H.t.m@u@k@e@Y@5#k@k@k@k@l@u@l@k@Y@k@l@r l@l@k@k@Y@e@e@e@k@Y@Y@l@F j@e $.;                                                             ",
+"                                                                      a O } t C#e@5#e@e@k@k@Y@Y@e@e@e@k@Y@e@e@Y@Y@k@e#Y@k@r F j@H.a V                                                                   ",
+"                                                                            3.H.H.I q G u@l@k@e@e@e@e@e@k@e@k@l@s F p j@[ H.3.C.                                                                        ",
+"                                                                                    {.a 0 M H.g k.b l b [ g O P H.3.{.i.                                                                                ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.bmp
new file mode 100644 (file)
index 0000000..360d5e5
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_mask.xpm
new file mode 100644 (file)
index 0000000..398d3b6
--- /dev/null
@@ -0,0 +1,105 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_mask_xpm[] = {
+"100 100 2 1",
+"      c #000000",
+".     c #FFFFFF",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                          ..................                                        ",
+"                                      ..........................                                    ",
+"                                   ................................                                 ",
+"                                ......................................                              ",
+"                               ........................................                             ",
+"                             ............................................                           ",
+"                           ................................................                         ",
+"                         ....................................................                       ",
+"                        ......................................................                      ",
+"                       ........................................................                     ",
+"                      ..........................................................                    ",
+"                    ..............................................................                  ",
+"                   ................................................................                 ",
+"                  ..................................................................                ",
+"                 ....................................................................               ",
+"                ......................................................................              ",
+"                ......................................................................              ",
+"               ........................................................................             ",
+"              ..........................................................................            ",
+"             ............................................................................           ",
+"             ............................................................................           ",
+"            ..............................................................................          ",
+"            ..............................................................................          ",
+"           ................................................................................         ",
+"          ..................................................................................        ",
+"          ..................................................................................        ",
+"         ....................................................................................       ",
+"         ....................................................................................       ",
+"         ....................................................................................       ",
+"        ......................................................................................      ",
+"        ......................................................................................      ",
+"        ......................................................................................      ",
+"       ........................................................................................     ",
+"       ........................................................................................     ",
+"       ........................................................................................     ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"      ..........................................................................................    ",
+"       ........................................................................................     ",
+"       ........................................................................................     ",
+"       ........................................................................................     ",
+"        ......................................................................................      ",
+"        ......................................................................................      ",
+"        ......................................................................................      ",
+"         ....................................................................................       ",
+"         ....................................................................................       ",
+"         ....................................................................................       ",
+"          ..................................................................................        ",
+"          ..................................................................................        ",
+"           ................................................................................         ",
+"            ..............................................................................          ",
+"            ..............................................................................          ",
+"             ............................................................................           ",
+"             ............................................................................           ",
+"              ..........................................................................            ",
+"               ........................................................................             ",
+"                ......................................................................              ",
+"                ......................................................................              ",
+"                 ....................................................................               ",
+"                  ..................................................................                ",
+"                   ................................................................                 ",
+"                    ..............................................................                  ",
+"                      ..........................................................                    ",
+"                       ........................................................                     ",
+"                        ......................................................                      ",
+"                         ....................................................                       ",
+"                           ................................................                         ",
+"                             ............................................                           ",
+"                               ........................................                             ",
+"                                ......................................                              ",
+"                                   ................................                                 ",
+"                                      ..........................                                    ",
+"                                          ..................                                        ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.bmp
new file mode 100644 (file)
index 0000000..44df107
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_CTQuantification.xpm
new file mode 100644 (file)
index 0000000..1ba0706
--- /dev/null
@@ -0,0 +1,823 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_CTQuantification_xpm[] = {
+"100 100 720 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #EE8C8A",
+">+    c #B44A47",
+",+    c #E6787C",
+"'+    c #7E3030",
+")+    c #6D3435",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #FDC6C6",
+"/+    c #FBCCC9",
+"(+    c #FBCED1",
+"_+    c #F9D3D3",
+":+    c #504E4C",
+"<+    c #99938A",
+"[+    c #C4BBAF",
+"}+    c #D7CCBE",
+"|+    c #FF0000",
+"1+    c #D4CABC",
+"2+    c #CBC2B5",
+"3+    c #999289",
+"4+    c #FAD4D5",
+"5+    c #FBDCDB",
+"6+    c #6F6B66",
+"7+    c #AFA79C",
+"8+    c #CCC2B6",
+"9+    c #D9CFC0",
+"0+    c #D3C9BB",
+"a+    c #AAA298",
+"b+    c #7A7570",
+"c+    c #6B0000",
+"d+    c #6B0100",
+"e+    c #FDCECB",
+"f+    c #908A82",
+"g+    c #AFA79D",
+"h+    c #E66158",
+"i+    c #E4D9CB",
+"j+    c #D1C7BA",
+"k+    c #B3ABA0",
+"l+    c #9D968D",
+"m+    c #373736",
+"n+    c #C35959",
+"o+    c #9E3E39",
+"p+    c #FDDEDD",
+"q+    c #605D59",
+"r+    c #A19A91",
+"s+    c #CAC0B3",
+"t+    c #F66F65",
+"u+    c #DED3C4",
+"v+    c #B9B1A5",
+"w+    c #AB4A49",
+"x+    c #984E4E",
+"y+    c #D98182",
+"z+    c #FBE6E9",
+"A+    c #938D85",
+"B+    c #C3BAAE",
+"C+    c #F26C62",
+"D+    c #DCD1C3",
+"E+    c #D1C7B9",
+"F+    c #BFB7AA",
+"G+    c #712421",
+"H+    c #B24243",
+"I+    c #FBE4E1",
+"J+    c #716D68",
+"K+    c #B3ABA1",
+"L+    c #EB665D",
+"M+    c #E1D6C7",
+"N+    c #D6CBBE",
+"O+    c #C0B7AB",
+"P+    c #6B0200",
+"Q+    c #99928A",
+"R+    c #D34F48",
+"S+    c #E3D8C9",
+"T+    c #DAD0C1",
+"U+    c #C3BAAD",
+"V+    c #BF4D4D",
+"W+    c #FFEAED",
+"X+    c #918B82",
+"Y+    c #BEB6AA",
+"Z+    c #FA7369",
+"`+    c #DBD1C2",
+" @    c #C8BEB1",
+".@    c #A29B91",
+"+@    c #5C5955",
+"@@    c #000000",
+"#@    c #89847C",
+"$@    c #F06A61",
+"%@    c #DCD2C3",
+"&@    c #C6BDB0",
+"*@    c #A49C93",
+"=@    c #681C1A",
+"-@    c #78736D",
+";@    c #B9B1A6",
+">@    c #E0D5C7",
+",@    c #C7BEB1",
+"'@    c #A19A90",
+")@    c #5E5B57",
+"!@    c #6F6C66",
+"~@    c #B7AEA3",
+"{@    c #E56058",
+"]@    c #A39C92",
+"^@    c #5E403A",
+"/@    c #B2AA9F",
+"(@    c #E76159",
+"_@    c #DACFC2",
+":@    c #C9C0B3",
+"<@    c #A09A90",
+"[@    c #AA423F",
+"}@    c #6B0300",
+"|@    c #6B0400",
+"1@    c #6C4D46",
+"2@    c #9E7C71",
+"3@    c #EA655C",
+"4@    c #D7CDBF",
+"5@    c #CBC1B4",
+"6@    c #9F988F",
+"7@    c #785951",
+"8@    c #A27F74",
+"9@    c #EF6960",
+"0@    c #DAD0C2",
+"a@    c #C5BCB0",
+"b@    c #9C968D",
+"c@    c #7D5D55",
+"d@    c #A58277",
+"e@    c #F36D64",
+"f@    c #C1B9AC",
+"g@    c #432622",
+"h@    c #84635B",
+"i@    c #A9877A",
+"j@    c #F87167",
+"k@    c #C6A293",
+"l@    c #C9BFB2",
+"m@    c #A29C92",
+"n@    c #6B0600",
+"o@    c #6B0900",
+"p@    c #6B0800",
+"q@    c #664740",
+"r@    c #947268",
+"s@    c #B49084",
+"t@    c #F77066",
+"u@    c #C49F91",
+"v@    c #B08C80",
+"w@    c #3C0F0F",
+"x@    c #110203",
+"y@    c #AC4441",
+"z@    c #6B0A00",
+"A@    c #6B0500",
+"B@    c #6B1000",
+"C@    c #6B0B00",
+"D@    c #795951",
+"E@    c #A58276",
+"F@    c #F26C63",
+"G@    c #C9A495",
+"H@    c #BD998C",
+"I@    c #AB887C",
+"J@    c #551815",
+"K@    c #6B0C00",
+"L@    c #6B0E00",
+"M@    c #6B1900",
+"N@    c #6B2900",
+"O@    c #6B2C00",
+"P@    c #63493E",
+"Q@    c #937367",
+"R@    c #AE8A7E",
+"S@    c #B99588",
+"T@    c #A17F73",
+"U@    c #4F1311",
+"V@    c #6B0700",
+"W@    c #6B2D00",
+"X@    c #6B5C00",
+"Y@    c #4A4629",
+"Z@    c #89815E",
+"`@    c #A29474",
+" #    c #F16B62",
+".#    c #F36D63",
+"+#    c #C29E8F",
+"@#    c #563833",
+"##    c #6B2A00",
+"$#    c #6B6700",
+"%#    c #72783C",
+"&#    c #7E8A4D",
+"*#    c #95995A",
+"=#    c #F46E64",
+"-#    c #C29D8F",
+";#    c #85645C",
+">#    c #422522",
+",#    c #A33B3A",
+"'#    c #6B6500",
+")#    c #7C884A",
+"!#    c #6C9556",
+"~#    c #F16B61",
+"{#    c #CAB696",
+"]#    c #BC9B8A",
+"^#    c #9E7B70",
+"/#    c #430F0E",
+"(#    c #6B3200",
+"_#    c #928F51",
+":#    c #E9645B",
+"<#    c #F26D63",
+"[#    c #8FA667",
+"}#    c #ABA565",
+"|#    c #AD977D",
+"1#    c #8A6A60",
+"2#    c #5E3F3A",
+"3#    c #6B4400",
+"4#    c #A2A061",
+"5#    c #78A566",
+"6#    c #7AA667",
+"7#    c #859759",
+"8#    c #A09872",
+"9#    c #77614F",
+"0#    c #541714",
+"a#    c #6B4900",
+"b#    c #A8A565",
+"c#    c #87A465",
+"d#    c #769B5D",
+"e#    c #6D894C",
+"f#    c #727438",
+"g#    c #554B32",
+"h#    c #6B1200",
+"i#    c #370A09",
+"j#    c #6B4700",
+"k#    c #9E985A",
+"l#    c #828C4F",
+"m#    c #6E7C40",
+"n#    c #575C23",
+"o#    c #6B6600",
+"p#    c #6B3000",
+"q#    c #6B5400",
+"r#    c #6B6000",
+"s#    c #6B5D00",
+"t#    c #6B4300",
+"u#    c #6B1E00",
+"v#    c #190407",
+"w#    c #6B1100",
+"x#    c #625F5A",
+"y#    c #8B857D",
+"z#    c #494845",
+"A#    c #847F78",
+"B#    c #A49D93",
+"C#    c #C1B8AC",
+"D#    c #858078",
+"E#    c #A49D94",
+"F#    c #F56E64",
+"G#    c #7A766F",
+"H#    c #E8625A",
+"I#    c #F56F65",
+"J#    c #D9CEC0",
+"K#    c #E0D6C7",
+"L#    c #6C6863",
+"M#    c #B6AEA3",
+"N#    c #EF6A60",
+"O#    c #DDD3C4",
+"P#    c #514F4D",
+"Q#    c #B0A89D",
+"R#    c #E35E56",
+"S#    c #CCC3B5",
+"T#    c #BAB2A7",
+"U#    c #7C7771",
+"V#    c #DD5951",
+"W#    c #DAD1C2",
+"X#    c #CEC5B7",
+"Y#    c #C5BCAF",
+"Z#    c #807B75",
+"`#    c #979188",
+" $    c #BCB4A8",
+".$    c #E56057",
+"+$    c #D8CEBF",
+"@$    c #D6CCBE",
+"#$    c #CFC5B7",
+"$$    c #8C867F",
+"%$    c #403F3E",
+"&$    c #080100",
+"*$    c #7F7A74",
+"=$    c #A9A198",
+"-$    c #D7CDBE",
+";$    c #D2C9BB",
+">$    c #CDC4B7",
+",$    c #B7AFA4",
+"'$    c #989289",
+")$    c #5C5A56",
+"!$    c #484645",
+"~$    c #D5CBBD",
+"{$    c #D2C8BA",
+"]$    c #C4BBAE",
+"^$    c #B8AFA4",
+"/$    c #A09990",
+"($    c #79756F",
+"_$    c #0A0301",
+":$    c #6E6A65",
+"<$    c #D3CABB",
+"[$    c #D5CABD",
+"}$    c #BDB4A9",
+"|$    c #A8A198",
+"1$    c #88827B",
+"2$    c #434140",
+"3$    c #4C1711",
+"4$    c #AAA398",
+"5$    c #C6BCAF",
+"6$    c #DED4C5",
+"7$    c #D6CBBD",
+"8$    c #75716B",
+"9$    c #C8BFB1",
+"0$    c #D9CFC1",
+"a$    c #DACFC0",
+"b$    c #CAC1B4",
+"c$    c #A8A197",
+"d$    c #79746E",
+"e$    c #817C75",
+"f$    c #B1A99E",
+"g$    c #C9BFB3",
+"h$    c #F36E64",
+"i$    c #E0D6C6",
+"j$    c #CDC3B6",
+"k$    c #A7A096",
+"l$    c #7D7972",
+"m$    c #0B0403",
+"n$    c #847F77",
+"o$    c #ACA59A",
+"p$    c #F97368",
+"q$    c #DFD4C5",
+"r$    c #ABA399",
+"s$    c #363535",
+"t$    c #4F4D4A",
+"u$    c #868179",
+"v$    c #A8A196",
+"w$    c #F67066",
+"x$    c #D8CDBF",
+"y$    c #23211F",
+"z$    c #5B5955",
+"A$    c #65615D",
+"B$    c #77736D",
+"C$    c #7C7871",
+"D$    c #A59E94",
+"E$    c #C6BDB1",
+"F$    c #D5CBBE",
+"G$    c #DFD5C6",
+"H$    c #E6DBCC",
+"I$    c #807B74",
+"J$    c #5B5854",
+"K$    c #7D7872",
+"L$    c #87817A",
+"M$    c #8A847D",
+"N$    c #63605B",
+"O$    c #9B958C",
+"P$    c #DED2C4",
+"Q$    c #F77167",
+"R$    c #BDB5A9",
+"S$    c #969087",
+"T$    c #65625D",
+"U$    c #4E4C4A",
+"V$    c #7E7973",
+"W$    c #8F8982",
+"X$    c #9F988E",
+"Y$    c #42413F",
+"Z$    c #8D8880",
+"`$    c #E2D7C8",
+" %    c #C8BFB2",
+".%    c #B4ACA0",
+"+%    c #8E8880",
+"@%    c #67635E",
+"#%    c #4E4C49",
+"$%    c #7B7770",
+"%%    c #8C877F",
+"&%    c #9B948C",
+"*%    c #9A938A",
+"=%    c #958F86",
+"-%    c #D34F47",
+";%    c #D1C8BA",
+">%    c #DCD2C4",
+",%    c #D4CABD",
+"'%    c #B0A79D",
+")%    c #8D877F",
+"!%    c #6B6762",
+"~%    c #686560",
+"{%    c #857F78",
+"]%    c #969088",
+"^%    c #A39B91",
+"/%    c #ADA59A",
+"(%    c #CB4741",
+"_%    c #D04C45",
+":%    c #514F4C",
+"<%    c #8F8A82",
+"[%    c #C4BCAF",
+"}%    c #D6CDBE",
+"|%    c #DFD4C6",
+"1%    c #DBD0C2",
+"2%    c #D0C7B9",
+"3%    c #B5ADA2",
+"4%    c #7C7872",
+"5%    c #504E4B",
+"6%    c #595753",
+"7%    c #817D75",
+"8%    c #9E978E",
+"9%    c #AEA69B",
+"0%    c #BAB2A6",
+"a%    c #D14D46",
+"b%    c #CD4942",
+"c%    c #ACA49A",
+"d%    c #B8B0A4",
+"e%    c #CCC3B6",
+"f%    c #D7CEBF",
+"g%    c #E0D5C6",
+"h%    c #CEC4B7",
+"i%    c #BEB5A9",
+"j%    c #999389",
+"k%    c #726E69",
+"l%    c #595653",
+"m%    c #4F4D4B",
+"n%    c #54514E",
+"o%    c #5C5956",
+"p%    c #716D67",
+"q%    c #908B83",
+"r%    c #9B948B",
+"s%    c #AEA69C",
+"t%    c #D24E47",
+"u%    c #D45049",
+"v%    c #CE4A44",
+"w%    c #B0A99D",
+"x%    c #9D978D",
+"y%    c #A79F96",
+"z%    c #D0C6B9",
+"A%    c #DDD2C4",
+"B%    c #CFC5B8",
+"C%    c #BCB3A8",
+"D%    c #A79F95",
+"E%    c #928D84",
+"F%    c #938E85",
+"G%    c #8F8981",
+"H%    c #908B82",
+"I%    c #948E85",
+"J%    c #A29B92",
+"K%    c #B0A99E",
+"L%    c #BBB3A8",
+"M%    c #DA554E",
+"N%    c #D9554E",
+"O%    c #BDB4A8",
+"P%    c #9C958C",
+"Q%    c #53514E",
+"R%    c #CDC4B6",
+"S%    c #D2C8BB",
+"T%    c #D4CBBC",
+"U%    c #C6BCB0",
+"V%    c #BFB6AA",
+"W%    c #BAB1A6",
+"X%    c #B6AEA2",
+"Y%    c #BCB3A7",
+"Z%    c #CF4C45",
+"`%    c #D7534B",
+" &    c #DB574F",
+".&    c #C2B9AD",
+"+&    c #B5AEA2",
+"@&    c #9A938B",
+"#&    c #B7AFA3",
+"$&    c #F36C63",
+"%&    c #F46D64",
+"&&    c #DED3C5",
+"*&    c #C7BFB2",
+"=&    c #E35F56",
+"-&    c #E45F56",
+";&    c #E05C53",
+">&    c #938C84",
+",&    c #837E76",
+"'&    c #120304",
+")&    c #BBB2A6",
+"!&    c #EA645B",
+"~&    c #E25D54",
+"{&    c #E35E55",
+"]&    c #E05B53",
+"^&    c #CAC1B3",
+"/&    c #BBB3A6",
+"(&    c #ACA499",
+"_&    c #928B83",
+":&    c #7E7972",
+"<&    c #555350",
+"[&    c #78746E",
+"}&    c #979088",
+"|&    c #A9A298",
+"1&    c #C7BDB0",
+"2&    c #D2C9BA",
+"3&    c #D1C8B9",
+"4&    c #CFC6B8",
+"5&    c #CCC2B5",
+"6&    c #CBC2B4",
+"7&    c #ADA59B",
+"8&    c #989189",
+"9&    c #67645F",
+"0&    c #B9B0A5",
+"a&    c #C2B8AC",
+"b&    c #CDC3B5",
+"c&    c #D2C7BA",
+"d&    c #D5CCBD",
+"e&    c #DDD2C3",
+"f&    c #C8BEB2",
+"g&    c #8A857D",
+"h&    c #827E77",
+"i&    c #6A6661",
+"j&    c #421410",
+"k&    c #3B3A39",
+"l&    c #6C6963",
+"m&    c #918C83",
+"n&    c #B4ACA1",
+"o&    c #B8AFA3",
+"p&    c #827D76",
+"q&    c #3F110C",
+"r&    c #9E978D",
+"s&    c #AEA79B",
+"t&    c #B2AB9F",
+"u&    c #AAA297",
+"v&    c #A9A196",
+"w&    c #948E86",
+"x&    c #8F8A81",
+"y&    c #75706B",
+"z&    c #5D5A57",
+"A&    c #736F69",
+"B&    c #87827A",
+"C&    c #928C84",
+"D&    c #968F87",
+"E&    c #958E86",
+"F&    c #8C877E",
+"G&    c #87827B",
+"H&    c #7F7A73",
+"I&    c #7E7A73",
+"J&    c #454342",
+"K&    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+-+-+-+@+.+@+.+++.+W.P.O.F.M.s.;+;+< Q.| @.1 j & y.y.u.. u.3 L L / ' >+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< ,+j - l '+y )+r.G.O.P.#+.+-+-+@+!+@+!+~+{+-+{+-+-+@+.+@+@+.+P.O.F.M.q.i.;+h.X.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+@+=+-+{+~+^+{+{+{+{+!+{+~+-+{+-+@+.+.+P.O.F.M.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P..+.+-+!+~+^+{+^+^+/+(+(+{+^+^+{+{+{+-+-+@+=+.+P.O.F.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 ,+k.v ' ^.d.m Q B.D.F.N.O.W..+=+=+~+{+^+(+_+(+:+<+[+}+|+|+1+2+3+{+~+-+@+.+++P.O.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.N.W.W.@+-+!+{+/+(+/+/+_+4+5+6+7+8+|+|+9+0+a+b+{+{+@+=+.+++P.P.G.s.;+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.F.P.W..+.+-+c+d+d+/+_+(+e+4+4+5+f+g+h+|+i+j+k+l+m+^+{+-+-+=+W.F.N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e n+o+o.n L.h.i.F.N.P.++-+@+c+c+c+c+c+5+5+5+p+p+p+q+r+s+|+t+u+0+v+q+^+{+{+-+=+.+O.O.F.q.i.h.X.| e % j & N . * L ' / / , , > M M # : m 9.~.o+5 u 0.0                       ",
+"                      b / & N n+w+F K.x+y+] M.F.E.W.++@+c+c+c+c+c+c+c+p+5+z+z+z+p+A+B+|+C+D+E+F+q+(+^+{+@+-+W.++O.F.i.{ k.Q.~ @.1 ].@ y.R.$ a a L ).> M , b b b M - R G+0 H+u $+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.#+c+c+c+c+c+c+c+c+c+c+d+5+I+z+I+J+K+L+|+M+N+O+q+(+{+^+!+@+.+W.O.O.F.i.{ } ~ v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.x+< { s.G.O.E.c+c+c+c+c+c+c+c+c+c+c+c+P+z+z+z+z+Q+R+|+S+T+U+q+_+(+^+~+-+=+.+P.E.F.s.{ h.[ | f j & @ . u.3 ! a > > , , M O # # A V+6.G+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.;+q.F.O.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+I+I+W+X+Y+|+Z+`+ @.@+@_+/+{+!+-+.+P.E.G.@@@@@@@@@@@@@@& N @@@@@@@@@@@@@@@@@@@@b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W+I+#@O+$@|+%@&@*@q+(+^+{+~+@+-+P.F.@@@@@@@@@@@@@@j % y.d @@@@@@@@@@@@@@@@; M O # M b M +.o `.u u w.=@0                 ",
+"                , = b L s +.9 9 7 g [ t.i.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W+-@;@h+|+>@,@'@)@(+(+{+!+=+=+W.O.@@@@;+k.Q.| 1 j % @ + $ ! 3 @@@@B , B ; b M b M O A V+G+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.c+c+c+c+c+c+c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+!@~@{@|+%@,@]@q+_+/+{+{+-+.+#+O.@@@@] t.Q.~ 1 f j y.+ R.3 3 @@@@, B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.'+<.r c+c+c+c+c+c+c+c+c+c+d+d+d+c+c+d+P+c+c+c+c+c+c+c+^@/@(@|+_@:@<@q+(+(+{+!+-+.+#+P.@@@@] t.X.,+@.f j N + u.! $ @@@@, B , , b ; O # O A ^ H+'.l ..6 U o +.              ",
+"              > 6 b > 5 [@o.9 0.1 c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+}@|@d+c+c+d+c+c+1@2@3@|+4@5@6@q+(+/+^+!+@+@+++O.@@@@;+k.Q.~ v % % y.N + 3 L @@@@> , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+d+c+c+c+c+c+7@8@9@|+0@a@b@q+(+^+{+!+-+++W.P.@@@@] t.X.,+v f % y.+ R.3 3 @@@@B , , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ c+c+c+c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c@d@e@|+%@f@<@q+/+(+{+-+.+++P.F.@@@@{ < Q.| 1 e j ].R.. 3 3 @@@@> B M M ; ; b # A b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E '+& f Y.Q.c+c+c+c+d+|@}@c+c+c+c+c+c+c+c+d+}@}@d+d+c+c+g@h@i@|+j@k@l@m@q+/+{+-+-+=+++E.O.@@@@{ P X.e j e N @ u.$ ! 3 @@@@, , , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.H+..>.L.j j v } k.c+c+c+c+|@n@}@c+c+c+c+c+c+c+d+|@o@p@|@c+c+q@r@s@|+t@u@v@q+_+^+^+{+-+=+#+P.F.@@@@@@@@@@@@@@& % + + R.a a @@@@> B M O M M b b O M # M b U E I.>.w@x@x@            ",
+"          ].y@= ( u C d.'+T N @ f v [ } j.c+c+c+d+z@z@A@d+c+c+c+c+c+c+P+o@B@C@}@c+D@E@F@|+G@H@I@q+^+^+-+-+=+++W.E.N.;+@@@@@@@@@@@@@@y.+ $ u.* a @@@@, , , b # ; M M O b O # O H+p W =.Y X w@x           ",
+"          $ n H V =@u _ '+J@N N ].@.[ P h.] c+c+d+|@K@L@p@P+c+c+c+c+c+c+n@M@N@O@P@Q@R@F@|+G@S@T@q+c+c+!+=+++W.O.M.M.r.;+k.Q.r | j ].& R.R.! ! > )./ B B M , b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l U@X &.-.p j + % @.,+< k.i.r.c+P+P+A@p@o@A@d+c+c+c+c+c+V@W@X@Y@Z@`@ #.#|++#s@r@@#c+c+c+-+#+W.O.E.i.;+h.< | ~ 1 j ].& . u.3 3 * )., , , M M O O O b O b M M b w D D 0 A.E U@o           ",
+"          > ! < < e H+J.&.` N u.& 1 [ X.} { ;+q.c+d+d+P+P+d+c+c+c+c+c+c+d+##$#%#&#*#C+=#|+-#R@;#>#d+c+c+c+P.N.F.i.] { { | [ @.% ].& d R.. a ! * / > B B # ; b b O M O M b b O b o.T.,#w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.c+c+d+d+d+d+c+c+c+c+c+d+B@'#)#!#~#=#|+{#]#^#D@c+c+d+c+c+c+N.F.s.] k.< [ v e j % @ + u.$ a ! > / , , B O ; B M O b O O O O O b ..$+0.z n./#J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 | [ X.t.;+;+M.c+c+d+d+}@P+c+c+d+d+c+|@(#_#:#<#|+[#}#|#1#2#c+c+d+d+d+c+d+r.;+{ P [ ~ @.f & & y.. $ 3 * / / B B M ; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @.~ X.< i.i.] M.c+c+c+d+}@d+c+c+c+c+c+V@3#4#|+5#6#7#8#9#d+c+c+c+d+d+c+c+d+i.k.Q.| e 1 e @ N y.R.3 3 3 L / > B B b O # O b O b ^ M b A # b `.k 0.U E G w@          ",
+"          ( @.1 ).: 4 z =@0##.$ + @ f e 1 ,+} < h.;+q.M.c+c+c+c+d+c+c+c+c+c+c+A@a#b#c#d#e#f#g#h#c+c+c+d+d+c+c+c+d+h.[ ~ @.f @ & @ . $ 3 ! * > > , , , , b b M M O M b b # b O O ~...c.`.o q i#          ",
+"          - 1 $ b # w o.n.J@#.L u.y.& H.1 ~ [ < t.{ i.s.M.c+c+d+d+d+c+c+d+d+c+c+}@j#k#l#m#n#o#N@A@c+c+c+d+d+c+c+d+d+,+r f j ].@ N R.$ a ! ! / B B M M M B O O b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 J@$ L . + y.].H.1 ,+| < t.{ i.] q.M.d+P+}@d+c+P+|@}@c+c+A@p#q#r#s#t#u#|@c+c+c+c+c+c+c+c+P+|@H.j ].N y.R.$ a )./ / B , , , O # O b O M O A M O A M O ^ ~.$+0.U n.i#v#          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v ,+[ < t.j.;+i.s.s.P+P+d+d+P+|@A@}@c+c+P+K@w#B@z@d+c+c+c+c+c+c+c+c+c+c+c+d+& % N . R.L L 3 * / > M B ; M # ; b O b # ^ b # O b M a.'.~.!.G+w@X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v ,+[ } h.t.{ i.x#y#P+d+c+P+A@A@}@d+c+c+P+}@|@}@d+c+c+c+d+c+c+c+c+c+c+c+c+c+& + u.3 3 ! L / > B , , M b b A M O M b b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.G+8 2.' ' u.u.d @ ].].j 1 e | ,+} P z#A#B#C#P+d+d+|@}@d+c+c+c+}@}@d+c+c+c+c+d+d+d+c+c+c+c+c+c+c+c+d+. $ ! L ' > / , B M b , M O O b O M M A M b # b ^ ,#I.o.>.q 7.X v#          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } D#E#~#F#|+d+c+d+}@d+c+c+c+d+|@}@c+c+c+d+}@|@P+c+c+c+c+c+c+c+d+d+d+j ].+ R.R.3 L , > ; A ; b O M O O O O O M M ; b 0 x.'.E U@i#Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.@ ].].j 1 1 @.G#<@H#I#|+J#K#c+c+c+c+c+c+c+c+d+|@P+c+c+c+P+}@P+d+c+c+c+c+c+c+d+}@d+d+d+L / B > > a * , O ; b O b O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d V+9.o x.4.B > / L L $ . d @ & ].& e L#<+M#N#|+`+K#O#0+c+c+c+c+c+c+c+c+d+c+c+c+c+c+c+c+c+c+c+c+c+d+c+c+P+}@d+c+d+)., , , A B 3 > A M O M b b ; b O ; O # b [@Z.o J@w@i#X w@          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & P##@Q#R#|+`+>@M+4@S#T#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+P+d+c+d+d+! / > B B ; # O b / / b O M M A M b M b # B # _ E o.n.-.i#Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.U#]@V#|+9+9+W#4@X#Y#a+Z#c+c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+d+c+3 3 ' > , , M O M # M B * M O O O O M O ; M O : ~.G+>.n.J.7.v#9           ",
+"          3 2 u.M 0.+.$+_ D o.b.M / / ' ! 3 L $ u.. x#`# $.$|+J#+$@$#$Y#/@$$%$1 c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+3 L L / > > b M b M b O O , , O b O O b M b , A : 0  .T 8 w@v#&$U           ",
+"            c = 2 ]+U H+_ A.t C ; > > / * L ! L ! u.*$=$ @L+|+-$;$>$Y#,$'$)$j & ].c+d+P+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+L * * > / )./ / / b ; O # O O b * b ; b O M O B b s H+T.7 n.-.J &$Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! !$A+T#X#N#|+~${$]$^$/$($& % & & % d+n@|@d+c+c+c+c+c+c+c+c+c+c+c+c+c+a ' / , B > > > > , M b A b M M A > > M b # b ; B : z.T.F z 0#` Z _$7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * :$6@]$<$=#|++$[$}$|$1$2$@ @ d d + N d+P+d+c+c+c+c+P+c+c+c+d+c+c+c+3 ' / B B , , , , , B ^ # O M b O O O ).# M M ; M # C ,#9.,.E m.7.Z x@3$            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ($4$5$4@=#|+6$7$O+=$8$R.. R.. R.R.R.. R.c+c+c+c+c+P+P+c+c+d+d+3 3 * )., , B M M B > , B A b O O O b O O B , b M M M O 5 0 I.o 9 m.&.x@Y               ",
+"              [@/.U I.'.D c.m 8.o.M O M B B , B > U#Q#9$0$.#|+a$}+b$c$d$3 u.$ u.$ $ $ u.$ ! c+c+c+c+c+|@d+c+d+/ ! ' > / B B M # # , , > , O # O M b # M O ; L ; # , # : d.Z.E T 9 n.J _$J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > e$f$g$-$h$|+i$T+j$k$l$L u.L 3 a u.L a a * 3 d+d+d+c+d+|@c+> , / a > / , , M M B B , B B A b O M A b b A O 3 M M M M b.c.9 n.J@V w@v#m$-.              ",
+"                m ]+F A.t -.w@-.w@x.M M # # B , , n$o$s+E+T+|+p$q$0+r$A#' * ! 3 L / ' * ).' ' ).}@P+d+c+. , , B > B / > B M , ; , s$t$, ; O M b O O O M # # ! O , ; O w 8 8.9 J@w@X &$v#                ",
+"                [@>.7.v#=.V /.'.9 q s A A O O M B u$v$F+@$J#w$|+S+x$v+l+y$* / > 3 / > > / / > > > A@A@B u.B , , B )./ > , B B z$A$B$n$B b O M O b # O b M b u.M M ; b >+S m.9 J.i#v#&$*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O C$D$E$F$G$h$|+H$T+:@k+I$/ > ).> )./ / ).> , , , , , B . , B M ; b B , > J$6+K$L$M$A+b # O O b # A M B b B u., , M M 7 p K x@m$v#_$&$9                 ",
+"                  0.l o+( / : k z T V 6 M b , # b N$O$B+;$O#P$Q$|+G$E+R$S$T$, , B > > , , > B B B B , M ! b b # M O O U$d$8$V$e$W$b@X$A b O M A b b # ; ; M $ B B M ^.;.x.~.0#Y &$&$v#                  ",
+"                    +.x z.c k $+~.G+p  .5 O A b M Y$Z$,$2+0$`$h$|+S+@$ %.%+%@%B , , , B B , , , B # O # L , B b # #%@%$%%%&%*%f+=%-%|+O M b O O ; ; O M B / 3 , , ^ Z.V 8.o.9 *.x@&$                    ",
+"                    0 ~...9.7 F T.=@p 9 '+O M O b O U#<@}$;%6$>%$@|+O#,%f@'%)%!%M M # # M M M b M M b # > , M M ~%{%]%^%/%Q#c$(%|+|+_%# M O b M M M # B B ).).M A A.;.9 G+n.&.v#&$J                     ",
+"                      F I.8 8 9 9 J.J@T z z C O M b :%<%f$[%}%|%N#|+1%~$2%f@3%&%4%5%M b O O O ; # b B b B > 6%7%8%c$9%.%0%a%|+|+b%v$c%A O b ; O O b B , , ).M C ]+J.J.9 p I x@&$x@                      ",
+"                      u n.3$q m.G+o.I.8 p T y@C M O b 8$6@d%e%f%g%.#|+`+~$h% %i%r$j%D#$%k%N$l%m%n%o%~%p%8$q%r%B#s%^$Y+t%u%|+v%w%*@x%y%O M M b , B , M > ) ) 5 n V 9 9 U@I Z _$&$7.                      ",
+"                        ,.w@w@8 n e.T.J.8.Z.7 f.w O # # f+k$C#z%D+A%|+Q$D+4@0+B%5@C%Q#D%6@O$E%F%G%H%I%O$J%v$K%L%C%M%N%|+|+O%;@7+*@=%P%M # O B M , B , M ^.3.m 0#E 7 9 K Z &$&$v#                        ",
+"                        H+G+n.o k 4 z J.F m U ]+o+z.A ^ Q%`#7+E$R%S%@$|+I#M+>%4@T%~${$U%V%0%W%^$~@X%X%d%Y% $Z%`% & &|+.&Y%T#+&9%@&f+f+# b ; , M , B ' ^.z.o.n.Z.l A.3$Z v#x@v#q                         ",
+"                          ..G+8 U u I.=@k 2 u U R m - b M !@l+#&f@,@h%|+|+$&%&F@C+&&&&0@~$S%#$]$*&l@=&-&;&|+|+|+|+|+&@V%d%X%k+9%>&,&-@M > B B , A ^.^.c ~.=@o.U m z w@'&x@x@`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.'+C b # B$r%f$)&C#b$0+|+|+|+|+I#=#.# #9@!&~&{&|+|+|+|+]&X#X#h%^&B+/&.%(&l+_&:&!%<&B , , B B M ^.u S R l 0.$+o.q X _$Z J                             ",
+"                              9.T p -.W 9.y@C 5 n E S ]+A A b [&}&|&/@Y%1&X#;%2&J#|+|+|+|+|+|+|+|+|+0+3&4&h%j$5&6&1&V%7&.@8&M$G#5%, B , M M ^ ' b.~.J.x.m $+..~.G I &$&$Y                               ",
+"                                o J./#&.p u C s _ o.S J.S 5 O ^ 9&>&]@/%k+0&a& @b&c&d&T+e&T+2%6&a@e%2+f&,@&@B+f@Y+v+|&Q+g&h&i&m+M , B , , n+A ^./.j&E n m w.A.T *.&$&$x@                                ",
+"                                0.8 w@i#/#U d.( [@I.J.T W 8.Z.C : k&l&m&l+|&n&~@W%]$:@j$z%j+,@V%.&f@V%Y%v+o&M#c$.@*%H%p&~%/ / ! a * ) ' B n+z.%.-.J.T.6 A.9.8 7.Z x@x@q&                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ t$D#r&6@'@a+s&#&0&)&t&o$Q#4$u&v&P%@&w&f+x&y&)@B B > , B > ).> > V+..U@m.W 0#..6 ~.V K x@'&Z i#                                  ",
+"                                    `.m.X *.i#8 >.J@n.=.V : 0 U >.n.0.d.C : z&p%8$A&[&B&C&D&E&E%G%F&G&H&I&d$:$)@J&, B , , > B > / ' M b.m.V R J.q 7 U =@W J Z x@Z w@                                    ",
+"                                      ..n.` v#7.q H w@m$u B 4 5 0.~.E V k y@b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.=@=@>.W I v#&$x@Y H                                       ",
+"                                          9 7.v#&.&.Z v#^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , '+Z.p z w@9 n G+-.W 7.v#&$&$x@Z                                           ",
+"                                            >.*.I J m$7...[@z._ ( O w _ 0.~.I.8 0#-.]+]+l y@^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 i#F q i#I Z &$&$&$X                                             ",
+"                                              o 7.v#&$q&J@E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.Z.o o.l /.f._ 6 H+l J J.7.J x@&$_$&$I                                               ",
+"                                                l q&x@*.7.q 9 T.!.u 0.y@C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k [@H+z.n 9.~.T.Z Z '&x@v#x@Z `                                                 ",
+"                                                    n.w@K ` q&-.0#=@E n y@( y@0.o.9.9.'.>.R I.U F o.o.$+k k u [@o+D +./.2 x u +.=@0#J.&._$_$x@v#Z K                                                     ",
+"                                                        p &.J J 7.w@U@n. .U U z >.G+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U G+K&q&K Z _$&$x@&$J                                                         ",
+"                                                            J.I v#X J *.w@q U@w@w@W q =@G+=@>.o 8 ~.w.U U D k ..o.8.8.T 0#-.7.J v#Z '&&$&$J                                                             ",
+"                                                                G K v#v#X X J v#I J =.&.&.w@p G /#q&w@H 0#n.n.G q w@&.I X v#x@x@&$x@v#X                                                                 ",
+"                                                                    >.j&=.v#'&x@&$x@x@v#Z =.K J v#v#Z J I =.v#Z Y v#v#'&x@x@x@x@J w@                                                                    ",
+"                                                                          8 /#*.Z _$&$x@x@Z m$&$m$m$m$'&v#Y &$Z x@x@Z x@X I w@                                                                          ",
+"                                                                                  8 -.&.*.X Z x@m$x@'&'&x@'&v#X ` w@-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.bmp
new file mode 100644 (file)
index 0000000..281accb
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_IRMQuantification.xpm
new file mode 100644 (file)
index 0000000..a117ee1
--- /dev/null
@@ -0,0 +1,823 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_IRMQuantification_xpm[] = {
+"100 100 720 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #EE8C8A",
+">+    c #B44A47",
+",+    c #E6787C",
+"'+    c #7E3030",
+")+    c #6D3435",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #FDC6C6",
+"/+    c #FBCCC9",
+"(+    c #FBCED1",
+"_+    c #F9D3D3",
+":+    c #504E4C",
+"<+    c #99938A",
+"[+    c #C4BBAF",
+"}+    c #D7CCBE",
+"|+    c #FF0000",
+"1+    c #D4CABC",
+"2+    c #CBC2B5",
+"3+    c #999289",
+"4+    c #FAD4D5",
+"5+    c #FBDCDB",
+"6+    c #6F6B66",
+"7+    c #AFA79C",
+"8+    c #CCC2B6",
+"9+    c #D9CFC0",
+"0+    c #D3C9BB",
+"a+    c #AAA298",
+"b+    c #7A7570",
+"c+    c #6B0000",
+"d+    c #6B0100",
+"e+    c #FDCECB",
+"f+    c #908A82",
+"g+    c #AFA79D",
+"h+    c #E66158",
+"i+    c #E4D9CB",
+"j+    c #D1C7BA",
+"k+    c #B3ABA0",
+"l+    c #9D968D",
+"m+    c #373736",
+"n+    c #C35959",
+"o+    c #9E3E39",
+"p+    c #FDDEDD",
+"q+    c #605D59",
+"r+    c #A19A91",
+"s+    c #CAC0B3",
+"t+    c #F66F65",
+"u+    c #DED3C4",
+"v+    c #B9B1A5",
+"w+    c #AB4A49",
+"x+    c #984E4E",
+"y+    c #D98182",
+"z+    c #FBE6E9",
+"A+    c #938D85",
+"B+    c #C3BAAE",
+"C+    c #F26C62",
+"D+    c #DCD1C3",
+"E+    c #D1C7B9",
+"F+    c #BFB7AA",
+"G+    c #712421",
+"H+    c #B24243",
+"I+    c #FBE4E1",
+"J+    c #716D68",
+"K+    c #B3ABA1",
+"L+    c #EB665D",
+"M+    c #E1D6C7",
+"N+    c #D6CBBE",
+"O+    c #C0B7AB",
+"P+    c #6B0200",
+"Q+    c #99928A",
+"R+    c #D34F48",
+"S+    c #E3D8C9",
+"T+    c #DAD0C1",
+"U+    c #C3BAAD",
+"V+    c #BF4D4D",
+"W+    c #FFEAED",
+"X+    c #918B82",
+"Y+    c #BEB6AA",
+"Z+    c #FA7369",
+"`+    c #DBD1C2",
+" @    c #C8BEB1",
+".@    c #A29B91",
+"+@    c #5C5955",
+"@@    c #000000",
+"#@    c #89847C",
+"$@    c #F06A61",
+"%@    c #DCD2C3",
+"&@    c #C6BDB0",
+"*@    c #A49C93",
+"=@    c #681C1A",
+"-@    c #78736D",
+";@    c #B9B1A6",
+">@    c #E0D5C7",
+",@    c #C7BEB1",
+"'@    c #A19A90",
+")@    c #5E5B57",
+"!@    c #6F6C66",
+"~@    c #B7AEA3",
+"{@    c #E56058",
+"]@    c #A39C92",
+"^@    c #5E403A",
+"/@    c #B2AA9F",
+"(@    c #E76159",
+"_@    c #DACFC2",
+":@    c #C9C0B3",
+"<@    c #A09A90",
+"[@    c #AA423F",
+"}@    c #6B0300",
+"|@    c #6B0400",
+"1@    c #6C4D46",
+"2@    c #9E7C71",
+"3@    c #EA655C",
+"4@    c #D7CDBF",
+"5@    c #CBC1B4",
+"6@    c #9F988F",
+"7@    c #785951",
+"8@    c #A27F74",
+"9@    c #EF6960",
+"0@    c #DAD0C2",
+"a@    c #C5BCB0",
+"b@    c #9C968D",
+"c@    c #7D5D55",
+"d@    c #A58277",
+"e@    c #F36D64",
+"f@    c #C1B9AC",
+"g@    c #432622",
+"h@    c #84635B",
+"i@    c #A9877A",
+"j@    c #F87167",
+"k@    c #C6A293",
+"l@    c #C9BFB2",
+"m@    c #A29C92",
+"n@    c #6B0600",
+"o@    c #6B0900",
+"p@    c #6B0800",
+"q@    c #664740",
+"r@    c #947268",
+"s@    c #B49084",
+"t@    c #F77066",
+"u@    c #C49F91",
+"v@    c #B08C80",
+"w@    c #3C0F0F",
+"x@    c #110203",
+"y@    c #AC4441",
+"z@    c #6B0A00",
+"A@    c #6B0500",
+"B@    c #6B1000",
+"C@    c #6B0B00",
+"D@    c #795951",
+"E@    c #A58276",
+"F@    c #F26C63",
+"G@    c #C9A495",
+"H@    c #BD998C",
+"I@    c #AB887C",
+"J@    c #551815",
+"K@    c #6B0C00",
+"L@    c #6B0E00",
+"M@    c #6B1900",
+"N@    c #6B2900",
+"O@    c #6B2C00",
+"P@    c #63493E",
+"Q@    c #937367",
+"R@    c #AE8A7E",
+"S@    c #B99588",
+"T@    c #A17F73",
+"U@    c #4F1311",
+"V@    c #6B0700",
+"W@    c #6B2D00",
+"X@    c #6B5C00",
+"Y@    c #4A4629",
+"Z@    c #89815E",
+"`@    c #A29474",
+" #    c #F16B62",
+".#    c #F36D63",
+"+#    c #C29E8F",
+"@#    c #563833",
+"##    c #6B2A00",
+"$#    c #6B6700",
+"%#    c #72783C",
+"&#    c #7E8A4D",
+"*#    c #95995A",
+"=#    c #F46E64",
+"-#    c #C29D8F",
+";#    c #85645C",
+">#    c #422522",
+",#    c #A33B3A",
+"'#    c #6B6500",
+")#    c #7C884A",
+"!#    c #6C9556",
+"~#    c #F16B61",
+"{#    c #CAB696",
+"]#    c #BC9B8A",
+"^#    c #9E7B70",
+"/#    c #430F0E",
+"(#    c #6B3200",
+"_#    c #928F51",
+":#    c #E9645B",
+"<#    c #F26D63",
+"[#    c #8FA667",
+"}#    c #ABA565",
+"|#    c #AD977D",
+"1#    c #8A6A60",
+"2#    c #5E3F3A",
+"3#    c #6B4400",
+"4#    c #A2A061",
+"5#    c #78A566",
+"6#    c #7AA667",
+"7#    c #859759",
+"8#    c #A09872",
+"9#    c #77614F",
+"0#    c #541714",
+"a#    c #6B4900",
+"b#    c #A8A565",
+"c#    c #87A465",
+"d#    c #769B5D",
+"e#    c #6D894C",
+"f#    c #727438",
+"g#    c #554B32",
+"h#    c #6B1200",
+"i#    c #370A09",
+"j#    c #6B4700",
+"k#    c #9E985A",
+"l#    c #828C4F",
+"m#    c #6E7C40",
+"n#    c #575C23",
+"o#    c #6B6600",
+"p#    c #6B3000",
+"q#    c #6B5400",
+"r#    c #6B6000",
+"s#    c #6B5D00",
+"t#    c #6B4300",
+"u#    c #6B1E00",
+"v#    c #190407",
+"w#    c #6B1100",
+"x#    c #625F5A",
+"y#    c #8B857D",
+"z#    c #494845",
+"A#    c #847F78",
+"B#    c #A49D93",
+"C#    c #C1B8AC",
+"D#    c #858078",
+"E#    c #A49D94",
+"F#    c #F56E64",
+"G#    c #7A766F",
+"H#    c #E8625A",
+"I#    c #F56F65",
+"J#    c #D9CEC0",
+"K#    c #E0D6C7",
+"L#    c #6C6863",
+"M#    c #B6AEA3",
+"N#    c #EF6A60",
+"O#    c #DDD3C4",
+"P#    c #514F4D",
+"Q#    c #B0A89D",
+"R#    c #E35E56",
+"S#    c #CCC3B5",
+"T#    c #BAB2A7",
+"U#    c #7C7771",
+"V#    c #DD5951",
+"W#    c #DAD1C2",
+"X#    c #CEC5B7",
+"Y#    c #C5BCAF",
+"Z#    c #807B75",
+"`#    c #979188",
+" $    c #BCB4A8",
+".$    c #E56057",
+"+$    c #D8CEBF",
+"@$    c #D6CCBE",
+"#$    c #CFC5B7",
+"$$    c #8C867F",
+"%$    c #403F3E",
+"&$    c #080100",
+"*$    c #7F7A74",
+"=$    c #A9A198",
+"-$    c #D7CDBE",
+";$    c #D2C9BB",
+">$    c #CDC4B7",
+",$    c #B7AFA4",
+"'$    c #989289",
+")$    c #5C5A56",
+"!$    c #484645",
+"~$    c #D5CBBD",
+"{$    c #D2C8BA",
+"]$    c #C4BBAE",
+"^$    c #B8AFA4",
+"/$    c #A09990",
+"($    c #79756F",
+"_$    c #0A0301",
+":$    c #6E6A65",
+"<$    c #D3CABB",
+"[$    c #D5CABD",
+"}$    c #BDB4A9",
+"|$    c #A8A198",
+"1$    c #88827B",
+"2$    c #434140",
+"3$    c #4C1711",
+"4$    c #AAA398",
+"5$    c #C6BCAF",
+"6$    c #DED4C5",
+"7$    c #D6CBBD",
+"8$    c #75716B",
+"9$    c #C8BFB1",
+"0$    c #D9CFC1",
+"a$    c #DACFC0",
+"b$    c #CAC1B4",
+"c$    c #A8A197",
+"d$    c #79746E",
+"e$    c #817C75",
+"f$    c #B1A99E",
+"g$    c #C9BFB3",
+"h$    c #F36E64",
+"i$    c #E0D6C6",
+"j$    c #CDC3B6",
+"k$    c #A7A096",
+"l$    c #7D7972",
+"m$    c #0B0403",
+"n$    c #847F77",
+"o$    c #ACA59A",
+"p$    c #F97368",
+"q$    c #DFD4C5",
+"r$    c #ABA399",
+"s$    c #363535",
+"t$    c #4F4D4A",
+"u$    c #868179",
+"v$    c #A8A196",
+"w$    c #F67066",
+"x$    c #D8CDBF",
+"y$    c #23211F",
+"z$    c #5B5955",
+"A$    c #65615D",
+"B$    c #77736D",
+"C$    c #7C7871",
+"D$    c #A59E94",
+"E$    c #C6BDB1",
+"F$    c #D5CBBE",
+"G$    c #DFD5C6",
+"H$    c #E6DBCC",
+"I$    c #807B74",
+"J$    c #5B5854",
+"K$    c #7D7872",
+"L$    c #87817A",
+"M$    c #8A847D",
+"N$    c #63605B",
+"O$    c #9B958C",
+"P$    c #DED2C4",
+"Q$    c #F77167",
+"R$    c #BDB5A9",
+"S$    c #969087",
+"T$    c #65625D",
+"U$    c #4E4C4A",
+"V$    c #7E7973",
+"W$    c #8F8982",
+"X$    c #9F988E",
+"Y$    c #42413F",
+"Z$    c #8D8880",
+"`$    c #E2D7C8",
+" %    c #C8BFB2",
+".%    c #B4ACA0",
+"+%    c #8E8880",
+"@%    c #67635E",
+"#%    c #4E4C49",
+"$%    c #7B7770",
+"%%    c #8C877F",
+"&%    c #9B948C",
+"*%    c #9A938A",
+"=%    c #958F86",
+"-%    c #D34F47",
+";%    c #D1C8BA",
+">%    c #DCD2C4",
+",%    c #D4CABD",
+"'%    c #B0A79D",
+")%    c #8D877F",
+"!%    c #6B6762",
+"~%    c #686560",
+"{%    c #857F78",
+"]%    c #969088",
+"^%    c #A39B91",
+"/%    c #ADA59A",
+"(%    c #CB4741",
+"_%    c #D04C45",
+":%    c #514F4C",
+"<%    c #8F8A82",
+"[%    c #C4BCAF",
+"}%    c #D6CDBE",
+"|%    c #DFD4C6",
+"1%    c #DBD0C2",
+"2%    c #D0C7B9",
+"3%    c #B5ADA2",
+"4%    c #7C7872",
+"5%    c #504E4B",
+"6%    c #595753",
+"7%    c #817D75",
+"8%    c #9E978E",
+"9%    c #AEA69B",
+"0%    c #BAB2A6",
+"a%    c #D14D46",
+"b%    c #CD4942",
+"c%    c #ACA49A",
+"d%    c #B8B0A4",
+"e%    c #CCC3B6",
+"f%    c #D7CEBF",
+"g%    c #E0D5C6",
+"h%    c #CEC4B7",
+"i%    c #BEB5A9",
+"j%    c #999389",
+"k%    c #726E69",
+"l%    c #595653",
+"m%    c #4F4D4B",
+"n%    c #54514E",
+"o%    c #5C5956",
+"p%    c #716D67",
+"q%    c #908B83",
+"r%    c #9B948B",
+"s%    c #AEA69C",
+"t%    c #D24E47",
+"u%    c #D45049",
+"v%    c #CE4A44",
+"w%    c #B0A99D",
+"x%    c #9D978D",
+"y%    c #A79F96",
+"z%    c #D0C6B9",
+"A%    c #DDD2C4",
+"B%    c #CFC5B8",
+"C%    c #BCB3A8",
+"D%    c #A79F95",
+"E%    c #928D84",
+"F%    c #938E85",
+"G%    c #8F8981",
+"H%    c #908B82",
+"I%    c #948E85",
+"J%    c #A29B92",
+"K%    c #B0A99E",
+"L%    c #BBB3A8",
+"M%    c #DA554E",
+"N%    c #D9554E",
+"O%    c #BDB4A8",
+"P%    c #9C958C",
+"Q%    c #53514E",
+"R%    c #CDC4B6",
+"S%    c #D2C8BB",
+"T%    c #D4CBBC",
+"U%    c #C6BCB0",
+"V%    c #BFB6AA",
+"W%    c #BAB1A6",
+"X%    c #B6AEA2",
+"Y%    c #BCB3A7",
+"Z%    c #CF4C45",
+"`%    c #D7534B",
+" &    c #DB574F",
+".&    c #C2B9AD",
+"+&    c #B5AEA2",
+"@&    c #9A938B",
+"#&    c #B7AFA3",
+"$&    c #F36C63",
+"%&    c #F46D64",
+"&&    c #DED3C5",
+"*&    c #C7BFB2",
+"=&    c #E35F56",
+"-&    c #E45F56",
+";&    c #E05C53",
+">&    c #938C84",
+",&    c #837E76",
+"'&    c #120304",
+")&    c #BBB2A6",
+"!&    c #EA645B",
+"~&    c #E25D54",
+"{&    c #E35E55",
+"]&    c #E05B53",
+"^&    c #CAC1B3",
+"/&    c #BBB3A6",
+"(&    c #ACA499",
+"_&    c #928B83",
+":&    c #7E7972",
+"<&    c #555350",
+"[&    c #78746E",
+"}&    c #979088",
+"|&    c #A9A298",
+"1&    c #C7BDB0",
+"2&    c #D2C9BA",
+"3&    c #D1C8B9",
+"4&    c #CFC6B8",
+"5&    c #CCC2B5",
+"6&    c #CBC2B4",
+"7&    c #ADA59B",
+"8&    c #989189",
+"9&    c #67645F",
+"0&    c #B9B0A5",
+"a&    c #C2B8AC",
+"b&    c #CDC3B5",
+"c&    c #D2C7BA",
+"d&    c #D5CCBD",
+"e&    c #DDD2C3",
+"f&    c #C8BEB2",
+"g&    c #8A857D",
+"h&    c #827E77",
+"i&    c #6A6661",
+"j&    c #421410",
+"k&    c #3B3A39",
+"l&    c #6C6963",
+"m&    c #918C83",
+"n&    c #B4ACA1",
+"o&    c #B8AFA3",
+"p&    c #827D76",
+"q&    c #3F110C",
+"r&    c #9E978D",
+"s&    c #AEA79B",
+"t&    c #B2AB9F",
+"u&    c #AAA297",
+"v&    c #A9A196",
+"w&    c #948E86",
+"x&    c #8F8A81",
+"y&    c #75706B",
+"z&    c #5D5A57",
+"A&    c #736F69",
+"B&    c #87827A",
+"C&    c #928C84",
+"D&    c #968F87",
+"E&    c #958E86",
+"F&    c #8C877E",
+"G&    c #87827B",
+"H&    c #7F7A73",
+"I&    c #7E7A73",
+"J&    c #454342",
+"K&    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+-+-+-+@+.+@+.+++.+W.P.O.F.M.s.;+;+< Q.| @.1 j & y.y.u.. u.3 L L / ' >+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< ,+j - l '+y )+r.G.O.P.#+.+-+-+@+!+@+!+~+{+-+{+-+-+@+.+@+@+.+P.O.F.M.q.i.;+h.X.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+@+=+-+{+~+^+{+{+{+{+!+{+~+-+{+-+@+.+.+P.O.F.M.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P..+.+-+!+~+^+{+^+^+/+(+(+{+^+^+{+{+{+-+-+@+=+.+P.O.F.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 ,+k.v ' ^.d.m Q B.D.F.N.O.W..+=+=+~+{+^+(+_+(+:+<+[+}+|+|+1+2+3+{+~+-+@+.+++P.O.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.N.W.W.@+-+!+{+/+(+/+/+_+4+5+6+7+8+|+|+9+0+a+b+{+{+@+=+.+++P.P.G.s.;+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.F.P.W..+.+-+c+d+d+/+_+(+e+4+4+5+f+g+h+|+i+j+k+l+m+^+{+-+-+=+W.F.N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e n+o+o.n L.h.i.F.N.P.++-+@+c+c+c+c+c+5+5+5+p+p+p+q+r+s+|+t+u+0+v+q+^+{+{+-+=+.+O.O.F.q.i.h.X.| e % j & N . * L ' / / , , > M M # : m 9.~.o+5 u 0.0                       ",
+"                      b / & N n+w+F K.x+y+] M.F.E.W.++@+c+c+c+c+c+c+c+p+5+z+z+z+p+A+B+|+C+D+E+F+q+(+^+{+@+-+W.++O.F.i.{ k.Q.~ @.1 ].@ y.R.$ a a L ).> M , b b b M - R G+0 H+u $+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.#+c+c+c+c+c+c+c+c+c+c+d+5+I+z+I+J+K+L+|+M+N+O+q+(+{+^+!+@+.+W.O.O.F.i.{ } ~ v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.x+< { s.G.O.E.c+c+c+c+c+c+c+c+c+c+c+c+P+z+z+z+z+Q+R+|+S+T+U+q+_+(+^+~+-+=+.+P.E.F.s.{ h.[ | f j & @ . u.3 ! a > > , , M O # # A V+6.G+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.;+q.F.O.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+I+I+W+X+Y+|+Z+`+ @.@+@_+/+@@@@@@@@@@@@@@@@j.k.X.@@@@@@@@@@@@$ a ).! @@@@@@; M b M @@@@@@w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W+I+#@O+$@|+%@&@*@q+(+^+{+@@@@@@@@@@@@G.;+P Q.@@@@@@@@@@@@@@L L / @@@@@@B ; M O @@@@@@M +.o `.u u w.=@0                 ",
+"                , = b L s +.9 9 7 g [ t.i.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W+-@;@h+|+>@,@'@)@(+(+{+!+=+@@@@O.i.G.;+k.Q.@@@@j % @ @@@@! 3 L @@@@@@@@; b @@@@@@@@A V+G+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.c+c+c+c+c+c+c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+!@~@{@|+%@,@]@q+_+/+{+{+-+@@@@O.N.i.] t.Q.@@@@f j y.@@@@3 3 / @@@@@@@@@@@@@@@@@@@@O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.'+<.r c+c+c+c+c+c+c+c+c+c+d+d+d+c+c+d+P+c+c+c+c+c+c+c+^@/@(@|+_@:@<@q+(+(+{+!+-+@@@@P.F.s.] t.X.@@@@f j N @@@@! $ ! @@@@B @@@@@@@@O @@@@A ^ H+'.l ..6 U o +.              ",
+"              > 6 b > 5 [@o.9 0.1 c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+}@|@d+c+c+d+c+c+1@2@3@|+4@5@6@q+(+/+^+!+@+@@@@O.N.i.;+k.Q.@@@@@@@@@@@@@@3 L / @@@@, M @@@@M b @@@@b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+d+c+c+c+c+c+7@8@9@|+0@a@b@q+(+^+{+!+-+@@@@P.F.q.] t.X.@@@@@@@@@@@@R.3 3 * @@@@, , M b M O @@@@M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ c+c+c+c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c@d@e@|+%@f@<@q+/+(+{+-+.+@@@@F.M.i.{ < Q.@@@@e @@@@R.. 3 3 ' @@@@B M M ; ; b @@@@b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E '+& f Y.Q.c+c+c+c+d+|@}@c+c+c+c+c+c+c+c+d+}@}@d+d+c+c+g@h@i@|+j@k@l@m@q+/+{+-+-+=+@@@@O.G.i.{ P X.@@@@e @@@@@@$ ! 3 L @@@@, , M O ; A @@@@b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.H+..>.L.j j v } k.c+c+c+c+|@n@}@c+c+c+c+c+c+c+d+|@o@p@|@c+c+q@r@s@|+t@u@v@q+_+^+^+{+-+=+@@@@F.i.] t.< [ @@@@& % @@@@@@a a ' @@@@B M O M M b @@@@M # M b U E I.>.w@x@x@            ",
+"          ].y@= ( u C d.'+T N @ f v [ } j.c+c+c+d+z@z@A@d+c+c+c+c+c+c+P+o@B@C@}@c+D@E@F@|+G@H@I@q+^+^+-+-+@@@@@@@@@@@@] t.Q.~ @@@@j y.+ @@@@* a / @@@@, , b # ; M @@@@b O # O H+p W =.Y X w@x           ",
+"          $ n H V =@u _ '+J@N N ].@.[ P h.] c+c+d+|@K@L@p@P+c+c+c+c+c+c+n@M@N@O@P@Q@R@F@|+G@S@T@q+c+c+!+@@@@@@@@@@@@@@@@k.Q.r @@@@].& R.@@@@! > ).@@@@B M , b M O @@@@M O O O : U.n.U ~.,.n.D           ",
+"          / b * l U@X &.-.p j + % @.,+< k.i.r.c+P+P+A@p@o@A@d+c+c+c+c+c+V@W@X@Y@Z@`@ #.#|++#s@r@@#c+c+c+-+#+W.O.E.i.;+h.< | ~ 1 j ].& . u.3 3 * )., , , M M O O O b O b M M b w D D 0 A.E U@o           ",
+"          > ! < < e H+J.&.` N u.& 1 [ X.} { ;+q.c+d+d+P+P+d+c+c+c+c+c+c+d+##$#%#&#*#C+=#|+-#R@;#>#d+c+c+c+P.N.F.i.] { { | [ @.% ].& d R.. a ! * / > B B # ; b b O M O M b b O b o.T.,#w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.c+c+d+d+d+d+c+c+c+c+c+d+B@'#)#!#~#=#|+{#]#^#D@c+c+d+c+c+c+N.F.s.] k.< [ v e j % @ + u.$ a ! > / , , B O ; B M O b O O O O O b ..$+0.z n./#J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 | [ X.t.;+;+M.c+c+d+d+}@P+c+c+d+d+c+|@(#_#:#<#|+[#}#|#1#2#c+c+d+d+d+c+d+r.;+{ P [ ~ @.f & & y.. $ 3 * / / B B M ; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @.~ X.< i.i.] M.c+c+c+d+}@d+c+c+c+c+c+V@3#4#|+5#6#7#8#9#d+c+c+c+d+d+c+c+d+i.k.Q.| e 1 e @ N y.R.3 3 3 L / > B B b O # O b O b ^ M b A # b `.k 0.U E G w@          ",
+"          ( @.1 ).: 4 z =@0##.$ + @ f e 1 ,+} < h.;+q.M.c+c+c+c+d+c+c+c+c+c+c+A@a#b#c#d#e#f#g#h#c+c+c+d+d+c+c+c+d+h.[ ~ @.f @ & @ . $ 3 ! * > > , , , , b b M M O M b b # b O O ~...c.`.o q i#          ",
+"          - 1 $ b # w o.n.J@#.L u.y.& H.1 ~ [ < t.{ i.s.M.c+c+d+d+d+c+c+d+d+c+c+}@j#k#l#m#n#o#N@A@c+c+c+d+d+c+c+d+d+,+r f j ].@ N R.$ a ! ! / B B M M M B O O b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 J@$ L . + y.].H.1 ,+| < t.{ i.] q.M.d+P+}@d+c+P+|@}@c+c+A@p#q#r#s#t#u#|@c+c+c+c+c+c+c+c+P+|@H.j ].N y.R.$ a )./ / B , , , O # O b O M O A M O A M O ^ ~.$+0.U n.i#v#          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v ,+[ < t.j.;+i.s.s.P+P+d+d+P+|@A@}@c+c+P+K@w#B@z@d+c+c+c+c+c+c+c+c+c+c+c+d+& % N . R.L L 3 * / > M B ; M # ; b O b # ^ b # O b M a.'.~.!.G+w@X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v ,+[ } h.t.{ i.x#y#P+d+c+P+A@A@}@d+c+c+P+}@|@}@d+c+c+c+d+c+c+c+c+c+c+c+c+c+& + u.3 3 ! L / > B , , M b b A M O M b b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.G+8 2.' ' u.u.d @ ].].j 1 e | ,+} P z#A#B#C#P+d+d+|@}@d+c+c+c+}@}@d+c+c+c+c+d+d+d+c+c+c+c+c+c+c+c+d+. $ ! L ' > / , B M b , M O O b O M M A M b # b ^ ,#I.o.>.q 7.X v#          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } D#E#~#F#|+d+c+d+}@d+c+c+c+d+|@}@c+c+c+d+}@|@P+c+c+c+c+c+c+c+d+d+d+j ].+ R.R.3 L , > ; A ; b O M O O O O O M M ; b 0 x.'.E U@i#Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.@ ].].j 1 1 @.G#<@H#I#|+J#K#c+c+c+c+c+c+c+c+d+|@P+c+c+c+P+}@P+d+c+c+c+c+c+c+d+}@d+d+d+L / B > > a * , O ; b O b O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d V+9.o x.4.B > / L L $ . d @ & ].& e L#<+M#N#|+`+K#O#0+c+c+c+c+c+c+c+c+d+c+c+c+c+c+c+c+c+c+c+c+c+d+c+c+P+}@d+c+d+)., , , A B 3 > A M O M b b ; b O ; O # b [@Z.o J@w@i#X w@          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & P##@Q#R#|+`+>@M+4@S#T#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+P+d+c+d+d+! / > B B ; # O b / / b O M M A M b M b # B # _ E o.n.-.i#Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.U#]@V#|+9+9+W#4@X#Y#a+Z#c+c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+d+c+3 3 ' > , , M O M # M B * M O O O O M O ; M O : ~.G+>.n.J.7.v#9           ",
+"          3 2 u.M 0.+.$+_ D o.b.M / / ' ! 3 L $ u.. x#`# $.$|+J#+$@$#$Y#/@$$%$1 c+c+d+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+d+3 L L / > > b M b M b O O , , O b O O b M b , A : 0  .T 8 w@v#&$U           ",
+"            c = 2 ]+U H+_ A.t C ; > > / * L ! L ! u.*$=$ @L+|+-$;$>$Y#,$'$)$j & ].c+d+P+d+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+L * * > / )./ / / b ; O # O O b * b ; b O M O B b s H+T.7 n.-.J &$Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! !$A+T#X#N#|+~${$]$^$/$($& % & & % d+n@|@d+c+c+c+c+c+c+c+c+c+c+c+c+c+a ' / , B > > > > , M b A b M M A > > M b # b ; B : z.T.F z 0#` Z _$7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * :$6@]$<$=#|++$[$}$|$1$2$@ @ d d + N d+P+d+c+c+c+c+P+c+c+c+d+c+c+c+3 ' / B B , , , , , B ^ # O M b O O O ).# M M ; M # C ,#9.,.E m.7.Z x@3$            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ($4$5$4@=#|+6$7$O+=$8$R.. R.. R.R.R.. R.c+c+c+c+c+P+P+c+c+d+d+3 3 * )., , B M M B > , B A b O O O b O O B , b M M M O 5 0 I.o 9 m.&.x@Y               ",
+"              [@/.U I.'.D c.m 8.o.M O M B B , B > U#Q#9$0$.#|+a$}+b$c$d$3 u.$ u.$ $ $ u.$ ! c+c+c+c+c+|@d+c+d+/ ! ' > / B B M # # , , > , O # O M b # M O ; L ; # , # : d.Z.E T 9 n.J _$J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > e$f$g$-$h$|+i$T+j$k$l$L u.L 3 a u.L a a * 3 d+d+d+c+d+|@c+> , / a > / , , M M B B , B B A b O M A b b A O 3 M M M M b.c.9 n.J@V w@v#m$-.              ",
+"                m ]+F A.t -.w@-.w@x.M M # # B , , n$o$s+E+T+|+p$q$0+r$A#' * ! 3 L / ' * ).' ' ).}@P+d+c+. , , B > B / > B M , ; , s$t$, ; O M b O O O M # # ! O , ; O w 8 8.9 J@w@X &$v#                ",
+"                [@>.7.v#=.V /.'.9 q s A A O O M B u$v$F+@$J#w$|+S+x$v+l+y$* / > 3 / > > / / > > > A@A@B u.B , , B )./ > , B B z$A$B$n$B b O M O b # O b M b u.M M ; b >+S m.9 J.i#v#&$*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O C$D$E$F$G$h$|+H$T+:@k+I$/ > ).> )./ / ).> , , , , , B . , B M ; b B , > J$6+K$L$M$A+b # O O b # A M B b B u., , M M 7 p K x@m$v#_$&$9                 ",
+"                  0.l o+( / : k z T V 6 M b , # b N$O$B+;$O#P$Q$|+G$E+R$S$T$, , B > > , , > B B B B , M ! b b # M O O U$d$8$V$e$W$b@X$A b O M A b b # ; ; M $ B B M ^.;.x.~.0#Y &$&$v#                  ",
+"                    +.x z.c k $+~.G+p  .5 O A b M Y$Z$,$2+0$`$h$|+S+@$ %.%+%@%B , , , B B , , , B # O # L , B b # #%@%$%%%&%*%f+=%-%|+O M b O O ; ; O M B / 3 , , ^ Z.V 8.o.9 *.x@&$                    ",
+"                    0 ~...9.7 F T.=@p 9 '+O M O b O U#<@}$;%6$>%$@|+O#,%f@'%)%!%M M # # M M M b M M b # > , M M ~%{%]%^%/%Q#c$(%|+|+_%# M O b M M M # B B ).).M A A.;.9 G+n.&.v#&$J                     ",
+"                      F I.8 8 9 9 J.J@T z z C O M b :%<%f$[%}%|%N#|+1%~$2%f@3%&%4%5%M b O O O ; # b B b B > 6%7%8%c$9%.%0%a%|+|+b%v$c%A O b ; O O b B , , ).M C ]+J.J.9 p I x@&$x@                      ",
+"                      u n.3$q m.G+o.I.8 p T y@C M O b 8$6@d%e%f%g%.#|+`+~$h% %i%r$j%D#$%k%N$l%m%n%o%~%p%8$q%r%B#s%^$Y+t%u%|+v%w%*@x%y%O M M b , B , M > ) ) 5 n V 9 9 U@I Z _$&$7.                      ",
+"                        ,.w@w@8 n e.T.J.8.Z.7 f.w O # # f+k$C#z%D+A%|+Q$D+4@0+B%5@C%Q#D%6@O$E%F%G%H%I%O$J%v$K%L%C%M%N%|+|+O%;@7+*@=%P%M # O B M , B , M ^.3.m 0#E 7 9 K Z &$&$v#                        ",
+"                        H+G+n.o k 4 z J.F m U ]+o+z.A ^ Q%`#7+E$R%S%@$|+I#M+>%4@T%~${$U%V%0%W%^$~@X%X%d%Y% $Z%`% & &|+.&Y%T#+&9%@&f+f+# b ; , M , B ' ^.z.o.n.Z.l A.3$Z v#x@v#q                         ",
+"                          ..G+8 U u I.=@k 2 u U R m - b M !@l+#&f@,@h%|+|+$&%&F@C+&&&&0@~$S%#$]$*&l@=&-&;&|+|+|+|+|+&@V%d%X%k+9%>&,&-@M > B B , A ^.^.c ~.=@o.U m z w@'&x@x@`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.'+C b # B$r%f$)&C#b$0+|+|+|+|+I#=#.# #9@!&~&{&|+|+|+|+]&X#X#h%^&B+/&.%(&l+_&:&!%<&B , , B B M ^.u S R l 0.$+o.q X _$Z J                             ",
+"                              9.T p -.W 9.y@C 5 n E S ]+A A b [&}&|&/@Y%1&X#;%2&J#|+|+|+|+|+|+|+|+|+0+3&4&h%j$5&6&1&V%7&.@8&M$G#5%, B , M M ^ ' b.~.J.x.m $+..~.G I &$&$Y                               ",
+"                                o J./#&.p u C s _ o.S J.S 5 O ^ 9&>&]@/%k+0&a& @b&c&d&T+e&T+2%6&a@e%2+f&,@&@B+f@Y+v+|&Q+g&h&i&m+M , B , , n+A ^./.j&E n m w.A.T *.&$&$x@                                ",
+"                                0.8 w@i#/#U d.( [@I.J.T W 8.Z.C : k&l&m&l+|&n&~@W%]$:@j$z%j+,@V%.&f@V%Y%v+o&M#c$.@*%H%p&~%/ / ! a * ) ' B n+z.%.-.J.T.6 A.9.8 7.Z x@x@q&                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ t$D#r&6@'@a+s&#&0&)&t&o$Q#4$u&v&P%@&w&f+x&y&)@B B > , B > ).> > V+..U@m.W 0#..6 ~.V K x@'&Z i#                                  ",
+"                                    `.m.X *.i#8 >.J@n.=.V : 0 U >.n.0.d.C : z&p%8$A&[&B&C&D&E&E%G%F&G&H&I&d$:$)@J&, B , , > B > / ' M b.m.V R J.q 7 U =@W J Z x@Z w@                                    ",
+"                                      ..n.` v#7.q H w@m$u B 4 5 0.~.E V k y@b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.=@=@>.W I v#&$x@Y H                                       ",
+"                                          9 7.v#&.&.Z v#^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , '+Z.p z w@9 n G+-.W 7.v#&$&$x@Z                                           ",
+"                                            >.*.I J m$7...[@z._ ( O w _ 0.~.I.8 0#-.]+]+l y@^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 i#F q i#I Z &$&$&$X                                             ",
+"                                              o 7.v#&$q&J@E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.Z.o o.l /.f._ 6 H+l J J.7.J x@&$_$&$I                                               ",
+"                                                l q&x@*.7.q 9 T.!.u 0.y@C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k [@H+z.n 9.~.T.Z Z '&x@v#x@Z `                                                 ",
+"                                                    n.w@K ` q&-.0#=@E n y@( y@0.o.9.9.'.>.R I.U F o.o.$+k k u [@o+D +./.2 x u +.=@0#J.&._$_$x@v#Z K                                                     ",
+"                                                        p &.J J 7.w@U@n. .U U z >.G+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U G+K&q&K Z _$&$x@&$J                                                         ",
+"                                                            J.I v#X J *.w@q U@w@w@W q =@G+=@>.o 8 ~.w.U U D k ..o.8.8.T 0#-.7.J v#Z '&&$&$J                                                             ",
+"                                                                G K v#v#X X J v#I J =.&.&.w@p G /#q&w@H 0#n.n.G q w@&.I X v#x@x@&$x@v#X                                                                 ",
+"                                                                    >.j&=.v#'&x@&$x@x@v#Z =.K J v#v#Z J I =.v#Z Y v#v#'&x@x@x@x@J w@                                                                    ",
+"                                                                          8 /#*.Z _$&$x@x@Z m$&$m$m$m$'&v#Y &$Z x@x@Z x@X I w@                                                                          ",
+"                                                                                  8 -.&.*.X Z x@m$x@'&'&x@'&v#X ` w@-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.bmp
new file mode 100644 (file)
index 0000000..ec1b487
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ListPatient_Voi.xpm
new file mode 100644 (file)
index 0000000..5545faa
--- /dev/null
@@ -0,0 +1,358 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_ListPatient_Voi_xpm[] = {
+"100 100 255 2",
+"      c #000100",
+".     c #090200",
+"+     c #08040A",
+"@     c #160304",
+"#     c #1A001A",
+"$     c #0C0A14",
+"%     c #1F0503",
+"&     c #0F110C",
+"*     c #260708",
+"=     c #10101F",
+"-     c #00019C",
+";     c #330404",
+">     c #2D002A",
+",     c #400000",
+"'     c #310B0B",
+")     c #171917",
+"!     c #530000",
+"~     c #1D1C00",
+"{     c #1A182E",
+"]     c #600000",
+"^     c #3E0F0F",
+"/     c #191C38",
+"(     c #4A0147",
+"_     c #6B0002",
+":     c #580037",
+"<     c #6D0000",
+"[     c #232138",
+"}     c #481616",
+"|     c #2A2710",
+"1     c #232341",
+"2     c #800000",
+"3     c #511516",
+"4     c #2C2D01",
+"5     c #282927",
+"6     c #431743",
+"7     c #8D0000",
+"8     c #342433",
+"9     c #940001",
+"0     c #5B1A1A",
+"a     c #6F006F",
+"b     c #2A2A4D",
+"c     c #980100",
+"d     c #7C0059",
+"e     c #A50000",
+"f     c #383800",
+"g     c #681C1A",
+"h     c #333432",
+"i     c #323154",
+"j     c #AF0200",
+"k     c #2827AB",
+"l     c #6C2600",
+"m     c #6B2121",
+"n     c #B80000",
+"o     c #880085",
+"p     c #32345C",
+"q     c #443245",
+"r     c #343565",
+"s     c #C50000",
+"t     c #782324",
+"u     c #732726",
+"v     c #464500",
+"w     c #D00000",
+"x     c #A00576",
+"y     c #40423F",
+"z     c #3C3D68",
+"A     c #DA0001",
+"B     c #6B3900",
+"C     c #E40000",
+"D     c #7F2C2B",
+"E     c #3E4075",
+"F     c #683938",
+"G     c #4D4B28",
+"H     c #F00000",
+"I     c #424472",
+"J     c #F70000",
+"K     c #434481",
+"L     c #633A65",
+"M     c #8C2F31",
+"N     c #873232",
+"O     c #504A49",
+"P     c #9A159C",
+"Q     c #C60099",
+"R     c #FF0000",
+"S     c #585800",
+"T     c #494A79",
+"U     c #624C34",
+"V     c #9D246B",
+"W     c #4F524E",
+"X     c #674845",
+"Y     c #4A4C83",
+"Z     c #923737",
+"`     c #4E4F8F",
+" .    c #3B693E",
+"..    c #A9229A",
+"+.    c #376666",
+"@.    c #4E519C",
+"#.    c #9B3C3C",
+"$.    c #A13B3E",
+"%.    c #676500",
+"&.    c #9A2F9A",
+"*.    c #CB3400",
+"=.    c #52559F",
+"-.    c #993497",
+";.    c #5158AD",
+">.    c #5757A8",
+",.    c #5F5F68",
+"'.    c #665F5E",
+").    c #973D97",
+"!.    c #A34747",
+"~.    c #AE4343",
+"{.    c #5C5D9D",
+"].    c #646663",
+"^.    c #815574",
+"/.    c #5F5BB4",
+"(.    c #737500",
+"_.    c #5A60B6",
+":.    c #706E35",
+"<.    c #5C5FBD",
+"[.    c #984A98",
+"}.    c #81615C",
+"|.    c #686598",
+"1.    c #6065BC",
+"2.    c #6D706B",
+"3.    c #965494",
+"4.    c #6864BE",
+"5.    c #C54B49",
+"6.    c #6F7458",
+"7.    c #BE4E4E",
+"8.    c #CD4940",
+"9.    c #77706B",
+"0.    c #C64D50",
+"a.    c #996567",
+"b.    c #848400",
+"c.    c #696DC5",
+"d.    c #A16170",
+"e.    c #C85554",
+"f.    c #CD5355",
+"g.    c #D75349",
+"h.    c #CE6503",
+"i.    c #96669B",
+"j.    c #7275BB",
+"k.    c #C45E5E",
+"l.    c #876EB0",
+"m.    c #7174CD",
+"n.    c #CE5B59",
+"o.    c #7575C2",
+"p.    c #CD5B5E",
+"q.    c #7476CA",
+"r.    c #908F00",
+"s.    c #857F78",
+"t.    c #828184",
+"u.    c #D55F5E",
+"v.    c #8D8072",
+"w.    c #9E709D",
+"x.    c #D46164",
+"y.    c #659967",
+"z.    c #7A7DC4",
+"A.    c #797BD5",
+"B.    c #C164A5",
+"C.    c #7E7ED3",
+"D.    c #D26867",
+"E.    c #7E80CD",
+"F.    c #A57D78",
+"G.    c #989A00",
+"H.    c #6C9593",
+"I.    c #FE6700",
+"J.    c #8D8F64",
+"K.    c #9F7F91",
+"L.    c #DC686B",
+"M.    c #8C9556",
+"N.    c #9E8968",
+"O.    c #799E5E",
+"P.    c #B58067",
+"Q.    c #8385DA",
+"R.    c #ED675F",
+"S.    c #DB6E6D",
+"T.    c #979089",
+"U.    c #A78A84",
+"V.    c #888ECF",
+"W.    c #DA7778",
+"X.    c #D07699",
+"Y.    c #E27473",
+"Z.    c #8C8ED6",
+"`.    c #A8A800",
+" +    c #E27579",
+".+    c #8A8EE3",
+"++    c #F66F66",
+"@+    c #A39A64",
+"#+    c #8E8FDE",
+"$+    c #979896",
+"%+    c #9394D6",
+"&+    c #BE9463",
+"*+    c #9599CE",
+"=+    c #E67F80",
+"-+    c #A19E99",
+";+    c #9798E8",
+">+    c #B6B500",
+",+    c #B39C97",
+"'+    c #ACA295",
+")+    c #BF9E87",
+"!+    c #EA8986",
+"~+    c #D69195",
+"{+    c #E5926A",
+"]+    c #D49B69",
+"^+    c #9E9FE8",
+"/+    c #CA9998",
+"(+    c #E88E8C",
+"_+    c #CD98CA",
+":+    c #C1C400",
+"<+    c #DD9F8A",
+"[+    c #FA986E",
+"}+    c #EE9796",
+"|+    c #AAAAF0",
+"1+    c #BBB1A5",
+"2+    c #BBB893",
+"3+    c #96CC98",
+"4+    c #F39F9E",
+"5+    c #B3B3F1",
+"6+    c #D1D100",
+"7+    c #FEA572",
+"8+    c #9BCCCC",
+"9+    c #D2B99D",
+"0+    c #F4A8A9",
+"a+    c #C8BDB1",
+"b+    c #C7C498",
+"c+    c #CDCB67",
+"d+    c #BABBF5",
+"e+    c #DDDC00",
+"f+    c #FFCC06",
+"g+    c #F6B2B0",
+"h+    c #D0CC96",
+"i+    c #D2C7BA",
+"j+    c #E5E300",
+"k+    c #C6C5F7",
+"l+    c #F7BABC",
+"m+    c #E8E500",
+"n+    c #CED0CC",
+"o+    c #CDCDF8",
+"p+    c #DCD1C4",
+"q+    c #FBC4C4",
+"r+    c #FECD97",
+"s+    c #D6D5FA",
+"t+    c #FBCFCF",
+"u+    c #FFCBFF",
+"v+    c #FBD5D6",
+"w+    c #E2DFF0",
+"x+    c #FFFF01",
+"y+    c #E0E1FB",
+"z+    c #FBE1DF",
+"A+    c #EAEBFC",
+"B+    c #FFFE7A",
+"C+    c #FFEAED",
+"D+    c #FCFF97",
+"E+    c #FFFECD",
+"F+    c #FEFFFC",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.x.L.L.0.x.L.S.f.~.7.~.f.e.f.p.f.f.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+p.x.L.=+!+(+!+=+x.0.p.x.f.5.0.0.~.0.~.7.x.L.p.f.0.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.p.p.f.S.=+!+=+=+=+Y.Y.n.#.0.f.0.~.5.$.5.$.#.n.n.~.u m m 0 $.p.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+L.L.f.5.!.$.7.L. +S.W.=+D.S.u.#.#.0.$.M M M ~.Z t 0 3 m M e. +7.t f.#.f.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+f.L.=+=+=+!+Y.0.!.u u N ~.7.p.e.0.Z m M t 0 3 } * * ' 0 ~.f.f.n.0.0.0 e.f.D.f.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.f.7.=+S.D. +=+!+S.S.u.~.N u 3 3 0 D u 3 0 } % @ % ' D #.0.!.N M M Z ~.m Z L.L.7.Z M M n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+L.u.Y.0.n.Y.e.L.W.S.x.k.e.~.~.#.Z N u } ^ ' ' * % * } 0 0 m m u m m 0 D ~.Z t 3 e.5.M $.$.#.N ~.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+L.L.x.L.S.#.D.p.n.p.D.7.7.$.!.Z !.!.W.a.!+W.W.k.a.k.k.k.k.k.!.!.!.k.!.7.u D u u D ' #.m m #.0.5.M #.#.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+L.L.=+L.x.0.M ~.~.~.~.~.$.#.#.!.W.~+}+(+(+(+(+(+!+(+(+(+(+(+W.W.W.W.D.u.W.p.D.7.N #.} 0 m 0 N 7.~.N N #.n.p.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.Y.!+!+u.n.N Z Z #.#.Z Z #.W.(+~+(+}+}+(+}+(+(+(+!+(+(+W.!+W.!+W.W.S.W.S.S.S.L.D.u.u.n.u N m M Z N M u $.u.n.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+L.Y.(+=+x.~.#.0 D u N N !.~+k.~+}+4+4+4+}+}+(+4+}+(+}+!+(+(+}+=+!+=+=+=+Y.Y.S.L.S.u.D.S.D.u.n.!.Z M D t D 5.L.f.L.u.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.f.=+=+=+S.5.M u 3 u u !.~+(+(+~+}+}+4+4+4+0+0+4+4+4+4+}+}+}+!+}+!+!+=+=+ + + +Y.S.S.u.S.u.x.x.n.u.k.#.D 0 u 7.S.x.x.u.e.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+D.p.x.x.L.u.e.Z D 3 0 F !.~+(+0+4+}+0+0+0+0+0+0+4+0+0+0+}+4+}+}+}+}+(+!+!+!+=+Y.Y.S. +S.S.u.D.S.u.x.u.f.p.N m D M ~.5.0.u.x.x.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.u.Y.Y.D.7.~.!.D u } u }+4+4+}+0+0+0+g+g+g+g+0+g+0+g+g+g+g+4+4+4+}+}+}+(+!+!+(+=+Y.S.S.L.Y.L.x.x.u.p.u.f.e.7.7.u t m M $.f.u.L.u.0.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+L.f.=+!+!+Y.~.Z M D } F ~+}+4+0+0+g+g+g+g+g+g+l+l+l+g+g+g+g+0+l+0+0+4+4+}+}+!+(+=+=+Y.Y.Y.S.S.u.u.u.x.u.n.n.n.f.p.~.u 0 g Z ~.L.x.0.~.7.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+x.=+=+=+ +Y.7.Z D u F }+}+4+0+g+g+g+l+l+l+q+l+l+q+l+q+g+l+g+g+g+g+g+0+4+4+}+}+(+!+(+=+=+ +L.Y.S.S.u.x.n.D.p.u.e.f.f.e.u m m #.0.f.5.f.f.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+p.L.=+=+D.D.e.!.N N W.!+}+4+0+0+g+g+g+l+q+g+q+q+q+q+q+g+q+l+l+q+q+g+g+g+0+4+4+}+}+(+!+=+=+=+Y.S.L.L.D.u.L.f.f.n.n.n.n.f.e.~.t D #.~.p.u.~.~.n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+u.S.Y.=+S.e.p.~.Z N ~+~+4+0+0+g+g+q+q+l+q+q+q+q+t+t+t+t+t+q+q+q+q+l+l+g+g+g+0+4+4+4+}+(+=+=+=+Y. +S.L.L.u.u.n.D.f.e.n.n.f.n.!.#.D D $.e.0.$.0.~.n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+p.u.Y.=+=+n.7.~.Z u W.(+].].}+0+g+G.G.G.q+q+v+v+t+t+t+t+t+v+v+t+q+q+q+l+q+g+g+g+0+4+4+(+}+!+!+Y.=+S.Y.S.L.x.x.x.f.p.p.f.e.n.e.8.5.#.M #.~.#.0.7.Z Z n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+L.0.=+!+=+S.7.!.Z N W.~+}+$+F+].$+g+G.F+F+G.G.t+v+v+z+t+t+t+v+t+v+t+t+t+q+q+g+g+g+g+4+0+}+}+!+(+W.=+W.Y.S.S.L.u.u.u.u.p.f.f.f.f.p.f.5.~.$.~.7.5.0.M M 0.n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+0.5.Y.=+D.k.!.Z N !.~+}+}+'.F+F+F+'.'.D+D+F+F+G.G.v+t+z+z+v+v+z+t+t+z+q+t+q+q+l+l+g+0+4+4+}+(+!+=+Y. + +Y.S.u.x.x.u.f.n.n.e.n.e.e.5.0.5.M M ~.~.$.#.Z #.n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+x.7.n. + +k.#.N Z !.~+(+4+4+].F+F+F+F+F+'.|.D+D+F+F+G.G.z+z+G.G.G.G.G.t+t+q+q+q+q+l+g+g+4+}+4+}+}+(+=+Y. +L.Y.S.D.x.n.u.p.f.f.f.f.n.e.e.5.e.Z M N #.~.#.#.$.n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+5.5.S.D.k.!.M u G.G.G.}+4+4+$+F+E+F+F+F+F+F+'.'.D+D+F+F+G.G.F+F+F+F+F+    v+t+q+q+g+l+0+0+4+4+!+=+=+=+W.Y.Y.u.L.u.u.x.f.u.u.n.n.e.f.5.5.5.e.~.u m $.~.#.M N n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+p.0. +S.5.$.M u N G.F+F+G.G.0+].F+F+E+F+E+F+F+F+F+'.|.D+D+F+F+D+D+r+D+D+r+c+  t+q+q+q+g+g+0+4+4+4+}+!+=+=+=+ +Y.L.L.u.D.f.n.p.f.f.e.n.f.e.5.5.5.5.g N !.Z M M Z n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+5.L.Y.n.Z t m g a.W.r.F+E+F+G.r.F+F+F+E+F+F+E+F+F+F+F+'.'.D+D+D+r+D+D+r+r+c+  v+t+q+l+l+g+g+0+0+4+}+!+(+=+Y.S.S.S.L.x.u.u.x.f.n.e.f.f.e.0.f.5.e.7.u u M #.Z N M n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+f.5.D.u.5.t 0 3 u =+Y.G.F+D+D+F+F+G.G.F+F+u+E+F+F+E+F+F+F+F+'.{.D+D+D+r+D+D+r+c+  v+t+q+q+l+0+0+4+}+}+!+=+=+=+Y. +S.D.D.p.f.u.p.f.n.e.f.e.5.f.5.0.0.5.0 u #.#.Z N u n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+L.7.n.p.f.Z m 0 m N =+!+G.F+D+D+D+D+F+E+G.G.F+F+E+F+F+E+F+F+F+F+F+'.,.D+D+r+r+r+c+  t+q+q+l+g+l+0+4+}+}+!+!+=+Y. +S.L.u.u.S.u.n.f.n.e.f.e.f.e.0.f.e.5.e.M t #.#.#.M g $.n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+f.0.5.n.7.M 0 0 u W.=+!+(+G.F+D+D+D+D+D+F+F+G.G.F+F+t+F+F+E+F+E+F+F+F+'.{.D+r+D+n+  t+t+q+q+g+g+0+4+!+}+!+=+=+Y.Y.S.Y.L.u.p.p.u.n.f.e.f.e.f.5.e.5.e.0.5.7.g N !.!.Z m M n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+5.7.~.5.5.D 0 m Z  +W.(+}+r.F+D+D+D+D+D+D+D+F+E+G.G.F+F+E+F+F+F+E+F+F+F+F+'.D+r++ z+v+t+q+q+l+0+g+4+4+!+}+!+=+=+S.Y.L.u.L.u.u.n.f.n.f.e.f.f.e.0.0.0.5.f.5.N D $.$.$.D u n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+u.5.f.0.#.5.D 0 u W. +Y.=+!+G.F+'.].d.h D+D+D+r+D+F+F+G.G.F+F+E+n+F+n+F+n+F+'.r+c+  t+t+t+q+q+l+g+0+0+4+}+(+!+=+Y.Y.Y.Y.D.L.u.p.x.p.n.f.e.f.f.5.f.0.0.0.e.0.~.D Z #.$.M t M n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+e.#.5.e.!.#.N m #.Y.=+=+!+}+G.].E+n+$++.+ r+D+D+D+D+r+F+E+G.G.F+F+n+F+n+F+F+y.r+c+  t+t+t+q+l+g+g+0+4+4+!+!+=+=+=+=+u.L.u.D.x.u.f.f.f.n.f.e.e.0.e.5.e.e.5.0.0.D N N #.t m u n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+0.!.$.f.#.D g m !.Y.=+=+=+!+'.F+F+F+n+$+L $ D+r+D+D+D+D+r+F+u+r.r.F+n+A+n+F+|.r+c+  v+q+q+q+q+l+g+0+0+4+}+}+!+=+Y.=+Y.L.u.L.u.n.u.u.f.e.f.f.e.5.e.0.5.0.e.0.5.t D N Z N t 0 n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+x.~.$.#.$.#.t F u k. +=+=+!+}+].n+F+F+w+$+'.+ D+D+r+D+r+D+D+D+r+F+E++ F+n+F+F+].r+c+  t+t+t+q+g+g+g+0+4+4+(+!+=+=+Y.S.Y.Y.S.u.L.u.u.p.e.n.e.e.e.0.f.5.0.e.5.0.7.$.u D #.Z u 0 D n+n+n+n+n+n+",
+"n+n+n+n+n+n+f.!.#.#.N #.#.m u W.S.Y.=+=+(+$+$+n+F+n+$+h + D+D+D+r+D+r+D+r+D+D+c+  n+F+n+F+].c+  v+t+q+q+l+l+g+g+4+4+}+(+!+!+=+ +S. +S.L.u.D.p.n.u.f.f.f.f.e.0.f.e.0.0.5.0.5.~.t D M M u 0 m n+n+n+n+n+n+",
+"n+n+n+n+n+n+5.#.7.#.$.~.#.u Z L.S.=+=+!+!+'.,.$+$+$+'.h $ D+r+D+D+r+D+r+D+D+r+c++ F+n+n+F+@+c+  v+v+q+q+q+l+g+0+0+4+!+(+!+=+=+Y.S.S.u.x.x.u.u.f.p.e.e.e.e.0.e.0.5.5.0.e.f.e.5.D t t g ^ @ @ n+n+n+n+n+n+",
+"n+n+n+n+n+L.~.0.5.#.5.~.u m D.S.S.=+ +=+].f+'.'.,.h ,.'.r+D+r+D+r+D+r+r+D+r+D+D+c++ q+F+].r+c+  t+q+q+l+l+g+g+0+4+4+!+}+!+=+=+ +S.S.u.S.u.u.n.f.u.n.f.f.f.5.f.0.e.e.0.5.5.f.0.~.0 ^ * . % ^ !.n+n+n+n+n+",
+"n+n+n+n+n+x.Z ^ 0 g #.7.u 3 D.D.L.Y.=+$+n+f+I.].].|.].h.h q D+r+D+r+D+D+D+r+D+r+c++ n+F+|.c+  v+q+t+q+q+g+g+0+4+4+4+}+!+=+=+ +Y.Y.L.S.u.u.p.x.n.f.f.e.e.e.f.5.e.f.5.0.e.0.0.f.e.} 0 N M u 0 M n+n+n+n+n+",
+"n+n+n+n+n+f.5.n.N 3 % ' } 0 S.L.L.Y. +$+r+F+F+I.I.I.h.h.h.f+E D+r+D+r+r+r+D+r+D+c++ k+F+y.c+  t+q+q+g+l+g+0+0+4+0+!+!+(+=+ +=+Y.S.L.S.x.u.n.n.n.n.f.f.f.e.e.0.0.0.5.f.5.e.e.5.0.#.M $.N m 3 t n+n+n+n+n+",
+"n+n+n+n+n+n.n.=+=+S.~.3 ' ' D.u.S.Y.=+$+r+E+E+F+F+f+f+f+f+I. .D+r+r+D+r+D+r+D+r+c++ t+F+].c+  t+q+l+q+g+g+0+4+4+!+}+!+!+Y.=+Y.L.L.S.L.u.x.u.p.n.f.n.e.e.0.f.5.5.f.e.0.e.5.5.0.5.N D ~.M m ^ 0 n+n+n+n+n+",
+"n+n+n+n+n+5.x.Y.Y.=+S.~.D 0 D.u.L.S.Y.$+r+r+r+E+E+F+E+f+I.h.F r+r+r+D+r+r+D+r+r+c+. n+F+a.  ].q+q+l+g+g+0+0+4+4+}+}+=+=+=+=+Y.S.S.L.L.u.p.u.p.n.f.f.f.e.0.f.e.e.0.5.0.0.0.0.0.5.Z Z #.t 0 3 3 n+n+n+n+n+",
+"n+n+n+n+n+e.u.=+=+S.e.Z 0 0 D.x.S.L.Y.$+r+f+r+r+r+E+E+I.I.h.,.D+D+r+r+r+D+r+D+D+c+  k+F+].  '.$+l+g+g+0+4+4+}+}+!+=+!+=+=+Y.S.Y.u.u.x.x.u.f.f.f.e.e.e.f.e.e.0.5.0.e.0.e.0.e.0.7.Z M $.N 0 3 } n+n+n+n+n+",
+"n+n+n+n+n+7.S.=+u.f.5.M 0 0 D.u.D.S. +$+r+f+f+r+r+r+r+I.I.h.h r+r+D+r+r+r+r+r+r+r+c+  F+H.  ].i.g+g+                  Y.                  u.                  5.0.5.0.e.5.e.f.5.#.#.#.M m 3 ^ n+n+n+n+n+",
+"n+n+n+n+n+5.Y.Y.n.e.~.D g 0 k.p.L.L.S.$+r+f+f+f+r+r+r+I.h.h.K r+D+r+r+D+r+r+r+r+D+c+  F+a.  '.y.g+0+      n+          =+      n+          n.      n+          e.0.e.5.5.f.5.0.5.M M ~.Z t 3 ; n+n+n+n+n+",
+"n+n+n+n+n+~.S.p.5.5.5.N 0 0 p.n.u.u.L.$+r+f+f+f+f+f+r+I.h.h.:.c+c+r+D+r+r+D+r+r+r+c+  F+].h ].].4+4+    +   n+         +    +   n+        p.    +   n+        5.0.f.0.7.0.5.e.5.N $.~.N t ^ * n+n+n+n+n+",
+"n+n+n+n+n+~.L.5.f.n.~.u 0 0 x.n.x.S.u.$+r+f+f+f+f+f+f+I.h.h.h $ $ c+h+D+r+r+r+r+r+c+  F+$ h ].'.4+4+        + n+n+n+  S.        + n+n+n+  f.        + n+n+n+  e.f.7.e.0.e.e.0.5.N Z #.D 0 ^ @ n+n+n+n+n+",
+"n+n+n+n+n+~.n.e.n.f.#.u g 3 n.n.n.x.S.L.$+r+f+f+f+f+f+I.h.h.r }+4+@ . c+c+r+r+r+r+c+  h + '.,.$+4+(+    n+  n++ +     S.    n+  n++ +     f.    n+  n++ +     5.f.0.5.0.0.5.e.5.t M M u ^ % % n+n+n+n+n+",
+"n+n+n+n+n+0.p.u.x.e.#.t u 0 k.n.n.u.L.S.$+r+f+f+f+f+f+I.*.h !+!+}+}+4++ $ c+c+D+r+c+      ].-+4+}+(+    + n+n+        L.    + n+n+        f.    + n+n+        e.5.5.f.5.0.e.7.~.D D D 0 ' % . n+n+n+n+n+",
+"n+n+n+n+n+5.p.L.u.u.~.D t m k.k.p.u.u.L.$+r+f+_ f+f+f+9 *.:.!+}+!+!+(+(+}++ + c+c+r+c+  h ].(+!+!+!+    + n++         S.    + n++         f.    + n++         e.e.7.e.5.f.5.0.~.t N g 3 ' * @ n+n+n+n+n+",
+"n+n+n+n+n+~.u.S.Y.u.5.Z D m 7.f.n.e.x.x.$+r+f+9 f+f+] 9 h.r !+!+!+!+}+}+!+(+}++   c+c+  h !+!+!+!+(+    + + n+        Y.    + + n+        u.    + + n+        0.0.0.f.e.e.f.5.$.u D u 3 ^ @ * n+n+n+n+n+",
+"n+n+n+n+n+0.e. + +D.0.#.u 0 !.n.n.n.u.x.$+r+f+9 f+f+I.I.h.h Y.=+=+=+!+!+!+!+!+!+!+    + =+(+!+Y. +!+      +            +      +           n.      +           f.5.0.0.5.e.e.e.~.t m g ^ ' * ' n+n+n+n+n+",
+"n+n+n+n+n+0.0.D.D.u.5.D D u !.e.n.f.n.u.x.L.L.u.S.L.S. +Y.Y.=+=+Y.Y.=+Y.=+=+(+=+=+(+=+!+!+Y. +=+Y.Y. +=+ +S.W.S.S.S.=+Y.x.x.p.n.f.f.n.f.f.f.e.e.n.n.e.e.0.e.5.5.f.5.0.f.0.0.5.#.m t 3 ^ ' % ^ n+n+n+n+n+",
+"n+n+n+n+n+5.5.L.L.n.#.D M D !.f.n.n.n.u.n.u.u.L.L.L.S.S.L.L.Y.Y.Y.Y.=+=+ +Y.=+=+ +=+ +Y.=+=+=+=+ +Y.                  L.                  0.                  0.e.5.e.5.f.e.5.~.u N 0 3 ; @ 3 n+n+n+n+n+",
+"n+n+n+n+n+n.$.u.D.0.M Z N N D k.f.f.p.n.n.u.x.u.u.L.u.L.x+x+B+Y.Y.Y.Y.Y.=+ + +Y.Y. +Y. + +Y.Y.S.Y.S.      n+          S.      n+          f.      n+          0.0.e.0.f.e.0.e.M m g 0 } ' % 0 n+n+n+n+n+",
+"n+n+n+n+n+u.!.u.e.$.M Z ~.M M ~.n.f.f.p.p.n.n.n.u.x.u.u.x+x+B+L.S.L.L.L.Y.Y.Y.Y.Y.Y.Y.Y.Y.S.Y.L.L.L.    +   n+        u.    +   n+        f.    +   n+        0.0.5.0.5.f.7.5.#.u g g ^ @ . D n+n+n+n+n+",
+"n+n+n+n+n+n+#.0.#.u D ~.~.N t 7.0.n.n.f.n.n.p.u.p.u.x.L.x+x+B+L.Y.L.Y.S.S.Y.L.S.L.L.S.Y.L.L.L.S.S.L.        + n+n+n+  x.        + n+n+n+  5.        + n+n+n+  5.0.e.0.e.5.7.~.D u 0 } * + % n+n+n+n+n+n+",
+"n+n+n+n+n+n+5.Z N M M ~.~.N u #.e.f.n.f.f.f.n.n.p.u.n.p.x+x+B+u.S.u.R.D.S.S.L.S.S.L.L.S.S.L.u.L.D.u.    n+  n++ +     u.    n+  n++ +     e.    n+  n++ +     5.f.5.f.e.7.~.N M D 0 ' %   ' n+n+n+n+n+n+",
+"n+n+n+n+n+n+7.N #.#.M Z M D u D f.e.f.n.n.n.n.f.n.n.n.u.x+x+B+x.x.L.L.u.x.x+L.u.L.x.S.L.L.S.u.u.u.L.    + n+n+        p.    + n+n+        0.    + n+n+        e.e.f.e.f.7.~.D u m } ' % . 3 n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+#.#.#.D Z D M M u 7.5.e.f.f.f.n.f.f.p.n.n.x+x+B+B+n.p.x.u.B+x+x+x+u.u.u.x.u.u.u.D.u.n.    + n++         f.    + n++         7.    + n++         5.e.e.e.0.$.~.t t g } ' @ . n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+~.#.D D t Z ~.Z 0 N e.0.e.e.e.f.n.n.f.f.p.  x+x+B+u.u.u.x.  x+x+x+x+n.D.u.n.D.u.f.n.n.    + + n+        f.    + + n+        0.    + + n+        0.0.f.0.7.~.m g g 0 0 *   * n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+~.M t u N 7.k.$.u m 7.0.5.f.e.f.e.n.n.f.f.n.x+x+B+B+n.f.x.u.B+B+x+x+x+x+u.f.u.u.f.u.n.      +           f.      +           7.      +           e.e.e.e.7.#.m 3 0 0 ^ @ . } n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+Z u M D t 3 ^ } ^ u e.e.0.f.e.f.f.f.n.e.f.  x+x+B+B+B+f.p.    B+x+x+x+x+n.p.n.n.f.f.f.f.x.f.f.e.n.f.f.n.e.e.f.0.f.f.e.f.f.f.e.5.0.f.0.e.0.0.p.0.f.f.e.0.g 0 g 3 ^ % . @ n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+~.g ' @ * 0 Z t 0 3 7.7.7.0.0.e.e.f.f.e.f.e.  x+x+x+B+B+B+B+B+B+x+x+x+x+x+f.n.e.n.n.                  n.                  0.                  e.e.5.5.7.} } 0 3 ^ @ @ ' n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+0.m } N 0.x.p.!.t 0 m 7.5.5.e.5.0.e.e.f.e.f.f.  x+x+x+x+x+x+B+B+x+x+x+x+x+x+f.f.f.f.      n+          f.      n+          0.      n+          f.f.e.e.u 0 ' @   @ .   0 n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+$.M #.5.f.7.#.D m 0 #.e.5.f.0.5.f.0.0.n.e.f.f.    x+x+x+x+x+x+x+x+x+x+x+  e.e.e.e.    +   n+        f.    +   n+        0.    +   n+        e.e.e.7.} u M 0 . . . % n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+M !.~.!.#.M D m 0 u ~.0.e.5.e.0.e.f.0.0.0.e.f.f.  $       x+x+x+x+    f.f.f.e.f.        + n+n+n+  0.        + n+n+n+  5.        + n+n+n+  f.p.7.u 0 m D g ' @ . n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+#.N #.D D M N g 0 0 N 7.f.0.5.0.e.0.f.e.5.0.7.5.e.e.f.x+x+x+x+x+  0.e.e.e.5.e.e.    n+  n++ +     0.    n+  n++ +     0.    n+  n++ +     0.e.N } m u 0 ' @ @ % n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+M t g m 0 g } 3 m u D 7.0.e.5.5.0.e.0.f.e.5.f.0.5.x+x+x+x+x+  e.5.0.0.0.f.0.5.    + n+n+        e.    + n+n+        5.    + n+n+        7.u 0 3 0 3 * .   + n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+#.0 3 3 } t N u m 3 g ~.7.e.0.5.5.5.e.5.f.e.5.f.0.  x+x+x+  5.f.e.0.f.e.0.f.0.    + n++         e.    + n++         e.    + n++         Z 3 m 0 3 * % . . ; n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+u ' ^ m Z ~.M } u 0 u ~.0.0.f.0.e.0.f.7.0.0.0.5.0.      e.f.f.5.5.5.0.5.e.0.    + + n+        0.    + + n+        0.    + + n+        0 u u 0 ' % + . @ n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+~.t 0 t Z ~.t 3 M Z D u #.~.p.0.5.e.5.5.e.e.f.5.5.0.5.5.7.0.f.e.e.5.e.5.5.0.      +           e.      +           f.      +           0 Z N } % @ @ % 3 n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+M g m N #.t g #.!.#.N u Z ~.5.e.0.5.e.0.5.0.e.e.5.e.f.5.5.7.0.0.e.0.0.e.5.5.e.f.f.0.n.e.0.5.0.0.f.7.5.0.0.f.e.n.e.e.f.7.k.7.#.M m N N N D ^ . @ + ' n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+N m t D 0 0 #.~.~.#.D m D 7.5.f.0.5.f.0.0.0.e.0.e.f.e.0.f.0.0.0.e.0.e.e.0.0.0.5.5.0.f.u.0.5.5.f.e.f.5.0.f.e.f.f.e.e.e.7.!.} u N #.Z N } *   % * n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+D g 0 } ^ D ~.0.$.Z u 3 u e.7.5.e.e.5.0.f.0.0.5.0.0.5.5.5.0.5.0.f.0.0.0.0.7.e.e.e.5.e.u.n.e.5.f.0.e.f.e.f.e.e.0.D.~.N 3 u N Z Z M 3 ' . . . n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+u 3 } ' 0 #.7.7.~.N } 3 3 ~.0.0.0.5.5.0.5.f.0.0.f.e.e.5.e.5.e.0.0.5.5.5.0.0.0.e.0.0.f.n.p.e.n.f.e.f.e.f.f.k.0.7.Z ^ u Z Z M N 0 * . . + n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+$.m ^ ^ } D ~.5.~.D 3 0 } 0 m 7.7.e.e.5.e.e.5.5.7.0.0.e.0.f.5.5.5.e.f.f.0.f.5.0.f.5.0.0.n.f.f.p.u.n.f.p.e.k.!.} } 3 D !.N N m ' % + @ } n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+$.3 ' * 0 D N M m } } ^ !.u m $.7.e.0.0.f.e.f.0.0.f.0.0.0.e.e.0.e.e.5.5.f.f.e.e.e.f.e.e.n.f.e.e.n.e.e.5.#.3 } ^ 0 Z !.D 0 ' . @ % ^ n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+Z } % * ^ m g 0 0 % 0 7.$.D m 0 #.~.7.7.f.5.e.5.0.5.0.e.0.0.0.0.0.e.e.e.0.0.f.f.e.f.f.e.e.n.f.p.e.7.} 0 u 3 } u N g } % % @ @ ; n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+#.g ' @ ' 3 } ^ + #.5.7.~.#.D u 3 #.~.~.7.7.7.7.5.5.f.f.e.5.5.f.0.f.f.e.e.e.f.e.n.f.f.e.f.e.7.3 * m N M g g g ^ * @ . . @ } n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+g ' @ ' ; @ @ 0.0.e.5.~.~.#.M m } 0 D #.Z !.7.7.e.e.5.n.n.e.e.e.e.f.f.f.e.f.e.e.n.f.u m 0 D ^ 0 Z u } } ' @ . @ @ @ n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+g ' * * . ' #.~.~.~.5.0.5.~.$.Z D m 0 } u u N ~.7.e.f.f.f.e.f.e.e.e.f.e.7.7.u m m u N Z ~.m ^ M 3 ; ' % . .   * n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+t ' @ . ^ 3 m D $.~.7.7.5.~.~.#.M u m 0 0 } ^ } ^ } 3 } 0 0 u D u m m m t N N !.$.~.!.~.N * 3 ; % + . . . * n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+M } . ' ' 3 0 M Z #.$.~.7.0.5.$.t m u u m m m m 0 m 0 F m u 0 u N N D Z #.~.~.~.Z M D D % @ @ @ @ + % ' n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+0 ^ ' ' ^ } 3 g m N ~.5.~.Z N D D D g m D N M N N M $.#.!.~.#.M M Z #.!.#.M g 3 0 '   & @ @ @ ; n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+0 ' * * ' ^ 3 0 g D D D g t t u M u m N t M 7.~.~.$.7.5.!.D t M Z D u 0 ^ ' @ . . + . * n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+3 ' @ % % ' ^ 3 3 ^ ^ ^ 3 g u g m t m N M N N M #.Z N u 0 m 3 } ' * % @ @ . @ * n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+3 ' @ @ % % * @ * * * ' ' ^ 3 3 ^ , ^ } 3 0 g 3 3 ^ ' * % @ . . . . @ % n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+g } * % + + + + + @ % * ' % % @ % * ' * @ % + @ @ @ @ @ @ @ * ^ n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+m , ' % . @ . . @ @     .   . @ + . % @ . % . % * ^ n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+m } ' ' % @ @ . + @ + @ @ @ % ' ^ } n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+",
+"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+"};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.bmp
new file mode 100644 (file)
index 0000000..80e0274
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Logo.xpm
new file mode 100644 (file)
index 0000000..27fabfa
--- /dev/null
@@ -0,0 +1,359 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_Logo_xpm[] = {
+"100 100 256 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #EE8C8A",
+">+    c #B44A47",
+",+    c #E6787C",
+"'+    c #7E3030",
+")+    c #6D3435",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #FDC6C6",
+"/+    c #FBCCC9",
+"(+    c #FBCED1",
+"_+    c #F9D3D3",
+":+    c #FDCECB",
+"<+    c #FAD4D5",
+"[+    c #FBDCDB",
+"}+    c #C35959",
+"|+    c #9E3E39",
+"1+    c #FDDEDD",
+"2+    c #AB4A49",
+"3+    c #984E4E",
+"4+    c #D98182",
+"5+    c #FBE6E9",
+"6+    c #712421",
+"7+    c #B24243",
+"8+    c #FBE4E1",
+"9+    c #FED8D9",
+"0+    c #FEDFDE",
+"a+    c #FDE8EB",
+"b+    c #BF4D4D",
+"c+    c #FFEAED",
+"d+    c #681C1A",
+"e+    c #AA423F",
+"f+    c #3C0F0F",
+"g+    c #110203",
+"h+    c #AC4441",
+"i+    c #DFDFF3",
+"j+    c #551815",
+"k+    c #000099",
+"l+    c #4F1311",
+"m+    c #A33B3A",
+"n+    c #430F0E",
+"o+    c #1515A1",
+"p+    c #541714",
+"q+    c #CC5D5F",
+"r+    c #370A09",
+"s+    c #2828A9",
+"t+    c #190407",
+"u+    c #020299",
+"v+    c #F09D9C",
+"w+    c #F0999A",
+"x+    c #E28488",
+"y+    c #E88387",
+"z+    c #080100",
+"A+    c #0A0301",
+"B+    c #4C1711",
+"C+    c #0B0403",
+"D+    c #120304",
+"E+    c #421410",
+"F+    c #3F110C",
+"G+    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+-+-+-+@+.+@+.+++.+W.P.O.F.M.s.;+;+< Q.| @.1 j & y.y.u.. u.3 L L / ' >+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< ,+j - l '+y )+r.G.O.P.#+.+-+-+@+!+@+!+~+{+-+{+-+-+@+.+@+@+.+P.O.F.M.q.i.;+h.X.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+@+=+-+{+~+^+{+{+{+{+!+{+~+-+{+-+@+.+.+P.O.F.M.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P..+.+-+!+~+^+{+^+^+/+(+(+{+^+^+{+{+{+-+-+@+=+.+P.O.F.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 ,+k.v ' ^.d.m Q B.D.F.N.O.W..+=+=+~+{+^+(+_+(+(+/+(+_+_+:+(+{+^+{+~+-+@+.+++P.O.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.N.W.W.@+-+!+{+/+(+/+/+_+<+[+:+:+(+<+:+_+(+(+/+{+{+@+=+.+++P.P.G.s.;+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.F.P.W..+.+-+!+{+^+/+_+(+:+<+<+[+[+[+[+[+:+<+<+/+/+^+{+-+-+=+W.F.N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e }+|+o.n L.h.i.F.N.P.++-+@+{+{+^+^+(+[+[+[+1+1+1+[+[+1+1+[+[+(+(+^+^+{+{+-+=+.+O.O.F.q.i.h.X.| e % j & N . * L ' / / , , > M M # : m 9.~.|+5 u 0.0                       ",
+"                      b / & N }+2+F K.3+4+] M.F.E.W.++@+!+{+^+(+_+<+<+1+[+5+5+5+1+5+1+1+[+[+[+_+_+(+^+{+@+-+W.++O.F.i.{ k.Q.~ @.1 ].@ y.R.$ a a L ).> M , b b b M - R 6+0 7+u $+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.#+-+-+{+(+(+(+:+<+1+5+[+[+8+5+8+5+5+8+[+[+9+(+_+(+{+^+!+@+.+W.O.O.F.i.{ } ~ v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.3+< { s.G.O.E.#+.+-+!+{+/+_+[+[+1+0+5+a+5+5+5+5+8+5+5+0+[+[+_+_+(+^+~+-+=+.+P.E.F.s.{ h.[ | f j & @ . u.3 ! a > > , , M O # # A b+6.6+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.;+q.F.O.P.#+=+!+{+^+/+_+[+1+8+8+8+8+8+8+8+c+8+8+5+5+8+[+<+:+_+/+{+!+-+.+P.E.G.] j.k.X.~ 1 e & N N $ a ).! / B B ; M b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.F.P.W.++-+!+^+(+(+<+<+1+8+8+c+c+c+c+c+8+c+c+5+8+0+[+<+<+(+^+{+~+@+-+P.F.M.G.;+P Q.| e j % y.d R.L L / > > , B ; M O # M b M +.o `.u u w.d+0                 ",
+"                , = b L s +.9 9 7 g [ t.i.q.F.E..+@+-+!+{+/+(+<+1+1+5+8+8+8+c+8+c+c+8+8+c+5+0+[+[+:+(+(+{+!+=+=+W.O.i.G.;+k.Q.| 1 j % @ + $ ! 3 L / B , B ; b M b M O A b+6+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.] M.F.P.++.+-+!+(+^+_+<+1+1+8+c+c+c+c+c+c+c+c+c+8+8+5+8+[+[+_+/+{+{+-+.+#+O.N.i.] t.Q.~ 1 f j y.+ R.3 3 / > , B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.'+<.r | ;+;+q.F.O..+.+-+~+(+{+_+_+1+0+8+8+8+c+8+c+8+c+8+c+c+8+0+1+1+(+(+(+{+!+-+.+#+P.F.s.] t.X.,+@.f j N + u.! $ ! )., B , , b ; O # O A ^ 7+'.l ..6 U o +.              ",
+"              > 6 b > 5 e+o.9 0.1 v } { ] i.G.P.P.@+-+@+{+(+/+_+1+0+8+8+c+c+8+c+c+c+8+8+8+5+5+1+[+:+(+/+^+!+@+@+++O.N.i.;+k.Q.~ v % % y.N + 3 L / / > , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| v Q.k.;+i.s.O.E.++-+!+{+^+_+_+[+0+a+8+8+c+c+8+c+c+c+c+8+8+5+1+[+_+(+^+{+!+-+++W.P.F.q.] t.X.,+v f % y.+ R.3 3 * / B , , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ } { ] s.M.E.P..+@+@+{+^+(+<+[+0+8+c+8+c+8+c+8+c+c+8+5+8+[+1+<+/+/+(+{+-+.+++P.F.M.i.{ < Q.| 1 e j ].R.. 3 3 ' > > B M M ; ; b # A b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E '+& f Y.Q.t.i.r.M.O.O.++-+-+^+{+/+9+[+8+8+8+c+8+c+c+c+8+8+8+c+8+1+[+<+(+/+{+-+-+=+++E.O.G.i.{ P X.e j e N @ u.$ ! 3 L / , , , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.7+..>.L.j j v } k.;+;+M.O.P.++.+-+!+{+(+:+<+9+0+c+8+c+8+c+8+c+8+5+8+[+1+_+_+_+^+^+{+-+=+#+P.F.i.] t.< [ Y.f & % + + R.a a ' > > B M O M M b b O M # M b U E I.>.f+g+g+            ",
+"          ].h+= ( u C d.'+T N @ f v [ } j.i.s.F.O.#+.+-+-+{+(+/+:+9+[+8+8+8+8+8+c+8+8+0+5+1+<+<+/+^+^+-+-+=+++W.E.N.;+] t.Q.~ e H.j y.+ $ u.* a / > , i+i+b # ; M M O b O # O 7+p W =.Y X f+x           ",
+"          $ n H V d+u _ '+j+N N ].@.[ P h.] s.F.O.P.++=+-+{+{+^+<+:+:+<+0+0+8+8+8+8+8+8+:+<+_+_+^+(+!+!+=+++W.O.M.M.r.;+k.Q.r | j ].& i+i+! ! > ).i+i+i+k+k+b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l l+X &.-.p j + % @.,+< k.i.r.G.F.O.W.++++-+~+{+(+_+:+:+[+0+0+[+0+9+9+[+[+<+:+(+{+^+!+-+-+#+W.O.E.i.;+h.< | ~ 1 j ].i+i+k+k+3 * i+i+i+k+k+M O O O b O b M i+i+i+D D 0 A.E l+o           ",
+"          > ! < < e 7+J.&.` N u.& 1 [ X.} { ;+q.M.P.P.#+++-+-+~+{+{+(+<+:+:+:+9+9+9+9+<+_+/+(+/+^+!+@+@+#+P.N.F.i.] { { | i+i+i+i+i+i+i+i+a ! * / k+k+k+# ; b b O M O i+i+i+i+i+k+T.m+w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.G.O.W.E..+@+-+~+!+{+(+(+(+:+:+:+/+_+(+^+{+~+{+{+-+++.+W.P.N.F.s.] k.i+i+i+i+i+i+i+i+k+k+k+! > / , , B O ; B M O b i+i+i+i+i+k+k+$+0.z n.n+J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 i+i+i+i+i+i+M.F.O.P.W.++@+-+-+~+{+{+/+{+(+(+(+{+{+(+{+{+!+-+-+++#+O.N.M.r.;+{ P [ k+k+k+i+i+i+k+k+3 * / / i+i+M ; M M O b O i+O k+i+i+i+k+m i+0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.i+i+i+i+k+k+i+i+i+k+M.F.O.W.W..+.+@+-+!+!+{+!+{+-+^+{+-+{+-+-+.+=+++.+W.O.i+i+i+i.k.Q.| e 1 i+i+i+i+k+3 3 3 L i+i+i+i+b O # i+i+O b k+M i+i+o+i+i+k k+U E G f+          ",
+"          ( @.1 ).: 4 z d+p+i+i+i+k+k+k+k+,+i+i+i+k+q.M.F.O.P.E.#+++.+@+-+-+@+-+@+-+-+-+-+-+@+++.+W.F.i+i+i+k+k+k+h.[ ~ @.i+i+i+i+k+k+3 ! i+i+i+i+i+i+i+i+i+i+k+k+M i+i+i+i+i+q+k+k+c.`.o q r+          ",
+"          - 1 $ b # w o.n.i+i+k+k+k+& H.1 i+i+i+i+k+i.s.M.F.F.O.W.W.W.#+#+-+=+-+i+i+@+.+.+++++++E.i+i+i+i+s+i+k.Q.| ,+r i+i+i+i+i+k+$ i+i+! k+k+k+i+i+i+i+k+k+k+O # i+i+i+k+k+k+~.0 _ m R W I           ",
+"          = @ b # ).4 i+i+i+k+k+. + y.].H.i+i+i+k+k+{ i.] q.M.F.O.E.P.P.W.i+i+i+i+i+k+W.W.P.W.i+i+i+i+s+i+i+i+k+[ [ i+i+j k+i+i+i+i+i+i+k+k+B , , , k+k+k+k+O M O A M k+k+k+O ^ ~.$+0.U n.r+t+          ",
+"          d.B M * / i+i+i+k+k+).3 . N @ i+i+i+k+k+< t.j.;+i.s.s.F.F.F.E.i+i+u+i+i+k+k+P.O.O.i+i+i+s+i+i+v+i+i+i+i+i+1 k+k+i+i+i+i+i+k+k+k+/ > M B ; M # ; b O b # ^ b # O b M a.'.~.!.6+f+X Z           ",
+"          = ' u.$ M i+i+k+k+1.> * u.@ & i+i+i+k+,+[ i+i+i+i+i.] s.q.M.i+i+i+i+i+k+k+O.F.i+i+i+i+i+i+i+k+k+i+i+i+i+k+k+].].i+i+i+k+k+k+L / > B , , M b b A M O M b b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.i+i+i+k+8 2.' ' u.u.d @ k+k+k+1 i+i+i+i+i+i+i.;+;+i+i+i+k+k+k+k+M.i+i+w+i+i+i+i+x+k+k+h.{+k+k+k+k+e j y.y.k+k+k+L ' > / , B M b , M O O b O M M A M b # b ^ m+I.o.>.q 7.X t+          ",
+"          - R.& j i+i+i+k+>.^.M ).' . . y.@ & & i+@.k+k+i+i+i+k+i.i+i+i+i+i+i+i+i+i+i.k+i+i+i+k+k+k+,+< < ,+r r 1 H.@.& @ @ & j ].+ R.R.3 L , > ; A ; b O M O O O O O M M ; b 0 x.'.E l+r+Z J           ",
+"          = * e i+i+i+i+k+Z.5.M * * 3 . R.y.@ i+].k+1 1 i+i+o+i+i+} k+i+i+i+i+i+k+k+k+h.< k+k+k+,+k.~ | X.~ @.v e e @.e j y.u.* L L / B > > a * , O ; b O b O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N i+i+i+i+x.4.B > / L L $ i+d @ k+].& i+i+i+i+y+k+k+} X.k+k+k+k+k+h.< k.k.| ,+[ | | r v ,+1 g H.1 f ~ H.$ $ ! L / / )., , , A B 3 > A M O M b b ; b O ; O # b e+Z.o j+f+r+X f+          ",
+"          b ( % ].i+i+i+i+i+i+O > i+i+i+L u.k+. + @ & i+i+k+k+k+@.@.~ ~ ,+| Q.X.r ~ ~ ~ ~ Q.~ v v H.1 1 e @.j f @.r f % R.a + . ! / > B B ; # O b / / b O M M A M b M b # B # _ E o.n.-.r+Z q           ",
+"          * 5 u.N = i+i+i+i+i+i+i+i+k+k+k+3 $ u.u.+ y.@ k+k+& f f 1 H.H.v r e @.@.e @.,+e @.1 1 j j j & H.j j g e & v & . + a 3 3 ' > , , M O M # M B * M O O O O M O ; M O : ~.6+>.n.J.7.t+9           ",
+"          3 2 u.M 0.+.k+k+k+k+k+k+k+k+' ! 3 L $ u.. R.y.y.@ ].].% j % % f 1 e 1 1 1 1 @.H.j f ].].].% & @ @ j & R.% ].y.3 L 3 L L / > > b M b M b O O , , O b O O b M b , A : 0  .T 8 f+t+z+U           ",
+"            c = 2 ]+U 7+_ A.t C ; > > / * L ! L ! u.$ + @ y.N @ & ].j j & f j & ].% & j ].].].& & @ N + . + j u.$ R.u.$ L * * > / )./ / / b ; O # O O b * b ; b O M O B b s 7+T.7 n.-.J z+Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! u.L $ . y.R.+ N @ y.@ & & % & & % ].& & @ y.@ N y.u.R.u.@ + u.$ . a a ' / , B > > > > , M b A b M M A > > M b # b ; B : z.T.F z p+` Z A+7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * * L u.L ! $ $ . y.@ y.+ @ @ d d + N d d N + R.R.+ . $ . N * / y.L 3 ' / B B , , , , , B ^ # O M b O O O ).# M M ; M # C m+9.,.E m.7.Z g+B+            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ' ).L a 3 3 3 $ $ . u.R.. R.. R.R.R.. R.u.$ $ u.L u.* . . ! * 3 3 * )., , B M M B > , B A b O O O b O O B , b M M M O 5 0 I.o 9 m.&.g+Y               ",
+"              e+/.U I.'.D c.m 8.o.M O M B B , B > / / ' ).3 3 a u.u.L ! 3 u.$ u.$ $ $ u.$ ! u.a ' L * L u.* L / ! ' > / B B M # # , , > , O # O M b # M O ; L ; # , # : d.Z.E T 9 n.J A+J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > B / / > / > ).* L a ! L u.L 3 a u.L a a * 3 a L * ' L R.> > , / a > / , , M M B B , B B A b O M A b b A O 3 M M M M b.c.9 n.j+V f+t+C+-.              ",
+"                m ]+F A.t -.f+-.f+x.M M # # B , , , > B , * )./ * ' > / ' * ! 3 L / ' * ).' ' )./ / / / . , , B > B / > B M , ; , , B , ; O M b O O O M # # ! O , ; O w 8 8.9 j+f+X z+t+                ",
+"                e+>.7.t+=.V /.'.9 q s A A O O M B , , B , B B , / ).* / > * / > 3 / > > / / > > > ).B B u.B , , B )./ > , B B B B , B B b O M O b # O b M b u.M M ; b >+S m.9 J.r+t+z+*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B > , , > / / > ).> )./ / ).> , , , , , B . , B M ; b B , > , , , , B , b # O O b # A M B b B u., , M M 7 p K g+C+t+A+z+9                 ",
+"                  0.l |+( / : k z T V 6 M b , # b O O O B B , , B B , > B , , , B > > , , > B B B B , M ! b b # M O O , B B B B , M M A b O M A b b # ; ; M $ B B M ^.;.x.~.p+Y z+z+t+                  ",
+"                    +.x z.c k $+~.6+p  .5 O A b M # M # O O O M , , M , , B B B , , , B B , , , B # O # L , B b # # A ^ O O b O A b O O M b O O ; ; O M B / 3 , , ^ Z.V 8.o.9 *.g+z+                    ",
+"                    0 ~...9.7 F T.d+p 9 '+O M O b O M # # M b O A b M M ; # ; M M M # # M M M b M M b # > , M M A b M O O # M O O O b # M O b M M M # B B ).).M A A.;.9 6+n.&.t+z+J                     ",
+"                      F I.8 8 9 9 J.j+T z z C O M b b A M O ; M b ; O b M M M b O O M b O O O ; # b B b B > O b b # b M b A ^ O M b # A O b ; O O b B , , ).M C ]+J.J.9 p I g+z+g+                      ",
+"                      u n.B+q m.6+o.I.8 p T h+C M O b b b M b ; M b , O O O ; M O b B M O O M O ; O M O O / > # A # b M O b b O M A b O M M b , B , M > ) ) 5 n V 9 9 l+I Z A+z+7.                      ",
+"                        ,.f+f+8 n e.T.J.8.Z.7 f.w O # # M ^ # A O # ^ b O O A O M # O b b b O b A O O O O M ' A O A # O b ; M b O O # M # O B M , B , M ^.3.m p+E 7 9 K Z z+z+t+                        ",
+"                        7+6+n.o k 4 z J.F m U ]+|+z.A ^ b M O b A M # b b # b b A O # M M b M b b O O b b b , / b M O M A O # O b M b # b ; , M , B ' ^.z.o.n.Z.l A.B+Z t+g+t+q                         ",
+"                          ..6+8 U u I.d+k 2 u U R m - b M O b M O b A M M b M ; b b A O O M O # M b b M ; # O ).> O b O O O A b ; O ; M > B B , A ^.^.c ~.d+o.U m z f+D+g+g+`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.'+C b # O b # O O O M O A # M O O O O O A O M M O A O b b O / * O b b ; M M b M ; B , , B B M ^.u S R l 0.$+o.q X A+Z J                             ",
+"                              9.T p -.W 9.h+C 5 n E S ]+A A b M M b O O O O b A O b b b O b O O O O O O A M M M b B 3 > B b # O B , B , M M ^ ' b.~.J.x.m $+..~.G I z+z+Y                               ",
+"                                o J.n+&.p u C s _ o.S J.S 5 O ^ O b b O b ; O O # M M b M b M O O b b b O O ^ M O O , * ! > > , M , B , , }+A ^./.E+E n m w.A.T *.z+z+g+                                ",
+"                                0.8 f+r+n+U d.( e+I.J.T W 8.Z.C : A M b M M b b A O O M O # b b b M ; # O O b O ; b O O > / / ! a * ) ' B }+z.%.-.J.T.6 A.9.8 7.Z g+g+F+                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ ^ # M O O O O O A # M M O M M b b , ; M M B ; B B > , B > ).> > b+..l+m.W p+..6 ~.V K g+D+Z r+                                  ",
+"                                    `.m.X *.r+8 >.j+n.=.V : 0 U >.n.0.d.C : # b M b # b # M O O O O O B M M M O , , B , , > B > / ' M b.m.V R J.q 7 U d+W J Z g+Z f+                                    ",
+"                                      ..n.` t+7.q H f+C+u B 4 5 0.~.E V k h+b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.d+d+>.W I t+z+g+Y H                                       ",
+"                                          9 7.t+&.&.Z t+^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , '+Z.p z f+9 n 6+-.W 7.t+z+z+g+Z                                           ",
+"                                            >.*.I J C+7...e+z._ ( O w _ 0.~.I.8 p+-.]+]+l h+^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 r+F q r+I Z z+z+z+X                                             ",
+"                                              o 7.t+z+F+j+E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.Z.o o.l /.f._ 6 7+l J J.7.J g+z+A+z+I                                               ",
+"                                                l F+g+*.7.q 9 T.!.u 0.h+C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k e+7+z.n 9.~.T.Z Z D+g+t+g+Z `                                                 ",
+"                                                    n.f+K ` F+-.p+d+E n h+( h+0.o.9.9.'.>.R I.U F o.o.$+k k u e+|+D +./.2 x u +.d+p+J.&.A+A+g+t+Z K                                                     ",
+"                                                        p &.J J 7.f+l+n. .U U z >.6+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U 6+G+F+K Z A+z+g+z+J                                                         ",
+"                                                            J.I t+X J *.f+q l+f+f+W q d+6+d+>.o 8 ~.w.U U D k ..o.8.8.T p+-.7.J t+Z D+z+z+J                                                             ",
+"                                                                G K t+t+X X J t+I J =.&.&.f+p G n+F+f+H p+n.n.G q f+&.I X t+g+g+z+g+t+X                                                                 ",
+"                                                                    >.E+=.t+D+g+z+g+g+t+Z =.K J t+t+Z J I =.t+Z Y t+t+D+g+g+g+g+J f+                                                                    ",
+"                                                                          8 n+*.Z A+z+g+g+Z C+z+C+C+C+D+t+Y z+Z g+g+Z g+X I f+                                                                          ",
+"                                                                                  8 -.&.*.X Z g+C+g+D+D+g+D+t+X ` f+-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.bmp
new file mode 100644 (file)
index 0000000..5e1acdb
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_ManualRegistration.xpm
new file mode 100644 (file)
index 0000000..dbafdbb
--- /dev/null
@@ -0,0 +1,742 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_ManualRegistration_xpm[] = {
+"100 100 639 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #5C5C5C",
+">+    c #474747",
+",+    c #A3A3A3",
+"'+    c #E2E2E2",
+")+    c #AEAEAE",
+"!+    c #EE8C8A",
+"~+    c #000084",
+"{+    c #0000E1",
+"]+    c #0000FA",
+"^+    c #0000E5",
+"/+    c #B44A47",
+"(+    c #E6787C",
+"_+    c #7E3030",
+":+    c #6D3435",
+"<+    c #F8BCBD",
+"[+    c #FBBEC0",
+"}+    c #FAC4C3",
+"|+    c #282828",
+"1+    c #888888",
+"2+    c #CECECE",
+"3+    c #CDCDCD",
+"4+    c #C7C7C7",
+"5+    c #000091",
+"6+    c #0000FD",
+"7+    c #0000C5",
+"8+    c #7A2C2D",
+"9+    c #FDC6C6",
+"0+    c #525252",
+"a+    c #949494",
+"b+    c #7E7E7E",
+"c+    c #E5E5E5",
+"d+    c #9F9F9F",
+"e+    c #4C4C4C",
+"f+    c #000087",
+"g+    c #0000DE",
+"h+    c #0000FF",
+"i+    c #0000D0",
+"j+    c #FBCCC9",
+"k+    c #FBCED1",
+"l+    c #5F5F5F",
+"m+    c #9C9C9C",
+"n+    c #777777",
+"o+    c #E6E6E6",
+"p+    c #AFAFAF",
+"q+    c #242424",
+"r+    c #424242",
+"s+    c #0000C3",
+"t+    c #0000EE",
+"u+    c #000025",
+"v+    c #00008A",
+"w+    c #0000D5",
+"x+    c #0000FE",
+"y+    c #F9D3D3",
+"z+    c #FDCECB",
+"A+    c #A1A1A1",
+"B+    c #919191",
+"C+    c #848484",
+"D+    c #8F8F8F",
+"E+    c #404040",
+"F+    c #0000B5",
+"G+    c #0000D3",
+"H+    c #0000FC",
+"I+    c #000036",
+"J+    c #00009E",
+"K+    c #0000DC",
+"L+    c #0000B7",
+"M+    c #FAD4D5",
+"N+    c #FBDCDB",
+"O+    c #6D6D6D",
+"P+    c #626262",
+"Q+    c #B9B9B9",
+"R+    c #D9D9D9",
+"S+    c #A7A7A7",
+"T+    c #353535",
+"U+    c #000000",
+"V+    c #000096",
+"W+    c #0000C6",
+"X+    c #0000ED",
+"Y+    c #00006B",
+"Z+    c #0000A5",
+"`+    c #0000E8",
+" @    c #0000F5",
+".@    c #000063",
+"+@    c #6B6B6B",
+"@@    c #717171",
+"#@    c #C6C6C6",
+"$@    c #D7D7D7",
+"%@    c #969696",
+"&@    c #1C1C1C",
+"*@    c #0000AD",
+"=@    c #0000F6",
+"-@    c #000092",
+";@    c #0000BA",
+">@    c #0000D8",
+",@    c #C35959",
+"'@    c #9E3E39",
+")@    c #FDDEDD",
+"!@    c #656565",
+"~@    c #696969",
+"{@    c #D8D8D8",
+"]@    c #E1E1E1",
+"^@    c #929292",
+"/@    c #7F7F7F",
+"(@    c #000052",
+"_@    c #0000D2",
+":@    c #000085",
+"<@    c #0000E6",
+"[@    c #00003C",
+"}@    c #AB4A49",
+"|@    c #984E4E",
+"1@    c #D98182",
+"2@    c #FBE6E9",
+"3@    c #585858",
+"4@    c #D1D1D1",
+"5@    c #C8C8C8",
+"6@    c #616161",
+"7@    c #0000BC",
+"8@    c #0000DD",
+"9@    c #0000FB",
+"0@    c #00009B",
+"a@    c #0000C8",
+"b@    c #0000B9",
+"c@    c #712421",
+"d@    c #B24243",
+"e@    c #FBE4E1",
+"f@    c #FED8D9",
+"g@    c #838383",
+"h@    c #3E3E3E",
+"i@    c #BABABA",
+"j@    c #858585",
+"k@    c #141414",
+"l@    c #000048",
+"m@    c #0000D1",
+"n@    c #0000E0",
+"o@    c #000042",
+"p@    c #0000A4",
+"q@    c #FEDFDE",
+"r@    c #FDE8EB",
+"s@    c #898989",
+"t@    c #010101",
+"u@    c #C2C2C2",
+"v@    c #FAFAFA",
+"w@    c #8C8C8C",
+"x@    c #00007B",
+"y@    c #000054",
+"z@    c #00009C",
+"A@    c #0000F7",
+"B@    c #0000E2",
+"C@    c #000080",
+"D@    c #BF4D4D",
+"E@    c #FFEAED",
+"F@    c #383838",
+"G@    c #939393",
+"H@    c #434343",
+"I@    c #999999",
+"J@    c #DFDFDF",
+"K@    c #0000AE",
+"L@    c #000033",
+"M@    c #0000A7",
+"N@    c #000059",
+"O@    c #4A4A4A",
+"P@    c #9E9E9E",
+"Q@    c #C0C0C0",
+"R@    c #FCFCFC",
+"S@    c #A9A9A9",
+"T@    c #CFCFCF",
+"U@    c #B0B0B0",
+"V@    c #0000EF",
+"W@    c #0000E9",
+"X@    c #000021",
+"Y@    c #00008E",
+"Z@    c #0000CE",
+"`@    c #681C1A",
+" #    c #6C6C6C",
+".#    c #D0D0D0",
+"+#    c #F6F6F6",
+"@#    c #727272",
+"##    c #B6B6B6",
+"$#    c #F3F3F3",
+"%#    c #0000EB",
+"&#    c #0000E7",
+"*#    c #000051",
+"=#    c #000068",
+"-#    c #0000E4",
+";#    c #8B8B8B",
+">#    c #979797",
+",#    c #E8E8E8",
+"'#    c #D3D3D3",
+")#    c #A0A0A0",
+"!#    c #FDFDFD",
+"~#    c #414141",
+"{#    c #0000EA",
+"]#    c #00006C",
+"^#    c #0000A0",
+"/#    c #000056",
+"(#    c #F5F5F5",
+"_#    c #7A7A7A",
+":#    c #F2F2F2",
+"<#    c #373737",
+"[#    c #0000D7",
+"}#    c #00007C",
+"|#    c #0000D6",
+"1#    c #AA423F",
+"2#    c #757575",
+"3#    c #C4C4C4",
+"4#    c #E0E0E0",
+"5#    c #7C7C7C",
+"6#    c #ACACAC",
+"7#    c #0000DA",
+"8#    c #00009D",
+"9#    c #000061",
+"0#    c #0000A6",
+"a#    c #000069",
+"b#    c #818181",
+"c#    c #A4A4A4",
+"d#    c #F0F0F0",
+"e#    c #CACACA",
+"f#    c #0000C4",
+"g#    c #747474",
+"h#    c #000060",
+"i#    c #0000C2",
+"j#    c #828282",
+"k#    c #DDDDDD",
+"l#    c #9A9A9A",
+"m#    c #B5B5B5",
+"n#    c #171717",
+"o#    c #000024",
+"p#    c #959595",
+"q#    c #B1B1B1",
+"r#    c #F1F1F1",
+"s#    c #CCCCCC",
+"t#    c #0000CF",
+"u#    c #BEBEBE",
+"v#    c #00005F",
+"w#    c #000002",
+"x#    c #0000BB",
+"y#    c #0000F9",
+"z#    c #BBBBBB",
+"A#    c #878787",
+"B#    c #B2B2B2",
+"C#    c #0000CB",
+"D#    c #0000E3",
+"E#    c #3C0F0F",
+"F#    c #110203",
+"G#    c #AC4441",
+"H#    c #808080",
+"I#    c #B7B7B7",
+"J#    c #0000DB",
+"K#    c #8E8E8E",
+"L#    c #BFBFBF",
+"M#    c #222222",
+"N#    c #00005D",
+"O#    c #0000F8",
+"P#    c #551815",
+"Q#    c #7D7D7D",
+"R#    c #A2A2A2",
+"S#    c #0000EC",
+"T#    c #545454",
+"U#    c #0000F3",
+"V#    c #0000F1",
+"W#    c #4F1311",
+"X#    c #00008C",
+"Y#    c #707070",
+"Z#    c #9D9D9D",
+"`#    c #00006F",
+" $    c #00009A",
+".$    c #5D5D5D",
+"+$    c #B8B8B8",
+"@$    c #000077",
+"#$    c #0000B3",
+"$$    c #000055",
+"%$    c #A33B3A",
+"&$    c #0000AA",
+"*$    c #6A6A6A",
+"=$    c #000082",
+"-$    c #430F0E",
+";$    c #4E4E4E",
+">$    c #000067",
+",$    c #676767",
+"'$    c #000094",
+")$    c #252525",
+"!$    c #686868",
+"~$    c #313131",
+"{$    c #000099",
+"]$    c #0000AF",
+"^$    c #000072",
+"/$    c #7B7B7B",
+"($    c #000014",
+"_$    c #4B4B4B",
+":$    c #1B1B1B",
+"<$    c #000053",
+"[$    c #541714",
+"}$    c #0000D4",
+"|$    c #0000C9",
+"1$    c #0000A9",
+"2$    c #636363",
+"3$    c #333333",
+"4$    c #000081",
+"5$    c #000070",
+"6$    c #000083",
+"7$    c #000062",
+"8$    c #370A09",
+"9$    c #00008D",
+"0$    c #0000CC",
+"a$    c #0000D9",
+"b$    c #0000AC",
+"c$    c #00007D",
+"d$    c #0000B8",
+"e$    c #000071",
+"f$    c #000095",
+"g$    c #00007E",
+"h$    c #000029",
+"i$    c #190407",
+"j$    c #000026",
+"k$    c #0000A8",
+"l$    c #5B5B5B",
+"m$    c #0000CA",
+"n$    c #00002F",
+"o$    c #0000B4",
+"p$    c #000046",
+"q$    c #1A1A1A",
+"r$    c #989898",
+"s$    c #D2D2D2",
+"t$    c #000098",
+"u$    c #0000C0",
+"v$    c #000073",
+"w$    c #4F4F4F",
+"x$    c #0000BD",
+"y$    c #0000B0",
+"z$    c #00003A",
+"A$    c #767676",
+"B$    c #2E2E2E",
+"C$    c #0000BE",
+"D$    c #0000CD",
+"E$    c #00004A",
+"F$    c #0000B1",
+"G$    c #0000BF",
+"H$    c #E4E4E4",
+"I$    c #ABABAB",
+"J$    c #0000DF",
+"K$    c #CBCBCB",
+"L$    c #A5A5A5",
+"M$    c #000038",
+"N$    c #0000A3",
+"O$    c #000032",
+"P$    c #000090",
+"Q$    c #232323",
+"R$    c #464646",
+"S$    c #484848",
+"T$    c #363636",
+"U$    c #646464",
+"V$    c #595959",
+"W$    c #00005C",
+"X$    c #080100",
+"Y$    c #0000C1",
+"Z$    c #C9C9C9",
+"`$    c #AAAAAA",
+" %    c #B4B4B4",
+".%    c #000005",
+"+%    c #6F6F6F",
+"@%    c #C5C5C5",
+"#%    c #D5D5D5",
+"$%    c #5E5E5E",
+"%%    c #0C0C0C",
+"&%    c #0A0301",
+"*%    c #00007A",
+"=%    c #EAEAEA",
+"-%    c #BCBCBC",
+";%    c #FBFBFB",
+">%    c #000023",
+",%    c #C3C3C3",
+"'%    c #606060",
+")%    c #4C1711",
+"!%    c #000065",
+"~%    c #0000AB",
+"{%    c #0000F2",
+"]%    c #FEFEFE",
+"^%    c #C1C1C1",
+"/%    c #0000B6",
+"(%    c #D4D4D4",
+"_%    c #EBEBEB",
+":%    c #3F3F3F",
+"<%    c #0000C7",
+"[%    c #000039",
+"}%    c #00009F",
+"|%    c #FFFFFF",
+"1%    c #E9E9E9",
+"2%    c #DADADA",
+"3%    c #0B0403",
+"4%    c #000076",
+"5%    c #00002A",
+"6%    c #00008F",
+"7%    c #000097",
+"8%    c #797979",
+"9%    c #000050",
+"0%    c #9B9B9B",
+"a%    c #000079",
+"b%    c #444444",
+"c%    c #E3E3E3",
+"d%    c #454545",
+"e%    c #00006A",
+"f%    c #0000A2",
+"g%    c #000058",
+"h%    c #000078",
+"i%    c #8A8A8A",
+"j%    c #393939",
+"k%    c #00004C",
+"l%    c #0000F4",
+"m%    c #0000B2",
+"n%    c #0000F0",
+"o%    c #000093",
+"p%    c #ADADAD",
+"q%    c #E7E7E7",
+"r%    c #535353",
+"s%    c #00004B",
+"t%    c #00006E",
+"u%    c #8D8D8D",
+"v%    c #868686",
+"w%    c #00008B",
+"x%    c #000089",
+"y%    c #0000A1",
+"z%    c #00001A",
+"A%    c #00007F",
+"B%    c #909090",
+"C%    c #EFEFEF",
+"D%    c #00005A",
+"E%    c #000011",
+"F%    c #A6A6A6",
+"G%    c #00000E",
+"H%    c #00004D",
+"I%    c #120304",
+"J%    c #D6D6D6",
+"K%    c #00006D",
+"L%    c #000074",
+"M%    c #A8A8A8",
+"N%    c #000045",
+"O%    c #B3B3B3",
+"P%    c #00005E",
+"Q%    c #000088",
+"R%    c #421410",
+"S%    c #000043",
+"T%    c #343434",
+"U%    c #3F110C",
+"V%    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+-+-+-+@+.+@+.+++;+>+,+'+)+M.s.!+!+< Q.| @.1 ~+{+]+^+u.. u.3 L L / ' /+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< (+j - l _+y :+r.G.O.P.#+.+-+-+@+<+@+<+[+}+-+}+-+-+@+.+;+|+1+2+3+4+M.q.i.!+h.X.~ e 5+^+6+7+R.$ 3 ! ' L > ) / M 8+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+@+=+-+}+[+9+}+}+}+}+<+}+[+-+}+0+a+b+3+c+d+e+M.s.i.{ < [ [ f+g+h+i+N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P..+.+-+<+[+9+}+9+9+j+k+k+}+9+9+}+}+}+l+m+n+o+p+q+r+F.M.f+s+t+h+u+v+w+x+7+@ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 (+k.v ' ^.d.m Q B.D.F.N.O.W..+=+=+[+}+9+k+y+k+k+j+k+y+y+z+k+}+9+n+A+B+c+C+D+E+O.N.F+G+H+h+I+J+K+6+L+@ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.N.W.W.@+-+<+}+j+k+j+j+y+M+N+z+z+k+M+z+y+k+k+O+P+Q+R+O+S+T+U+V+W+X+h+h+Y+Z+`+ @.@& + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.F.P.W..+.+-+<+}+9+j+y+k+z+M+M+N+N+N+N+N+z+M+M++@@@#@$@D+%@&@;+*@i+=@h+h+-@;@>@*@U+j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e ,@'@o.n L.h.i.F.N.P.++-+@+}+}+9+9+k+N+N+N+)@)@)@N+N+)@)@N+N+k+!@~@{@]@^@/@;+(@F+_@`+x+:@;@<@>@[@% j & N . * L ' / / , , > M M # : m 9.~.'@5 u 0.0                       ",
+"                      b / & N ,@}@F K.|@1@] M.F.E.W.++@+<+}+9+k+y+M+M+)@N+2@2@2@)@2@)@)@N+N+N+C+3@4@5@%@6@;+:@7@8@9@h+0@a@H+b@@.1 ].@ y.R.$ a a L ).> M , b b b M - R c@0 d@u $+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.#+-+-+}+k+k+k+z+M+)@2@N+N+e@2@e@2@2@e@N+N+f@g@h@i@R+j@k@l@*@m@n@h+o@0@t+h+p@v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.|@< { s.G.O.E.#+.+-+<+}+j+y+N+N+)@q@2@r@2@2@2@2@e@2@2@q@N+s@t@C+u@v@w@x@s+t+x+9@y@z@A@B@C@| f j & @ . u.3 ! a > > , , M O # # A D@6.c@w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.!+q.F.O.P.#+=+<+}+9+j+y+N+)@e@e@e@e@e@e@e@E@e@e@2@2@F@G@,+H@I@J@4@K@w+g+A@h+L@M@]+h+N@~ 1 e & N N $ a ).! / B B ; M b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.F.P.W.++-+<+9+k+k+M+M+)@e@e@E@E@E@E@E@e@E@E@2@e@O@P@Q@R@0+S@T@U@_@V@h+W@X@Y@Z@h+`+| e j % y.d R.L L / > > , B ; M O # M b M +.o `.u u w.`@0                 ",
+"                , = b L s +.9 9 7 g [ t.i.q.F.E..+@+-+<+}+j+k+M+)@)@2@e@e@e@E@e@E@E@e@e@E@2@ #d+.#+#r+@###$#r+h+%#&#*#=#;@]+-#| 1 j % @ + $ ! 3 L / B , B ; b M b M O A D@c@A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.] M.F.P.++.+-+<+k+9+y+M+)@)@e@E@E@E@E@E@E@E@E@E@e@e@;#>#,#J@'#P+)#!#~#h+{#s+N.]#^#&#%#/#1 f j y.+ R.3 3 / > , B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n._+<.r | !+!+q.F.O..+.+-+[+k+}+y+y+)@q@e@e@e@E@e@E@e@E@e@E@E@!@m+p+(#o+##_#U@:#<#_@[#P.F.}#p@|#h+M@@.f j N + u.! $ ! )., B , , b ; O # O A ^ d@'.l ..6 U o +.              ",
+"              > 6 b > 5 1#o.9 0.1 v } { ] i.G.P.P.@+-+@+}+k+j+y+)@q@e@e@E@E@e@E@E@E@e@e@e@2#S+3#!#4#w@5#6#(#0+7#8#O.N.9#0#i+h+a#v % % y.N + 3 L / / > , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| v Q.k.!+i.s.O.E.++-+<+}+9+y+y+N+q@r@e@e@E@E@e@E@E@E@E@e@b#c#o+d#e#f#g#)#,#0+F+W.P.F.h#i# @h+(+v f % y.+ R.3 3 * / B , , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ } { ] s.M.E.P..+@+@+}+9+k+M+N+q@e@E@e@E@e@E@e@E@E@e@2@j#6#k#Q@l#`+/@)#m#n#o#P.F.M.K@w+h+`+| 1 e j ].R.. 3 3 ' > > B M M ; ; b # A b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E _+& f Y.Q.t.i.r.M.O.O.++-+-+9+}+j+f@N+e@e@e@E@e@E@E@E@e@e@e@E@p#q#r#s#t#W@j@u#u#v#++E.O.w#x#_@y#;@e j e N @ u.$ ! 3 L / , , , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.d@..>.L.j j v } k.!+!+M.O.P.++.+-+<+}+k+z+M+f@q@E@e@E@e@E@e@E@e@2@ #m+z#d#_@<@9@A#B#i@=+#+P.F.p@C#D#]+[ Y.f & % + + R.a a ' > > B M O M M b b O M # M b U E I.>.E#F#F#            ",
+"          ].G#= ( u C d._+T N @ f v [ } j.i.s.F.O.#+.+-+-+}+k+j+z+f@N+e@e@e@e@e@E@e@e@q@H#m+I#'+n@J#9@K#L#z#M#W.E.N#x#K+O#*@~ e H.j y.+ $ u.* a / > , , , b # ; M M O b O # O d@p W =.Y X E#x           ",
+"          $ n H V `@u _ _+P#N N ].@.[ P h.] s.F.O.P.++=+-+}+}+9+M+z+z+M+q@q@e@e@e@e@e@e@Q#R##@i+{+S#A@H#I#)+T#O.M.-@C#U#V#Q.r | j ].& R.R.! ! > )./ B B M , b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l W#X &.-.p j + % @.(+< k.i.r.G.F.O.W.++++-+[+}+k+y+z+z+N+q@q@N+q@f@f@N+D+c#X#7#x+X+s+Y#A+Z#b#O.X@F+7#h+s+| ~ 1 j ].& . u.3 3 * )., , , M M O O O b O b M M b w D D 0 A.E W#o           ",
+"          > ! < < e d@J.&.` N u.& 1 [ X.} { !+q.M.P.P.#+++-+-+[+}+}+k+M+z+z+z+f@f@f@f@M+R#`#J#h+h+^+ $.$H#+$G@F.@$#$8@]+$$[ @.% ].& d R.. a ! * / > B B # ; b b O M O M b b O b o.T.%$w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.G.O.W.E..+@+-+[+<+}+k+k+k+z+z+z+j+y+k+A+7#D#=@=@M@&$~#*$,+K#l+=$K@W+7#h#v e j % @ + u.$ a ! > / , , B O ; B M O b O O O O O b ..$+0.z n.-$J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 | [ X.t.!+!+M.F.O.P.W.++@+-+-+[+}+}+j+}+k+k+k+}+;$>$V@U#H+,$.@'$7@)$;$!$~${$]$a@%#^$@.f & & y.. $ 3 * / / B B M ; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @.~ X.< i.i.] M.F.O.W.W..+.+@+-+<+<+}+<+}+-+9+}+/$0@w+A@6+a@-@($w@_$;$T#:$<$X#7+L+e 1 e @ N y.R.3 3 3 L / > B B b O # O b O b ^ M b A # b `.k 0.U E G E#          ",
+"          ( @.1 ).: 4 z `@[$#.$ + @ f e 1 (+} < h.!+q.M.F.O.P.E.#+++.+@+-+-+@+-+@+-+-+M#s+}$h+|$1$Y+s@p#Y#2$3$4$5$6$}#7$@.f @ & @ . $ 3 ! * > > , , , , b b M M O M b b # b O O ~...c.`.o q 8$          ",
+"          - 1 $ b # w o.n.P##.L u.y.& H.1 ~ [ < t.{ i.s.M.F.F.O.W.W.W.#+#+-+=+-+.+.+@+9$0$a$h+_@0@N@5#'+x@X+}$W+b$c$]#r f j ].@ N R.$ a ! ! / B B M M M B O O b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 P#$ L . + y.].H.1 (+| < t.{ i.] q.M.F.O.E.P.P.W.W.++W..+#+W.1$Z@W@h+d$e$@@)#A#;@f$a@g$N@h$@.H.j ].N y.R.$ a )./ / B , , , O # O b O M O A M O A M O ^ ~.$+0.U n.8$i$          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v (+[ < t.j.!+i.s.s.F.F.F.E.N.E.P.P.P.P.j$-#n@U#y#k$y@l$a+S@0$m$n$k.} ~ 1 j & % N . R.L L 3 * / > M B ; M # ; b O b # ^ b # O b M a.'.~.!.c@E#X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v (+[ } h.t.{ i.] s.q.M.M.F.F.O.F.O.O.{$8@W@]+J#o$p$q$r$s$b@a@t$} } (+1 ].].& + u.3 3 ! L / > B , , M b b A M O M b b # b O M O d.8+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.c@8 2.' ' u.u.d @ ].].j 1 e | (+} P j.i.!+!+i.i.G.s.M.M.M.M.u$9@V#h+W@v$w$3$!@3+x$x+t#~ ~ ~ e j y.y.. $ ! L ' > / , B M b , M O O b O M M A M b # b ^ %$I.o.>.q 7.X i$          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } t.P i.i.] ] i.] s.] r.r.C#B@9@h+y$z$0+A$B$L#C$H+|#r 1 H.@.& @ @ & j ].+ R.R.3 L , > ; A ; b O M O O O O O M M ; b 0 x.'.E W#8$Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.@ ].].j 1 1 @.~ (+[ ~ } t.k.k.{ !+{ { { D$|#x+X+W+E$G@~@u+Q+1$ @F$v e e @.e j y.u.* L L / B > > a * , O ; b O b O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d D@9.o x.4.B > / L L $ . d @ & ].& e e e v (+(+~ } X.< < h.< < h.G$a$h+h+|$H$2+_$f#I$C$h+W+H.1 f ~ H.$ $ ! L / / )., , , A B 3 > A M O M b b ; b O ; O # b 1#Z.o P#E#8$X E#          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & & ].% H.1 @.@.~ ~ (+| Q.X.r ~ ;@J$h+;@M@K$d+Z@n$L$B@6+k$f @.r f % R.a + . ! / > B B ; # O b / / b O M M A M b M b # B # _ E o.n.-.8$Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.@ & j & f f 1 H.H.v r e @.@.M$a@7#x+G+W+a$J#N$a+O$>@<@P$g e & v & . + a 3 3 ' > , , M O M # M B * M O O O O M O ; M O : ~.c@>.n.J.7.i$9           ",
+"          3 2 u.M 0.+.$+_ D o.b.M / / ' ! 3 L $ u.. R.y.y.@ ].].% j % % f 1 e 1 1 4$0$w+{+7@Z@'$J$=#^@Y+n@|$Q$& R.R$S$T$U$V$W$L L / > > b M b M b O O , , O b O O b M b , A : 0  .T 8 E#i$X$U           ",
+"            c = 2 8+U d@_ A.t C ; > > / * L ! L ! u.$ + @ y.N @ & ].j j & f j & ]. $Y$m@h+i+X+F$b$Z$.$a#t+~+c#w$H@w@`$ %B#2+y$> / )./ / / b ; O # O O b * b ; b O M O B b s d@T.7 n.-.J X$Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! u.L $ . y.R.+ N @ y.@ & & % & & V+a$X+[#}$W+.%u$V++%G@#$z@@%6#I@1+B#Z$#%4@$%%%> > > > , M b A b M M A > > M b # b ; B : z.T.F z [$` Z &%7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * * L u.L ! $ $ . y.@ y.+ @ @ d d 6$t+9@<@G+g$#%*%z$[@6$n@_@=%-%;%u@%@>%B#,%G@/$'%.$, , B ^ # O M b O O O ).# M M ; M # C %$9.,.E m.7.Z F#)%            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ' ).L a 3 3 3 $ $ . u.R.. R.. R.M@{#h+t+o$!%3+y@Y+4$~%J${%F+T@!#]%u#S@I@^%,#P@B++%> , B A b O O O b O O B , b M M M O 5 0 I.o 9 m.&.F#Y               ",
+"              1#/.U I.'.D c.m 8.o.M O M B B , B > / / ' ).3 3 a u.u.L ! 3 u.$ u.{$m$ @h+D#/%o#Z+L+k$u${+9@O#m${#(% #,$H+I$_%3+)+R+4+A$:%, O # O M b # M O ; L ; # , # : d.Z.E T 9 n.J &%J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > B / / > / > ).* L a ! L u.L 3 <%A@9@^+n@[%0@/%_@ @=@h+h+U#V#h+}$}%~%m$D+)#3#$#|%1%2%^@3@A b O M A b b A O 3 M M M M b.c.9 n.P#V E#i$3%-.              ",
+"                m 8+F A.t -.E#-.E#x.M M # # B , , , > B , * )./ * ' > / ' * ! 4%J#h+6+t#5%6%7%C$<@h+h+h+h+h+7#5+:@#$1$L+>$8%S@=%3+'#c+]@a+j@U+b O O O M # # ! O , ; O w 8 8.9 P#E#X X$i$                ",
+"                1#>.7.i$=.V /.'.9 q s A A O O M B , , B , B B , / ).* / > * 9%0#K+A@-#[%6%M@|$`+y#h+h+h+U#w++$0%x#[#a${#i#a%b%+@B#|%:#m+H$c%u@O b # O b M b u.M M ; b /+S m.9 J.8$i$X$*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B > , , > / 6$*@m$B@6+*#X#|$8@]+h+H+=@h+-#x$@$c#L#~$a@J#'$/%x#$$;+d%H#+$c#2+-%Z$I$k@A M B b B u., , M M 7 p K F#3%i$&%X$9                 ",
+"                  0.l '@( / : k z T V 6 M b , # b O O O B B , , B B , e%'$f%N$m$h+`+g%J+[#t+h+h+h+y#>@8#6$,%;#8%h%0#/%]+h+H+t#;+;+F@*$P@i%,%j%u@L$'%# ; ; M $ B B M ^.;.x.~.[$Y X$X$i$                  ",
+"                    +.x z.c k $+~.c@p  .5 O A b M # M # O O O M I+k%W$f+6%5+B@l%%#Y+^#m%u$V#n%h+h+V@~%W+o%^@2$b # }#/%h+J$[#x+X#;+;+;+U$I@p%6#q%g#p%r%M B / 3 , , ^ Z.V 8.o.9 *.F#X$                    ",
+"                    0 ~...9.7 F T.`@p 9 _+O M O b O M # # s%N@p$8#o$p@0@8#^#f+G+.@&$;@n@h+`#J+B@X+*@t%u%v%n+M M A b h%8#J$h+h+C#*#~#n+# .$C+i@.$B#C+# B B ).).M A A.;.9 c@n.&.i$X$J                     ",
+"                      F I.8 8 9 9 J.P#T z z C O M b b A M Y@t$p@w%x%'$f%b$1$y%5%f%{#a@f%w%z%m%t+g$9#1+,+b#F@O b b # b A%/%8@i#Y$A@I$# A O e+1+ %l#B%C%, , ).M C 8+J.J.9 p I F#X$F#                      ",
+"                      u n.)%q m.c@o.I.8 p T G#C M O b b b ;+`#0#M@6%8#J+!%L@9#y%|$|$D% @>$[#t$#$3+ #A+6#I$/ > # A # b /#5+-#~%{%y#m$b O M M b !$b#, M > ) ) 5 n V 9 9 W#I Z &%X$7.                      ",
+"                        ,.E#E#8 n e.T.J.8.Z.7 f.w O # # M ;+^+{#l%-#N$6%h%.@6%x#x$}$-#h+D$J$a#[@q+b+c#I@*$M ' A O A # O x@p@7%m$y#^+# M # O B M , B , M ^.3.m [$E 7 9 K Z X$X$i$                        ",
+"                        d@c@n.o k 4 z J.F m U 8+'@z.A ^ ;+h+h+h+h+`+J#C$|$f#C$&#x+h+Z@K@A@<%E%=%+@F% %Y#b b , / b M O M G%f$/%7@1${+b # b ; , M , B ' ^.z.o.n.Z.l A.)%Z i$F#i$q                         ",
+"                          ..c@8 U u I.`@k 2 u U R m - b ;+h+{#h+6+V#]+9@{%%#J$S#O#h+h+X+]$t%,#4#c#o+,+~#; # O ).> O b O O 7$#$f#D$b$H%M > B B , A ^.^.c ~.`@o.U m z E#I%F#F#`                           ",
+"                            l R o z 9 V k 4 4 k 9.8._+C h+h+h+h+h+W@ @B@_@%#x+y#%# @t+>@f$##J%{@$@{@/@A O b b O / * O b b ; 8#k$K%<%Y@B , , B B M ^.u S R l 0.$+o.q X &%Z J                             ",
+"                              9.T p -.W 9.G#C 5 n E S 8+H+D#H+{#h+h+A@|#i#a$n@U#X+7@L%>$d+m#6#U@M%A$2$O A M M M b B 3 > B b N#&$M@w%B , M M ^ ' b.~.J.x.m $+..~.G I X$X$Y                               ",
+"                                o J.-$&.p u C s _ o.S J.S 5 O x#L+0#F$_@0$W+G$y$0$*%N%v%A+)+m#O%g@!@b b O O ^ M O O , * ! > P%Q%e%, B , , ,@A ^./.R%E n m w.A.T *.X$X$F#                                ",
+"                                0.8 E#8$-$U d.( 1#I.J.T W 8.Z.C : A *@^#Y@p@Z@Z@]$S%B#>#1+I@j#A#@#T%; # O O b O ; b O O > / / ! a * ) ' B ,@z.%.-.J.T.6 A.9.8 7.Z F#F#U%                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ ^ # M O q#6#B%j#a+j@S+S+w$M M b b , ; M M B ; B B > , B > ).> > D@..W#m.W [$..6 ~.V K F#I%Z 8$                                  ",
+"                                    `.m.X *.8$8 >.P#n.=.V : 0 U >.n.0.d.C : # b M b # b # M O O O O O B M M M O , , B , , > B > / ' M b.m.V R J.q 7 U `@W J Z F#Z E#                                    ",
+"                                      ..n.` i$7.q H E#3%u B 4 5 0.~.E V k G#b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.`@`@>.W I i$X$F#Y H                                       ",
+"                                          9 7.i$&.&.Z i$^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , _+Z.p z E#9 n c@-.W 7.i$X$X$F#Z                                           ",
+"                                            >.*.I J 3%7...1#z._ ( O w _ 0.~.I.8 [$-.8+8+l G#^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 8$F q 8$I Z X$X$X$X                                             ",
+"                                              o 7.i$X$U%P#E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.8+7 8.8.Z.o o.l /.f._ 6 d@l J J.7.J F#X$&%X$I                                               ",
+"                                                l U%F#*.7.q 9 T.!.u 0.G#C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.8+w.~.l D k 1#d@z.n 9.~.T.Z Z I%F#i$F#Z `                                                 ",
+"                                                    n.E#K ` U%-.[$`@E n G#( G#0.o.9.9.'.>.R I.U F o.o.$+k k u 1#'@D +./.2 x u +.`@[$J.&.&%&%F#i$Z K                                                     ",
+"                                                        p &.J J 7.E#W#n. .U U z >.c@I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U c@V%U%K Z &%X$F#X$J                                                         ",
+"                                                            J.I i$X J *.E#q W#E#E#W q `@c@`@>.o 8 ~.w.U U D k ..o.8.8.T [$-.7.J i$Z I%X$X$J                                                             ",
+"                                                                G K i$i$X X J i$I J =.&.&.E#p G -$U%E#H [$n.n.G q E#&.I X i$F#F#X$F#i$X                                                                 ",
+"                                                                    >.R%=.i$I%F#X$F#F#i$Z =.K J i$i$Z J I =.i$Z Y i$i$I%F#F#F#F#J E#                                                                    ",
+"                                                                          8 -$*.Z &%X$F#F#Z 3%X$3%3%3%I%i$Y X$Z F#F#Z F#X I E#                                                                          ",
+"                                                                                  8 -.&.*.X Z F#3%F#I%I%F#I%i$X ` E#-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.bmp
new file mode 100644 (file)
index 0000000..714b3bf
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Params.xpm
new file mode 100644 (file)
index 0000000..07ced31
--- /dev/null
@@ -0,0 +1,406 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_Params_xpm[] = {
+"100 100 303 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #EE8C8A",
+">+    c #B44A47",
+",+    c #E6787C",
+"'+    c #7E3030",
+")+    c #6D3435",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #FDC6C6",
+"/+    c #FBCCC9",
+"(+    c #FBCED1",
+"_+    c #F9D3D3",
+":+    c #FDCECB",
+"<+    c #FAD4D5",
+"[+    c #FBDCDB",
+"}+    c #C35959",
+"|+    c #9E3E39",
+"1+    c #FDDEDD",
+"2+    c #AB4A49",
+"3+    c #984E4E",
+"4+    c #D98182",
+"5+    c #FBE6E9",
+"6+    c #712421",
+"7+    c #B24243",
+"8+    c #FBE4E1",
+"9+    c #FED8D9",
+"0+    c #FEDFDE",
+"a+    c #FDE8EB",
+"b+    c #BF4D4D",
+"c+    c #FFEAED",
+"d+    c #681C1A",
+"e+    c #AA423F",
+"f+    c #996666",
+"g+    c #666699",
+"h+    c #666666",
+"i+    c #996699",
+"j+    c #000000",
+"k+    c #DC8283",
+"l+    c #FFFFFF",
+"m+    c #DD9392",
+"n+    c #D5776D",
+"o+    c #9D9494",
+"p+    c #D56D6F",
+"q+    c #669999",
+"r+    c #999999",
+"s+    c #D26F6E",
+"t+    c #3C0F0F",
+"u+    c #110203",
+"v+    c #AC4441",
+"w+    c #999966",
+"x+    c #CCCCCC",
+"y+    c #551815",
+"z+    c #9999CC",
+"A+    c #D06B6A",
+"B+    c #4F1311",
+"C+    c #D16264",
+"D+    c #CCCC99",
+"E+    c #CE6564",
+"F+    c #A33B3A",
+"G+    c #D26364",
+"H+    c #430F0E",
+"I+    c #660000",
+"J+    c #CD6A68",
+"K+    c #D37675",
+"L+    c #541714",
+"M+    c #D3696A",
+"N+    c #370A09",
+"O+    c #333333",
+"P+    c #990000",
+"Q+    c #CD6968",
+"R+    c #FFFFCC",
+"S+    c #336666",
+"T+    c #CE6467",
+"U+    c #190407",
+"V+    c #663366",
+"W+    c #CE6D6C",
+"X+    c #CE6563",
+"Y+    c #D27877",
+"Z+    c #669966",
+"`+    c #D67678",
+" @    c #FFCC00",
+".@    c #FF6600",
+"+@    c #CC6600",
+"@@    c #CC9999",
+"#@    c #99CCCC",
+"$@    c #CC99CC",
+"%@    c #CD6E6E",
+"&@    c #FFCC99",
+"*@    c #333366",
+"=@    c #D87273",
+"-@    c #336633",
+";@    c #663333",
+">@    c #CB5A5D",
+",@    c #080100",
+"'@    c #99CC99",
+")@    c #CB6260",
+"!@    c #0A0301",
+"~@    c #CC5F61",
+"{@    c #4C1711",
+"]@    c #666633",
+"^@    c #CE645B",
+"/@    c #0B0403",
+"(@    c #CC3300",
+"_@    c #120304",
+":@    c #421410",
+"<@    c #3F110C",
+"[@    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+-+-+-+@+.+@+.+++.+W.P.O.F.M.s.;+;+< Q.| @.1 j & y.y.u.. u.3 L L / ' >+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< ,+j - l '+y )+r.G.O.P.#+.+-+-+@+!+@+!+~+{+-+{+-+-+@+.+@+@+.+P.O.F.M.q.i.;+h.X.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+@+=+-+{+~+^+{+{+{+{+!+{+~+-+{+-+@+.+.+P.O.F.M.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P..+.+-+!+~+^+{+^+^+/+(+(+{+^+^+{+{+{+-+-+@+=+.+P.O.F.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 ,+k.v ' ^.d.m Q B.D.F.N.O.W..+=+=+~+{+^+(+_+(+(+/+(+_+_+:+(+{+^+{+~+-+@+.+++P.O.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.N.W.W.@+-+!+{+/+(+/+/+_+<+[+:+:+(+<+:+_+(+(+/+{+{+@+=+.+++P.P.G.s.;+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.F.P.W..+.+-+!+{+^+/+_+(+:+<+<+[+[+[+[+[+:+<+<+/+/+^+{+-+-+=+W.F.N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e }+|+o.n L.h.i.F.N.P.++-+@+{+{+^+^+(+[+[+[+1+1+1+[+[+1+1+[+[+(+(+^+^+{+{+-+=+.+O.O.F.q.i.h.X.| e % j & N . * L ' / / , , > M M # : m 9.~.|+5 u 0.0                       ",
+"                      b / & N }+2+F K.3+4+] M.F.E.W.++@+!+{+^+(+_+<+<+1+[+5+5+5+1+5+1+1+[+[+[+_+_+(+^+{+@+-+W.++O.F.i.{ k.Q.~ @.1 ].@ y.R.$ a a L ).> M , b b b M - R 6+0 7+u $+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.#+-+-+{+(+(+(+:+<+1+5+[+[+8+5+8+5+5+8+[+[+9+(+_+(+{+^+!+@+.+W.O.O.F.i.{ } ~ v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.3+< { s.G.O.E.#+.+-+!+{+/+_+[+[+1+0+5+a+5+5+5+5+8+5+5+0+[+[+_+_+(+^+~+-+=+.+P.E.F.s.{ h.[ | f j & @ . u.3 ! a > > , , M O # # A b+6.6+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.;+q.F.O.P.#+=+!+{+^+/+_+[+1+8+8+8+8+8+8+8+c+8+8+5+5+8+[+<+:+_+/+{+!+-+.+P.E.G.] j.k.X.~ 1 e & N N $ a ).! / B B ; M b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.F.P.W.++-+!+^+(+(+<+<+1+8+8+c+c+c+c+c+8+c+c+5+8+0+[+<+<+(+^+{+~+@+-+P.F.M.G.;+P Q.| e j % y.d R.L L / > > , B ; M O # M b M +.o `.u u w.d+0                 ",
+"                , = b L s +.9 9 7 g [ t.i.q.F.E..+@+-+!+{+/+(+<+1+1+5+8+8+8+c+8+c+c+8+8+c+5+0+[+[+:+(+(+{+!+=+=+W.O.i.G.;+k.Q.| 1 j % @ + $ ! 3 L / B , B ; b M b M O A b+6+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.] M.F.P.++.+-+!+(+^+_+<+1+1+8+c+c+c+c+c+c+c+c+c+8+8+5+8+[+[+_+/+{+{+-+.+#+O.N.i.] t.Q.~ 1 f j y.+ R.3 3 / > , B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.'+<.r | ;+;+q.F.O..+.+-+~+(+{+_+_+1+0+8+8+8+c+8+c+8+c+8+c+c+8+0+1+1+(+(+(+{+!+-+.+#+P.F.s.] t.X.,+@.f j N + u.! $ ! )., B , , b ; O # O A ^ 7+'.l ..6 U o +.              ",
+"              > 6 b > 5 e+o.9 0.1 v } { ] i.G.P.P.@+-+@+{+(+/+_+1+0+8+8+c+c+8+c+c+c+8+8+8+5+5+1+[+:+(+/+^+!+@+@+++O.N.i.;+k.Q.~ v % % y.N + 3 L / / > , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| v Q.k.;+i.s.O.E.++-+!+{+^+_+_+[+0+a+8+8+c+c+8+c+c+c+c+8+8+5+1+f+g+f+g+f+h+i+h+i+h+i+h+i+h+i+h+i+h+i+h+i+h+i+h+j+k+B , , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ } { ] s.M.E.P..+@+@+{+^+(+<+[+0+8+c+8+c+8+c+8+c+c+8+5+8+[+1+h+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+j+m+n+B M M ; ; b # A b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E '+& f Y.Q.t.i.r.M.O.O.++-+-+^+{+/+9+[+8+8+8+c+8+c+c+c+8+8+8+c+8+1+[+i+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+j+o+p+, , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.7+..>.L.j j v } k.;+;+M.O.P.++.+-+!+{+(+:+<+9+0+c+8+c+8+c+8+c+8+5+8+[+1+_+q+l+l+j+j+j+j+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+j+r+s+B M O M M b b O M # M b U E I.>.t+u+u+            ",
+"          ].v+= ( u C d.'+T N @ f v [ } j.i.s.F.O.#+.+-+-+{+(+/+:+9+[+8+8+8+8+8+c+8+8+0+5+1+<+<+f+l+l+j+l+l+j+l+j+r+j+r+j+r+j+w+j+r+j+r+j+w+l+x+j+r+p+, , b # ; M M O b O # O 7+p W =.Y X t+x           ",
+"          $ n H V d+u _ '+y+N N ].@.[ P h.] s.F.O.P.++=+-+{+{+^+<+:+:+<+0+0+8+8+8+8+8+8+:+<+_+_+h+l+l+j+l+l+j+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+z+l+j+r+A+B M , b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l B+X &.-.p j + % @.,+< k.i.r.G.F.O.W.++++-+~+{+(+_+:+:+[+0+0+[+0+9+9+[+[+<+:+(+f+l+l+j+j+j+j+l+l+l+l+l+l+l+l+l+l+l+l+l+l+x+l+x+j+r+C+, M M O O O b O b M M b w D D 0 A.E B+o           ",
+"          > ! < < e 7+J.&.` N u.& 1 [ X.} { ;+q.M.P.P.#+++-+-+~+{+{+(+<+:+:+:+9+9+9+9+<+_+/+(+/+h+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+z+l+D+l+j+r+E+B # ; b b O M O M b b O b o.T.F+w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.G.O.W.E..+@+-+~+!+{+(+(+(+:+:+:+/+_+(+^+{+~+{+w+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+x+l+x+l+x+j+r+G+B O ; B M O b O O O O O b ..$+0.z n.H+J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 | [ X.t.;+;+M.F.O.P.W.++@+-+-+~+{+{+/+{+(+(+(+{+{+(+{+{+!+h+l+l+j+j+j+j+l+l+l+l+I+l+l+l+l+l+l+z+l+D+l+z+l+j+r+J+; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @.~ X.< i.i.] M.F.O.W.W..+.+@+-+!+!+{+!+{+-+^+{+-+{+-+-+.+f+l+l+j+l+l+j+l+j+r+I+r+j+h+j+g+j+w+j+w+j+r+l+D+j+r+K+b O # O b O b ^ M b A # b `.k 0.U E G t+          ",
+"          ( @.1 ).: 4 z d+L+#.$ + @ f e 1 ,+} < h.;+q.M.F.O.P.E.#+++.+@+-+-+@+-+@+-+-+-+-+-+@+++g+l+l+j+l+l+j+l+l+I+l+l+l+l+l+l+x+l+x+l+z+l+x+l+j+r+M+, b b M M O M b b # b O O ~...c.`.o q N+          ",
+"          - 1 $ b # w o.n.y+#.L u.y.& H.1 ~ [ < t.{ i.s.M.F.F.O.W.W.W.h+h+f+O+-+.+.+@+.+.+++++++r+l+l+j+j+j+j+l+P+l+l+l+l+l+l+x+l+z+l+x+l+D+l+x+j+r+Q+M B O O b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 y+$ L . + y.].H.1 ,+| < t.{ i.] q.M.F.O.E.h+R+x+r+S+j+.+#+W.W.W.P.W.O.g+l+l+I+l+l+l+I+r+l+l+l+l+l+x+l+D+l+x+l+x+l+z+l+j+r+T+# O b O M O A M O A M O ^ ~.$+0.U n.N+U+          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v ,+[ < t.j.;+i.s.s.F.h+l+l+l+x+r+V+j+P.P.P.O.O.O.O.f+l+I+P+I+l+P+I+l+l+l+l+l+x+l+z+l+x+l+r+l+x+l+x+j+r+W+# ; b O b # ^ b # O b M a.'.~.!.6+t+X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v ,+[ } h.t.{ i.] s.h+x+l+l+x+r+h+j+O.O.F.F.G.F.M.h+l+l+P+I+P+I+f+l+l+l+l+x+l+D+l+x+l+x+l+x+l+D+l+j+r+X+b A M O M b b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.6+8 2.' ' u.u.d @ ].].j 1 e | ,+} P j.i.;+r+r+x+l+x+r+O+j+M.G.M.s.r.] i.f+l+l+j+P+I+P+l+j+q+j+h+j+h+j+g+j+h+j+h+j+g+l+x+j+r+Y+O O b O M M A M b # b ^ F+I.o.>.q 7.X U+          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } t.P i.h+h+r+r+r+h+O+j+r.i.] i.i.{ k.Z+l+l+j+l+I+j+l+l+l+x+l+x+l+x+l+x+l+x+l+x+l+D+l+j+r+`+b O M O O O O O M M ; b 0 x.'.E B+N+Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.@ ].].j 1 1 @.~ ,+[ h+ @h+h+h+O+h+h+{ { j.h.< h.h.< i+l+l+j+j+j+j+l+l+x+l+x+l+x+l+x+l+x+l+x+l+x+l+x+j+r+`+b O b O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d b+9.o x.4.B > / L L $ . d @ & ].& e e e v r+x+ @.@h+h+g+h++@O+O+< k.k.| ,+[ g+l+l+l+l+l+l+l+x+l+@@l+#@l+@@l+#@l+@@l+#@l+$@l+j+r+%@M O M b b ; b O ; O # b e+Z.o y+t+N+X t+          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & & ].% H.r+&@l+l+.@.@.@+@+@+@ @*@~ ~ Q.~ v f+l+l+l+l+l+l+x+l+#@l+x+l+x+l+x+l+D+l+x+l+D+l+#@j+r+=@b O M M A M b M b # B # _ E o.n.-.N+Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.@ & j & r+&@R+R+l+l+ @ @ @ @.@-@,+e @.1 1 Z+l+l+l+l+l+x+l+@@l+x+l+@@l+#@l+$@l+#@l+$@l+x+l+j+r+A+* M O O O O M O ; M O : ~.6+>.n.J.7.U+9           ",
+"          3 2 u.M 0.+.$+_ D o.b.M / / ' ! 3 L $ u.. R.y.y.@ ].r+&@&@&@R+R+l+R+ @.@+@;@@.H.j f ].f+l+l+l+l+x+l+#@l+x+l+#@l+x+l+D+l+x+l+D+l+#@l+@@j+r+>@, , O b O O b M b , A : 0  .T 8 t+U+,@U           ",
+"            c = 2 ]+U 7+_ A.t C ; > > / * L ! L ! u.$ + @ y.N r+&@ @&@&@&@R+R+.@.@+@S+j ].].].& g+l+l+l+x+l+@@l+x+l+@@l+x+l+$@l+#@l+$@l+x+l+x+l+j+r+T+b * b ; b O M O B b s 7+T.7 n.-.J ,@Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! u.L $ . y.R.r+&@ @ @&@&@&@&@.@.@+@O+& & @ y.@ i+l+l+x+l+#@l+x+l+#@l+x+l+'@l+x+l+D+l+#@l+@@l+x+j+r+)@A > > M b # b ; B : z.T.F z L+` Z !@7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * * L u.L ! $ r+&@ @ @ @&@&@&@.@+@+@*@d d N + R.g+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+r+~@O O ).# M M ; M # C F+9.,.E m.7.Z u+{@            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ' ).L a 3 3 r+&@ @ @ @ @ @&@.@+@+@]@. R.u.$ $ u.L r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+z+^@O O B , b M M M O 5 0 I.o 9 m.&.u+Y               ",
+"              e+/.U I.'.D c.m 8.o.M O M B B , B > / / ' ).3 3 r+&@ @ @ @ @ @ @.@+@+@O+u.$ ! u.a ' L * L u.* L / ! ' > / B B M # # , , > , O # O M b # M O ; L ; # , # : d.Z.E T 9 n.J !@J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > B / / > / > ).r+&@ @ @ @ @ @.@+@+@*@a a * 3 a L * ' L R.> > , / a > / , , M M B B , B B A b O M A b b A O 3 M M M M b.c.9 n.y+V t+U+/@-.              ",
+"                m ]+F A.t -.t+-.t+x.M M # # B , , , > B , * )./ r+&@ @ @ @ @ @.@(@O+' * ).' ' )./ / / / . , , B > B / > B M , ; , , B , ; O M b O O O M # # ! O , ; O w 8 8.9 y+t+X ,@U+                ",
+"                e+>.7.U+=.V /.'.9 q s A A O O M B , , B , B B , r+&@ @I+ @ @ @P+(@]@> > / / > > > ).B B u.B , , B )./ > , B B B B , B B b O M O b # O b M b u.M M ; b >+S m.9 J.N+U+,@*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B r+&@ @P+ @ @I+P++@*@/ / ).> , , , , , B . , B M ; b B , > , , , , B , b # O O b # A M B b B u., , M M 7 p K u+/@U+!@,@9                 ",
+"                  0.l |+( / : k z T V 6 M b , # b O O O B B , , r+&@ @P+ @ @.@.@+@O+> , , > B B B B , M ! b b # M O O , B B B B , M M A b O M A b b # ; ; M $ B B M ^.;.x.~.L+Y ,@,@U+                  ",
+"                    +.x z.c k $+~.6+p  .5 O A b M # M # O O O M , , M , , B B B , , , B B , , , B # O # L , B b # # A ^ O O b O A b O O M b O O ; ; O M B / 3 , , ^ Z.V 8.o.9 *.u+,@                    ",
+"                    0 ~...9.7 F T.d+p 9 '+O M O b O M # # M b O A b M M ; # ; M M M # # M M M b M M b # > , M M A b M O O # M O O O b # M O b M M M # B B ).).M A A.;.9 6+n.&.U+,@J                     ",
+"                      F I.8 8 9 9 J.y+T z z C O M b b A M O ; M b ; O b M M M b O O M b O O O ; # b B b B > O b b # b M b A ^ O M b # A O b ; O O b B , , ).M C ]+J.J.9 p I u+,@u+                      ",
+"                      u n.{@q m.6+o.I.8 p T v+C M O b b b M b ; M b , O O O ; M O b B M O O M O ; O M O O / > # A # b M O b b O M A b O M M b , B , M > ) ) 5 n V 9 9 B+I Z !@,@7.                      ",
+"                        ,.t+t+8 n e.T.J.8.Z.7 f.w O # # M ^ # A O # ^ b O O A O M # O b b b O b A O O O O M ' A O A # O b ; M b O O # M # O B M , B , M ^.3.m L+E 7 9 K Z ,@,@U+                        ",
+"                        7+6+n.o k 4 z J.F m U ]+|+z.A ^ b M O b A M # b b # b b A O # M M b M b b O O b b b , / b M O M A O # O b M b # b ; , M , B ' ^.z.o.n.Z.l A.{@Z U+u+U+q                         ",
+"                          ..6+8 U u I.d+k 2 u U R m - b M O b M O b A M M b M ; b b A O O M O # M b b M ; # O ).> O b O O O A b ; O ; M > B B , A ^.^.c ~.d+o.U m z t+_@u+u+`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.'+C b # O b # O O O M O A # M O O O O O A O M M O A O b b O / * O b b ; M M b M ; B , , B B M ^.u S R l 0.$+o.q X !@Z J                             ",
+"                              9.T p -.W 9.v+C 5 n E S ]+A A b M M b O O O O b A O b b b O b O O O O O O A M M M b B 3 > B b # O B , B , M M ^ ' b.~.J.x.m $+..~.G I ,@,@Y                               ",
+"                                o J.H+&.p u C s _ o.S J.S 5 O ^ O b b O b ; O O # M M b M b M O O b b b O O ^ M O O , * ! > > , M , B , , }+A ^./.:@E n m w.A.T *.,@,@u+                                ",
+"                                0.8 t+N+H+U d.( e+I.J.T W 8.Z.C : A M b M M b b A O O M O # b b b M ; # O O b O ; b O O > / / ! a * ) ' B }+z.%.-.J.T.6 A.9.8 7.Z u+u+<@                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ ^ # M O O O O O A # M M O M M b b , ; M M B ; B B > , B > ).> > b+..B+m.W L+..6 ~.V K u+_@Z N+                                  ",
+"                                    `.m.X *.N+8 >.y+n.=.V : 0 U >.n.0.d.C : # b M b # b # M O O O O O B M M M O , , B , , > B > / ' M b.m.V R J.q 7 U d+W J Z u+Z t+                                    ",
+"                                      ..n.` U+7.q H t+/@u B 4 5 0.~.E V k v+b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.d+d+>.W I U+,@u+Y H                                       ",
+"                                          9 7.U+&.&.Z U+^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , '+Z.p z t+9 n 6+-.W 7.U+,@,@u+Z                                           ",
+"                                            >.*.I J /@7...e+z._ ( O w _ 0.~.I.8 L+-.]+]+l v+^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 N+F q N+I Z ,@,@,@X                                             ",
+"                                              o 7.U+,@<@y+E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.Z.o o.l /.f._ 6 7+l J J.7.J u+,@!@,@I                                               ",
+"                                                l <@u+*.7.q 9 T.!.u 0.v+C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k e+7+z.n 9.~.T.Z Z _@u+U+u+Z `                                                 ",
+"                                                    n.t+K ` <@-.L+d+E n v+( v+0.o.9.9.'.>.R I.U F o.o.$+k k u e+|+D +./.2 x u +.d+L+J.&.!@!@u+U+Z K                                                     ",
+"                                                        p &.J J 7.t+B+n. .U U z >.6+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U 6+[@<@K Z !@,@u+,@J                                                         ",
+"                                                            J.I U+X J *.t+q B+t+t+W q d+6+d+>.o 8 ~.w.U U D k ..o.8.8.T L+-.7.J U+Z _@,@,@J                                                             ",
+"                                                                G K U+U+X X J U+I J =.&.&.t+p G H+<@t+H L+n.n.G q t+&.I X U+u+u+,@u+U+X                                                                 ",
+"                                                                    >.:@=.U+_@u+,@u+u+U+Z =.K J U+U+Z J I =.U+Z Y U+U+_@u+u+u+u+J t+                                                                    ",
+"                                                                          8 H+*.Z !@,@u+u+Z /@,@/@/@/@_@U+Y ,@Z u+u+Z u+X I t+                                                                          ",
+"                                                                                  8 -.&.*.X Z u+/@u+_@_@u+_@U+X ` t+-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.bmp
new file mode 100644 (file)
index 0000000..0d9ecd0
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Processing.xpm
new file mode 100644 (file)
index 0000000..f8823c2
--- /dev/null
@@ -0,0 +1,429 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_Processing_xpm[] = {
+"100 100 326 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #000000",
+">+    c #EE8C8A",
+",+    c #B44A47",
+"'+    c #E6787C",
+")+    c #7E3030",
+"!+    c #6D3435",
+"~+    c #F8BCBD",
+"{+    c #FFFE33",
+"]+    c #7A2C2D",
+"^+    c #E3E3E3",
+"/+    c #C1C1C1",
+"(+    c #9C9C9C",
+"_+    c #898989",
+":+    c #CCCB00",
+"<+    c #A6A6A6",
+"[+    c #7B7B7B",
+"}+    c #C6C6C6",
+"|+    c #FFFFFF",
+"1+    c #FAFAFA",
+"2+    c #FFFE65",
+"3+    c #EFF0EF",
+"4+    c #D4D4D4",
+"5+    c #828282",
+"6+    c #626262",
+"7+    c #949494",
+"8+    c #E1E1E1",
+"9+    c #E6E6E6",
+"0+    c #ECECEC",
+"a+    c #F8F8F8",
+"b+    c #E9E9E9",
+"c+    c #5A5A5A",
+"d+    c #A1A1A1",
+"e+    c #F9F9F9",
+"f+    c #F5F5F5",
+"g+    c #FCFCFC",
+"h+    c #525252",
+"i+    c #484848",
+"j+    c #CECDCE",
+"k+    c #AAAAAA",
+"l+    c #CBCBCB",
+"m+    c #6B6B6B",
+"n+    c #C35959",
+"o+    c #9E3E39",
+"p+    c #EEEEEE",
+"q+    c #737272",
+"r+    c #414141",
+"s+    c #B8B8B8",
+"t+    c #F7F6F6",
+"u+    c #F3F3F3",
+"v+    c #AB4A49",
+"w+    c #984E4E",
+"x+    c #D98182",
+"y+    c #D9D9D9",
+"z+    c #B3B3B3",
+"A+    c #712421",
+"B+    c #B24243",
+"C+    c #DEDEDE",
+"D+    c #EDAFAF",
+"E+    c #3E3E3E",
+"F+    c #660000",
+"G+    c #BF4D4D",
+"H+    c #D0D0D0",
+"I+    c #681C1A",
+"J+    c #AA423F",
+"K+    c #B5B5B5",
+"L+    c #CC9900",
+"M+    c #B4B4B4",
+"N+    c #FDFDFD",
+"O+    c #CC6500",
+"P+    c #986500",
+"Q+    c #663200",
+"R+    c #BDBDBD",
+"S+    c #3C0F0F",
+"T+    c #110203",
+"U+    c #AC4441",
+"V+    c #551815",
+"W+    c #4F1311",
+"X+    c #EBA9A7",
+"Y+    c #A33B3A",
+"Z+    c #222222",
+"`+    c #430F0E",
+" @    c #AFAFAF",
+".@    c #E9ACAC",
+"+@    c #FEFEFE",
+"@@    c #541714",
+"#@    c #111111",
+"$@    c #EEDCDC",
+"%@    c #370A09",
+"&@    c #190407",
+"*@    c #555555",
+"=@    c #ECB2B0",
+"-@    c #777777",
+";@    c #888888",
+">@    c #FAC4C3",
+",@    c #99FFCB",
+"'@    c #F0DBDB",
+")@    c #666666",
+"!@    c #996666",
+"~@    c #333333",
+"{@    c #444444",
+"]@    c #080100",
+"^@    c #ECD6D6",
+"/@    c #C0C0C0",
+"(@    c #CCCCCC",
+"_@    c #999999",
+":@    c #336666",
+"<@    c #D86B68",
+"[@    c #663366",
+"}@    c #0A0301",
+"|@    c #D67174",
+"1@    c #4C1711",
+"2@    c #00CC00",
+"3@    c #BBBBBB",
+"4@    c #FD0000",
+"5@    c #FFCC00",
+"6@    c #0B0403",
+"7@    c #FF6600",
+"8@    c #666699",
+"9@    c #CC6600",
+"0@    c #DDDDDD",
+"a@    c #FFCC99",
+"b@    c #333366",
+"c@    c #336633",
+"d@    c #663333",
+"e@    c #666633",
+"f@    c #CC3300",
+"g@    c #120304",
+"h@    c #990000",
+"i@    c #421410",
+"j@    c #3F110C",
+"k@    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+;+;+;+;+;+;+;+++.+W.P.O.F.M.s.>+>+< Q.| @.1 j & y.y.u.. u.3 L L / ' ,+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< '+j - l )+y !+r.G.O.P.#+.+-+-+@+~+;+;+{+{+{+{+{+{+{+;+;+@+.+P.O.F.M.q.i.>+h.X.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+^+/+(+_+;+{+{+{+{+:+:+:+{+{+{+{+;+.+.+P.O.F.M.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P.^+<+[+[+(+}+;+{+{+|+|+|+|+1+2+{+{+{+{+{+;+3+.+P.O.F.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 '+k.v ' ^.d.m Q B.D.F.N.4+5+6+7+8+|+|+;+{+{+9+0+a+|+2+2+2+2+2+2+{+{+{+;+7+b+P.O.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.8+[+c+d+1+|+e+8+;+{+{+^+f+g+2+2+2+2+2+2+2+2+2+:+:+{+;+h+<+P.P.G.s.>+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.<+i+5+3+|+3+j+k+k+;+{+{+|+|+2+2+2+2+2+2+2+2+2+2+2+:+:+;+l+c+m+8+N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e n+o+o.n L.h.p+q+r+s+|+t+l+k+<+/+;+{+{+{+|+2+2+2+|+|+|+|+2+2+2+2+2+:+:+{+;+u+[+i+l+F.q.i.h.X.| e % j & N . * L ' / / , , > M M # : m 9.~.o+5 u 0.0                       ",
+"                      b / & N n+v+F K.w+x+8+c+i+y+|+8+z+<+k+y+|+;+{+{+:+|+2+2+2+|+|+|+|+2+2+2+2+2+2+:+{+;+|+|+_+r+}+i.{ k.Q.~ @.1 ].@ y.R.$ a a L ).> M , b b b M - R A+0 B+u $+~.                      ",
+"                    ' : e & b u +. .Q p.^+h+i+C+|+4+<+<+k+9+|+|+;+{+:+2+2+2+2+|+|+|+|+|+|+|+2+2+2+2+:+{+;+|+|+|+5+r+y+i.{ } ~ v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.w+D+6+E+j+|+j+<+<+k+9+|+|+|+;+{+:+2+2+2+2+F+|+|+|+|+|+|+2+2+2+2+:+{+;+|+|+|+1+6+c+s.{ h.[ | f j & @ . u.3 ! a > > , , M O # # A G+6.A+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.5+r+d+|+H+<+<+<+y+|+|+|+|+;+{+:+2+2+2+2+F+2+|+|+|+|+|+2+2+2+2+:+{+;+|+|+|+|+C+E+7+j.k.X.~ 1 e & N N $ a ).! / B B ; M b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q /+r+6+|+^+<+<+<+/+|+|+|+|+|+;+{+:+{+2+2+2+F+2+2+|+|+|+|+2+2+2+:+:+{+;+|+|+|+|+|+7+r+^+P Q.| e j % y.d R.L L / > > , B ; M O # M b M +.o `.u u w.I+0                 ",
+"                , = b L s +.9 9 7 g 6+E+l+1+z+<+<+k+3+|+|+|+|+|+;+{+{+{+{+2+F+2+2+2+2+2+F+2+2+2+2+:+:+{+;+|+|+|+|+|+b+r+7+k.Q.| 1 j % @ + $ ! 3 L / B , B ; b M b M O A G+A+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n l+E+c+|+y+<+<+<+/+|+|+|+|+|+|+|+;+:+{+{+|+|+|+2+2+2+F+2+2+2+2+:+:+:+;+|+|+|+|+|+|+|+[+h+t.Q.~ 1 f j y.+ R.3 3 / > , B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.)+<._+r+d+|+s+<+<+<+8+|+|+|+|+|+|+|+;+:+:+:+|+|+|+|+|+F+2+2+2+2+:+:+:+{+;+|+|+|+|+|+|+|+s+r+y+X.'+@.f j N + u.! $ ! )., B , , b ; O # O A ^ B+'.l ..6 U o +.              ",
+"              > 6 b > 5 J+o.9 0.1 6+E+y+p+k+<+<+k+u+|+|+|+|+|+|+|+|+;+:+:+F+|+|+|+|+2+2+2+2+:+:+:+{+;+|+|+|+|+|+|+|+|+y+r+K+Q.~ v % % y.N + 3 L / / > , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| h+r+f+C+<+<+<+z+g+|+|+|+|+|+|+|+;+L+;+;+:+:+:+|+F+{+{+{+2+2+{+{+;+|+|+|+|+|+|+|+|+|+3+r+(+X.'+v f % y.+ R.3 3 * / B , , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e i+i+|+y+<+<+<+M+N+|+|+|+|+|+|+|+;+L+{+{+;+;+:+F+:+:+{+:+:+:+;+;+|+|+|+|+|+|+|+|+|+|+f+r+7+Q.| 1 e j ].R.. 3 3 ' > > B M M ; ; b # A b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E )+& f h+r+1+C+<+<+<+z+g+|+|+|+|+|+|+|+;+O+O+{+L+P+;+;+:+:+:+:+;+;+|+|+|+|+|+|+|+|+|+|+|+|+0+r+d+X.e j e N @ u.$ ! 3 L / , , , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.B+..>.L.j j 6+E+9+0+<+<+<+k+f+|+|+|+|+|+|+;+L+{+{+O+O+P+Q+Q+;+;+;+;+|+|+|+|+|+|+|+|+|+|+|+|+|+|+H+r+R+[ Y.f & % + + R.a a ' > > B M O M M b b O M # M b U E I.>.S+T+T+            ",
+"          ].U+= ( u C d.)+T N @ f _+E+/+1+z+<+<+<+8+|+|+|+|+|+|+;+O+O+{+L+P+Q+Q+P+Q+L+;+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+d+r+8+~ e H.j y.+ $ u.* a / > , , , b # ; M M O b O # O B+p W =.Y X S+x           ",
+"          $ n H V I+u _ )+V+N N ].}+r+[+|+j+<+<+<+}+|+|+|+|+|+;+L+{+{+O+O+P+Q+Q+P+L+;+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+N+c+6+Q.r | j ].& R.R.! ! > )./ B B M , b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l W+X &.-.p j + % @.c+i+u+u+k+<+<+k+u+|+|+|+|+;+O+O+{+L+P+Q+Q+P+Q+;+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+/+r+k+| ~ 1 j ].& . u.3 3 * )., , , M M O O O b O b M M b w D D 0 A.E W+o           ",
+"          > ! < < e B+J.&.` N u.& 1 }+r+7+|+y+<+<+<+}+|+|+|+;+L+{+{+O+O+P+Q+Q+P+L+;+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+e+c+h+X+[ @.% ].& d R.. a ! * / > B B # ; b b O M O M b b O b o.T.Y+w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @._+E+C+|+}+<+<+<+9+|+|+;+Q+Q+{+L+P+Q+Q+P+Q+;+Z+Z+Z+Z+|+|+|+|+|+|+|+|+|+|+|+|+7+r+s+[ v e j % @ + u.$ a ! > / , , B O ; B M O b O O O O O b ..$+0.z n.`+J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 | m+c+a+g+}+<+<+ @f+|+|+;+;+Q+Q+P+Q+Q+P+L+;+Z+Z+Z+Z+Z+|+|+|+|+|+|+|+|+|+|+ @r+5+[ ~ @.f & & y.. $ 3 * / / B B M ; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @..@m+m++@+@H+<+<+s+a+|+|+;+;+;+Q+Q+P+L+;+Z+Z+Z+Z+Z+|+|+|+|+|+|+|+|+|+|+k+r+m+Q.| e 1 e @ N y.R.3 3 3 L / > B B b O # O b O b ^ M b A # b `.k 0.U E G S+          ",
+"          ( @.1 ).: 4 z I+@@#.$ + @ f e 1 '+5+q+f+|+^+M+<+s+t+|+;+#@#@;+;+Q+Q+;+Z+Z+Z+|+|+|+|+|+|+|+|+|+|+3+_+r+q+$@[ ~ @.f @ & @ . $ 3 ! * > > , , , , b b M M O M b b # b O O ~...c.`.o q %@          ",
+"          - 1 $ b # w o.n.V+#.L u.y.& H.1 ~ [ z+[+4+|+a+y+ @z+0+|+;+;+Z+Z+;+;+Z+Z+|+|+|+|+|+|+|+|+|+|+t+z+h+E+7+Q.| '+r f j ].@ N R.$ ;+;+;+/ B B M M M B O O b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 V+$ L . + y.].H.1 '+| 9+<+z+u+|+1+C+l+b++@|+|+|+|+|+|+|+|+|+|+|+|+|+|+a+y+7+h+r+m+l+h.[ [ @.H.j ].N y.R.$ a ;+k+k+;+;+, , O # O b O M O A M O A M O ^ ~.$+0.U n.%@&@          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v '+[ < 8+}+4+u+|+|+t++@|+|+|+|+|+|+|+|+|+|+8+k+7+q+h+r+r+[+}+i.k.k.} ~ 1 j & % N . R.L L ;+*@*@k+k+;+;+M # ; b O b # ^ b # O b M a.'.~.!.A+S+X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v '+[ } h.=@9+9+p+g+|+|+|+|+|+|+|+|+|+|+|+_+r+h+m+7+/+p+< { < t.} } '+1 ].].& + u.3 3 ;+*@-@-@*@*@k+;@;+;+A M O M b b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.A+8 2.' ' u.u.d @ ].].j 1 e | '+} P j.9+9+9+9+9+b+(+a+|+|+|+|+|+7+r+9+i.{ { h.P h.>@P ~ ~ ~ e j y.y.. $ ! L ;+*@-@,@-@-@*@*@;@;@;+;+O M M A M b # b ^ Y+I.o.>.q 7.X &@          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } t.P i.i.] ] d+r+7+|+|+|+|+|+/+r+/+k.k.h.'+< < '+r r 1 H.@.& @ @ & j ].+ ;+*@-@,@,@,@-@-@*@*@;@;@;+;+O O O M M ; b 0 x.'.E W+%@Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.@ ].].j 1 1 @.~ '+[ ~ } t.k.'@6+r+k+|+|+|+|+p+i+q+< '+k.~ | X.~ @.v e e @.e j y.u.* L ;+*@-@,@,@,@,@,@,@-@-@*@*@;@;@;+;+O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d G+9.o x.4.B > / L L $ . d @ & ].& e e e v '+'+~ } X.< 9+c+r+d+|+|+|+|+7+E+H+| | r v '+1 g H.1 f ~ H.$ $ ! L / ;+*@-@,@,@,@,@,@,@,@,@-@-@*@*@;@;@;+; O # b J+Z.o V+S+%@X S+          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & & ].% H.1 @.@.~ ~ '+| ^+6+r+5+0+|+|+0+i+6+v H.1 1 e @.j f @.r f % R.a + . ! ;+*@-@,@,@,@,@,@,@,@,@,@,@-@-@)@)@;+b # B # _ E o.n.-.%@Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.@ & j & f f 1 H.H.v r e 3+5+E+h+z+t+|+R+r+_+j j & H.j j g e & v & . + a 3 ;+*@-@,@,@,@,@,@,@,@,@,@,@,@,@,@;@)@;+; M O : ~.A+>.n.J.7.&@9           ",
+"          3 2 u.M 0.+.$+_ D o.b.M / / ' ! 3 L $ u.. R.y.y.@ ].].% j % % f 1 e 1 1 K+h+r+c+<+9+_+E+k+% & @ @ )@)@!@~@].y.3 L 3 L ;+*@-@,@,@,@,@,@,@,@,@,@,@,@,@;@)@{@;+b , A : 0  .T 8 S+&@]@U           ",
+"            c = 2 ]+U B+_ A.t C ; > > / * L ! L ! u.$ + @ y.N @ & ].j j & f j & ].% ^@<+h+r+r+6+E+r+K++ . )@/@(@_@:@;+$ L * * > ;+*@-@,@,@,@,@,@,@,@,@,@,@,@,@;@)@{@;+B b s B+T.7 n.-.J ]@Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! u.L $ . y.R.+ N @ y.@ & & % & & % ].& & /+_+c+r+r+i+<@)@/@/@/@(@_@[@;+' / , ;+*@-@,@,@,@,@,@,@,@,@,@,@,@,@,@;@)@{@;+B : z.T.F z @@` Z }@7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * * L u.L ! $ $ . y.@ y.+ @ @ d d + N d d N + R.8+}+l+|@)@(@/@/@(@_@)@;+/ B B ;+*@;@;@;@,@,@,@,@,@,@,@,@,@,@;@)@{@;+M # C Y+9.,.E m.7.Z T+1@            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ' ).L a 3 3 3 $ $ . u.R.. R.. R.R.R.. R.u.$ $ u.L u.* _@_@(@/@(@_@~@;+, , B ;@;+;@2@;@;@;@,@,@,@,@,@,@,@,@;@)@{@;+M O 5 0 I.o 9 m.&.T+Y               ",
+"              J+/.U I.'.D c.m 8.o.M O M B B , B > / / ' ).3 3 a u.u.L ! 3 u.$ u.$ $ $ u.$ ! u.a ' L * L )@)@_@_@_@)@~@;+B ;+;+{@3@3@4@;@;@;@;@;@,@,@,@,@,@,@;@)@{@;+# : d.Z.E T 9 n.J }@J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > B / / > / > ).* L a ! L u.L 3 a u.L a a * 3 a L * ' )@5@)@)@)@~@)@)@;+;+3@;@;@{@{@3@3@;@;@;@;@;@;@,@,@,@;@)@{@;+M M b.c.9 n.V+V S+&@6@-.              ",
+"                m ]+F A.t -.S+-.S+x.M M # # B , , , > B , * )./ * ' > / ' * ! 3 L / ' * ).' ' )./ / _@(@5@7@)@)@8@)@9@~@~@;@0@)@;@;@{@{@3@3@;@;@;@;@;@;@,@;@)@{@;+; O w 8 8.9 V+S+X ]@&@                ",
+"                J+>.7.&@=.V /.'.9 q s A A O O M B , , B , B B , / ).* / > * / > 3 / > > / / > > > )._@a@/@/@7@7@7@9@9@9@5@b@)@;@0@)@;@;@{@{@3@3@;@*@;@;@;@;@)@{@;+; b ,+S m.9 J.%@&@]@*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B > , , > / / > ).> )./ / ).> , , , , _@a@/@/@/@/@5@5@5@5@7@c@;@3@)@;@0@)@;@;@{@{@3@3@;@*@;@)@{@;+, M M 7 p K T+6@&@}@]@9                 ",
+"                  0.l o+( / : k z T V 6 M b , # b O O O B B , , B B , > B , , , B > > , , > B B B B _@a@a@a@/@/@/@/@5@7@9@d@-@-@;@3@)@;@0@)@;@;@{@{@3@3@;@)@;+;+B M ^.;.x.~.@@Y ]@]@&@                  ",
+"                    +.x z.c k $+~.A+p  .5 O A b M # M # O O O M , , M , , B B B , , , B B , , , B # _@a@5@a@a@a@/@/@7@7@9@:@p+|+-@;@;@0@)@;@0@)@;@;@{@{@3@;+Z+{@{@^ Z.V 8.o.9 *.T+]@                    ",
+"                    0 ~...9.7 F T.I+p 9 )+O M O b O M # # M b O A b M M ; # ; M M M # # M M M b M M _@a@5@5@a@a@a@a@7@7@9@~@3@3@*@-@0@)@;@0@)@;@0@)@;@;@{@{@;+Z+{@{@;.9 A+n.&.&@]@J                     ",
+"                      F I.8 8 9 9 J.V+T z z C O M b b A M O ; M b ; O b M M M b O O M b O O O ; # b _@a@5@5@5@a@a@a@7@9@9@b@*@-@-@;@;@;@0@)@;@0@)@;@;@;@*@*@;+Z+Z+{@J.9 p I T+]@T+                      ",
+"                      u n.1@q m.A+o.I.8 p T U+C M O b b b M b ; M b , O O O ; M O b B M O O M O ; O _@a@5@5@5@5@5@a@7@9@9@e@-@*@;@;@;@;@;@;@0@)@;@;@*@*@{@{@;+Z+{@{@9 W+I Z }@]@7.                      ",
+"                        ,.S+S+8 n e.T.J.8.Z.7 f.w O # # M ^ # A O # ^ b O O A O M # O b b b O b A O _@a@5@5@5@5@5@5@7@9@9@~@3@3@;@;@;@;@;@;@;@;@*@*@{@{@;+;+Z+{@{@7 9 K Z ]@]@&@                        ",
+"                        B+A+n.o k 4 z J.F m U ]+o+z.A ^ b M O b A M # b b # b b A O # M M b M b b O O _@a@5@5@5@5@5@7@9@9@b@)@)@3@3@;@;@;@;@*@*@{@{@;+;+Z+Z+{@Z.l A.1@Z &@T+&@q                         ",
+"                          ..A+8 U u I.I+k 2 u U R m - b M O b M O b A M M b M ; b b A O O M O # M b b _@a@5@5@5@5@5@7@f@~@;+)@)@)@)@3@3@*@*@{@{@;+;+Z+Z+{@I+o.U m z S+g@T+T+`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.)+C b # O b # O O O M O A # M O O O O O A O M M O _@a@5@F+5@5@5@h@f@e@*@;+;+)@)@)@)@{@{@;+;+Z+Z+{@S R l 0.$+o.q X }@Z J                             ",
+"                              9.T p -.W 9.U+C 5 n E S ]+A A b M M b O O O O b A O b b b O b O O O O O _@a@5@h@5@5@F+h@9@b@b # *@;+;+)@)@;+;+Z+Z+{@~.J.x.m $+..~.G I ]@]@Y                               ",
+"                                o J.`+&.p u C s _ o.S J.S 5 O ^ O b b O b ; O O # M M b M b M O O b b _@a@5@h@5@5@7@7@9@~@> > , M *@;+;+Z+Z+{@^./.i@E n m w.A.T *.]@]@T+                                ",
+"                                0.8 S+%@`+U d.( J+I.J.T W 8.Z.C : A M b M M b b A O O M O # b b b M ; # O O b O ; b O O > / / ! a * ) {@{@n+z.%.-.J.T.6 A.9.8 7.Z T+T+j@                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ ^ # M O O O O O A # M M O M M b b , ; M M B ; B B > , B > ).> > G+..W+m.W @@..6 ~.V K T+g@Z %@                                  ",
+"                                    `.m.X *.%@8 >.V+n.=.V : 0 U >.n.0.d.C : # b M b # b # M O O O O O B M M M O , , B , , > B > / ' M b.m.V R J.q 7 U I+W J Z T+Z S+                                    ",
+"                                      ..n.` &@7.q H S+6@u B 4 5 0.~.E V k U+b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.I+I+>.W I &@]@T+Y H                                       ",
+"                                          9 7.&@&.&.Z &@^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , )+Z.p z S+9 n A+-.W 7.&@]@]@T+Z                                           ",
+"                                            >.*.I J 6@7...J+z._ ( O w _ 0.~.I.8 @@-.]+]+l U+^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 %@F q %@I Z ]@]@]@X                                             ",
+"                                              o 7.&@]@j@V+E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.Z.o o.l /.f._ 6 B+l J J.7.J T+]@}@]@I                                               ",
+"                                                l j@T+*.7.q 9 T.!.u 0.U+C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k J+B+z.n 9.~.T.Z Z g@T+&@T+Z `                                                 ",
+"                                                    n.S+K ` j@-.@@I+E n U+( U+0.o.9.9.'.>.R I.U F o.o.$+k k u J+o+D +./.2 x u +.I+@@J.&.}@}@T+&@Z K                                                     ",
+"                                                        p &.J J 7.S+W+n. .U U z >.A+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U A+k@j@K Z }@]@T+]@J                                                         ",
+"                                                            J.I &@X J *.S+q W+S+S+W q I+A+I+>.o 8 ~.w.U U D k ..o.8.8.T @@-.7.J &@Z g@]@]@J                                                             ",
+"                                                                G K &@&@X X J &@I J =.&.&.S+p G `+j@S+H @@n.n.G q S+&.I X &@T+T+]@T+&@X                                                                 ",
+"                                                                    >.i@=.&@g@T+]@T+T+&@Z =.K J &@&@Z J I =.&@Z Y &@&@g@T+T+T+T+J S+                                                                    ",
+"                                                                          8 `+*.Z }@]@T+T+Z 6@]@6@6@6@g@&@Y ]@Z T+T+Z T+X I S+                                                                          ",
+"                                                                                  8 -.&.*.X Z T+6@T+g@g@T+g@&@X ` S+-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.bmp
new file mode 100644 (file)
index 0000000..1efd4fa
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_STLFormat.xpm
new file mode 100644 (file)
index 0000000..c72c8bb
--- /dev/null
@@ -0,0 +1,580 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_STLFormat_xpm[] = {
+"100 100 477 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #000000",
+"X.    c #F5A9AA",
+"Y.    c #E57E7F",
+"Z.    c #E57675",
+"`.    c #692322",
+" +    c #953737",
+".+    c #6C2023",
+"++    c #F6B1AF",
+"@+    c #F2ADAC",
+"#+    c #933536",
+"$+    c #652727",
+"%+    c #592928",
+"&+    c #DC9293",
+"*+    c #F9B4B2",
+"=+    c #F6B9BB",
+"-+    c #F7B8B4",
+";+    c #EE8C8A",
+">+    c #B44A47",
+",+    c #E6787C",
+"'+    c #7E3030",
+")+    c #6D3435",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #FDC6C6",
+"/+    c #FBCCC9",
+"(+    c #FBCED1",
+"_+    c #F9D3D3",
+":+    c #FDCECB",
+"<+    c #FAD4D5",
+"[+    c #FBDCDB",
+"}+    c #C35959",
+"|+    c #9E3E39",
+"1+    c #FDDEDD",
+"2+    c #AB4A49",
+"3+    c #984E4E",
+"4+    c #D98182",
+"5+    c #FBE6E9",
+"6+    c #CE0000",
+"7+    c #F50000",
+"8+    c #F10000",
+"9+    c #950000",
+"0+    c #712421",
+"a+    c #B24243",
+"b+    c #F8ACAD",
+"c+    c #FBE4E1",
+"d+    c #AC0000",
+"e+    c #ED0000",
+"f+    c #FD0000",
+"g+    c #D10000",
+"h+    c #FEDFDE",
+"i+    c #FDE8EB",
+"j+    c #580000",
+"k+    c #D90000",
+"l+    c #FC0000",
+"m+    c #EB0000",
+"n+    c #BF4D4D",
+"o+    c #FFEAED",
+"p+    c #A40000",
+"q+    c #E80000",
+"r+    c #F40000",
+"s+    c #D30000",
+"t+    c #450000",
+"u+    c #CD0000",
+"v+    c #F70000",
+"w+    c #681C1A",
+"x+    c #3B0000",
+"y+    c #870000",
+"z+    c #DE0000",
+"A+    c #F80000",
+"B+    c #E10000",
+"C+    c #840000",
+"D+    c #630000",
+"E+    c #AF0000",
+"F+    c #C40000",
+"G+    c #B40000",
+"H+    c #890000",
+"I+    c #400000",
+"J+    c #6C0000",
+"K+    c #820000",
+"L+    c #4E0000",
+"M+    c #B60000",
+"N+    c #EC0000",
+"O+    c #EF0000",
+"P+    c #C60000",
+"Q+    c #410000",
+"R+    c #900000",
+"S+    c #EE0000",
+"T+    c #F30000",
+"U+    c #D50000",
+"V+    c #CF0000",
+"W+    c #C90000",
+"X+    c #AE0000",
+"Y+    c #300000",
+"Z+    c #DA0000",
+"`+    c #A20000",
+" @    c #AA423F",
+".@    c #350000",
+"+@    c #9F0000",
+"@@    c #D60000",
+"#@    c #DB0000",
+"$@    c #C70000",
+"%@    c #AB0000",
+"&@    c #830000",
+"*@    c #8A0000",
+"=@    c #E00000",
+"-@    c #B10000",
+";@    c #CB0000",
+">@    c #DF0000",
+",@    c #F00000",
+"'@    c #E20000",
+")@    c #B70000",
+"!@    c #8D0000",
+"~@    c #550000",
+"{@    c #680000",
+"]@    c #7E0000",
+"^@    c #9A0000",
+"/@    c #D20000",
+"(@    c #710000",
+"_@    c #AA0000",
+":@    c #D70000",
+"<@    c #EA0000",
+"[@    c #E50000",
+"}@    c #A00000",
+"|@    c #4F0000",
+"1@    c #7B0000",
+"2@    c #920000",
+"3@    c #A90000",
+"4@    c #B80000",
+"5@    c #990000",
+"6@    c #C50000",
+"7@    c #CC0000",
+"8@    c #360000",
+"9@    c #A10000",
+"0@    c #DC0000",
+"a@    c #F20000",
+"b@    c #FB0000",
+"c@    c #E90000",
+"d@    c #AD0000",
+"e@    c #460000",
+"f@    c #7D0000",
+"g@    c #BC0000",
+"h@    c #7F0000",
+"i@    c #520000",
+"j@    c #CA0000",
+"k@    c #C20000",
+"l@    c #5D0000",
+"m@    c #F60000",
+"n@    c #980000",
+"o@    c #6F0000",
+"p@    c #B30000",
+"q@    c #B00000",
+"r@    c #A30000",
+"s@    c #2D0000",
+"t@    c #8B0000",
+"u@    c #C00000",
+"v@    c #A60000",
+"w@    c #3C0F0F",
+"x@    c #110203",
+"y@    c #AC4441",
+"z@    c #E30000",
+"A@    c #C10000",
+"B@    c #7A0000",
+"C@    c #FED8D9",
+"D@    c #DD0000",
+"E@    c #9B0000",
+"F@    c #C30000",
+"G@    c #650000",
+"H@    c #551815",
+"I@    c #BE0000",
+"J@    c #A70000",
+"K@    c #4C0000",
+"L@    c #5F0000",
+"M@    c #750000",
+"N@    c #D80000",
+"O@    c #E60000",
+"P@    c #F90000",
+"Q@    c #FA0000",
+"R@    c #9E0000",
+"S@    c #790000",
+"T@    c #4F1311",
+"U@    c #8F0000",
+"V@    c #2F0000",
+"W@    c #530000",
+"X@    c #380000",
+"Y@    c #3D0000",
+"Z@    c #340000",
+"`@    c #BB0000",
+" #    c #A80000",
+".#    c #3A0000",
+"+#    c #E40000",
+"@#    c #7C0000",
+"##    c #2B0000",
+"$#    c #670000",
+"%#    c #BA0000",
+"&#    c #940000",
+"*#    c #3F0000",
+"=#    c #D40000",
+"-#    c #810000",
+";#    c #B20000",
+">#    c #8E0000",
+",#    c #E70000",
+"'#    c #BF0000",
+")#    c #6A0000",
+"!#    c #A33B3A",
+"~#    c #6E0000",
+"{#    c #570000",
+"]#    c #960000",
+"^#    c #5C0000",
+"/#    c #700000",
+"(#    c #1E0000",
+"_#    c #110000",
+":#    c #470000",
+"<#    c #430F0E",
+"[#    c #330000",
+"}#    c #540000",
+"|#    c #930000",
+"1#    c #5E0000",
+"2#    c #9D0000",
+"3#    c #590000",
+"4#    c #A50000",
+"5#    c #770000",
+"6#    c #440000",
+"7#    c #600000",
+"8#    c #610000",
+"9#    c #541714",
+"0#    c #740000",
+"a#    c #4D0000",
+"b#    c #3C0000",
+"c#    c #3E0000",
+"d#    c #260000",
+"e#    c #B90000",
+"f#    c #370A09",
+"g#    c #2A0000",
+"h#    c #8C0000",
+"i#    c #0E0000",
+"j#    c #660000",
+"k#    c #BD0000",
+"l#    c #230000",
+"m#    c #390000",
+"n#    c #970000",
+"o#    c #D00000",
+"p#    c #290000",
+"q#    c #190407",
+"r#    c #6D0000",
+"s#    c #690000",
+"t#    c #760000",
+"u#    c #510000",
+"v#    c #280000",
+"w#    c #0D0000",
+"x#    c #780000",
+"y#    c #FE0000",
+"z#    c #140000",
+"A#    c #220000",
+"B#    c #910000",
+"C#    c #FF0000",
+"D#    c #860000",
+"E#    c #C80000",
+"F#    c #4A0000",
+"G#    c #4B0000",
+"H#    c #500000",
+"I#    c #1F0000",
+"J#    c #B50000",
+"K#    c #720000",
+"L#    c #080100",
+"M#    c #850000",
+"N#    c #200000",
+"O#    c #0A0301",
+"P#    c #0B0000",
+"Q#    c #4C1711",
+"R#    c #370000",
+"S#    c #730000",
+"T#    c #270000",
+"U#    c #5A0000",
+"V#    c #560000",
+"W#    c #0B0403",
+"X#    c #9C0000",
+"Y#    c #420000",
+"Z#    c #800000",
+"`#    c #5B0000",
+" $    c #640000",
+".$    c #250000",
+"+$    c #180000",
+"@$    c #210000",
+"#$    c #6B0000",
+"$$    c #320000",
+"%$    c #2E0000",
+"&$    c #880000",
+"*$    c #430000",
+"=$    c #1A0000",
+"-$    c #120304",
+";$    c #480000",
+">$    c #1C0000",
+",$    c #421410",
+"'$    c #010000",
+")$    c #3F110C",
+"!$    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.W.W.W.W.W.W.W.X.P.W.W.W.W.W.W.W.W.W.W.s.] W.W.P Y.Z.1 f e j j @ N N R.. 3 a ' o.`.'. +e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T..+%.v.C.E.W.W.W.W.W.W.W.W.++++@+W.W.W.W.W.W.W.W.F.s.q.W.W.t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.#+#+x.$+%+&+M.W.W.W.@+++*+*+@+=+=+=+=+-+++-+W.W.++X.P.O.F.M.W.W.;+< Q.| @.1 j & y.y.u.. u.3 L L / ' >+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< ,+j - l '+y )+r.G.O.W.W.W.=+=+-+!+-+!+~+{+=+{+=+=+W.W.-+-+++P.O.F.W.W.i.;+h.Y.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.X.W.W.*+=+{+~+^+{+{+{+{+!+{+~+W.W.=+-+++++P.O.W.W.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _  +Q [.g.M.P.P.++++=+W.W.W.W.W.W./+(+(+{+^+^+{+W.W.=+=+-+*+++P.W.W.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 ,+k.v ' ^.d.m Q B.D.F.N.O.X.++*+*+W.W.W.W.W.W.W./+(+_+_+:+(+W.W.{+~+=+-+++@+W.W.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U  +- c = M #+n                           ",
+"                        ].^ Y.P v & ^.5 n ~.B.&+G.N.X.X.-+=+!+{+/+(+/+/+_+W.W.W.:+(+<+:+_+W.W./+{+{+-+*+++W.W.P.G.s.;+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.&+s.F.P.X.++++=+!+{+^+/+_+(+:+<+W.W.[+[+[+[+:+W.W./+/+^+{+=+=+W.W.F.N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C #+.._ - f...k 0.                        ",
+"                      $ s 3 e e }+|+o.n L.h.i.F.N.P.@+=+-+{+{+^+^+(+[+[+[+W.W.W.[+[+1+1+[+W.W.(+^+^+{+{+=+W.W.O.O.F.q.i.h.Y.| e % j & N . * L ' / / , , > M M # : m 9.~.|+5 u 0.0                       ",
+"                      b / & N }+2+F K.3+4+] M.F.E.X.@+-+!+{+^+W.W.W.W.W.W.W.W.5+1+5+1+1+[+W.W._+_+(+^+{+-+W.W.W.W.W.W.W.k.Q.~ @.1 6+7+8+9+$ a a L ).> M , b b b M - R 0+0 a+u #+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.b+=+=+{+(+(+W.W.W.W.W.W.W.W.5+c+5+5+c+[+W.W.(+_+(+{+^+!+W.W.W.W.W.W.W.W.} ~ v e d+e+f+g+$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.`.3+< { s.G.O.E.b+++=+!+{+/+_+[+[+1+h+5+i+5+5+5+5+c+5+5+h+[+[+_+_+(+^+~+=+*+++P.E.F.s.{ h.[ | f j+k+l+m+9+3 ! a > > , , M O # # A n+6.0+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.Y.Q.;+q.F.O.P.b+*+!+{+^+/+_+[+1+c+c+c+c+c+c+c+o+c+c+5+5+c+[+<+:+_+/+{+!+=+++P.E.G.] j.k.Y.~ 1 e p+q+r+s+t+).! / B B ; M b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..`.9 8 Q Q.P j.s.F.P.X.@+=+!+^+(+(+<+<+1+c+c+o+o+o+o+o+c+o+o+5+c+h+[+<+<+(+^+{+~+-+=+P.F.M.G.;+P Q.| e j % u+v+r+d+L / > > , B ; M O # M b M +.o  +u u w.w+0                 ",
+"                , = b L s +.9 9 7 g [ t.i.q.F.E.++-+=+!+{+/+(+<+1+1+5+x+c+c+o+c+o+o+c+c+o+5+h+[+[+:+(+(+{+!+*+*+X.O.i.G.;+k.Q.| 1 j % y+z+A+B+C+L / B , B ; b M b M O A n+0+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ Y.h.] M.F.P.@+++=+!+(+^+_+<+1+D+E+F+G+H+I+J+K+K+L+o+c+c+5+c+[+[+_+/+{+{+=+++b+O.N.i.] t.Q.~ 1 f j y.M+N+O+P+Q+> , B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.'+<.r | ;+;+q.F.O.++++=+~+(+{+_+_+1+R+u+S+T+U+H+U+V+W+X+Y+o+c+h+1+1+(+(+(+{+!+=+++b+P.F.s.] t.Y.,+@.f j N t+W+m+Z+`+)., B , , b ; O # O A ^ a+'.l ..6 U o +.              ",
+"              > 6 b > 5  @o.9 0.1 v } { ] i.G.P.P.-+=+-+{+(+/+_+D+.@+@@@e+@@9+#@$@%@&@c+c+5+5+1+[+:+(+/+^+!+-+-+@+O.N.i.;+k.Q.~ v % % y.N *@6+=@P+C+> , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.`.4.| v Q.k.;+i.s.O.E.@+=+!+{+^+y+-@;@>@S+,@'@V+)@!@~@o+o+o+c+c+5+1+[+_+(+^+{+!+=+@+X.P.F.q.] t.Y.,+v f {@]@+ R.^@;@/@M+(@, , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.`.1.e ~ } { ] s.M.E.P.++-+-+{+_@:@<@7+v+[@W+}@|@c+o+c+o+o+c+5+c+[+1+<+/+/+(+{+=+++@+P.F.M.i.{ < Q.t+1@2@3@4@5@. 3 p+6@7@3@8@M M ; ; b # A b O : 0 ,.U k #+,.p U             ",
+"            , c 2 u o.6 /.E '+& f Z.Q.t.i.r.M.O.O.@+=+=+9@0@a@b@l+c@d@e@o+c+o+o+o+c+c+c+o+c+1+[+<+(+/+{+=+=+*+@+E.O.G.i.{ P f@3@M+g@F+;@P+h@! i@7@j@k@*@, M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.a+..>.L.j j v } k.;+;+M.O.P.@+++l@$@S+m@S+0@+@h+o+c+o+c+n@M+o+c+5+c+[+1+_+_+_+^+^+{+=+*+b+P.F.i.] t.o@p@F+)@q@W+Z+'@0@r@s@t@u@k@v@s@O M M b b O M # M b U E I.>.w@x@x@            ",
+"          ].y@= ( u C d.'+T N @ f v [ } j.i.s.F.O.b+++&@s+q+z@A@B@C@[+c+c+c+1@z@6@e@c+h+5+1+<+<+/+^+^+=+=+*+@+X.E.N.;+] t.^@7@6+-@t@g@D@<@T+v+[@E@X+F@E+G@b # ; M M O b O # O a+p W =.Y X w@x           ",
+"          $ n H V w+u _ '+H@N N ].@.[ P h.] s.F.O.P.@+K+I@W+J@K@<+:+:+<+h+L@k+7+A@M@c+c+:+<+_+_+^+(+!+!+*+@+X.O.M.M.r.;+k.J@N@=@$@]@y+/@O@T+P@f+Q@c@R@G+S@, b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l T@X &.-.p j + % @.,+< k.i.r.G.F.O.X.l@U@C+V@D+W@8@X@Y@Z@`@#@#@)@y+C@[+[+<+:+(+{+^+!+=+=+b+X.O.E.i.;+h.<  #B+e+z+`+.# #V++#O+v+Q@l+S+@#h@M O O O b O b M M b w D D 0 A.E T@o           ",
+"          > ! < < e a+J.&.` N u.& 1 [ Y.} { ;+q.M.P.P.##{@$#+@g+%#&#{@*#n@:@=#k@3@-#C@<+_+/+(+/+^+!+-+-+b+P.N.F.i.] { { | R@+#m@c@;#t+|@>#-@$@N@,#O+<@'#)#; b b O M O M b b O b o.T.!#w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.G.O.X.~#v@D@r+=@q@]@{#%#j@`@p+]#o@_+(+^+{+~+{+{+=+@+++X.P.N.F.s.] k.< ^#K+z+Q@m+ #)@/#(#_#:#-#X+6+q+,#`+; B M O b O O O O O b ..#+0.z n.<#J.          ",
+"          : u.Y.~ & B m T p l.$ N % 1 | [ Y.t.;+;+M.F.O.[#5@g++#6+J@9+D+d+d@+@^@U@e@}#{+(+{+{+!+=+=+@+b+O.N.M.r.;+{ P @#M+8@7@Q@O@|#R+1#]@9@2#R@M+K@)@,#D@ #O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @.~ Y.< i.i.] M.F.O.3# #I@)@;#E+y+d@4#E@U@1#A@d+@#.@=+=+++*+@+++X.O.G.s.i.i.k.5#;@e+u+%@N+@@f@6#7#y+^@5@!@n@9+8#K+Z++#6@S@O b ^ M b A # b  +k 0.U E G w@          ",
+"          ( @.1 ).: 4 z w+9##.$ + @ f e 1 ,+} < h.;+q.M.F.O.0#r@)@k@%#*#n@}@U@L@=#>@N@`@R+}#-+@+++X.F.O.F.s.;+i.< h.k@S+k+a#{#@@D@&@$ 3 b#L+c#d#, , , , b e#m+S+4@M b b # b O O ~...c. +o q f#          ",
+"          - 1 $ b # w o.n.H@#.L u.y.& H.1 ~ [ < t.{ i.s.M.F.g#h#G+A@)@9+i#~#/#g@z@,@O+z+A@5@j#@+E.O.{+M.q.s.] k.Q.U@m+O+h@j ].u@,@k#$ a ! ! / B B M M M B O ~#W+e+j@l#A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 H@$ L . + y.].H.1 ,+| < t.{ i.] q.M.j#n@r@9+(@m#b#n#o#N+A+Q@r++#W+r@G@O.F.M.q.i.i.,+h.[ F+b@7@j ].N 9@O@6+U@)./ / B , , , O # O b O M &@#@u@p#A M O ^ ~.#+0.U n.f#q#          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v ,+[ < t.j.;+i.s.s.r#5#s#a#c#t#X+U+N+A+l+b@m@c@u+9@u#q.i.i.j.i.k.k.} B+r+n@& % N &#Z+O@o#/#* / > M B ; M # ; b O b # v#k+A@O b M a.'.~.!.0+w@X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v ,+[ } h.t.{ i.] s.q.M.w#e@x#`+6@>@O+A+y#y#v+q+j@2@i.{ < { < t.} j#8+O+z#].& + E@z+P@m+}@/ > B , , M b b A M O M b b |@+#$@M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.0+8 2.' ' u.u.d @ ].].j 1 e | ,+} P j.i.;+;+i.i.G.s.A#B#I@D@8+f+C#b@7+B+4@)#h.P h.{+P ~ ]#v+z@j y.y.. %@,#b@8+d+/ , B M b , M O O b O M M A M D#'@+@^ !#I.o.>.q 7.X q#          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } t.P i.i.] ] i.] s.] ]@I@z@m@f+y#Q@S+o#]#,+< < ,+r r -@Q@N@& @ @ & g@S+f+T+-@3 L , > ; A ; b O M O O O O O M J@;@b 0 x.'.E T@f#Z J           ",
+"          = * e e N ^ 0 x.`.5.M * * 3 . R.y.@ ].].j 1 1 @.~ ,+[ ~ } t.k.k.{ ;+{ { h#o#S+P@l+Q@a@z+q@K@| Y.~ @.v E#A+0@e j y.u.W+8+f+8+e#> > a * , O ; b O b O O b O O b M P+%#c.I.R T W 7.J 7.          ",
+"          w O & N d n+9.o x.4.B > / L L $ . d @ & ].& e e e v ,+,+~ } Y.< < h.< < Y+G+'@8+m@m@a@z@I@)#v ,+1 g i#N@A+>@H.$ $ F#j@q+,@,#`@i#, A B 3 > A M O M b b ; b O ; O # z+ @`.o H@w@f#X w@          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & & ].% H.1 @.@.~ ~ ,+| Q.Y.r ~ |#/@O@e+,@O+B+u@@#1 e @.j G@=@Q@z+% R.a C+F+#@,#B+4@G#; # O b / / b O M M A M b M b # B }@p@E o.n.-.f#Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.@ & j & f f 1 H.H.v r e @.@.e 1@F+k+z@c@q+#@I@-#& H.j j n@<@b@N@& . + }@o#q+a@z@)@H#M O M # M B * M O O O O M O ; M O : I#0+>.n.J.7.q#9           ",
+"          3 2 u.M 0.+.#+_ D o.b.M / / ' ! 3 L $ u.. R.y.y.@ ].].% j % % f 1 e 1 1 1 @#e#g+0@'@>@g+J#f@& @ @ j G+8+Q@W+y.3 K#I@q+Q@r+z+M+t+M b M b O O , , O b O O b M b , A : 0  .T 8 w@q#L#U           ",
+"            c = 2 ]+U a+_ A.t C ; > > / * L ! L ! u.$ + @ y.N @ & ].j j & f j & ].% M#)@V+0@=@N@W+d+K#+ . + N#j@a@8+e#$ 3#5@j@m++#g+k@}@/ b ; O # O O b * b ; b O M O B b s a+T.7 n.-.J L#Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! u.L $ . y.R.+ N @ y.@ & & % & & % 2@`@s+z@[@Z+k@`+j#R.u.@ S@g+q+'@z#H#J+>#%@p@v@9@}@M@, M b A b M M A > > M b # b ; B : z.T.F z 9#` Z O#7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * * L u.L ! $ $ . y.@ y.+ @ @ d d P#^@'#Z+<@<@N@g@n@j+$ . N D#3@Z@l@/#f@@#t#h@5#M#&#@#, B ^ # O M b O O O ).# M M ; M # C !#9.,.E m.7.Z x@Q#            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ' ).L a 3 3 3 $ $ . u.R.. R.. R.e@9@$@'@e+O@s+`@&#Q+* . p#R#S#R+9@-@e#4#M@G@L@1@(@> , B A b O O O b O O B , b M M M O 5 0 I.o 9 m.&.x@Y               ",
+"               @/.U I.'.D c.m 8.o.M O M B B , B > / / ' ).3 3 a u.u.L ! 3 u.$ u.$ L@3@u+z@O@k+E#q@@#V@T#I+S#^@;#k#E#s+#@I@J+U#{#j#, , > , {@S#H#8@b # M O ; L ; # , # : d.`.E T 9 n.J O#J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > B / / > / > ).* L a ! L u.L 3 a t#X+;@@@6+4@E@)#Y@V#M@9+;#P+V+U+#@z@m+F+D+j+V#V#B , B M+o#V+;#y+u#b b A O 3 M M M M b.c.9 n.H@V w@q#W#-.              ",
+"                m ]+F A.t -.w@-.w@x.M M # # B , , , > B , * )./ * ' > / ' * ! 3 L M#q@F+P+p@&#S#~#M#^@X+A@6+N@>@z@O@e+r+$@1#j+V#W@, |#O@8+r+<@>@6+J@3#M # # ! O , ; O w 8 8.9 H@w@X L#q#                ",
+"                 @>.7.q#=.V /.'.9 q s A A O O M B , , B , B B , / ).* / > * / > 3 !@3@4@4@d@X#E@ #M+u@j@=##@z@<@S+,@7+b@E#l@j+V#~@, )@Q@7+<@+#O@<@>@v@Y#M b u.M M ; b >+S m.9 J.f#q#L#*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B > , , > / / > ).I+*@r@G+e#J#J#k#W+6+=#k+=@q+O+7+P@v+P@f+F+1#j+j+V#B , F@v+z@g+B+e+O+6+Z#b B u., , M M 7 p K x@W#q#O#L#9                 ",
+"                  0.l |+( / : k z T V 6 M b , # b O O O B B , , B B , > B , , , 8#M#r@`@6@6@W+/@@@:@D@+#N+T+A+l+f+b@b@A+k@U#U#`#{#M M A r@^@&#D@a@T+z+2#Z@M $ B B M ^.;.x.~.9#Y L#L#q#                  ",
+"                    +.x z.c k #+~.0+p  .5 O A b M # M # O O O M , , M , , B B A# $h#-@j@/@=#:@D@D@=@q+8+A+Q@f+y#f+l+Q@8+M+|@D+8#U#.$O O M b O u+,@a@#@d+7#/ 3 , , ^ `.V 8.o.9 *.x@L#                    ",
+"                    0 ~...9.7 F T.w+p 9 '+O M O b O M # # M b O A b M M ; # ; }#-#d+j@Z+'@+#[@O@,#N+r+b@f+f+l+l+Q@v+r+D@&@~@K+{@^#.#b # M O b -#0@'@7@G+f@).).M A A.;.9 0+n.&.q#L#J                     ",
+"                      F I.8 8 9 9 J.H@T z z C O M b b A M O ; M b ; O b M M K@f@p@=#B+q+O+8+e+<@O+v+y#f+b@v+7+7+a@N+k+`+[#X#p+K#^#c## A O b ; O ]#%#'#6@B#).M C ]+J.J.9 p I x@L#x@                      ",
+"                      u n.Q#q m.0+o.I.8 p T y@C M O b b b M b ; M b , O O x+M@G+0@8+7+A+Q@Q@T+e+a@l+l+m@e+c@O@q+O@@@J@*#v@=#k@x#`#x+b O M M b +$M@9@I@F@t@) 5 n V 9 9 T@I Z O#L#7.                      ",
+"                        ,.w@w@8 n e.T.J.8.`.7 f.w O # # M ^ # A O # ^ b @$J+e#z@P@l+f+y#y#l+7+S+T+Q@S+k+F@k#W+g+V+q@#$U@k+m+U+-#`#$$# M # O B  $n#h#H+a#^.3.m 9#E 7 9 K Z L#L#q#                        ",
+"                        a+0+n.o k 4 z J.F m U ]+|+z.A ^ b M O b A M # b G@k@m+b@C#f+l+b@l+b@r+S+T+e+V+H+*#F#%${@&$S@&#u+S+7+k+M#D+*$b # b ; =$&#K#u#' ^.z.o.n.`.l A.Q#Z q#x@q#q                         ",
+"                          ..0+8 U u I.w+k 2 u U R m - b M O b M O b A {#F@e+l+y#l+b@Q@Q@Q@P@a@m+S+g+3#j#v@'#`@^@]@9+$@,#v+7+Z+9+~#.#; M > B B ~@:#^.^.c ~.w+o.U m z w@-$x@x@`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.'+C b # O b # O F#u@T+y#f+b@Q@Q@b@b@Q@r+,#/@&#t+|#e#@@z@=@6+E+9@A@m+7+S+#@_@x#M ; B , , B B M ^.u S R l 0.#+o.q X O#Z J                             ",
+"                              9.T p -.W 9.y@C 5 n E S ]+A A b M M %$-@<@l+Q@A+P@b@l+f+P@,@D@R@Y#>#G+j@Z+[@O@D@A@&$;$`#4#7@6+I@9@D+, B , M M ^ ' b.~.J.x.m #+..~.G I L#L#Y                               ",
+"                                o J.<#&.p u C s _ o.S J.S 5 O ^ O (@E#D@'@z@S+m@b@f+l+8+U+Z#{@X#e#j@=##@#@o#R@1#N#O , * ! :#i@>$M , B , , }+A ^./.,$E n m w.A.T *.L#L#x@                                ",
+"                                0.8 w@f#<#U d.(  @I.J.T W 8.`.C : '$`+d+q@'#@@8+b@f+A+#@5#(@9+ #G+'#6@P+p@M@e@O ; b O O > / / ! a * ) ' B }+z.%.-.J.T.6 A.9.8 7.Z x@x@)$                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C 6#2#4@g@`@6+z@m+0@-#J+h#]#E@4#_@_@r@D#l@; M M B ; B B > , B > ).> > n+..T@m.W 9#..6 ~.V K x@-$Z f#                                  ",
+"                                     +m.X *.f#8 >.H@n.=.V : 0 U >.n.0.d.u@g+k@p+2@h@R#M@-#S#S#!@9@E@B#Z#1#M M O , , B , , > B > / ' M b.m.V R J.q 7 U w+W J Z x@Z w@                                    ",
+"                                      ..n.` q#7.q H w@W#u B 4 5 0.~.E V L+A@'#;#|#&$&$(@b # j#>#S@b , ; ; , B B M , B > , , > B M A p I 8.~.+.w+w+>.W I q#L#x@Y H                                       ",
+"                                          9 7.q#&.&.Z q#^ O B b z.5 0.U 8 ;.1#B@Z#D+6 z.^.M B b > > M B B M , , , B , B B B , '+`.p z w@9 n 0+-.W 7.q#L#L#x@Z                                           ",
+"                                            >.*.I J W#7... @z._ ( O w _ 0.~.I.8 9#-.]+]+l y@^., , , ; B , B B B , M {.b.z 8..+E U 0._ 8 f#F q f#I Z L#L#L#X                                             ",
+"                                              o 7.q#L#)$H@E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.`.o o.l /.f._ 6 a+l J J.7.J x@L#O#L#I                                               ",
+"                                                l )$x@*.7.q 9 T.!.u 0.y@C O ( 0 I.`.E R 8 T .+8 8.9 V ;.8 E `.]+w.~.l D k  @a+z.n 9.~.T.Z Z -$x@q#x@Z `                                                 ",
+"                                                    n.w@K ` )$-.9#w+E n y@( y@0.o.9.9.'.>.R I.U F o.o.#+k k u  @|+D +./.2 x u +.w+9#J.&.O#O#x@q#Z K                                                     ",
+"                                                        p &.J J 7.w@T@n. .U U z >.0+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U 0+!$)$K Z O#L#x@L#J                                                         ",
+"                                                            J.I q#X J *.w@q T@w@w@W q w+0+w+>.o 8 ~.w.U U D k ..o.8.8.T 9#-.7.J q#Z -$L#L#J                                                             ",
+"                                                                G K q#q#X X J q#I J =.&.&.w@p G <#)$w@H 9#n.n.G q w@&.I X q#x@x@L#x@q#X                                                                 ",
+"                                                                    >.,$=.q#-$x@L#x@x@q#Z =.K J q#q#Z J I =.q#Z Y q#q#-$x@x@x@x@J w@                                                                    ",
+"                                                                          8 <#*.Z O#L#x@x@Z W#L#W#W#W#-$q#Y L#Z x@x@Z x@X I w@                                                                          ",
+"                                                                                  8 -.&.*.X Z x@W#x@-$-$x@-$q#X ` w@-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.bmp
new file mode 100644 (file)
index 0000000..45c627d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_Tests.xpm
new file mode 100644 (file)
index 0000000..c34bad1
--- /dev/null
@@ -0,0 +1,662 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_Tests_xpm[] = {
+"100 100 559 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #F6B1AF",
+"++    c #F2ADAC",
+"@+    c #F7B8B4",
+"#+    c #F8ACAD",
+"$+    c #933536",
+"%+    c #652727",
+"&+    c #592928",
+"*+    c #DC9293",
+"=+    c #F9B4B2",
+"-+    c #F6B9BB",
+";+    c #EE8C8A",
+">+    c #B44A47",
+",+    c #E6787C",
+"'+    c #7E3030",
+")+    c #6D3435",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #FDC6C6",
+"/+    c #FBCCC9",
+"(+    c #FBCED1",
+"_+    c #F9D3D3",
+":+    c #FDCECB",
+"<+    c #FAD4D5",
+"[+    c #FBDCDB",
+"}+    c #C35959",
+"|+    c #9E3E39",
+"1+    c #FDDEDD",
+"2+    c #AB4A49",
+"3+    c #984E4E",
+"4+    c #D98182",
+"5+    c #FBE6E9",
+"6+    c #712421",
+"7+    c #B24243",
+"8+    c #FBE4E1",
+"9+    c #FED8D9",
+"0+    c #FEDFDE",
+"a+    c #FDE8EB",
+"b+    c #BF4D4D",
+"c+    c #FFEAED",
+"d+    c #681C1A",
+"e+    c #AA423F",
+"f+    c #3C0F0F",
+"g+    c #110203",
+"h+    c #AC4441",
+"i+    c #551815",
+"j+    c #4F1311",
+"k+    c #A33B3A",
+"l+    c #FCFF00",
+"m+    c #430F0E",
+"n+    c #000000",
+"o+    c #541714",
+"p+    c #370A09",
+"q+    c #F6B88C",
+"r+    c #F9DD43",
+"s+    c #FBF317",
+"t+    c #FCFD03",
+"u+    c #FCFB07",
+"v+    c #FBF320",
+"w+    c #FBDD52",
+"x+    c #F7BFAA",
+"y+    c #F5C280",
+"z+    c #F8E13E",
+"A+    c #FBF316",
+"B+    c #FCFC06",
+"C+    c #FCFD05",
+"D+    c #FAF312",
+"E+    c #F8DE2E",
+"F+    c #F4C157",
+"G+    c #EA9885",
+"H+    c #DB8041",
+"I+    c #EAC21F",
+"J+    c #F5E80B",
+"K+    c #FAF903",
+"L+    c #FBFA02",
+"M+    c #F6EB0A",
+"N+    c #ECCB1A",
+"O+    c #DD982F",
+"P+    c #CB5B4B",
+"Q+    c #F6CC51",
+"R+    c #FCFE02",
+"S+    c #FBF90D",
+"T+    c #F7C28A",
+"U+    c #F5AAA8",
+"V+    c #F9DD41",
+"W+    c #FBFA05",
+"X+    c #D15756",
+"Y+    c #EBBD22",
+"Z+    c #FAF803",
+"`+    c #190407",
+" @    c #FAE923",
+".@    c #D29D63",
+"+@    c #64453F",
+"@@    c #352B14",
+"#@    c #797A02",
+"$@    c #FAFD00",
+"%@    c #EDEC08",
+"&@    c #DF9E90",
+"*@    c #F8CD52",
+"=@    c #FAEC1F",
+"-@    c #C79A54",
+";@    c #5E3F33",
+">@    c #251912",
+",@    c #363404",
+"'@    c #898902",
+")@    c #F1F301",
+"!@    c #894D4D",
+"~@    c #D77677",
+"{@    c #E4A92E",
+"]@    c #F1DD10",
+"^@    c #B1732E",
+"/@    c #51281D",
+"(@    c #20120B",
+"_@    c #353202",
+":@    c #888801",
+"<@    c #F0F200",
+"[@    c #732C2B",
+"}@    c #BB4A4D",
+"|@    c #ED957A",
+"1@    c #FCFC04",
+"2@    c #FAEE18",
+"3@    c #81534B",
+"4@    c #030202",
+"5@    c #8B8D00",
+"6@    c #7D7B06",
+"7@    c #C07E7D",
+"8@    c #FBF313",
+"9@    c #6E5234",
+"0@    c #151500",
+"a@    c #B3B500",
+"b@    c #090505",
+"c@    c #F6EA0B",
+"d@    c #64391D",
+"e@    c #080303",
+"f@    c #F0C240",
+"g@    c #B18D34",
+"h@    c #35201F",
+"i@    c #BD7677",
+"j@    c #E89192",
+"k@    c #DEA072",
+"l@    c #BEC000",
+"m@    c #1A1010",
+"n@    c #DF918F",
+"o@    c #121200",
+"p@    c #2E1B1A",
+"q@    c #A46464",
+"r@    c #D97E7C",
+"s@    c #DA8484",
+"t@    c #CB9F9E",
+"u@    c #6B3E3D",
+"v@    c #0C0606",
+"w@    c #FBFC02",
+"x@    c #281011",
+"y@    c #913E3C",
+"z@    c #BE4A4D",
+"A@    c #C24C4F",
+"B@    c #A13E3C",
+"C@    c #5E2526",
+"D@    c #0A0404",
+"E@    c #F7E21D",
+"F@    c #181704",
+"G@    c #251717",
+"H@    c #E18B8B",
+"I@    c #EF9892",
+"J@    c #E8EB00",
+"K@    c #7E4E4E",
+"L@    c #F9EC18",
+"M@    c #B2B400",
+"N@    c #272700",
+"O@    c #C77979",
+"P@    c #D26D71",
+"Q@    c #412121",
+"R@    c #F5E40F",
+"S@    c #AD4847",
+"T@    c #B7484A",
+"U@    c #3A1718",
+"V@    c #FAF509",
+"W@    c #F9FC00",
+"X@    c #372222",
+"Y@    c #F0AD55",
+"Z@    c #F8EE10",
+"`@    c #F4D32A",
+" #    c #F0B73E",
+".#    c #EB9F5F",
+"+#    c #E37F7B",
+"@#    c #DC9239",
+"##    c #F3E70A",
+"$#    c #EBC41C",
+"%#    c #DFA027",
+"&#    c #D57B3C",
+"*#    c #C75049",
+"=#    c #FCFD01",
+"-#    c #130A0A",
+";#    c #EDA34F",
+">#    c #DBDA03",
+",#    c #FAF30A",
+"'#    c #EAAD48",
+")#    c #DC8A3A",
+"!#    c #DAD902",
+"~#    c #F7F007",
+"{#    c #DC942C",
+"]#    c #FBF904",
+"^#    c #0A0A00",
+"/#    c #030101",
+"(#    c #955152",
+"_#    c #2A2B00",
+":#    c #686900",
+"<#    c #9A9C00",
+"[#    c #CDCF00",
+"}#    c #E7A941",
+"|#    c #843436",
+"1#    c #D8962E",
+"2#    c #F6E613",
+"3#    c #2E2F00",
+"4#    c #984D4D",
+"5#    c #231111",
+"6#    c #161600",
+"7#    c #9D9F00",
+"8#    c #DADB01",
+"9#    c #864547",
+"0#    c #863938",
+"a#    c #200D0D",
+"b#    c #772F31",
+"c#    c #EDBD2E",
+"d#    c #878900",
+"e#    c #D66769",
+"f#    c #B9585A",
+"g#    c #833F40",
+"h#    c #542A2A",
+"i#    c #331E13",
+"j#    c #F6F900",
+"k#    c #854041",
+"l#    c #FBFB03",
+"m#    c #090900",
+"n#    c #A54143",
+"o#    c #752E30",
+"p#    c #502021",
+"q#    c #311B0F",
+"r#    c #762D2C",
+"s#    c #080100",
+"t#    c #DE7C53",
+"u#    c #FBFD02",
+"v#    c #F5F800",
+"w#    c #3B3C00",
+"x#    c #B35B5A",
+"y#    c #E07664",
+"z#    c #F3CF23",
+"A#    c #F5DA1B",
+"B#    c #E27F5D",
+"C#    c #DB7758",
+"D#    c #D6D900",
+"E#    c #1F0E0E",
+"F#    c #F6E90D",
+"G#    c #313200",
+"H#    c #F1D515",
+"I#    c #CE6540",
+"J#    c #D4714D",
+"K#    c #1D0C0C",
+"L#    c #E8AC32",
+"M#    c #B49C15",
+"N#    c #E08256",
+"O#    c #DA7168",
+"P#    c #E58957",
+"Q#    c #ECBB32",
+"R#    c #FAF606",
+"S#    c #F0C922",
+"T#    c #E4944A",
+"U#    c #D7745F",
+"V#    c #D96561",
+"W#    c #D76B58",
+"X#    c #E19043",
+"Y#    c #F5E211",
+"Z#    c #696A00",
+"`#    c #050202",
+" $    c #EDBF24",
+".$    c #C45554",
+"+$    c #FBFD01",
+"@$    c #E9C11A",
+"#$    c #D48438",
+"$$    c #CA5B44",
+"%$    c #C65551",
+"&$    c #CA5F4D",
+"*$    c #D48339",
+"=$    c #F3E010",
+"-$    c #0A0301",
+";$    c #D09930",
+">$    c #F9F308",
+",$    c #C35F5F",
+"'$    c #472122",
+")$    c #FCFE01",
+"!$    c #D9AB25",
+"~$    c #1F0E0D",
+"{$    c #D37250",
+"]$    c #FAF704",
+"^$    c #F9F505",
+"/$    c #D7A722",
+"($    c #1E0C0D",
+"_$    c #4C1711",
+":$    c #7D462E",
+"<$    c #7E7F00",
+"[$    c #C1C300",
+"}$    c #E8EA00",
+"|$    c #FAFC01",
+"1$    c #F9F704",
+"2$    c #F5E50F",
+"3$    c #EBC226",
+"4$    c #C48634",
+"5$    c #67322B",
+"6$    c #0D0606",
+"7$    c #D7685B",
+"8$    c #E1963E",
+"9$    c #9EA000",
+"0$    c #D2D400",
+"a$    c #F2F302",
+"b$    c #F9F604",
+"c$    c #F3E110",
+"d$    c #E6BA27",
+"e$    c #AA673B",
+"f$    c #261112",
+"g$    c #7A3635",
+"h$    c #D67345",
+"i$    c #C9BD0A",
+"j$    c #EDF000",
+"k$    c #EBEB02",
+"l$    c #EDD712",
+"m$    c #CB5D52",
+"n$    c #D68C35",
+"o$    c #F2F202",
+"p$    c #F8F603",
+"q$    c #F2DF0E",
+"r$    c #E0B320",
+"s$    c #A36031",
+"t$    c #260F10",
+"u$    c #743130",
+"v$    c #7B3837",
+"w$    c #060302",
+"x$    c #110807",
+"y$    c #020101",
+"z$    c #622C2D",
+"A$    c #AC4A49",
+"B$    c #090404",
+"C$    c #0C0505",
+"D$    c #602627",
+"E$    c #C15253",
+"F$    c #672E30",
+"G$    c #311615",
+"H$    c #110808",
+"I$    c #230F0F",
+"J$    c #512524",
+"K$    c #8E3F3E",
+"L$    c #D1595A",
+"M$    c #C95957",
+"N$    c #8E3C3D",
+"O$    c #4D2222",
+"P$    c #0B0505",
+"Q$    c #251010",
+"R$    c #552525",
+"S$    c #A84446",
+"T$    c #A24543",
+"U$    c #3B1918",
+"V$    c #120707",
+"W$    c #2E1413",
+"X$    c #BE4947",
+"Y$    c #4A1F1F",
+"Z$    c #210E0D",
+"`$    c #0B0404",
+" %    c #240E0F",
+".%    c #582726",
+"+%    c #0B0403",
+"@%    c #120304",
+"#%    c #421410",
+"$%    c #3F110C",
+"%%    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F.P.P.W..+++@+.+.+++#+.+.+++P.W.O.N.F.s.q.] { t.h.~ v f % ].j ].. . u.$ ! / > ^.{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.$+$+x.%+&+*+M.F.P.P.++.+=+=+++-+-+-+-+@+.+@+.+++.+W.P.O.F.M.s.;+;+< Q.| @.1 j & y.y.u.. u.3 L L / ' >+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< ,+j - l '+y )+r.G.O.P.#+.+-+-+@+!+@+!+~+{+-+{+-+-+@+.+@+@+.+P.O.F.M.q.i.;+h.X.~ e % e & & R.$ 3 ! ' L > ) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.@+@+=+-+{+~+^+{+{+{+{+!+{+~+-+{+-+@+.+.+P.O.F.M.s.i.{ < [ [ @.j ].d N R.. 3 a * ).).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P..+.+-+!+~+^+{+^+^+/+(+(+{+^+^+{+{+{+-+-+@+=+.+P.O.F.M.s.] k.Q.~ @.e j % @ u.u.L ! / > ).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 ,+k.v ' ^.d.m Q B.D.F.N.O.W..+=+=+~+{+^+(+_+(+(+/+(+_+_+:+(+{+^+{+~+-+@+.+++P.O.N.i.r.{ P | ~ f j & @ d . $ a ! ! / B B > b O 0 U `.- c = M $+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.*+G.N.W.W.@+-+!+{+/+(+/+/+_+<+[+:+:+(+<+:+_+(+(+/+{+{+@+=+.+++P.P.G.s.;+h.Q.~ v 1 j & + y.u.3 L ' / , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.5 /.l (.*+s.F.P.W..+.+-+!+{+^+/+_+(+:+<+<+[+[+[+[+[+:+<+<+/+/+^+{+-+-+=+W.F.N.s.] j.< | r e j j y.. $ 3 a L ).> B B > b ; C $+.._ - f...k 0.                        ",
+"                      $ s 3 e e }+|+o.n L.h.i.F.N.P.++-+@+{+{+^+^+(+[+[+[+1+1+1+[+[+1+1+[+[+(+(+^+^+{+{+-+=+.+O.O.F.q.i.h.X.| e % j & N . * L ' / / , , > M M # : m 9.~.|+5 u 0.0                       ",
+"                      b / & N }+2+F K.3+4+] M.F.E.W.++@+!+{+^+(+_+<+<+1+[+5+5+5+1+5+1+1+[+[+[+_+_+(+^+{+@+-+W.++O.F.i.{ k.Q.~ @.1 ].@ y.R.$ a a L ).> M , b b b M - R 6+0 7+u $+~.                      ",
+"                    ' : e & b u +. .Q p.i.] M.M.P.#+-+-+{+(+(+(+:+<+1+5+[+[+8+5+8+5+5+8+[+[+9+(+_+(+{+^+!+@+.+W.O.O.F.i.{ } ~ v e j % + y.$ L L ' / , B > , B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.3+< { s.G.O.E.#+.+-+!+{+/+_+[+[+1+0+5+a+5+5+5+5+8+5+5+0+[+[+_+_+(+^+~+-+=+.+P.E.F.s.{ h.[ | f j & @ . u.3 ! a > > , , M O # # A b+6.6+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.;+q.F.O.P.#+=+!+{+^+/+_+[+1+8+8+8+8+8+8+8+c+8+8+5+5+8+[+<+:+_+/+{+!+-+.+P.E.G.] j.k.X.~ 1 e & N N $ a ).! / B B ; M b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.F.P.W.++-+!+^+(+(+<+<+1+8+8+c+c+c+c+c+8+c+c+5+8+0+[+<+<+(+^+{+~+@+-+P.F.M.G.;+P Q.| e j % y.d R.L L / > > , B ; M O # M b M +.o `.u u w.d+0                 ",
+"                , = b L s +.9 9 7 g [ t.i.q.F.E..+@+-+!+{+/+(+<+1+1+5+8+8+8+c+8+c+c+8+8+c+5+0+[+[+:+(+(+{+!+=+=+W.O.i.G.;+k.Q.| 1 j % @ + $ ! 3 L / B , B ; b M b M O A b+6+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.] M.F.P.++.+-+!+(+^+_+<+1+1+8+c+c+c+c+c+c+c+c+c+8+8+5+8+[+[+_+/+{+{+-+.+#+O.N.i.] t.Q.~ 1 f j y.+ R.3 3 / > , B , B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.'+<.r | ;+;+q.F.O..+.+-+~+(+{+_+_+1+0+8+8+8+c+8+c+8+c+8+c+c+8+0+1+1+(+(+(+{+!+-+.+#+P.F.s.] t.X.,+@.f j N + u.! $ ! )., B , , b ; O # O A ^ 7+'.l ..6 U o +.              ",
+"              > 6 b > 5 e+o.9 0.1 v } { ] i.G.P.P.@+-+@+{+(+/+_+1+0+8+8+c+c+8+c+c+c+8+8+8+5+5+1+[+:+(+/+^+!+@+@+++O.N.i.;+k.Q.~ v % % y.N + 3 L / / > , M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| v Q.k.;+i.s.O.E.++-+!+{+^+_+_+[+0+a+8+8+c+c+8+c+c+c+c+8+8+5+1+[+_+(+^+{+!+-+++W.P.F.q.] t.X.,+v f % y.+ R.3 3 * / B , , M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ } { ] s.M.E.P..+@+@+{+^+(+<+[+0+8+c+8+c+8+c+8+c+c+8+5+8+[+1+<+/+/+(+{+-+.+++P.F.M.i.{ < Q.| 1 e j ].R.. 3 3 ' > > B M M ; ; b # A b O : 0 ,.U k $+,.p U             ",
+"            , c 2 u o.6 /.E '+& f Y.Q.t.i.r.M.O.O.++-+-+^+{+/+9+[+8+8+8+c+8+c+c+c+8+8+8+c+8+1+[+<+(+/+{+-+-+=+++E.O.G.i.{ P X.e j e N @ u.$ ! 3 L / , , , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.7+..>.L.j j v } k.;+;+M.O.P.++.+-+!+{+(+:+<+9+0+c+8+c+8+c+8+c+8+5+8+[+1+_+_+_+^+^+{+-+=+#+P.F.i.] t.< [ Y.f & % + + R.a a ' > > B M O M M b b O M # M b U E I.>.f+g+g+            ",
+"          ].h+= ( u C d.'+T N @ f v [ } j.i.s.F.O.#+.+-+-+{+(+/+:+9+[+8+8+8+8+8+c+8+8+0+5+1+<+<+/+^+^+-+-+=+++W.E.N.;+] t.Q.~ e H.j y.+ $ u.* a / > , , , b # ; M M O b O # O 7+p W =.Y X f+x           ",
+"          $ n H V d+u _ '+i+N N ].@.[ P h.] s.F.O.P.++=+-+{+{+^+<+:+:+<+0+0+8+8+8+8+8+8+:+<+_+_+^+(+!+!+=+++W.O.M.M.r.;+k.Q.r | j ].& R.R.! ! > )./ B B M , b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l j+X &.-.p j + % @.,+< k.i.r.G.F.O.W.++++-+~+{+(+_+:+:+[+0+0+[+0+9+9+[+[+<+:+(+{+^+!+-+-+#+W.O.E.i.;+h.< | ~ 1 j ].& . u.3 3 * )., , , M M O O O b O b M M b w D D 0 A.E j+o           ",
+"          > ! < < e 7+J.&.` N u.& 1 [ X.} { ;+q.M.P.P.#+++-+-+~+{+{+(+<+:+:+:+9+9+9+9+<+_+/+(+/+^+!+@+@+#+P.N.F.i.] { { | [ @.% ].& d R.. a ! * / > B B # ; b b O M O M b b O b o.T.k+w.8 W 9           ",
+"          b . e | [ & _ 7 n.N l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+~+!+{+(+(+(+:+:+:+/+_+(+^+{+~+{+{+-+++.+W.P.N.F.s.] k.l+l+l+e j % @ + u.$ a ! > / , , B O ; B M O b O O O O O b ..$+0.z n.m+J.          ",
+"          : u.X.~ & B m T p l.l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+-+-+~+{+{+/+{+(+(+(+{+{+(+{+{+!+-+-+++#+O.N.M.r.;+{ P l+l+l+f & & y.. $ 3 * / / B B M ; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N n+n+n+n+n+l+l+l+n+n+n+n+n+n+n+n+n+-+!+!+{+!+{+-+^+{+-+{+-+-+.+=+++.+W.O.G.s.i.i.k.Q.l+l+l+n+n+N y.R.3 3 3 L / > B B b O # O b O b ^ M b A # b `.k 0.U E G f+          ",
+"          ( @.1 ).: 4 z d+o+#.$ + n+n+n+n+n+l+l+l+n+n+n+n+n+n+n+n+n+.+@+-+-+@+-+@+-+-+-+-+-+@+++.+W.F.O.F.s.;+i.< h.[ l+l+l+n+n+@ . $ 3 ! * > > , , , , b b M M O M b b # b O O ~...c.`.o q p+          ",
+"          - 1 $ b # w o.n.i+#.L u.y.& H.1 ~ l+l+l+n+n+s.M.F.F.O.q+r+s+t+u+v+w+x+.+.+@+.+.+++y+z+A+B+C+D+E+F+G+k.Q.l+l+l+l+l+l+l+l+l+$ a ! ! H+I+J+K+L+M+N+O+P+b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 i+$ L . + y.].H.1 l+l+l+n+n+i.] q.M.Q+R+l+l+l+l+l+l+S+T+#+W.W.U+V+l+l+l+l+l+l+l+l+W+h.[ l+l+l+l+l+l+l+l+l+a ).X+Y+l+l+l+l+l+l+l+l+Z+M O A M O A M O ^ ~.$+0.U n.p+`+          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.l+l+l+n+n+j.;+i.F+l+l+ @.@+@@@#@$@l+%@&@P.P.*@l+l+=@-@;@>@,@'@)@l+!@~@~ 1 l+l+l+n+n+n+n+n+n+{@l+l+]@^@/@(@_@:@<@l+[@}@^ b # O b M a.'.~.!.6+f+X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & l+l+l+n+n+h.t.|@1@l+2@3@4@n+n+n+5@l+l+6@7@F.8@l+l+9@n+n+n+n+n+0@a@n+b@,+1 l+l+l+n+n+n+n+n+n+c@l+l+d@n+n+n+n+n+0@a@n+e@b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.6+8 2.' ' u.u.d @ ].l+l+l+n+n+,+} f@l+l+g@n+n+h@i@j@k@l+l+l@m@n@t+l+l+o@n+p@q@r@s@t@u@v@n+~ e l+l+l+n+n+! L ' > w@l+l+o@n+x@y@z@A@B@C@D@n+A M b # b ^ k+I.o.>.q 7.X `+          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ l+l+l+n+n+| [ E@l+l+F@n+G@H@i.] I@l+l+J@n+K@L@l+l+M@N@O@,+< < ,+r P@Q@H.@.l+l+l+n+n+].+ R.R.R@l+l+M@N@S@; b O M O T@U@O O M M ; b 0 x.'.E j+p+Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.l+l+l+n+n+1 @.V@l+l+l+l+l+l+l+l+l+l+l+W@n+X@Y@l+l+l+l+Z@`@ #.#+#@.v e e @.l+l+l+n+n+L L / B @#l+l+l+l+##$#%#&#*#O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d b+9.o x.4.B > / L L $ . l+l+l+n+n+e e =#l+l+l+l+l+l+l+l+l+l+l+l+n+-#k.;#>#l+l+l+l+l+l+,#'#H.1 f ~ l+l+l+n+n+/ / )., , )#!#l+l+l+l+l+l+~#{#b ; b O ; O # b e+Z.o i+f+p+X f+          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.l+l+l+n+n+& ].]#l+l+^#n+n+n+n+n+n+n+n+n+n+/#~ Q.(#_#:#<#[#$@l+l+l+}#@.r f l+l+l+n+n+! / > B B ; |#_#:#<#[#$@l+l+l+1#M b M b # B # _ E o.n.-.p+Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 l+l+l+n+n+@ & 2#l+l+3#n+n+n+n+n+n+n+n+n+n+n+e @.1 4#5#n+n+6#7#l+l+8#9#& v l+l+l+n+n+3 ' > , , M O 0#a#n+n+6#7#l+l+8#b#M O ; M O : ~.6+>.n.J.7.`+9           ",
+"          3 2 u.M 0.+.$+_ D o.b.M / / ' ! 3 l+l+l+n+n+y.y.c#l+l+d#n+e#% f 1 e 1 1 1 1 @.H.j f ].].f#g#h#i#l+l+j#n+k#].l#l+l+m#n+L / > > b M b M b n#o#p#q#l+l+j#n+r#M b , A : 0  .T 8 f+`+s#U           ",
+"            c = 2 ]+U 7+_ A.t C ; > > / * L l+l+l+n+n++ @ t#u#l+v#w#x#j & f j & y#z#& j A#B#].& & @ N + C#l+l+D#n+E#u.F#l+l+G#n+/ )./ / H#I#; O # O O b J#l+l+D#n+K#O B b s 7+T.7 n.-.J s#Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / l+l+l+n+n+$ . y.L#l+l+v#M#N#O#O#P#Q#R#l+].& l+=#S#T#U#V#W#X#Y#l+l+Z#n+`#a  $l+l+M@6#.$> > > l++$@$#$$$%$&$*$=$l+l+Z#n+`#; B : z.T.F z o+` Z -$7.            ",
+"            : ~.k u l n D t 6.U # M , B B > l+l+l+n+n+u.L ! $ ;$v#l+l+l+l+l+l+l+l+>$,$'$R#l+l+l+l+l+l+l+l+)$!$n+n+~$3 {$]$l+l+l+l+l+, , ^$l+l+l+l+l+l+l+l+)$/$n+n+($M # C k+9.,.E m.7.Z g+_$            ",
+"              k u ..T.l ~.w.D 6.: b B , , , l+l+l+n+n+L a 3 3 3 :$<$[$}$|$1$2$3$4$5$6$n+7$8$9$0$a$+$b$c$d$e$f$n+n+g$* ).h$i$j$W@k$l$> , m$n$9$0$o$+$p$q$r$s$t$n+n+u$M O 5 0 I.o 9 m.&.g+Y               ",
+"              e+/.U I.'.D c.m 8.o.M O M B B , B n+n+n+' ).3 3 a u.v$w$n+n+n+n+n+n+n+n+x$$ ! v@n+n+n+n+n+n+n+n+y$z$' > / B A$B$n+n+n+n+n+, O C$n+n+n+n+n+n+n+n+y$D$, # : d.Z.E T 9 n.J -$J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B n+n+n+/ > / > ).* L E$F$G$H$/#B$I$J$K$L$a * M$N$O$I$P$y$P$Q$R$S$/ a > / , , T$U$C$y$V$W$B A X$|#Y$Z$`$y$D@ %.%T$M M M b.c.9 n.i+V f+`++%-.              ",
+"                m ]+F A.t -.f+-.f+x.M M # # B , , , > B , * )./ * ' > / ' * ! 3 L / ' * ).' ' )./ / / / . , , B > B / > B M , ; , , B , ; O M b O O O M # # ! O , ; O w 8 8.9 i+f+X s#`+                ",
+"                e+>.7.`+=.V /.'.9 q s A A O O M B , , B , B B , / ).* / > * / > 3 / > > / / > > > ).B B u.B , , B )./ > , B B B B , B B b O M O b # O b M b u.M M ; b >+S m.9 J.p+`+s#*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B > , , > / / > ).> )./ / ).> , , , , , B . , B M ; b B , > , , , , B , b # O O b # A M B b B u., , M M 7 p K g++%`+-$s#9                 ",
+"                  0.l |+( / : k z T V 6 M b , # b O O O B B , , B B , > B , , , B > > , , > B B B B , M ! b b # M O O , B B B B , M M A b O M A b b # ; ; M $ B B M ^.;.x.~.o+Y s#s#`+                  ",
+"                    +.x z.c k $+~.6+p  .5 O A b M # M # O O O M , , M , , B B B , , , B B , , , B # O # L , B b # # A ^ O O b O A b O O M b O O ; ; O M B / 3 , , ^ Z.V 8.o.9 *.g+s#                    ",
+"                    0 ~...9.7 F T.d+p 9 '+O M O b O M # # M b O A b M M ; # ; M M M # # M M M b M M b # > , M M A b M O O # M O O O b # M O b M M M # B B ).).M A A.;.9 6+n.&.`+s#J                     ",
+"                      F I.8 8 9 9 J.i+T z z C O M b b A M O ; M b ; O b M M M b O O M b O O O ; # b B b B > O b b # b M b A ^ O M b # A O b ; O O b B , , ).M C ]+J.J.9 p I g+s#g+                      ",
+"                      u n._$q m.6+o.I.8 p T h+C M O b b b M b ; M b , O O O ; M O b B M O O M O ; O M O O / > # A # b M O b b O M A b O M M b , B , M > ) ) 5 n V 9 9 j+I Z -$s#7.                      ",
+"                        ,.f+f+8 n e.T.J.8.Z.7 f.w O # # M ^ # A O # ^ b O O A O M # O b b b O b A O O O O M ' A O A # O b ; M b O O # M # O B M , B , M ^.3.m o+E 7 9 K Z s#s#`+                        ",
+"                        7+6+n.o k 4 z J.F m U ]+|+z.A ^ b M O b A M # b b # b b A O # M M b M b b O O b b b , / b M O M A O # O b M b # b ; , M , B ' ^.z.o.n.Z.l A._$Z `+g+`+q                         ",
+"                          ..6+8 U u I.d+k 2 u U R m - b M O b M O b A M M b M ; b b A O O M O # M b b M ; # O ).> O b O O O A b ; O ; M > B B , A ^.^.c ~.d+o.U m z f+@%g+g+`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.'+C b # O b # O O O M O A # M O O O O O A O M M O A O b b O / * O b b ; M M b M ; B , , B B M ^.u S R l 0.$+o.q X -$Z J                             ",
+"                              9.T p -.W 9.h+C 5 n E S ]+A A b M M b O O O O b A O b b b O b O O O O O O A M M M b B 3 > B b # O B , B , M M ^ ' b.~.J.x.m $+..~.G I s#s#Y                               ",
+"                                o J.m+&.p u C s _ o.S J.S 5 O ^ O b b O b ; O O # M M b M b M O O b b b O O ^ M O O , * ! > > , M , B , , }+A ^./.#%E n m w.A.T *.s#s#g+                                ",
+"                                0.8 f+p+m+U d.( e+I.J.T W 8.Z.C : A M b M M b b A O O M O # b b b M ; # O O b O ; b O O > / / ! a * ) ' B }+z.%.-.J.T.6 A.9.8 7.Z g+g+$%                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ ^ # M O O O O O A # M M O M M b b , ; M M B ; B B > , B > ).> > b+..j+m.W o+..6 ~.V K g+@%Z p+                                  ",
+"                                    `.m.X *.p+8 >.i+n.=.V : 0 U >.n.0.d.C : # b M b # b # M O O O O O B M M M O , , B , , > B > / ' M b.m.V R J.q 7 U d+W J Z g+Z f+                                    ",
+"                                      ..n.` `+7.q H f++%u B 4 5 0.~.E V k h+b.s b.C A b b # # M b b , ; ; , B B M , B > , , > B M A p I 8.~.+.d+d+>.W I `+s#g+Y H                                       ",
+"                                          9 7.`+&.&.Z `+^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > M B B M , , , B , B B B , '+Z.p z f+9 n 6+-.W 7.`+s#s#g+Z                                           ",
+"                                            >.*.I J +%7...e+z._ ( O w _ 0.~.I.8 o+-.]+]+l h+^., , , ; B , B B B , M {.b.z 8. +E U 0._ 8 p+F q p+I Z s#s#s#X                                             ",
+"                                              o 7.`+s#$%i+E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.6.]+7 8.8.Z.o o.l /.f._ 6 7+l J J.7.J g+s#-$s#I                                               ",
+"                                                l $%g+*.7.q 9 T.!.u 0.h+C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k e+7+z.n 9.~.T.Z Z @%g+`+g+Z `                                                 ",
+"                                                    n.f+K ` $%-.o+d+E n h+( h+0.o.9.9.'.>.R I.U F o.o.$+k k u e+|+D +./.2 x u +.d+o+J.&.-$-$g+`+Z K                                                     ",
+"                                                        p &.J J 7.f+j+n. .U U z >.6+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U 6+%%$%K Z -$s#g+s#J                                                         ",
+"                                                            J.I `+X J *.f+q j+f+f+W q d+6+d+>.o 8 ~.w.U U D k ..o.8.8.T o+-.7.J `+Z @%s#s#J                                                             ",
+"                                                                G K `+`+X X J `+I J =.&.&.f+p G m+$%f+H o+n.n.G q f+&.I X `+g+g+s#g+`+X                                                                 ",
+"                                                                    >.#%=.`+@%g+s#g+g+`+Z =.K J `+`+Z J I =.`+Z Y `+`+@%g+g+g+g+J f+                                                                    ",
+"                                                                          8 m+*.Z -$s#g+g+Z +%s#+%+%+%@%`+Y s#Z g+g+Z g+X I f+                                                                          ",
+"                                                                                  8 -.&.*.X Z g++%g+@%@%g+@%`+X ` f+-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.bmp
new file mode 100644 (file)
index 0000000..6ff00fd
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_bi_re_VascularTree.xpm
new file mode 100644 (file)
index 0000000..540612d
--- /dev/null
@@ -0,0 +1,546 @@
+/* XPM */
+static char * TOOLBAR_V2_bi_re_VascularTree_xpm[] = {
+"100 100 443 2",
+"      c #CED0CC",
+".     c #D66265",
+"+     c #D86467",
+"@     c #DA6769",
+"#     c #CA5053",
+"$     c #D15E61",
+"%     c #DF6B6D",
+"&     c #D96C6B",
+"*     c #CE5B59",
+"=     c #BA4347",
+"-     c #B74747",
+";     c #CB5154",
+">     c #CB5857",
+",     c #CD5355",
+"'     c #CC5A5D",
+")     c #CC5255",
+"!     c #CE5C5F",
+"~     c #E37C7D",
+"{     c #EB8987",
+"]     c #E99090",
+"^     c #C54C4F",
+"/     c #D05557",
+"(     c #BC4342",
+"_     c #B04041",
+":     c #C1504F",
+"<     c #E98282",
+"[     c #E47D7E",
+"}     c #E88081",
+"|     c #E67775",
+"1     c #E07271",
+"2     c #A34342",
+"3     c #D15D5B",
+"4     c #B44445",
+"5     c #A94245",
+"6     c #A14141",
+"7     c #76292A",
+"8     c #691D20",
+"9     c #5F1B1B",
+"0     c #A13B3E",
+"a     c #D65B5C",
+"b     c #C64C4A",
+"c     c #A54544",
+"d     c #D96668",
+"e     c #E07377",
+"f     c #DD706F",
+"g     c #DE7778",
+"h     c #DB7C7A",
+"i     c #D06A67",
+"j     c #DC6F6E",
+"k     c #993A3A",
+"l     c #8A3331",
+"m     c #8E3735",
+"n     c #923C3E",
+"o     c #762223",
+"p     c #571A1C",
+"q     c #4F1316",
+"r     c #E5777B",
+"s     c #BA4949",
+"t     c #7C2727",
+"u     c #9E3E3E",
+"v     c #DF797A",
+"w     c #C34A4D",
+"x     c #9B4344",
+"y     c #78312E",
+"z     c #7A2B27",
+"A     c #C35150",
+"B     c #C95655",
+"C     c #BD4B4B",
+"D     c #903334",
+"E     c #6F2325",
+"F     c #8B2D30",
+"G     c #521513",
+"H     c #44100F",
+"I     c #29090C",
+"J     c #240707",
+"K     c #2F090A",
+"L     c #CF5C5A",
+"M     c #C65452",
+"N     c #D46767",
+"O     c #C74E51",
+"P     c #E48482",
+"Q     c #873837",
+"R     c #712526",
+"S     c #4F1918",
+"T     c #631F1E",
+"U     c #842E2D",
+"V     c #571A17",
+"W     c #411415",
+"X     c #200503",
+"Y     c #130506",
+"Z     c #1B0501",
+"`     c #350E0A",
+" .    c #732622",
+"..    c #973839",
+"+.    c #8C2F31",
+"@.    c #E27473",
+"#.    c #C95E5E",
+"$.    c #682427",
+"%.    c #471919",
+"&.    c #330D0F",
+"*.    c #2B0A07",
+"=.    c #250A0B",
+"-.    c #471212",
+";.    c #5B1E1F",
+">.    c #6E211F",
+",.    c #762825",
+"'.    c #7E2928",
+").    c #CD5A58",
+"!.    c #923435",
+"~.    c #87312F",
+"{.    c #B54546",
+"].    c #DE6A6C",
+"^.    c #BC5253",
+"/.    c #953D3A",
+"(.    c #A14F52",
+"_.    c #C86A69",
+":.    c #BC6662",
+"<.    c #D17371",
+"[.    c #CA7475",
+"}.    c #B25F61",
+"|.    c #BE6261",
+"1.    c #C76365",
+"2.    c #BB5F5E",
+"3.    c #AD5353",
+"4.    c #A54C4D",
+"5.    c #B04E4D",
+"6.    c #702A28",
+"7.    c #320C0D",
+"8.    c #662120",
+"9.    c #822D2C",
+"0.    c #9B3C3C",
+"a.    c #BF474B",
+"b.    c #B64D4E",
+"c.    c #A73F3D",
+"d.    c #B04744",
+"e.    c #AC3D3E",
+"f.    c #A63F42",
+"g.    c #E08E8C",
+"h.    c #E08888",
+"i.    c #EC918C",
+"j.    c #ED8B89",
+"k.    c #EC8485",
+"l.    c #D36E70",
+"m.    c #491514",
+"n.    c #5C1819",
+"o.    c #853033",
+"p.    c #D37C7D",
+"q.    c #EE9495",
+"r.    c #EC9293",
+"s.    c #EF9596",
+"t.    c #E78684",
+"u.    c #D4605E",
+"v.    c #6E2F2E",
+"w.    c #8E3032",
+"x.    c #732728",
+"y.    c #D96462",
+"z.    c #B1494B",
+"A.    c #883336",
+"B.    c #C36E6F",
+"C.    c #DB8987",
+"D.    c #E79492",
+"E.    c #F6A4A7",
+"F.    c #F19D9B",
+"G.    c #F39899",
+"H.    c #DF7170",
+"I.    c #792525",
+"J.    c #521618",
+"K.    c #742E30",
+"L.    c #8F3F3D",
+"M.    c #ED9A98",
+"N.    c #F39F9D",
+"O.    c #F4A09E",
+"P.    c #F3A7A8",
+"Q.    c #E67F80",
+"R.    c #D6625F",
+"S.    c #64201F",
+"T.    c #812B2A",
+"U.    c #521D1B",
+"V.    c #9F4D4B",
+"W.    c #F5A9AA",
+"X.    c #E57E7F",
+"Y.    c #E57675",
+"Z.    c #692322",
+"`.    c #953737",
+" +    c #6C2023",
+".+    c #000000",
+"++    c #F7B8B4",
+"@+    c #F6B1AF",
+"#+    c #933536",
+"$+    c #652727",
+"%+    c #592928",
+"&+    c #DC9293",
+"*+    c #F6B9BB",
+"=+    c #F2ADAC",
+"-+    c #EE8C8A",
+";+    c #B44A47",
+">+    c #E6787C",
+",+    c #7E3030",
+"'+    c #6D3435",
+")+    c #F8ACAD",
+"!+    c #F8BCBD",
+"~+    c #FBBEC0",
+"{+    c #FAC4C3",
+"]+    c #7A2C2D",
+"^+    c #F9B4B2",
+"/+    c #FDC6C6",
+"(+    c #FBCCC9",
+"_+    c #FBCED1",
+":+    c #FBDCDB",
+"<+    c #FDCECB",
+"[+    c #FAD4D5",
+"}+    c #F9D3D3",
+"|+    c #E1E100",
+"1+    c #E6E600",
+"2+    c #E5E500",
+"3+    c #DADA00",
+"4+    c #7A7A00",
+"5+    c #C8C800",
+"6+    c #A2A200",
+"7+    c #AEAE00",
+"8+    c #6F6F00",
+"9+    c #656500",
+"0+    c #B0B000",
+"a+    c #909000",
+"b+    c #C35959",
+"c+    c #9E3E39",
+"d+    c #C5C500",
+"e+    c #D4D400",
+"f+    c #D8D800",
+"g+    c #CBCB00",
+"h+    c #E3E300",
+"i+    c #E4E400",
+"j+    c #FDDEDD",
+"k+    c #595900",
+"l+    c #898900",
+"m+    c #B1B100",
+"n+    c #424200",
+"o+    c #AB4A49",
+"p+    c #B3B300",
+"q+    c #D6D600",
+"r+    c #9E9E00",
+"s+    c #E2E200",
+"t+    c #DBDB00",
+"u+    c #5B5B00",
+"v+    c #222200",
+"w+    c #7C7C00",
+"x+    c #FBE6E9",
+"y+    c #B4B400",
+"z+    c #686800",
+"A+    c #712421",
+"B+    c #B24243",
+"C+    c #BABA00",
+"D+    c #D2D200",
+"E+    c #DDDD00",
+"F+    c #E0E000",
+"G+    c #949400",
+"H+    c #919100",
+"I+    c #848400",
+"J+    c #D9D900",
+"K+    c #FBE4E1",
+"L+    c #FED8D9",
+"M+    c #DCDC00",
+"N+    c #BFBF00",
+"O+    c #444400",
+"P+    c #984E4E",
+"Q+    c #787800",
+"R+    c #9F9F00",
+"S+    c #9B9B00",
+"T+    c #666600",
+"U+    c #191900",
+"V+    c #FEDFDE",
+"W+    c #FDE8EB",
+"X+    c #585800",
+"Y+    c #777700",
+"Z+    c #ACAC00",
+"`+    c #BF4D4D",
+" @    c #969600",
+".@    c #BEBE00",
+"+@    c #DFDF00",
+"@@    c #5E5E00",
+"#@    c #FFEAED",
+"$@    c #A1A100",
+"%@    c #575700",
+"&@    c #BDBD00",
+"*@    c #2E2E00",
+"=@    c #8C8C00",
+"-@    c #A5A500",
+";@    c #813832",
+">@    c #681C1A",
+",@    c #8B8B00",
+"'@    c #ABAB00",
+")@    c #5D5D00",
+"!@    c #CECE00",
+"~@    c #BCBC00",
+"{@    c #606000",
+"]@    c #B5B500",
+"^@    c #B8B800",
+"/@    c #3A3A00",
+"(@    c #AFAF00",
+"_@    c #939300",
+":@    c #ADAD00",
+"<@    c #C4C400",
+"[@    c #AA423F",
+"}@    c #3C3C00",
+"|@    c #D7D700",
+"1@    c #CDCD00",
+"2@    c #A8A800",
+"3@    c #AAAA00",
+"4@    c #616100",
+"5@    c #707000",
+"6@    c #C6C600",
+"7@    c #696900",
+"8@    c #1B1B00",
+"9@    c #434300",
+"0@    c #2A2A00",
+"a@    c #6C6C00",
+"b@    c #7B7B00",
+"c@    c #B9B900",
+"d@    c #858500",
+"e@    c #6E6E00",
+"f@    c #DFCDCD",
+"g@    c #B6B600",
+"h@    c #979700",
+"i@    c #8D8D00",
+"j@    c #CFCF00",
+"k@    c #454500",
+"l@    c #9C9C00",
+"m@    c #797900",
+"n@    c #808000",
+"o@    c #555500",
+"p@    c #3C0F0F",
+"q@    c #110203",
+"r@    c #AC4441",
+"s@    c #636300",
+"t@    c #565600",
+"u@    c #6D6D00",
+"v@    c #747400",
+"w@    c #551815",
+"x@    c #A6A600",
+"y@    c #D5D500",
+"z@    c #9D9D00",
+"A@    c #D3D300",
+"B@    c #545400",
+"C@    c #373700",
+"D@    c #4F1311",
+"E@    c #727200",
+"F@    c #B2B200",
+"G@    c #3F3F00",
+"H@    c #999900",
+"I@    c #989800",
+"J@    c #181800",
+"K@    c #8A8A00",
+"L@    c #838300",
+"M@    c #A33B3A",
+"N@    c #C2C200",
+"O@    c #A0A000",
+"P@    c #430F0E",
+"Q@    c #A3A300",
+"R@    c #868600",
+"S@    c #CCCC00",
+"T@    c #646400",
+"U@    c #803B33",
+"V@    c #541714",
+"W@    c #767600",
+"X@    c #6A6A00",
+"Y@    c #333300",
+"Z@    c #370A09",
+"`@    c #888800",
+" #    c #626200",
+".#    c #D1D100",
+"+#    c #535300",
+"@#    c #A7A700",
+"##    c #DEDE00",
+"$#    c #CACA00",
+"%#    c #190407",
+"&#    c #7E7E00",
+"*#    c #9A9A00",
+"=#    c #5C5C00",
+"-#    c #2F2F00",
+";#    c #5A5A00",
+">#    c #D0D000",
+",#    c #929200",
+"'#    c #484800",
+")#    c #202000",
+"!#    c #717100",
+"~#    c #8E8E00",
+"{#    c #7F7F00",
+"]#    c #959500",
+"^#    c #080800",
+"/#    c #878700",
+"(#    c #4F4F00",
+"_#    c #4C4C00",
+":#    c #1D1D00",
+"<#    c #323200",
+"[#    c #C9C900",
+"}#    c #A4A400",
+"|#    c #474700",
+"1#    c #C3C300",
+"2#    c #242400",
+"3#    c #080100",
+"4#    c #C0C000",
+"5#    c #C7C700",
+"6#    c #0A0301",
+"7#    c #393900",
+"8#    c #4C1711",
+"9#    c #303000",
+"0#    c #525200",
+"a#    c #5F5F00",
+"b#    c #1E1E00",
+"c#    c #414100",
+"d#    c #A9A900",
+"e#    c #843A34",
+"f#    c #0B0403",
+"g#    c #353500",
+"h#    c #282800",
+"i#    c #111100",
+"j#    c #C1C100",
+"k#    c #8F8F00",
+"l#    c #1F1F00",
+"m#    c #676700",
+"n#    c #4D4D00",
+"o#    c #757500",
+"p#    c #B7B700",
+"q#    c #4A4A00",
+"r#    c #818100",
+"s#    c #262600",
+"t#    c #4E4E00",
+"u#    c #120304",
+"v#    c #737300",
+"w#    c #6B6B00",
+"x#    c #494900",
+"y#    c #BBBB00",
+"z#    c #7D7D00",
+"A#    c #421410",
+"B#    c #343400",
+"C#    c #3F110C",
+"D#    c #252500",
+"E#    c #3B3B00",
+"F#    c #464600",
+"G#    c #4B4B00",
+"H#    c #B44A4A",
+"I#    c #3D3D00",
+"J#    c #611D1D",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                  . + @ + # $ % & * = - - ; > , ' ) )                                                                                   ",
+"                                                                          ! . % ~ { ] { ~ @ ^ ' $ / ( = = = = _ : . @ $ / ^ =                                                                           ",
+"                                                                    . ' ! / & < { [ } ~ | 1 > 2 ^ 3 ^ 4 ( 5 ( 2 6 * * 4 7 8 8 9 0 !                                                                     ",
+"                                                                @ + a b 6 c - d e f g h i j a 2 k : 2 l m m - n o p q 8 l > r s t ; u ;                                                                 ",
+"                                                            ; % ~ ~ v { e w x y z l 2 A ' B C D E F t 9 G H I J K 9 4 > / L w w 9 M / N / O                                                             ",
+"                                                        . / - < j & r P P 1 j ' 5 Q R p S T U R p V W X Y Z `  .u C c l F m ..5 T m f . - ..+.D                                                         ",
+"                                                    @ a 1 A L @.> & g f . #.A - _ 0 k Q $.%.&.` *.=.X =.-.;.T $.>.,.E T 9 '.6 ..o q ).( !.k 5 k ~.{.                                                    ",
+"                                                @ ].+ @ j u N ' ' #.#.^.s 5 6 n /.(._.:.P <.[.:.}.}.}.|.1.2.3.4.4.5.5.^.6.U z 7 ~.7./.E 8.k O ( 9.u 0.a.                                                ",
+"                                              + ].< j d w D b.c.d.d.e.f.k 0.3.h g.] ] ] h.i.j.P i.P k.h.h g l.l.l.l.N l.! #.^.~...m.n.>.n.m s 5 o.o.u L '                                               ",
+"                                            + e i.~ L * o.l n k 0 ..m x [.p.g.q.r.s.i.s.] ] ] { ] i.< k.P t.h v 1 e f f j @ N N u.#.v.o.8.w./.m +.x.5 y.).#                                             ",
+"                                          @ | i.} + z.u V 9.z m A.(.[.B.C.D.E.F.F.F.G.i.F.G.i.q.j.] i.] k.t.< } ~ | 1 H.% & @ + . + u.u.x /.+.'.'.I.b ]./ d a                                           ",
+"                                      . / v } ~ j ( D x.J.x.K.L.C.g.h.D.M.F.N.N.O.P.P.O.O.E.F.M.q.q.] ] j.{ < Q.[ r e H.f & y.N R.. . a . ^.0.z S.R s N N N u.> O                                       ",
+"                                    N ' $ d d + A ..T.U.;.K.V.D.] P.N.O.P.P.W.W.P.P.O.P.P.O.N.O.G.G.G.s.] { t.P X.Y.1 f e j j @ N N R.. 3 a ' o.Z.'.`.e.( O a $ $ #                                     ",
+"                                  . u.@.@.N - z.6 T. +%.v.C.E.N.F..+.+.+.+.+++@+.+.+.+.+.+.+.+W.O.N.F..+.+.+{ t.h.~ v .+.+.+j ]..+.+u.$ ! / .+.+{.7 >.E +.f., R.].a =                                   ",
+"                                d a ~ P t.1 b.#+#+x.$+%+&+M.F.P.P..+.+.+.+.+*+*+.+.+.+.+.+.+=+@+W.P.O..+.+.+.+-+< Q..+.+.+.+& y..+.+. u.3 L .+.+' ;+6.V >.m _ + N w - :                                 ",
+"                                . [ k.< >+j - l ,+y '+r.G.O.P.)+@+*+*+++.+.+!+~+.+.+{+*+*+++@+++++@+P..+.+.+.+.+-+.+.+.+.+.+e & .+.+$ 3 ! ' .+.+) / M ]+8.R k ^ > b / ,                                 ",
+"                              ' j < } N N > c o.Q p.h.F.O.P.W.++++^+*+{+.+.+{+{+.+.+!+{+~+*+{+*+++@+@+.+.+F..+.+i..+.+[ .+.+j ]..+.+R.. 3 a .+.+).> / M d.>.'.6 4 ' L - 4                               ",
+"                            a N | < & B ' _ `.Q [.g.M.P.P.@+@+*+!+~+/+{+.+.+(+_+.+.+.+.+.+.+.+*+*+++^+.+.+O.F..+.+.+k.Q..+.+e j .+.+.+.+.+.+.+.+).> , , z.6 ,.T.6 B 4 2 = z.                            ",
+"                          $ 3 >+k.v ' ^.d.m Q B.D.F.N.O.W.@+^+^+~+{+/+_+.+.+_+(+.+.+.+.+.+.+/+{+~+*+++.+.+P.O..+.+.+{ P .+.+f j .+.+.+.+.+.+.+.+/ B B > b O 0 U `.- c = M #+n                           ",
+"                        ].^ X.P v & ^.5 n ~.B.&+G.N.W.W.++*+!+{+(+_+(+(+.+.+:+<+.+.+[+<+}+_+_+(+{+{+++.+.+=+P.P..+s.-+h..+.+v 1 .+.++ y.u.3 .+.+/ , , , B , ^ - D e.C b a.w.w.=                         ",
+"                        O b | [ i 1.|+1+1+2+2+3+4+5+6+7+8+*+!+{+/+(+}+_+.+.+[+:+.+.+:+:+<+[+[+(+(+/+{+.+.+^+W.F.N.s.] j..+.+r e .+.+y.. $ 3 .+.+).> 9+0+2+2+a+C #+.._ - f...k 0.                        ",
+"                      $ s 3 e e b+c+d+e+f+2+g+2+h+2+h+i+2+{+{+/+.+.+.+.+.+.+j+j+.+.+j+j+:+:+_+.+/+/+{+.+.+^+@+O.O.F.q.i..+.+| e .+.+& N . * .+.+/ k+l+2+2+m+n+# : m 9.~.c+5 u 0.0                       ",
+"                      b / & N b+o+F p+q+r+e+s+i+t+|+s+1+2+u+v+_+w+.+.+.+.+x+x+x+.+.+j+j+:+:+:+.+}+_+/+.+.+*+W.=+O.F.i.{ .+.+~ @..+.+@ y.R.$ .+.+L k+y+s+5+z+b b M - R A+0 B+u #+~.                      ",
+"                    ' : e & b u +. .n+p.C+D+e+E+1+F+|+1+2+G+H+I+2+1+J+x+:+:+K+x+K+x+x+K+:+:+L+.+}+_+{+/+!+++@+W.O.O.F.i.{ } ~ v e j % + y.$ L L ' k+M+N+1+O+B O b # - 8 l 6 m +.+.!.                    ",
+"                    b + @.L /.o 8.Z.P+< { O+Q+R+3+s+s+i+2+2+S+G+T+w+U+V+x+W+x+x+x+x+K+x+.+.+.+.+.+.+.+/+~+*+^+@+P.E.F.s.{ h.[ | f j & @ . u.3 ! X+Y+s+1+2+Z+O # # A `+6.A+w.0.n l A.                    ",
+"                  / ( & d = T.n.p 6.X.Q.-+q.F. @.@+@h+F+2+2+2+@@:+j+K+K+K+K+K+K+K+#@K+K+x+x+K+.+[+<+}+(+{+!+*+@+P.E.G.] j.k.X.~ 1 e & N N $ a ).X+$@i+2+2+%@b M b O O w V 7 u 0.!.l x.                  ",
+"                ].: * $ O ..Z.9 8 Q Q.P j.s.F.P.N+&@i+s+2+2+2+2+*@j+K+K+#@#@#@#@#@K+#@#@x+K+V+.+[+[+_+/+{+~+++*+P.F.M.G.-+P Q.| e j % y.d R.L L k+=@F+-@h+;@M O # M b M +.o `.u u w.>@0                 ",
+"                , = b L s +.9 9 7 g [ t.i.q.F.E.T+f+F+i+h+2+2+,@7+j+x+K+K+K+#@K+#@#@K+K+#@x+V+.+:+<+_+_+{+!+^+^+W.O.i.G.-+k.Q.| 1 j % @ + $ ! 3 k+D+s+2+'@; b M b M O A `+A+A.6 x n E F                 ",
+"                ^ : z.b ( '.V 8.n ~ X.h.] M.F.P.)@!@s+|+1+~@a+2+f+k+K+#@#@#@#@#@#@#@#@#@K+K+x+K+:+:+}+(+{+{+*+@+)+O.N.i.] t.Q.~ 1 f j y.+ R.3 3 {@]@~@^@-@B M O O O b O O ~.9.k f.0 U R                 ",
+"              u.( , w c s U n.,+<.r | -+-+q./@(@_@+@|+F+h+q+s+s+N+a+:@/@K+#@K+#@K+#@K+#@#@K+V+j+j+_+_+_+{+!+*+@+)+P.F.s.] t.X.>+@.f j N + u.! z+9+2+2+<@, , b ; O # O A ^ B+'.l ..6 U o +.              ",
+"              > 6 b > 5 [@o.9 0.1 v } { ] }@|@1@2@5++@F+s+2++@s+2+i+|+3@#@#@K+#@#@#@K+K+K+x+x+j+:+<+_+(+/+!+++++=+O.N.i.-+k.Q.~ v % % y.N + 3 4@J+2@=@5@M M ; M b A M b O s o.~.m ..t 8 x.              ",
+"              w x 5 ^ 0.t >.Z.4.| v Q.k.-+6@|+7@8@9@.@~@+@1+|+|+1+m+m+g+K+#@#@K+#@#@#@#@K+K+x+j+:+}+_+/+{+!+*+=+W.P.F.q.] t.X.>+v f % y.+ R.3 z+q+ @2+0@, M b M O b # M ^ b t '.o...m o n.              ",
+"            $ s 0 ..u 6 t $.Z.1.e ~ } { ] a@M.E.P.@+++b@+@|+h+s+s+i+h+c@K+#@K+#@K+#@#@K+x+K+:+j+[+(+(+_+{+*+@+=+P.F.M.i.{ < Q.| 1 e j ].R.. k+d@s+2+7+B M M ; ; b # A b O : 0 ,.U k #+,.p U             ",
+"            , c 2 u o.6 /.E ,+& f Y.Q.t.i.r.M.O.O.=+*+*+e@3+F+h+2+s+2+2@f@K+#@#@#@K+K+K+#@K+j+:+[+_+(+{+*+*+^+=+E.O.G.i.{ P X.e j e N @ u.$ =@g@h@i@j@, , M O ; A O O b O b 5 o 9.l o.,.9 8             ",
+"            b u s 0.0.B+..>.L.j j v } k.-+-+M.O.P.=+@+*+k@l@+@i+s+F+1+2+~@#@K+#@K+#@K+x+K+:+j+}+}+}+/+/+{+*+^+)+P.F.i.] t.< [ Y.f & % + + R.m@Q+n@C+o@B M O M M b b O M # M b U E I.>.p@q@q@            ",
+"          ].r@= ( u C d.,+T N @ f v [ } j.i.s.F.O.)+@+*+*+s@+@+@E+!@(@0+t@K+K+K+#@K+K+V+x+j+[+[+(+/+/+*+*+^+=+W.E.N.-+] t.Q.~ e H.j y.+ $ X+u@!@$@M+v@, , b # ; M M O b O # O B+p W =.Y X p@x           ",
+"          $ n H V >@u _ ,+w@N N ].@.[ P h.] s.F.O.P.=+^+*+{+x@d@7@y@i+2+_@V+K+K+K+K+K+K+<+[+}+}+/+_+!+!+^+=+W.O.M.M.r.-+k.Q.r | j ].& R.R.X+z@A@6@B@C@B M , b M O b O M O O O : U.n.U ~.,.n.D           ",
+"          / b * l D@X &.-.p j + % @.>+< k.i.r.G.F.O.W.=+=+*+u+E@u@t+2+F@n+G@V+:+V+L+L+:+:+[+<+_+{+/+!+*+*+)+W.O.E.i.-+h.< | ~ 1 j ].& . u.k+H@7+F+l@, , M M O O O b O b M M b w D D 0 A.E D@o           ",
+"          > ! < < e B+J.&.` N u.& 1 [ X.} { -+q.M.P.P.)+%@|@.+I@i+2++@(@2+J@<+L+L+L+L+[+}+(+_+(+/+!+++++)+P.N.F.i.] { { | [ @.% ].& d R.. k+K@h@p+L@B B # ; b b O M O M b b O b o.T.M@w.8 W 9           ",
+"          b . e | [ & _ 7 n.N R.].j @.[ Q.{ i.] r.G.O.W.m+2+k+N@2+2++@y@2+e@<+<+<+(+}+_+/+{+~+{+{+*+=+@+W.P.N.F.s.] k.< [ v e j % @ + u.$ k+e+O@7+N@, B O ; B M O b O O O O O b ..#+0.z n.P@J.          ",
+"          : u.X.~ & B m T p l.$ N % 1 | [ X.t.-+-+M.F.O.M+.@I+F+s+2+|+Y+2+Q@{+_+_+_+{+{+_+{+{+!+*+*+=+)+O.N.M.r.-+{ P [ ~ @.f & & y.. $ 3 k+R+F+=@R@M ; M M O b O M O M O M O A m D 0 o.9 q -.          ",
+"          - & ~ ]./ ( F 9 n.N u.N j e @.~ X.< i.i.] M.F.m+i+Y+|+|+1+E+S@2+T@!+{+*+/+{+*+{+*+*+@+^+=+@+W.O.G.s.i.i.k.Q.| e 1 e @ N y.R.3 3  @R@s+2+O@U@b O # O b O b ^ M b A # b `.k 0.U E G p@          ",
+"          ( @.1 ).: 4 z >@V@#.$ + @ f e 1 >+} < h.-+q.)@:@e+W@s+2+|+1+2+2+T@++*+++*+*+*+*+*+++=+@+W.F.O.F.s.-+i.< h.[ ~ @.f @ & @ . $ 3 ! X@6+|+D+2+Y@, b b M M O M b b # b O O ~...c.`.o q Z@          ",
+"          - 1 $ b # w o.n.w@#.L u.y.& H.1 ~ [ < t.{ i.s.-@)@u@|@|@f+h+2+`@0@ #*+.#@+++@+@+=+=+=+E.O.{+M.q.s.] k.Q.| >+r f j ].@ N R.$ a ! ! h@|+i+a+j@M B O O b O # O A # b M b ~.0 _ m R W I           ",
+"          = @ b # ).4  .9 w@$ L . + y.].H.1 >+| < t.{ i.+#{@@###2+h@6@h@E@+@.#9+5+E@W.W.W.P.W.O.O.F.M.q.i.i.>+h.[ [ @.H.j ].N y.R.$ a )./ /  #|+s+2+$## O b O M O A M O A M O ^ ~.#+0.U n.Z@%#          ",
+"          d.B M * / u R 8 V #.).3 . N @ ].H.v >+[ < t.j.k+a@&#*#|@3+G+a+e@T@7+=#5@v@-#P.O.O.O.O.F.q.i.i.j.i.k.k.} ~ 1 j & % N . R.L L 3 * / > S+i+2+2+2+; b O b # ^ b # O b M a.'.~.!.A+p@X Z           ",
+"          = ' u.$ M u I.E T 1.> * u.@ & & & H.v >+[ } h.t.;#&# @>#,#'#(@)#!#~#'@{#2+]#~@;#G.F.M.r.i.{ < { < t.} } >+1 ].].& + u.3 3 ! L / > k+M+2+y@~#y@A M O M b b # b O M O d.]+o.T.p ` Z Y           ",
+"          ( $ % y.$ 4 '.A+8 2.' ' u.u.d @ ].].j 1 e | >+} P 9@9@O+t@9+^#]@0+u@p+/#2+F+(#9@r.] i.{ { h.P h.{+P ~ ~ ~ e j y.y.. $ ! L ' > / , B u@3+3+2+_@O b O M M A M b # b ^ M@I.o.>.q 7.X %#          ",
+"          - R.& j y.( /.'.>.^.M ).' . . y.@ & & f @.~ | [ } t.9@9@9@n+9@_#:#z@2+|+2+!@2+2+<#{ k.k.h.>+< < >+r r 1 H.@.& @ @ & j ].+ R.R.3 L , h@$@2+2+2+O M O O O O O M M ; b 0 x.'.E D@Z@Z J           ",
+"          = * e e N ^ 0 x.Z.5.M * * 3 . R.y.@ ].].j 1 1 @.~ >+[ ~ } t.k.Y+T@I@[#A@+@2+}#@#2+h.< >+k.~ | X.~ @.v e e @.e j y.u.* L L / B > > a E@`@1+2+2+O b O O b O O b M M M c.I.R T W 7.J 7.          ",
+"          w O & N d `+9.o x.4.B > / L L $ . d @ & ].& e e e v >+>+~ } X.< 9+r+,@f+F@m+2+2+2+|#[ | | r v >+1 g H.1 f ~ H.$ $ ! L / / )., , , A a@}#2+2+2+O M b b ; b O ; O # b [@Z.o w@p@Z@X p@          ",
+"          b ( % ].* u T.F t 4.O > * L 3 L u.R.. + @ & & ].% H.1 @.@.~ ~ >+| 8+R@N+g+1#2+2+2+7+v v H.1 1 e @.j f @.r f % R.a + . ! / > B B ; # k+f+y@E+{#O M M A M b M b # B # _ E o.n.-.Z@Z q           ",
+"          * 5 u.N = F l l A.t #., / ' 3 L 3 $ u.u.+ y.@ & j & f f 1 H.H.v r e@r+f+s++@M+=@Q@i+1 j j j & H.j j g e & v & . + a 3 3 ' > , , M O ~#i+2+F+9+M O O O O M O ; M O : ~.A+>.n.J.7.%#9           ",
+"          3 2 u.M 0.+.#+_ D o.b.M / / ' ! 3 L $ u.. R.y.y.@ ].].% j % % f 1 e@u@|+i+2+|+2+2+2+].].].% & @ @ j & o@N+:@c@J+2+H+Q+<@s+-@H+b@!#Q+1#F+2+2+2#, O b O O b M b , A : 0  .T 8 p@%#3#U           ",
+"            c = 2 ]+U B+_ A.t C ; > > / * L ! L ! u.$ + @ y.N @ & ].j j & f e@e@y@y@i+2+2+2+=@& & @ N + . + 2#i@4#|+2+!@1+|+i+i+M+|@!@}# @N++@I@E+J+{@b * b ; b O M O B b s B+T.7 n.-.J 3#Z             ",
+"            ( ..U w.w.c.c.l R ..B , > / / / * 3 ! u.L $ . y.R.+ N @ y.@ & & % e@5+<@f+q+c@s+u@@ N y.u.R.u.m+i+s+c@s+1++@1+##i+F+|+s+y@5#F+|+2+j@'@l@I@A > > M b # b ; B : z.T.F z V@` Z 6#7.            ",
+"            : ~.k u l n D t 6.U # M , B B > > / * * L u.L ! $ $ . y.@ y.+ @ @ 7#g@S+D+i+h+f+y+R.R.+ . $ y@t+1+E+t+h+f+|@y@_@j@k+m@R+D+F+s+_@<@'@(@;#O O O ).# M M ; M # C M@9.,.E m.7.Z q@8#            ",
+"              k u ..T.l ~.w.D 6.: b B , , , > / / ' ).L a 3 3 3 $ $ . u.R.. R.. 6+b@|+i+2+2+*@$ u.L u.s@~@s+1+2+t+N@1@9#0#l+O+!#Y+a+S@O+;#,#a+a#O O b O O B , b M M M O 5 0 I.o 9 m.&.q@Y               ",
+"              [@/.U I.'.D c.m 8.o.M O M B B , B > / / ' ).3 3 a u.u.L ! 3 u.$ u.u+l+|+i+^@1+u@a ' L o@K@s+1+2+w+3+b#c#/ B B M # # , , > , O # O M b # M O ; L ; # , # : d.Z.E T 9 n.J 6#J               ",
+"              = w.I.E ~.C ^.f.7 T : O b , B , B > B / / > / > ).* L a ! L u.L 3 k+e+2+E+d#'@l+a L * S+i+s+i+W@|@e#a > / , , M M B B , B B A b O M A b b A O 3 M M M M b.c.9 n.w@V p@%#f#-.              ",
+"                m ]+F A.t -.p@-.p@x.M M # # B , , , > B , * )./ * ' > / ' * ! |#K@t+q+a+##2+=@)./ /@$@1+####J+:#> B / > B M , ; , , B , ; O M b O O O M # # ! O , ; O w 8 8.9 w@p@X 3#%#                ",
+"                [@>.7.%#=.V /.'.9 q s A A O O M B , , B , B B , / ).* / > * g#d+/#1+s+$#v@p+0#> h#i#{#2+o@j#9+, B ).k+=#, B B B B , B B b O M O b # O b M b u.M M ; b ;+S m.9 J.Z@%#3#*.                ",
+"                w T -.~.; @ ' 6  .9 E C b b M b O M B , B , , B > , , > / k+j#6@(@F+h+.#Q@k#H+'#]#.@2+;#t+3@B M ; b {#2+##I+, , , B , b # O O b # A M B b B u., , M M 7 p K q@f#%#6#3#9                 ",
+"                  0.l c+( / : k z T V 6 M b , # b O O O B B , , B B , > B 4@p+|+J+4#d@,@&#l#'#m#X@(@$#g+m@X@b b#M }#H+F+2+2+n#B , M M A b O M A b b # ; ; M $ B B M ^.;.x.~.V@Y 3#3#%#                  ",
+"                    +.x z.c k #+~.A+p  .5 O A b M # M # O O O M , , M , ,  #,@5#|+o#s+p#!@S+7@g+H@T+E@q#4@t@k+^@d+H+a+>#2+2+r+O A b O O M b O O ; ; O M B / 3 , , ^ Z.V 8.o.9 *.q@3#                    ",
+"                    0 ~...9.7 F T.>@p 9 ,+O M O b O M # # M b O A b M M ; # ; 4+F+z@n+S+h+$@`@h+##E+2+H+m#+@|+c@.#|+6@E@v@l+z+O O O b # M O b M M M # B B ).).M A A.;.9 A+n.&.%#3#J                     ",
+"                      F I.8 8 9 9 J.w@T z z C O M b b A M O ; M b ; O b M M M b o#m@Y+w+~@y@-@.#h+h+|+_@k#N@Q+,@{#q#T+k#E@O@r#O M b # A O b ; O O b B , , ).M C ]+J.J.9 p I q@3#q@                      ",
+"                      u n.8#q m.A+o.I.8 p T r@C M O b b b M b ; M b , O O O ; M '@W@F+##F+|@|+4#/#[#X@x@^@O+s#r#2+!@d+Y+|+Q@2+c@M A b O M M b , B , M > ) ) 5 n V 9 9 D@I Z 6#3#7.                      ",
+"                        ,.p@p@8 n e.T.J.8.Z.7 f.w O # # M ^ # A O # ^ b O O A O M {@m#|@D+u@i+`@h+|+p#C+|+e+|+s+y@<@!#|+2+2+l@w+:@O # M # O B M , B , M ^.3.m V@E 7 9 K Z 3#3#%#                        ",
+"                        B+A+n.o k 4 z J.F m U ]+c+z.A ^ b M O b A M # b b # b b A o@a#+@!@N+C+E+1+'@E+f++@T@S@1#a@|@s+y+2+2+i+T@r+M b # b ; , M , B ' ^.z.o.n.Z.l A.8#Z %#q@%#q                         ",
+"                          ..A+8 U u I.>@k 2 u U R m - b M O b M O b A M M b M ; b b@_@##2+F+##g+k+t#d#2+F@u@f+H+t@s+t+2+2+2+2+W@a@t@; M > B B , A ^.^.c ~.>@o.U m z p@u#q@q@`                           ",
+"                            l R o z 9 V k 4 4 k 9.8.,+C b # O b # O O O M O A # M  #C+v#|+M+e+~#,#2+>#l@w#3@s+-@2+2+2+2+2+2+<@8+T@T@; B , , B B M ^.u S R l 0.#+o.q X 6#Z J                             ",
+"                              9.T p -.W 9.r@C 5 n E S ]+A A b M M b O O O O b A O b k#<#{#)#{#{@J+M+x#5@y#v#|+##2+1+i+~@2+l+N@p+z#T@B , M M ^ ' b.~.J.x.m #+..~.G I 3#3#Y                               ",
+"                                o J.P@&.p u C s _ o.S J.S 5 O ^ O b b O b ; O O # T@D+E+A@W@~@$@2@z+^@!#S@r+{#l+g+J+|+6@S+2+X@k#p+4@B , , b+A ^./.A#E n m w.A.T *.3#3#q@                                ",
+"                                0.8 p@Z@P@U d.( [@I.J.T W 8.Z.C : A M b M M b b A O k+Y@t+r#'@z+F+I@d#|+u+!#z+B#y+i+##s+2+W@6@T@X+o@) ' B b+z.%.-.J.T.6 A.9.8 7.Z q@q@C#                                ",
+"                                  0 p K I n.o.l w.>.m.W W k ,.8 f.C A ^ ^ # M O O O O O T@D#|#e@6@y+E#m#[#0+Q@S@m@F@t+-@H@e+W@9+T@).> > `+..D@m.W V@..6 ~.V K q@u#Z Z@                                  ",
+"                                    `.m.X *.Z@8 >.w@n.=.V : 0 U >.n.0.d.C : # b M b # b # M O Q@|+S@/#F#O+k+j@E+##O+@#5@S+2+9+v@o#' M b.m.V R J.q 7 U >@W J Z q@Z p@                                    ",
+"                                      ..n.` %#7.q H p@f#u B 4 5 0.~.E V k r@b.s b.C A b b # # @@G#[#9@6@y@J+T@$#d#d#'@|+b@Y@v#B M A p I 8.~.+.>@>@>.W I %#3#q@Y H                                       ",
+"                                          9 7.%#&.&.Z %#^ O B b z.5 0.U 8 ;.p ~.k /.6 z.^.M B b > > %@/#u+;#X+R@3+^@q#w+]#|+H#,+Z.p z p@9 n A+-.W 7.%#3#3#q@Z                                           ",
+"                                            >.*.I J f#7...[@z._ ( O w _ 0.~.I.8 V@-.]+]+l r@^., , , ; Z+0#g+F+(@k#k+j#y@0#I# +E U 0._ 8 Z@F q Z@I Z 3#3#3#X                                             ",
+"                                              o 7.%#3#C#w@E T.u = M A ( 4 _ 2 D x.8 n.n.m.W -.W %.S U.;.S.9@]+7 /#&#9@o o.l /.f._ 6 B+l J J.7.J q@3#6#3#I                                               ",
+"                                                l C#q@*.7.q 9 T.!.u 0.r@C O ( 0 I.Z.E R 8 T  +8 8.9 V ;.8 E Z.]+w.~.l D k [@B+z.n 9.~.T.Z Z u#q@%#q@Z `                                                 ",
+"                                                    n.p@K ` C#-.V@>@E n r@( r@0.o.9.9.'.>.R I.U F o.o.#+k k u [@c+D +./.2 x u +.>@V@J.&.6#6#q@%#Z K                                                     ",
+"                                                        p &.J J 7.p@D@n. .U U z >.A+I.R F z E ~.'.D - - 4 5 4 w 2 '.I.w.D U A+J#C#K Z 6#3#q@3#J                                                         ",
+"                                                            J.I %#X J *.p@q D@p@p@W q >@A+>@>.o 8 ~.w.U U D k ..o.8.8.T V@-.7.J %#Z u#3#3#J                                                             ",
+"                                                                G K %#%#X X J %#I J =.&.&.p@p G P@C#p@H V@n.n.G q p@&.I X %#q@q@3#q@%#X                                                                 ",
+"                                                                    >.A#=.%#u#q@3#q@q@%#Z =.K J %#%#Z J I =.%#Z Y %#%#u#q@q@q@q@J p@                                                                    ",
+"                                                                          8 P@*.Z 6#3#q@q@Z f#3#f#f#f#u#%#Y 3#Z q@q@Z q@X I p@                                                                          ",
+"                                                                                  8 -.&.*.X Z q@f#q@u#u#q@u#%#X ` p@-.                                                                                  ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.bmp
new file mode 100644 (file)
index 0000000..0cf7afb
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddAllPatients.xpm
new file mode 100644 (file)
index 0000000..a946708
--- /dev/null
@@ -0,0 +1,1156 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_AddAllPatients_xpm[] = {
+"50 50 1103 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5B5FAE",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAE",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #6162A1",
+"(.    c #474762",
+"_.    c #555561",
+":.    c #696AA4",
+"<.    c #9999DC",
+"[.    c #9C9DD8",
+"}.    c #A6A6E5",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A0A0D2",
+"4.    c #B1B100",
+"5.    c #9E9E00",
+"6.    c #8B8DDB",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7D81D4",
+"k.    c #4C4E91",
+"l.    c #565856",
+"m.    c #646524",
+"n.    c #797A2B",
+"o.    c #757529",
+"p.    c #85844E",
+"q.    c #999A63",
+"r.    c #B0AFBB",
+"s.    c #B7B8F2",
+"t.    c #B8B9EF",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #99993B",
+"x.    c #848400",
+"y.    c #838300",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7D80C9",
+"D.    c #8C8FA2",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #989B9C",
+"P.    c #939306",
+"Q.    c #7579AE",
+"R.    c #3F3F71",
+"S.    c #6D6E34",
+"T.    c #888815",
+"U.    c #767604",
+"V.    c #737304",
+"W.    c #6B6B00",
+"X.    c #777707",
+"Y.    c #959551",
+"Z.    c #B5B4A0",
+"`.    c #C4C4A0",
+" +    c #C0C1F5",
+".+    c #BDBEF6",
+"++    c #8F8F00",
+"@+    c #747400",
+"#+    c #676700",
+"$+    c #9FA0EA",
+"%+    c #9899E7",
+"&+    c #9193E3",
+"*+    c #A9A93A",
+"=+    c #86863F",
+"-+    c #75753F",
+";+    c #7C7C3D",
+">+    c #6C6EC8",
+",+    c #6466BF",
+"'+    c #6262BB",
+")+    c #5357A8",
+"!+    c #42437C",
+"~+    c #525196",
+"{+    c #5F60B6",
+"]+    c #6263BB",
+"^+    c #7878BB",
+"/+    c #BBBED0",
+"(+    c #878BDF",
+"_+    c #82820E",
+":+    c #666534",
+"<+    c #59593B",
+"[+    c #949424",
+"}+    c #868604",
+"|+    c #898900",
+"1+    c #9F9F00",
+"2+    c #9D9D00",
+"3+    c #868600",
+"4+    c #656507",
+"5+    c #949417",
+"6+    c #BEBE48",
+"7+    c #CBCBB6",
+"8+    c #C9C8F7",
+"9+    c #969600",
+"0+    c #7D7D00",
+"a+    c #5A5A00",
+"b+    c #9B9C1C",
+"c+    c #949432",
+"d+    c #8A8A00",
+"e+    c #7C7C00",
+"f+    c #6E6E05",
+"g+    c #67670B",
+"h+    c #666615",
+"i+    c #7E7F24",
+"j+    c #666AC2",
+"k+    c #6767B6",
+"l+    c #5A5AAF",
+"m+    c #444884",
+"n+    c #50529D",
+"o+    c #54539D",
+"p+    c #5656A4",
+"q+    c #AEAEB9",
+"r+    c #B3B3C6",
+"s+    c #888ADD",
+"t+    c #7F81D6",
+"u+    c #5C5EAD",
+"v+    c #737300",
+"w+    c #6C6C00",
+"x+    c #6D6D04",
+"y+    c #888800",
+"z+    c #B0B000",
+"A+    c #BBBB00",
+"B+    c #C1C100",
+"C+    c #A9A900",
+"D+    c #848408",
+"E+    c #A4A455",
+"F+    c #B8B74E",
+"G+    c #D7D6F1",
+"H+    c #D3D2FA",
+"I+    c #979700",
+"J+    c #959500",
+"K+    c #666600",
+"L+    c #555500",
+"M+    c #767600",
+"N+    c #828200",
+"O+    c #777700",
+"P+    c #616100",
+"Q+    c #868626",
+"R+    c #757688",
+"S+    c #6161BA",
+"T+    c #595BAD",
+"U+    c #42457F",
+"V+    c #4E529B",
+"W+    c #4F508F",
+"X+    c #4F4F8E",
+"Y+    c #B4B5C8",
+"Z+    c #8586C8",
+"`+    c #7A7DD4",
+" @    c #696AC2",
+".@    c #3C3C6A",
+"+@    c #8D8D00",
+"@@    c #7B7B00",
+"#@    c #8C8C00",
+"$@    c #ABAB00",
+"%@    c #B4B400",
+"&@    c #B6B600",
+"*@    c #BCBC57",
+"=@    c #D5D7DD",
+"-@    c #E0E0FA",
+";@    c #DEDEF0",
+">@    c #DCE0FB",
+",@    c #DCDCFC",
+"'@    c #919100",
+")@    c #6E6E00",
+"!@    c #7E7E00",
+"~@    c #A0A000",
+"{@    c #B5B500",
+"]@    c #BDBD00",
+"^@    c #BCBC00",
+"/@    c #B2B200",
+"(@    c #5E5E00",
+"_@    c #757500",
+":@    c #848453",
+"<@    c #6A6AAD",
+"[@    c #6061B9",
+"}@    c #5F5FB8",
+"|@    c #5C5BAE",
+"1@    c #302F52",
+"2@    c #4E5090",
+"3@    c #4E4E88",
+"4@    c #70709F",
+"5@    c #7679D1",
+"6@    c #515396",
+"7@    c #46467E",
+"8@    c #515385",
+"9@    c #9796E3",
+"0@    c #909000",
+"a@    c #989800",
+"b@    c #A4A400",
+"c@    c #B4B53B",
+"d@    c #D1D1CB",
+"e@    c #E4E3FA",
+"f@    c #E7E5FA",
+"g@    c #E6E8FC",
+"h@    c #E1E2FB",
+"i@    c #929200",
+"j@    c #939300",
+"k@    c #A2A200",
+"l@    c #B8B800",
+"m@    c #BFBF00",
+"n@    c #C4C400",
+"o@    c #BABA00",
+"p@    c #7F7F00",
+"q@    c #595900",
+"r@    c #949400",
+"s@    c #737492",
+"t@    c #5E62BC",
+"u@    c #5D61BC",
+"v@    c #5C60BB",
+"w@    c #41407C",
+"x@    c #454677",
+"y@    c #4A4A7C",
+"z@    c #484876",
+"A@    c #AFB1C0",
+"B@    c #6669C1",
+"C@    c #5B5DAE",
+"D@    c #343660",
+"E@    c #393C65",
+"F@    c #8A8DD8",
+"G@    c #9798E6",
+"H@    c #8B8B00",
+"I@    c #9C9C00",
+"J@    c #96971F",
+"K@    c #A2A27F",
+"L@    c #E3E7F7",
+"M@    c #E9ECFC",
+"N@    c #EAEAFB",
+"O@    c #E7E4FA",
+"P@    c #9B9B00",
+"Q@    c #A7A700",
+"R@    c #ACAC00",
+"S@    c #AFAF00",
+"T@    c #A6A600",
+"U@    c #AAAA00",
+"V@    c #5F5F00",
+"W@    c #BDBD09",
+"X@    c #B4B425",
+"Y@    c #5D5FB8",
+"Z@    c #5C60BA",
+"`@    c #5A5BAF",
+" #    c #37375E",
+".#    c #4D508E",
+"+#    c #4B4B7E",
+"@#    c #4A4882",
+"##    c #9396C1",
+"$#    c #5B5DB2",
+"%#    c #484C8D",
+"&#    c #2D2F54",
+"*#    c #6A6AA8",
+"=#    c #9290E0",
+"-#    c #A4A4ED",
+";#    c #858500",
+">#    c #808000",
+",#    c #838341",
+"'#    c #BAB9AD",
+")#    c #EAEBFC",
+"!#    c #E9ECFD",
+"~#    c #E7E7FB",
+"{#    c #A1A100",
+"]#    c #8488DC",
+"^#    c #7E7ED4",
+"/#    c #7376CF",
+"(#    c #6E72CA",
+"_#    c #686AC2",
+":#    c #9A9A02",
+"<#    c #6060B8",
+"[#    c #464782",
+"}#    c #4A4A81",
+"|#    c #4D4E8A",
+"1#    c #3E3D67",
+"2#    c #9797C0",
+"3#    c #7A7AB6",
+"4#    c #5A5AAA",
+"5#    c #4C4C8B",
+"6#    c #797BC3",
+"7#    c #9090E1",
+"8#    c #A3A3EC",
+"9#    c #B3B2F4",
+"0#    c #7C7D06",
+"a#    c #898A4A",
+"b#    c #C3C6B8",
+"c#    c #E6E7F5",
+"d#    c #EAECFC",
+"e#    c #E7E7FC",
+"f#    c #878700",
+"g#    c #999900",
+"h#    c #8487DD",
+"i#    c #7C7ED7",
+"j#    c #7476D0",
+"k#    c #6F72CC",
+"l#    c #666AC3",
+"m#    c #6769C0",
+"n#    c #6464BD",
+"o#    c #5D62BB",
+"p#    c #5E60BA",
+"q#    c #5A5EB9",
+"r#    c #5055A5",
+"s#    c #3C3D66",
+"t#    c #4B4C81",
+"u#    c #3A3B64",
+"v#    c #6D6D99",
+"w#    c #4C4F90",
+"x#    c #505396",
+"y#    c #34345A",
+"z#    c #3E406C",
+"A#    c #7D7ECC",
+"B#    c #8D8EE1",
+"C#    c #9496E6",
+"D#    c #A0A2ED",
+"E#    c #ADAFF2",
+"F#    c #828231",
+"G#    c #E0E1EB",
+"H#    c #E9EAFA",
+"I#    c #E8E7FA",
+"J#    c #727200",
+"K#    c #7A7A00",
+"L#    c #4B4B00",
+"M#    c #8589DD",
+"N#    c #7071C5",
+"O#    c #6A6EB9",
+"P#    c #6D6FAB",
+"Q#    c #6868AF",
+"R#    c #6063BC",
+"S#    c #5B5FBA",
+"T#    c #5D5FB9",
+"U#    c #3B3A6B",
+"V#    c #3F4271",
+"W#    c #40416C",
+"X#    c #3B3867",
+"Y#    c #9091AF",
+"Z#    c #505297",
+"`#    c #4C4D8C",
+" $    c #464680",
+".$    c #48487A",
+"+$    c #7F82D2",
+"@$    c #8A8DE0",
+"#$    c #9796E4",
+"$$    c #AEAEF2",
+"%$    c #BABBF6",
+"&$    c #828228",
+"*$    c #A5A67B",
+"=$    c #E1E1F1",
+"-$    c #E4E3FB",
+";$    c #6D6D00",
+">$    c #818100",
+",$    c #575700",
+"'$    c #8184DA",
+")$    c #7C7DD4",
+"!$    c #7376CE",
+"~$    c #7074B7",
+"{$    c #7A7B69",
+"]$    c #868735",
+"^$    c #72737A",
+"/$    c #6667A6",
+"($    c #6161B6",
+"_$    c #5E60B9",
+":$    c #4B4B8E",
+"<$    c #373661",
+"[$    c #323358",
+"}$    c #1C1A2D",
+"|$    c #9898C4",
+"1$    c #62648A",
+"2$    c #414077",
+"3$    c #5858A9",
+"4$    c #3E4274",
+"5$    c #676BB3",
+"6$    c #8184D6",
+"7$    c #878ADC",
+"8$    c #9294E5",
+"9$    c #9C9DE8",
+"0$    c #AAABF0",
+"a$    c #B6B5F3",
+"b$    c #C2C0F5",
+"c$    c #696900",
+"d$    c #8A8B42",
+"e$    c #CACCC9",
+"f$    c #D2D1D7",
+"g$    c #656603",
+"h$    c #E0E1FA",
+"i$    c #DADBFB",
+"j$    c #646400",
+"k$    c #777AD2",
+"l$    c #7275C8",
+"m$    c #72759E",
+"n$    c #7E7F37",
+"o$    c #7C7C0A",
+"p$    c #70704A",
+"q$    c #646798",
+"r$    c #6263B3",
+"s$    c #6164AE",
+"t$    c #5E62B6",
+"u$    c #5D61B7",
+"v$    c #5E5EB6",
+"w$    c #31335E",
+"x$    c #2A2E50",
+"y$    c #232440",
+"z$    c #7474A8",
+"A$    c #6D6FC7",
+"B$    c #5C5D99",
+"C$    c #232546",
+"D$    c #21213B",
+"E$    c #7576C6",
+"F$    c #8181D6",
+"G$    c #8588DB",
+"H$    c #8E90E0",
+"I$    c #9898E6",
+"J$    c #A4A4EC",
+"K$    c #AEAFF1",
+"L$    c #BAB9F4",
+"M$    c #56560A",
+"N$    c #9B9B8E",
+"O$    c #D2CFF8",
+"P$    c #D7D7FA",
+"Q$    c #D8D8FC",
+"R$    c #D9DAF9",
+"S$    c #D6D5FA",
+"T$    c #D6D6F9",
+"U$    c #505000",
+"V$    c #606000",
+"W$    c #6A6A00",
+"X$    c #777AD1",
+"Y$    c #7275C1",
+"Z$    c #797B80",
+"`$    c #878716",
+" %    c #787807",
+".%    c #666626",
+"+%    c #6D6E5A",
+"@%    c #696C85",
+"#%    c #767862",
+"$%    c #6F7272",
+"%%    c #64678E",
+"&%    c #6162A9",
+"*%    c #4B4A85",
+"=%    c #272849",
+"-%    c #4A4A8B",
+";%    c #767AD1",
+">%    c #7F82D8",
+",%    c #5B5CAA",
+"'%    c #787ACD",
+")%    c #7B7CD4",
+"!%    c #8084DA",
+"~%    c #8A8ADE",
+"{%    c #9296E6",
+"]%    c #999DE9",
+"^%    c #A4A6EE",
+"/%    c #AEADF0",
+"(%    c #C1C0F4",
+"_%    c #C6C6F5",
+":%    c #CAC9F7",
+"<%    c #CECEF7",
+"[%    c #D0CFF7",
+"}%    c #C9C8F6",
+"|%    c #C3C3F6",
+"1%    c #BABCF6",
+"2%    c #B3B4F4",
+"3%    c #AAAAEF",
+"4%    c #9E9EEA",
+"5%    c #9496E7",
+"6%    c #8C8DDF",
+"7%    c #5C5C00",
+"8%    c #6F73B9",
+"9%    c #7A7B53",
+"0%    c #8B8C08",
+"a%    c #828210",
+"b%    c #87880F",
+"c%    c #888817",
+"d%    c #7D7D1D",
+"e%    c #6E6F38",
+"f%    c #63667A",
+"g%    c #4C4B70",
+"h%    c #45487C",
+"i%    c #262544",
+"j%    c #3F3F79",
+"k%    c #7C7FD6",
+"l%    c #6969C0",
+"m%    c #4A4C8C",
+"n%    c #373864",
+"o%    c #7579D0",
+"p%    c #797AD3",
+"q%    c #7C7FD8",
+"r%    c #8484D9",
+"s%    c #8C8EE0",
+"t%    c #9294E3",
+"u%    c #9C9DEA",
+"v%    c #B5B6F4",
+"w%    c #BBBAF5",
+"x%    c #BEBCF3",
+"y%    c #C0BEF5",
+"z%    c #BEC0F6",
+"A%    c #BBBEF5",
+"B%    c #B8B8F5",
+"C%    c #B2B1F1",
+"D%    c #A8A9EE",
+"E%    c #9E9EEB",
+"F%    c #9598E7",
+"G%    c #8C90E0",
+"H%    c #7878D0",
+"I%    c #7073CA",
+"J%    c #6D709B",
+"K%    c #797934",
+"L%    c #A2A201",
+"M%    c #999903",
+"N%    c #7F7F09",
+"O%    c #6F6F24",
+"P%    c #595A38",
+"Q%    c #545564",
+"R%    c #31314A",
+"S%    c #39386E",
+"T%    c #6D70CB",
+"U%    c #6062BA",
+"V%    c #4A4988",
+"W%    c #2E3055",
+"X%    c #7274CC",
+"Y%    c #7375CD",
+"Z%    c #7578D0",
+"`%    c #7E7FD6",
+" &    c #8587DC",
+".&    c #8E8FE2",
+"+&    c #9696E6",
+"@&    c #9B9CE9",
+"#&    c #9E9FE9",
+"$&    c #626140",
+"%&    c #626241",
+"&&    c #4C4C0B",
+"*&    c #474700",
+"=&    c #5B5B3C",
+"-&    c #626461",
+";&    c #7F81D7",
+">&    c #7275CE",
+",&    c #6E72C4",
+"'&    c #6C6D83",
+")&    c #74740E",
+"!&    c #A4A402",
+"~&    c #A8A80F",
+"{&    c #A6A619",
+"]&    c #A0A010",
+"^&    c #82830C",
+"/&    c #6F6F0E",
+"(&    c #6E6F34",
+"_&    c #30313B",
+":&    c #323264",
+"<&    c #6367C0",
+"[&    c #656AC2",
+"}&    c #424475",
+"|&    c #2D2E51",
+"1&    c #7274CB",
+"2&    c #6D71CA",
+"3&    c #777AD4",
+"4&    c #8083D7",
+"5&    c #8688DB",
+"6&    c #8B8EE0",
+"7&    c #585833",
+"8&    c #65688B",
+"9&    c #676BB7",
+"0&    c #646560",
+"a&    c #6B6B0A",
+"b&    c #797901",
+"c&    c #8F8F01",
+"d&    c #7E7E0A",
+"e&    c #7C7D37",
+"f&    c #818369",
+"g&    c #868851",
+"h&    c #81813B",
+"i&    c #646417",
+"j&    c #717119",
+"k&    c #3B3B18",
+"l&    c #333258",
+"m&    c #7073CC",
+"n&    c #7174CD",
+"o&    c #4D4C8E",
+"p&    c #2E2F54",
+"q&    c #6F73CA",
+"r&    c #6A6CC6",
+"s&    c #6F71C9",
+"t&    c #7D7ED6",
+"u&    c #4F4F1C",
+"v&    c #5A5B5E",
+"w&    c #6D70BE",
+"x&    c #64667E",
+"y&    c #636341",
+"z&    c #696A0D",
+"A&    c #79790C",
+"B&    c #878701",
+"C&    c #6A6A1A",
+"D&    c #5C5E6B",
+"E&    c #6165A3",
+"F&    c #6568A5",
+"G&    c #6B6C91",
+"H&    c #595A43",
+"I&    c #6B6B1B",
+"J&    c #5A5910",
+"K&    c #464657",
+"L&    c #6D70C9",
+"M&    c #7477D0",
+"N&    c #53549A",
+"O&    c #2D2C4F",
+"P&    c #676ABA",
+"Q&    c #6A6CC5",
+"R&    c #5A5B54",
+"S&    c #636300",
+"T&    c #6464BE",
+"U&    c #6063A8",
+"V&    c #67679D",
+"W&    c #6A6A6B",
+"X&    c #73744C",
+"Y&    c #797A26",
+"Z&    c #6D6E24",
+"`&    c #606265",
+" *    c #5C60B3",
+".*    c #6061B8",
+"+*    c #3E3E6A",
+"@*    c #252541",
+"#*    c #35361A",
+"$*    c #413F66",
+"%*    c #CED0CA",
+"&*    c #6064BA",
+"**    c #686CC4",
+"=*    c #5C5EA5",
+"-*    c #6565BE",
+";*    c #6164BC",
+">*    c #5D61BB",
+",*    c #6063BA",
+"'*    c #6565AD",
+")*    c #5F629B",
+"!*    c #666847",
+"~*    c #5B5D69",
+"{*    c #5E61A9",
+"]*    c #6262BA",
+"^*    c #5A5AAB",
+"/*    c #383A65",
+"(*    c #262645",
+"_*    c #0F101E",
+":*    c #434480",
+"<*    c #585BAA",
+"[*    c #4F5091",
+"}*    c #494980",
+"|*    c #484D8F",
+"1*    c #56589B",
+"2*    c #6467BF",
+"3*    c #6868C2",
+"4*    c #5E61BA",
+"5*    c #6062BC",
+"6*    c #5F64B2",
+"7*    c #5D6196",
+"8*    c #5C60A3",
+"9*    c #5E60B2",
+"0*    c #494C8E",
+"a*    c #353358",
+"b*    c #1E1D36",
+"c*    c #09080F",
+"d*    c #595AA4",
+"e*    c #8B8CA4",
+"f*    c #484B7F",
+"g*    c #494C80",
+"h*    c #474882",
+"i*    c #484B84",
+"j*    c #6366C0",
+"k*    c #676BC3",
+"l*    c #515100",
+"m*    c #6364BC",
+"n*    c #6465BE",
+"o*    c #5F62B9",
+"p*    c #5B5EB6",
+"q*    c #3B3C66",
+"r*    c #2D2E52",
+"s*    c #131220",
+"t*    c #9294BE",
+"u*    c #AFB0BA",
+"v*    c #3E416D",
+"w*    c #4A4B83",
+"x*    c #5D60B3",
+"y*    c #6263BC",
+"z*    c #5D5D00",
+"A*    c #5F63BC",
+"B*    c #5F62BB",
+"C*    c #4C4D95",
+"D*    c #282849",
+"E*    c #0B0C18",
+"F*    c #28284A",
+"G*    c #B2B4C8",
+"H*    c #42426E",
+"I*    c #424270",
+"J*    c #444782",
+"K*    c #3A3B6E",
+"L*    c #454580",
+"M*    c #5F61BB",
+"N*    c #525200",
+"O*    c #5C61BA",
+"P*    c #6463BA",
+"Q*    c #333767",
+"R*    c #262746",
+"S*    c #1D1C32",
+"T*    c #08060C",
+"U*    c #464683",
+"V*    c #808190",
+"W*    c #212039",
+"X*    c #42437B",
+"Y*    c #4E5191",
+"Z*    c #353864",
+"`*    c #4D5096",
+" =    c #656500",
+".=    c #707000",
+"+=    c #ADAD00",
+"@=    c #A3A300",
+"#=    c #6162BA",
+"$=    c #6064BE",
+"%=    c #4A4A8E",
+"&=    c #19172B",
+"*=    c #19172A",
+"==    c #0C0B15",
+"-=    c #131221",
+";=    c #9394BA",
+">=    c #ACAFBC",
+",=    c #4B4C86",
+"'=    c #5459A9",
+")=    c #4E5294",
+"!=    c #404271",
+"~=    c #343663",
+"{=    c #5C5EB4",
+"]=    c #5E62BD",
+"^=    c #B7B700",
+"/=    c #6668C0",
+"(=    c #5A5EB2",
+"_=    c #242443",
+":=    c #414470",
+"<=    c #1C1C33",
+"[=    c #07040A",
+"}=    c #343462",
+"|=    c #6A6B90",
+"1=    c #3E3F69",
+"2=    c #38375F",
+"3=    c #343256",
+"4=    c #2B2A4C",
+"5=    c #3D407A",
+"6=    c #5C5EB7",
+"7=    c #4C4C00",
+"8=    c #A8A800",
+"9=    c #6365BE",
+"0=    c #6164B9",
+"a=    c #302F5A",
+"b=    c #252645",
+"c=    c #242442",
+"d=    c #0A0912",
+"e=    c #120F1E",
+"f=    c #7676B2",
+"g=    c #282948",
+"h=    c #222240",
+"i=    c #42487E",
+"j=    c #313258",
+"k=    c #272749",
+"l=    c #454887",
+"m=    c #B3B300",
+"n=    c #5F64BD",
+"o=    c #6063BD",
+"p=    c #6869BE",
+"q=    c #454684",
+"r=    c #393A63",
+"s=    c #0B0B15",
+"t=    c #3B3D70",
+"u=    c #87889D",
+"v=    c #323256",
+"w=    c #4D4D88",
+"x=    c #323458",
+"y=    c #434476",
+"z=    c #393A68",
+"A=    c #4E4E95",
+"B=    c #484809",
+"C=    c #4D4E32",
+"D=    c #6061BA",
+"E=    c #6267BA",
+"F=    c #444580",
+"G=    c #484A7C",
+"H=    c #141526",
+"I=    c #22253F",
+"J=    c #9295BC",
+"K=    c #626484",
+"L=    c #333459",
+"M=    c #484A88",
+"N=    c #4D4E94",
+"O=    c #3E4073",
+"P=    c #3D3E75",
+"Q=    c #494911",
+"R=    c #474701",
+"S=    c #49490F",
+"T=    c #545568",
+"U=    c #6264BE",
+"V=    c #5A5CAE",
+"W=    c #30315D",
+"X=    c #3D406D",
+"Y=    c #4C4E86",
+"Z=    c #242542",
+"`=    c #07050C",
+" -    c #101223",
+".-    c #6B6EA0",
+"+-    c #34345D",
+"@-    c #191A30",
+"#-    c #36365E",
+"$-    c #4A4A88",
+"%-    c #313056",
+"&-    c #30305D",
+"*-    c #5255A3",
+"=-    c #474804",
+"--    c #6064BF",
+";-    c #6466C0",
+">-    c #6666BF",
+",-    c #6668C1",
+"'-    c #6366BE",
+")-    c #4E5196",
+"!-    c #2B2C52",
+"~-    c #3A3C6B",
+"{-    c #444876",
+"]-    c #2E2E50",
+"^-    c #0C0912",
+"/-    c #0D0B16",
+"(-    c #494986",
+"_-    c #ADAFBA",
+":-    c #292B4C",
+"<-    c #18172B",
+"[-    c #333456",
+"}-    c #38385F",
+"|-    c #232240",
+"1-    c #34335C",
+"2-    c #2F3258",
+"3-    c #3E3E74",
+"4-    c #585CB1",
+"5-    c #5C5EB8",
+"6-    c #5D60B9",
+"7-    c #6265BD",
+"8-    c #5E60B6",
+"9-    c #444684",
+"0-    c #2C2E52",
+"a-    c #2C2A4A",
+"b-    c #424474",
+"c-    c #232543",
+"d-    c #0C0C16",
+"e-    c #0E0D19",
+"f-    c #43447A",
+"g-    c #ACAFB9",
+"h-    c #2E2E52",
+"i-    c #12101F",
+"j-    c #1C1B33",
+"k-    c #0E0E1A",
+"l-    c #5857A5",
+"m-    c #50529F",
+"n-    c #444783",
+"o-    c #373863",
+"p-    c #42427B",
+"q-    c #474A8E",
+"r-    c #52529E",
+"s-    c #595BB0",
+"t-    c #6262BC",
+"u-    c #6062BB",
+"v-    c #575EB2",
+"w-    c #3C3F76",
+"x-    c #2F3056",
+"y-    c #383965",
+"z-    c #35365C",
+"A-    c #262644",
+"B-    c #12101C",
+"C-    c #0A060C",
+"D-    c #0F101C",
+"E-    c #424479",
+"F-    c #B0B3C6",
+"G-    c #515369",
+"H-    c #0D0E1C",
+"I-    c #0E0E1C",
+"J-    c #3C3D6E",
+"K-    c #4A4F8E",
+"L-    c #5759B0",
+"M-    c #5558AB",
+"N-    c #4E5094",
+"O-    c #464682",
+"P-    c #363764",
+"Q-    c #3C3B6E",
+"R-    c #3B3E77",
+"S-    c #3F407C",
+"T-    c #3B3D73",
+"U-    c #3A3A6E",
+"V-    c #383A6F",
+"W-    c #3B3B70",
+"X-    c #3C3B70",
+"Y-    c #3A3B6D",
+"Z-    c #34355E",
+"`-    c #454680",
+" ;    c #4E5095",
+".;    c #474C8A",
+"+;    c #18172D",
+"@;    c #090A13",
+"#;    c #161728",
+"$;    c #64668E",
+"%;    c #60607F",
+"&;    c #18182C",
+"*;    c #292A49",
+"=;    c #3C3C68",
+"-;    c #464882",
+";;    c #545BAF",
+">;    c #50529A",
+",;    c #3B3E6B",
+"';    c #2F3158",
+");    c #363760",
+"!;    c #383860",
+"~;    c #303358",
+"{;    c #414272",
+"];    c #46487E",
+"^;    c #4C4A7E",
+"/;    c #4D5091",
+"(;    c #383962",
+"_;    c #0A060E",
+":;    c #0B0A12",
+"<;    c #262745",
+"[;    c #7070A4",
+"};    c #ACAEB6",
+"|;    c #55566D",
+"1;    c #131528",
+"2;    c #141221",
+"3;    c #1B1B32",
+"4;    c #2F2F4F",
+"5;    c #303054",
+"6;    c #292847",
+"7;    c #323257",
+"8;    c #393960",
+"9;    c #393A62",
+"0;    c #3D3E69",
+"a;    c #4C4E8E",
+"b;    c #4A4B8A",
+"c;    c #52539A",
+"d;    c #3C4070",
+"e;    c #343459",
+"f;    c #20213B",
+"g;    c #110F1C",
+"h;    c #08070E",
+"i;    c #1E2038",
+"j;    c #616386",
+"k;    c #ADB1C2",
+"l;    c #AAAEB6",
+"m;    c #32335B",
+"n;    c #19182C",
+"o;    c #0F0E1B",
+"p;    c #0A0A15",
+"q;    c #0F0F1B",
+"r;    c #121223",
+"s;    c #1A1B34",
+"t;    c #131223",
+"u;    c #141527",
+"v;    c #181A30",
+"w;    c #161324",
+"x;    c #0F0D19",
+"y;    c #080810",
+"z;    c #0B080F",
+"A;    c #0D0C18",
+"B;    c #20223B",
+"C;    c #444379",
+"D;    c #AEB0BC",
+"E;    c #ADAEB8",
+"F;    c #848394",
+"G;    c #2E3054",
+"H;    c #1E1E36",
+"I;    c #0B0D19",
+"J;    c #0A080E",
+"K;    c #08050A",
+"L;    c #09070D",
+"M;    c #090911",
+"N;    c #10101D",
+"O;    c #252946",
+"P;    c #373A69",
+"Q;    c #8A8CA2",
+"R;    c #B0B0C0",
+"S;    c #8E8EA8",
+"T;    c #8A8BA0",
+"U;    c #868A9E",
+"V;    c #848698",
+"W;    c #838698",
+"X;    c #83879A",
+"Y;    c #89889D",
+"Z;    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+0.,+'+)+!+~+{+]+^+              ",
+"              /+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+@+b+c+d+e+f+g+h+i+j+k+'+l+m+n+o+p+q+            ",
+"            r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+x.N+|+d+O+P+W.Q+R+H.S+T+U+V+W+X+Y+          ",
+"            Z+`+ @.@+@@@#+#@$@%@&@*@=@-@;@>@,@'@I+d+)@!@~@{@]@^@/@#@(@_@:@<@[@}@|@1@2@3@4@          ",
+"          {.5@6@7@8@9@0@d+a@b@C+c@d@e@f@g@e@h@d+i@a@j@k@$@/@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@        ",
+"          B@C@D@E@F@G@H@0@9+I@1+J@K@L@M@N@M@O@y.#@i@P@1+Q@R@{@o@S@T@U@V@v+W@X@Y@Z@`@ #.#+#@#        ",
+"        ##$#%#&#*#=#%+-#;##@j@a@>#,#'#)#)#!#~#e+x.+@9+P@{#b@5.]#^#/#(#_#:#B+'+<#v@Z@[#}#|#1#2#      ",
+"        3#4#5#: 6#7#%+8#9#>#y+++#@0#a#b#c#d#e#M+!@f#0@g#g#!@(@h#i#j#k#l#m#n#o#p#q#Z@r#s#t#u#v#      ",
+"        w#x#y#z#A#B#C#D#E#_@0+3++@#@>#F#G#H#I#J#K#y.#@J+j@w+L#M#^.j#N#O#P#Q#R#v@Z@S#T#U#V#W#X#      ",
+"      Y#Z#`# $.$+$@$#$$+$$%$v+K#>#y.3+&$*$=$-$;$M+p@f#0@r@>$,$'$)$!$~${$]$^$/$($Z@S#_$:$<$[$}$|$    ",
+"      1$2$3$4$5$6$7$8$9$0$a$b$c$c$d$e$f$g$h$i$j$w+_@p@y+'@i@w+q@k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$    ",
+"      A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$,$V$W$v+!@d+>$,$X$Y$Z$`$ %.%+%@%#%$%%%&%*%`#=%-%    ",
+"      ;%>%,%u#'%)%!%~%{%]%^%/%L$(%_%:%<%[%<%}%|%1%2%3%4%5%6%W.7%*.8%9%0%3+@@a%b%c%d%e%f%g%h%i%j%    ",
+"      k%l%m%n%o%p%q%r%s%t%u%^%E#v%w%x%y%z%z%A%B%C%D%E%F%G%]#k%H%I%J%K%f#++r@P@C+L%M%N%O%P%Q%R%S%    ",
+"      T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&*&*&*&*&*&*&*&=&-&;&k$>&,&'&)&>#+@I+I@!&~&{&]&^&/&(&_&:&    ",
+"      <&[&}&|&1&2&>&3&4&5&6&7&*&_@f#'@j@j@j@j@j@j@j@++>$*&*&8&(#9&0&a&b&3+i@c&d&e&f&g&h&i&j&k&l&    ",
+"      m&n&o&p&q&r&s&>&Z%t&u&*&)@K#f#'@j@j@j@j@j@j@j@++N+M+W$*&v&w&x&y&z&A&y+B&C&D&E&F&G&H&I&J&K&    ",
+"      L&M&N&O&P&Q&-.E./#R&*&S&)@K#f#'@j@j@j@j@j@j@j@++N+M+W$(@*&*&T&U&V&W&X&Y&Z&`& *.*t@+*@*#*$*%*  ",
+"      &***x@u#=*_#-.g.2&*&L+S&)@K#f#'@j@j@j@j@j@j@j@++N+M+W$(@*&*&-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*    ",
+"      <*[*}*|*1*G.2***3**&*&V$)@K#f#'@j@j@j@j@j@j@j@++N+M+W$a+*&*&-*4*p#v@5*6*7*8*9*H.0*a*b*c*d*    ",
+"      e*f*g*h*i*j*n#-*k**&,$*&*&*&;#'@j@j@j@j@j@j@j@++!@*&*&*&l**&m*5*S#q#q#n*o*o*'+p*q*r*_*s*t*    ",
+"      u*t#v*w*~ x*y*H.n#*&*&j$)@*&*&*&*&*&*&*&*&*&*&*&*&*&c$z*l**&n#u@S#u@S#t@A*B*H.C*l&D*E*F*G*    ",
+"        H*I*J*K*L*M*H.y**&*&j$)@K#3+'@I@Q@S@%@R@{#9+H@>#_@c$z*N**&n#O*S#q#Z@Y@f.n#P*Q*R*S*T*U*      ",
+"        V*W*X*Y*Z*`*u@u@*&*& =.=e+f#j@2+C+%@l@+=@=a@#@>#M+W$(@N**&;*Z@Z@S#u@#=f.$=%=&=*===-=;=      ",
+"        >=,='=)=!=~={=]=*&*& =.=e+f#i@2+C+%@^=+=@=a@#@>#_@W$(@N**&v@S#Z@p#p#5*/=(=_=:=<=[=}=R       ",
+"          |=1=2=3=4=5=6=7=*& =.=e+3+'@2+8=%@&@+=k@a@#@>#_@W$(@N**&Z@Z@p#u@'+9=0=a=b=c=d=e=f=        ",
+"            g=h=i=j=k=l=v@*& =.=e+3+'@I@8=m={@+=k@a@#@>#_@c$(@*&*&Z@B*n=o=m*p=q=r=c=s=T*t=          ",
+"            u=v=w=x=y=z=A=B=*&.=@@3+'@I@8=/@{@+=k@a@#@>#_@c$*&C=u@D=5*y*H.E=F=r=G=H=T*I=J=          ",
+"              K=L=b=M=N=O=P=Q=R=*&3+'@I@Q@4.%@R@k@I+#@*&*&S=T=p#p#'+U=-*V=W=X=Y=Z=`= -.-            ",
+"                +-@-#-O $-%-&-*-u@B=B==-*&*&*&*&*&B=B=B=B*--;->-j+,-'-)-!-~-{-]-^-/-(-              ",
+"                _-:-<-[-}-|-1-2-3-4-5-Y@Z@Z@6-u@Z@B*D=B*[@7-$=n#y*8-9-0-a-b-c-d-e-f-5               ",
+"                  g-h-i-j-k-l-m-n-o-p-q-r-s-Y@t-M*u-o=y*H.5*v-l=w-x-y-z-A-B-C-D-E-F-                ",
+"                      G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-`- ;.;F*+;@;[=#;$;                    ",
+"                        %;<-&;*;=;-;;;>;X=,;';);!;~;{;i ];^;/;2@(;1@_;c*:;<;[;                      ",
+"                          };|;1;2;3;4;5;6;7;8;9;0;a;b;c;d;(;e;f;g;T*h;i;j;k;                        ",
+"                              l;m;n;o;^-p;q;r;s;t;u;<=v;w;x;y;z;A;B;C;D;                            ",
+"                                  E;F;G;H;i-I;J;K;T*L;M;N;&;O;P;Q;R;                                ",
+"                                          S;T;U;V;W;X;Y;Z;Y#                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.bmp
new file mode 100644 (file)
index 0000000..7f332a9
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AddPatient.xpm
new file mode 100644 (file)
index 0000000..0766f53
--- /dev/null
@@ -0,0 +1,1120 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_AddPatient_xpm[] = {
+"50 50 1067 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #BAB9F4",
+"}+    c #C4C2F6",
+"|+    c #C9C8F6",
+"1+    c #CBCDF9",
+"2+    c #CCCEF8",
+"3+    c #CECDF8",
+"4+    c #C9C8F7",
+"5+    c #C6C6F6",
+"6+    c #BEBDF6",
+"7+    c #B5B6F2",
+"8+    c #ABAAF0",
+"9+    c #8A8EDF",
+"0+    c #8184DC",
+"a+    c #7A7CD2",
+"b+    c #7476D0",
+"c+    c #6D71CA",
+"d+    c #6A6CC5",
+"e+    c #6464BE",
+"f+    c #5A5AAF",
+"g+    c #444884",
+"h+    c #50529D",
+"i+    c #54539D",
+"j+    c #5656A4",
+"k+    c #AEAEB9",
+"l+    c #B3B3C6",
+"m+    c #888ADD",
+"n+    c #7F81D6",
+"o+    c #5C5EAD",
+"p+    c #4B4B7E",
+"q+    c #8A8ACA",
+"r+    c #A3A2EB",
+"s+    c #AEADF0",
+"t+    c #C2C2F5",
+"u+    c #CDCCF8",
+"v+    c #D0D1F9",
+"w+    c #D6D6FA",
+"x+    c #DADCFC",
+"y+    c #D8D7FC",
+"z+    c #D3D2FA",
+"A+    c #CECEF9",
+"B+    c #CAC8F7",
+"C+    c #BCBCF4",
+"D+    c #B5B5F3",
+"E+    c #A7A7D4",
+"F+    c #B1B100",
+"G+    c #9E9E00",
+"H+    c #898ADD",
+"I+    c #8383D3",
+"J+    c #787AD2",
+"K+    c #7073CC",
+"L+    c #6A6CC6",
+"M+    c #686AC3",
+"N+    c #6264BE",
+"O+    c #6161BA",
+"P+    c #595BAD",
+"Q+    c #42457F",
+"R+    c #4E529B",
+"S+    c #4F508F",
+"T+    c #4F4F8E",
+"U+    c #B4B5C8",
+"V+    c #8586C8",
+"W+    c #7A7DD4",
+"X+    c #696AC2",
+"Y+    c #3C3C6A",
+"Z+    c #7879B8",
+"`+    c #A09FE9",
+" @    c #A8A8F0",
+".@    c #B6B6F3",
+"+@    c #C9CAF8",
+"@@    c #D0D2F9",
+"#@    c #D9D9FC",
+"$@    c #DCDEFC",
+"%@    c #E0E0FA",
+"&@    c #DCE0FB",
+"*@    c #DCDCFC",
+"=@    c #D3D3FA",
+"-@    c #CCCCF7",
+";@    c #C8C7F7",
+">@    c #B8BAF4",
+",@    c #99993A",
+"'@    c #848400",
+")@    c #838300",
+"!@    c #888CE1",
+"~@    c #7F82DA",
+"{@    c #797BD2",
+"]@    c #7275CE",
+"^@    c #6F73BB",
+"/@    c #848597",
+"(@    c #6868C0",
+"_@    c #6464BD",
+":@    c #6061B9",
+"<@    c #5F5FB8",
+"[@    c #5C5BAE",
+"}@    c #302F52",
+"|@    c #4E5090",
+"1@    c #4E4E88",
+"2@    c #70709F",
+"3@    c #7679D1",
+"4@    c #515396",
+"5@    c #46467E",
+"6@    c #515385",
+"7@    c #9796E3",
+"8@    c #A1A2EC",
+"9@    c #ACACF1",
+"0@    c #C7C7F7",
+"a@    c #D1D0F8",
+"b@    c #D9DAFB",
+"c@    c #E0E0FB",
+"d@    c #E4E3FA",
+"e@    c #E7E5FA",
+"f@    c #E6E8FC",
+"g@    c #E1E2FB",
+"h@    c #DADDFC",
+"i@    c #CBCBF8",
+"j@    c #8F8F00",
+"k@    c #747400",
+"l@    c #676700",
+"m@    c #8D8EE0",
+"n@    c #8286DB",
+"o@    c #7B7CD3",
+"p@    c #A4A436",
+"q@    c #80813C",
+"r@    c #70723A",
+"s@    c #78793A",
+"t@    c #6364BC",
+"u@    c #5E62BC",
+"v@    c #5D61BC",
+"w@    c #5C60BB",
+"x@    c #41407C",
+"y@    c #454677",
+"z@    c #4A4A7C",
+"A@    c #484876",
+"B@    c #AFB1C0",
+"C@    c #6669C1",
+"D@    c #5B5DAE",
+"E@    c #343660",
+"F@    c #393C65",
+"G@    c #8A8DD8",
+"H@    c #9798E6",
+"I@    c #A1A4EE",
+"J@    c #B0B0F1",
+"K@    c #BEBEF6",
+"L@    c #C8C9F7",
+"M@    c #D2D1F9",
+"N@    c #DBDDFB",
+"O@    c #E5E4FA",
+"P@    c #E6EAFC",
+"Q@    c #E9ECFC",
+"R@    c #EAEAFB",
+"S@    c #E7E4FA",
+"T@    c #DEE0FA",
+"U@    c #969600",
+"V@    c #7D7D00",
+"W@    c #5A5A00",
+"X@    c #98981B",
+"Y@    c #8E8F2D",
+"Z@    c #8A8A00",
+"`@    c #7C7C00",
+" #    c #6E6E05",
+".#    c #66660A",
+"+#    c #656513",
+"@#    c #7D7D22",
+"##    c #5D5FB8",
+"$#    c #5F63B2",
+"%#    c #5A5BAF",
+"&#    c #37375E",
+"*#    c #4D508E",
+"=#    c #4A4882",
+"-#    c #9396C1",
+";#    c #5B5DB2",
+">#    c #484C8D",
+",#    c #2D2F54",
+"'#    c #6A6AA8",
+")#    c #9290E0",
+"!#    c #A4A4ED",
+"~#    c #B2B4F3",
+"{#    c #BEC0F5",
+"]#    c #C9CAF7",
+"^#    c #D4D3F8",
+"/#    c #DDE0FC",
+"(#    c #E6E6FB",
+"_#    c #EBEAFC",
+":#    c #EAEBFC",
+"<#    c #E9ECFD",
+"[#    c #E7E7FB",
+"}#    c #DFE0FB",
+"|#    c #DAD9FB",
+"1#    c #C4C4F5",
+"2#    c #979700",
+"3#    c #959500",
+"4#    c #666600",
+"5#    c #555500",
+"6#    c #767600",
+"7#    c #828200",
+"8#    c #898900",
+"9#    c #777700",
+"0#    c #616100",
+"a#    c #6B6B00",
+"b#    c #848424",
+"c#    c #707386",
+"d#    c #5C60BA",
+"e#    c #464782",
+"f#    c #4A4A81",
+"g#    c #4D4E8A",
+"h#    c #3E3D67",
+"i#    c #9797C0",
+"j#    c #7A7AB6",
+"k#    c #5A5AAA",
+"l#    c #4C4C8B",
+"m#    c #797BC3",
+"n#    c #9090E1",
+"o#    c #B3B2F4",
+"p#    c #BEBEF4",
+"q#    c #CCCAF8",
+"r#    c #D4D2F9",
+"s#    c #DDDEFC",
+"t#    c #E4E5FB",
+"u#    c #EAECFC",
+"v#    c #E7E7FC",
+"w#    c #D9D8FA",
+"x#    c #CFCFF8",
+"y#    c #919100",
+"z#    c #6E6E00",
+"A#    c #7E7E00",
+"B#    c #A0A000",
+"C#    c #B5B500",
+"D#    c #BDBD00",
+"E#    c #BCBC00",
+"F#    c #B2B200",
+"G#    c #8C8C00",
+"H#    c #5E5E00",
+"I#    c #757500",
+"J#    c #7E8050",
+"K#    c #6366AB",
+"L#    c #5055A5",
+"M#    c #3C3D66",
+"N#    c #4B4C81",
+"O#    c #3A3B64",
+"P#    c #6D6D99",
+"Q#    c #4C4F90",
+"R#    c #505396",
+"S#    c #34345A",
+"T#    c #3E406C",
+"U#    c #7D7ECC",
+"V#    c #8D8EE1",
+"W#    c #9496E6",
+"X#    c #A0A2ED",
+"Y#    c #ADAFF2",
+"Z#    c #BCBDF4",
+"`#    c #D3D1F8",
+" $    c #DEDEFB",
+".$    c #E6E4FB",
+"+$    c #E8E7FA",
+"@$    c #D7D6FB",
+"#$    c #CCCDF8",
+"$$    c #C0C0F6",
+"%$    c #929200",
+"&$    c #989800",
+"*$    c #939300",
+"=$    c #A2A200",
+"-$    c #ABAB00",
+";$    c #B8B800",
+">$    c #BFBF00",
+",$    c #C4C400",
+"'$    c #BABA00",
+")$    c #7F7F00",
+"!$    c #595900",
+"~$    c #949400",
+"{$    c #6D7090",
+"]$    c #5D5FB9",
+"^$    c #3B3A6B",
+"/$    c #3F4271",
+"($    c #40416C",
+"_$    c #3B3867",
+":$    c #9091AF",
+"<$    c #505297",
+"[$    c #4C4D8C",
+"}$    c #464680",
+"|$    c #48487A",
+"1$    c #7F82D2",
+"2$    c #8A8DE0",
+"3$    c #9796E4",
+"4$    c #AEAEF2",
+"5$    c #BABBF6",
+"6$    c #D2D2F8",
+"7$    c #E4E3FB",
+"8$    c #DADBFA",
+"9$    c #D1D1F8",
+"0$    c #C8C8F8",
+"a$    c #C0C0F5",
+"b$    c #9B9B00",
+"c$    c #9F9F00",
+"d$    c #A7A700",
+"e$    c #ACAC00",
+"f$    c #AFAF00",
+"g$    c #A6A600",
+"h$    c #AAAA00",
+"i$    c #5F5F00",
+"j$    c #737300",
+"k$    c #BCBC09",
+"l$    c #B3B325",
+"m$    c #4B4B8E",
+"n$    c #373661",
+"o$    c #323358",
+"p$    c #1C1A2D",
+"q$    c #9898C4",
+"r$    c #62648A",
+"s$    c #414077",
+"t$    c #5858A9",
+"u$    c #3E4274",
+"v$    c #676BB3",
+"w$    c #8184D6",
+"x$    c #878ADC",
+"y$    c #9294E5",
+"z$    c #9C9DE8",
+"A$    c #AAABF0",
+"B$    c #B6B5F3",
+"C$    c #C2C0F5",
+"D$    c #CACAF6",
+"E$    c #D3D2F7",
+"F$    c #D7D9FC",
+"G$    c #DEE0FC",
+"H$    c #E5E4FC",
+"I$    c #E3E5FC",
+"J$    c #E0E1FA",
+"K$    c #DADBFB",
+"L$    c #D5D4F9",
+"M$    c #CCCEF7",
+"N$    c #C0C2F6",
+"O$    c #8D8D00",
+"P$    c #A1A100",
+"Q$    c #A4A400",
+"R$    c #686CC4",
+"S$    c #6266BF",
+"T$    c #5F61BB",
+"U$    c #9A9A01",
+"V$    c #C1C100",
+"W$    c #5B5FBA",
+"X$    c #5E5EB6",
+"Y$    c #31335E",
+"Z$    c #2A2E50",
+"`$    c #232440",
+" %    c #7474A8",
+".%    c #6D6FC7",
+"+%    c #5C5D99",
+"@%    c #232546",
+"#%    c #21213B",
+"$%    c #7576C6",
+"%%    c #8181D6",
+"&%    c #8588DB",
+"*%    c #8E90E0",
+"=%    c #9898E6",
+"-%    c #AEAFF1",
+";%    c #CACAF7",
+">%    c #D2CFF8",
+",%    c #D7D7FA",
+"'%    c #D8D8FC",
+")%    c #D9DAF9",
+"!%    c #D6D5FA",
+"~%    c #D6D6F9",
+"{%    c #CDCEF8",
+"]%    c #C8C6F6",
+"^%    c #BEBDF5",
+"/%    c #B1B1F2",
+"(%    c #878700",
+"_%    c #909000",
+":%    c #999900",
+"<%    c #6568C2",
+"[%    c #6666BF",
+"}%    c #6062BA",
+"|%    c #5E5FBA",
+"1%    c #4B4A86",
+"2%    c #272849",
+"3%    c #4A4A8B",
+"4%    c #767AD1",
+"5%    c #7F82D8",
+"6%    c #5B5CAA",
+"7%    c #787ACD",
+"8%    c #7B7CD4",
+"9%    c #8084DA",
+"0%    c #8A8ADE",
+"a%    c #9296E6",
+"b%    c #999DE9",
+"c%    c #A4A6EE",
+"d%    c #C1C0F4",
+"e%    c #C6C6F5",
+"f%    c #CAC9F7",
+"g%    c #CECEF7",
+"h%    c #D0CFF7",
+"i%    c #C3C3F6",
+"j%    c #BABCF6",
+"k%    c #B3B4F4",
+"l%    c #AAAAEF",
+"m%    c #727200",
+"n%    c #7A7A00",
+"o%    c #6C6C00",
+"p%    c #4B4B00",
+"q%    c #6468C2",
+"r%    c #6565BE",
+"s%    c #6062BC",
+"t%    c #5E60BA",
+"u%    c #5D60B9",
+"v%    c #46457D",
+"w%    c #45487D",
+"x%    c #262544",
+"y%    c #3F3F79",
+"z%    c #7C7FD6",
+"A%    c #6969C0",
+"B%    c #4A4C8C",
+"C%    c #373864",
+"D%    c #7579D0",
+"E%    c #797AD3",
+"F%    c #7C7FD8",
+"G%    c #8484D9",
+"H%    c #8C8EE0",
+"I%    c #9294E3",
+"J%    c #9C9DEA",
+"K%    c #B5B6F4",
+"L%    c #BBBAF5",
+"M%    c #BEBCF3",
+"N%    c #C0BEF5",
+"O%    c #BEC0F6",
+"P%    c #BBBEF5",
+"Q%    c #B8B8F5",
+"R%    c #B2B1F1",
+"S%    c #A8A9EE",
+"T%    c #9E9EEB",
+"U%    c #6D6D00",
+"V%    c #818100",
+"W%    c #575700",
+"X%    c #6767C0",
+"Y%    c #5A5EB9",
+"Z%    c #414276",
+"`%    c #46477F",
+" &    c #2C2C4D",
+".&    c #39386E",
+"+&    c #6D70CB",
+"@&    c #4A4988",
+"#&    c #2E3055",
+"$&    c #7274CC",
+"%&    c #7375CD",
+"&&    c #7578D0",
+"*&    c #7E7FD6",
+"=&    c #8587DC",
+"-&    c #8E8FE2",
+";&    c #9696E6",
+">&    c #9B9CE9",
+",&    c #9E9FE9",
+"'&    c #626140",
+")&    c #626241",
+"!&    c #4C4C0B",
+"~&    c #474700",
+"{&    c #646400",
+"]&    c #888800",
+"^&    c #6061BA",
+"/&    c #5F60B8",
+"(&    c #404175",
+"_&    c #44467A",
+":&    c #232442",
+"<&    c #323264",
+"[&    c #6367C0",
+"}&    c #656AC2",
+"|&    c #424475",
+"1&    c #2D2E51",
+"2&    c #7274CB",
+"3&    c #777AD4",
+"4&    c #8083D7",
+"5&    c #8688DB",
+"6&    c #8B8EE0",
+"7&    c #585833",
+"8&    c #505000",
+"9&    c #606000",
+"0&    c #6A6A00",
+"a&    c #6264BC",
+"b&    c #6060B9",
+"c&    c #3B3C6E",
+"d&    c #121222",
+"e&    c #2F2E5B",
+"f&    c #7174CD",
+"g&    c #4D4C8E",
+"h&    c #2E2F54",
+"i&    c #6F73CA",
+"j&    c #6F71C9",
+"k&    c #7D7ED6",
+"l&    c #4F4F1C",
+"m&    c #5A5B5E",
+"n&    c #6E72CB",
+"o&    c #6B6EC7",
+"p&    c #5C5C00",
+"q&    c #3E4074",
+"r&    c #292A4A",
+"s&    c #12101E",
+"t&    c #6D70C9",
+"u&    c #7477D0",
+"v&    c #53549A",
+"w&    c #2D2C4F",
+"x&    c #676ABA",
+"y&    c #5A5B54",
+"z&    c #636300",
+"A&    c #6064BE",
+"B&    c #6363BC",
+"C&    c #5E62BD",
+"D&    c #3D3D6D",
+"E&    c #222342",
+"F&    c #101121",
+"G&    c #38366D",
+"H&    c #6064BA",
+"I&    c #5C5EA5",
+"J&    c #686AC2",
+"K&    c #6164BC",
+"L&    c #5F63BE",
+"M&    c #5F62BB",
+"N&    c #5A5AAB",
+"O&    c #383A65",
+"P&    c #262645",
+"Q&    c #0F101E",
+"R&    c #424380",
+"S&    c #585BAA",
+"T&    c #4F5091",
+"U&    c #494980",
+"V&    c #484D8F",
+"W&    c #56589B",
+"X&    c #6467BF",
+"Y&    c #6868C2",
+"Z&    c #5E61BA",
+"`&    c #5F64BD",
+" *    c #5E60B8",
+".*    c #494C8E",
+"+*    c #353358",
+"@*    c #1E1D36",
+"#*    c #09080F",
+"$*    c #595AA4",
+"%*    c #8B8CA4",
+"&*    c #484B7F",
+"**    c #494C80",
+"=*    c #474882",
+"-*    c #484B84",
+";*    c #6366C0",
+">*    c #676BC3",
+",*    c #858500",
+"'*    c #515100",
+")*    c #6465BE",
+"!*    c #5F62BA",
+"~*    c #5B5EB6",
+"{*    c #3B3C66",
+"]*    c #2D2E52",
+"^*    c #131220",
+"/*    c #9294BE",
+"(*    c #AFB0BA",
+"_*    c #3E416D",
+":*    c #4A4B83",
+"<*    c #5D60B3",
+"[*    c #6263BC",
+"}*    c #696900",
+"|*    c #5D5D00",
+"1*    c #5F63BC",
+"2*    c #4C4D95",
+"3*    c #333258",
+"4*    c #282849",
+"5*    c #0B0C18",
+"6*    c #28284A",
+"7*    c #B2B4C8",
+"8*    c #42426E",
+"9*    c #424270",
+"0*    c #444782",
+"a*    c #3A3B6E",
+"b*    c #454580",
+"c*    c #868600",
+"d*    c #9C9C00",
+"e*    c #B4B400",
+"f*    c #8B8B00",
+"g*    c #808000",
+"h*    c #525200",
+"i*    c #5C61BA",
+"j*    c #6463BA",
+"k*    c #333767",
+"l*    c #262746",
+"m*    c #1D1C32",
+"n*    c #08060C",
+"o*    c #464683",
+"p*    c #808190",
+"q*    c #212039",
+"r*    c #42437B",
+"s*    c #4E5191",
+"t*    c #353864",
+"u*    c #4D5096",
+"v*    c #656500",
+"w*    c #707000",
+"x*    c #9D9D00",
+"y*    c #A9A900",
+"z*    c #ADAD00",
+"A*    c #A3A300",
+"B*    c #6162BA",
+"C*    c #4A4A8E",
+"D*    c #19172B",
+"E*    c #19172A",
+"F*    c #0C0B15",
+"G*    c #131221",
+"H*    c #9394BA",
+"I*    c #ACAFBC",
+"J*    c #4B4C86",
+"K*    c #5459A9",
+"L*    c #4E5294",
+"M*    c #404271",
+"N*    c #343663",
+"O*    c #5C5EB4",
+"P*    c #B7B700",
+"Q*    c #6668C0",
+"R*    c #5A5EB2",
+"S*    c #242443",
+"T*    c #414470",
+"U*    c #1C1C33",
+"V*    c #07040A",
+"W*    c #343462",
+"X*    c #6A6B90",
+"Y*    c #3E3F69",
+"Z*    c #38375F",
+"`*    c #343256",
+" =    c #2B2A4C",
+".=    c #3D407A",
+"+=    c #5C5EB7",
+"@=    c #4C4C00",
+"#=    c #A8A800",
+"$=    c #B6B600",
+"%=    c #6365BE",
+"&=    c #6164B9",
+"*=    c #302F5A",
+"==    c #252645",
+"-=    c #242442",
+";=    c #0A0912",
+">=    c #120F1E",
+",=    c #7676B2",
+"'=    c #282948",
+")=    c #222240",
+"!=    c #42487E",
+"~=    c #313258",
+"{=    c #272749",
+"]=    c #454887",
+"^=    c #B3B300",
+"/=    c #6063BD",
+"(=    c #6869BE",
+"_=    c #454684",
+":=    c #393A63",
+"<=    c #0B0B15",
+"[=    c #3B3D70",
+"}=    c #87889D",
+"|=    c #323256",
+"1=    c #4D4D88",
+"2=    c #323458",
+"3=    c #434476",
+"4=    c #393A68",
+"5=    c #4E4E95",
+"6=    c #484809",
+"7=    c #7B7B00",
+"8=    c #4D4E32",
+"9=    c #6267BA",
+"0=    c #444580",
+"a=    c #484A7C",
+"b=    c #141526",
+"c=    c #22253F",
+"d=    c #9295BC",
+"e=    c #626484",
+"f=    c #333459",
+"g=    c #484A88",
+"h=    c #4D4E94",
+"i=    c #3E4073",
+"j=    c #3D3E75",
+"k=    c #494911",
+"l=    c #474701",
+"m=    c #49490F",
+"n=    c #545568",
+"o=    c #5A5CAE",
+"p=    c #30315D",
+"q=    c #3D406D",
+"r=    c #4C4E86",
+"s=    c #242542",
+"t=    c #07050C",
+"u=    c #101223",
+"v=    c #6B6EA0",
+"w=    c #34345D",
+"x=    c #191A30",
+"y=    c #36365E",
+"z=    c #4A4A88",
+"A=    c #313056",
+"B=    c #30305D",
+"C=    c #5255A3",
+"D=    c #474804",
+"E=    c #6064BF",
+"F=    c #6466C0",
+"G=    c #6668C1",
+"H=    c #6366BE",
+"I=    c #4E5196",
+"J=    c #2B2C52",
+"K=    c #3A3C6B",
+"L=    c #444876",
+"M=    c #2E2E50",
+"N=    c #0C0912",
+"O=    c #0D0B16",
+"P=    c #494986",
+"Q=    c #ADAFBA",
+"R=    c #292B4C",
+"S=    c #18172B",
+"T=    c #333456",
+"U=    c #38385F",
+"V=    c #232240",
+"W=    c #34335C",
+"X=    c #2F3258",
+"Y=    c #3E3E74",
+"Z=    c #585CB1",
+"`=    c #5C5EB8",
+" -    c #6265BD",
+".-    c #5E60B6",
+"+-    c #444684",
+"@-    c #2C2E52",
+"#-    c #2C2A4A",
+"$-    c #424474",
+"%-    c #232543",
+"&-    c #0C0C16",
+"*-    c #0E0D19",
+"=-    c #43447A",
+"--    c #ACAFB9",
+";-    c #2E2E52",
+">-    c #12101F",
+",-    c #1C1B33",
+"'-    c #0E0E1A",
+")-    c #5857A5",
+"!-    c #50529F",
+"~-    c #444783",
+"{-    c #373863",
+"]-    c #42427B",
+"^-    c #474A8E",
+"/-    c #52529E",
+"(-    c #595BB0",
+"_-    c #6262BC",
+":-    c #6062BB",
+"<-    c #575EB2",
+"[-    c #3C3F76",
+"}-    c #2F3056",
+"|-    c #383965",
+"1-    c #35365C",
+"2-    c #262644",
+"3-    c #12101C",
+"4-    c #0A060C",
+"5-    c #0F101C",
+"6-    c #424479",
+"7-    c #B0B3C6",
+"8-    c #515369",
+"9-    c #0D0E1C",
+"0-    c #0E0E1C",
+"a-    c #3C3D6E",
+"b-    c #4A4F8E",
+"c-    c #5759B0",
+"d-    c #5558AB",
+"e-    c #4E5094",
+"f-    c #363764",
+"g-    c #3C3B6E",
+"h-    c #3B3E77",
+"i-    c #3F407C",
+"j-    c #3B3D73",
+"k-    c #3A3A6E",
+"l-    c #383A6F",
+"m-    c #3B3B70",
+"n-    c #3C3B70",
+"o-    c #3A3B6D",
+"p-    c #34355E",
+"q-    c #454680",
+"r-    c #4E5095",
+"s-    c #474C8A",
+"t-    c #18172D",
+"u-    c #090A13",
+"v-    c #161728",
+"w-    c #64668E",
+"x-    c #60607F",
+"y-    c #18182C",
+"z-    c #292A49",
+"A-    c #3C3C68",
+"B-    c #464882",
+"C-    c #545BAF",
+"D-    c #50529A",
+"E-    c #3B3E6B",
+"F-    c #2F3158",
+"G-    c #363760",
+"H-    c #383860",
+"I-    c #303358",
+"J-    c #414272",
+"K-    c #46487E",
+"L-    c #4C4A7E",
+"M-    c #4D5091",
+"N-    c #383962",
+"O-    c #0A060E",
+"P-    c #0B0A12",
+"Q-    c #262745",
+"R-    c #7070A4",
+"S-    c #ACAEB6",
+"T-    c #55566D",
+"U-    c #131528",
+"V-    c #141221",
+"W-    c #1B1B32",
+"X-    c #2F2F4F",
+"Y-    c #303054",
+"Z-    c #292847",
+"`-    c #323257",
+" ;    c #393960",
+".;    c #393A62",
+"+;    c #3D3E69",
+"@;    c #4C4E8E",
+"#;    c #4A4B8A",
+"$;    c #52539A",
+"%;    c #3C4070",
+"&;    c #343459",
+"*;    c #20213B",
+"=;    c #110F1C",
+"-;    c #08070E",
+";;    c #1E2038",
+">;    c #616386",
+",;    c #ADB1C2",
+"';    c #AAAEB6",
+");    c #32335B",
+"!;    c #19182C",
+"~;    c #0F0E1B",
+"{;    c #0A0A15",
+"];    c #0F0F1B",
+"^;    c #121223",
+"/;    c #1A1B34",
+"(;    c #131223",
+"_;    c #141527",
+":;    c #181A30",
+"<;    c #161324",
+"[;    c #0F0D19",
+"};    c #080810",
+"|;    c #0B080F",
+"1;    c #0D0C18",
+"2;    c #20223B",
+"3;    c #444379",
+"4;    c #AEB0BC",
+"5;    c #ADAEB8",
+"6;    c #848394",
+"7;    c #2E3054",
+"8;    c #1E1E36",
+"9;    c #0B0D19",
+"0;    c #0A080E",
+"a;    c #08050A",
+"b;    c #09070D",
+"c;    c #090911",
+"d;    c #10101D",
+"e;    c #252946",
+"f;    c #373A69",
+"g;    c #8A8CA2",
+"h;    c #B0B0C0",
+"i;    c #8E8EA8",
+"j;    c #8A8BA0",
+"k;    c #868A9E",
+"l;    c #848698",
+"m;    c #838698",
+"n;    c #83879A",
+"o;    c #89889D",
+"p;    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+3+3+4+5+6+7+8+y.z.9+0+a+b+c+d+/+e+>+f+g+h+i+j+k+            ",
+"            l+m+n+o+p+q+r+s+[+t+u+v+w+x+y+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+H.O+P+Q+R+S+T+U+          ",
+"            V+W+X+Y+Z+`+ @.@X.+@@@#@$@%@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@          ",
+"          {.3@4@5@6@7@8@9@[+0@a@b@c@d@e@f@d@g@h@z+i@ +j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@        ",
+"          C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@Q@S@T@#@3+Y.U@V@W@k@X@Y@Z@`@ #.#+#@###$#%#&#*#p+=#        ",
+"        -#;#>#,#'#)##+!#~#{#]#^#/#(#_#:#:#<#[#}#|#A+1#2#3#4#5#6#'@7#8#Z@9#0#a#b#c#d#e#f#g#h#i#      ",
+"        j#k#l#: m#n##+o.o#p#q#r#s#t#u#<#:#u#v#}#w#x#1#y#2#Z@z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#      ",
+"        Q#R#S#T#U#V#W#X#Y#Z#]#`# $.$:#:#:#:#+$}#@$#$$$Z@%$&$*$=$-$F#;$>$,$'$)$!$~${$]$^$/$($_$      ",
+"      :$<$[$}$|$1$2$3$y.4$5$5+6$#@7$_#:#u#v#7$8$9$0$a$)@G#%$b$c$d$e$C#'$f$g$h$i$j$k$l$m$n$o$p$q$    ",
+"      r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$[+`@'@O$U@b$P$Q$G+R$S$H.v@T$U$V$W$X$Y$Z$`$ %    ",
+"      .%+%@%#%$%%%&%*%=%U.-%[+`.;%>%,%'%)%!%~%{%]%^%/%6#A#(%_%:%:%A#H#<%[%t@}%d#d#w@W$|%1%[$2%3%    ",
+"      4%5%6%O#7%8%9%0%a%b%c%s+[+d%e%f%g%h%g%|+i%j%k%l%m%n%)@G#3#*$o%p%q%r%s%t%u%W$W$w@w@v%w%x%y%    ",
+"      z%A%B%C%D%E%F%G%H%I%J%c%Y#K%L%M%N%O%O%P%Q%R%S%T%U%6#)$(%_%~$V%W%X%H.>+d#d#d#Y%d#t%Z%`% &.&    ",
+"      +&}%@&#&$&%&&&*&=&-&;&>&,&'&)&!&~&~&~&~&~&~&~&~&{&o%I#)$]&y#%$o%!$N+^&^&d#d#d#w@/&(&_&:&<&    ",
+"      [&}&|&1&2&c+]@3&4&5&6&7&~&I#(%y#*$*$*$*$*$*$*$j@8&W%9&0&j$A#Z@V%W%a&d#W$d#d#d#W$b&c&o$d&e&    ",
+"      K+f&g&h&i&L+j&]@&&k&l&~&z#n%(%y#*$*$*$*$*$*$*$j@7#6#0&~&m&n&o&a#p&^&t%d#d#d#d#u%s%q&r&s&<&    ",
+"      t&u&v&w&x&d+-.E.D.y&~&z&z#n%(%y#*$*$*$*$*$*$*$j@7#6#0&H#~&~&e+A&[%B&d#d#d#d#d#:@C&D&E&F&G&    ",
+"      H&R$y@O#I&J&-.g.c+~&5#z&z#n%(%y#*$*$*$*$*$*$*$j@7#6#0&H#~&~&r%K&v@L&B&d#d#d#M&>+N&O&P&Q&R&    ",
+"      S&T&U&V&W&G.X&R$Y&~&~&9&z#n%(%y#*$*$*$*$*$*$*$j@7#6#0&W@~&~&r%Z&t%w@s%`&d#d# *H..*+*@*#*$*    ",
+"      %*&***=*-*;*_@r%>*~&W%~&~&~&,*y#*$*$*$*$*$*$*$j@A#~&~&~&'*~&t@s%W$Y%Y%)*!*M&>+~*{*]*Q&^*/*    ",
+"      (*N#_*:*~ <*[*H._@~&~&{&z#~&~&~&~&~&~&~&~&~&~&~&~&~&}*|*'*~&_@v@W$v@W$u@1*M&H.2*3*4*5*6*7*    ",
+"        8*9*0*a*b*T$H.[*~&~&{&z#n%c*y#d*d$f$e*e$P$U@f*g*I#}*|*h*~&_@i*W$Y%d###f._@j*k*l*m*n*o*      ",
+"        p*q*r*s*t*u*v@v@~&~&v*w*`@(%*$x*y*e*;$z*A*&$G#g*6#0&H#h*~&K&d#d#W$v@B*f.A&C*D*E*F*G*H*      ",
+"        I*J*K*L*M*N*O*C&~&~&v*w*`@(%%$x*y*e*P*z*A*&$G#g*I#0&H#h*~&w@W$d#t%t%s%Q*R*S*T*U*V*W*R       ",
+"          X*Y*Z*`* =.=+=@=~&v*w*`@c*y#x*#=e*$=z*=$&$G#g*I#0&H#h*~&d#d#t%v@>+%=&=*===-=;=>=,=        ",
+"            '=)=!=~={=]=w@~&v*w*`@c*y#d*#=^=C#z*=$&$G#g*I#}*H#~&~&d#M&`&/=t@(=_=:=-=<=n*[=          ",
+"            }=|=1=2=3=4=5=6=~&w*7=c*y#d*#=F#C#z*=$&$G#g*I#}*~&8=v@^&s%[*H.9=0=:=a=b=n*c=d=          ",
+"              e=f===g=h=i=j=k=l=~&c*y#d*d$F+e*e$=$2#G#~&~&m=n=t%t%>+N+r%o=p=q=r=s=t=u=v=            ",
+"                w=x=y=O z=A=B=C=v@6=6=D=~&~&~&~&~&6=6=6=M&E=F=[%/+G=H=I=J=K=L=M=N=O=P=              ",
+"                Q=R=S=T=U=V=W=X=Y=Z=`=##d#d#u%v@d#M&^&M&:@ -A&_@[*.-+-@-#-$-%-&-*-=-5               ",
+"                  --;->-,-'-)-!-~-{-]-^-/-(-##_-T$:-/=[*H.s%<-]=[-}-|-1-2-3-4-5-6-7-                ",
+"                      8-9-0-a-b-c-d-e-_.f-g-h-i-j-k-l-m-n-o-p-q-r-s-6*t-u-V*v-w-                    ",
+"                        x-S=y-z-A-B-C-D-q=E-F-G-H-I-J-i K-L-M-|@N-}@O-#*P-Q-R-                      ",
+"                          S-T-U-V-W-X-Y-Z-`- ;.;+;@;#;$;%;N-&;*;=;n*-;;;>;,;                        ",
+"                              ';);!;~;N={;];^;/;(;_;U*:;<;[;};|;1;2;3;4;                            ",
+"                                  5;6;7;8;>-9;0;a;n*b;c;d;y-e;f;g;h;                                ",
+"                                          i;j;k;l;m;n;o;p;:$                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.bmp
new file mode 100644 (file)
index 0000000..55de88d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_AxisExtraction.xpm
new file mode 100644 (file)
index 0000000..0eb7cfa
--- /dev/null
@@ -0,0 +1,808 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_AxisExtraction_xpm[] = {
+"50 50 755 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #BAB9F4",
+"}+    c #C4C2F6",
+"|+    c #C9C8F6",
+"1+    c #330033",
+"2+    c #3D3DDE",
+"3+    c #663366",
+"4+    c #000000",
+"5+    c #6A6CC5",
+"6+    c #6464BE",
+"7+    c #5A5AAF",
+"8+    c #444884",
+"9+    c #50529D",
+"0+    c #54539D",
+"a+    c #5656A4",
+"b+    c #AEAEB9",
+"c+    c #B3B3C6",
+"d+    c #888ADD",
+"e+    c #7F81D6",
+"f+    c #5C5EAD",
+"g+    c #4B4B7E",
+"h+    c #8A8ACA",
+"i+    c #A3A2EB",
+"j+    c #AEADF0",
+"k+    c #C2C2F5",
+"l+    c #660066",
+"m+    c #333333",
+"n+    c #42457F",
+"o+    c #4E529B",
+"p+    c #4F508F",
+"q+    c #4F4F8E",
+"r+    c #B4B5C8",
+"s+    c #8586C8",
+"t+    c #7A7DD4",
+"u+    c #696AC2",
+"v+    c #3C3C6A",
+"w+    c #7879B8",
+"x+    c #A09FE9",
+"y+    c #A8A8F0",
+"z+    c #FF0000",
+"A+    c #5C5BAE",
+"B+    c #302F52",
+"C+    c #4E5090",
+"D+    c #4E4E88",
+"E+    c #70709F",
+"F+    c #7679D1",
+"G+    c #515396",
+"H+    c #46467E",
+"I+    c #515385",
+"J+    c #9796E3",
+"K+    c #666666",
+"L+    c #666633",
+"M+    c #5C60BB",
+"N+    c #41407C",
+"O+    c #454677",
+"P+    c #4A4A7C",
+"Q+    c #484876",
+"R+    c #AFB1C0",
+"S+    c #6669C1",
+"T+    c #5B5DAE",
+"U+    c #343660",
+"V+    c #393C65",
+"W+    c #8A8DD8",
+"X+    c #333300",
+"Y+    c #999966",
+"Z+    c #996699",
+"`+    c #336633",
+" @    c #5C60BA",
+".@    c #5A5BAF",
+"+@    c #37375E",
+"@@    c #4D508E",
+"#@    c #4A4882",
+"$@    c #9396C1",
+"%@    c #5B5DB2",
+"&@    c #484C8D",
+"*@    c #2D2F54",
+"=@    c #6A6AA8",
+"-@    c #9290E0",
+";@    c #999999",
+">@    c #464782",
+",@    c #4A4A81",
+"'@    c #4D4E8A",
+")@    c #3E3D67",
+"!@    c #9797C0",
+"~@    c #7A7AB6",
+"{@    c #5A5AAA",
+"]@    c #4C4C8B",
+"^@    c #797BC3",
+"/@    c #9090E1",
+"(@    c #CC9999",
+"_@    c #5A5EB9",
+":@    c #5055A5",
+"<@    c #3C3D66",
+"[@    c #4B4C81",
+"}@    c #3A3B64",
+"|@    c #6D6D99",
+"1@    c #4C4F90",
+"2@    c #505396",
+"3@    c #34345A",
+"4@    c #3E406C",
+"5@    c #7D7ECC",
+"6@    c #8D8EE1",
+"7@    c #5B5FBA",
+"8@    c #5D5FB9",
+"9@    c #3B3A6B",
+"0@    c #3F4271",
+"a@    c #40416C",
+"b@    c #3B3867",
+"c@    c #9091AF",
+"d@    c #505297",
+"e@    c #4C4D8C",
+"f@    c #464680",
+"g@    c #48487A",
+"h@    c #7F82D2",
+"i@    c #8A8DE0",
+"j@    c #663333",
+"k@    c #996666",
+"l@    c #003333",
+"m@    c #5E60B9",
+"n@    c #4B4B8E",
+"o@    c #373661",
+"p@    c #323358",
+"q@    c #1C1A2D",
+"r@    c #9898C4",
+"s@    c #62648A",
+"t@    c #414077",
+"u@    c #5858A9",
+"v@    c #3E4274",
+"w@    c #676BB3",
+"x@    c #8184D6",
+"y@    c #878ADC",
+"z@    c #003300",
+"A@    c #5E5EB6",
+"B@    c #31335E",
+"C@    c #2A2E50",
+"D@    c #232440",
+"E@    c #7474A8",
+"F@    c #6D6FC7",
+"G@    c #5C5D99",
+"H@    c #232546",
+"I@    c #21213B",
+"J@    c #7576C6",
+"K@    c #8181D6",
+"L@    c #8588DB",
+"M@    c #5E5FBA",
+"N@    c #4B4A86",
+"O@    c #272849",
+"P@    c #4A4A8B",
+"Q@    c #767AD1",
+"R@    c #7F82D8",
+"S@    c #5B5CAA",
+"T@    c #787ACD",
+"U@    c #7B7CD4",
+"V@    c #8084DA",
+"W@    c #46457D",
+"X@    c #45487D",
+"Y@    c #262544",
+"Z@    c #3F3F79",
+"`@    c #7C7FD6",
+" #    c #6969C0",
+".#    c #4A4C8C",
+"+#    c #373864",
+"@#    c #7579D0",
+"##    c #797AD3",
+"$#    c #7C7FD8",
+"%#    c #669966",
+"&#    c #330000",
+"*#    c #5E60BA",
+"=#    c #414276",
+"-#    c #46477F",
+";#    c #2C2C4D",
+">#    c #39386E",
+",#    c #6D70CB",
+"'#    c #6062BA",
+")#    c #4A4988",
+"!#    c #2E3055",
+"~#    c #7274CC",
+"{#    c #7375CD",
+"]#    c #7578D0",
+"^#    c #000033",
+"/#    c #5F60B8",
+"(#    c #404175",
+"_#    c #44467A",
+":#    c #232442",
+"<#    c #323264",
+"[#    c #6367C0",
+"}#    c #656AC2",
+"|#    c #424475",
+"1#    c #2D2E51",
+"2#    c #7274CB",
+"3#    c #6D71CA",
+"4#    c #7275CE",
+"5#    c #6060B9",
+"6#    c #3B3C6E",
+"7#    c #121222",
+"8#    c #2F2E5B",
+"9#    c #7073CC",
+"0#    c #7174CD",
+"a#    c #4D4C8E",
+"b#    c #2E2F54",
+"c#    c #6F73CA",
+"d#    c #6A6CC6",
+"e#    c #6F71C9",
+"f#    c #5D60B9",
+"g#    c #6062BC",
+"h#    c #3E4074",
+"i#    c #292A4A",
+"j#    c #12101E",
+"k#    c #6D70C9",
+"l#    c #7477D0",
+"m#    c #53549A",
+"n#    c #2D2C4F",
+"o#    c #676ABA",
+"p#    c #6061B9",
+"q#    c #5E62BD",
+"r#    c #3D3D6D",
+"s#    c #222342",
+"t#    c #101121",
+"u#    c #38366D",
+"v#    c #6064BA",
+"w#    c #686CC4",
+"x#    c #5C5EA5",
+"y#    c #686AC2",
+"z#    c #5F62BB",
+"A#    c #5A5AAB",
+"B#    c #383A65",
+"C#    c #262645",
+"D#    c #0F101E",
+"E#    c #424380",
+"F#    c #585BAA",
+"G#    c #4F5091",
+"H#    c #494980",
+"I#    c #484D8F",
+"J#    c #56589B",
+"K#    c #6467BF",
+"L#    c #5E60B8",
+"M#    c #494C8E",
+"N#    c #353358",
+"O#    c #1E1D36",
+"P#    c #09080F",
+"Q#    c #595AA4",
+"R#    c #8B8CA4",
+"S#    c #484B7F",
+"T#    c #494C80",
+"U#    c #474882",
+"V#    c #484B84",
+"W#    c #6366C0",
+"X#    c #6464BD",
+"Y#    c #5F62BA",
+"Z#    c #5B5EB6",
+"`#    c #3B3C66",
+" $    c #2D2E52",
+".$    c #131220",
+"+$    c #9294BE",
+"@$    c #AFB0BA",
+"#$    c #3E416D",
+"$$    c #4A4B83",
+"%$    c #5D60B3",
+"&$    c #6263BC",
+"*$    c #CCCC99",
+"=$    c #5F63BC",
+"-$    c #4C4D95",
+";$    c #333258",
+">$    c #282849",
+",$    c #0B0C18",
+"'$    c #28284A",
+")$    c #B2B4C8",
+"!$    c #42426E",
+"~$    c #424270",
+"{$    c #444782",
+"]$    c #3A3B6E",
+"^$    c #454580",
+"/$    c #5F61BB",
+"($    c #5D5FB8",
+"_$    c #6463BA",
+":$    c #333767",
+"<$    c #262746",
+"[$    c #1D1C32",
+"}$    c #08060C",
+"|$    c #464683",
+"1$    c #808190",
+"2$    c #212039",
+"3$    c #42437B",
+"4$    c #4E5191",
+"5$    c #353864",
+"6$    c #4D5096",
+"7$    c #5D61BC",
+"8$    c #6162BA",
+"9$    c #6064BE",
+"0$    c #4A4A8E",
+"a$    c #19172B",
+"b$    c #19172A",
+"c$    c #0C0B15",
+"d$    c #131221",
+"e$    c #9394BA",
+"f$    c #ACAFBC",
+"g$    c #4B4C86",
+"h$    c #5459A9",
+"i$    c #4E5294",
+"j$    c #404271",
+"k$    c #343663",
+"l$    c #5C5EB4",
+"m$    c #333366",
+"n$    c #6668C0",
+"o$    c #5A5EB2",
+"p$    c #242443",
+"q$    c #414470",
+"r$    c #1C1C33",
+"s$    c #07040A",
+"t$    c #343462",
+"u$    c #6A6B90",
+"v$    c #3E3F69",
+"w$    c #38375F",
+"x$    c #343256",
+"y$    c #2B2A4C",
+"z$    c #3D407A",
+"A$    c #6365BE",
+"B$    c #6164B9",
+"C$    c #302F5A",
+"D$    c #252645",
+"E$    c #242442",
+"F$    c #0A0912",
+"G$    c #120F1E",
+"H$    c #7676B2",
+"I$    c #282948",
+"J$    c #222240",
+"K$    c #42487E",
+"L$    c #313258",
+"M$    c #272749",
+"N$    c #454887",
+"O$    c #5F64BD",
+"P$    c #6063BD",
+"Q$    c #6364BC",
+"R$    c #6869BE",
+"S$    c #454684",
+"T$    c #393A63",
+"U$    c #0B0B15",
+"V$    c #3B3D70",
+"W$    c #87889D",
+"X$    c #323256",
+"Y$    c #4D4D88",
+"Z$    c #323458",
+"`$    c #434476",
+" %    c #393A68",
+".%    c #4E4E95",
+"+%    c #5C5FB8",
+"@%    c #5A5FB9",
+"#%    c #6267BA",
+"$%    c #444580",
+"%%    c #484A7C",
+"&%    c #141526",
+"*%    c #22253F",
+"=%    c #9295BC",
+"-%    c #626484",
+";%    c #333459",
+">%    c #484A88",
+",%    c #4D4E94",
+"'%    c #3E4073",
+")%    c #3D3E75",
+"!%    c #5A5EB7",
+"~%    c #5A5EB8",
+"{%    c #993366",
+"]%    c #6264BE",
+"^%    c #6565BE",
+"/%    c #5A5CAE",
+"(%    c #30315D",
+"_%    c #3D406D",
+":%    c #4C4E86",
+"<%    c #242542",
+"[%    c #07050C",
+"}%    c #101223",
+"|%    c #6B6EA0",
+"1%    c #34345D",
+"2%    c #191A30",
+"3%    c #36365E",
+"4%    c #4A4A88",
+"5%    c #313056",
+"6%    c #30305D",
+"7%    c #5255A3",
+"8%    c #6668C1",
+"9%    c #6366BE",
+"0%    c #4E5196",
+"a%    c #2B2C52",
+"b%    c #3A3C6B",
+"c%    c #444876",
+"d%    c #2E2E50",
+"e%    c #0C0912",
+"f%    c #0D0B16",
+"g%    c #494986",
+"h%    c #ADAFBA",
+"i%    c #292B4C",
+"j%    c #18172B",
+"k%    c #333456",
+"l%    c #38385F",
+"m%    c #232240",
+"n%    c #34335C",
+"o%    c #2F3258",
+"p%    c #3E3E74",
+"q%    c #585CB1",
+"r%    c #5C5EB8",
+"s%    c #5E60B6",
+"t%    c #444684",
+"u%    c #2C2E52",
+"v%    c #2C2A4A",
+"w%    c #424474",
+"x%    c #232543",
+"y%    c #0C0C16",
+"z%    c #0E0D19",
+"A%    c #43447A",
+"B%    c #ACAFB9",
+"C%    c #2E2E52",
+"D%    c #12101F",
+"E%    c #1C1B33",
+"F%    c #0E0E1A",
+"G%    c #5857A5",
+"H%    c #50529F",
+"I%    c #444783",
+"J%    c #373863",
+"K%    c #42427B",
+"L%    c #474A8E",
+"M%    c #52529E",
+"N%    c #595BB0",
+"O%    c #6262BC",
+"P%    c #6062BB",
+"Q%    c #575EB2",
+"R%    c #3C3F76",
+"S%    c #2F3056",
+"T%    c #383965",
+"U%    c #35365C",
+"V%    c #262644",
+"W%    c #12101C",
+"X%    c #0A060C",
+"Y%    c #0F101C",
+"Z%    c #424479",
+"`%    c #B0B3C6",
+" &    c #515369",
+".&    c #0D0E1C",
+"+&    c #0E0E1C",
+"@&    c #3C3D6E",
+"#&    c #4A4F8E",
+"$&    c #5759B0",
+"%&    c #5558AB",
+"&&    c #4E5094",
+"*&    c #363764",
+"=&    c #3C3B6E",
+"-&    c #3B3E77",
+";&    c #3F407C",
+">&    c #3B3D73",
+",&    c #3A3A6E",
+"'&    c #383A6F",
+")&    c #3B3B70",
+"!&    c #3C3B70",
+"~&    c #3A3B6D",
+"{&    c #34355E",
+"]&    c #454680",
+"^&    c #4E5095",
+"/&    c #474C8A",
+"(&    c #18172D",
+"_&    c #090A13",
+":&    c #161728",
+"<&    c #64668E",
+"[&    c #60607F",
+"}&    c #18182C",
+"|&    c #292A49",
+"1&    c #3C3C68",
+"2&    c #464882",
+"3&    c #545BAF",
+"4&    c #50529A",
+"5&    c #3B3E6B",
+"6&    c #2F3158",
+"7&    c #363760",
+"8&    c #383860",
+"9&    c #303358",
+"0&    c #414272",
+"a&    c #46487E",
+"b&    c #4C4A7E",
+"c&    c #4D5091",
+"d&    c #383962",
+"e&    c #0A060E",
+"f&    c #0B0A12",
+"g&    c #262745",
+"h&    c #7070A4",
+"i&    c #ACAEB6",
+"j&    c #55566D",
+"k&    c #131528",
+"l&    c #141221",
+"m&    c #1B1B32",
+"n&    c #2F2F4F",
+"o&    c #303054",
+"p&    c #292847",
+"q&    c #323257",
+"r&    c #393960",
+"s&    c #393A62",
+"t&    c #3D3E69",
+"u&    c #4C4E8E",
+"v&    c #4A4B8A",
+"w&    c #52539A",
+"x&    c #3C4070",
+"y&    c #343459",
+"z&    c #20213B",
+"A&    c #110F1C",
+"B&    c #08070E",
+"C&    c #1E2038",
+"D&    c #616386",
+"E&    c #ADB1C2",
+"F&    c #AAAEB6",
+"G&    c #32335B",
+"H&    c #19182C",
+"I&    c #0F0E1B",
+"J&    c #0A0A15",
+"K&    c #0F0F1B",
+"L&    c #121223",
+"M&    c #1A1B34",
+"N&    c #131223",
+"O&    c #141527",
+"P&    c #181A30",
+"Q&    c #161324",
+"R&    c #0F0D19",
+"S&    c #080810",
+"T&    c #0B080F",
+"U&    c #0D0C18",
+"V&    c #20223B",
+"W&    c #444379",
+"X&    c #AEB0BC",
+"Y&    c #ADAEB8",
+"Z&    c #848394",
+"`&    c #2E3054",
+" *    c #1E1E36",
+".*    c #0B0D19",
+"+*    c #0A080E",
+"@*    c #08050A",
+"#*    c #09070D",
+"$*    c #090911",
+"%*    c #10101D",
+"&*    c #252946",
+"**    c #373A69",
+"=*    c #8A8CA2",
+"-*    c #B0B0C0",
+";*    c #8E8EA8",
+">*    c #8A8BA0",
+",*    c #868A9E",
+"'*    c #848698",
+")*    c #838698",
+"!*    c #83879A",
+"~*    c #89889D",
+"{*    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+2+3+4+4+1+1+2+2+2+2+2+2+2+2+5+/+6+>+7+8+9+0+a+b+            ",
+"            c+d+e+f+g+h+i+j+[+k+l+2+2+2+4+4+4+4+4+4+4+4+4+4+4+4+m+2+2+2+2+2+2+2+n+o+p+q+r+          ",
+"            s+t+u+v+w+x+y+1+2+2+2+2+4+4+4+4+4+1+z+1+4+4+4+4+4+4+4+4+4+4+4+2+2+2+A+B+C+D+E+          ",
+"          {.F+G+H+I+J+l+2+2+2+4+4+4+4+4+4+4+m+K+z+K+L+m+4+4+4+4+4+4+4+2+2+2+1+2+M+N+O+P+Q+R+        ",
+"          S+T+U+V+W+2+2+2+m+4+4+4+4+4+4+4+X+m+K+z+Y+Z+`+4+4+4+4+4+2+2+2+1+4+4+2+ @.@+@@@g+#@        ",
+"        $@%@&@*@=@-@2+2+2+2+2+2+2+l+m+1+4+K+K+Y+z+;@Y+3+4+4+4+4+2+2+1+4+4+4+4+2+M+ @>@,@'@)@!@      ",
+"        ~@{@]@: ^@/@2+4+4+4+4+4+2+2+2+2+2+2+2+2+(@;@;@m+4+4+2+2+l+4+4+4+4+4+4+2+_@ @:@<@[@}@|@      ",
+"        1@2@3@4@5@6@2+4+4+4+4+4+4+4+4+4+4+`+Z+2+2+2+2+2+2+2+2+4+4+4+4+4+4+4+4+2+ @7@8@9@0@a@b@      ",
+"      c@d@e@f@g@h@i@2+4+4+4+4+4+4+4+4+4+4+j@;@z+(@;@k@l@1+2+4+4+4+4+4+4+4+4+4+2+ @7@m@n@o@p@q@r@    ",
+"      s@t@u@v@w@x@y@2+4+4+4+4+4+4+4+4+4+4+K+;@z+;@;@L+4+4+2+4+4+4+4+z@4+4+4+4+2+ @ @7@A@B@C@D@E@    ",
+"      F@G@H@I@J@K@L@2+4+4+4+4+4+m+m+4+4+4+K+;@z+;@Y+m+4+4+2+4+4+m+4+1+4+4+4+1+2+ @M+7@M@N@e@O@P@    ",
+"      Q@R@S@}@T@U@V@2+4+4+4+4+4+X+;@m+4+m+Y+;@z+;@k@m+4+4+2+m+m+4+4+4+4+4+4+4+2+7@7@M+M+W@X@Y@Z@    ",
+"      `@ #.#+#@###$#2+4+4+4+4+4+4+j@%#&#%#(@K+z+z+Y+K+j@K+2+K+X+4+4+4+4+4+4+1+2+ @_@ @*#=#-#;#>#    ",
+"      ,#'#)#!#~#{#]#2+4+4+4+4+4+4+l@k@K+;@k@;@(@z+Y+m+4+4+2+K+4+^#4+4+4+m+4+m+2+ @ @M+/#(#_#:#<#    ",
+"      [#}#|#1#2#3#4#2+4+4+4+4+4+m+4+m+K+m+X+K+;@z+;@L+4+m+2+4+m+X+4+4+Y+m+4+1+2+ @ @7@5#6#p@7#8#    ",
+"      9#0#a#b#c#d#e#2+4+4+4+4+4+4+4+4+4+4+4+k@;@z+Y+K+m+m+2+X+K+j@m+4+3+4+4+l+2+ @ @f#g#h#i#j#<#    ",
+"      k#l#m#n#o#5+-.2+1+4+4+4+4+4+4+4+4+4+^#%#(@z+Y+Z+Y+3+2+;@;@m+K+X+4+4+4+3+2+ @ @p#q#r#s#t#u#    ",
+"      v#w#O+}@x#y#-.2+1+4+4+4+4+4+4+4+4+4+&#k@;@z+k@m+K+3+2+K+1+4+L+m+^#4+4+l+ @ @z#>+A#B#C#D#E#    ",
+"      F#G#H#I#J#G.K#2+1+4+4+4+4+4+4+4+4+1+z@;@z+z+Y+l@4+j@2+K+j@m+m+1+4+4+4+3+ @ @L#H.M#N#O#P#Q#    ",
+"      R#S#T#U#V#W#X#2+3+4+4+4+4+4+4+&#4+4+L+;@z+(@K+X+K+Z+2+m+K+K+L+m+4+1+4+3+Y#z#>+Z#`# $D#.$+$    ",
+"      @$[@#$$$~ %$&$2+l+4+4+4+4+4+4+^#4+4+K+k@z+*$K+4+m+j@2+L+4+4+4+^#4+4+2+2+=$z#H.-$;$>$,$'$)$    ",
+"        !$~${$]$^$/$H.2+4+4+4+4+4+4+4+4+4+m+;@z+;@K+4+4+3+2+1+4+4+4+4+4+2+2+($f.X#_$:$<$[$}$|$      ",
+"        1$2$3$4$5$6$7$2+4+4+4+4+1+4+4+4+4+L+Y+z+Y+K+4+4+k@2+4+4+4+4+4+2+2+^#8$f.9$0$a$b$c$d$e$      ",
+"        f$g$h$i$j$k$l$2+4+4+4+4+4+4+4+4+4+m$z+z+K+j@z@4+1+2+4+4+4+4+2+2+*#*#g#n$o$p$q$r$s$t$R       ",
+"          u$v$w$x$y$z$2+2+2+&#4+m+4+4+4+4+X+z+K+L+1+m+4+1+2+4+4+4+^#2+^#7$>+A$B$C$D$E$F$G$H$        ",
+"            I$J$K$L$M$N$M+2+2+2+2+m+4+4+4+4+z+4+4+4+m+4+m+2+4+4+&#2+2+O$P$Q$R$S$T$E$U$}$V$          ",
+"            W$X$Y$Z$`$ %.%+% @@%2+2+2+2+4+4+z+4+4+4+4+m+Z+2+4+4+2+2+g#&$H.#%$%T$%%&%}$*%=%          ",
+"              -%;%D$>%,%'%)%!% @_@~%M+2+2+2+1+4+4+4+4+m+{%2+4+2+2+>+]%^%/%(%_%:%<%[%}%|%            ",
+"                1%2%3%O 4%5%6%7%7$ @ @ @ @ @2+2+2+1+4+4+m+2+2+2+/+8%9%0%a%b%c%d%e%f%g%              ",
+"                h%i%j%k%l%m%n%o%p%q%r%($ @ @f#7$ @2+2+2+2+2+^#X#&$s%t%u%v%w%x%y%z%A%5               ",
+"                  B%C%D%E%F%G%H%I%J%K%L%M%N%($O%/$P%P$&$H.g#Q%N$R%S%T%U%V%W%X%Y%Z%`%                ",
+"                       &.&+&@&#&$&%&&&_.*&=&-&;&>&,&'&)&!&~&{&]&^&/&'$(&_&s$:&<&                    ",
+"                        [&j%}&|&1&2&3&4&_%5&6&7&8&9&0&i a&b&c&C+d&B+e&P#f&g&h&                      ",
+"                          i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&d&y&z&A&}$B&C&D&E&                        ",
+"                              F&G&H&I&e%J&K&L&M&N&O&r$P&Q&R&S&T&U&V&W&X&                            ",
+"                                  Y&Z&`& *D%.*+*@*}$#*$*%*}&&***=*-*                                ",
+"                                          ;*>*,*'*)*!*~*{*c@                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.bmp
new file mode 100644 (file)
index 0000000..8997c25
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_CreateDICOMDIR.xpm
new file mode 100644 (file)
index 0000000..99176f7
--- /dev/null
@@ -0,0 +1,1152 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_CreateDICOMDIR_xpm[] = {
+"50 50 1099 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #191919",
+"}+    c #000100",
+"|+    c #070803",
+"1+    c #000002",
+"2+    c #0C0A15",
+"3+    c #00000B",
+"4+    c #050311",
+"5+    c #000005",
+"6+    c #7A7CD2",
+"7+    c #7476D0",
+"8+    c #6D71CA",
+"9+    c #6A6CC5",
+"0+    c #6464BE",
+"a+    c #5A5AAF",
+"b+    c #444884",
+"c+    c #50529D",
+"d+    c #54539D",
+"e+    c #5656A4",
+"f+    c #AEAEB9",
+"g+    c #B3B3C6",
+"h+    c #888ADD",
+"i+    c #7F81D6",
+"j+    c #5C5EAD",
+"k+    c #4B4B7E",
+"l+    c #8A8ACA",
+"m+    c #A3A2EB",
+"n+    c #AEADF0",
+"o+    c #BAB9F4",
+"p+    c #FEFFFA",
+"q+    c #F4F3FF",
+"r+    c #F9F6FF",
+"s+    c #FEFBFF",
+"t+    c #FCFCFF",
+"u+    c #F2F2FC",
+"v+    c #010100",
+"w+    c #8183CA",
+"x+    c #7679CC",
+"y+    c #6A6CC6",
+"z+    c #686AC3",
+"A+    c #6264BE",
+"B+    c #6161BA",
+"C+    c #595BAD",
+"D+    c #42457F",
+"E+    c #4E529B",
+"F+    c #4F508F",
+"G+    c #4F4F8E",
+"H+    c #B4B5C8",
+"I+    c #8586C8",
+"J+    c #7A7DD4",
+"K+    c #696AC2",
+"L+    c #3C3C6A",
+"M+    c #7879B8",
+"N+    c #A09FE9",
+"O+    c #A8A8F0",
+"P+    c #B6B6F3",
+"Q+    c #0F1209",
+"R+    c #F9FAFF",
+"S+    c #FEFCFF",
+"T+    c #FEF7FF",
+"U+    c #FCF6FF",
+"V+    c #FCF7FF",
+"W+    c #F2F2FF",
+"X+    c #FCFFFF",
+"Y+    c #000200",
+"Z+    c #FFFFFB",
+"`+    c #151520",
+" @    c #7275CE",
+".@    c #6B6FC8",
+"+@    c #686AC2",
+"@@    c #6868C0",
+"#@    c #6464BD",
+"$@    c #6061B9",
+"%@    c #5F5FB8",
+"&@    c #5C5BAE",
+"*@    c #302F52",
+"=@    c #4E5090",
+"-@    c #4E4E88",
+";@    c #70709F",
+">@    c #7679D1",
+",@    c #515396",
+"'@    c #46467E",
+")@    c #515385",
+"!@    c #9796E3",
+"~@    c #A1A2EC",
+"{@    c #ACACF1",
+"]@    c #C7C7F7",
+"^@    c #000030",
+"/@    c #241979",
+"(@    c #1E137C",
+"_@    c #191069",
+":@    c #05053B",
+"<@    c #FBFFFF",
+"[@    c #020A00",
+"}@    c #F2F3F5",
+"|@    c #FEFEFF",
+"1@    c #05030E",
+"2@    c #686CC4",
+"3@    c #6668C1",
+"4@    c #6364BC",
+"5@    c #5E62BC",
+"6@    c #5D61BC",
+"7@    c #5C60BB",
+"8@    c #41407C",
+"9@    c #454677",
+"0@    c #4A4A7C",
+"a@    c #484876",
+"b@    c #AFB1C0",
+"c@    c #6669C1",
+"d@    c #5B5DAE",
+"e@    c #343660",
+"f@    c #393C65",
+"g@    c #8A8DD8",
+"h@    c #9798E6",
+"i@    c #A1A4EE",
+"j@    c #B0B0F1",
+"k@    c #BEBEF6",
+"l@    c #C8C9F7",
+"m@    c #F8F7FF",
+"n@    c #FBF4FF",
+"o@    c #F2E3FF",
+"p@    c #F9EBFF",
+"q@    c #F0E6FF",
+"r@    c #F8F6FF",
+"s@    c #EDF5FF",
+"t@    c #000400",
+"u@    c #FCFEFF",
+"v@    c #F5F4FF",
+"w@    c #FEFDFF",
+"x@    c #010109",
+"y@    c #6468C2",
+"z@    c #5D5FB8",
+"A@    c #5C60BA",
+"B@    c #5A5BAF",
+"C@    c #37375E",
+"D@    c #4D508E",
+"E@    c #4A4882",
+"F@    c #9396C1",
+"G@    c #5B5DB2",
+"H@    c #484C8D",
+"I@    c #2D2F54",
+"J@    c #6A6AA8",
+"K@    c #9290E0",
+"L@    c #A4A4ED",
+"M@    c #B2B4F3",
+"N@    c #BEC0F5",
+"O@    c #C9CAF7",
+"P@    c #000102",
+"Q@    c #FBF9FF",
+"R@    c #0B0461",
+"S@    c #2516A5",
+"T@    c #1607A2",
+"U@    c #0C0086",
+"V@    c #181570",
+"W@    c #F7FEFF",
+"X@    c #000209",
+"Y@    c #000017",
+"Z@    c #01001F",
+"`@    c #040517",
+" #    c #000007",
+".#    c #6060B8",
+"+#    c #464782",
+"@#    c #4A4A81",
+"##    c #4D4E8A",
+"$#    c #3E3D67",
+"%#    c #9797C0",
+"&#    c #7A7AB6",
+"*#    c #5A5AAA",
+"=#    c #4C4C8B",
+"-#    c #797BC3",
+";#    c #9090E1",
+">#    c #B3B2F4",
+",#    c #BEBEF4",
+"'#    c #CCCAF8",
+")#    c #EFEFFF",
+"!#    c #F1EBFF",
+"~#    c #F3E6FF",
+"{#    c #F7E9FF",
+"]#    c #E6DAFF",
+"^#    c #F5F2FF",
+"/#    c #F5FAFF",
+"(#    c #F7FDFF",
+"_#    c #F4F4FF",
+":#    c #BABDC4",
+"<#    c #090E07",
+"[#    c #6769C1",
+"}#    c #5D62BB",
+"|#    c #5E60BA",
+"1#    c #5A5EB9",
+"2#    c #5055A5",
+"3#    c #3C3D66",
+"4#    c #4B4C81",
+"5#    c #3A3B64",
+"6#    c #6D6D99",
+"7#    c #4C4F90",
+"8#    c #505396",
+"9#    c #34345A",
+"0#    c #3E406C",
+"a#    c #7D7ECC",
+"b#    c #8D8EE1",
+"c#    c #9496E6",
+"d#    c #A0A2ED",
+"e#    c #ADAFF2",
+"f#    c #BCBDF4",
+"g#    c #000015",
+"h#    c #F9F9FF",
+"i#    c #0E0A61",
+"j#    c #140B8A",
+"k#    c #0F0697",
+"l#    c #1F16A3",
+"m#    c #1B1790",
+"n#    c #00004C",
+"o#    c #1A1D62",
+"p#    c #1C1B5F",
+"q#    c #9C9CE9",
+"r#    c #8E8FE1",
+"s#    c #8589DD",
+"t#    c #FAFBFF",
+"u#    c #C9CDD8",
+"v#    c #000300",
+"w#    c #6063BC",
+"x#    c #5B5FBA",
+"y#    c #5D5FB9",
+"z#    c #3B3A6B",
+"A#    c #3F4271",
+"B#    c #40416C",
+"C#    c #3B3867",
+"D#    c #9091AF",
+"E#    c #505297",
+"F#    c #4C4D8C",
+"G#    c #464680",
+"H#    c #48487A",
+"I#    c #7F82D2",
+"J#    c #8A8DE0",
+"K#    c #9796E4",
+"L#    c #AEAEF2",
+"M#    c #BABBF6",
+"N#    c #C6C6F6",
+"O#    c #00001B",
+"P#    c #EDEFFF",
+"Q#    c #F7F6FF",
+"R#    c #F5F1FF",
+"S#    c #EEE9FF",
+"T#    c #F4EEFF",
+"U#    c #ECE9FF",
+"V#    c #F8F3FF",
+"W#    c #F3EDE2",
+"X#    c #B1B100",
+"Y#    c #9E9E00",
+"Z#    c #F9FBFB",
+"`#    c #B5B9C5",
+" $    c #6162BA",
+".$    c #5E60B9",
+"+$    c #4B4B8E",
+"@$    c #373661",
+"#$    c #323358",
+"$$    c #1C1A2D",
+"%$    c #9898C4",
+"&$    c #62648A",
+"*$    c #414077",
+"=$    c #5858A9",
+"-$    c #3E4274",
+";$    c #676BB3",
+">$    c #8184D6",
+",$    c #878ADC",
+"'$    c #9294E5",
+")$    c #9C9DE8",
+"!$    c #AAABF0",
+"~$    c #B6B5F3",
+"{$    c #C2C0F5",
+"]$    c #00001C",
+"^$    c #F8FAFF",
+"/$    c #07074F",
+"($    c #050366",
+"_$    c #120F84",
+":$    c #100B8C",
+"<$    c #00007E",
+"[$    c #2725A4",
+"}$    c #08077C",
+"|$    c #050069",
+"1$    c #77751D",
+"2$    c #848400",
+"3$    c #838300",
+"4$    c #F8FBFF",
+"5$    c #B7BDCD",
+"6$    c #050C05",
+"7$    c #666AB3",
+"8$    c #7E8093",
+"9$    c #5F61BB",
+"0$    c #5E5EB6",
+"a$    c #31335E",
+"b$    c #2A2E50",
+"c$    c #232440",
+"d$    c #7474A8",
+"e$    c #6D6FC7",
+"f$    c #5C5D99",
+"g$    c #232546",
+"h$    c #21213B",
+"i$    c #7576C6",
+"j$    c #8181D6",
+"k$    c #8588DB",
+"l$    c #8E90E0",
+"m$    c #9898E6",
+"n$    c #AEAFF1",
+"o$    c #F0F4FF",
+"p$    c #F5F8FF",
+"q$    c #F4F5FF",
+"r$    c #F1EFFF",
+"s$    c #F1F0FF",
+"t$    c #E7E5FF",
+"u$    c #F2F0FF",
+"v$    c #F7F0FF",
+"w$    c #8F8F00",
+"x$    c #747400",
+"y$    c #676700",
+"z$    c #ACB3C6",
+"A$    c #858600",
+"B$    c #7E7E39",
+"C$    c #6F6F38",
+"D$    c #767737",
+"E$    c #5E5FBA",
+"F$    c #4B4A86",
+"G$    c #272849",
+"H$    c #4A4A8B",
+"I$    c #767AD1",
+"J$    c #7F82D8",
+"K$    c #5B5CAA",
+"L$    c #787ACD",
+"M$    c #7B7CD4",
+"N$    c #8084DA",
+"O$    c #8A8ADE",
+"P$    c #9296E6",
+"Q$    c #999DE9",
+"R$    c #A4A6EE",
+"S$    c #F7FAFF",
+"T$    c #969600",
+"U$    c #7D7D00",
+"V$    c #5A5A00",
+"W$    c #A6A61F",
+"X$    c #9D9E2F",
+"Y$    c #8A8A00",
+"Z$    c #7C7C00",
+"`$    c #6E6E04",
+" %    c #666609",
+".%    c #646413",
+"+%    c #7C7C22",
+"@%    c #5F63B3",
+"#%    c #46457D",
+"$%    c #45487D",
+"%%    c #262544",
+"&%    c #3F3F79",
+"*%    c #7C7FD6",
+"=%    c #6969C0",
+"-%    c #4A4C8C",
+";%    c #373864",
+">%    c #7579D0",
+",%    c #797AD3",
+"'%    c #7C7FD8",
+")%    c #8484D9",
+"!%    c #8C8EE0",
+"~%    c #9294E3",
+"{%    c #9C9DEA",
+"]%    c #F6F9FF",
+"^%    c #979700",
+"/%    c #959500",
+"(%    c #666600",
+"_%    c #555500",
+":%    c #767600",
+"<%    c #828200",
+"[%    c #898900",
+"}%    c #777700",
+"|%    c #616100",
+"1%    c #6B6B00",
+"2%    c #838424",
+"3%    c #707385",
+"4%    c #414276",
+"5%    c #46477F",
+"6%    c #2C2C4D",
+"7%    c #39386E",
+"8%    c #6D70CB",
+"9%    c #6062BA",
+"0%    c #4A4988",
+"a%    c #2E3055",
+"b%    c #7274CC",
+"c%    c #7375CD",
+"d%    c #7578D0",
+"e%    c #7E7FD6",
+"f%    c #8587DC",
+"g%    c #8E8FE2",
+"h%    c #9696E6",
+"i%    c #9B9CE9",
+"j%    c #919100",
+"k%    c #6E6E00",
+"l%    c #7E7E00",
+"m%    c #A0A000",
+"n%    c #B5B500",
+"o%    c #BDBD00",
+"p%    c #BCBC00",
+"q%    c #B2B200",
+"r%    c #8C8C00",
+"s%    c #5E5E00",
+"t%    c #757500",
+"u%    c #7F8151",
+"v%    c #6566A9",
+"w%    c #404175",
+"x%    c #44467A",
+"y%    c #232442",
+"z%    c #323264",
+"A%    c #6367C0",
+"B%    c #656AC2",
+"C%    c #424475",
+"D%    c #2D2E51",
+"E%    c #7274CB",
+"F%    c #777AD4",
+"G%    c #8083D7",
+"H%    c #8688DB",
+"I%    c #8B8EE0",
+"J%    c #9093E2",
+"K%    c #929200",
+"L%    c #989800",
+"M%    c #939300",
+"N%    c #A2A200",
+"O%    c #ABAB00",
+"P%    c #B8B800",
+"Q%    c #BFBF00",
+"R%    c #C4C400",
+"S%    c #BABA00",
+"T%    c #7F7F00",
+"U%    c #595900",
+"V%    c #949400",
+"W%    c #717190",
+"X%    c #3B3C6E",
+"Y%    c #121222",
+"Z%    c #2F2E5B",
+"`%    c #7073CC",
+" &    c #7174CD",
+".&    c #4D4C8E",
+"+&    c #2E2F54",
+"@&    c #6F73CA",
+"#&    c #6F71C9",
+"$&    c #7D7ED6",
+"%&    c #8284D9",
+"&&    c #8B8EE1",
+"*&    c #9B9B00",
+"=&    c #9F9F00",
+"-&    c #A7A700",
+";&    c #ACAC00",
+">&    c #AFAF00",
+",&    c #A6A600",
+"'&    c #AAAA00",
+")&    c #5F5F00",
+"!&    c #737300",
+"~&    c #BCBD09",
+"{&    c #ACAD17",
+"]&    c #292A4A",
+"^&    c #12101E",
+"/&    c #6D70C9",
+"(&    c #7477D0",
+"_&    c #53549A",
+":&    c #2D2C4F",
+"<&    c #676ABA",
+"[&    c #7778D1",
+"}&    c #7A7BD4",
+"|&    c #8180D7",
+"1&    c #8D8D00",
+"2&    c #A1A100",
+"3&    c #A4A400",
+"4&    c #9A9A01",
+"5&    c #C1C100",
+"6&    c #3D3D6D",
+"7&    c #222342",
+"8&    c #101121",
+"9&    c #38366D",
+"0&    c #6064BA",
+"a&    c #5C5EA5",
+"b&    c #7276CE",
+"c&    c #7679D3",
+"d&    c #878700",
+"e&    c #909000",
+"f&    c #999900",
+"g&    c #6363BC",
+"h&    c #5F62BB",
+"i&    c #5A5AAB",
+"j&    c #383A65",
+"k&    c #262645",
+"l&    c #0F101E",
+"m&    c #424380",
+"n&    c #585BAA",
+"o&    c #4F5091",
+"p&    c #494980",
+"q&    c #484D8F",
+"r&    c #56589B",
+"s&    c #6467BF",
+"t&    c #6868C2",
+"u&    c #727200",
+"v&    c #7A7A00",
+"w&    c #6C6C00",
+"x&    c #4B4B00",
+"y&    c #6062BC",
+"z&    c #5F64BD",
+"A&    c #5E60B8",
+"B&    c #494C8E",
+"C&    c #353358",
+"D&    c #1E1D36",
+"E&    c #09080F",
+"F&    c #595AA4",
+"G&    c #8B8CA4",
+"H&    c #484B7F",
+"I&    c #494C80",
+"J&    c #474882",
+"K&    c #484B84",
+"L&    c #6366C0",
+"M&    c #6565BE",
+"N&    c #676BC3",
+"O&    c #696DC5",
+"P&    c #6B6DC6",
+"Q&    c #6D6D00",
+"R&    c #818100",
+"S&    c #575700",
+"T&    c #6465BE",
+"U&    c #5F62BA",
+"V&    c #5B5EB6",
+"W&    c #3B3C66",
+"X&    c #2D2E52",
+"Y&    c #131220",
+"Z&    c #9294BE",
+"`&    c #AFB0BA",
+" *    c #3E416D",
+".*    c #4A4B83",
+"+*    c #5D60B3",
+"@*    c #6263BC",
+"#*    c #6767C0",
+"$*    c #646400",
+"%*    c #888800",
+"&*    c #5F63BC",
+"**    c #4C4D95",
+"=*    c #333258",
+"-*    c #282849",
+";*    c #0B0C18",
+">*    c #28284A",
+",*    c #B2B4C8",
+"'*    c #42426E",
+")*    c #424270",
+"!*    c #444782",
+"~*    c #3A3B6E",
+"{*    c #454580",
+"]*    c #6365BF",
+"^*    c #0A0C57",
+"/*    c #101072",
+"(*    c #00006F",
+"_*    c #171592",
+":*    c #100F8F",
+"<*    c #181799",
+"[*    c #01007F",
+"}*    c #040078",
+"|*    c #505000",
+"1*    c #606000",
+"2*    c #6A6A00",
+"3*    c #6463BA",
+"4*    c #333767",
+"5*    c #262746",
+"6*    c #1D1C32",
+"7*    c #08060C",
+"8*    c #464683",
+"9*    c #808190",
+"0*    c #212039",
+"a*    c #42437B",
+"b*    c #4E5191",
+"c*    c #353864",
+"d*    c #4D5096",
+"e*    c #F5F7FF",
+"f*    c #F4F1FF",
+"g*    c #F2F1FF",
+"h*    c #EBEAFF",
+"i*    c #F7F1FF",
+"j*    c #E9E3FF",
+"k*    c #A5A9C2",
+"l*    c #070C0F",
+"m*    c #5C5C00",
+"n*    c #6064BE",
+"o*    c #4A4A8E",
+"p*    c #19172B",
+"q*    c #19172A",
+"r*    c #0C0B15",
+"s*    c #131221",
+"t*    c #9394BA",
+"u*    c #ACAFBC",
+"v*    c #4B4C86",
+"w*    c #5459A9",
+"x*    c #4E5294",
+"y*    c #404271",
+"z*    c #343663",
+"A*    c #5C5EB4",
+"B*    c #5E62BD",
+"C*    c #F7F7FF",
+"D*    c #242369",
+"E*    c #09065F",
+"F*    c #1C1680",
+"G*    c #0D087E",
+"H*    c #1B1593",
+"I*    c #070185",
+"J*    c #181185",
+"K*    c #160F5D",
+"L*    c #2A2357",
+"M*    c #FDF9FF",
+"N*    c #C6C4DC",
+"O*    c #03030F",
+"P*    c #6668C0",
+"Q*    c #5A5EB2",
+"R*    c #242443",
+"S*    c #414470",
+"T*    c #1C1C33",
+"U*    c #07040A",
+"V*    c #343462",
+"W*    c #6A6B90",
+"X*    c #3E3F69",
+"Y*    c #38375F",
+"Z*    c #343256",
+"`*    c #2B2A4C",
+" =    c #3D407A",
+".=    c #5C5EB7",
+"+=    c #01011D",
+"@=    c #FBFAFF",
+"#=    c #DDDDFF",
+"$=    c #F8F5FF",
+"%=    c #EFECFF",
+"&=    c #F7F2FF",
+"*=    c #F1ECFF",
+"==    c #E9E4FF",
+"-=    c #FFFBFF",
+";=    c #C3BFD6",
+">=    c #00000E",
+",=    c #6365BE",
+"'=    c #6164B9",
+")=    c #302F5A",
+"!=    c #252645",
+"~=    c #242442",
+"{=    c #0A0912",
+"]=    c #120F1E",
+"^=    c #7676B2",
+"/=    c #282948",
+"(=    c #222240",
+"_=    c #42487E",
+":=    c #313258",
+"<=    c #272749",
+"[=    c #454887",
+"}=    c #000009",
+"|=    c #B4B7C6",
+"1=    c #C0C5D9",
+"2=    c #C6CBE8",
+"3=    c #B1B5D8",
+"4=    c #B3B8E2",
+"5=    c #BABEED",
+"6=    c #AFB2E5",
+"7=    c #C1C3F3",
+"8=    c #AEADCF",
+"9=    c #CDC9E4",
+"0=    c #CAC6DD",
+"a=    c #B9B6C9",
+"b=    c #6063BD",
+"c=    c #6869BE",
+"d=    c #454684",
+"e=    c #393A63",
+"f=    c #0B0B15",
+"g=    c #3B3D70",
+"h=    c #87889D",
+"i=    c #323256",
+"j=    c #4D4D88",
+"k=    c #323458",
+"l=    c #434476",
+"m=    c #393A68",
+"n=    c #4E4E95",
+"o=    c #5C5FB8",
+"p=    c #0C110D",
+"q=    c #030905",
+"r=    c #030907",
+"s=    c #000204",
+"t=    c #000305",
+"u=    c #060F14",
+"v=    c #000309",
+"w=    c #00020C",
+"x=    c #000210",
+"y=    c #060419",
+"z=    c #010014",
+"A=    c #000010",
+"B=    c #0B0917",
+"C=    c #121119",
+"D=    c #6267BA",
+"E=    c #444580",
+"F=    c #484A7C",
+"G=    c #141526",
+"H=    c #22253F",
+"I=    c #9295BC",
+"J=    c #626484",
+"K=    c #333459",
+"L=    c #484A88",
+"M=    c #4D4E94",
+"N=    c #3E4073",
+"O=    c #3D3E75",
+"P=    c #5A5EB7",
+"Q=    c #5A5EB8",
+"R=    c #5A5FB9",
+"S=    c #6064BD",
+"T=    c #5A5CAE",
+"U=    c #30315D",
+"V=    c #3D406D",
+"W=    c #4C4E86",
+"X=    c #242542",
+"Y=    c #07050C",
+"Z=    c #101223",
+"`=    c #6B6EA0",
+" -    c #34345D",
+".-    c #191A30",
+"+-    c #36365E",
+"@-    c #4A4A88",
+"#-    c #313056",
+"$-    c #30305D",
+"%-    c #5255A3",
+"&-    c #6064BF",
+"*-    c #6466C0",
+"=-    c #6666BF",
+"--    c #6366BE",
+";-    c #4E5196",
+">-    c #2B2C52",
+",-    c #3A3C6B",
+"'-    c #444876",
+")-    c #2E2E50",
+"!-    c #0C0912",
+"~-    c #0D0B16",
+"{-    c #494986",
+"]-    c #ADAFBA",
+"^-    c #292B4C",
+"/-    c #18172B",
+"(-    c #333456",
+"_-    c #38385F",
+":-    c #232240",
+"<-    c #34335C",
+"[-    c #2F3258",
+"}-    c #3E3E74",
+"|-    c #585CB1",
+"1-    c #5C5EB8",
+"2-    c #5D60B9",
+"3-    c #6061BA",
+"4-    c #6265BD",
+"5-    c #5E60B6",
+"6-    c #444684",
+"7-    c #2C2E52",
+"8-    c #2C2A4A",
+"9-    c #424474",
+"0-    c #232543",
+"a-    c #0C0C16",
+"b-    c #0E0D19",
+"c-    c #43447A",
+"d-    c #ACAFB9",
+"e-    c #2E2E52",
+"f-    c #12101F",
+"g-    c #1C1B33",
+"h-    c #0E0E1A",
+"i-    c #5857A5",
+"j-    c #50529F",
+"k-    c #444783",
+"l-    c #373863",
+"m-    c #42427B",
+"n-    c #474A8E",
+"o-    c #52529E",
+"p-    c #595BB0",
+"q-    c #6262BC",
+"r-    c #6062BB",
+"s-    c #575EB2",
+"t-    c #3C3F76",
+"u-    c #2F3056",
+"v-    c #383965",
+"w-    c #35365C",
+"x-    c #262644",
+"y-    c #12101C",
+"z-    c #0A060C",
+"A-    c #0F101C",
+"B-    c #424479",
+"C-    c #B0B3C6",
+"D-    c #515369",
+"E-    c #0D0E1C",
+"F-    c #0E0E1C",
+"G-    c #3C3D6E",
+"H-    c #4A4F8E",
+"I-    c #5759B0",
+"J-    c #5558AB",
+"K-    c #4E5094",
+"L-    c #363764",
+"M-    c #3C3B6E",
+"N-    c #3B3E77",
+"O-    c #3F407C",
+"P-    c #3B3D73",
+"Q-    c #3A3A6E",
+"R-    c #383A6F",
+"S-    c #3B3B70",
+"T-    c #3C3B70",
+"U-    c #3A3B6D",
+"V-    c #34355E",
+"W-    c #454680",
+"X-    c #4E5095",
+"Y-    c #474C8A",
+"Z-    c #18172D",
+"`-    c #090A13",
+" ;    c #161728",
+".;    c #64668E",
+"+;    c #60607F",
+"@;    c #18182C",
+"#;    c #292A49",
+"$;    c #3C3C68",
+"%;    c #464882",
+"&;    c #545BAF",
+"*;    c #50529A",
+"=;    c #3B3E6B",
+"-;    c #2F3158",
+";;    c #363760",
+">;    c #383860",
+",;    c #303358",
+"';    c #414272",
+");    c #46487E",
+"!;    c #4C4A7E",
+"~;    c #4D5091",
+"{;    c #383962",
+"];    c #0A060E",
+"^;    c #0B0A12",
+"/;    c #262745",
+"(;    c #7070A4",
+"_;    c #ACAEB6",
+":;    c #55566D",
+"<;    c #131528",
+"[;    c #141221",
+"};    c #1B1B32",
+"|;    c #2F2F4F",
+"1;    c #303054",
+"2;    c #292847",
+"3;    c #323257",
+"4;    c #393960",
+"5;    c #393A62",
+"6;    c #3D3E69",
+"7;    c #4C4E8E",
+"8;    c #4A4B8A",
+"9;    c #52539A",
+"0;    c #3C4070",
+"a;    c #343459",
+"b;    c #20213B",
+"c;    c #110F1C",
+"d;    c #08070E",
+"e;    c #1E2038",
+"f;    c #616386",
+"g;    c #ADB1C2",
+"h;    c #AAAEB6",
+"i;    c #32335B",
+"j;    c #19182C",
+"k;    c #0F0E1B",
+"l;    c #0A0A15",
+"m;    c #0F0F1B",
+"n;    c #121223",
+"o;    c #1A1B34",
+"p;    c #131223",
+"q;    c #141527",
+"r;    c #181A30",
+"s;    c #161324",
+"t;    c #0F0D19",
+"u;    c #080810",
+"v;    c #0B080F",
+"w;    c #0D0C18",
+"x;    c #20223B",
+"y;    c #444379",
+"z;    c #AEB0BC",
+"A;    c #ADAEB8",
+"B;    c #848394",
+"C;    c #2E3054",
+"D;    c #1E1E36",
+"E;    c #0B0D19",
+"F;    c #0A080E",
+"G;    c #08050A",
+"H;    c #09070D",
+"I;    c #090911",
+"J;    c #10101D",
+"K;    c #252946",
+"L;    c #373A69",
+"M;    c #8A8CA2",
+"N;    c #B0B0C0",
+"O;    c #8E8EA8",
+"P;    c #8A8BA0",
+"Q;    c #868A9E",
+"R;    c #848698",
+"S;    c #838698",
+"T;    c #83879A",
+"U;    c #89889D",
+"V;    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+3+1+|+1+2+3+1+2+3+4+5+6+7+8+9+/+0+>+a+b+c+d+e+f+            ",
+"            g+h+i+j+k+l+m+n+o+}+p+q+r+s+t+r+q+r+s+t+r+s+t+u+}+v+w+x+y+z+A+H.B+C+D+E+F+G+H+          ",
+"            I+J+K+L+M+N+O+P+X.Q+R+S+T+U+V+W+S+T+V+W+S+T+U+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@          ",
+"          {.>@,@'@)@!@~@{@o+]@Y+S+^@/@(@_@:@^@/@_@:@^@/@(@<@[@}@|@1@=.2@3@4@5@6@7@8@9@0@a@b@        ",
+"          c@d@e@f@g@h@i@j@k@l@Y+m@n@o@p@q@r@n@o@q@r@n@o@p@s@t@u@v@w@x@-.y@A+>+z@A@B@C@D@k+E@        ",
+"        F@G@H@I@J@K@#+L@M@N@O@P@Q@R@S@T@U@V@R@S@U@V@R@S@T@W@X@Y@Z@`@ #}+3@#@>+.#7@A@+#@###$#%#      ",
+"        &#*#=#: -#;##+o.>#,#'#3+)#!#~#{#]#^#!#~#]#^#!#~#{#/#(#R+r+_#:#<#[##@}#|#1#A@2#3#4#5#6#      ",
+"        7#8#9#0#a#b#c#d#e#f#O@g#h#i#j#k#l#m#n#o#l#m#n#o#p#q#r#s#^.t#u#v#+@0+w#7@A@x#y#z#A#B#C#      ",
+"      D#E#F#G#H#I#J#K#y.L#M#N#O#P#Q#R#S#T#U#W+_#T#U#W+_#V#W#X#Y#W+Z#`#v#f.4@ $.#A@x#.$+$@$#$$$%$    ",
+"      &$*$=$-$;$>$,$'$)$!$~${$]$^$/$($_$:$<$[$}$|$^@/@(@^@1$2$3$:@4$5$6$7$8$6@9$A@A@x#0$a$b$c$d$    ",
+"      e$f$g$h$i$j$k$l$m$U.n$o+]$o$p$q$W+r$s$t$u$v$n@o@p@n@w$x$y$r@^$z$A$B$C$D$A@A@7@x#E$F$F#G$H$    ",
+"      I$J$K$5#L$M$N$O$P$Q$R$n+Y@S$R@S@T@U@V@R@S@T@R@S@T@R@T$U$V$x$W$X$Y$Z$`$ %.%+%x#@%7@#%$%%%&%    ",
+"      *%=%-%;%>%,%'%)%!%~%{%R$Y@]%!#~#{#]#^#!#~#{#!#~#{#!#^%/%(%_%:%2$<%[%Y$}%|%1%2%3%|#4%5%6%7%    ",
+"      8%9%0%a%b%c%d%e%f%g%h%i%g#h#i#j#k#l#m#n#o#p#n#o#p#m#j%^%Y$k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%    ",
+"      A%B%C%D%E%8+ @F%G%H%I%J%O#P#Q#R#S#T#U#W+_#V#W+_#V#U#Y$K%L%M%N%O%q%P%Q%R%S%T%U%V%W%X%#$Y%Z%    ",
+"      `% &.&+&@&y+#& @d%$&%&&&]$^$R@S@T@U@V@R@S@T@R@S@T@R@3$r%K%*&=&-&;&n%S%>&,&'&)&!&~&{&]&^&z%    ",
+"      /&(&_&:&<&9+-.E.D.[&}&|&]$o$!#~#{#]#^#!#~#{#!#~#{#!#Z$2$1&T$*&2&3&Y#A@A@A@A@A@4&5&6&7&8&9&    ",
+"      0&2@9@5#a&+@-.g.8+`%b&c&g#h#i#j#k#l#m#n#o#p#n#o#p#m#:%l%d&e&f&f&l%s%g&A@A@A@h&>+i&j&k&l&m&    ",
+"      n&o&p&q&r&G.s&2@t&.@#&=+O#P#Q#R#S#T#U#W+_#V#W+_#V#U#u&v&3$r%/%M%w&x&y&z&A@A@A&H.B&C&D&E&F&    ",
+"      G&H&I&J&K&L&#@M&N&+@O&P&]$^$/$($_$:$<$[$}$|$[$}$|$<$Q&:%T%d&e&V%R&S&1#T&U&h&>+V&W&X&l&Y&Z&    ",
+"      `&4# *.*~ +*@*H.#@#*% t&]$o$p$q$W+r$s$t$u$v$t$u$v$s$$*w&t%T%%*j%K%w&U%5@&*h&H.**=*-*;*>*,*    ",
+"        '*)*!*~*{*9$H.@*4@]*#*Y@S$^*/*(*_*:*<*[*}*<*[*}*:*|*S&1*2*!&l%Y$R&S&z@f.#@3*4*5*6*7*8*      ",
+"        9*0*a*b*c*d*6@6@y&4@#@Y@]%e*_#f*g*t$h*u$i*h*u$i*t$h*u$i*j*h#k*l*1%m* $f.n*o*p*q*r*s*t*      ",
+"        u*v*w*x*y*z*A*B*6@6@y&]$C*D*E*F*G*H*I*J*K*I*J*K*H*I*J*K*L*M*N*O*|#|#y&P*Q*R*S*T*U*V*R       ",
+"          W*X*Y*Z*`* =.=x#6@A@+=@=#=m@$=%=&=f**=V+==f**=V+f**=V+==-=;=>=6@>+,='=)=!=~={=]=^=        ",
+"            /=(=_=:=<=[=7@x#A@}=|=1=2=3=4=5=6=7=8=9=6=7=8=6=7=8=9=0=a=3+b=4@c=d=e=~=f=7*g=          ",
+"            h=i=j=k=l=m=n=o=A@p=q=r=s=t=u=v=w=x=y=z=w=x=y=w=x=y=z=A=B=C=H.D=E=e=F=G=7*H=I=          ",
+"              J=K=!=L=M=N=O=P=A@1#Q=7@R=A@A@A@A@A@x#R=7@A+S=|#|#|#>+A+M&T=U=V=W=X=Y=Z=`=            ",
+"                 -.-+-O @-#-$-%-6@A@A@A@A@A@A@A@A@A@x#A@h&&-*-=-/+3@--;->-,-'-)-!-~-{-              ",
+"                ]-^-/-(-_-:-<-[-}-|-1-z@A@A@2-6@A@h&3-h&$@4-n*#@@*5-6-7-8-9-0-a-b-c-5               ",
+"                  d-e-f-g-h-i-j-k-l-m-n-o-p-z@q-9$r-b=@*H.y&s-[=t-u-v-w-x-y-z-A-B-C-                ",
+"                      D-E-F-G-H-I-J-K-_.L-M-N-O-P-Q-R-S-T-U-V-W-X-Y->*Z-`-U* ;.;                    ",
+"                        +;/-@;#;$;%;&;*;V==;-;;;>;,;';i );!;~;=@{;*@];E&^;/;(;                      ",
+"                          _;:;<;[;};|;1;2;3;4;5;6;7;8;9;0;{;a;b;c;7*d;e;f;g;                        ",
+"                              h;i;j;k;!-l;m;n;o;p;q;T*r;s;t;u;v;w;x;y;z;                            ",
+"                                  A;B;C;D;f-E;F;G;7*H;I;J;@;K;L;M;N;                                ",
+"                                          O;P;Q;R;S;T;U;V;D#                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.bmp
new file mode 100644 (file)
index 0000000..67fc8ed
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ListPatient.xpm
new file mode 100644 (file)
index 0000000..eef89de
--- /dev/null
@@ -0,0 +1,791 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_ListPatient_xpm[] = {
+"50 50 738 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #666666",
+"[.    c #A6A6ED",
+"}.    c #A8A6EE",
+"|.    c #A9A8EF",
+"1.    c #999900",
+"2.    c #9D9CEA",
+"3.    c #9698E8",
+"4.    c #8A8CDE",
+"5.    c #8183D9",
+"6.    c #7A7CD5",
+"7.    c #7578D2",
+"8.    c #686CC5",
+"9.    c #6466BE",
+"0.    c #595DB3",
+"a.    c #424078",
+"b.    c #33335A",
+"c.    c #5A59A4",
+"d.    c #6568C0",
+"e.    c #6A6AC4",
+"f.    c #9B9CC7",
+"g.    c #989BD9",
+"h.    c #7C80D7",
+"i.    c #4C4E91",
+"j.    c #3D3F6E",
+"k.    c #32345A",
+"l.    c #898BD0",
+"m.    c #A3A3EC",
+"n.    c #999999",
+"o.    c #FFFFFF",
+"p.    c #B8B9F4",
+"q.    c #989AEA",
+"r.    c #868CDE",
+"s.    c #7E82D8",
+"t.    c #7A7DD6",
+"u.    c #7376CF",
+"v.    c #6E71CA",
+"w.    c #6A6CC4",
+"x.    c #6567C0",
+"y.    c #6163BD",
+"z.    c #4D5098",
+"A.    c #32335C",
+"B.    c #474B86",
+"C.    c #6768BF",
+"D.    c #6C6CC5",
+"E.    c #7576B5",
+"F.    c #9498D7",
+"G.    c #8588DC",
+"H.    c #7378CD",
+"I.    c #3F3F72",
+"J.    c #373961",
+"K.    c #8484C4",
+"L.    c #A4A4EC",
+"M.    c #AFB0F2",
+"N.    c #FFFF99",
+"O.    c #9193E3",
+"P.    c #8688DC",
+"Q.    c #8080D5",
+"R.    c #7879D2",
+"S.    c #7374CC",
+"T.    c #6C6EC8",
+"U.    c #6466BF",
+"V.    c #6262BB",
+"W.    c #5357A8",
+"X.    c #42437C",
+"Y.    c #525196",
+"Z.    c #5F60B6",
+"`.    c #6263BB",
+" +    c #7878BB",
+".+    c #BBBED0",
+"++    c #878BDF",
+"@+    c #666AC2",
+"#+    c #55549F",
+"$+    c #40406B",
+"%+    c #8A8CD0",
+"&+    c #B1B2F1",
+"*+    c #BAB9F4",
+"=+    c #666699",
+"-+    c #8184DC",
+";+    c #7A7CD2",
+">+    c #5A5AAF",
+",+    c #444884",
+"'+    c #50529D",
+")+    c #54539D",
+"!+    c #5656A4",
+"~+    c #AEAEB9",
+"{+    c #B3B3C6",
+"]+    c #888ADD",
+"^+    c #7F81D6",
+"/+    c #5C5EAD",
+"(+    c #AEADF0",
+"_+    c #C2C2F5",
+":+    c #FFFFCC",
+"<+    c #000000",
+"[+    c #595BAD",
+"}+    c #42457F",
+"|+    c #4E529B",
+"1+    c #4F508F",
+"2+    c #4F4F8E",
+"3+    c #B4B5C8",
+"4+    c #8586C8",
+"5+    c #7A7DD4",
+"6+    c #696AC2",
+"7+    c #3C3C6A",
+"8+    c #C9CAF8",
+"9+    c #FFCC99",
+"0+    c #CCCC66",
+"a+    c #5C5BAE",
+"b+    c #302F52",
+"c+    c #4E5090",
+"d+    c #4E4E88",
+"e+    c #70709F",
+"f+    c #7679D1",
+"g+    c #515396",
+"h+    c #46467E",
+"i+    c #515385",
+"j+    c #9796E3",
+"k+    c #5C60BB",
+"l+    c #41407C",
+"m+    c #454677",
+"n+    c #4A4A7C",
+"o+    c #484876",
+"p+    c #AFB1C0",
+"q+    c #6669C1",
+"r+    c #5B5DAE",
+"s+    c #343660",
+"t+    c #393C65",
+"u+    c #8A8DD8",
+"v+    c #9798E6",
+"w+    c #FFCCFF",
+"x+    c #5A5BAF",
+"y+    c #37375E",
+"z+    c #4D508E",
+"A+    c #4B4B7E",
+"B+    c #4A4882",
+"C+    c #9396C1",
+"D+    c #5B5DB2",
+"E+    c #484C8D",
+"F+    c #2D2F54",
+"G+    c #6A6AA8",
+"H+    c #9290E0",
+"I+    c #9899E7",
+"J+    c #5C60BA",
+"K+    c #464782",
+"L+    c #4A4A81",
+"M+    c #4D4E8A",
+"N+    c #3E3D67",
+"O+    c #9797C0",
+"P+    c #7A7AB6",
+"Q+    c #5A5AAA",
+"R+    c #4C4C8B",
+"S+    c #797BC3",
+"T+    c #9090E1",
+"U+    c #FFCCCC",
+"V+    c #5055A5",
+"W+    c #3C3D66",
+"X+    c #4B4C81",
+"Y+    c #3A3B64",
+"Z+    c #6D6D99",
+"`+    c #4C4F90",
+" @    c #505396",
+".@    c #34345A",
+"+@    c #3E406C",
+"@@    c #7D7ECC",
+"#@    c #8D8EE1",
+"$@    c #9496E6",
+"%@    c #A0A2ED",
+"&@    c #5B5FBA",
+"*@    c #5D5FB9",
+"=@    c #3B3A6B",
+"-@    c #3F4271",
+";@    c #40416C",
+">@    c #3B3867",
+",@    c #9091AF",
+"'@    c #505297",
+")@    c #4C4D8C",
+"!@    c #464680",
+"~@    c #48487A",
+"{@    c #7F82D2",
+"]@    c #8A8DE0",
+"^@    c #9796E4",
+"/@    c #9FA0EA",
+"(@    c #996666",
+"_@    c #333333",
+":@    c #CCCCCC",
+"<@    c #5E60B9",
+"[@    c #4B4B8E",
+"}@    c #373661",
+"|@    c #323358",
+"1@    c #1C1A2D",
+"2@    c #9898C4",
+"3@    c #62648A",
+"4@    c #414077",
+"5@    c #5858A9",
+"6@    c #3E4274",
+"7@    c #676BB3",
+"8@    c #8184D6",
+"9@    c #878ADC",
+"0@    c #9294E5",
+"a@    c #9C9DE8",
+"b@    c #336666",
+"c@    c #669966",
+"d@    c #5E5EB6",
+"e@    c #31335E",
+"f@    c #2A2E50",
+"g@    c #232440",
+"h@    c #7474A8",
+"i@    c #6D6FC7",
+"j@    c #5C5D99",
+"k@    c #232546",
+"l@    c #21213B",
+"m@    c #7576C6",
+"n@    c #8181D6",
+"o@    c #8588DB",
+"p@    c #8E90E0",
+"q@    c #9898E6",
+"r@    c #663366",
+"s@    c #5E5FBA",
+"t@    c #4B4A86",
+"u@    c #272849",
+"v@    c #4A4A8B",
+"w@    c #767AD1",
+"x@    c #7F82D8",
+"y@    c #5B5CAA",
+"z@    c #787ACD",
+"A@    c #7B7CD4",
+"B@    c #8084DA",
+"C@    c #8A8ADE",
+"D@    c #9296E6",
+"E@    c #000033",
+"F@    c #46457D",
+"G@    c #45487D",
+"H@    c #262544",
+"I@    c #3F3F79",
+"J@    c #7C7FD6",
+"K@    c #6969C0",
+"L@    c #4A4C8C",
+"M@    c #373864",
+"N@    c #7579D0",
+"O@    c #797AD3",
+"P@    c #7C7FD8",
+"Q@    c #8484D9",
+"R@    c #8C8EE0",
+"S@    c #5A5EB9",
+"T@    c #5E60BA",
+"U@    c #414276",
+"V@    c #46477F",
+"W@    c #2C2C4D",
+"X@    c #39386E",
+"Y@    c #6D70CB",
+"Z@    c #6062BA",
+"`@    c #4A4988",
+" #    c #2E3055",
+".#    c #7274CC",
+"+#    c #7375CD",
+"@#    c #7578D0",
+"##    c #7E7FD6",
+"$#    c #8587DC",
+"%#    c #999966",
+"&#    c #5F60B8",
+"*#    c #404175",
+"=#    c #44467A",
+"-#    c #232442",
+";#    c #323264",
+">#    c #6367C0",
+",#    c #656AC2",
+"'#    c #424475",
+")#    c #2D2E51",
+"!#    c #7274CB",
+"~#    c #6D71CA",
+"{#    c #7275CE",
+"]#    c #777AD4",
+"^#    c #FFCC00",
+"/#    c #6060B9",
+"(#    c #3B3C6E",
+"_#    c #121222",
+":#    c #2F2E5B",
+"<#    c #7073CC",
+"[#    c #7174CD",
+"}#    c #4D4C8E",
+"|#    c #2E2F54",
+"1#    c #6F73CA",
+"2#    c #6A6CC6",
+"3#    c #6F71C9",
+"4#    c #FF6600",
+"5#    c #CC6600",
+"6#    c #5D60B9",
+"7#    c #6062BC",
+"8#    c #3E4074",
+"9#    c #292A4A",
+"0#    c #12101E",
+"a#    c #6D70C9",
+"b#    c #7477D0",
+"c#    c #53549A",
+"d#    c #2D2C4F",
+"e#    c #676ABA",
+"f#    c #6A6CC5",
+"g#    c #333366",
+"h#    c #CCCCFF",
+"i#    c #6061B9",
+"j#    c #5E62BD",
+"k#    c #3D3D6D",
+"l#    c #222342",
+"m#    c #101121",
+"n#    c #38366D",
+"o#    c #6064BA",
+"p#    c #686CC4",
+"q#    c #5C5EA5",
+"r#    c #686AC2",
+"s#    c #336633",
+"t#    c #5F62BB",
+"u#    c #5A5AAB",
+"v#    c #383A65",
+"w#    c #262645",
+"x#    c #0F101E",
+"y#    c #424380",
+"z#    c #585BAA",
+"A#    c #4F5091",
+"B#    c #494980",
+"C#    c #484D8F",
+"D#    c #56589B",
+"E#    c #6467BF",
+"F#    c #663333",
+"G#    c #5F64BD",
+"H#    c #5E60B8",
+"I#    c #494C8E",
+"J#    c #353358",
+"K#    c #1E1D36",
+"L#    c #09080F",
+"M#    c #595AA4",
+"N#    c #8B8CA4",
+"O#    c #484B7F",
+"P#    c #494C80",
+"Q#    c #474882",
+"R#    c #484B84",
+"S#    c #6366C0",
+"T#    c #6464BD",
+"U#    c #5F62BA",
+"V#    c #5B5EB6",
+"W#    c #3B3C66",
+"X#    c #2D2E52",
+"Y#    c #131220",
+"Z#    c #9294BE",
+"`#    c #AFB0BA",
+" $    c #3E416D",
+".$    c #4A4B83",
+"+$    c #5D60B3",
+"@$    c #6263BC",
+"#$    c #669999",
+"$$    c #996699",
+"%$    c #4C4D95",
+"&$    c #333258",
+"*$    c #282849",
+"=$    c #0B0C18",
+"-$    c #28284A",
+";$    c #B2B4C8",
+">$    c #42426E",
+",$    c #424270",
+"'$    c #444782",
+")$    c #3A3B6E",
+"!$    c #454580",
+"~$    c #5F61BB",
+"{$    c #333767",
+"]$    c #262746",
+"^$    c #1D1C32",
+"/$    c #08060C",
+"($    c #464683",
+"_$    c #808190",
+":$    c #212039",
+"<$    c #42437B",
+"[$    c #4E5191",
+"}$    c #353864",
+"|$    c #4D5096",
+"1$    c #666633",
+"2$    c #4A4A8E",
+"3$    c #19172B",
+"4$    c #19172A",
+"5$    c #0C0B15",
+"6$    c #131221",
+"7$    c #9394BA",
+"8$    c #ACAFBC",
+"9$    c #4B4C86",
+"0$    c #5459A9",
+"a$    c #4E5294",
+"b$    c #404271",
+"c$    c #343663",
+"d$    c #5A5EB2",
+"e$    c #242443",
+"f$    c #414470",
+"g$    c #1C1C33",
+"h$    c #07040A",
+"i$    c #343462",
+"j$    c #6A6B90",
+"k$    c #3E3F69",
+"l$    c #38375F",
+"m$    c #343256",
+"n$    c #2B2A4C",
+"o$    c #3D407A",
+"p$    c #5E62BC",
+"q$    c #5D61BC",
+"r$    c #6164B9",
+"s$    c #302F5A",
+"t$    c #252645",
+"u$    c #242442",
+"v$    c #0A0912",
+"w$    c #120F1E",
+"x$    c #7676B2",
+"y$    c #282948",
+"z$    c #222240",
+"A$    c #42487E",
+"B$    c #313258",
+"C$    c #272749",
+"D$    c #CC3300",
+"E$    c #6869BE",
+"F$    c #454684",
+"G$    c #393A63",
+"H$    c #0B0B15",
+"I$    c #3B3D70",
+"J$    c #87889D",
+"K$    c #323256",
+"L$    c #4D4D88",
+"M$    c #323458",
+"N$    c #434476",
+"O$    c #660000",
+"P$    c #990000",
+"Q$    c #6267BA",
+"R$    c #444580",
+"S$    c #484A7C",
+"T$    c #141526",
+"U$    c #22253F",
+"V$    c #9295BC",
+"W$    c #626484",
+"X$    c #333459",
+"Y$    c #484A88",
+"Z$    c #5A5FB9",
+"`$    c #6264BE",
+" %    c #6064BD",
+".%    c #5A5CAE",
+"+%    c #30315D",
+"@%    c #3D406D",
+"#%    c #4C4E86",
+"$%    c #242542",
+"%%    c #07050C",
+"&%    c #101223",
+"*%    c #6B6EA0",
+"=%    c #34345D",
+"-%    c #191A30",
+";%    c #36365E",
+">%    c #6064BF",
+",%    c #6466C0",
+"'%    c #6666BF",
+")%    c #4E5196",
+"!%    c #2B2C52",
+"~%    c #3A3C6B",
+"{%    c #444876",
+"]%    c #2E2E50",
+"^%    c #0C0912",
+"/%    c #0D0B16",
+"(%    c #494986",
+"_%    c #ADAFBA",
+":%    c #292B4C",
+"<%    c #18172B",
+"[%    c #333456",
+"}%    c #38385F",
+"|%    c #232240",
+"1%    c #34335C",
+"2%    c #2F3258",
+"3%    c #3E3E74",
+"4%    c #585CB1",
+"5%    c #5C5EB8",
+"6%    c #5D5FB8",
+"7%    c #6061BA",
+"8%    c #6265BD",
+"9%    c #6064BE",
+"0%    c #5E60B6",
+"a%    c #444684",
+"b%    c #2C2E52",
+"c%    c #2C2A4A",
+"d%    c #424474",
+"e%    c #232543",
+"f%    c #0C0C16",
+"g%    c #0E0D19",
+"h%    c #43447A",
+"i%    c #ACAFB9",
+"j%    c #2E2E52",
+"k%    c #12101F",
+"l%    c #1C1B33",
+"m%    c #0E0E1A",
+"n%    c #5857A5",
+"o%    c #50529F",
+"p%    c #444783",
+"q%    c #373863",
+"r%    c #42427B",
+"s%    c #474A8E",
+"t%    c #52529E",
+"u%    c #595BB0",
+"v%    c #6262BC",
+"w%    c #6062BB",
+"x%    c #6063BD",
+"y%    c #575EB2",
+"z%    c #454887",
+"A%    c #3C3F76",
+"B%    c #2F3056",
+"C%    c #383965",
+"D%    c #35365C",
+"E%    c #262644",
+"F%    c #12101C",
+"G%    c #0A060C",
+"H%    c #0F101C",
+"I%    c #424479",
+"J%    c #B0B3C6",
+"K%    c #515369",
+"L%    c #0D0E1C",
+"M%    c #0E0E1C",
+"N%    c #3C3D6E",
+"O%    c #4A4F8E",
+"P%    c #5759B0",
+"Q%    c #5558AB",
+"R%    c #4E5094",
+"S%    c #363764",
+"T%    c #3C3B6E",
+"U%    c #3B3E77",
+"V%    c #3F407C",
+"W%    c #3B3D73",
+"X%    c #3A3A6E",
+"Y%    c #383A6F",
+"Z%    c #3B3B70",
+"`%    c #3C3B70",
+" &    c #3A3B6D",
+".&    c #34355E",
+"+&    c #454680",
+"@&    c #4E5095",
+"#&    c #474C8A",
+"$&    c #18172D",
+"%&    c #090A13",
+"&&    c #161728",
+"*&    c #64668E",
+"=&    c #60607F",
+"-&    c #18182C",
+";&    c #292A49",
+">&    c #3C3C68",
+",&    c #464882",
+"'&    c #545BAF",
+")&    c #50529A",
+"!&    c #3B3E6B",
+"~&    c #2F3158",
+"{&    c #363760",
+"]&    c #383860",
+"^&    c #303358",
+"/&    c #414272",
+"(&    c #46487E",
+"_&    c #4C4A7E",
+":&    c #4D5091",
+"<&    c #383962",
+"[&    c #0A060E",
+"}&    c #0B0A12",
+"|&    c #262745",
+"1&    c #7070A4",
+"2&    c #ACAEB6",
+"3&    c #55566D",
+"4&    c #131528",
+"5&    c #141221",
+"6&    c #1B1B32",
+"7&    c #2F2F4F",
+"8&    c #303054",
+"9&    c #292847",
+"0&    c #323257",
+"a&    c #393960",
+"b&    c #393A62",
+"c&    c #3D3E69",
+"d&    c #4C4E8E",
+"e&    c #4A4B8A",
+"f&    c #52539A",
+"g&    c #3C4070",
+"h&    c #343459",
+"i&    c #20213B",
+"j&    c #110F1C",
+"k&    c #08070E",
+"l&    c #1E2038",
+"m&    c #616386",
+"n&    c #ADB1C2",
+"o&    c #AAAEB6",
+"p&    c #32335B",
+"q&    c #19182C",
+"r&    c #0F0E1B",
+"s&    c #0A0A15",
+"t&    c #0F0F1B",
+"u&    c #121223",
+"v&    c #1A1B34",
+"w&    c #131223",
+"x&    c #141527",
+"y&    c #181A30",
+"z&    c #161324",
+"A&    c #0F0D19",
+"B&    c #080810",
+"C&    c #0B080F",
+"D&    c #0D0C18",
+"E&    c #20223B",
+"F&    c #444379",
+"G&    c #AEB0BC",
+"H&    c #ADAEB8",
+"I&    c #848394",
+"J&    c #2E3054",
+"K&    c #1E1E36",
+"L&    c #0B0D19",
+"M&    c #0A080E",
+"N&    c #08050A",
+"O&    c #09070D",
+"P&    c #090911",
+"Q&    c #10101D",
+"R&    c #252946",
+"S&    c #373A69",
+"T&    c #8A8CA2",
+"U&    c #B0B0C0",
+"V&    c #8E8EA8",
+"W&    c #8A8BA0",
+"X&    c #868A9E",
+"Y&    c #848698",
+"Z&    c #838698",
+"`&    c #83879A",
+" *    c #89889D",
+".*    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.<.[.}.|.1.1.1.2.3.#.4.5.6.7.u 8.9.0.a.b.c.d.e.f.                  ",
+"                  g.h.i.j.k.l.m.n.o.<.n.p.1.o.o.1.1.q.@.r.s.t.u.v.w.x.y.z.A.B.C.D.E.                ",
+"                F.G.H.I.J.K.L.M.<.o.o.o.<.<.N.N.o.o.1.1.O.P.Q.R.S.T.8.U.V.W.X.Y.Z.`. +              ",
+"              .+++@+#+$+%+L.&+*+<.o.o.o.o.o.<.=+N.N.o.o.1.1.-+;+1.1.1.1.1.V.>+,+'+)+!+~+            ",
+"            {+]+^+/+1.1.1.(+*+_+n.o.:+o.o.o.o.o.<.<.N.N.o.o.1.1.o.o.o.o.o.<+<+[+}+|+1+2+3+          ",
+"            4+5+6+7+1.o.o.1.1.8+<.o.o.:+o.:+o.o.o.o.<.=+N.N.o.o.N.N.9+N.N.9+0+<+a+b+c+d+e+          ",
+"          {.f+g+h+i+j+1.o.:+o.1.1.o.o.o.:+o.o.:+o.o.o.o.<.<.N.N.N.9+N.N.9+9+0+<+k+l+m+n+o+p+        ",
+"          q+r+s+t+u+v+1.o.N.N.o.o.1.1.o.o.w+:+o.o.:+o.o.o.o.<.=+N.N.N.9+N.N.9+0+<+x+y+z+A+B+        ",
+"        C+D+E+F+G+H+I+1.o.N.N.N.N.o.:+1.1.o.o.:+o.o.:+o.o.o.o.o.<.<.N.N.9+9+9+0+<+J+K+L+M+N+O+      ",
+"        P+Q+R+: S+T+I+m.1.o.N.N.N.N.N.o.o.1.1.o.o.U+o.o.:+o.:+o.o.o.<.=+N.9+N.0+<+J+V+W+X+Y+Z+      ",
+"        `+ @.@+@@@#@$@%@1.o.N.N.N.N.N.N.N.o.:+1.1.o.o.:+o.o.o.:+o.o.o.o.<.N.9+0+<+&@*@=@-@;@>@      ",
+"      ,@'@)@!@~@{@]@^@/@1.o.<.<.(@_@N.N.N.9+N.o.o.1.1.o.o.:+:@o.:@o.:@o.<.9+0+<+J+&@<@[@}@|@1@2@    ",
+"      3@4@5@6@7@8@9@0@a@1.<.:+:@n.b@<+9+N.N.N.N.9+o.:+1.1.o.o.:@o.:@o.o.c@9+0+<+J+J+&@d@e@f@g@h@    ",
+"      i@j@k@l@m@n@o@p@q@<.o.o.o.:@n.r@<+N.9+N.N.N.N.9+o.w+1.1.o.:@o.:@o.=+9+0+<+J+k+&@s@t@)@u@v@    ",
+"      w@x@y@Y+z@A@B@C@D@<.:@o.o.:@n.<.<+N.N.9+N.9+N.N.N.9+o.:+<+o.:@o.o.<.9+0+E@&@&@k+k+F@G@H@I@    ",
+"      J@K@L@M@N@O@P@Q@R@n.n.:@o.:@n._@<+N.N.N.9+N.9+N.9+N.N.0+<+:@o.:@o.<.0+<+J+J+S@J+T@U@V@W@X@    ",
+"      Y@Z@`@ #.#+#@###$#<.<.n.n.n.<._@<+N.9+N.N.9+N.9+N.N.9+0+<+o.:@:@o.%#0+<+J+J+J+k+&#*#=#-#;#    ",
+"      >#,#'#)#!#~#{#]#<.^#<.<.<._@<.<.9+N.9+N.9+N.9+9+N.9+N.N.0+<+U+o.<.9+0+<+J+J+J+&@/#(#|@_#:#    ",
+"      <#[#}#|#1#2#3#n.:@^#4#<.<.=+<.5#_@_@N.9+N.9+N.N.N.9+N.9+0+<+:@o.=+0+<+J+J+J+J+6#7#8#9#0#;#    ",
+"      a#b#c#d#e#f#-.n.9+o.o.4#4#4#5#5#5#^#g#N.9+N.9+9+9+N.9+N.0+<+h#o.c@0+<+J+J+J+J+i#j#k#l#m#n#    ",
+"      o#p#m+Y+q#r#-.n.9+:+:+o.o.^#^#^#^#4#s#N.9+9+N.9+N.9+N.9+0+<+U+o.<.0+<+J+J+J+t#V.u#v#w#x#y#    ",
+"      z#A#B#C#D#x.E#n.9+9+9+:+:+o.:+^#4#5#F#9+9+9+N.9+9+N.9+9+0+<+:@o.(@<+<.G#J+J+H#y.I#J#K#L#M#    ",
+"      N#O#P#Q#R#S#T#n.9+^#9+9+9+:+:+4#4#5#b@N.N.9+9+9+N.9+N.N.0+<+h#o.<.<+<.n.U#t#V.V#W#X#x#Y#Z#    ",
+"      `#X+ $.$~ +$@$n.9+^#^#9+9+9+9+4#4#5#_@9+9+N.9+9+9+9+9+9+9+0+<+o.#$<+<.$$n.n.y.%$&$*$=$-$;$    ",
+"        >$,$'$)$!$~$n.9+^#^#^#9+9+9+4#5#5#g#9+N.9+9+N.9+9+9+9+N.0+<+o.(@<+<.c@<.#$n.{$]$^$/$($      ",
+"        _$:$<$[$}$|$n.9+^#^#^#^#^#9+4#5#5#1$0+0+9+N.9+9+N.9+9+9+0+<+o.<._@<.<.(@n.2$3$4$5$6$7$      ",
+"        8$9$0$a$b$c$n.9+^#^#^#^#^#^#4#5#5#_@<+<+0+0+N.9+9+9+9+9+0+<+o.<+_@<.<.n.d$e$f$g$h$i$R       ",
+"          j$k$l$m$n$o$n.9+^#^#^#^#^#4#5#5#g#p$q$<+<+0+0+9+9+9+9+0+<+_@<+<.<.n.r$s$t$u$v$w$x$        ",
+"            y$z$A$B$C$n.9+^#^#^#^#^#4#D$_@j#&@<@<@k+<+<+0+0+N.9+0+<+<+<+<.n.E$F$G$u$H$/$I$          ",
+"            J$K$L$M$N$n.9+^#O$^#^#^#P$D$1$&@J+S@J+&@q$y.<+<+0+0+9+0+<+_@<.Q$R$G$S$T$/$U$V$          ",
+"              W$X$t$Y$n.9+^#P$^#^#O$P$5#g#J+J+J+J+&@Z$k+`$ %<+<+0+0+<+_@.%+%@%#%$%%%&%*%            ",
+"                =%-%;%n.9+^#P$^#^#4#4#5#_@J+J+J+J+J+&@J+t#>%,%'%<+<+<+)%!%~%{%]%^%/%(%              ",
+"                _%:%<%[%}%|%1%2%3%4%5%6%J+J+6#q$J+t#7%t#i#8%9%T#@$0%a%b%c%d%e%f%g%h%5               ",
+"                  i%j%k%l%m%n%o%p%q%r%s%t%u%6%v%~$w%x%@$y.7#y%z%A%B%C%D%E%F%G%H%I%J%                ",
+"                      K%L%M%N%O%P%Q%R%_.S%T%U%V%W%X%Y%Z%`% &.&+&@&#&-$$&%&h$&&*&                    ",
+"                        =&<%-&;&>&,&'&)&@%!&~&{&]&^&/&i (&_&:&c+<&b+[&L#}&|&1&                      ",
+"                          2&3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&<&h&i&j&/$k&l&m&n&                        ",
+"                              o&p&q&r&^%s&t&u&v&w&x&g$y&z&A&B&C&D&E&F&G&                            ",
+"                                  H&I&J&K&k%L&M&N&/$O&P&Q&-&R&S&T&U&                                ",
+"                                          V&W&X&Y&Z&`& *.*,@                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.bmp
new file mode 100644 (file)
index 0000000..be426dc
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_MPR.xpm
new file mode 100644 (file)
index 0000000..66ddd0c
--- /dev/null
@@ -0,0 +1,824 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_MPR_xpm[] = {
+"50 50 771 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #BAB9F4",
+"}+    c #C4C2F6",
+"|+    c #C9C8F6",
+"1+    c #CBCDF9",
+"2+    c #CCCEF8",
+"3+    c #CECDF8",
+"4+    c #C9C8F7",
+"5+    c #C6C6F6",
+"6+    c #BEBDF6",
+"7+    c #B5B6F2",
+"8+    c #ABAAF0",
+"9+    c #8A8EDF",
+"0+    c #8184DC",
+"a+    c #7A7CD2",
+"b+    c #7476D0",
+"c+    c #6D71CA",
+"d+    c #6A6CC5",
+"e+    c #6464BE",
+"f+    c #5A5AAF",
+"g+    c #444884",
+"h+    c #50529D",
+"i+    c #54539D",
+"j+    c #5656A4",
+"k+    c #AEAEB9",
+"l+    c #B3B3C6",
+"m+    c #888ADD",
+"n+    c #7F81D6",
+"o+    c #5C5EAD",
+"p+    c #4B4B7E",
+"q+    c #8A8ACA",
+"r+    c #A3A2EB",
+"s+    c #AEADF0",
+"t+    c #C2C2F5",
+"u+    c #CDCCF8",
+"v+    c #D0D1F9",
+"w+    c #D6D6FA",
+"x+    c #DADCFC",
+"y+    c #D8D7FC",
+"z+    c #D3D2FA",
+"A+    c #CECEF9",
+"B+    c #CAC8F7",
+"C+    c #BCBCF4",
+"D+    c #B5B5F3",
+"E+    c #9E9DEA",
+"F+    c #9194E2",
+"G+    c #898ADD",
+"H+    c #8282D6",
+"I+    c #787AD2",
+"J+    c #7073CC",
+"K+    c #6A6CC6",
+"L+    c #686AC3",
+"M+    c #6264BE",
+"N+    c #6161BA",
+"O+    c #595BAD",
+"P+    c #42457F",
+"Q+    c #4E529B",
+"R+    c #4F508F",
+"S+    c #4F4F8E",
+"T+    c #B4B5C8",
+"U+    c #8586C8",
+"V+    c #7A7DD4",
+"W+    c #696AC2",
+"X+    c #3C3C6A",
+"Y+    c #7879B8",
+"Z+    c #A09FE9",
+"`+    c #A8A8F0",
+" @    c #B6B6F3",
+".@    c #C9CAF8",
+"+@    c #D0D2F9",
+"@@    c #D9D9FC",
+"#@    c #DCDEFC",
+"$@    c #E0E0FA",
+"%@    c #DCE0FB",
+"&@    c #DCDCFC",
+"*@    c #D3D3FA",
+"=@    c #CCCCF7",
+"-@    c #C8C7F7",
+";@    c #B8BAF4",
+">@    c #B0B0F0",
+",@    c #A0A2EB",
+"'@    c #888CE1",
+")@    c #7F82DA",
+"!@    c #797BD2",
+"~@    c #7275CE",
+"{@    c #6B6FC8",
+"]@    c #686AC2",
+"^@    c #6868C0",
+"/@    c #6464BD",
+"(@    c #6061B9",
+"_@    c #5F5FB8",
+":@    c #5C5BAE",
+"<@    c #302F52",
+"[@    c #4E5090",
+"}@    c #4E4E88",
+"|@    c #70709F",
+"1@    c #7679D1",
+"2@    c #515396",
+"3@    c #46467E",
+"4@    c #515385",
+"5@    c #9796E3",
+"6@    c #A1A2EC",
+"7@    c #ACACF1",
+"8@    c #C7C7F7",
+"9@    c #D1D0F8",
+"0@    c #D9DAFB",
+"a@    c #E0E0FB",
+"b@    c #000000",
+"c@    c #8D8EE0",
+"d@    c #4A4A7C",
+"e@    c #484876",
+"f@    c #AFB1C0",
+"g@    c #6669C1",
+"h@    c #5B5DAE",
+"i@    c #343660",
+"j@    c #393C65",
+"k@    c #8A8DD8",
+"l@    c #666666",
+"m@    c #996666",
+"n@    c #333333",
+"o@    c #C8C9F7",
+"p@    c #D2D1F9",
+"q@    c #DBDDFB",
+"r@    c #E5E4FA",
+"s@    c #FFFFFF",
+"t@    c #9092E2",
+"u@    c #4D508E",
+"v@    c #4A4882",
+"w@    c #9396C1",
+"x@    c #5B5DB2",
+"y@    c #484C8D",
+"z@    c #2D2F54",
+"A@    c #6A6AA8",
+"B@    c #FFFFCC",
+"C@    c #CCCCCC",
+"D@    c #999999",
+"E@    c #336666",
+"F@    c #D4D3F8",
+"G@    c #DDE0FC",
+"H@    c #E6E6FB",
+"I@    c #4A4A81",
+"J@    c #4D4E8A",
+"K@    c #3E3D67",
+"L@    c #9797C0",
+"M@    c #7A7AB6",
+"N@    c #5A5AAA",
+"O@    c #4C4C8B",
+"P@    c #663366",
+"Q@    c #DDDEFC",
+"R@    c #E4E5FB",
+"S@    c #3C3D66",
+"T@    c #4B4C81",
+"U@    c #3A3B64",
+"V@    c #6D6D99",
+"W@    c #4C4F90",
+"X@    c #505396",
+"Y@    c #34345A",
+"Z@    c #3E406C",
+"`@    c #DEDEFB",
+" #    c #E6E4FB",
+".#    c #8E8FE1",
+"+#    c #3B3A6B",
+"@#    c #3F4271",
+"##    c #40416C",
+"$#    c #3B3867",
+"%#    c #9091AF",
+"&#    c #505297",
+"*#    c #4C4D8C",
+"=#    c #464680",
+"-#    c #48487A",
+";#    c #E4E3FB",
+">#    c #8C90E2",
+",#    c #4B4B8E",
+"'#    c #373661",
+")#    c #323358",
+"!#    c #1C1A2D",
+"~#    c #9898C4",
+"{#    c #62648A",
+"]#    c #414077",
+"^#    c #5858A9",
+"/#    c #3E4274",
+"(#    c #676BB3",
+"_#    c #D3D2F7",
+":#    c #D7D9FC",
+"<#    c #898DDE",
+"[#    c #5E5EB6",
+"}#    c #31335E",
+"|#    c #2A2E50",
+"1#    c #232440",
+"2#    c #7474A8",
+"3#    c #6D6FC7",
+"4#    c #5C5D99",
+"5#    c #232546",
+"6#    c #21213B",
+"7#    c #FFCC00",
+"8#    c #CACAF7",
+"9#    c #D2CFF8",
+"0#    c #5E5FBA",
+"a#    c #4B4A86",
+"b#    c #272849",
+"c#    c #4A4A8B",
+"d#    c #767AD1",
+"e#    c #7F82D8",
+"f#    c #5B5CAA",
+"g#    c #FF6600",
+"h#    c #666699",
+"i#    c #CC6600",
+"j#    c #C6C6F5",
+"k#    c #8185DA",
+"l#    c #5C60BB",
+"m#    c #46457D",
+"n#    c #45487D",
+"o#    c #262544",
+"p#    c #3F3F79",
+"q#    c #7C7FD6",
+"r#    c #6969C0",
+"s#    c #4A4C8C",
+"t#    c #FFCC99",
+"u#    c #333366",
+"v#    c #5E60BA",
+"w#    c #414276",
+"x#    c #46477F",
+"y#    c #2C2C4D",
+"z#    c #39386E",
+"A#    c #6D70CB",
+"B#    c #6062BA",
+"C#    c #4A4988",
+"D#    c #336633",
+"E#    c #777AD2",
+"F#    c #5F60B8",
+"G#    c #404175",
+"H#    c #44467A",
+"I#    c #232442",
+"J#    c #323264",
+"K#    c #6367C0",
+"L#    c #656AC2",
+"M#    c #424475",
+"N#    c #663333",
+"O#    c #A2A4EC",
+"P#    c #A7A7EE",
+"Q#    c #A6A8EF",
+"R#    c #A0A2EC",
+"S#    c #9A98E9",
+"T#    c #9193E4",
+"U#    c #8D92E1",
+"V#    c #8587DC",
+"W#    c #7C7CD6",
+"X#    c #7478D0",
+"Y#    c #6E72CA",
+"Z#    c #686CC6",
+"`#    c #6666BF",
+" $    c #6062BC",
+".$    c #6264BC",
+"+$    c #5C60BA",
+"@$    c #5B5FBA",
+"#$    c #6060B9",
+"$$    c #3B3C6E",
+"%$    c #121222",
+"&$    c #2F2E5B",
+"*$    c #7174CD",
+"=$    c #4D4C8E",
+"-$    c #7274CC",
+";$    c #3E4074",
+">$    c #292A4A",
+",$    c #12101E",
+"'$    c #6D70C9",
+")$    c #7477D0",
+"!$    c #53549A",
+"~$    c #6E6EC8",
+"{$    c #5E62BD",
+"]$    c #3D3D6D",
+"^$    c #222342",
+"/$    c #101121",
+"($    c #38366D",
+"_$    c #6064BA",
+":$    c #686CC4",
+"<$    c #454677",
+"[$    c #6E72CB",
+"}$    c #5A5AAB",
+"|$    c #383A65",
+"1$    c #262645",
+"2$    c #0F101E",
+"3$    c #424380",
+"4$    c #585BAA",
+"5$    c #4F5091",
+"6$    c #494980",
+"7$    c #666633",
+"8$    c #494C8E",
+"9$    c #353358",
+"0$    c #1E1D36",
+"a$    c #09080F",
+"b$    c #595AA4",
+"c$    c #8B8CA4",
+"d$    c #484B7F",
+"e$    c #494C80",
+"f$    c #6467C1",
+"g$    c #3B3C66",
+"h$    c #2D2E52",
+"i$    c #131220",
+"j$    c #9294BE",
+"k$    c #AFB0BA",
+"l$    c #3E416D",
+"m$    c #4A4B83",
+"n$    c #6364BC",
+"o$    c #333258",
+"p$    c #282849",
+"q$    c #0B0C18",
+"r$    c #28284A",
+"s$    c #B2B4C8",
+"t$    c #42426E",
+"u$    c #424270",
+"v$    c #444782",
+"w$    c #CC3300",
+"x$    c #262746",
+"y$    c #1D1C32",
+"z$    c #08060C",
+"A$    c #464683",
+"B$    c #808190",
+"C$    c #212039",
+"D$    c #42437B",
+"E$    c #660000",
+"F$    c #990000",
+"G$    c #19172A",
+"H$    c #0C0B15",
+"I$    c #131221",
+"J$    c #9394BA",
+"K$    c #ACAFBC",
+"L$    c #4B4C86",
+"M$    c #5459A9",
+"N$    c #1C1C33",
+"O$    c #07040A",
+"P$    c #343462",
+"Q$    c #6A6B90",
+"R$    c #3E3F69",
+"S$    c #5D61BC",
+"T$    c #0A0912",
+"U$    c #120F1E",
+"V$    c #7676B2",
+"W$    c #282948",
+"X$    c #222240",
+"Y$    c #42487E",
+"Z$    c #313258",
+"`$    c #272749",
+" %    c #454887",
+".%    c #5F62BB",
+"+%    c #5B60BA",
+"@%    c #3B3D70",
+"#%    c #87889D",
+"$%    c #323256",
+"%%    c #4D4D88",
+"&%    c #323458",
+"*%    c #434476",
+"=%    c #393A68",
+"-%    c #4E4E95",
+";%    c #5C5FB8",
+">%    c #5A5FB9",
+",%    c #5A5EB8",
+"'%    c #22253F",
+")%    c #9295BC",
+"!%    c #626484",
+"~%    c #333459",
+"{%    c #252645",
+"]%    c #484A88",
+"^%    c #4D4E94",
+"/%    c #3E4073",
+"(%    c #3D3E75",
+"_%    c #5A5EB7",
+":%    c #5A5EB9",
+"<%    c #6064BD",
+"[%    c #6565BE",
+"}%    c #5A5CAE",
+"|%    c #30315D",
+"1%    c #3D406D",
+"2%    c #4C4E86",
+"3%    c #242542",
+"4%    c #07050C",
+"5%    c #101223",
+"6%    c #6B6EA0",
+"7%    c #34345D",
+"8%    c #191A30",
+"9%    c #36365E",
+"0%    c #4A4A88",
+"a%    c #313056",
+"b%    c #30305D",
+"c%    c #5255A3",
+"d%    c #6064BF",
+"e%    c #6466C0",
+"f%    c #6668C1",
+"g%    c #6366BE",
+"h%    c #4E5196",
+"i%    c #2B2C52",
+"j%    c #3A3C6B",
+"k%    c #444876",
+"l%    c #2E2E50",
+"m%    c #0C0912",
+"n%    c #0D0B16",
+"o%    c #494986",
+"p%    c #ADAFBA",
+"q%    c #292B4C",
+"r%    c #18172B",
+"s%    c #333456",
+"t%    c #38385F",
+"u%    c #232240",
+"v%    c #34335C",
+"w%    c #2F3258",
+"x%    c #3E3E74",
+"y%    c #585CB1",
+"z%    c #5C5EB8",
+"A%    c #5D5FB8",
+"B%    c #5D60B9",
+"C%    c #6061BA",
+"D%    c #6265BD",
+"E%    c #6064BE",
+"F%    c #6263BC",
+"G%    c #5E60B6",
+"H%    c #444684",
+"I%    c #2C2E52",
+"J%    c #2C2A4A",
+"K%    c #424474",
+"L%    c #232543",
+"M%    c #0C0C16",
+"N%    c #0E0D19",
+"O%    c #43447A",
+"P%    c #ACAFB9",
+"Q%    c #2E2E52",
+"R%    c #12101F",
+"S%    c #1C1B33",
+"T%    c #0E0E1A",
+"U%    c #5857A5",
+"V%    c #50529F",
+"W%    c #444783",
+"X%    c #373863",
+"Y%    c #42427B",
+"Z%    c #474A8E",
+"`%    c #52529E",
+" &    c #595BB0",
+".&    c #6262BC",
+"+&    c #5F61BB",
+"@&    c #6062BB",
+"#&    c #6063BD",
+"$&    c #575EB2",
+"%&    c #3C3F76",
+"&&    c #2F3056",
+"*&    c #383965",
+"=&    c #35365C",
+"-&    c #262644",
+";&    c #12101C",
+">&    c #0A060C",
+",&    c #0F101C",
+"'&    c #424479",
+")&    c #B0B3C6",
+"!&    c #515369",
+"~&    c #0D0E1C",
+"{&    c #0E0E1C",
+"]&    c #3C3D6E",
+"^&    c #4A4F8E",
+"/&    c #5759B0",
+"(&    c #5558AB",
+"_&    c #4E5094",
+":&    c #363764",
+"<&    c #3C3B6E",
+"[&    c #3B3E77",
+"}&    c #3F407C",
+"|&    c #3B3D73",
+"1&    c #3A3A6E",
+"2&    c #383A6F",
+"3&    c #3B3B70",
+"4&    c #3C3B70",
+"5&    c #3A3B6D",
+"6&    c #34355E",
+"7&    c #454680",
+"8&    c #4E5095",
+"9&    c #474C8A",
+"0&    c #18172D",
+"a&    c #090A13",
+"b&    c #161728",
+"c&    c #64668E",
+"d&    c #60607F",
+"e&    c #18182C",
+"f&    c #292A49",
+"g&    c #3C3C68",
+"h&    c #464882",
+"i&    c #545BAF",
+"j&    c #50529A",
+"k&    c #3B3E6B",
+"l&    c #2F3158",
+"m&    c #363760",
+"n&    c #383860",
+"o&    c #303358",
+"p&    c #414272",
+"q&    c #46487E",
+"r&    c #4C4A7E",
+"s&    c #4D5091",
+"t&    c #383962",
+"u&    c #0A060E",
+"v&    c #0B0A12",
+"w&    c #262745",
+"x&    c #7070A4",
+"y&    c #ACAEB6",
+"z&    c #55566D",
+"A&    c #131528",
+"B&    c #141221",
+"C&    c #1B1B32",
+"D&    c #2F2F4F",
+"E&    c #303054",
+"F&    c #292847",
+"G&    c #323257",
+"H&    c #393960",
+"I&    c #393A62",
+"J&    c #3D3E69",
+"K&    c #4C4E8E",
+"L&    c #4A4B8A",
+"M&    c #52539A",
+"N&    c #3C4070",
+"O&    c #343459",
+"P&    c #20213B",
+"Q&    c #110F1C",
+"R&    c #08070E",
+"S&    c #1E2038",
+"T&    c #616386",
+"U&    c #ADB1C2",
+"V&    c #AAAEB6",
+"W&    c #32335B",
+"X&    c #19182C",
+"Y&    c #0F0E1B",
+"Z&    c #0A0A15",
+"`&    c #0F0F1B",
+" *    c #121223",
+".*    c #1A1B34",
+"+*    c #131223",
+"@*    c #141527",
+"#*    c #181A30",
+"$*    c #161324",
+"%*    c #0F0D19",
+"&*    c #080810",
+"**    c #0B080F",
+"=*    c #0D0C18",
+"-*    c #20223B",
+";*    c #444379",
+">*    c #AEB0BC",
+",*    c #ADAEB8",
+"'*    c #848394",
+")*    c #2E3054",
+"!*    c #1E1E36",
+"~*    c #0B0D19",
+"{*    c #0A080E",
+"]*    c #08050A",
+"^*    c #09070D",
+"/*    c #090911",
+"(*    c #10101D",
+"_*    c #252946",
+":*    c #373A69",
+"<*    c #8A8CA2",
+"[*    c #B0B0C0",
+"}*    c #8E8EA8",
+"|*    c #8A8BA0",
+"1*    c #868A9E",
+"2*    c #848698",
+"3*    c #838698",
+"4*    c #83879A",
+"5*    c #89889D",
+"6*    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+3+3+4+5+6+7+8+y.z.9+0+a+b+c+d+/+e+>+f+g+h+i+j+k+            ",
+"            l+m+n+o+p+q+r+s+[+t+u+v+w+x+y+y+z+A+B+C+D+1.E+F+G+H+I+J+K+L+M+H.N+O+P+Q+R+S+T+          ",
+"            U+V+W+X+Y+Z+`+ @X..@+@@@#@$@$@%@&@*@=@-@;@>@,@5.'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@          ",
+"          {.1@2@3@4@5@6@7@[+8@9@0@a@b@b@b@b@b@b@b@b@b@b@b@b@c@b@b@b@b@b@b@b@b@b@b@b@b@d@e@f@        ",
+"          g@h@i@j@k@l@l@m@n@o@p@q@r@b@b@b@b@b@b@b@s@b@b@b@b@t@b@b@b@b@b@s@b@b@b@b@b@b@u@p+v@        ",
+"        w@x@y@z@A@l@B@C@D@E@b@F@G@H@b@b@b@s@b@b@b@s@b@b@b@b@t@b@b@b@b@b@s@b@b@b@b@b@b@I@J@K@L@      ",
+"        M@N@O@: l@s@s@s@C@D@P@b@Q@R@b@b@b@s@b@b@b@s@b@b@b@b@@.b@b@b@b@b@s@b@b@b@b@b@b@S@T@U@V@      ",
+"        W@X@Y@Z@l@C@s@s@C@D@l@b@`@ #b@b@b@s@s@b@b@s@b@b@b@b@.#b@b@b@b@b@s@b@b@b@b@b@b@+#@###$#      ",
+"      %#&#*#=#-#D@D@C@s@C@D@n@b@@@;#b@b@b@b@s@s@s@s@b@b@b@b@>#b@b@b@b@b@s@s@b@b@b@b@b@,#'#)#!#~#    ",
+"      {#]#^#/#(#l@l@D@D@D@l@n@b@_#:#b@b@b@b@s@s@b@b@b@b@b@b@<#b@b@b@b@b@b@s@b@b@b@b@b@[#}#|#1#2#    ",
+"      3#4#5#6#l@7#l@l@l@n@l@l@`.8#9#b@b@b@b@s@s@b@b@b@b@b@b@%+b@b@b@b@b@b@s@b@b@b@b@b@0#a#*#b#c#    ",
+"      d#e#f#D@C@7#g#l@l@h#l@i#n@n@j#b@b@b@b@s@b@b@b@b@b@b@b@k#b@b@b@b@b@b@s@b@b@b@b@b@l#m#n#o#p#    ",
+"      q#r#s#D@t#s@s@g#g#g#i#i#i#7#u#b@b@b@b@s@b@b@b@b@b@b@b@q#b@b@b@b@b@b@s@b@b@b@b@b@v#w#x#y#z#    ",
+"      A#B#C#D@t#B@B@s@s@7#7#7#7#g#D#b@b@b@b@b@b@b@b@b@b@b@b@E#b@b@b@b@b@b@b@b@b@b@b@b@F#G#H#I#J#    ",
+"      K#L#M#D@t#t#t#B@B@s@B@7#g#i#N#O#P#Q#}.R#6@S#T#U#9+V#W#X#Y#Z#]@`# $.$+$@$+$+$+$@$#$$$)#%$&$    ",
+"      J+*$=$D@t#7#t#t#t#B@B@g#g#i#E@b@b@b@b@b@b@b@b@b@b@b@b@-$b@b@b@b@b@b@b@b@b@b@b@b@ $;$>$,$J#    ",
+"      '$)$!$D@t#7#7#t#t#t#t#g#g#i#n@b@b@b@b@b@b@b@b@b@b@b@b@~$b@b@b@b@b@b@b@b@b@b@b@b@{$]$^$/$($    ",
+"      _$:$<$D@t#7#7#7#t#t#t#g#i#i#u#b@b@b@b@b@b@b@b@b@b@b@b@[$b@b@b@b@b@b@b@b@b@b@b@b@}$|$1$2$3$    ",
+"      4$5$6$D@t#7#7#7#7#7#t#g#i#i#7$b@b@b@b@b@b@b@b@b@b@b@b@g.b@b@b@b@b@b@b@b@b@b@b@b@8$9$0$a$b$    ",
+"      c$d$e$D@t#7#7#7#7#7#7#g#i#i#n@b@b@b@b@b@b@b@b@b@b@b@b@f$b@b@b@b@b@b@b@b@b@b@b@b@g$h$2$i$j$    ",
+"      k$T@l$m$D@t#7#7#7#7#7#g#i#i#u#b@b@s@s@b@b@b@s@s@s@b@b@n$b@b@b@b@b@b@b@b@b@b@b@b@o$p$q$r$s$    ",
+"        t$u$v$D@t#7#7#7#7#7#g#w$n@:$b@b@b@s@s@s@s@s@b@b@b@b@H.b@b@b@b@b@b@b@b@b@b@b@b@x$y$z$A$      ",
+"        B$C$D$D@t#7#E$7#7#7#F$w$7$/@b@b@b@b@b@b@b@b@b@b@b@b@/@b@b@b@b@b@b@b@b@b@b@b@b@G$H$I$J$      ",
+"        K$L$M$D@t#7#F$7#7#E$F$i#u#{$b@b@b@b@b@b@b@b@b@b@b@b@ $b@b@b@b@b@b@b@b@b@b@b@b@N$O$P$R       ",
+"          Q$R$D@t#7#F$7#7#g#g#i#n@S$b@b@b@b@b@b@b@b@b@b@b@b@+$b@b@b@b@b@b@b@b@b@b@b@b@T$U$V$        ",
+"            W$X$Y$Z$`$ %l#@$+$@$#$.%b@b@b@b@b@b@b@b@b@b@b@b@+%b@b@b@b@b@b@b@b@b@b@b@b@z$@%          ",
+"            #%$%%%&%*%=%-%;%+$>%+$S$b@b@b@b@b@b@b@b@b@b@b@b@,%b@b@b@b@b@b@b@b@b@b@b@b@'%)%          ",
+"              !%~%{%]%^%/%(%_%+$:%,%l#>%+$+$+$+$+$@$>%l#M+<%v#v#v#>+M+[%}%|%1%2%3%4%5%6%            ",
+"                7%8%9%O 0%a%b%c%S$+$+$+$+$+$+$+$+$+$@$+$.%d%e%`#/+f%g%h%i%j%k%l%m%n%o%              ",
+"                p%q%r%s%t%u%v%w%x%y%z%A%+$+$B%S$+$.%C%.%(@D%E%/@F%G%H%I%J%K%L%M%N%O%5               ",
+"                  P%Q%R%S%T%U%V%W%X%Y%Z%`% &A%.&+&@&#&F%H. $$& %%&&&*&=&-&;&>&,&'&)&                ",
+"                      !&~&{&]&^&/&(&_&_.:&<&[&}&|&1&2&3&4&5&6&7&8&9&r$0&a&O$b&c&                    ",
+"                        d&r%e&f&g&h&i&j&1%k&l&m&n&o&p&i q&r&s&[@t&<@u&a$v&w&x&                      ",
+"                          y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&t&O&P&Q&z$R&S&T&U&                        ",
+"                              V&W&X&Y&m%Z&`& *.*+*@*N$#*$*%*&***=*-*;*>*                            ",
+"                                  ,*'*)*!*R%~*{*]*z$^*/*(*e&_*:*<*[*                                ",
+"                                          }*|*1*2*3*4*5*6*%#                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.bmp
new file mode 100644 (file)
index 0000000..242c619
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDICOMDIR.xpm
new file mode 100644 (file)
index 0000000..7462b19
--- /dev/null
@@ -0,0 +1,1068 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_OpenDICOMDIR_xpm[] = {
+"50 50 1015 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #191919",
+"}+    c #000100",
+"|+    c #070803",
+"1+    c #000002",
+"2+    c #0C0A15",
+"3+    c #00000B",
+"4+    c #050311",
+"5+    c #000005",
+"6+    c #7A7CD2",
+"7+    c #7476D0",
+"8+    c #6D71CA",
+"9+    c #6A6CC5",
+"0+    c #6464BE",
+"a+    c #5A5AAF",
+"b+    c #444884",
+"c+    c #50529D",
+"d+    c #54539D",
+"e+    c #5656A4",
+"f+    c #AEAEB9",
+"g+    c #B3B3C6",
+"h+    c #888ADD",
+"i+    c #7F81D6",
+"j+    c #5C5EAD",
+"k+    c #4B4B7E",
+"l+    c #8A8ACA",
+"m+    c #A3A2EB",
+"n+    c #AEADF0",
+"o+    c #BAB9F4",
+"p+    c #FEFFFA",
+"q+    c #F4F3FF",
+"r+    c #F9F6FF",
+"s+    c #FEFBFF",
+"t+    c #FCFCFF",
+"u+    c #F2F2FC",
+"v+    c #010100",
+"w+    c #8183CA",
+"x+    c #7679CC",
+"y+    c #6A6CC6",
+"z+    c #686AC3",
+"A+    c #6264BE",
+"B+    c #6161BA",
+"C+    c #595BAD",
+"D+    c #42457F",
+"E+    c #4E529B",
+"F+    c #4F508F",
+"G+    c #4F4F8E",
+"H+    c #B4B5C8",
+"I+    c #8586C8",
+"J+    c #7A7DD4",
+"K+    c #696AC2",
+"L+    c #3C3C6A",
+"M+    c #7879B8",
+"N+    c #A09FE9",
+"O+    c #A8A8F0",
+"P+    c #B6B6F3",
+"Q+    c #0F1209",
+"R+    c #F9FAFF",
+"S+    c #FEFCFF",
+"T+    c #FEF7FF",
+"U+    c #FCF6FF",
+"V+    c #FCF7FF",
+"W+    c #F2F2FF",
+"X+    c #FCFFFF",
+"Y+    c #000200",
+"Z+    c #FFFFFB",
+"`+    c #151520",
+" @    c #7275CE",
+".@    c #6B6FC8",
+"+@    c #686AC2",
+"@@    c #6868C0",
+"#@    c #6464BD",
+"$@    c #6061B9",
+"%@    c #5F5FB8",
+"&@    c #5C5BAE",
+"*@    c #302F52",
+"=@    c #4E5090",
+"-@    c #4E4E88",
+";@    c #70709F",
+">@    c #7679D1",
+",@    c #515396",
+"'@    c #46467E",
+")@    c #515385",
+"!@    c #9796E3",
+"~@    c #A1A2EC",
+"{@    c #ACACF1",
+"]@    c #C7C7F7",
+"^@    c #000030",
+"/@    c #241979",
+"(@    c #1E137C",
+"_@    c #191069",
+":@    c #05053B",
+"<@    c #FBFFFF",
+"[@    c #020A00",
+"}@    c #F2F3F5",
+"|@    c #FEFEFF",
+"1@    c #05030E",
+"2@    c #686CC4",
+"3@    c #6668C1",
+"4@    c #6364BC",
+"5@    c #5E62BC",
+"6@    c #5D61BC",
+"7@    c #5C60BB",
+"8@    c #41407C",
+"9@    c #454677",
+"0@    c #4A4A7C",
+"a@    c #484876",
+"b@    c #AFB1C0",
+"c@    c #6669C1",
+"d@    c #5B5DAE",
+"e@    c #343660",
+"f@    c #393C65",
+"g@    c #8A8DD8",
+"h@    c #9798E6",
+"i@    c #A1A4EE",
+"j@    c #B0B0F1",
+"k@    c #BEBEF6",
+"l@    c #C8C9F7",
+"m@    c #F8F7FF",
+"n@    c #FBF4FF",
+"o@    c #F2E3FF",
+"p@    c #F9EBFF",
+"q@    c #F0E6FF",
+"r@    c #F8F6FF",
+"s@    c #EDF5FF",
+"t@    c #000400",
+"u@    c #FCFEFF",
+"v@    c #F5F4FF",
+"w@    c #FEFDFF",
+"x@    c #010109",
+"y@    c #6468C2",
+"z@    c #5D5FB8",
+"A@    c #5C60BA",
+"B@    c #5A5BAF",
+"C@    c #37375E",
+"D@    c #4D508E",
+"E@    c #4A4882",
+"F@    c #9396C1",
+"G@    c #5B5DB2",
+"H@    c #484C8D",
+"I@    c #2D2F54",
+"J@    c #6A6AA8",
+"K@    c #9290E0",
+"L@    c #A4A4ED",
+"M@    c #B2B4F3",
+"N@    c #BEC0F5",
+"O@    c #C9CAF7",
+"P@    c #000102",
+"Q@    c #FBF9FF",
+"R@    c #0B0461",
+"S@    c #2516A5",
+"T@    c #1607A2",
+"U@    c #0C0086",
+"V@    c #181570",
+"W@    c #F7FEFF",
+"X@    c #000209",
+"Y@    c #000017",
+"Z@    c #01001F",
+"`@    c #040517",
+" #    c #000007",
+".#    c #6060B8",
+"+#    c #464782",
+"@#    c #4A4A81",
+"##    c #4D4E8A",
+"$#    c #3E3D67",
+"%#    c #9797C0",
+"&#    c #7A7AB6",
+"*#    c #5A5AAA",
+"=#    c #4C4C8B",
+"-#    c #797BC3",
+";#    c #9090E1",
+">#    c #B3B2F4",
+",#    c #BEBEF4",
+"'#    c #CCCAF8",
+")#    c #EFEFFF",
+"!#    c #F1EBFF",
+"~#    c #F3E6FF",
+"{#    c #F7E9FF",
+"]#    c #E6DAFF",
+"^#    c #F5F2FF",
+"/#    c #F5FAFF",
+"(#    c #F7FDFF",
+"_#    c #F4F4FF",
+":#    c #BABDC4",
+"<#    c #090E07",
+"[#    c #6769C1",
+"}#    c #5D62BB",
+"|#    c #5E60BA",
+"1#    c #5A5EB9",
+"2#    c #5055A5",
+"3#    c #3C3D66",
+"4#    c #4B4C81",
+"5#    c #3A3B64",
+"6#    c #6D6D99",
+"7#    c #4C4F90",
+"8#    c #505396",
+"9#    c #34345A",
+"0#    c #3E406C",
+"a#    c #7D7ECC",
+"b#    c #8D8EE1",
+"c#    c #9496E6",
+"d#    c #A0A2ED",
+"e#    c #ADAFF2",
+"f#    c #BCBDF4",
+"g#    c #000015",
+"h#    c #F9F9FF",
+"i#    c #0E0A61",
+"j#    c #140B8A",
+"k#    c #0F0697",
+"l#    c #1F16A3",
+"m#    c #1B1790",
+"n#    c #00004C",
+"o#    c #1A1D62",
+"p#    c #1C1B5F",
+"q#    c #9C9CE9",
+"r#    c #8E8FE1",
+"s#    c #8589DD",
+"t#    c #FAFBFF",
+"u#    c #C9CDD8",
+"v#    c #000300",
+"w#    c #6063BC",
+"x#    c #5B5FBA",
+"y#    c #5D5FB9",
+"z#    c #3B3A6B",
+"A#    c #3F4271",
+"B#    c #40416C",
+"C#    c #3B3867",
+"D#    c #9091AF",
+"E#    c #505297",
+"F#    c #4C4D8C",
+"G#    c #464680",
+"H#    c #48487A",
+"I#    c #7F82D2",
+"J#    c #8A8DE0",
+"K#    c #9796E4",
+"L#    c #AEAEF2",
+"M#    c #BABBF6",
+"N#    c #C6C6F6",
+"O#    c #00001B",
+"P#    c #EDEFFF",
+"Q#    c #F7F6FF",
+"R#    c #F5F1FF",
+"S#    c #EEE9FF",
+"T#    c #F4EEFF",
+"U#    c #ECE9FF",
+"V#    c #F8F3FF",
+"W#    c #F9FBFF",
+"X#    c #B5B9C5",
+"Y#    c #6162BA",
+"Z#    c #5E60B9",
+"`#    c #4B4B8E",
+" $    c #373661",
+".$    c #323358",
+"+$    c #1C1A2D",
+"@$    c #9898C4",
+"#$    c #62648A",
+"$$    c #414077",
+"%$    c #5858A9",
+"&$    c #3E4274",
+"*$    c #676BB3",
+"=$    c #8184D6",
+"-$    c #878ADC",
+";$    c #9294E5",
+">$    c #9C9DE8",
+",$    c #AAABF0",
+"'$    c #B6B5F3",
+")$    c #C2C0F5",
+"!$    c #00001C",
+"~$    c #F8FAFF",
+"{$    c #07074F",
+"]$    c #050366",
+"^$    c #120F84",
+"/$    c #100B8C",
+"($    c #00007E",
+"_$    c #2725A4",
+":$    c #08077C",
+"<$    c #050069",
+"[$    c #F8FBFF",
+"}$    c #B7BDCD",
+"|$    c #050C05",
+"1$    c #6266BF",
+"2$    c #5F61BB",
+"3$    c #5E5EB6",
+"4$    c #31335E",
+"5$    c #2A2E50",
+"6$    c #232440",
+"7$    c #7474A8",
+"8$    c #6D6FC7",
+"9$    c #5C5D99",
+"0$    c #232546",
+"a$    c #21213B",
+"b$    c #7576C6",
+"c$    c #8181D6",
+"d$    c #8588DB",
+"e$    c #8E90E0",
+"f$    c #9898E6",
+"g$    c #AEAFF1",
+"h$    c #F0F4FF",
+"i$    c #F5F8FF",
+"j$    c #F4F5FF",
+"k$    c #F1EFFF",
+"l$    c #F1F0FF",
+"m$    c #E7E5FF",
+"n$    c #F2F0FF",
+"o$    c #F7F0FF",
+"p$    c #ACB3C6",
+"q$    c #6666BF",
+"r$    c #6062BA",
+"s$    c #5E5FBA",
+"t$    c #4B4A86",
+"u$    c #272849",
+"v$    c #4A4A8B",
+"w$    c #767AD1",
+"x$    c #7F82D8",
+"y$    c #5B5CAA",
+"z$    c #787ACD",
+"A$    c #7B7CD4",
+"B$    c #8084DA",
+"C$    c #8A8ADE",
+"D$    c #9296E6",
+"E$    c #999DE9",
+"F$    c #A4A6EE",
+"G$    c #F7FAFF",
+"H$    c #F8F9FF",
+"I$    c #C2C8DE",
+"J$    c #000500",
+"K$    c #6565BE",
+"L$    c #6062BC",
+"M$    c #5D60B9",
+"N$    c #46457D",
+"O$    c #45487D",
+"P$    c #262544",
+"Q$    c #3F3F79",
+"R$    c #7C7FD6",
+"S$    c #6969C0",
+"T$    c #4A4C8C",
+"U$    c #373864",
+"V$    c #7579D0",
+"W$    c #797AD3",
+"X$    c #7C7FD8",
+"Y$    c #8484D9",
+"Z$    c #8C8EE0",
+"`$    c #9294E3",
+" %    c #9C9DEA",
+".%    c #F6F9FF",
+"+%    c #414276",
+"@%    c #46477F",
+"#%    c #2C2C4D",
+"$%    c #39386E",
+"%%    c #6D70CB",
+"&%    c #4A4988",
+"*%    c #2E3055",
+"=%    c #7274CC",
+"-%    c #7375CD",
+";%    c #7578D0",
+">%    c #7E7FD6",
+",%    c #8587DC",
+"'%    c #8E8FE2",
+")%    c #9696E6",
+"!%    c #9B9CE9",
+"~%    c #120F48",
+"{%    c #6061BA",
+"]%    c #5F60B8",
+"^%    c #404175",
+"/%    c #44467A",
+"(%    c #232442",
+"_%    c #323264",
+":%    c #6367C0",
+"<%    c #656AC2",
+"[%    c #424475",
+"}%    c #2D2E51",
+"|%    c #7274CB",
+"1%    c #777AD4",
+"2%    c #8083D7",
+"3%    c #8688DB",
+"4%    c #8B8EE0",
+"5%    c #9093E2",
+"6%    c #F4F1FF",
+"7%    c #6264BC",
+"8%    c #6060B9",
+"9%    c #3B3C6E",
+"0%    c #121222",
+"a%    c #2F2E5B",
+"b%    c #7073CC",
+"c%    c #7174CD",
+"d%    c #4D4C8E",
+"e%    c #2E2F54",
+"f%    c #6F73CA",
+"g%    c #6F71C9",
+"h%    c #7D7ED6",
+"i%    c #8284D9",
+"j%    c #8B8EE1",
+"k%    c #3E4074",
+"l%    c #292A4A",
+"m%    c #12101E",
+"n%    c #6D70C9",
+"o%    c #7477D0",
+"p%    c #53549A",
+"q%    c #2D2C4F",
+"r%    c #676ABA",
+"s%    c #7778D1",
+"t%    c #7A7BD4",
+"u%    c #8180D7",
+"v%    c #6363BC",
+"w%    c #5E62BD",
+"x%    c #3D3D6D",
+"y%    c #222342",
+"z%    c #101121",
+"A%    c #38366D",
+"B%    c #6064BA",
+"C%    c #5C5EA5",
+"D%    c #7276CE",
+"E%    c #7679D3",
+"F%    c #5F63BE",
+"G%    c #5F62BB",
+"H%    c #5A5AAB",
+"I%    c #383A65",
+"J%    c #262645",
+"K%    c #0F101E",
+"L%    c #424380",
+"M%    c #585BAA",
+"N%    c #4F5091",
+"O%    c #494980",
+"P%    c #484D8F",
+"Q%    c #56589B",
+"R%    c #6467BF",
+"S%    c #6868C2",
+"T%    c #5F64BD",
+"U%    c #5E60B8",
+"V%    c #494C8E",
+"W%    c #353358",
+"X%    c #1E1D36",
+"Y%    c #09080F",
+"Z%    c #595AA4",
+"`%    c #8B8CA4",
+" &    c #484B7F",
+".&    c #494C80",
+"+&    c #474882",
+"@&    c #484B84",
+"#&    c #6366C0",
+"$&    c #676BC3",
+"%&    c #696DC5",
+"&&    c #6B6DC6",
+"*&    c #191667",
+"=&    c #6465BE",
+"-&    c #5F62BA",
+";&    c #5B5EB6",
+">&    c #3B3C66",
+",&    c #2D2E52",
+"'&    c #131220",
+")&    c #9294BE",
+"!&    c #AFB0BA",
+"~&    c #3E416D",
+"{&    c #4A4B83",
+"]&    c #5D60B3",
+"^&    c #6263BC",
+"/&    c #6767C0",
+"(&    c #EDE8FF",
+"_&    c #5F63BC",
+":&    c #4C4D95",
+"<&    c #333258",
+"[&    c #282849",
+"}&    c #0B0C18",
+"|&    c #28284A",
+"1&    c #B2B4C8",
+"2&    c #42426E",
+"3&    c #424270",
+"4&    c #444782",
+"5&    c #3A3B6E",
+"6&    c #454580",
+"7&    c #6365BF",
+"8&    c #0A0C57",
+"9&    c #101072",
+"0&    c #00006F",
+"a&    c #171592",
+"b&    c #100F8F",
+"c&    c #181799",
+"d&    c #01007F",
+"e&    c #040078",
+"f&    c #201B7F",
+"g&    c #6463BA",
+"h&    c #333767",
+"i&    c #262746",
+"j&    c #1D1C32",
+"k&    c #08060C",
+"l&    c #464683",
+"m&    c #808190",
+"n&    c #212039",
+"o&    c #42437B",
+"p&    c #4E5191",
+"q&    c #353864",
+"r&    c #4D5096",
+"s&    c #F5F7FF",
+"t&    c #F2F1FF",
+"u&    c #EBEAFF",
+"v&    c #F7F1FF",
+"w&    c #E9E3FF",
+"x&    c #A5A9C2",
+"y&    c #070C0F",
+"z&    c #6064BE",
+"A&    c #4A4A8E",
+"B&    c #19172B",
+"C&    c #19172A",
+"D&    c #0C0B15",
+"E&    c #131221",
+"F&    c #9394BA",
+"G&    c #ACAFBC",
+"H&    c #4B4C86",
+"I&    c #5459A9",
+"J&    c #4E5294",
+"K&    c #404271",
+"L&    c #343663",
+"M&    c #5C5EB4",
+"N&    c #F7F7FF",
+"O&    c #242369",
+"P&    c #09065F",
+"Q&    c #1C1680",
+"R&    c #0D087E",
+"S&    c #1B1593",
+"T&    c #070185",
+"U&    c #181185",
+"V&    c #160F5D",
+"W&    c #2A2357",
+"X&    c #FDF9FF",
+"Y&    c #C6C4DC",
+"Z&    c #03030F",
+"`&    c #6668C0",
+" *    c #5A5EB2",
+".*    c #242443",
+"+*    c #414470",
+"@*    c #1C1C33",
+"#*    c #07040A",
+"$*    c #343462",
+"%*    c #6A6B90",
+"&*    c #3E3F69",
+"**    c #38375F",
+"=*    c #343256",
+"-*    c #2B2A4C",
+";*    c #3D407A",
+">*    c #5C5EB7",
+",*    c #01011D",
+"'*    c #FBFAFF",
+")*    c #DDDDFF",
+"!*    c #F8F5FF",
+"~*    c #EFECFF",
+"{*    c #F7F2FF",
+"]*    c #F1ECFF",
+"^*    c #E9E4FF",
+"/*    c #FFFBFF",
+"(*    c #C3BFD6",
+"_*    c #00000E",
+":*    c #6365BE",
+"<*    c #6164B9",
+"[*    c #302F5A",
+"}*    c #252645",
+"|*    c #242442",
+"1*    c #0A0912",
+"2*    c #120F1E",
+"3*    c #7676B2",
+"4*    c #282948",
+"5*    c #222240",
+"6*    c #42487E",
+"7*    c #313258",
+"8*    c #272749",
+"9*    c #454887",
+"0*    c #000009",
+"a*    c #B4B7C6",
+"b*    c #C0C5D9",
+"c*    c #C6CBE8",
+"d*    c #B1B5D8",
+"e*    c #B3B8E2",
+"f*    c #BABEED",
+"g*    c #AFB2E5",
+"h*    c #C1C3F3",
+"i*    c #AEADCF",
+"j*    c #CDC9E4",
+"k*    c #CAC6DD",
+"l*    c #B9B6C9",
+"m*    c #6063BD",
+"n*    c #6869BE",
+"o*    c #454684",
+"p*    c #393A63",
+"q*    c #0B0B15",
+"r*    c #3B3D70",
+"s*    c #87889D",
+"t*    c #323256",
+"u*    c #4D4D88",
+"v*    c #323458",
+"w*    c #434476",
+"x*    c #393A68",
+"y*    c #4E4E95",
+"z*    c #5C5FB8",
+"A*    c #0C110D",
+"B*    c #030905",
+"C*    c #030907",
+"D*    c #000204",
+"E*    c #000305",
+"F*    c #060F14",
+"G*    c #000309",
+"H*    c #00020C",
+"I*    c #000210",
+"J*    c #060419",
+"K*    c #010014",
+"L*    c #000010",
+"M*    c #0B0917",
+"N*    c #121119",
+"O*    c #6267BA",
+"P*    c #444580",
+"Q*    c #484A7C",
+"R*    c #141526",
+"S*    c #22253F",
+"T*    c #9295BC",
+"U*    c #626484",
+"V*    c #333459",
+"W*    c #484A88",
+"X*    c #4D4E94",
+"Y*    c #3E4073",
+"Z*    c #3D3E75",
+"`*    c #5A5EB7",
+" =    c #5A5EB8",
+".=    c #5A5FB9",
+"+=    c #6064BD",
+"@=    c #5A5CAE",
+"#=    c #30315D",
+"$=    c #3D406D",
+"%=    c #4C4E86",
+"&=    c #242542",
+"*=    c #07050C",
+"==    c #101223",
+"-=    c #6B6EA0",
+";=    c #34345D",
+">=    c #191A30",
+",=    c #36365E",
+"'=    c #4A4A88",
+")=    c #313056",
+"!=    c #30305D",
+"~=    c #5255A3",
+"{=    c #6064BF",
+"]=    c #6466C0",
+"^=    c #6366BE",
+"/=    c #4E5196",
+"(=    c #2B2C52",
+"_=    c #3A3C6B",
+":=    c #444876",
+"<=    c #2E2E50",
+"[=    c #0C0912",
+"}=    c #0D0B16",
+"|=    c #494986",
+"1=    c #ADAFBA",
+"2=    c #292B4C",
+"3=    c #18172B",
+"4=    c #333456",
+"5=    c #38385F",
+"6=    c #232240",
+"7=    c #34335C",
+"8=    c #2F3258",
+"9=    c #3E3E74",
+"0=    c #585CB1",
+"a=    c #5C5EB8",
+"b=    c #6265BD",
+"c=    c #5E60B6",
+"d=    c #444684",
+"e=    c #2C2E52",
+"f=    c #2C2A4A",
+"g=    c #424474",
+"h=    c #232543",
+"i=    c #0C0C16",
+"j=    c #0E0D19",
+"k=    c #43447A",
+"l=    c #ACAFB9",
+"m=    c #2E2E52",
+"n=    c #12101F",
+"o=    c #1C1B33",
+"p=    c #0E0E1A",
+"q=    c #5857A5",
+"r=    c #50529F",
+"s=    c #444783",
+"t=    c #373863",
+"u=    c #42427B",
+"v=    c #474A8E",
+"w=    c #52529E",
+"x=    c #595BB0",
+"y=    c #6262BC",
+"z=    c #6062BB",
+"A=    c #575EB2",
+"B=    c #3C3F76",
+"C=    c #2F3056",
+"D=    c #383965",
+"E=    c #35365C",
+"F=    c #262644",
+"G=    c #12101C",
+"H=    c #0A060C",
+"I=    c #0F101C",
+"J=    c #424479",
+"K=    c #B0B3C6",
+"L=    c #515369",
+"M=    c #0D0E1C",
+"N=    c #0E0E1C",
+"O=    c #3C3D6E",
+"P=    c #4A4F8E",
+"Q=    c #5759B0",
+"R=    c #5558AB",
+"S=    c #4E5094",
+"T=    c #363764",
+"U=    c #3C3B6E",
+"V=    c #3B3E77",
+"W=    c #3F407C",
+"X=    c #3B3D73",
+"Y=    c #3A3A6E",
+"Z=    c #383A6F",
+"`=    c #3B3B70",
+" -    c #3C3B70",
+".-    c #3A3B6D",
+"+-    c #34355E",
+"@-    c #454680",
+"#-    c #4E5095",
+"$-    c #474C8A",
+"%-    c #18172D",
+"&-    c #090A13",
+"*-    c #161728",
+"=-    c #64668E",
+"--    c #60607F",
+";-    c #18182C",
+">-    c #292A49",
+",-    c #3C3C68",
+"'-    c #464882",
+")-    c #545BAF",
+"!-    c #50529A",
+"~-    c #3B3E6B",
+"{-    c #2F3158",
+"]-    c #363760",
+"^-    c #383860",
+"/-    c #303358",
+"(-    c #414272",
+"_-    c #46487E",
+":-    c #4C4A7E",
+"<-    c #4D5091",
+"[-    c #383962",
+"}-    c #0A060E",
+"|-    c #0B0A12",
+"1-    c #262745",
+"2-    c #7070A4",
+"3-    c #ACAEB6",
+"4-    c #55566D",
+"5-    c #131528",
+"6-    c #141221",
+"7-    c #1B1B32",
+"8-    c #2F2F4F",
+"9-    c #303054",
+"0-    c #292847",
+"a-    c #323257",
+"b-    c #393960",
+"c-    c #393A62",
+"d-    c #3D3E69",
+"e-    c #4C4E8E",
+"f-    c #4A4B8A",
+"g-    c #52539A",
+"h-    c #3C4070",
+"i-    c #343459",
+"j-    c #20213B",
+"k-    c #110F1C",
+"l-    c #08070E",
+"m-    c #1E2038",
+"n-    c #616386",
+"o-    c #ADB1C2",
+"p-    c #AAAEB6",
+"q-    c #32335B",
+"r-    c #19182C",
+"s-    c #0F0E1B",
+"t-    c #0A0A15",
+"u-    c #0F0F1B",
+"v-    c #121223",
+"w-    c #1A1B34",
+"x-    c #131223",
+"y-    c #141527",
+"z-    c #181A30",
+"A-    c #161324",
+"B-    c #0F0D19",
+"C-    c #080810",
+"D-    c #0B080F",
+"E-    c #0D0C18",
+"F-    c #20223B",
+"G-    c #444379",
+"H-    c #AEB0BC",
+"I-    c #ADAEB8",
+"J-    c #848394",
+"K-    c #2E3054",
+"L-    c #1E1E36",
+"M-    c #0B0D19",
+"N-    c #0A080E",
+"O-    c #08050A",
+"P-    c #09070D",
+"Q-    c #090911",
+"R-    c #10101D",
+"S-    c #252946",
+"T-    c #373A69",
+"U-    c #8A8CA2",
+"V-    c #B0B0C0",
+"W-    c #8E8EA8",
+"X-    c #8A8BA0",
+"Y-    c #868A9E",
+"Z-    c #848698",
+"`-    c #838698",
+" ;    c #83879A",
+".;    c #89889D",
+"+;    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+3+1+|+1+2+3+1+2+3+4+5+6+7+8+9+/+0+>+a+b+c+d+e+f+            ",
+"            g+h+i+j+k+l+m+n+o+}+p+q+r+s+t+r+q+r+s+t+r+s+t+u+}+v+w+x+y+z+A+H.B+C+D+E+F+G+H+          ",
+"            I+J+K+L+M+N+O+P+X.Q+R+S+T+U+V+W+S+T+V+W+S+T+U+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@          ",
+"          {.>@,@'@)@!@~@{@o+]@Y+S+^@/@(@_@:@^@/@_@:@^@/@(@<@[@}@|@1@=.2@3@4@5@6@7@8@9@0@a@b@        ",
+"          c@d@e@f@g@h@i@j@k@l@Y+m@n@o@p@q@r@n@o@q@r@n@o@p@s@t@u@v@w@x@-.y@A+>+z@A@B@C@D@k+E@        ",
+"        F@G@H@I@J@K@#+L@M@N@O@P@Q@R@S@T@U@V@R@S@U@V@R@S@T@W@X@Y@Z@`@ #}+3@#@>+.#7@A@+#@###$#%#      ",
+"        &#*#=#: -#;##+o.>#,#'#3+)#!#~#{#]#^#!#~#]#^#!#~#{#/#(#R+r+_#:#<#[##@}#|#1#A@2#3#4#5#6#      ",
+"        7#8#9#0#a#b#c#d#e#f#O@g#h#i#j#k#l#m#n#o#l#m#n#o#p#q#r#s#^.t#u#v#+@0+w#7@A@x#y#z#A#B#C#      ",
+"      D#E#F#G#H#I#J#K#y.L#M#N#O#P#Q#R#S#T#U#W+_#T#U#W+_#V#T+U+V+W+W#X#v#f.4@Y#.#A@x#Z#`# $.$+$@$    ",
+"      #$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$($_$:$<$^@/@(@^@/@(@_@:@[$}$|$1$H.6@2$A@A@x#3$4$5$6$7$    ",
+"      8$9$0$a$b$c$d$e$f$U.g$o+!$h$i$j$W+k$l$m$n$o$n@o@p@n@o@p@q@r@~$p$t@q$4@r$A@A@7@x#s$t$F#u$v$    ",
+"      w$x$y$5#z$A$B$C$D$E$F$n+Y@G$R@S@T@U@V@R@S@T@R@S@T@R@S@T@U@V@H$I$J$K$L$|#M$x#x#7@7@N$O$P$Q$    ",
+"      R$S$T$U$V$W$X$Y$Z$`$ %F$Y@.%!#~#{#]#^#!#~#{#!#~#{#!#~#{#]#^#t#u#v#H.>+A@A@A@1#A@|#+%@%#%$%    ",
+"      %%r$&%*%=%-%;%>%,%'%)%!%g#h#i#j#k#l#m#n#o#p#n#o#p#m#n#o#p#~%W#X#v#A+{%{%A@A@A@7@]%^%/%(%_%    ",
+"      :%<%[%}%|%8+ @1%2%3%4%5%O#P#Q#R#S#T#U#W+_#V#W+_#V#U#W+_#V#6%[$}$|$7%A@x#A@A@A@x#8%9%.$0%a%    ",
+"      b%c%d%e%f%y+g% @;%h%i%j%!$~$R@S@T@U@V@R@S@T@R@S@T@R@S@T@U@V@~$p$t@{%|#A@A@A@A@M$L$k%l%m%_%    ",
+"      n%o%p%q%r%9+-.E.D.s%t%u%!$h$!#~#{#]#^#!#~#{#!#~#{#!#~#{#]#^#H$I$J$v%A@A@A@A@A@$@w%x%y%z%A%    ",
+"      B%2@9@5#C%+@-.g.8+b%D%E%g#h#i#j#k#l#m#n#o#p#n#o#p#m#n#o#p#~%t#u#v#F%v%A@A@A@G%>+H%I%J%K%L%    ",
+"      M%N%O%P%Q%G.R%2@S%.@g%=+O#P#Q#R#S#T#U#W+_#V#W+_#V#U#W+_#V#6%W#X#v#7@L$T%A@A@U%H.V%W%X%Y%Z%    ",
+"      `% &.&+&@&#&#@K$$&+@%&&&!$~${$]$^$/$($_$:$<$_$:$<$($_$:$<$*&[$}$|$1#1#=&-&G%>+;&>&,&K%'&)&    ",
+"      !&4#~&{&~ ]&^&H.#@/&% S%!$h$i$j$W+k$l$m$n$o$m$n$o$l$m$n$o$(&~$p$t@6@x#5@_&G%H.:&<&[&}&|&1&    ",
+"        2&3&4&5&6&2$H.^&4@7&/&Y@G$8&9&0&a&b&c&d&e&c&d&e&b&c&d&e&f&H$I$J$1#A@z@f.#@g&h&i&j&k&l&      ",
+"        m&n&o&p&q&r&6@6@L$4@#@Y@.%s&_#6%t&m$u&n$v&u&n$v&m$u&n$v&w&h#x&y&x#6@Y#f.z&A&B&C&D&E&F&      ",
+"        G&H&I&J&K&L&M&w%6@6@L$!$N&O&P&Q&R&S&T&U&V&T&U&V&S&T&U&V&W&X&Y&Z&|#|#L$`& *.*+*@*#*$*R       ",
+"          %*&***=*-*;*>*x#6@A@,*'*)*m@!*~*{*6%]*V+^*6%]*V+6%]*V+^*/*(*_*6@>+:*<*[*}*|*1*2*3*        ",
+"            4*5*6*7*8*9*7@x#A@0*a*b*c*d*e*f*g*h*i*j*g*h*i*g*h*i*j*k*l*3+m*4@n*o*p*|*q*k&r*          ",
+"            s*t*u*v*w*x*y*z*A@A*B*C*D*E*F*G*H*I*J*K*H*I*J*H*I*J*K*L*M*N*H.O*P*p*Q*R*k&S*T*          ",
+"              U*V*}*W*X*Y*Z*`*A@1# =7@.=A@A@A@A@A@x#.=7@A++=|#|#|#>+A+K$@=#=$=%=&=*===-=            ",
+"                ;=>=,=O '=)=!=~=6@A@A@A@A@A@A@A@A@A@x#A@G%{=]=q$/+3@^=/=(=_=:=<=[=}=|=              ",
+"                1=2=3=4=5=6=7=8=9=0=a=z@A@A@M$6@A@G%{%G%$@b=z&#@^&c=d=e=f=g=h=i=j=k=5               ",
+"                  l=m=n=o=p=q=r=s=t=u=v=w=x=z@y=2$z=m*^&H.L$A=9*B=C=D=E=F=G=H=I=J=K=                ",
+"                      L=M=N=O=P=Q=R=S=_.T=U=V=W=X=Y=Z=`= -.-+-@-#-$-|&%-&-#**-=-                    ",
+"                        --3=;->-,-'-)-!-$=~-{-]-^-/-(-i _-:-<-=@[-*@}-Y%|-1-2-                      ",
+"                          3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-[-i-j-k-k&l-m-n-o-                        ",
+"                              p-q-r-s-[=t-u-v-w-x-y-@*z-A-B-C-D-E-F-G-H-                            ",
+"                                  I-J-K-L-n=M-N-O-k&P-Q-R-;-S-T-U-V-                                ",
+"                                          W-X-Y-Z-`- ;.;+;D#                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.bmp
new file mode 100644 (file)
index 0000000..0fe456f
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_OpenDirectory.xpm
new file mode 100644 (file)
index 0000000..db00f47
--- /dev/null
@@ -0,0 +1,814 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_OpenDirectory_xpm[] = {
+"50 50 761 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #666666",
+"[.    c #A6A6ED",
+"}.    c #A8A6EE",
+"|.    c #A9A8EF",
+"1.    c #999900",
+"2.    c #9D9CEA",
+"3.    c #9698E8",
+"4.    c #8A8CDE",
+"5.    c #8183D9",
+"6.    c #7A7CD5",
+"7.    c #7578D2",
+"8.    c #686CC5",
+"9.    c #6466BE",
+"0.    c #595DB3",
+"a.    c #424078",
+"b.    c #33335A",
+"c.    c #5A59A4",
+"d.    c #6568C0",
+"e.    c #6A6AC4",
+"f.    c #9B9CC7",
+"g.    c #989BD9",
+"h.    c #7C80D7",
+"i.    c #4C4E91",
+"j.    c #3D3F6E",
+"k.    c #32345A",
+"l.    c #898BD0",
+"m.    c #A3A3EC",
+"n.    c #999999",
+"o.    c #FFFFFF",
+"p.    c #B8B9F4",
+"q.    c #989AEA",
+"r.    c #868CDE",
+"s.    c #7E82D8",
+"t.    c #7A7DD6",
+"u.    c #7376CF",
+"v.    c #6E71CA",
+"w.    c #6A6CC4",
+"x.    c #6567C0",
+"y.    c #6163BD",
+"z.    c #4D5098",
+"A.    c #32335C",
+"B.    c #474B86",
+"C.    c #6768BF",
+"D.    c #6C6CC5",
+"E.    c #7576B5",
+"F.    c #9498D7",
+"G.    c #8588DC",
+"H.    c #7378CD",
+"I.    c #3F3F72",
+"J.    c #373961",
+"K.    c #8484C4",
+"L.    c #A4A4EC",
+"M.    c #AFB0F2",
+"N.    c #FFFF99",
+"O.    c #9193E3",
+"P.    c #8688DC",
+"Q.    c #8080D5",
+"R.    c #7879D2",
+"S.    c #7374CC",
+"T.    c #6C6EC8",
+"U.    c #6466BF",
+"V.    c #6262BB",
+"W.    c #5357A8",
+"X.    c #42437C",
+"Y.    c #525196",
+"Z.    c #5F60B6",
+"`.    c #6263BB",
+" +    c #7878BB",
+".+    c #BBBED0",
+"++    c #878BDF",
+"@+    c #666AC2",
+"#+    c #55549F",
+"$+    c #40406B",
+"%+    c #8A8CD0",
+"&+    c #B1B2F1",
+"*+    c #BAB9F4",
+"=+    c #666699",
+"-+    c #8184DC",
+";+    c #7A7CD2",
+">+    c #5A5AAF",
+",+    c #444884",
+"'+    c #50529D",
+")+    c #54539D",
+"!+    c #5656A4",
+"~+    c #AEAEB9",
+"{+    c #B3B3C6",
+"]+    c #888ADD",
+"^+    c #7F81D6",
+"/+    c #5C5EAD",
+"(+    c #AEADF0",
+"_+    c #C2C2F5",
+":+    c #FFFFCC",
+"<+    c #000000",
+"[+    c #595BAD",
+"}+    c #42457F",
+"|+    c #4E529B",
+"1+    c #4F508F",
+"2+    c #4F4F8E",
+"3+    c #B4B5C8",
+"4+    c #8586C8",
+"5+    c #7A7DD4",
+"6+    c #696AC2",
+"7+    c #3C3C6A",
+"8+    c #C9CAF8",
+"9+    c #FFCC99",
+"0+    c #CCCC66",
+"a+    c #5C5BAE",
+"b+    c #302F52",
+"c+    c #4E5090",
+"d+    c #4E4E88",
+"e+    c #70709F",
+"f+    c #7679D1",
+"g+    c #515396",
+"h+    c #46467E",
+"i+    c #515385",
+"j+    c #9796E3",
+"k+    c #5C60BB",
+"l+    c #41407C",
+"m+    c #454677",
+"n+    c #4A4A7C",
+"o+    c #484876",
+"p+    c #AFB1C0",
+"q+    c #6669C1",
+"r+    c #5B5DAE",
+"s+    c #343660",
+"t+    c #393C65",
+"u+    c #8A8DD8",
+"v+    c #9798E6",
+"w+    c #FFCCFF",
+"x+    c #5A5BAF",
+"y+    c #37375E",
+"z+    c #4D508E",
+"A+    c #4B4B7E",
+"B+    c #4A4882",
+"C+    c #9396C1",
+"D+    c #5B5DB2",
+"E+    c #484C8D",
+"F+    c #2D2F54",
+"G+    c #6A6AA8",
+"H+    c #9290E0",
+"I+    c #9899E7",
+"J+    c #5C60BA",
+"K+    c #464782",
+"L+    c #4A4A81",
+"M+    c #4D4E8A",
+"N+    c #3E3D67",
+"O+    c #9797C0",
+"P+    c #7A7AB6",
+"Q+    c #5A5AAA",
+"R+    c #4C4C8B",
+"S+    c #797BC3",
+"T+    c #9090E1",
+"U+    c #FFCCCC",
+"V+    c #5055A5",
+"W+    c #3C3D66",
+"X+    c #4B4C81",
+"Y+    c #3A3B64",
+"Z+    c #6D6D99",
+"`+    c #4C4F90",
+" @    c #505396",
+".@    c #34345A",
+"+@    c #3E406C",
+"@@    c #7D7ECC",
+"#@    c #8D8EE1",
+"$@    c #9496E6",
+"%@    c #A0A2ED",
+"&@    c #5B5FBA",
+"*@    c #5D5FB9",
+"=@    c #3B3A6B",
+"-@    c #3F4271",
+";@    c #40416C",
+">@    c #3B3867",
+",@    c #9091AF",
+"'@    c #505297",
+")@    c #4C4D8C",
+"!@    c #464680",
+"~@    c #48487A",
+"{@    c #7F82D2",
+"]@    c #8A8DE0",
+"^@    c #9796E4",
+"/@    c #9FA0EA",
+"(@    c #CCCCCC",
+"_@    c #5E60B9",
+":@    c #4B4B8E",
+"<@    c #373661",
+"[@    c #323358",
+"}@    c #1C1A2D",
+"|@    c #9898C4",
+"1@    c #62648A",
+"2@    c #414077",
+"3@    c #5858A9",
+"4@    c #3E4274",
+"5@    c #676BB3",
+"6@    c #8184D6",
+"7@    c #878ADC",
+"8@    c #9294E5",
+"9@    c #9C9DE8",
+"0@    c #669966",
+"a@    c #5E5EB6",
+"b@    c #31335E",
+"c@    c #2A2E50",
+"d@    c #232440",
+"e@    c #7474A8",
+"f@    c #6D6FC7",
+"g@    c #5C5D99",
+"h@    c #232546",
+"i@    c #21213B",
+"j@    c #7576C6",
+"k@    c #8181D6",
+"l@    c #8588DB",
+"m@    c #8E90E0",
+"n@    c #9898E6",
+"o@    c #989800",
+"p@    c #5E5FBA",
+"q@    c #4B4A86",
+"r@    c #272849",
+"s@    c #4A4A8B",
+"t@    c #767AD1",
+"u@    c #7F82D8",
+"v@    c #5B5CAA",
+"w@    c #787ACD",
+"x@    c #7B7CD4",
+"y@    c #8084DA",
+"z@    c #8A8ADE",
+"A@    c #9296E6",
+"B@    c #000033",
+"C@    c #46457D",
+"D@    c #45487D",
+"E@    c #262544",
+"F@    c #3F3F79",
+"G@    c #7C7FD6",
+"H@    c #6969C0",
+"I@    c #4A4C8C",
+"J@    c #373864",
+"K@    c #7579D0",
+"L@    c #797AD3",
+"M@    c #7C7FD8",
+"N@    c #8484D9",
+"O@    c #8C8EE0",
+"P@    c #5A5EB9",
+"Q@    c #5E60BA",
+"R@    c #414276",
+"S@    c #46477F",
+"T@    c #2C2C4D",
+"U@    c #39386E",
+"V@    c #6D70CB",
+"W@    c #6062BA",
+"X@    c #4A4988",
+"Y@    c #2E3055",
+"Z@    c #7274CC",
+"`@    c #7375CD",
+" #    c #7578D0",
+".#    c #7E7FD6",
+"+#    c #8587DC",
+"@#    c #999966",
+"##    c #5F60B8",
+"$#    c #404175",
+"%#    c #44467A",
+"&#    c #232442",
+"*#    c #323264",
+"=#    c #6367C0",
+"-#    c #656AC2",
+";#    c #424475",
+">#    c #2D2E51",
+",#    c #7274CB",
+"'#    c #6D71CA",
+")#    c #7275CE",
+"!#    c #777AD4",
+"~#    c #7D80CC",
+"{#    c #979812",
+"]#    c #6060B9",
+"^#    c #3B3C6E",
+"/#    c #121222",
+"(#    c #2F2E5B",
+"_#    c #7073CC",
+":#    c #7174CD",
+"<#    c #4D4C8E",
+"[#    c #2E2F54",
+"}#    c #6F73CA",
+"|#    c #6A6CC6",
+"1#    c #6F71C9",
+"2#    c #787BD0",
+"3#    c #959522",
+"4#    c #5D60B9",
+"5#    c #6062BC",
+"6#    c #3E4074",
+"7#    c #292A4A",
+"8#    c #12101E",
+"9#    c #6D70C9",
+"0#    c #7477D0",
+"a#    c #53549A",
+"b#    c #2D2C4F",
+"c#    c #676ABA",
+"d#    c #6A6CC5",
+"e#    c #949422",
+"f#    c #CCCCFF",
+"g#    c #6061B9",
+"h#    c #5E62BD",
+"i#    c #3D3D6D",
+"j#    c #222342",
+"k#    c #101121",
+"l#    c #38366D",
+"m#    c #6064BA",
+"n#    c #686CC4",
+"o#    c #5C5EA5",
+"p#    c #686AC2",
+"q#    c #7073C9",
+"r#    c #939320",
+"s#    c #5F62BB",
+"t#    c #5A5AAB",
+"u#    c #383A65",
+"v#    c #262645",
+"w#    c #0F101E",
+"x#    c #424380",
+"y#    c #585BAA",
+"z#    c #4F5091",
+"A#    c #494980",
+"B#    c #484D8F",
+"C#    c #56589B",
+"D#    c #6467BF",
+"E#    c #6968C2",
+"F#    c #000001",
+"G#    c #996666",
+"H#    c #5F64BD",
+"I#    c #5E60B8",
+"J#    c #494C8E",
+"K#    c #353358",
+"L#    c #1E1D36",
+"M#    c #09080F",
+"N#    c #595AA4",
+"O#    c #8B8CA4",
+"P#    c #484B7F",
+"Q#    c #494C80",
+"R#    c #474882",
+"S#    c #484B84",
+"T#    c #6366C0",
+"U#    c #6464BD",
+"V#    c #6565BE",
+"W#    c #676BC3",
+"X#    c #5F62BA",
+"Y#    c #5B5EB6",
+"Z#    c #3B3C66",
+"`#    c #2D2E52",
+" $    c #131220",
+".$    c #9294BE",
+"+$    c #AFB0BA",
+"@$    c #3E416D",
+"#$    c #4A4B83",
+"$$    c #5D60B3",
+"%$    c #6263BC",
+"&$    c #6767C0",
+"*$    c #669999",
+"=$    c #996699",
+"-$    c #4C4D95",
+";$    c #333258",
+">$    c #282849",
+",$    c #0B0C18",
+"'$    c #28284A",
+")$    c #B2B4C8",
+"!$    c #42426E",
+"~$    c #424270",
+"{$    c #444782",
+"]$    c #3A3B6E",
+"^$    c #454580",
+"/$    c #5F61BB",
+"($    c #6364BC",
+"_$    c #6365BF",
+":$    c #333767",
+"<$    c #262746",
+"[$    c #1D1C32",
+"}$    c #08060C",
+"|$    c #464683",
+"1$    c #808190",
+"2$    c #212039",
+"3$    c #42437B",
+"4$    c #4E5191",
+"5$    c #353864",
+"6$    c #4D5096",
+"7$    c #5D61BC",
+"8$    c #333333",
+"9$    c #4A4A8E",
+"0$    c #19172B",
+"a$    c #19172A",
+"b$    c #0C0B15",
+"c$    c #131221",
+"d$    c #9394BA",
+"e$    c #ACAFBC",
+"f$    c #4B4C86",
+"g$    c #5459A9",
+"h$    c #4E5294",
+"i$    c #404271",
+"j$    c #343663",
+"k$    c #5C5EB4",
+"l$    c #6162BA",
+"m$    c #5A5EB2",
+"n$    c #242443",
+"o$    c #414470",
+"p$    c #1C1C33",
+"q$    c #07040A",
+"r$    c #343462",
+"s$    c #6A6B90",
+"t$    c #3E3F69",
+"u$    c #38375F",
+"v$    c #343256",
+"w$    c #2B2A4C",
+"x$    c #3D407A",
+"y$    c #5C5EB7",
+"z$    c #5E62BC",
+"A$    c #5B5FB8",
+"B$    c #6164B9",
+"C$    c #302F5A",
+"D$    c #252645",
+"E$    c #242442",
+"F$    c #0A0912",
+"G$    c #120F1E",
+"H$    c #7676B2",
+"I$    c #282948",
+"J$    c #222240",
+"K$    c #42487E",
+"L$    c #313258",
+"M$    c #272749",
+"N$    c #454887",
+"O$    c #5D60BB",
+"P$    c #6061BA",
+"Q$    c #6869BE",
+"R$    c #454684",
+"S$    c #393A63",
+"T$    c #0B0B15",
+"U$    c #3B3D70",
+"V$    c #87889D",
+"W$    c #323256",
+"X$    c #4D4D88",
+"Y$    c #323458",
+"Z$    c #434476",
+"`$    c #393A68",
+" %    c #4F4E95",
+".%    c #5C5FB8",
+"+%    c #5A5FB9",
+"@%    c #6267BA",
+"#%    c #444580",
+"$%    c #484A7C",
+"%%    c #141526",
+"&%    c #22253F",
+"*%    c #9295BC",
+"=%    c #626484",
+"-%    c #333459",
+";%    c #484A88",
+">%    c #4D4E94",
+",%    c #3F4173",
+"'%    c #3D3E75",
+")%    c #5A5EB7",
+"!%    c #5A5EB8",
+"~%    c #6264BE",
+"{%    c #6064BD",
+"]%    c #5A5CAE",
+"^%    c #30315D",
+"/%    c #3D406D",
+"(%    c #4C4E86",
+"_%    c #242542",
+":%    c #07050C",
+"<%    c #101223",
+"[%    c #6B6EA0",
+"}%    c #34345D",
+"|%    c #191A30",
+"1%    c #36365E",
+"2%    c #5759AA",
+"3%    c #4B4B88",
+"4%    c #323156",
+"5%    c #30305D",
+"6%    c #5355A2",
+"7%    c #5E61BB",
+"8%    c #5C60B9",
+"9%    c #6064BF",
+"0%    c #6466C0",
+"a%    c #6666BF",
+"b%    c #4E5196",
+"c%    c #2B2C52",
+"d%    c #3A3C6B",
+"e%    c #444876",
+"f%    c #2E2E50",
+"g%    c #0C0912",
+"h%    c #0D0B16",
+"i%    c #494986",
+"j%    c #ADAFBA",
+"k%    c #292B4C",
+"l%    c #18172B",
+"m%    c #333456",
+"n%    c #38385F",
+"o%    c #232240",
+"p%    c #34335C",
+"q%    c #2F3258",
+"r%    c #3E3E74",
+"s%    c #585CB1",
+"t%    c #5C5EB8",
+"u%    c #5D5FB8",
+"v%    c #6265BD",
+"w%    c #6064BE",
+"x%    c #5E60B6",
+"y%    c #444684",
+"z%    c #2C2E52",
+"A%    c #2C2A4A",
+"B%    c #424474",
+"C%    c #232543",
+"D%    c #0C0C16",
+"E%    c #0E0D19",
+"F%    c #43447A",
+"G%    c #ACAFB9",
+"H%    c #2E2E52",
+"I%    c #12101F",
+"J%    c #1C1B33",
+"K%    c #0E0E1A",
+"L%    c #5857A5",
+"M%    c #50529F",
+"N%    c #444783",
+"O%    c #373863",
+"P%    c #42427B",
+"Q%    c #474A8E",
+"R%    c #52529E",
+"S%    c #595BB0",
+"T%    c #6262BC",
+"U%    c #6062BB",
+"V%    c #6063BD",
+"W%    c #575EB2",
+"X%    c #3C3F76",
+"Y%    c #2F3056",
+"Z%    c #383965",
+"`%    c #35365C",
+" &    c #262644",
+".&    c #12101C",
+"+&    c #0A060C",
+"@&    c #0F101C",
+"#&    c #424479",
+"$&    c #B0B3C6",
+"%&    c #515369",
+"&&    c #0D0E1C",
+"*&    c #0E0E1C",
+"=&    c #3C3D6E",
+"-&    c #4A4F8E",
+";&    c #5759B0",
+">&    c #5558AB",
+",&    c #4E5094",
+"'&    c #363764",
+")&    c #3C3B6E",
+"!&    c #3B3E77",
+"~&    c #3F407C",
+"{&    c #3B3D73",
+"]&    c #3A3A6E",
+"^&    c #383A6F",
+"/&    c #3B3B70",
+"(&    c #3C3B70",
+"_&    c #3A3B6D",
+":&    c #34355E",
+"<&    c #454680",
+"[&    c #4E5095",
+"}&    c #474C8A",
+"|&    c #18172D",
+"1&    c #090A13",
+"2&    c #161728",
+"3&    c #64668E",
+"4&    c #60607F",
+"5&    c #18182C",
+"6&    c #292A49",
+"7&    c #3C3C68",
+"8&    c #464882",
+"9&    c #545BAF",
+"0&    c #50529A",
+"a&    c #3B3E6B",
+"b&    c #2F3158",
+"c&    c #363760",
+"d&    c #383860",
+"e&    c #303358",
+"f&    c #414272",
+"g&    c #46487E",
+"h&    c #4C4A7E",
+"i&    c #4D5091",
+"j&    c #383962",
+"k&    c #0A060E",
+"l&    c #0B0A12",
+"m&    c #262745",
+"n&    c #7070A4",
+"o&    c #ACAEB6",
+"p&    c #55566D",
+"q&    c #131528",
+"r&    c #141221",
+"s&    c #1B1B32",
+"t&    c #2F2F4F",
+"u&    c #303054",
+"v&    c #292847",
+"w&    c #323257",
+"x&    c #393960",
+"y&    c #393A62",
+"z&    c #3D3E69",
+"A&    c #4C4E8E",
+"B&    c #4A4B8A",
+"C&    c #52539A",
+"D&    c #3C4070",
+"E&    c #343459",
+"F&    c #20213B",
+"G&    c #110F1C",
+"H&    c #08070E",
+"I&    c #1E2038",
+"J&    c #616386",
+"K&    c #ADB1C2",
+"L&    c #AAAEB6",
+"M&    c #32335B",
+"N&    c #19182C",
+"O&    c #0F0E1B",
+"P&    c #0A0A15",
+"Q&    c #0F0F1B",
+"R&    c #121223",
+"S&    c #1A1B34",
+"T&    c #131223",
+"U&    c #141527",
+"V&    c #181A30",
+"W&    c #161324",
+"X&    c #0F0D19",
+"Y&    c #080810",
+"Z&    c #0B080F",
+"`&    c #0D0C18",
+" *    c #20223B",
+".*    c #444379",
+"+*    c #AEB0BC",
+"@*    c #ADAEB8",
+"#*    c #848394",
+"$*    c #2E3054",
+"%*    c #1E1E36",
+"&*    c #0B0D19",
+"**    c #0A080E",
+"=*    c #08050A",
+"-*    c #09070D",
+";*    c #090911",
+">*    c #10101D",
+",*    c #252946",
+"'*    c #373A69",
+")*    c #8A8CA2",
+"!*    c #B0B0C0",
+"~*    c #8E8EA8",
+"{*    c #8A8BA0",
+"]*    c #868A9E",
+"^*    c #848698",
+"/*    c #838698",
+"(*    c #83879A",
+"_*    c #89889D",
+":*    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.<.[.}.|.1.1.1.2.3.#.4.5.6.7.u 8.9.0.a.b.c.d.e.f.                  ",
+"                  g.h.i.j.k.l.m.n.o.<.n.p.1.o.o.1.1.q.@.r.s.t.u.v.w.x.y.z.A.B.C.D.E.                ",
+"                F.G.H.I.J.K.L.M.<.o.o.o.<.<.N.N.o.o.1.1.O.P.Q.R.S.T.8.U.V.W.X.Y.Z.`. +              ",
+"              .+++@+#+$+%+L.&+*+<.o.o.o.o.o.<.=+N.N.o.o.1.1.-+;+1.1.1.1.1.V.>+,+'+)+!+~+            ",
+"            {+]+^+/+1.1.1.(+*+_+n.o.:+o.o.o.o.o.<.<.N.N.o.o.1.1.o.o.o.o.o.<+<+[+}+|+1+2+3+          ",
+"            4+5+6+7+1.o.o.1.1.8+<.o.o.:+o.:+o.o.o.o.<.=+N.N.o.o.N.N.9+N.N.9+0+<+a+b+c+d+e+          ",
+"          {.f+g+h+i+j+1.o.:+o.1.1.o.o.o.:+o.o.:+o.o.o.o.<.<.N.N.N.9+N.N.9+9+0+<+k+l+m+n+o+p+        ",
+"          q+r+s+t+u+v+1.o.N.N.o.o.1.1.o.o.w+:+o.o.:+o.o.o.o.<.=+N.N.N.9+N.N.9+0+<+x+y+z+A+B+        ",
+"        C+D+E+F+G+H+I+1.o.N.N.N.N.o.:+1.1.o.o.:+o.o.:+o.o.o.o.o.<.<.N.N.9+9+9+0+<+J+K+L+M+N+O+      ",
+"        P+Q+R+: S+T+I+m.1.o.N.N.N.N.N.o.o.1.1.o.o.U+o.o.:+o.:+o.o.o.<.=+N.9+N.0+<+J+V+W+X+Y+Z+      ",
+"        `+ @.@+@@@#@$@%@1.o.N.N.9+N.N.N.N.o.:+1.1.o.o.:+o.o.o.:+o.o.o.o.<.N.9+0+<+&@*@=@-@;@>@      ",
+"      ,@'@)@!@~@{@]@^@/@1.o.N.N.N.N.N.9+N.9+N.o.o.1.1.o.o.:+(@o.(@o.(@o.<.9+0+<+J+&@_@:@<@[@}@|@    ",
+"      1@2@3@4@5@6@7@8@9@1.o.N.N.N.9+N.N.N.N.N.N.9+o.:+1.1.o.o.(@o.(@o.o.0@9+0+<+J+J+&@a@b@c@d@e@    ",
+"      f@g@h@i@j@k@l@m@n@o@o.N.N.N.N.N.N.N.9+N.N.N.N.9+o.w+1.1.o.(@o.(@o.=+9+0+<+J+k+&@p@q@)@r@s@    ",
+"      t@u@v@Y+w@x@y@z@A@o@o.N.N.9+N.9+N.9+N.9+N.9+N.N.N.9+o.:+<+o.(@o.o.<.9+0+B@&@&@k+k+C@D@E@F@    ",
+"      G@H@I@J@K@L@M@N@O@1.o.N.N.N.N.N.N.N.N.N.9+N.9+N.9+N.N.0+<+(@o.(@o.<.0+<+J+J+P@J+Q@R@S@T@U@    ",
+"      V@W@X@Y@Z@`@ #.#+#o@o.N.N.N.N.N.9+N.9+N.N.9+N.9+N.N.9+0+<+o.(@(@o.@#0+<+J+J+J+k+##$#%#&#*#    ",
+"      =#-#;#>#,#'#)#!#~#{#o.N.9+N.N.N.N.N.9+N.9+N.9+9+N.9+N.N.0+<+U+o.<.9+0+<+J+J+J+&@]#^#[@/#(#    ",
+"      _#:#<#[#}#|#1#)#2#3#o.N.N.N.9+N.N.9+N.9+N.9+N.N.N.9+N.9+0+<+(@o.=+0+<+J+J+J+J+4#5#6#7#8#*#    ",
+"      9#0#a#b#c#d#-.v.7 e#o.N.9+N.N.N.N.N.N.N.9+N.9+9+9+N.9+N.0+<+f#o.0@0+<+J+J+J+J+g#h#i#j#k#l#    ",
+"      m#n#m+Y+o#p#-.e.q#r#:+o.N.N.N.N.9+N.9+N.9+9+N.9+N.9+N.9+0+<+U+o.<.0+<+J+J+J+s#V.t#u#v#w#x#    ",
+"      y#z#A#B#C#x.D#n#E#F#0+:+N.N.9+N.N.N.N.9+9+9+N.9+9+N.9+9+0+<+(@o.G#<+<.H#J+J+I#y.J#K#L#M#N#    ",
+"      O#P#Q#R#S#T#U#V#W#F#<+0+0+N.N.N.N.9+N.N.N.9+9+9+N.9+N.N.0+<+f#o.<.<+<.n.X#s#V.Y#Z#`#w# $.$    ",
+"      +$X+@$#$~ $$%$y.U#&$% <+<+0+0+9+N.N.N.9+9+N.9+9+9+9+9+9+9+0+<+o.*$<+<.=$n.n.y.-$;$>$,$'$)$    ",
+"        !$~${$]$^$/$y.%$($_$&$x.<+<+0+0+N.N.9+N.9+9+N.9+9+9+9+N.0+<+o.G#<+<.0@<.*$n.:$<$[$}$|$      ",
+"        1$2$3$4$5$6$7$7$5#($U#($U#U#<+<+0+0+0+0+9+N.9+9+N.9+9+9+0+<+o.<.8$<.<.G#n.9$0$a$b$c$d$      ",
+"        e$f$g$h$i$j$k$h#7$7$5#5#($h#5#l$<+<+<+0+0+0+N.9+9+9+9+9+0+<+o.<+8$<.<.n.m$n$o$p$q$r$R       ",
+"          s$t$u$v$w$x$y$&@7$J+7$h#7$7$z$7$A$z$<+<+<+0+0+9+9+9+9+0+<+8$<+<.<.n.B$C$D$E$F$G$H$        ",
+"            I$J$K$L$M$N$O$&@J+&@]#s#P$P$s#h#&@_@_@k+<+<+0+0+N.9+0+<+<+<+<.n.Q$R$S$E$T$}$U$          ",
+"            V$W$X$Y$Z$`$ %.%J++%J+7$J+J+P@&@J+P@J+&@7$y.<+<+0+0+9+0+<+8$<.@%#%S$$%%%}$&%*%          ",
+"              =%-%D$;%>%,%'%)%J+P@!%k++%J+J+J+J+J+&@+%k+~%{%<+<+0+0+<+8$]%^%/%(%_%:%<%[%            ",
+"                }%|%1%2%3%4%5%6%7%4#J+J+8%J+J+J+J+J+&@J+s#9%0%a%<+<+<+b%c%d%e%f%g%h%i%              ",
+"                j%k%l%m%n%o%p%q%r%s%t%u%J+J+4#7$J+s#P$s#g#v%w%U#%$x%y%z%A%B%C%D%E%F%5               ",
+"                  G%H%I%J%K%L%M%N%O%P%Q%R%S%u%T%/$U%V%%$y.5#W%N$X%Y%Z%`% &.&+&@&#&$&                ",
+"                      %&&&*&=&-&;&>&,&_.'&)&!&~&{&]&^&/&(&_&:&<&[&}&'$|&1&q$2&3&                    ",
+"                        4&l%5&6&7&8&9&0&/%a&b&c&d&e&f&i g&h&i&c+j&b+k&M#l&m&n&                      ",
+"                          o&p&q&r&s&t&u&v&w&x&y&z&A&B&C&D&j&E&F&G&}$H&I&J&K&                        ",
+"                              L&M&N&O&g%P&Q&R&S&T&U&p$V&W&X&Y&Z&`& *.*+*                            ",
+"                                  @*#*$*%*I%&***=*}$-*;*>*5&,*'*)*!*                                ",
+"                                          ~*{*]*^*/*(*_*:*,@                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.bmp
new file mode 100644 (file)
index 0000000..6000439
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Processing.xpm
new file mode 100644 (file)
index 0000000..0a3e28d
--- /dev/null
@@ -0,0 +1,791 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_Processing_xpm[] = {
+"50 50 738 2",
+"      c #CED0CC",
+".     c #DDDEDC",
+"+     c #ECECEC",
+"@     c #EBEBEB",
+"#     c #EAEAEA",
+"$     c #D6D7D4",
+"%     c #E2E2E2",
+"&     c #ACACAC",
+"*     c #8B8B8B",
+"=     c #B9B9BA",
+"-     c #BBBBBB",
+";     c #BCBCBC",
+">     c #B8B8B8",
+",     c #B3B4B6",
+"'     c #C5C5C5",
+")     c #E1E2E1",
+"!     c #A2A3E6",
+"~     c #7D80D7",
+"{     c #5E5EB2",
+"]     c #6468C0",
+"^     c #5458AE",
+"/     c #5556AA",
+"(     c #5254A6",
+"_     c #6162B5",
+":     c #6667BE",
+"<     c #808395",
+"[     c #7E7E8E",
+"}     c #C6C7C7",
+"|     c #ABABAB",
+"1     c #E6E6E6",
+"2     c #6F6F6F",
+"3     c #9D9D9D",
+"4     c #E7E7E8",
+"5     c #F5F5F6",
+"6     c #FDFDFD",
+"7     c #FEFFFE",
+"8     c #EFEFEF",
+"9     c #D5D5D5",
+"0     c #A7A7A7",
+"a     c #CECECE",
+"b     c #52549C",
+"c     c #42447A",
+"d     c #3F406E",
+"e     c #36365D",
+"f     c #31325A",
+"g     c #2A2D51",
+"h     c #42447E",
+"i     c #5A60AD",
+"j     c #6362B9",
+"k     c #4B4C8B",
+"l     c #8081BE",
+"m     c #9899C5",
+"n     c #E3E3E4",
+"o     c #B7B7B7",
+"p     c #7F7F7F",
+"q     c #828282",
+"r     c #6D6D6D",
+"s     c #757575",
+"t     c #DCDCDC",
+"u     c #FFFFFF",
+"v     c #FAFAFA",
+"w     c #E6E7E7",
+"x     c #A3A3A4",
+"y     c #A7A6A7",
+"z     c #EDEDED",
+"A     c #1E1E37",
+"B     c #29294A",
+"C     c #373963",
+"D     c #43457C",
+"E     c #3E3E6E",
+"F     c #403E68",
+"G     c #45467C",
+"H     c #383964",
+"I     c #6669C0",
+"J     c #4C4D8A",
+"K     c #6A6E9A",
+"L     c #ACADB6",
+"M     c #D8D8D8",
+"N     c #838384",
+"O     c #C2C2C2",
+"P     c #606060",
+"Q     c #707070",
+"R     c #F9F9F9",
+"S     c #AFAFB0",
+"T     c #919192",
+"U     c #C2C2E4",
+"V     c #7072C9",
+"W     c #6D6EC4",
+"X     c #686ABF",
+"Y     c #5E62B2",
+"Z     c #53569B",
+"`     c #454378",
+" .    c #2D2F52",
+"..    c #3C3C66",
+"+.    c #414170",
+"@.    c #5658AA",
+"#.    c #454476",
+"$.    c #7575A9",
+"%.    c #B5B5C9",
+"&.    c #DDDEDE",
+"*.    c #7C7D7E",
+"=.    c #C1C1C2",
+"-.    c #B9B9B9",
+";.    c #7D7D7D",
+">.    c #909090",
+",.    c #797979",
+"'.    c #717171",
+").    c #CBCBCB",
+"!.    c #AEADAE",
+"~.    c #8386DA",
+"{.    c #7C7BD3",
+"].    c #7275CD",
+"^.    c #6C70C9",
+"/.    c #696BC4",
+"(.    c #5A5DAE",
+"_.    c #414178",
+":.    c #3B3A67",
+"<.    c #3F4272",
+"[.    c #444476",
+"}.    c #666AC0",
+"|.    c #6B6AC4",
+"1.    c #B7B9CC",
+"2.    c #7C7C7D",
+"3.    c #A6A6A7",
+"4.    c #D2D2D2",
+"5.    c #8C8C8C",
+"6.    c #808080",
+"7.    c #F6F6F6",
+"8.    c #8D8D8D",
+"9.    c #8A8CDE",
+"0.    c #8183D9",
+"a.    c #7A7CD5",
+"b.    c #7578D2",
+"c.    c #6F72CB",
+"d.    c #686CC5",
+"e.    c #6466BE",
+"f.    c #595DB3",
+"g.    c #424078",
+"h.    c #33335A",
+"i.    c #5A59A4",
+"j.    c #6568C0",
+"k.    c #6A6AC4",
+"l.    c #9B9CC7",
+"m.    c #6F7071",
+"n.    c #D4D4D4",
+"o.    c #A2A2A2",
+"p.    c #9B9B9B",
+"q.    c #F8F8F8",
+"r.    c #DBDBDB",
+"s.    c #FEFEFE",
+"t.    c #BFBFC0",
+"u.    c #919191",
+"v.    c #9094E4",
+"w.    c #868CDE",
+"x.    c #7E82D8",
+"y.    c #7A7DD6",
+"z.    c #7376CF",
+"A.    c #6E71CA",
+"B.    c #6A6CC4",
+"C.    c #6567C0",
+"D.    c #6163BD",
+"E.    c #4D5098",
+"F.    c #32335C",
+"G.    c #474B86",
+"H.    c #6768BF",
+"I.    c #6C6CC5",
+"J.    c #7576B5",
+"K.    c #8A8A89",
+"L.    c #999999",
+"M.    c #C9CACA",
+"N.    c #A0A0A0",
+"O.    c #C0C0C0",
+"P.    c #A1A1A1",
+"Q.    c #767676",
+"R.    c #E9E9E9",
+"S.    c #737375",
+"T.    c #9899E7",
+"U.    c #9193E3",
+"V.    c #8688DC",
+"W.    c #8080D5",
+"X.    c #7879D2",
+"Y.    c #7374CC",
+"Z.    c #6C6EC8",
+"`.    c #6466BF",
+" +    c #6262BB",
+".+    c #5357A8",
+"++    c #42437C",
+"@+    c #525196",
+"#+    c #5F60B6",
+"$+    c #6263BB",
+"%+    c #7878BB",
+"&+    c #727273",
+"*+    c #B2B2B0",
+"=+    c #BCBDBD",
+"-+    c #7C7C7C",
+";+    c #6E6E6E",
+">+    c #DEDEDE",
+",+    c #7B7B7C",
+"'+    c #E5E5E5",
+")+    c #989AEA",
+"!+    c #8A8EDF",
+"~+    c #8184DC",
+"{+    c #7A7CD2",
+"]+    c #7476D0",
+"^+    c #6D71CA",
+"/+    c #6A6CC5",
+"(+    c #666AC2",
+"_+    c #6464BE",
+":+    c #5A5AAF",
+"<+    c #444884",
+"[+    c #50529D",
+"}+    c #54539D",
+"|+    c #5656A4",
+"1+    c #AEAEB9",
+"2+    c #7A7A7B",
+"3+    c #A6A6A6",
+"4+    c #BFBFBF",
+"5+    c #7A7A7A",
+"6+    c #7B7B7D",
+"7+    c #9E9DEA",
+"8+    c #9194E2",
+"9+    c #898ADD",
+"0+    c #8282D6",
+"a+    c #787AD2",
+"b+    c #7073CC",
+"c+    c #6A6CC6",
+"d+    c #686AC3",
+"e+    c #6264BE",
+"f+    c #6161BA",
+"g+    c #595BAD",
+"h+    c #42457F",
+"i+    c #4E529B",
+"j+    c #4F508F",
+"k+    c #4F4F8E",
+"l+    c #B4B5C8",
+"m+    c #9C9C9D",
+"n+    c #CACACA",
+"o+    c #C6C6C6",
+"p+    c #5F5F5F",
+"q+    c #E5E6E6",
+"r+    c #717273",
+"s+    c #B0B0F0",
+"t+    c #A0A2EB",
+"u+    c #9698E8",
+"v+    c #888CE1",
+"w+    c #7F82DA",
+"x+    c #797BD2",
+"y+    c #7275CE",
+"z+    c #6B6FC8",
+"A+    c #686AC2",
+"B+    c #6868C0",
+"C+    c #6464BD",
+"D+    c #6061B9",
+"E+    c #5F5FB8",
+"F+    c #5C5BAE",
+"G+    c #302F52",
+"H+    c #4E5090",
+"I+    c #4E4E88",
+"J+    c #70709F",
+"K+    c #E4E4E5",
+"L+    c #828283",
+"M+    c #D9D9D9",
+"N+    c #ABABAC",
+"O+    c #AFAFAF",
+"P+    c #F4F4F4",
+"Q+    c #B1B1B2",
+"R+    c #939392",
+"S+    c #B2B2F2",
+"T+    c #A7A6ED",
+"U+    c #9B9EE8",
+"V+    c #8D8EE0",
+"W+    c #8286DB",
+"X+    c #7B7CD3",
+"Y+    c #686CC4",
+"Z+    c #6668C1",
+"`+    c #6364BC",
+" @    c #5E62BC",
+".@    c #5D61BC",
+"+@    c #5C60BB",
+"@@    c #41407C",
+"#@    c #454677",
+"$@    c #4A4A7C",
+"%@    c #484876",
+"&@    c #AFB1C0",
+"*@    c #949494",
+"=@    c #CBCCCC",
+"-@    c #A9A9AA",
+";@    c #D0D0D0",
+">@    c #767677",
+",@    c #D1D1D1",
+"'@    c #B8B8F4",
+")@    c #A8A9F0",
+"!@    c #9B9CE9",
+"~@    c #9092E2",
+"{@    c #8486DB",
+"]@    c #7B7ED6",
+"^@    c #7477D0",
+"/@    c #6468C2",
+"(@    c #5D5FB8",
+"_@    c #5C60BA",
+":@    c #5A5BAF",
+"<@    c #37375E",
+"[@    c #4D508E",
+"}@    c #4B4B7E",
+"|@    c #4A4882",
+"1@    c #9396C1",
+"2@    c #9D9D9E",
+"3@    c #C9CACB",
+"4@    c #B2B2B2",
+"5@    c #868686",
+"6@    c #C4C4F5",
+"7@    c #B6B7F4",
+"8@    c #9B9DEA",
+"9@    c #8488DC",
+"0@    c #7E7ED4",
+"a@    c #000000",
+"b@    c #6060B8",
+"c@    c #464782",
+"d@    c #4A4A81",
+"e@    c #4D4E8A",
+"f@    c #3E3D67",
+"g@    c #9797C0",
+"h@    c #7A7AB6",
+"i@    c #5A5AAA",
+"j@    c #BDBDBC",
+"k@    c #D7D7D8",
+"l@    c #BABBBC",
+"m@    c #E4E4E4",
+"n@    c #D3D3D3",
+"o@    c #9A9A9B",
+"p@    c #CFCFF8",
+"q@    c #B8B8F3",
+"r@    c #AAAAF1",
+"s@    c #9C9EEA",
+"t@    c #8487DD",
+"u@    c #7C7ED7",
+"v@    c #AAAAAA",
+"w@    c #5D62BB",
+"x@    c #5E60BA",
+"y@    c #5A5EB9",
+"z@    c #5055A5",
+"A@    c #3C3D66",
+"B@    c #4B4C81",
+"C@    c #3A3B64",
+"D@    c #6D6D99",
+"E@    c #4C4F90",
+"F@    c #505396",
+"G@    c #5A5A79",
+"H@    c #EDEEEE",
+"I@    c #DDDDDD",
+"J@    c #DADADA",
+"K@    c #D7D6FB",
+"L@    c #CCCDF8",
+"M@    c #C0C0F6",
+"N@    c #B6B5F2",
+"O@    c #9C9CE9",
+"P@    c #8E8FE1",
+"Q@    c #8589DD",
+"R@    c #7C7ED4",
+"S@    c #555555",
+"T@    c #5B5FBA",
+"U@    c #5D5FB9",
+"V@    c #3B3A6B",
+"W@    c #3F4271",
+"X@    c #40416C",
+"Y@    c #3B3867",
+"Z@    c #9091AF",
+"`@    c #505297",
+" #    c #4C4D8C",
+".#    c #464680",
+"+#    c #48487A",
+"@#    c #E2E3E2",
+"##    c #B4B4B4",
+"$#    c #A9A9A9",
+"%#    c #E7E6FA",
+"&#    c #DADBFA",
+"*#    c #D1D1F8",
+"=#    c #C8C8F8",
+"-#    c #C0C0F5",
+";#    c #B3B2F2",
+">#    c #A6A5EE",
+",#    c #9799E5",
+"'#    c #8C90E2",
+")#    c #8184DA",
+"!#    c #777777",
+"~#    c #888888",
+"{#    c #5E60B9",
+"]#    c #4B4B8E",
+"^#    c #373661",
+"/#    c #323358",
+"(#    c #1C1A2D",
+"_#    c #9898C4",
+":#    c #62648A",
+"<#    c #414077",
+"[#    c #5858A9",
+"}#    c #3E4274",
+"|#    c #676BB3",
+"1#    c #8184D6",
+"2#    c #878ADC",
+"3#    c #B9BAEB",
+"4#    c #BFBFEC",
+"5#    c #8E8E8F",
+"6#    c #E3E5FC",
+"7#    c #E0E1FA",
+"8#    c #DADBFB",
+"9#    c #D5D4F9",
+"0#    c #CCCEF7",
+"a#    c #C0C2F6",
+"b#    c #BAB9F4",
+"c#    c #AEADF0",
+"d#    c #A0A1EB",
+"e#    c #9796E6",
+"f#    c #898DDE",
+"g#    c #8184D8",
+"h#    c #99FFCB",
+"i#    c #31335E",
+"j#    c #2A2E50",
+"k#    c #232440",
+"l#    c #7474A8",
+"m#    c #6D6FC7",
+"n#    c #5C5D99",
+"o#    c #232546",
+"p#    c #21213B",
+"q#    c #7576C6",
+"r#    c #8181D6",
+"s#    c #8588DB",
+"t#    c #8E90E0",
+"u#    c #9898E6",
+"v#    c #A4A4EC",
+"w#    c #CACAF2",
+"x#    c #818182",
+"y#    c #969696",
+"z#    c #F3F3F3",
+"A#    c #CCCCCC",
+"B#    c #8E8D8D",
+"C#    c #B3B3B2",
+"D#    c #D9DAF9",
+"E#    c #D6D5FA",
+"F#    c #D6D6F9",
+"G#    c #CDCEF8",
+"H#    c #C8C6F6",
+"I#    c #BEBDF5",
+"J#    c #B1B1F2",
+"K#    c #A4A6EE",
+"L#    c #979AE9",
+"M#    c #8E90E1",
+"N#    c #7E80D6",
+"O#    c #272849",
+"P#    c #4A4A8B",
+"Q#    c #767AD1",
+"R#    c #7F82D8",
+"S#    c #5B5CAA",
+"T#    c #787ACD",
+"U#    c #7B7CD4",
+"V#    c #8084DA",
+"W#    c #8A8ADE",
+"X#    c #9296E6",
+"Y#    c #999DE9",
+"Z#    c #8A8A8B",
+"`#    c #868687",
+" $    c #E7E8E8",
+".$    c #CDCDCE",
+"+$    c #737374",
+"@$    c #E7E7E7",
+"#$    c #CECEF7",
+"$$    c #C9C8F6",
+"%$    c #C3C3F6",
+"&$    c #BABCF6",
+"*$    c #B3B4F4",
+"=$    c #AAAAEF",
+"-$    c #9E9EEA",
+";$    c #9496E7",
+">$    c #8C8DDF",
+",$    c #8185DA",
+"'$    c #7C7FD6",
+")$    c #6969C0",
+"!$    c #4A4C8C",
+"~$    c #373864",
+"{$    c #7579D0",
+"]$    c #797AD3",
+"^$    c #7C7FD8",
+"/$    c #8484D9",
+"($    c #8C8EE0",
+"_$    c #9294E3",
+":$    c #9C9DEA",
+"<$    c #ADAFF2",
+"[$    c #ADADAC",
+"}$    c #747475",
+"|$    c #8F8F90",
+"1$    c #727274",
+"2$    c #7C7C7B",
+"3$    c #EBECEC",
+"4$    c #BBBEF5",
+"5$    c #B8B8F5",
+"6$    c #B2B1F1",
+"7$    c #A8A9EE",
+"8$    c #9E9EEB",
+"9$    c #9598E7",
+"0$    c #8C90E0",
+"a$    c #6D70CB",
+"b$    c #6062BA",
+"c$    c #4A4988",
+"d$    c #2E3055",
+"e$    c #7274CC",
+"f$    c #7375CD",
+"g$    c #7578D0",
+"h$    c #7E7FD6",
+"i$    c #8587DC",
+"j$    c #8E8FE2",
+"k$    c #9696E6",
+"l$    c #9E9FE9",
+"m$    c #ABAAF0",
+"n$    c #E3E3E3",
+"o$    c #B5B6B8",
+"p$    c #848483",
+"q$    c #666666",
+"r$    c #C1C2C2",
+"s$    c #AEAEF0",
+"t$    c #A1A4ED",
+"u$    c #A8A7ED",
+"v$    c #9697E5",
+"w$    c #9191E2",
+"x$    c #7F81D7",
+"y$    c #777AD2",
+"z$    c #6367C0",
+"A$    c #656AC2",
+"B$    c #424475",
+"C$    c #2D2E51",
+"D$    c #7274CB",
+"E$    c #777AD4",
+"F$    c #8083D7",
+"G$    c #8688DB",
+"H$    c #8B8EE0",
+"I$    c #9093E2",
+"J$    c #9799E8",
+"K$    c #9D9FEA",
+"L$    c #9E9FE8",
+"M$    c #A2A4EC",
+"N$    c #A7A7EE",
+"O$    c #A6A8EF",
+"P$    c #A6A6ED",
+"Q$    c #A0A2EC",
+"R$    c #A1A2EC",
+"S$    c #9A98E9",
+"T$    c #9193E4",
+"U$    c #8D92E1",
+"V$    c #7C7CD6",
+"W$    c #7174CD",
+"X$    c #4D4C8E",
+"Y$    c #2E2F54",
+"Z$    c #6F73CA",
+"`$    c #6F71C9",
+" %    c #7D7ED6",
+".%    c #8284D9",
+"+%    c #8B8EE1",
+"@%    c #8E92E0",
+"#%    c #9093E4",
+"$%    c #9899E8",
+"%%    c #9B9CEA",
+"&%    c #996666",
+"*%    c #333333",
+"=%    c #8C91E2",
+"-%    c #8C8DE0",
+";%    c #979AE6",
+">%    c #8085D8",
+",%    c #444444",
+"'%    c #6D70C9",
+")%    c #53549A",
+"!%    c #2D2C4F",
+"~%    c #676ABA",
+"{%    c #7778D1",
+"]%    c #7A7BD4",
+"^%    c #8180D7",
+"/%    c #8586DA",
+"(%    c #8888DC",
+"_%    c #336666",
+":%    c #8283DA",
+"<%    c #8384D8",
+"[%    c #7D80D8",
+"}%    c #6064BA",
+"|%    c #5C5EA5",
+"1%    c #7276CE",
+"2%    c #7679D3",
+"3%    c #7A7ED5",
+"4%    c #8989DA",
+"5%    c #663366",
+"6%    c #585BAA",
+"7%    c #4F5091",
+"8%    c #494980",
+"9%    c #484D8F",
+"0%    c #56589B",
+"a%    c #6467BF",
+"b%    c #6868C2",
+"c%    c #7376D0",
+"d%    c #7578D1",
+"e%    c #8889D7",
+"f%    c #7074CC",
+"g%    c #6F73CC",
+"h%    c #8B8CA4",
+"i%    c #484B7F",
+"j%    c #494C80",
+"k%    c #474882",
+"l%    c #484B84",
+"m%    c #6366C0",
+"n%    c #6565BE",
+"o%    c #676BC3",
+"p%    c #696DC5",
+"q%    c #6B6DC6",
+"r%    c #7173CB",
+"s%    c #7272C8",
+"t%    c #6C6EC6",
+"u%    c #00CC00",
+"v%    c #AFB0BA",
+"w%    c #3E416D",
+"x%    c #4A4B83",
+"y%    c #505092",
+"z%    c #5D60B3",
+"A%    c #6263BC",
+"B%    c #6767C0",
+"C%    c #6A6EC6",
+"D%    c #FD0000",
+"E%    c #42426E",
+"F%    c #424270",
+"G%    c #444782",
+"H%    c #3A3B6E",
+"I%    c #454580",
+"J%    c #5F61BB",
+"K%    c #6365BF",
+"L%    c #FFCC00",
+"M%    c #808190",
+"N%    c #212039",
+"O%    c #42437B",
+"P%    c #4E5191",
+"Q%    c #353864",
+"R%    c #4D5096",
+"S%    c #6062BC",
+"T%    c #FF6600",
+"U%    c #666699",
+"V%    c #CC6600",
+"W%    c #ACAFBC",
+"X%    c #4B4C86",
+"Y%    c #5459A9",
+"Z%    c #4E5294",
+"`%    c #404271",
+" &    c #343663",
+".&    c #5C5EB4",
+"+&    c #5E62BD",
+"@&    c #FFCC99",
+"#&    c #333366",
+"$&    c #6A6B90",
+"%&    c #3E3F69",
+"&&    c #38375F",
+"*&    c #343256",
+"=&    c #2B2A4C",
+"-&    c #3D407A",
+";&    c #5C5EB7",
+">&    c #336633",
+",&    c #282948",
+"'&    c #222240",
+")&    c #42487E",
+"!&    c #313258",
+"~&    c #272749",
+"{&    c #454887",
+"]&    c #663333",
+"^&    c #87889D",
+"/&    c #323256",
+"(&    c #4D4D88",
+"_&    c #323458",
+":&    c #434476",
+"<&    c #393A68",
+"[&    c #4E4E95",
+"}&    c #5C5FB8",
+"|&    c #5A5FB9",
+"1&    c #EEEEEE",
+"2&    c #222222",
+"3&    c #626484",
+"4&    c #333459",
+"5&    c #252645",
+"6&    c #484A88",
+"7&    c #4D4E94",
+"8&    c #3E4073",
+"9&    c #3D3E75",
+"0&    c #5A5EB7",
+"a&    c #34345D",
+"b&    c #191A30",
+"c&    c #36365E",
+"d&    c #4A4A88",
+"e&    c #313056",
+"f&    c #30305D",
+"g&    c #5255A3",
+"h&    c #ADAFBA",
+"i&    c #292B4C",
+"j&    c #18172B",
+"k&    c #333456",
+"l&    c #38385F",
+"m&    c #232240",
+"n&    c #34335C",
+"o&    c #2F3258",
+"p&    c #666633",
+"q&    c #ACAFB9",
+"r&    c #2E2E52",
+"s&    c #12101F",
+"t&    c #1C1B33",
+"u&    c #0E0E1A",
+"v&    c #5857A5",
+"w&    c #50529F",
+"x&    c #515369",
+"y&    c #0D0E1C",
+"z&    c #0E0E1C",
+"A&    c #3C3D6E",
+"B&    c #4A4F8E",
+"C&    c #5759B0",
+"D&    c #60607F",
+"E&    c #18182C",
+"F&    c #292A49",
+"G&    c #3C3C68",
+"H&    c #CC3300",
+"I&    c #ACAEB6",
+"J&    c #55566D",
+"K&    c #131528",
+"L&    c #141221",
+"M&    c #660000",
+"N&    c #990000",
+"O&    c #AAAEB6",
+"P&    c #32335B",
+"Q&    c #181A30",
+"R&    c #161324",
+"S&    c #090911",
+"T&    c #10101D",
+"U&    c #252946",
+"V&    c #8E8EA8",
+"W&    c #8A8BA0",
+"X&    c #868A9E",
+"Y&    c #848698",
+"Z&    c #838698",
+"`&    c #83879A",
+" *    c #89889D",
+".*    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                          . + @ + #                                                                 ",
+"                  $ % & * = - ; - > , ' ) ! ~ { ] ^ / ( _ : < [                                     ",
+"                } | 1 2 3 4 5 6 7 6 8 9 > 0 a b c d e f g h i j k l m                               ",
+"            n o 2 p q 2 r s 2 t u u u u v w x y z A B C D E F G H I J K L                           ",
+"          M N O P 2 2 2 2 Q Q u u u u u u u R S T U V W X Y Z `  ...+.@.#.$.%.                      ",
+"        &.*.=.-.;.Q Q >.,.2 '.).8 u u u u u u R !.3 ~.~ {.].^./.(._.:.<.[.}.|.1.                    ",
+"        2.3.4.2 2 2 5.u 4.Q 2 2 6.u u u u u u u 7.8.).9.0.a.b.c.d.e.f.g.h.i.j.k.l.                  ",
+"      ).m.n.& o.p 2 p.u q.2 Q -.r.u u u u u u u s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.                ",
+"      K.L.M.3.' N.2 2 O.P.2 Q.u u & * u u u u u u R.S.T.U.V.W.X.Y.Z.d.`. +.+++@+#+$+%+              ",
+"      &+*+=+3.0 2 '.-+Q ;+;+2 >++ 2 3 u u u u u u R ,+'+)+!+~+{+]+^+/+(+_+ +:+<+[+}+|+1+            ",
+"      2+o - 3+4+5+n.; Q u o 2 p q 2 r s 2 t u u u R 6+1 7+8+9+0+a+b+c+d+e+D.f+g+h+i+j+k+l+          ",
+"      8.m+n+3.o+u u u p+u O P 2 2 2 2 Q Q u u u u q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+          ",
+"      K+L+M+N+O+P+u u 4.u -.;.Q Q >.,.2 '.).8 u 6 Q+R+S+T+U+V+W+X+z.^.Y+Z+`+ @.@+@@@#@$@%@&@        ",
+"        *@t.=@-@;@6 u u 4.2 2 2 5.u 4.Q 2 2 6.u # >@,@'@)@!@~@{@]@^@^+/./@e+ +(@_@:@<@[@}@|@        ",
+"        1@2@t 3@4@>+u u u o.p 2 p.u q.2 Q -.r.@ 5@& 6@7@)@8@~@9@0@a@a@a@Z+C+ +b@+@_@c@d@e@f@g@      ",
+"        h@i@j@t k@l@m@6 u u N.2 2 O.P.2 Q.6 n@;.o@p@6@q@r@s@v.t@u@a@v@v@a@a@w@x@y@_@z@A@B@C@D@      ",
+"        E@F@G@4.r.H@I@8 u 0 2 '.-+Q ;+;+2 J@I@o+K@L@M@N@)@O@P@Q@R@a@S@S@v@v@a@a@_@T@U@V@W@X@Y@      ",
+"      Z@`@ #.#+#m@z @#) + 4+5+n.; Q 8.##$#O %#&#*#=#-#;#>#,#'#)#a@S@!#!#S@S@v@~#a@a@{#]#^#/#(#_#    ",
+"      :#<#[#}#|#1#2#3#4#;@' 5#P+u p+n@- 6#7#8#9#0#a#b#c#d#e#f#g#a@S@!#h#!#!#S@S@~#~#a@a@i#j#k#l#    ",
+"      m#n#o#p#q#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#V.N#a@S@!#h#h#h#!#!#S@S@~#~#a@a@O#P#    ",
+"      Q#R#S#C@T#U#V#W#X#Y#K#'+Z#`# $.$+$@$#$$$%$&$*$=$-$;$>$,$a@S@!#h#h#h#h#h#h#!#!#S@S@~#~#a@a@    ",
+"      '$)$!$~${$]$^$/$($_$:$K#<$[$}$|$1$2$3$4$5$6$7$8$9$0$9@'$a@S@!#h#h#h#h#h#h#h#h#!#!#S@S@~#~#a@  ",
+"      a$b$c$d$e$f$g$h$i$j$k$!@l$m$n$o$p$q$r$S+s$t$u$v$w$Q@x$y$a@S@!#h#h#h#h#h#h#h#h#h#h#!#!#q$q$a@  ",
+"      z$A$B$C$D$^+y+E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$!+i$V$a@S@!#h#h#h#h#h#h#h#h#h#h#h#h#h#~#q$a@  ",
+"      b+W$X$Y$Z$c+`$y+g$ %.%+%@%#%u+$%%%q$q$&%*%=%-%;%i$>%y.a@S@!#h#h#h#h#h#h#h#h#h#h#h#h#~#q$,%a@  ",
+"      '%^@)%!%~%/+/.A.z.{%]%^%/%(%W#H$q$O.A#L._%a@:%<%[% %x$a@S@!#h#h#h#h#h#h#h#h#h#h#h#h#~#q$,%a@  ",
+"      }%Y+#@C@|%A+/.k.^+b+1%2%3%^%4%q$O.O.O.A#L.5%a@]@]@ %a@S@!#h#h#h#h#h#h#h#h#h#h#h#h#h#~#q$,%a@  ",
+"      6%7%8%9%0%C.a%Y+b%z+`$Y.c%d%e%q$A#O.O.A#L.q$a@f%b.g%a@S@~#~#~#h#h#h#h#h#h#h#h#h#h#~#q$,%a@    ",
+"      h%i%j%k%l%m%C+n%o%A+p%q%^+r%W$L.L.A#O.A#L.*%a@s%B.t%~#a@~#u%~#~#~#h#h#h#h#h#h#h#h#~#q$,%a@    ",
+"      v%B@w%x%y%z%A%D.C+B%] b%Y+C%/+q$q$L.L.L.q$*%a@Z.a@a@,%- - D%~#~#~#~#~#h#h#h#h#h#h#~#q$,%a@    ",
+"        E%F%G%H%I%J%D.A%`+K%B%C.o%q$L%q$q$q$*%q$q$a@a@- ~#~#,%,%- - ~#~#~#~#~#~#h#h#h#~#q$,%a@      ",
+"        M%N%O%P%Q%R%.@.@S%`+C+`+L.A#L%T%q$q$U%q$V%*%*%~#I@q$~#~#,%,%- - ~#~#~#~#~#~#h#~#q$,%a@      ",
+"        W%X%Y%Z%`% &.&+&.@.@S%S%L.@&O.O.T%T%T%V%V%V%L%#&q$~#I@q$~#~#,%,%- - ~#S@~#~#~#~#q$,%a@      ",
+"          $&%&&&*&=&-&;&T@.@_@.@L.@&O.O.O.O.L%L%L%L%T%>&~#- q$~#I@q$~#~#,%,%- - ~#S@~#q$,%a@        ",
+"            ,&'&)&!&~&{&+@T@_@T@L.@&@&@&O.O.O.O.L%T%V%]&!#!#~#- q$~#I@q$~#~#,%,%- - ~#q$a@a@        ",
+"            ^&/&(&_&:&<&[&}&_@|&L.@&L%@&@&@&O.O.T%T%V%_%1&u !#~#~#I@q$~#I@q$~#~#,%,%- a@2&,%,%      ",
+"              3&4&5&6&7&8&9&0&_@L.@&L%L%@&@&@&@&T%T%V%*%- - S@!#I@q$~#I@q$~#I@q$~#~#,%,%a@2&,%,%    ",
+"                a&b&c&@.d&e&f&g&L.@&L%L%L%@&@&@&T%V%V%#&S@!#!#~#~#~#I@q$~#I@q$~#~#~#S@S@a@2&2&,%    ",
+"                h&i&j&k&l&m&n&o&L.@&L%L%L%L%L%@&T%V%V%p&!#S@~#~#~#~#~#~#I@q$~#~#S@S@,%,%a@2&,%,%    ",
+"                  q&r&s&t&u&v&w&L.@&L%L%L%L%L%L%T%V%V%*%- - ~#~#~#~#~#~#~#~#S@S@,%,%a@a@2&,%,%      ",
+"                      x&y&z&A&B&C&L.@&L%L%L%L%L%T%V%V%#&q$q$- - ~#~#~#~#S@S@,%,%a@a@2&2&,%          ",
+"                        D&j&E&F&G&L.@&L%L%L%L%L%T%H&*%a@q$q$q$q$- - S@S@,%,%a@a@2&2&,%              ",
+"                          I&J&K&L&L.@&L%M&L%L%L%N&H&p&S@a@a@q$q$q$q$,%,%a@a@2&2&,%                  ",
+"                              O&P&L.@&L%N&L%L%M&N&V%#&Q&R&S@a@a@q$q$a@a@2&2&,%                      ",
+"                                  L.@&L%N&L%L%T%T%V%*%S&T&E&U&S@a@a@2&2&,%                          ",
+"                                          V&W&X&Y&Z&`& *.*Z@      ,%,%                              ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.bmp
new file mode 100644 (file)
index 0000000..9ed8250
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_ProcessingCT.xpm
new file mode 100644 (file)
index 0000000..078829c
--- /dev/null
@@ -0,0 +1,921 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_ProcessingCT_xpm[] = {
+"50 50 868 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #000000",
+"y.    c #4D5098",
+"z.    c #32335C",
+"A.    c #474B86",
+"B.    c #6768BF",
+"C.    c #6C6CC5",
+"D.    c #7576B5",
+"E.    c #9498D7",
+"F.    c #8588DC",
+"G.    c #7378CD",
+"H.    c #3F3F72",
+"I.    c #373961",
+"J.    c #8484C4",
+"K.    c #A4A4EC",
+"L.    c #AFB0F2",
+"M.    c #BCBCF6",
+"N.    c #C2C2F6",
+"O.    c #C5C4F6",
+"P.    c #C4C4F7",
+"Q.    c #C0C1F5",
+"R.    c #BDBEF6",
+"S.    c #BBBBF5",
+"T.    c #6262BB",
+"U.    c #5357A8",
+"V.    c #42437C",
+"W.    c #525196",
+"X.    c #5F60B6",
+"Y.    c #6263BB",
+"Z.    c #7878BB",
+"`.    c #BBBED0",
+" +    c #878BDF",
+".+    c #666AC2",
+"++    c #55549F",
+"@+    c #40406B",
+"#+    c #8A8CD0",
+"$+    c #B1B2F1",
+"%+    c #BAB9F4",
+"&+    c #C4C2F6",
+"*+    c #C9C8F6",
+"=+    c #CBCDF9",
+"-+    c #CCCEF8",
+";+    c #CECDF8",
+">+    c #C9C8F7",
+",+    c #C6C6F6",
+"'+    c #FFFFFF",
+")+    c #6464BE",
+"!+    c #5A5AAF",
+"~+    c #444884",
+"{+    c #50529D",
+"]+    c #54539D",
+"^+    c #5656A4",
+"/+    c #AEAEB9",
+"(+    c #B3B3C6",
+"_+    c #888ADD",
+":+    c #7F81D6",
+"<+    c #5C5EAD",
+"[+    c #4B4B7E",
+"}+    c #8A8ACA",
+"|+    c #A3A2EB",
+"1+    c #AEADF0",
+"2+    c #C2C2F5",
+"3+    c #CDCCF8",
+"4+    c #D0D1F9",
+"5+    c #D6D6FA",
+"6+    c #DADCFC",
+"7+    c #D8D7FC",
+"8+    c #D3D2FA",
+"9+    c #CECEF9",
+"0+    c #6264BE",
+"a+    c #6163BD",
+"b+    c #6161BA",
+"c+    c #595BAD",
+"d+    c #42457F",
+"e+    c #4E529B",
+"f+    c #4F508F",
+"g+    c #4F4F8E",
+"h+    c #B4B5C8",
+"i+    c #8586C8",
+"j+    c #7A7DD4",
+"k+    c #696AC2",
+"l+    c #3C3C6A",
+"m+    c #7879B8",
+"n+    c #A09FE9",
+"o+    c #A8A8F0",
+"p+    c #B6B6F3",
+"q+    c #C9CAF8",
+"r+    c #D0D2F9",
+"s+    c #D9D9FC",
+"t+    c #DCDEFC",
+"u+    c #E0E0FA",
+"v+    c #DCE0FB",
+"w+    c #DCDCFC",
+"x+    c #D3D3FA",
+"y+    c #6868C0",
+"z+    c #6464BD",
+"A+    c #6061B9",
+"B+    c #5F5FB8",
+"C+    c #5C5BAE",
+"D+    c #302F52",
+"E+    c #4E5090",
+"F+    c #4E4E88",
+"G+    c #70709F",
+"H+    c #7679D1",
+"I+    c #515396",
+"J+    c #46467E",
+"K+    c #515385",
+"L+    c #9796E3",
+"M+    c #A1A2EC",
+"N+    c #ACACF1",
+"O+    c #C7C7F7",
+"P+    c #D1D0F8",
+"Q+    c #D9DAFB",
+"R+    c #E0E0FB",
+"S+    c #E4E3FA",
+"T+    c #E7E5FA",
+"U+    c #E6E8FC",
+"V+    c #E1E2FB",
+"W+    c #DADDFC",
+"X+    c #6668C1",
+"Y+    c #6364BC",
+"Z+    c #5E62BC",
+"`+    c #5D61BC",
+" @    c #5C60BB",
+".@    c #41407C",
+"+@    c #454677",
+"@@    c #4A4A7C",
+"#@    c #484876",
+"$@    c #AFB1C0",
+"%@    c #6669C1",
+"&@    c #5B5DAE",
+"*@    c #343660",
+"=@    c #393C65",
+"-@    c #8A8DD8",
+";@    c #9798E6",
+">@    c #A1A4EE",
+",@    c #B0B0F1",
+"'@    c #BEBEF6",
+")@    c #C8C9F7",
+"!@    c #D2D1F9",
+"~@    c #DBDDFB",
+"{@    c #E5E4FA",
+"]@    c #E6EAFC",
+"^@    c #E9ECFC",
+"/@    c #EAEAFB",
+"(@    c #E7E4FA",
+"_@    c #DEE0FA",
+":@    c #6468C2",
+"<@    c #5D5FB8",
+"[@    c #5C60BA",
+"}@    c #5A5BAF",
+"|@    c #37375E",
+"1@    c #4D508E",
+"2@    c #4A4882",
+"3@    c #9396C1",
+"4@    c #5B5DB2",
+"5@    c #484C8D",
+"6@    c #2D2F54",
+"7@    c #6A6AA8",
+"8@    c #9290E0",
+"9@    c #9899E7",
+"0@    c #A4A4ED",
+"a@    c #B2B4F3",
+"b@    c #BEC0F5",
+"c@    c #C9CAF7",
+"d@    c #D4D3F8",
+"e@    c #DDE0FC",
+"f@    c #E6E6FB",
+"g@    c #EBEAFC",
+"h@    c #EAEBFC",
+"i@    c #E9ECFD",
+"j@    c #E7E7FB",
+"k@    c #DFE0FB",
+"l@    c #6060B8",
+"m@    c #464782",
+"n@    c #4A4A81",
+"o@    c #4D4E8A",
+"p@    c #3E3D67",
+"q@    c #9797C0",
+"r@    c #7A7AB6",
+"s@    c #5A5AAA",
+"t@    c #4C4C8B",
+"u@    c #797BC3",
+"v@    c #9090E1",
+"w@    c #B3B2F4",
+"x@    c #BEBEF4",
+"y@    c #CCCAF8",
+"z@    c #666666",
+"A@    c #996666",
+"B@    c #333333",
+"C@    c #EAECFC",
+"D@    c #E7E7FC",
+"E@    c #6769C1",
+"F@    c #5D62BB",
+"G@    c #5E60BA",
+"H@    c #5A5EB9",
+"I@    c #5055A5",
+"J@    c #3C3D66",
+"K@    c #4B4C81",
+"L@    c #3A3B64",
+"M@    c #6D6D99",
+"N@    c #4C4F90",
+"O@    c #505396",
+"P@    c #34345A",
+"Q@    c #3E406C",
+"R@    c #7D7ECC",
+"S@    c #8D8EE1",
+"T@    c #9496E6",
+"U@    c #A0A2ED",
+"V@    c #ADAFF2",
+"W@    c #BCBDF4",
+"X@    c #FFFFCC",
+"Y@    c #CCCCCC",
+"Z@    c #999999",
+"`@    c #336666",
+" #    c #E8E7FA",
+".#    c #686AC2",
+"+#    c #6063BC",
+"@#    c #5B5FBA",
+"##    c #5D5FB9",
+"$#    c #3B3A6B",
+"%#    c #3F4271",
+"&#    c #40416C",
+"*#    c #3B3867",
+"=#    c #9091AF",
+"-#    c #505297",
+";#    c #4C4D8C",
+">#    c #464680",
+",#    c #48487A",
+"'#    c #7F82D2",
+")#    c #8A8DE0",
+"!#    c #9796E4",
+"~#    c #9FA0EA",
+"{#    c #AEAEF2",
+"]#    c #663366",
+"^#    c #E4E3FB",
+"/#    c #DADBFA",
+"(#    c #6162BA",
+"_#    c #5E60B9",
+":#    c #4B4B8E",
+"<#    c #373661",
+"[#    c #323358",
+"}#    c #1C1A2D",
+"|#    c #9898C4",
+"1#    c #62648A",
+"2#    c #414077",
+"3#    c #5858A9",
+"4#    c #3E4274",
+"5#    c #676BB3",
+"6#    c #8184D6",
+"7#    c #878ADC",
+"8#    c #9294E5",
+"9#    c #9C9DE8",
+"0#    c #AAABF0",
+"a#    c #E0E1FA",
+"b#    c #DADBFB",
+"c#    c #D5D4F9",
+"d#    c #CCCEF7",
+"e#    c #C0C2F6",
+"f#    c #A0A1EB",
+"g#    c #9796E6",
+"h#    c #898DDE",
+"i#    c #8184D8",
+"j#    c #777AD2",
+"k#    c #7174CD",
+"l#    c #6A6EC7",
+"m#    c #686CC4",
+"n#    c #6266BF",
+"o#    c #5F61BB",
+"p#    c #5E5EB6",
+"q#    c #31335E",
+"r#    c #2A2E50",
+"s#    c #232440",
+"t#    c #7474A8",
+"u#    c #6D6FC7",
+"v#    c #5C5D99",
+"w#    c #232546",
+"x#    c #21213B",
+"y#    c #7576C6",
+"z#    c #8181D6",
+"A#    c #8588DB",
+"B#    c #8E90E0",
+"C#    c #9898E6",
+"D#    c #D6D5FA",
+"E#    c #D6D6F9",
+"F#    c #CDCEF8",
+"G#    c #6666BF",
+"H#    c #6062BA",
+"I#    c #5E5FBA",
+"J#    c #4B4A86",
+"K#    c #272849",
+"L#    c #4A4A8B",
+"M#    c #767AD1",
+"N#    c #7F82D8",
+"O#    c #5B5CAA",
+"P#    c #787ACD",
+"Q#    c #7B7CD4",
+"R#    c #8084DA",
+"S#    c #8A8ADE",
+"T#    c #9296E6",
+"U#    c #999DE9",
+"V#    c #CECEF7",
+"W#    c #C3C3F6",
+"X#    c #6565BE",
+"Y#    c #6062BC",
+"Z#    c #5D60B9",
+"`#    c #46457D",
+" $    c #45487D",
+".$    c #262544",
+"+$    c #3F3F79",
+"@$    c #7C7FD6",
+"#$    c #6969C0",
+"$$    c #4A4C8C",
+"%$    c #373864",
+"&$    c #7579D0",
+"*$    c #797AD3",
+"=$    c #7C7FD8",
+"-$    c #8484D9",
+";$    c #8C8EE0",
+">$    c #FFCC00",
+",$    c #BEC0F6",
+"'$    c #BBBEF5",
+")$    c #B8B8F5",
+"!$    c #414276",
+"~$    c #46477F",
+"{$    c #2C2C4D",
+"]$    c #39386E",
+"^$    c #6D70CB",
+"/$    c #4A4988",
+"($    c #2E3055",
+"_$    c #7274CC",
+":$    c #7375CD",
+"<$    c #7578D0",
+"[$    c #7E7FD6",
+"}$    c #FF6600",
+"|$    c #666699",
+"1$    c #CC6600",
+"2$    c #B2B2F2",
+"3$    c #AEAEF0",
+"4$    c #6061BA",
+"5$    c #5F60B8",
+"6$    c #404175",
+"7$    c #44467A",
+"8$    c #232442",
+"9$    c #323264",
+"0$    c #6367C0",
+"a$    c #656AC2",
+"b$    c #424475",
+"c$    c #2D2E51",
+"d$    c #7274CB",
+"e$    c #6D71CA",
+"f$    c #7275CE",
+"g$    c #777AD4",
+"h$    c #FFCC99",
+"i$    c #333366",
+"j$    c #6264BC",
+"k$    c #6060B9",
+"l$    c #3B3C6E",
+"m$    c #121222",
+"n$    c #2F2E5B",
+"o$    c #7073CC",
+"p$    c #4D4C8E",
+"q$    c #2E2F54",
+"r$    c #6F73CA",
+"s$    c #6A6CC6",
+"t$    c #6F71C9",
+"u$    c #336633",
+"v$    c #9093E2",
+"w$    c #3E4074",
+"x$    c #292A4A",
+"y$    c #12101E",
+"z$    c #6D70C9",
+"A$    c #7477D0",
+"B$    c #53549A",
+"C$    c #2D2C4F",
+"D$    c #676ABA",
+"E$    c #6A6CC5",
+"F$    c #6E71CA",
+"G$    c #663333",
+"H$    c #8889DC",
+"I$    c #6363BC",
+"J$    c #5E62BD",
+"K$    c #3D3D6D",
+"L$    c #222342",
+"M$    c #101121",
+"N$    c #38366D",
+"O$    c #6064BA",
+"P$    c #5C5EA5",
+"Q$    c #8083D9",
+"R$    c #5F63BE",
+"S$    c #5F62BB",
+"T$    c #5A5AAB",
+"U$    c #383A65",
+"V$    c #262645",
+"W$    c #0F101E",
+"X$    c #424380",
+"Y$    c #585BAA",
+"Z$    c #4F5091",
+"`$    c #494980",
+" %    c #484D8F",
+".%    c #56589B",
+"+%    c #6567C0",
+"@%    c #6467BF",
+"#%    c #767AD2",
+"$%    c #5F64BD",
+"%%    c #5E60B8",
+"&%    c #494C8E",
+"*%    c #353358",
+"=%    c #1E1D36",
+"-%    c #09080F",
+";%    c #595AA4",
+">%    c #8B8CA4",
+",%    c #484B7F",
+"'%    c #494C80",
+")%    c #474882",
+"!%    c #484B84",
+"~%    c #6366C0",
+"{%    c #6F73CC",
+"]%    c #7272C8",
+"^%    c #6A6CC4",
+"/%    c #6C6EC6",
+"(%    c #6467C1",
+"_%    c #6164BF",
+":%    c #6465BE",
+"<%    c #5F62BA",
+"[%    c #5B5EB6",
+"}%    c #3B3C66",
+"|%    c #2D2E52",
+"1%    c #131220",
+"2%    c #9294BE",
+"3%    c #AFB0BA",
+"4%    c #3E416D",
+"5%    c #4A4B83",
+"6%    c #5D60B3",
+"7%    c #6263BC",
+"8%    c #666633",
+"9%    c #5F63BC",
+"0%    c #4C4D95",
+"a%    c #333258",
+"b%    c #282849",
+"c%    c #0B0C18",
+"d%    c #28284A",
+"e%    c #B2B4C8",
+"f%    c #42426E",
+"g%    c #424270",
+"h%    c #444782",
+"i%    c #3A3B6E",
+"j%    c #454580",
+"k%    c #696DC6",
+"l%    c #6463BA",
+"m%    c #333767",
+"n%    c #262746",
+"o%    c #1D1C32",
+"p%    c #08060C",
+"q%    c #464683",
+"r%    c #808190",
+"s%    c #212039",
+"t%    c #42437B",
+"u%    c #4E5191",
+"v%    c #353864",
+"w%    c #4D5096",
+"x%    c #6064BE",
+"y%    c #4A4A8E",
+"z%    c #19172B",
+"A%    c #19172A",
+"B%    c #0C0B15",
+"C%    c #131221",
+"D%    c #9394BA",
+"E%    c #ACAFBC",
+"F%    c #4B4C86",
+"G%    c #5459A9",
+"H%    c #4E5294",
+"I%    c #404271",
+"J%    c #343663",
+"K%    c #5C5EB4",
+"L%    c #CC3300",
+"M%    c #6668C0",
+"N%    c #5A5EB2",
+"O%    c #242443",
+"P%    c #414470",
+"Q%    c #1C1C33",
+"R%    c #07040A",
+"S%    c #343462",
+"T%    c #6A6B90",
+"U%    c #3E3F69",
+"V%    c #38375F",
+"W%    c #343256",
+"X%    c #2B2A4C",
+"Y%    c #3D407A",
+"Z%    c #5C5EB7",
+"`%    c #660000",
+" &    c #990000",
+".&    c #6365BE",
+"+&    c #6164B9",
+"@&    c #302F5A",
+"#&    c #252645",
+"$&    c #242442",
+"%&    c #0A0912",
+"&&    c #120F1E",
+"*&    c #7676B2",
+"=&    c #282948",
+"-&    c #222240",
+";&    c #42487E",
+">&    c #313258",
+",&    c #272749",
+"'&    c #454887",
+")&    c #6063BD",
+"!&    c #6869BE",
+"~&    c #454684",
+"{&    c #393A63",
+"]&    c #0B0B15",
+"^&    c #3B3D70",
+"/&    c #87889D",
+"(&    c #323256",
+"_&    c #4D4D88",
+":&    c #323458",
+"<&    c #434476",
+"[&    c #393A68",
+"}&    c #4E4E95",
+"|&    c #5C5FB8",
+"1&    c #5A5FB9",
+"2&    c #6267BA",
+"3&    c #444580",
+"4&    c #484A7C",
+"5&    c #141526",
+"6&    c #22253F",
+"7&    c #9295BC",
+"8&    c #626484",
+"9&    c #333459",
+"0&    c #484A88",
+"a&    c #4D4E94",
+"b&    c #3E4073",
+"c&    c #3D3E75",
+"d&    c #5A5EB7",
+"e&    c #5A5EB8",
+"f&    c #5A5CAE",
+"g&    c #30315D",
+"h&    c #3D406D",
+"i&    c #4C4E86",
+"j&    c #242542",
+"k&    c #07050C",
+"l&    c #101223",
+"m&    c #6B6EA0",
+"n&    c #34345D",
+"o&    c #191A30",
+"p&    c #36365E",
+"q&    c #4A4A88",
+"r&    c #313056",
+"s&    c #30305D",
+"t&    c #5255A3",
+"u&    c #2B2C52",
+"v&    c #3A3C6B",
+"w&    c #444876",
+"x&    c #2E2E50",
+"y&    c #0C0912",
+"z&    c #0D0B16",
+"A&    c #494986",
+"B&    c #ADAFBA",
+"C&    c #292B4C",
+"D&    c #18172B",
+"E&    c #333456",
+"F&    c #38385F",
+"G&    c #232240",
+"H&    c #34335C",
+"I&    c #2F3258",
+"J&    c #3E3E74",
+"K&    c #585CB1",
+"L&    c #5C5EB8",
+"M&    c #6265BD",
+"N&    c #5E60B6",
+"O&    c #444684",
+"P&    c #2C2E52",
+"Q&    c #2C2A4A",
+"R&    c #424474",
+"S&    c #232543",
+"T&    c #0C0C16",
+"U&    c #0E0D19",
+"V&    c #43447A",
+"W&    c #ACAFB9",
+"X&    c #2E2E52",
+"Y&    c #12101F",
+"Z&    c #1C1B33",
+"`&    c #0E0E1A",
+" *    c #5857A5",
+".*    c #50529F",
+"+*    c #444783",
+"@*    c #373863",
+"#*    c #42427B",
+"$*    c #474A8E",
+"%*    c #52529E",
+"&*    c #595BB0",
+"**    c #6262BC",
+"=*    c #6062BB",
+"-*    c #575EB2",
+";*    c #3C3F76",
+">*    c #2F3056",
+",*    c #383965",
+"'*    c #35365C",
+")*    c #262644",
+"!*    c #12101C",
+"~*    c #0A060C",
+"{*    c #0F101C",
+"]*    c #424479",
+"^*    c #B0B3C6",
+"/*    c #515369",
+"(*    c #0D0E1C",
+"_*    c #0E0E1C",
+":*    c #3C3D6E",
+"<*    c #4A4F8E",
+"[*    c #5759B0",
+"}*    c #5558AB",
+"|*    c #4E5094",
+"1*    c #363764",
+"2*    c #3C3B6E",
+"3*    c #3B3E77",
+"4*    c #3F407C",
+"5*    c #3B3D73",
+"6*    c #3A3A6E",
+"7*    c #383A6F",
+"8*    c #3B3B70",
+"9*    c #3C3B70",
+"0*    c #3A3B6D",
+"a*    c #34355E",
+"b*    c #454680",
+"c*    c #4E5095",
+"d*    c #474C8A",
+"e*    c #18172D",
+"f*    c #090A13",
+"g*    c #161728",
+"h*    c #64668E",
+"i*    c #60607F",
+"j*    c #18182C",
+"k*    c #292A49",
+"l*    c #3C3C68",
+"m*    c #464882",
+"n*    c #545BAF",
+"o*    c #50529A",
+"p*    c #3B3E6B",
+"q*    c #2F3158",
+"r*    c #363760",
+"s*    c #383860",
+"t*    c #303358",
+"u*    c #414272",
+"v*    c #46487E",
+"w*    c #4C4A7E",
+"x*    c #4D5091",
+"y*    c #383962",
+"z*    c #0A060E",
+"A*    c #0B0A12",
+"B*    c #262745",
+"C*    c #7070A4",
+"D*    c #ACAEB6",
+"E*    c #55566D",
+"F*    c #131528",
+"G*    c #141221",
+"H*    c #1B1B32",
+"I*    c #2F2F4F",
+"J*    c #303054",
+"K*    c #292847",
+"L*    c #323257",
+"M*    c #393960",
+"N*    c #393A62",
+"O*    c #3D3E69",
+"P*    c #4C4E8E",
+"Q*    c #4A4B8A",
+"R*    c #52539A",
+"S*    c #3C4070",
+"T*    c #343459",
+"U*    c #20213B",
+"V*    c #110F1C",
+"W*    c #08070E",
+"X*    c #1E2038",
+"Y*    c #616386",
+"Z*    c #ADB1C2",
+"`*    c #AAAEB6",
+" =    c #32335B",
+".=    c #19182C",
+"+=    c #0F0E1B",
+"@=    c #0A0A15",
+"#=    c #0F0F1B",
+"$=    c #121223",
+"%=    c #1A1B34",
+"&=    c #131223",
+"*=    c #141527",
+"==    c #181A30",
+"-=    c #161324",
+";=    c #0F0D19",
+">=    c #080810",
+",=    c #0B080F",
+"'=    c #0D0C18",
+")=    c #20223B",
+"!=    c #444379",
+"~=    c #AEB0BC",
+"{=    c #ADAEB8",
+"]=    c #848394",
+"^=    c #2E3054",
+"/=    c #1E1E36",
+"(=    c #0B0D19",
+"_=    c #0A080E",
+":=    c #08050A",
+"<=    c #09070D",
+"[=    c #090911",
+"}=    c #10101D",
+"|=    c #252946",
+"1=    c #373A69",
+"2=    c #8A8CA2",
+"3=    c #B0B0C0",
+"4=    c #8E8EA8",
+"5=    c #8A8BA0",
+"6=    c #868A9E",
+"7=    c #848698",
+"8=    c #838698",
+"9=    c #83879A",
+"0=    c #89889D",
+"a=    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.x.x.x.x.x.x.x.x.x.x.x.y.z.A.B.C.D.                ",
+"                E.F.G.H.I.J.K.L.s.M.N.O.P.Q.R.S.x.x.x.x.x.x.x.x.x.x.x.x.T.U.V.W.X.Y.Z.              ",
+"              `. +.+++@+#+K.$+%+&+*+=+-+;+;+>+,+x.x.x.x.x.x.x.'+'+x.x.x.)+T.!+~+{+]+^+/+            ",
+"            (+_+:+<+[+}+|+1+%+2+3+4+5+6+7+7+8+9+x.'+x.x.x.x.x.'+'+x.x.x.0+a+b+c+d+e+f+g+h+          ",
+"            i+j+k+l+m+n+o+p+N.q+r+s+t+u+u+v+w+x+x.'+'+x.x.x.x.x.'+'+x.x.y+z+A+B+C+D+E+F+G+          ",
+"          {.H+I+J+K+L+M+N+%+O+P+Q+R+S+T+U+S+V+W+x.x.x.x.x.x.x.x.x.x.x.x.X+Y+Z+`+ @.@+@@@#@$@        ",
+"          %@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@^@(@_@x.x.x.x.x.x.x.x.x.x.x.x.:@0+T.<@[@}@|@1@[+2@        ",
+"        3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@h@i@j@k@x.x.x.'+x.x.'+'+'+x.x.x.X+z+T.l@ @[@m@n@o@p@q@      ",
+"        r@s@t@: u@v@9@o.w@x@y@z@z@A@B@i@h@C@D@k@x.x.'+'+x.x.'+'+x.x.x.x.E@z+F@G@H@[@I@J@K@L@M@      ",
+"        N@O@P@Q@R@S@T@U@V@W@z@X@Y@Z@`@x.h@h@ #k@x.x.x.x.x.x.x.'+x.x.x.x..#)++# @[@@###$#%#&#*#      ",
+"      =#-#;#>#,#'#)#!#~#{#z@'+'+'+Y@Z@]#x.D@^#/#x.x.x.x.x.x.x.x.x.x.x.x.f.Y+(#l@[@@#_#:#<#[#}#|#    ",
+"      1#2#3#4#5#6#7#8#9#0#z@Y@'+'+Y@Z@z@x.a#b#c#d#e#%+1+f#g#h#i#j#k#l#m#n#a+`+o#[@[@@#p#q#r#s#t#    ",
+"      u#v#w#x#y#z#A#B#C#K.Z@Z@Y@'+Y@Z@B@x.D#E#F#x.x.x.x.x.x.x.x.x.x.x.x.G#Y+H#[@[@ @@#I#J#;#K#L#    ",
+"      M#N#O#L@P#Q#R#S#T#U#z@z@Z@Z@Z@z@B@x.V#*+W#x.x.x.x.x.x.x.x.x.x.x.x.X#Y#G@Z#@#@# @ @`# $.$+$    ",
+"      @$#$$$%$&$*$=$-$;$z@>$z@z@z@B@z@z@,$,$'$)$x.x.x.x.x.x.x.'+'+x.x.x.a+T.[@[@[@H@[@G@!$~${$]$    ",
+"      ^$H#/$($_$:$<$[$Z@Y@>$}$z@z@|$z@1$B@B@2$3$x.x.x.x.x.x.x.'+'+'+x.x.0+4$4$[@[@[@ @5$6$7$8$9$    ",
+"      0$a$b$c$d$e$f$g$Z@h$'+'+}$}$}$1$1$1$>$i$M+x.x.x.x.x.x.x.x.'+x.x.x.j$[@@#[@[@[@@#k$l$[#m$n$    ",
+"      o$k#p$q$r$s$t$f$Z@h$X@X@'+'+>$>$>$>$}$u$v$x.x.x.x.x.x.x.x.x.x.x.x.4$G@[@[@[@[@Z#Y#w$x$y$9$    ",
+"      z$A$B$C$D$E$-.F$Z@h$h$h$X@X@'+X@>$}$1$G$H$x.x.x.x.x.x.x.x.x.x.x.x.I$[@[@[@[@[@A+J$K$L$M$N$    ",
+"      O$m#+@L@P$.#-.g.Z@h$>$h$h$h$X@X@}$}$1$`@Q$x.x.x.x.x.x.x.x.x.x.x.x.R$I$[@[@[@S$T.T$U$V$W$X$    ",
+"      Y$Z$`$ %.%+%@%m#Z@h$>$>$h$h$h$h$}$}$1$B@#%x.x.x.x.x.x.x.x.x.x.x.x. @Y#$%[@[@%%a+&%*%=%-%;%    ",
+"      >%,%'%)%!%~%z+X#Z@h$>$>$>$h$h$h$}$1$1$i$u {%=.]%^%/%0.(%X#_%Y+Y#@#H@H@:%<%S$T.[%}%|%W$1%2%    ",
+"      3%K@4%5%~ 6%7%a+Z@h$>$>$>$>$>$h$}$1$1$8%s$x.x.x.x.x.x.x.x.x.x.x.x.`+@#Z+9%S$a+0%a%b%c%d%e%    ",
+"        f%g%h%i%j%o#a+Z@h$>$>$>$>$>$>$}$1$1$B@k%x.x.x.x.x.x.x.x.x.x.x.x.H@[@<@f.z+l%m%n%o%p%q%      ",
+"        r%s%t%u%v%w%`+`+Z@h$>$>$>$>$>$}$1$1$i$z+x.x.x.x.x.x.x.x.x.x.x.x.@#`+(#f.x%y%z%A%B%C%D%      ",
+"        E%F%G%H%I%J%K%J$Z@h$>$>$>$>$>$}$L%B@a+Y+x.x.x.x.x.x.x.'+'+x.x.x.G@G@Y#M%N%O%P%Q%R%S%R       ",
+"          T%U%V%W%X%Y%Z%Z@h$>$`%>$>$>$ &L%8%Z+`+x.x.x.x.x.x.x.'+'+'+x.x.`+T..&+&@&#&$&%&&&*&        ",
+"            =&-&;&>&,&'&Z@h$>$ &>$>$`% &1$i$@#_#x.x.x.x.x.x.x.'+'+x.x.x.)&Y+!&~&{&$&]&p%^&          ",
+"            /&(&_&:&<&[&}&|&[@1&[@`+[@[@H@@#[@H@x.x.x.x.x.x.x.x.x.x.x.x.a+2&3&{&4&5&p%6&7&          ",
+"              8&9&#&0&a&b&c&d&[@H@e& @1&[@[@[@[@x.x.x.x.x.x.x.x.x.x.x.x.f&g&h&i&j&k&l&m&            ",
+"                n&o&p&O q&r&s&t&`+[@[@[@[@[@[@[@x.x.x.x.x.x.x.x.x.x.x.x.u&v&w&x&y&z&A&              ",
+"                B&C&D&E&F&G&H&I&J&K&L&<@[@[@Z#`+[@S$4$S$A+M&x%z+7%N&O&P&Q&R&S&T&U&V&5               ",
+"                  W&X&Y&Z&`& *.*+*@*#*$*%*&*<@**o#=*)&7%a+Y#-*'&;*>*,*'*)*!*~*{*]*^*                ",
+"                      /*(*_*:*<*[*}*|*_.1*2*3*4*5*6*7*8*9*0*a*b*c*d*d%e*f*R%g*h*                    ",
+"                        i*D&j*k*l*m*n*o*h&p*q*r*s*t*u*i v*w*x*E+y*D+z*-%A*B*C*                      ",
+"                          D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*y*T*U*V*p%W*X*Y*Z*                        ",
+"                              `* =.=+=y&@=#=$=%=&=*=Q%==-=;=>=,='=)=!=~=                            ",
+"                                  {=]=^=/=Y&(=_=:=p%<=[=}=j*|=1=2=3=                                ",
+"                                          4=5=6=7=8=9=0=a==#                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.bmp
new file mode 100644 (file)
index 0000000..2a70b24
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_Quantification.xpm
new file mode 100644 (file)
index 0000000..c64217a
--- /dev/null
@@ -0,0 +1,948 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_Quantification_xpm[] = {
+"50 50 895 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #BAB9F4",
+"}+    c #C4C2F6",
+"|+    c #C9C8F6",
+"1+    c #CBCDF9",
+"2+    c #CCCEF8",
+"3+    c #CECDF8",
+"4+    c #C9C8F7",
+"5+    c #C6C6F6",
+"6+    c #BEBDF6",
+"7+    c #B5B6F2",
+"8+    c #ABAAF0",
+"9+    c #8A8EDF",
+"0+    c #8184DC",
+"a+    c #993399",
+"b+    c #7476D0",
+"c+    c #6D71CA",
+"d+    c #6A6CC5",
+"e+    c #6464BE",
+"f+    c #5A5AAF",
+"g+    c #444884",
+"h+    c #50529D",
+"i+    c #54539D",
+"j+    c #5656A4",
+"k+    c #AEAEB9",
+"l+    c #B3B3C6",
+"m+    c #888ADD",
+"n+    c #7F81D6",
+"o+    c #5C5EAD",
+"p+    c #4B4B7E",
+"q+    c #8A8ACA",
+"r+    c #A3A2EB",
+"s+    c #AEADF0",
+"t+    c #333333",
+"u+    c #CDCCF8",
+"v+    c #D0D1F9",
+"w+    c #D6D6FA",
+"x+    c #DADCFC",
+"y+    c #D8D7FC",
+"z+    c #D3D2FA",
+"A+    c #CECEF9",
+"B+    c #CC3300",
+"C+    c #9E9DEA",
+"D+    c #9194E2",
+"E+    c #898ADD",
+"F+    c #787AD2",
+"G+    c #7073CC",
+"H+    c #6A6CC6",
+"I+    c #686AC3",
+"J+    c #6264BE",
+"K+    c #996699",
+"L+    c #595BAD",
+"M+    c #42457F",
+"N+    c #4E529B",
+"O+    c #4F508F",
+"P+    c #4F4F8E",
+"Q+    c #B4B5C8",
+"R+    c #8586C8",
+"S+    c #7A7DD4",
+"T+    c #696AC2",
+"U+    c #3C3C6A",
+"V+    c #7879B8",
+"W+    c #A09FE9",
+"X+    c #A8A8F0",
+"Y+    c #B6B6F3",
+"Z+    c #000000",
+"`+    c #D9D9FC",
+" @    c #DCDEFC",
+".@    c #E0E0FA",
+"+@    c #DCE0FB",
+"@@    c #DCDCFC",
+"#@    c #D3D3FA",
+"$@    c #CCCCF7",
+"%@    c #A0A2EB",
+"&@    c #888CE1",
+"*@    c #7275CE",
+"=@    c #6B6FC8",
+"-@    c #686AC2",
+";@    c #5F5FB8",
+">@    c #5C5BAE",
+",@    c #302F52",
+"'@    c #4E5090",
+")@    c #4E4E88",
+"!@    c #70709F",
+"~@    c #7679D1",
+"{@    c #515396",
+"]@    c #46467E",
+"^@    c #515385",
+"/@    c #9796E3",
+"(@    c #A1A2EC",
+"_@    c #ACACF1",
+":@    c #E4E3FA",
+"<@    c #E7E5FA",
+"[@    c #E6E8FC",
+"}@    c #E1E2FB",
+"|@    c #DADDFC",
+"1@    c #A7A6ED",
+"2@    c #9B9EE8",
+"3@    c #8D8EE0",
+"4@    c #6364BC",
+"5@    c #5E62BC",
+"6@    c #5D61BC",
+"7@    c #5C60BB",
+"8@    c #41407C",
+"9@    c #454677",
+"0@    c #4A4A7C",
+"a@    c #484876",
+"b@    c #AFB1C0",
+"c@    c #6669C1",
+"d@    c #5B5DAE",
+"e@    c #343660",
+"f@    c #393C65",
+"g@    c #8A8DD8",
+"h@    c #9798E6",
+"i@    c #A1A4EE",
+"j@    c #B0B0F1",
+"k@    c #BEBEF6",
+"l@    c #E9ECFC",
+"m@    c #E7E4FA",
+"n@    c #B8B8F4",
+"o@    c #A8A9F0",
+"p@    c #9B9CE9",
+"q@    c #9092E2",
+"r@    c #CC0099",
+"s@    c #6468C2",
+"t@    c #5D5FB8",
+"u@    c #5C60BA",
+"v@    c #5A5BAF",
+"w@    c #37375E",
+"x@    c #4D508E",
+"y@    c #4A4882",
+"z@    c #9396C1",
+"A@    c #5B5DB2",
+"B@    c #484C8D",
+"C@    c #2D2F54",
+"D@    c #6A6AA8",
+"E@    c #9290E0",
+"F@    c #A4A4ED",
+"G@    c #B2B4F3",
+"H@    c #BEC0F5",
+"I@    c #666666",
+"J@    c #E7E7FB",
+"K@    c #DFE0FB",
+"L@    c #DAD9FB",
+"M@    c #C4C4F5",
+"N@    c #B6B7F4",
+"O@    c #990099",
+"P@    c #6E72CA",
+"Q@    c #464782",
+"R@    c #4A4A81",
+"S@    c #4D4E8A",
+"T@    c #3E3D67",
+"U@    c #9797C0",
+"V@    c #7A7AB6",
+"W@    c #5A5AAA",
+"X@    c #4C4C8B",
+"Y@    c #797BC3",
+"Z@    c #9090E1",
+"`@    c #B3B2F4",
+" #    c #BEBEF4",
+".#    c #CCCAF8",
+"+#    c #D9D8FA",
+"@#    c #CFCFF8",
+"##    c #B8B8F3",
+"$#    c #8487DD",
+"%#    c #6F72CC",
+"&#    c #999999",
+"*#    c #CC9966",
+"=#    c #5A5EB9",
+"-#    c #5055A5",
+";#    c #3C3D66",
+">#    c #4B4C81",
+",#    c #3A3B64",
+"'#    c #6D6D99",
+")#    c #4C4F90",
+"!#    c #505396",
+"~#    c #34345A",
+"{#    c #3E406C",
+"]#    c #7D7ECC",
+"^#    c #8D8EE1",
+"/#    c #9496E6",
+"(#    c #A0A2ED",
+"_#    c #ADAFF2",
+":#    c #BCBDF4",
+"<#    c #C9CAF7",
+"[#    c #CCCDF8",
+"}#    c #9C9CE9",
+"|#    c #8E8FE1",
+"1#    c #8589DD",
+"2#    c #CC9999",
+"3#    c #5B5FBA",
+"4#    c #5D5FB9",
+"5#    c #3B3A6B",
+"6#    c #3F4271",
+"7#    c #40416C",
+"8#    c #3B3867",
+"9#    c #9091AF",
+"0#    c #505297",
+"a#    c #4C4D8C",
+"b#    c #464680",
+"c#    c #48487A",
+"d#    c #7F82D2",
+"e#    c #8A8DE0",
+"f#    c #9796E4",
+"g#    c #AEAEF2",
+"h#    c #BABBF6",
+"i#    c #B3B2F2",
+"j#    c #CC6699",
+"k#    c #CCCC99",
+"l#    c #999966",
+"m#    c #6060B8",
+"n#    c #5E60B9",
+"o#    c #4B4B8E",
+"p#    c #373661",
+"q#    c #323358",
+"r#    c #1C1A2D",
+"s#    c #9898C4",
+"t#    c #62648A",
+"u#    c #414077",
+"v#    c #5858A9",
+"w#    c #3E4274",
+"x#    c #676BB3",
+"y#    c #8184D6",
+"z#    c #878ADC",
+"A#    c #9294E5",
+"B#    c #9C9DE8",
+"C#    c #AAABF0",
+"D#    c #B6B5F3",
+"E#    c #C2C0F5",
+"F#    c #996666",
+"G#    c #5F61BB",
+"H#    c #5E5EB6",
+"I#    c #31335E",
+"J#    c #2A2E50",
+"K#    c #232440",
+"L#    c #7474A8",
+"M#    c #6D6FC7",
+"N#    c #5C5D99",
+"O#    c #232546",
+"P#    c #21213B",
+"Q#    c #7576C6",
+"R#    c #8181D6",
+"S#    c #8588DB",
+"T#    c #8E90E0",
+"U#    c #9898E6",
+"V#    c #AEAFF1",
+"W#    c #FF9966",
+"X#    c #6062BA",
+"Y#    c #5E5FBA",
+"Z#    c #4B4A86",
+"`#    c #272849",
+" $    c #4A4A8B",
+".$    c #767AD1",
+"+$    c #7F82D8",
+"@$    c #5B5CAA",
+"#$    c #787ACD",
+"$$    c #7B7CD4",
+"%$    c #8084DA",
+"&$    c #8A8ADE",
+"*$    c #9296E6",
+"=$    c #999DE9",
+"-$    c #A4A6EE",
+";$    c #6565BE",
+">$    c #6062BC",
+",$    c #5E60BA",
+"'$    c #5D60B9",
+")$    c #46457D",
+"!$    c #45487D",
+"~$    c #262544",
+"{$    c #3F3F79",
+"]$    c #7C7FD6",
+"^$    c #6969C0",
+"/$    c #4A4C8C",
+"($    c #373864",
+"_$    c #7579D0",
+":$    c #797AD3",
+"<$    c #7C7FD8",
+"[$    c #8484D9",
+"}$    c #8C8EE0",
+"|$    c #8488DC",
+"1$    c #6767C0",
+"2$    c #414276",
+"3$    c #46477F",
+"4$    c #2C2C4D",
+"5$    c #39386E",
+"6$    c #6D70CB",
+"7$    c #4A4988",
+"8$    c #2E3055",
+"9$    c #7274CC",
+"0$    c #7375CD",
+"a$    c #7578D0",
+"b$    c #7E7FD6",
+"c$    c #8587DC",
+"d$    c #8E8FE2",
+"e$    c #663333",
+"f$    c #7F81D7",
+"g$    c #777AD2",
+"h$    c #6568C2",
+"i$    c #6061BA",
+"j$    c #5F60B8",
+"k$    c #404175",
+"l$    c #44467A",
+"m$    c #232442",
+"n$    c #323264",
+"o$    c #6367C0",
+"p$    c #656AC2",
+"q$    c #424475",
+"r$    c #2D2E51",
+"s$    c #7274CB",
+"t$    c #777AD4",
+"u$    c #8083D7",
+"v$    c #8688DB",
+"w$    c #9093E2",
+"x$    c #333300",
+"y$    c #7C7CD6",
+"z$    c #7478D0",
+"A$    c #686CC6",
+"B$    c #6666BF",
+"C$    c #6264BC",
+"D$    c #6060B9",
+"E$    c #3B3C6E",
+"F$    c #121222",
+"G$    c #2F2E5B",
+"H$    c #7174CD",
+"I$    c #4D4C8E",
+"J$    c #2E2F54",
+"K$    c #6F73CA",
+"L$    c #6F71C9",
+"M$    c #7D7ED6",
+"N$    c #8B8EE1",
+"O$    c #666633",
+"P$    c #8085D8",
+"Q$    c #3E4074",
+"R$    c #292A4A",
+"S$    c #12101E",
+"T$    c #6D70C9",
+"U$    c #7477D0",
+"V$    c #53549A",
+"W$    c #2D2C4F",
+"X$    c #676ABA",
+"Y$    c #993366",
+"Z$    c #6061B9",
+"`$    c #5E62BD",
+" %    c #3D3D6D",
+".%    c #222342",
+"+%    c #101121",
+"@%    c #38366D",
+"#%    c #6064BA",
+"$%    c #686CC4",
+"%%    c #5C5EA5",
+"&%    c #330000",
+"*%    c #330033",
+"=%    c #990066",
+"-%    c #7A7BD4",
+";%    c #6E72CB",
+">%    c #666AC3",
+",%    c #6164BC",
+"'%    c #5F63BE",
+")%    c #5F62BB",
+"!%    c #5A5AAB",
+"~%    c #383A65",
+"{%    c #262645",
+"]%    c #0F101E",
+"^%    c #424380",
+"/%    c #585BAA",
+"(%    c #4F5091",
+"_%    c #494980",
+":%    c #484D8F",
+"<%    c #56589B",
+"[%    c #6467BF",
+"}%    c #6868C2",
+"|%    c #7071CA",
+"1%    c #5E61BA",
+"2%    c #5E60B8",
+"3%    c #494C8E",
+"4%    c #353358",
+"5%    c #1E1D36",
+"6%    c #09080F",
+"7%    c #595AA4",
+"8%    c #8B8CA4",
+"9%    c #484B7F",
+"0%    c #494C80",
+"a%    c #474882",
+"b%    c #484B84",
+"c%    c #6366C0",
+"d%    c #6464BD",
+"e%    c #676BC3",
+"f%    c #660066",
+"g%    c #6467C1",
+"h%    c #6164BF",
+"i%    c #6465BE",
+"j%    c #5F62BA",
+"k%    c #5B5EB6",
+"l%    c #3B3C66",
+"m%    c #2D2E52",
+"n%    c #131220",
+"o%    c #9294BE",
+"p%    c #AFB0BA",
+"q%    c #3E416D",
+"r%    c #4A4B83",
+"s%    c #5D60B3",
+"t%    c #6263BC",
+"u%    c #6466C0",
+"v%    c #5F63BC",
+"w%    c #4C4D95",
+"x%    c #333258",
+"y%    c #282849",
+"z%    c #0B0C18",
+"A%    c #28284A",
+"B%    c #B2B4C8",
+"C%    c #42426E",
+"D%    c #424270",
+"E%    c #444782",
+"F%    c #3A3B6E",
+"G%    c #454580",
+"H%    c #6064BE",
+"I%    c #5C61BA",
+"J%    c #6463BA",
+"K%    c #333767",
+"L%    c #262746",
+"M%    c #1D1C32",
+"N%    c #08060C",
+"O%    c #464683",
+"P%    c #808190",
+"Q%    c #212039",
+"R%    c #42437B",
+"S%    c #4E5191",
+"T%    c #353864",
+"U%    c #4D5096",
+"V%    c #4A4A8E",
+"W%    c #19172B",
+"X%    c #19172A",
+"Y%    c #0C0B15",
+"Z%    c #131221",
+"`%    c #9394BA",
+" &    c #ACAFBC",
+".&    c #4B4C86",
+"+&    c #5459A9",
+"@&    c #4E5294",
+"#&    c #404271",
+"$&    c #343663",
+"%&    c #5C5EB4",
+"&&    c #6262BC",
+"*&    c #6668C0",
+"=&    c #5A5EB2",
+"-&    c #242443",
+";&    c #414470",
+">&    c #1C1C33",
+",&    c #07040A",
+"'&    c #343462",
+")&    c #6A6B90",
+"!&    c #3E3F69",
+"~&    c #38375F",
+"{&    c #343256",
+"]&    c #2B2A4C",
+"^&    c #3D407A",
+"/&    c #5C5EB7",
+"(&    c #6365BE",
+"_&    c #6164B9",
+":&    c #302F5A",
+"<&    c #252645",
+"[&    c #242442",
+"}&    c #0A0912",
+"|&    c #120F1E",
+"1&    c #7676B2",
+"2&    c #282948",
+"3&    c #222240",
+"4&    c #42487E",
+"5&    c #313258",
+"6&    c #272749",
+"7&    c #454887",
+"8&    c #5B60BA",
+"9&    c #5F64BD",
+"0&    c #6063BD",
+"a&    c #6869BE",
+"b&    c #454684",
+"c&    c #393A63",
+"d&    c #0B0B15",
+"e&    c #3B3D70",
+"f&    c #87889D",
+"g&    c #323256",
+"h&    c #4D4D88",
+"i&    c #323458",
+"j&    c #434476",
+"k&    c #393A68",
+"l&    c #4E4E95",
+"m&    c #5C5FB8",
+"n&    c #5A5FB9",
+"o&    c #5A5EB8",
+"p&    c #6267BA",
+"q&    c #444580",
+"r&    c #484A7C",
+"s&    c #141526",
+"t&    c #22253F",
+"u&    c #9295BC",
+"v&    c #626484",
+"w&    c #333459",
+"x&    c #484A88",
+"y&    c #4D4E94",
+"z&    c #3E4073",
+"A&    c #3D3E75",
+"B&    c #5A5EB7",
+"C&    c #6064BD",
+"D&    c #5A5CAE",
+"E&    c #30315D",
+"F&    c #3D406D",
+"G&    c #4C4E86",
+"H&    c #242542",
+"I&    c #07050C",
+"J&    c #101223",
+"K&    c #6B6EA0",
+"L&    c #34345D",
+"M&    c #191A30",
+"N&    c #36365E",
+"O&    c #4A4A88",
+"P&    c #313056",
+"Q&    c #30305D",
+"R&    c #5255A3",
+"S&    c #6064BF",
+"T&    c #6668C1",
+"U&    c #6366BE",
+"V&    c #4E5196",
+"W&    c #2B2C52",
+"X&    c #3A3C6B",
+"Y&    c #444876",
+"Z&    c #2E2E50",
+"`&    c #0C0912",
+" *    c #0D0B16",
+".*    c #494986",
+"+*    c #ADAFBA",
+"@*    c #292B4C",
+"#*    c #18172B",
+"$*    c #333456",
+"%*    c #38385F",
+"&*    c #232240",
+"**    c #34335C",
+"=*    c #2F3258",
+"-*    c #3E3E74",
+";*    c #585CB1",
+">*    c #5C5EB8",
+",*    c #6265BD",
+"'*    c #5E60B6",
+")*    c #444684",
+"!*    c #2C2E52",
+"~*    c #2C2A4A",
+"{*    c #424474",
+"]*    c #232543",
+"^*    c #0C0C16",
+"/*    c #0E0D19",
+"(*    c #43447A",
+"_*    c #ACAFB9",
+":*    c #2E2E52",
+"<*    c #12101F",
+"[*    c #1C1B33",
+"}*    c #0E0E1A",
+"|*    c #5857A5",
+"1*    c #50529F",
+"2*    c #444783",
+"3*    c #373863",
+"4*    c #42427B",
+"5*    c #474A8E",
+"6*    c #52529E",
+"7*    c #595BB0",
+"8*    c #6062BB",
+"9*    c #575EB2",
+"0*    c #3C3F76",
+"a*    c #2F3056",
+"b*    c #383965",
+"c*    c #35365C",
+"d*    c #262644",
+"e*    c #12101C",
+"f*    c #0A060C",
+"g*    c #0F101C",
+"h*    c #424479",
+"i*    c #B0B3C6",
+"j*    c #515369",
+"k*    c #0D0E1C",
+"l*    c #0E0E1C",
+"m*    c #3C3D6E",
+"n*    c #4A4F8E",
+"o*    c #5759B0",
+"p*    c #5558AB",
+"q*    c #4E5094",
+"r*    c #363764",
+"s*    c #3C3B6E",
+"t*    c #3B3E77",
+"u*    c #3F407C",
+"v*    c #3B3D73",
+"w*    c #3A3A6E",
+"x*    c #383A6F",
+"y*    c #3B3B70",
+"z*    c #3C3B70",
+"A*    c #3A3B6D",
+"B*    c #34355E",
+"C*    c #454680",
+"D*    c #4E5095",
+"E*    c #474C8A",
+"F*    c #18172D",
+"G*    c #090A13",
+"H*    c #161728",
+"I*    c #64668E",
+"J*    c #60607F",
+"K*    c #18182C",
+"L*    c #292A49",
+"M*    c #3C3C68",
+"N*    c #464882",
+"O*    c #545BAF",
+"P*    c #50529A",
+"Q*    c #3B3E6B",
+"R*    c #2F3158",
+"S*    c #363760",
+"T*    c #383860",
+"U*    c #303358",
+"V*    c #414272",
+"W*    c #46487E",
+"X*    c #4C4A7E",
+"Y*    c #4D5091",
+"Z*    c #383962",
+"`*    c #0A060E",
+" =    c #0B0A12",
+".=    c #262745",
+"+=    c #7070A4",
+"@=    c #ACAEB6",
+"#=    c #55566D",
+"$=    c #131528",
+"%=    c #141221",
+"&=    c #1B1B32",
+"*=    c #2F2F4F",
+"==    c #303054",
+"-=    c #292847",
+";=    c #323257",
+">=    c #393960",
+",=    c #393A62",
+"'=    c #3D3E69",
+")=    c #4C4E8E",
+"!=    c #4A4B8A",
+"~=    c #52539A",
+"{=    c #3C4070",
+"]=    c #343459",
+"^=    c #20213B",
+"/=    c #110F1C",
+"(=    c #08070E",
+"_=    c #1E2038",
+":=    c #616386",
+"<=    c #ADB1C2",
+"[=    c #AAAEB6",
+"}=    c #32335B",
+"|=    c #19182C",
+"1=    c #0F0E1B",
+"2=    c #0A0A15",
+"3=    c #0F0F1B",
+"4=    c #121223",
+"5=    c #1A1B34",
+"6=    c #131223",
+"7=    c #141527",
+"8=    c #181A30",
+"9=    c #161324",
+"0=    c #0F0D19",
+"a=    c #080810",
+"b=    c #0B080F",
+"c=    c #0D0C18",
+"d=    c #20223B",
+"e=    c #444379",
+"f=    c #AEB0BC",
+"g=    c #ADAEB8",
+"h=    c #848394",
+"i=    c #2E3054",
+"j=    c #1E1E36",
+"k=    c #0B0D19",
+"l=    c #0A080E",
+"m=    c #08050A",
+"n=    c #09070D",
+"o=    c #090911",
+"p=    c #10101D",
+"q=    c #252946",
+"r=    c #373A69",
+"s=    c #8A8CA2",
+"t=    c #B0B0C0",
+"u=    c #8E8EA8",
+"v=    c #8A8BA0",
+"w=    c #868A9E",
+"x=    c #848698",
+"y=    c #838698",
+"z=    c #83879A",
+"A=    c #89889D",
+"B=    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+3+3+4+5+6+7+8+y.z.9+0+a+b+c+d+/+e+>+f+g+h+i+j+k+            ",
+"            l+m+n+o+p+q+r+s+t+t+u+v+w+x+y+y+z+A+B+B+B+B+C+D+E+a+F+G+H+I+J+K+a+L+M+N+O+P+Q+          ",
+"            R+S+T+U+V+W+X+Y+t+Z+t+`+ @.@.@+@@@#@$@B+B+B+%@5.&@a+K+*@=@-@K+a+K+;@>@,@'@)@!@          ",
+"          {.~@{@]@^@/@(@_@[+t+Z+Z+Z+:@<@[@:@}@|@B+B+B+B+1@2@3@a+a+D.a+a+a+4@5@6@7@8@9@0@a@b@        ",
+"          c@d@e@f@g@h@i@j@k@t+Z+Z+Z+Z+Z+t+l@m@B+`+3+Y.n@o@p@q@a+r@K+c+-.s@J+>+t@u@v@w@x@p+y@        ",
+"        z@A@B@C@D@E@#+F@G@H@I@Z+Z+Z+Z+Z+Z+Z+J@K@L@A+M@N@o@a+a+a+O@D.P@I@I@I@I@Z+7@u@Q@R@S@T@U@      ",
+"        V@W@X@: Y@Z@#+o.`@ #.#Z+Z+Z+Z+Z+Z+Z+Z+t++#@#M@##a+a+K+$#a+I@%#&#&#*#*#Z+=#u@-#;#>#,#'#      ",
+"        )#!#~#{#]#^#/#(#_#:#<#Z+Z+Z+Z+Z+Z+Z+Z+Z+t+[#a+a+a+}#|#1#a+&#2#2#*#*#2#Z+u@3#4#5#6#7#8#      ",
+"      9#0#a#b#c#d#e#f#y.g#h#5+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+t+i#I@I@&#&#j#2#2#k#k#l#I@m#u@3#n#o#p#q#r#s#    ",
+"      t#u#v#w#x#y#z#A#B#C#D#E#Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+t+I@F#&#2#2#2#2#2#&#&#I@6@G#u@u@3#H#I#J#K#L#    ",
+"      M#N#O#P#Q#R#S#T#U#U.V#[+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+t+&#&#2#W#2#2#&#&#F#I@4@X#u@u@7@3#Y#Z#a#`# $    ",
+"      .$+$@$,##$$$%$&$*$=$-$s+Z+Z+Z+Z+Z+Z+Z+Z+t+Z+t+I@2#*#W#2#&#&#F#I@I@;$>$,$'$3#3#7@7@)$!$~${$    ",
+"      ]$^$/$($_$:$<$[$}$a+a+a+t+Z+Z+Z+Z+t+I@l#2#W#*#*#&#&#|$I@I@G+a+I+1$H.>+u@u@u@=#u@,$2$3$4$5$    ",
+"      6$X#7$8$9$0$a$b$c$d$a+K+t+Z+Z+Z+Z+t+l#*#W#*#F#I@e$I@f$g$*@P@a+h$J+J+i$i$u@u@u@7@j$k$l$m$n$    ",
+"      o$p$q$r$s$c+*@t$u$v$a+w$t+Z+Z+Z+Z+x$*#*#&#I@t+Z+t+c$y$z$P@A$a+B$>$C$u@3#u@u@u@3#D$E$q#F$G$    ",
+"      G+H$I$J$K$H+L$*@a$M$r@N$t+Z+Z+Z+Z+Z+O$F#I@x$Z+Z+Z+P$C.9$K+a+O@a+K+i$,$u@u@u@u@'$>$Q$R$S$n$    ",
+"      T$U$V$W$X$d+-.E.D.I@Y$I@t+Z+Z+Z+Z+Z+Z+t+x$Z+Z+Z+Z+M$K+a+a+a+K+a+a+a+u@u@u@u@u@Z$`$ %.%+%@%    ",
+"      #%$%9@,#%%-@-.g.c+k#k#&#t+Z+Z+Z+Z+Z+Z+Z+Z+&%*%=%O@a+-%;%H+>%;$,%6@'%a+a+u@u@)%>+!%~%{%]%^%    ",
+"      /%(%_%:%<%G.[%$%}%k#2#l#I@Z+Z+Z+Z+Z+Z+Z+*%O@=%*%Z+t+|%g.-@G.;$1%,$7@>$K+u@u@2%H.3%4%5%6%7%    ",
+"      8%9%0%a%b%c%d%;$e%&#F#I@I@Z+Z+Z+Z+*%f%O@O@*%Z+Z+Z+t+0.g%;$h%4@>$3#=#=#i%j%)%>+k%l%m%]%n%o%    ",
+"      p%>#q%r%~ s%t%H.d%I@a+}%I@Z+Z+Z+*%O@f%*%Z+Z+Z+Z+Z+Z+u%4@>$,%d%6@3#6@3#5@v%)%H.w%x%y%z%A%B%    ",
+"        C%D%E%F%G%G#H.t%4@r@K+a+O@f%*%Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+u%H.H%4@d%I%3#=#u@t@f.d%J%K%L%M%N%O%      ",
+"        P%Q%R%S%T%U%6@6@a+r@O@a+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+'%d%4@>$,%u@u@3#K+a+f.H%V%W%X%Y%Z%`%      ",
+"         &.&+&@&#&$&%&`$a+r@K+>$t+t+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+5@>$&&>$K+K+a+a+a+a+*&=&-&;&>&,&'&R       ",
+"          )&!&~&{&]&^&/&3#r@u@6@`$6@6@5@I@t+t+Z+Z+Z+Z+Z+Z+6@u@K+a+a+a+a+K+>+(&_&:&<&[&}&|&1&        ",
+"            2&3&4&5&6&7&7@3#u@3#D$)%i$i$)%`$3#n#n#7@G#`$3#u@8&7@u@u@)%9&0&4@a&b&c&[&d&N%e&          ",
+"            f&g&h&i&j&k&l&m&u@n&u@6@u@u@=#3#u@=#u@3#6@H.u@u@o&u@6@i$>$t%H.p&q&c&r&s&N%t&u&          ",
+"              v&w&<&x&y&z&A&B&u@=#o&7@n&u@u@u@u@u@3#n&7@J+C&,$,$,$>+J+;$D&E&F&G&H&I&J&K&            ",
+"                L&M&N&O O&P&Q&R&6@u@u@u@u@u@u@u@u@u@3#u@)%S&u%B$/+T&U&V&W&X&Y&Z&`& *.*              ",
+"                +*@*#*$*%*&***=*-*;*>*t@u@u@'$6@u@)%i$)%Z$,*H%d%t%'*)*!*~*{*]*^*/*(*5               ",
+"                  _*:*<*[*}*|*1*2*3*4*5*6*7*t@&&G#8*0&t%H.>$9*7&0*a*b*c*d*e*f*g*h*i*                ",
+"                      j*k*l*m*n*o*p*q*_.r*s*t*u*v*w*x*y*z*A*B*C*D*E*A%F*G*,&H*I*                    ",
+"                        J*#*K*L*M*N*O*P*F&Q*R*S*T*U*V*i W*X*Y*'@Z*,@`*6% =.=+=                      ",
+"                          @=#=$=%=&=*===-=;=>=,='=)=!=~={=Z*]=^=/=N%(=_=:=<=                        ",
+"                              [=}=|=1=`&2=3=4=5=6=7=>&8=9=0=a=b=c=d=e=f=                            ",
+"                                  g=h=i=j=<*k=l=m=N%n=o=p=K*q=r=s=t=                                ",
+"                                          u=v=w=x=y=z=A=B=9#                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.bmp
new file mode 100644 (file)
index 0000000..858ac29
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_STLFormat.xpm
new file mode 100644 (file)
index 0000000..f160947
--- /dev/null
@@ -0,0 +1,915 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_STLFormat_xpm[] = {
+"50 50 862 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #FFFD41",
+"*+    c #6466BF",
+"=+    c #6262BB",
+"-+    c #5357A8",
+";+    c #42437C",
+">+    c #525196",
+",+    c #5F60B6",
+"'+    c #6263BB",
+")+    c #7878BB",
+"!+    c #BBBED0",
+"~+    c #878BDF",
+"{+    c #666AC2",
+"]+    c #55549F",
+"^+    c #40406B",
+"/+    c #8A8CD0",
+"(+    c #B1B2F1",
+"_+    c #BAB9F4",
+":+    c #C4C2F6",
+"<+    c #C9C8F6",
+"[+    c #CBCDF9",
+"}+    c #CCCEF8",
+"|+    c #CECDF8",
+"1+    c #C9C8F7",
+"2+    c #C6C6F6",
+"3+    c #BEBDF6",
+"4+    c #B5B6F2",
+"5+    c #6A6CC5",
+"6+    c #6464BE",
+"7+    c #5A5AAF",
+"8+    c #444884",
+"9+    c #50529D",
+"0+    c #54539D",
+"a+    c #5656A4",
+"b+    c #AEAEB9",
+"c+    c #B3B3C6",
+"d+    c #888ADD",
+"e+    c #7F81D6",
+"f+    c #5C5EAD",
+"g+    c #4B4B7E",
+"h+    c #8A8ACA",
+"i+    c #A3A2EB",
+"j+    c #AEADF0",
+"k+    c #C2C2F5",
+"l+    c #CDCCF8",
+"m+    c #D0D1F9",
+"n+    c #D6D6FA",
+"o+    c #DADCFC",
+"p+    c #D8D7FC",
+"q+    c #D3D2FA",
+"r+    c #CECEF9",
+"s+    c #454545",
+"t+    c #000000",
+"u+    c #1A1A1A",
+"v+    c #6264BE",
+"w+    c #6161BA",
+"x+    c #595BAD",
+"y+    c #42457F",
+"z+    c #4E529B",
+"A+    c #4F508F",
+"B+    c #4F4F8E",
+"C+    c #B4B5C8",
+"D+    c #8586C8",
+"E+    c #7A7DD4",
+"F+    c #696AC2",
+"G+    c #3C3C6A",
+"H+    c #7879B8",
+"I+    c #A09FE9",
+"J+    c #E0DE3C",
+"K+    c #E0E0FA",
+"L+    c #DCE0FB",
+"M+    c #333333",
+"N+    c #6B6B6B",
+"O+    c #6868C0",
+"P+    c #6464BD",
+"Q+    c #6061B9",
+"R+    c #5F5FB8",
+"S+    c #5C5BAE",
+"T+    c #302F52",
+"U+    c #4E5090",
+"V+    c #4E4E88",
+"W+    c #70709F",
+"X+    c #7679D1",
+"Y+    c #515396",
+"Z+    c #46467E",
+"`+    c #515385",
+" @    c #9796E3",
+".@    c #A1A2EC",
+"+@    c #2E2E2E",
+"@@    c #6364BC",
+"#@    c #5E62BC",
+"$@    c #5D61BC",
+"%@    c #5C60BB",
+"&@    c #41407C",
+"*@    c #454677",
+"=@    c #4A4A7C",
+"-@    c #484876",
+";@    c #AFB1C0",
+">@    c #6669C1",
+",@    c #5B5DAE",
+"'@    c #343660",
+")@    c #393C65",
+"!@    c #8A8DD8",
+"~@    c #9798E6",
+"{@    c #A1A4EE",
+"]@    c #B3B3B3",
+"^@    c #5D5FB8",
+"/@    c #5C60BA",
+"(@    c #5A5BAF",
+"_@    c #37375E",
+":@    c #4D508E",
+"<@    c #4A4882",
+"[@    c #9396C1",
+"}@    c #5B5DB2",
+"|@    c #484C8D",
+"1@    c #2D2F54",
+"2@    c #6A6AA8",
+"3@    c #9290E0",
+"4@    c #A4A4ED",
+"5@    c #3D3D3D",
+"6@    c #8488DC",
+"7@    c #7E7ED4",
+"8@    c #CDCDE1",
+"9@    c #6060B8",
+"0@    c #464782",
+"a@    c #4A4A81",
+"b@    c #4D4E8A",
+"c@    c #3E3D67",
+"d@    c #9797C0",
+"e@    c #7A7AB6",
+"f@    c #5A5AAA",
+"g@    c #4C4C8B",
+"h@    c #797BC3",
+"i@    c #9090E1",
+"j@    c #8487DD",
+"k@    c #7C7ED7",
+"l@    c #5E60BA",
+"m@    c #5A5EB9",
+"n@    c #5055A5",
+"o@    c #3C3D66",
+"p@    c #4B4C81",
+"q@    c #3A3B64",
+"r@    c #6D6D99",
+"s@    c #4C4F90",
+"t@    c #505396",
+"u@    c #34345A",
+"v@    c #3E406C",
+"w@    c #7D7ECC",
+"x@    c #8D8EE1",
+"y@    c #9496E6",
+"z@    c #A0A2ED",
+"A@    c #8589DD",
+"B@    c #7476D0",
+"C@    c #5B5FBA",
+"D@    c #5D5FB9",
+"E@    c #3B3A6B",
+"F@    c #3F4271",
+"G@    c #40416C",
+"H@    c #3B3867",
+"I@    c #9091AF",
+"J@    c #505297",
+"K@    c #4C4D8C",
+"L@    c #464680",
+"M@    c #48487A",
+"N@    c #7F82D2",
+"O@    c #8A8DE0",
+"P@    c #9796E4",
+"Q@    c #E4E3FB",
+"R@    c #EBEAFC",
+"S@    c #EAEBFC",
+"T@    c #EAECFC",
+"U@    c #E7E7FC",
+"V@    c #C8C8F8",
+"W@    c #8184DA",
+"X@    c #7C7DD4",
+"Y@    c #7376D0",
+"Z@    c #5E60B9",
+"`@    c #4B4B8E",
+" #    c #373661",
+".#    c #323358",
+"+#    c #1C1A2D",
+"@#    c #9898C4",
+"##    c #62648A",
+"$#    c #414077",
+"%#    c #5858A9",
+"&#    c #3E4274",
+"*#    c #676BB3",
+"=#    c #8184D6",
+"-#    c #878ADC",
+";#    c #9294E5",
+">#    c #9C9DE8",
+",#    c #AAABF0",
+"'#    c #DEE0FC",
+")#    c #E5E4FC",
+"!#    c #E3E5FC",
+"~#    c #E0E1FA",
+"{#    c #DADBFB",
+"]#    c #D5D4F9",
+"^#    c #CCCEF7",
+"/#    c #C0C2F6",
+"(#    c #8184D8",
+"_#    c #777AD2",
+":#    c #7174CD",
+"<#    c #5F61BB",
+"[#    c #5E5EB6",
+"}#    c #31335E",
+"|#    c #2A2E50",
+"1#    c #232440",
+"2#    c #7474A8",
+"3#    c #6D6FC7",
+"4#    c #5C5D99",
+"5#    c #232546",
+"6#    c #21213B",
+"7#    c #7576C6",
+"8#    c #8181D6",
+"9#    c #8588DB",
+"0#    c #8E90E0",
+"a#    c #9898E6",
+"b#    c #D9DAF9",
+"c#    c #D6D5FA",
+"d#    c #D6D6F9",
+"e#    c #CDCEF8",
+"f#    c #C8C6F6",
+"g#    c #BEBDF5",
+"h#    c #7E80D6",
+"i#    c #5E5FBA",
+"j#    c #4B4A86",
+"k#    c #272849",
+"l#    c #4A4A8B",
+"m#    c #767AD1",
+"n#    c #7F82D8",
+"o#    c #5B5CAA",
+"p#    c #787ACD",
+"q#    c #7B7CD4",
+"r#    c #8084DA",
+"s#    c #8A8ADE",
+"t#    c #9296E6",
+"u#    c #999DE9",
+"v#    c #CECEF7",
+"w#    c #C3C3F6",
+"x#    c #BABCF6",
+"y#    c #B3B4F4",
+"z#    c #7A7BD4",
+"A#    c #7275CE",
+"B#    c #5D60B9",
+"C#    c #46457D",
+"D#    c #45487D",
+"E#    c #262544",
+"F#    c #3F3F79",
+"G#    c #7C7FD6",
+"H#    c #6969C0",
+"I#    c #4A4C8C",
+"J#    c #373864",
+"K#    c #7579D0",
+"L#    c #797AD3",
+"M#    c #7C7FD8",
+"N#    c #8484D9",
+"O#    c #8C8EE0",
+"P#    c #9294E3",
+"Q#    c #9C9DEA",
+"R#    c #A4A6EE",
+"S#    c #BBBEF5",
+"T#    c #B8B8F5",
+"U#    c #B2B1F1",
+"V#    c #A8A9EE",
+"W#    c #7878D0",
+"X#    c #7073CC",
+"Y#    c #414276",
+"Z#    c #46477F",
+"`#    c #2C2C4D",
+" $    c #39386E",
+".$    c #6D70CB",
+"+$    c #6062BA",
+"@$    c #4A4988",
+"#$    c #2E3055",
+"$$    c #7274CC",
+"%$    c #7375CD",
+"&$    c #7578D0",
+"*$    c #7E7FD6",
+"=$    c #8587DC",
+"-$    c #8E8FE2",
+";$    c #9696E6",
+">$    c #9B9CE9",
+",$    c #3B3B3B",
+"'$    c #AEAEF0",
+")$    c #A1A4ED",
+"!$    c #A8A7ED",
+"~$    c #6E72CA",
+"{$    c #4C4C4C",
+"]$    c #5F60B8",
+"^$    c #404175",
+"/$    c #44467A",
+"($    c #232442",
+"_$    c #323264",
+":$    c #6367C0",
+"<$    c #656AC2",
+"[$    c #424475",
+"}$    c #2D2E51",
+"|$    c #7274CB",
+"1$    c #6D71CA",
+"2$    c #777AD4",
+"3$    c #8083D7",
+"4$    c #8688DB",
+"5$    c #8B8EE0",
+"6$    c #9093E2",
+"7$    c #9799E8",
+"8$    c #9D9FEA",
+"9$    c #404040",
+"0$    c #9A98E9",
+"a$    c #9193E4",
+"b$    c #686CC6",
+"c$    c #4D4D4D",
+"d$    c #6060B9",
+"e$    c #3B3C6E",
+"f$    c #121222",
+"g$    c #2F2E5B",
+"h$    c #4D4C8E",
+"i$    c #2E2F54",
+"j$    c #6F73CA",
+"k$    c #6A6CC6",
+"l$    c #6F71C9",
+"m$    c #7D7ED6",
+"n$    c #8284D9",
+"o$    c #8B8EE1",
+"p$    c #8E92E0",
+"q$    c #9093E4",
+"r$    c #9899E8",
+"s$    c #8C91E2",
+"t$    c #8C8DE0",
+"u$    c #7172CC",
+"v$    c #6E72CB",
+"w$    c #6062BC",
+"x$    c #3E4074",
+"y$    c #292A4A",
+"z$    c #12101E",
+"A$    c #6D70C9",
+"B$    c #7477D0",
+"C$    c #53549A",
+"D$    c #2D2C4F",
+"E$    c #676ABA",
+"F$    c #7778D1",
+"G$    c #8180D7",
+"H$    c #8586DA",
+"I$    c #8888DC",
+"J$    c #8283DA",
+"K$    c #686CC4",
+"L$    c #6769C2",
+"M$    c #5E62BD",
+"N$    c #3D3D6D",
+"O$    c #222342",
+"P$    c #101121",
+"Q$    c #38366D",
+"R$    c #6064BA",
+"S$    c #5C5EA5",
+"T$    c #686AC2",
+"U$    c #7276CE",
+"V$    c #7679D3",
+"W$    c #7A7ED5",
+"X$    c #797CD1",
+"Y$    c #666AC3",
+"Z$    c #5F62BB",
+"`$    c #5A5AAB",
+" %    c #383A65",
+".%    c #262645",
+"+%    c #0F101E",
+"@%    c #424380",
+"#%    c #585BAA",
+"$%    c #4F5091",
+"%%    c #494980",
+"&%    c #484D8F",
+"*%    c #56589B",
+"=%    c #6467BF",
+"-%    c #6868C2",
+";%    c #6B6FC8",
+">%    c #7374CC",
+",%    c #363636",
+"'%    c #7478D0",
+")%    c #5E60B8",
+"!%    c #494C8E",
+"~%    c #353358",
+"{%    c #1E1D36",
+"]%    c #09080F",
+"^%    c #595AA4",
+"/%    c #8B8CA4",
+"(%    c #484B7F",
+"_%    c #494C80",
+":%    c #474882",
+"<%    c #484B84",
+"[%    c #6366C0",
+"}%    c #6565BE",
+"|%    c #676BC3",
+"1%    c #696DC5",
+"2%    c #6F73CC",
+"3%    c #3B3C66",
+"4%    c #2D2E52",
+"5%    c #131220",
+"6%    c #9294BE",
+"7%    c #AFB0BA",
+"8%    c #3E416D",
+"9%    c #4A4B83",
+"0%    c #333258",
+"a%    c #282849",
+"b%    c #0B0C18",
+"c%    c #28284A",
+"d%    c #B2B4C8",
+"e%    c #42426E",
+"f%    c #424270",
+"g%    c #444782",
+"h%    c #3A3B6E",
+"i%    c #696DC6",
+"j%    c #08060C",
+"k%    c #464683",
+"l%    c #808190",
+"m%    c #212039",
+"n%    c #42437B",
+"o%    c #4E5191",
+"p%    c #6666C0",
+"q%    c #6465BE",
+"r%    c #6365BF",
+"s%    c #131221",
+"t%    c #9394BA",
+"u%    c #ACAFBC",
+"v%    c #4B4C86",
+"w%    c #5459A9",
+"x%    c #4E5294",
+"y%    c #4D4D2D",
+"z%    c #6063BC",
+"A%    c #6367C1",
+"B%    c #343462",
+"C%    c #6A6B90",
+"D%    c #3E3F69",
+"E%    c #38375F",
+"F%    c #343256",
+"G%    c #2B2A4C",
+"H%    c #0F0F0F",
+"I%    c #6363BC",
+"J%    c #6164B9",
+"K%    c #302F5A",
+"L%    c #252645",
+"M%    c #242442",
+"N%    c #0A0912",
+"O%    c #120F1E",
+"P%    c #7676B2",
+"Q%    c #282948",
+"R%    c #222240",
+"S%    c #42487E",
+"T%    c #313258",
+"U%    c #292929",
+"V%    c #6061BA",
+"W%    c #5B60BA",
+"X%    c #5F64BD",
+"Y%    c #6063BD",
+"Z%    c #6869BE",
+"`%    c #454684",
+" &    c #393A63",
+".&    c #0B0B15",
+"+&    c #3B3D70",
+"@&    c #87889D",
+"#&    c #323256",
+"$&    c #4D4D88",
+"%&    c #323458",
+"&&    c #434476",
+"*&    c #393A68",
+"=&    c #4E4E95",
+"-&    c #5C5FB8",
+";&    c #5A5FB9",
+">&    c #5A5EB8",
+",&    c #6263BC",
+"'&    c #6267BA",
+")&    c #444580",
+"!&    c #484A7C",
+"~&    c #141526",
+"{&    c #22253F",
+"]&    c #9295BC",
+"^&    c #626484",
+"/&    c #333459",
+"(&    c #484A88",
+"_&    c #4D4E94",
+":&    c #3E4073",
+"<&    c #3D3E75",
+"[&    c #5A5EB7",
+"}&    c #6064BD",
+"|&    c #5A5CAE",
+"1&    c #30315D",
+"2&    c #3D406D",
+"3&    c #4C4E86",
+"4&    c #242542",
+"5&    c #07050C",
+"6&    c #101223",
+"7&    c #6B6EA0",
+"8&    c #34345D",
+"9&    c #191A30",
+"0&    c #36365E",
+"a&    c #4A4A88",
+"b&    c #313056",
+"c&    c #30305D",
+"d&    c #5255A3",
+"e&    c #6064BF",
+"f&    c #6466C0",
+"g&    c #6666BF",
+"h&    c #6668C1",
+"i&    c #6366BE",
+"j&    c #4E5196",
+"k&    c #2B2C52",
+"l&    c #3A3C6B",
+"m&    c #444876",
+"n&    c #2E2E50",
+"o&    c #0C0912",
+"p&    c #0D0B16",
+"q&    c #494986",
+"r&    c #ADAFBA",
+"s&    c #292B4C",
+"t&    c #18172B",
+"u&    c #333456",
+"v&    c #38385F",
+"w&    c #232240",
+"x&    c #34335C",
+"y&    c #2F3258",
+"z&    c #3E3E74",
+"A&    c #585CB1",
+"B&    c #5C5EB8",
+"C&    c #6265BD",
+"D&    c #6064BE",
+"E&    c #5E60B6",
+"F&    c #444684",
+"G&    c #2C2E52",
+"H&    c #2C2A4A",
+"I&    c #424474",
+"J&    c #232543",
+"K&    c #0C0C16",
+"L&    c #0E0D19",
+"M&    c #43447A",
+"N&    c #ACAFB9",
+"O&    c #2E2E52",
+"P&    c #12101F",
+"Q&    c #1C1B33",
+"R&    c #0E0E1A",
+"S&    c #5857A5",
+"T&    c #50529F",
+"U&    c #444783",
+"V&    c #373863",
+"W&    c #42427B",
+"X&    c #474A8E",
+"Y&    c #52529E",
+"Z&    c #595BB0",
+"`&    c #6262BC",
+" *    c #6062BB",
+".*    c #575EB2",
+"+*    c #454887",
+"@*    c #3C3F76",
+"#*    c #2F3056",
+"$*    c #383965",
+"%*    c #35365C",
+"&*    c #262644",
+"**    c #12101C",
+"=*    c #0A060C",
+"-*    c #0F101C",
+";*    c #424479",
+">*    c #B0B3C6",
+",*    c #515369",
+"'*    c #0D0E1C",
+")*    c #0E0E1C",
+"!*    c #3C3D6E",
+"~*    c #4A4F8E",
+"{*    c #5759B0",
+"]*    c #5558AB",
+"^*    c #4E5094",
+"/*    c #363764",
+"(*    c #3C3B6E",
+"_*    c #3B3E77",
+":*    c #3F407C",
+"<*    c #3B3D73",
+"[*    c #3A3A6E",
+"}*    c #383A6F",
+"|*    c #3B3B70",
+"1*    c #3C3B70",
+"2*    c #3A3B6D",
+"3*    c #34355E",
+"4*    c #454680",
+"5*    c #4E5095",
+"6*    c #474C8A",
+"7*    c #18172D",
+"8*    c #090A13",
+"9*    c #07040A",
+"0*    c #161728",
+"a*    c #64668E",
+"b*    c #60607F",
+"c*    c #18182C",
+"d*    c #292A49",
+"e*    c #3C3C68",
+"f*    c #464882",
+"g*    c #545BAF",
+"h*    c #50529A",
+"i*    c #3B3E6B",
+"j*    c #2F3158",
+"k*    c #363760",
+"l*    c #383860",
+"m*    c #303358",
+"n*    c #414272",
+"o*    c #46487E",
+"p*    c #4C4A7E",
+"q*    c #4D5091",
+"r*    c #383962",
+"s*    c #0A060E",
+"t*    c #0B0A12",
+"u*    c #262745",
+"v*    c #7070A4",
+"w*    c #ACAEB6",
+"x*    c #55566D",
+"y*    c #131528",
+"z*    c #141221",
+"A*    c #1B1B32",
+"B*    c #2F2F4F",
+"C*    c #303054",
+"D*    c #292847",
+"E*    c #323257",
+"F*    c #393960",
+"G*    c #393A62",
+"H*    c #3D3E69",
+"I*    c #4C4E8E",
+"J*    c #4A4B8A",
+"K*    c #52539A",
+"L*    c #3C4070",
+"M*    c #343459",
+"N*    c #20213B",
+"O*    c #110F1C",
+"P*    c #08070E",
+"Q*    c #1E2038",
+"R*    c #616386",
+"S*    c #ADB1C2",
+"T*    c #AAAEB6",
+"U*    c #32335B",
+"V*    c #19182C",
+"W*    c #0F0E1B",
+"X*    c #0A0A15",
+"Y*    c #0F0F1B",
+"Z*    c #121223",
+"`*    c #1A1B34",
+" =    c #131223",
+".=    c #141527",
+"+=    c #1C1C33",
+"@=    c #181A30",
+"#=    c #161324",
+"$=    c #0F0D19",
+"%=    c #080810",
+"&=    c #0B080F",
+"*=    c #0D0C18",
+"==    c #20223B",
+"-=    c #444379",
+";=    c #AEB0BC",
+">=    c #ADAEB8",
+",=    c #848394",
+"'=    c #2E3054",
+")=    c #1E1E36",
+"!=    c #0B0D19",
+"~=    c #0A080E",
+"{=    c #08050A",
+"]=    c #09070D",
+"^=    c #090911",
+"/=    c #10101D",
+"(=    c #252946",
+"_=    c #373A69",
+":=    c #8A8CA2",
+"<=    c #B0B0C0",
+"[=    c #8E8EA8",
+"}=    c #8A8BA0",
+"|=    c #868A9E",
+"1=    c #848698",
+"2=    c #838698",
+"3=    c #83879A",
+"4=    c #89889D",
+"5=    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+&+&+&+0.*+=+-+;+>+,+'+)+              ",
+"              !+~+{+]+^+/+U.(+_+:+<+[+}+|+|+1+2+3+4+&+&+&+&+&+&+&+&+5+{+6+=+7+8+9+0+a+b+            ",
+"            c+d+e+f+g+h+i+j+_+k+l+m+n+o+p+p+q+r+s+&+&+&+&+&+&+&+&+&+t+u+v+H.w+x+y+z+A+B+C+          ",
+"            D+E+F+G+H+I+J+&+&+&+&+&+&+K+K+L+&+&+&+&+&+&+&+&+&+&+M+N+t+u+O+P+Q+R+S+T+U+V+W+          ",
+"          {.X+Y+Z+`+ @.@&+&+&+&+&+&+&+&++@&+&+&+&+&+&+&+&+t+t+t+t+t+&+&+&+@@#@$@%@&@*@=@-@;@        ",
+"          >@,@'@)@!@~@{@&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+t+t+t+t+]@&+&+&+v+=+^@/@(@_@:@g+<@        ",
+"        [@}@|@1@2@3@#+4@&+&+&++@5@&+&+&+&+&+&+&+&+&+&+&+&+t+t+6@7@8@&+&+&+t+t+9@%@/@0@a@b@c@d@      ",
+"        e@f@g@: h@i@#+o.&+&+&+t+t+t+t+t+M+M+M+t+t+t+&+&+&+t+t+j@k@8@&+&+&+t+t+l@m@/@n@o@p@q@r@      ",
+"        s@t@u@v@w@x@y@z@&+&+&+t+t++@5@t+t+t+t+t+t+t+&+&+&+t+t+A@^.B@&+&+&+t+t+%@/@C@D@E@F@G@H@      ",
+"      I@J@K@L@M@N@O@P@y.&+&+&+&+t+Q@R@S@T@U@M+M+M+V@&+&+&+t+t+W@X@Y@&+&+&+t+t+9@/@C@Z@`@ #.#+#@#    ",
+"      ##$#%#&#*#=#-#;#>#,#&+&+&+&+J+'#)#!#~#{#]#^#/#&+&+&+t+t+(#_#:#&+&+&+t+t+<#/@/@C@[#}#|#1#2#    ",
+"      3#4#5#6#7#8#9#0#a#U.&+&+&+&+&+&+&+b#c#d#e#f#g#&+&+&+t+t+h#_#M+&+&+&+t+t+/@/@%@C@i#j#K@k#l#    ",
+"      m#n#o#q@p#q#r#s#t#u#+@&+&+&+&+&+&+&+v#<+w#x#y#&+&+&+t+t+z#A#M+&+&+&+t+t+B#C@C@%@%@C#D#E#F#    ",
+"      G#H#I#J#K#L#M#N#O#P#Q#R#&+&+&+&+&+&+&+S#T#U#V#&+&+&+t+t+W#X#M+&+&++@t+t+/@/@m@/@l@Y#Z#`# $    ",
+"      .$+$@$#$$$%$&$*$=$-$;$>$+@t+,$&+&+&+&+t+'$)$!$&+&+&+t+t+A#~$M+&+&+{$t+t+/@/@/@%@]$^$/$($_$    ",
+"      :$<$[$}$|$1$A#2$3$4$5$6$7$8$t+9$&+&+&+t+t+0$a$&+&+&+t+t+~$b$M+&+&+c$t++@/@/@/@C@d$e$.#f$g$    ",
+"      X#:#h$i$j$k$l$A#&$m$n$o$p$q$5.r$&+&+&+t+t+s$t$&+&+&+t+t+u$v$&+&+&+{$t+{$/@/@/@B#w$x$y$z$_$    ",
+"      A$B$C$D$E$5+-.E.D.F$z#G$H$I$s#&+&+&+&+t+t+%+J$&+&+&+{$t+K$L$&+&+&+{$t+c$/@/@/@Q+M$N$O$P$Q$    ",
+"      R$K$*@q@S$T$-.g.1$X#U$V$W$G$&+&+&+&+&+t+t+m$X$&+&+&+c$t+k$Y$&+&+&+c$t+{$/@/@Z$=+`$ %.%+%@%    ",
+"      #%$%%%&%*%G.=%K$-%;%l$>%Y@&+&+&+&+&+,%t+t+'%&+&+&+&+{$t+{$&+&+&+&+t+t+{$/@/@)%H.!%~%{%]%^%    ",
+"      /%(%_%:%<%[%P+}%|%T$1%J+&+&+&+&+&+5@t+t+t+2%&+&+&+&+c$t+c$&+&+&+&+&+&+&+&+&+&+&+3%4%+%5%6%    ",
+"      7%p@8%9%~ &+&+&+&+&+&+&+&+&+&+&+t+t+t+t+,%-.&+&+&+&+c$t+{$&+&+&+&+&+&+&+&+&+&+&+0%a%b%c%d%    ",
+"        e%f%g%h%&+&+&+&+&+&+&+&+&+&+t+t+t+t+5@i%O+=%&+&+&+c$t+c$&+&+&+&+&+&+&+&+&+&+&+t+t+j%k%      ",
+"        l%m%n%o%&+&+&+&+&+&+&+&+&+t+t+t+t+p%q%P+r%@@L$t+t+t+t+c$&+&+&+&+&+t+t+t+t+t+t+t+t+s%t%      ",
+"        u%v%w%x%&+&+&+&+&+y%t+t+t+t+t+t+v+q%H.@@z%$@A%M$u+t+t+c$w$%@t+t+t+t+t+t+t+t+t+t+t+B%R       ",
+"          C%D%E%F%G%t+t+t+t+t+t+t+t+H%#@$@$@#@$@M$$@I%9@Z@$@/@m@C@/@u+u+u+u+u+J%K%L%M%N%O%P%        ",
+"            Q%R%S%T%t+t+t+t+t+U%d$Z$V%V%Z$M$C@Z@Z@%@<#M$C@/@W%%@/@/@Z$X%Y%@@Z%`% &M%.&j%+&          ",
+"            @&#&$&%&&&*&=&-&/@;&/@$@/@/@m@C@/@m@/@C@$@H./@/@>&/@$@V%w$,&H.'&)& &!&~&j%{&]&          ",
+"              ^&/&L%(&_&:&<&[&/@m@>&%@;&/@/@/@/@/@C@;&%@v+}&l@l@l@=+v+}%|&1&2&3&4&5&6&7&            ",
+"                8&9&0&O a&b&c&d&$@/@/@/@/@/@/@/@/@/@C@/@Z$e&f&g&{+h&i&j&k&l&m&n&o&p&q&              ",
+"                r&s&t&u&v&w&x&y&z&A&B&^@/@/@B#$@/@Z$V%Z$Q+C&D&P+,&E&F&G&H&I&J&K&L&M&5               ",
+"                  N&O&P&Q&R&S&T&U&V&W&X&Y&Z&^@`&<# *Y%,&H.w$.*+*@*#*$*%*&***=*-*;*>*                ",
+"                      ,*'*)*!*~*{*]*^*_./*(*_*:*<*[*}*|*1*2*3*4*5*6*c%7*8*9*0*a*                    ",
+"                        b*t&c*d*e*f*g*h*2&i*j*k*l*m*n*i o*p*q*U+r*T+s*]%t*u*v*                      ",
+"                          w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*r*M*N*O*j%P*Q*R*S*                        ",
+"                              T*U*V*W*o&X*Y*Z*`* =.=+=@=#=$=%=&=*===-=;=                            ",
+"                                  >=,='=)=P&!=~={=j%]=^=/=c*(=_=:=<=                                ",
+"                                          [=}=|=1=2=3=4=5=I@                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.bmp
new file mode 100644 (file)
index 0000000..16eec3d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.xpm
new file mode 100644 (file)
index 0000000..a215541
--- /dev/null
@@ -0,0 +1,1167 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_TreeExtraction_JF_MH_xpm[] = {
+"50 50 1114 2",
+"      c #CED0CC",
+".     c #D9D900",
+"+     c #E1E100",
+"@     c #DEDE00",
+"#     c #C0C000",
+"$     c #CACA00",
+"%     c #BABA00",
+"&     c #C0C18D",
+"*     c #C1C39A",
+"=     c #B8BAA6",
+"-     c #92920F",
+";     c #B0B018",
+">     c #BFBF08",
+",     c #DADA00",
+"'     c #E2E200",
+")     c #E5E500",
+"!     c #999915",
+"~     c #8E8F5E",
+"{     c #A3A422",
+"]     c #C8C81B",
+"^     c #CBCCA6",
+"/     c #9A9B72",
+"(     c #B6B600",
+"_     c #C6C600",
+":     c #B6B8AA",
+"<     c #B5B678",
+"[     c #989817",
+"}     c #C7C700",
+"|     c #E4E400",
+"1     c #D0D000",
+"2     c #949400",
+"3     c #9E9E1A",
+"4     c #9A9B55",
+"5     c #CDCFCA",
+"6     c #787822",
+"7     c #D4D400",
+"8     c #CBCDC0",
+"9     c #B1B235",
+"0     c #D5D500",
+"a     c #E3E300",
+"b     c #C5C500",
+"c     c #55577C",
+"d     c #5458AE",
+"e     c #5556AA",
+"f     c #5254A6",
+"g     c #6162B5",
+"h     c #6667BE",
+"i     c #808395",
+"j     c #7E7E8E",
+"k     c #CCCEC9",
+"l     c #737300",
+"m     c #CECE00",
+"n     c #CFCF11",
+"o     c #AAA8D2",
+"p     c #9092D1",
+"q     c #5C5FAC",
+"r     c #5B5B41",
+"s     c #D7D700",
+"t     c #B9B900",
+"u     c #90911C",
+"v     c #414266",
+"w     c #36365D",
+"x     c #31325A",
+"y     c #2A2D51",
+"z     c #42447E",
+"A     c #5A60AD",
+"B     c #6362B9",
+"C     c #4B4C8B",
+"D     c #8081BE",
+"E     c #9899C5",
+"F     c #8A8A00",
+"G     c #BABB1E",
+"H     c #B2B3C6",
+"I     c #9092D0",
+"J     c #7678CE",
+"K     c #7F81CA",
+"L     c #747544",
+"M     c #9B9B0D",
+"N     c #DCDC00",
+"O     c #BBBB00",
+"P     c #8F8F07",
+"Q     c #373736",
+"R     c #373963",
+"S     c #43457C",
+"T     c #3E3E6E",
+"U     c #403E68",
+"V     c #45467C",
+"W     c #383964",
+"X     c #6669C0",
+"Y     c #4C4D8A",
+"Z     c #6A6E9A",
+"`     c #ACADB6",
+" .    c #9B9C66",
+"..    c #A4A400",
+"+.    c #C1C280",
+"@.    c #BFC0D1",
+"#.    c #8A8CCE",
+"$.    c #585AA0",
+"%.    c #6F72CB",
+"&.    c #6D6DC5",
+"*.    c #696B7D",
+"=.    c #B2B20C",
+"-.    c #676711",
+";.    c #8F9013",
+">.    c #C9C904",
+",.    c #C4C400",
+"'.    c #8A8B87",
+").    c #6D6EC4",
+"!.    c #686ABF",
+"~.    c #5E62B2",
+"{.    c #53569B",
+"].    c #454378",
+"^.    c #2D2F52",
+"/.    c #3C3C66",
+"(.    c #414170",
+"_.    c #5658AA",
+":.    c #454476",
+"<.    c #7575A9",
+"[.    c #B5B5C9",
+"}.    c #CCCEC8",
+"|.    c #8F904A",
+"1.    c #C1C100",
+"2.    c #9E9E07",
+"3.    c #ACAD9A",
+"4.    c #BFC2D2",
+"5.    c #8487DB",
+"6.    c #5A5EAF",
+"7.    c #45457D",
+"8.    c #5B61B6",
+"9.    c #4F5294",
+"0.    c #6C6E98",
+"a.    c #888BBD",
+"b.    c #9898E7",
+"c.    c #9697E5",
+"d.    c #92926C",
+"e.    c #CBCB00",
+"f.    c #929492",
+"g.    c #7D80D7",
+"h.    c #7C7BD3",
+"i.    c #7275CD",
+"j.    c #6C70C9",
+"k.    c #696BC4",
+"l.    c #5A5DAE",
+"m.    c #414178",
+"n.    c #3B3A67",
+"o.    c #3F4272",
+"p.    c #444476",
+"q.    c #666AC0",
+"r.    c #6B6AC4",
+"s.    c #B7B9CC",
+"t.    c #BFC1AA",
+"u.    c #8E8E00",
+"v.    c #B8B800",
+"w.    c #C3C33C",
+"x.    c #9EA1CB",
+"y.    c #7C7ED4",
+"z.    c #5C5DA8",
+"A.    c #3B3B6A",
+"B.    c #464682",
+"C.    c #696AAA",
+"D.    c #9A9AE6",
+"E.    c #9C9DE6",
+"F.    c #A6A6ED",
+"G.    c #A8A6EE",
+"H.    c #A9A8EF",
+"I.    c #9897C8",
+"J.    c #89891D",
+"K.    c #DDDD00",
+"L.    c #D1D100",
+"M.    c #A6A61B",
+"N.    c #8A8CDE",
+"O.    c #8183D9",
+"P.    c #7A7CD5",
+"Q.    c #7578D2",
+"R.    c #686CC5",
+"S.    c #6466BE",
+"T.    c #595DB3",
+"U.    c #424078",
+"V.    c #33335A",
+"W.    c #5A59A4",
+"X.    c #6568C0",
+"Y.    c #6A6AC4",
+"Z.    c #9B9CC7",
+"`.    c #A5A67D",
+" +    c #8C8C00",
+".+    c #A7A700",
+"++    c #91913C",
+"@+    c #989BD9",
+"#+    c #7C80D7",
+"$+    c #4C4E91",
+"%+    c #3D3F6E",
+"&+    c #32345A",
+"*+    c #898BD0",
+"=+    c #A3A3EC",
+"-+    c #A9A8EE",
+";+    c #AEAFF2",
+">+    c #B5B4F2",
+",+    c #B7B8F4",
+"'+    c #B8B9F4",
+")+    c #B4B4F4",
+"!+    c #A9A8BC",
+"~+    c #979700",
+"{+    c #A1A100",
+"]+    c #939411",
+"^+    c #868AC9",
+"/+    c #868CDE",
+"(+    c #7E82D8",
+"_+    c #7A7DD6",
+":+    c #7376CF",
+"<+    c #6E71CA",
+"[+    c #6A6CC4",
+"}+    c #6567C0",
+"|+    c #6163BD",
+"1+    c #4D5098",
+"2+    c #32335C",
+"3+    c #474B86",
+"4+    c #6768BF",
+"5+    c #6C6CC5",
+"6+    c #7576B5",
+"7+    c #818136",
+"8+    c #B3B300",
+"9+    c #A6A600",
+"0+    c #898959",
+"a+    c #9498D7",
+"b+    c #8588DC",
+"c+    c #7378CD",
+"d+    c #3F3F72",
+"e+    c #373961",
+"f+    c #8484C4",
+"g+    c #A4A4EC",
+"h+    c #AFB0F2",
+"i+    c #BCBCF6",
+"j+    c #C2C2F6",
+"k+    c #C5C4F6",
+"l+    c #C4C4F7",
+"m+    c #B0B1CA",
+"n+    c #A4A447",
+"o+    c #5F5F00",
+"p+    c #D6D600",
+"q+    c #A7A705",
+"r+    c #71718E",
+"s+    c #9193E3",
+"t+    c #8688DC",
+"u+    c #8080D5",
+"v+    c #7879D2",
+"w+    c #7374CC",
+"x+    c #6C6EC8",
+"y+    c #6466BF",
+"z+    c #6262BB",
+"A+    c #5357A8",
+"B+    c #42437C",
+"C+    c #525196",
+"D+    c #5F60B6",
+"E+    c #6263BB",
+"F+    c #7878BB",
+"G+    c #828336",
+"H+    c #9C9C00",
+"I+    c #ACAC00",
+"J+    c #C6C8B2",
+"K+    c #BBBED0",
+"L+    c #878BDF",
+"M+    c #666AC2",
+"N+    c #55549F",
+"O+    c #40406B",
+"P+    c #8A8CD0",
+"Q+    c #B1B2F1",
+"R+    c #BAB9F4",
+"S+    c #C4C2F6",
+"T+    c #C9C8F6",
+"U+    c #CBCDF9",
+"V+    c #CCCEF8",
+"W+    c #CECDF8",
+"X+    c #CCCCB7",
+"Y+    c #C3C300",
+"Z+    c #A5A500",
+"`+    c #D2D200",
+" @    c #95967B",
+".@    c #989AEA",
+"+@    c #8A8EDF",
+"@@    c #8184DC",
+"#@    c #7A7CD2",
+"$@    c #7476D0",
+"%@    c #6D71CA",
+"&@    c #6A6CC5",
+"*@    c #6464BE",
+"=@    c #5A5AAF",
+"-@    c #444884",
+";@    c #50529D",
+">@    c #54539D",
+",@    c #5656A4",
+"'@    c #AEAEB9",
+")@    c #878836",
+"!@    c #BDBD00",
+"~@    c #9F9F00",
+"{@    c #C8CAB2",
+"]@    c #B3B3C6",
+"^@    c #888ADD",
+"/@    c #7F81D6",
+"(@    c #5C5EAD",
+"_@    c #4B4B7E",
+":@    c #8A8ACA",
+"<@    c #A3A2EB",
+"[@    c #AEADF0",
+"}@    c #C2C2F5",
+"|@    c #CDCCF8",
+"1@    c #D0D1F9",
+"2@    c #D6D6FA",
+"3@    c #DADCFC",
+"4@    c #D8D7FC",
+"5@    c #B3B383",
+"6@    c #B1B100",
+"7@    c #8A897E",
+"8@    c #9E9DEA",
+"9@    c #9194E2",
+"0@    c #898ADD",
+"a@    c #8282D6",
+"b@    c #787AD2",
+"c@    c #7073CC",
+"d@    c #6A6CC6",
+"e@    c #686AC3",
+"f@    c #6264BE",
+"g@    c #6161BA",
+"h@    c #595BAD",
+"i@    c #42457F",
+"j@    c #4E529B",
+"k@    c #4F508F",
+"l@    c #4F4F8E",
+"m@    c #B4B5C8",
+"n@    c #999936",
+"o@    c #A9AB85",
+"p@    c #8586C8",
+"q@    c #7A7DD4",
+"r@    c #696AC2",
+"s@    c #3C3C6A",
+"t@    c #7879B8",
+"u@    c #A09FE9",
+"v@    c #A8A8F0",
+"w@    c #B6B6F3",
+"x@    c #C9CAF8",
+"y@    c #D0D2F9",
+"z@    c #D9D9FC",
+"A@    c #DCDEFC",
+"B@    c #E0E0FA",
+"C@    c #BABD9D",
+"D@    c #7F7F00",
+"E@    c #AFAF00",
+"F@    c #767618",
+"G@    c #A5A67B",
+"H@    c #9A9BA5",
+"I@    c #888CE1",
+"J@    c #7F82DA",
+"K@    c #797BD2",
+"L@    c #7275CE",
+"M@    c #6B6FC8",
+"N@    c #686AC2",
+"O@    c #6868C0",
+"P@    c #6464BD",
+"Q@    c #6061B9",
+"R@    c #5F5FB8",
+"S@    c #5C5BAE",
+"T@    c #302F52",
+"U@    c #4E5090",
+"V@    c #4E4E88",
+"W@    c #70709F",
+"X@    c #B8B993",
+"Y@    c #BFBF00",
+"Z@    c #CDCD00",
+"`@    c #B9B93C",
+" #    c #7679D1",
+".#    c #515396",
+"+#    c #46467E",
+"@#    c #515385",
+"##    c #9796E3",
+"$#    c #A1A2EC",
+"%#    c #ACACF1",
+"&#    c #C7C7F7",
+"*#    c #D1D0F8",
+"=#    c #D9DAFB",
+"-#    c #E0E0FB",
+";#    c #E4E3FA",
+">#    c #E7E5FA",
+",#    c #E6E8FC",
+"'#    c #C2C2BE",
+")#    c #696907",
+"!#    c #A0A000",
+"~#    c #A2A200",
+"{#    c #7B7B00",
+"]#    c #797900",
+"^#    c #797912",
+"/#    c #7D7DA2",
+"(#    c #8084D2",
+"_#    c #7B7CD3",
+":#    c #686CC4",
+"<#    c #6668C1",
+"[#    c #6364BC",
+"}#    c #5E62BC",
+"|#    c #5D61BC",
+"1#    c #5C60BB",
+"2#    c #41407C",
+"3#    c #454677",
+"4#    c #4A4A7C",
+"5#    c #484876",
+"6#    c #A9ABB2",
+"7#    c #AFAF30",
+"8#    c #D9D915",
+"9#    c #D2D4A6",
+"0#    c #6669C1",
+"a#    c #5B5DAE",
+"b#    c #343660",
+"c#    c #393C65",
+"d#    c #8A8DD8",
+"e#    c #9798E6",
+"f#    c #A1A4EE",
+"g#    c #B0B0F1",
+"h#    c #BEBEF6",
+"i#    c #C8C9F7",
+"j#    c #D2D1F9",
+"k#    c #DBDDFB",
+"l#    c #E5E4FA",
+"m#    c #E6EAFC",
+"n#    c #E9ECFC",
+"o#    c #EAEAFB",
+"p#    c #B0AE97",
+"q#    c #666600",
+"r#    c #808000",
+"s#    c #5D5D00",
+"t#    c #6A6A00",
+"u#    c #878700",
+"v#    c #C8C800",
+"w#    c #939300",
+"x#    c #6A6B70",
+"y#    c #7B7ED6",
+"z#    c #7477D0",
+"A#    c #6468C2",
+"B#    c #5D5FB8",
+"C#    c #5C60BA",
+"D#    c #5A5BAF",
+"E#    c #37375E",
+"F#    c #4D508E",
+"G#    c #4B4977",
+"H#    c #9E9F2A",
+"I#    c #BCBC00",
+"J#    c #C6C893",
+"K#    c #9396C1",
+"L#    c #5B5DB2",
+"M#    c #484C8D",
+"N#    c #2D2F54",
+"O#    c #6A6AA8",
+"P#    c #9290E0",
+"Q#    c #9899E7",
+"R#    c #A4A4ED",
+"S#    c #B2B4F3",
+"T#    c #BEC0F5",
+"U#    c #C9CAF7",
+"V#    c #D4D3F8",
+"W#    c #DDE0FC",
+"X#    c #E6E6FB",
+"Y#    c #EBEAFC",
+"Z#    c #EAEBFC",
+"`#    c #E9ECFD",
+" $    c #E6E6F9",
+".$    c #A4A59D",
+"+$    c #7A7A5B",
+"@$    c #75755A",
+"#$    c #63631D",
+"$$    c #6E6E00",
+"%$    c #9D9D07",
+"&$    c #7E7EC7",
+"*$    c #6E72CA",
+"=$    c #6060B8",
+"-$    c #464782",
+";$    c #4A4A81",
+">$    c #4D4E8A",
+",$    c #3E3D67",
+"'$    c #8E8E4F",
+")$    c #D3D493",
+"!$    c #7A7AB6",
+"~$    c #5A5AAA",
+"{$    c #4C4C8B",
+"]$    c #797BC3",
+"^$    c #9090E1",
+"/$    c #B3B2F4",
+"($    c #BEBEF4",
+"_$    c #CCCAF8",
+":$    c #D4D2F9",
+"<$    c #DDDEFC",
+"[$    c #E4E5FB",
+"}$    c #EAECFC",
+"|$    c #E7E7FC",
+"1$    c #DFE0FB",
+"2$    c #D9D8FA",
+"3$    c #CFCFF8",
+"4$    c #B3B3C4",
+"5$    c #868619",
+"6$    c #ADAD00",
+"7$    c #CFCF00",
+"8$    c #DFDF00",
+"9$    c #777868",
+"0$    c #6F72CC",
+"a$    c #666AC3",
+"b$    c #6769C1",
+"c$    c #5D62BB",
+"d$    c #5E60BA",
+"e$    c #5A5EB9",
+"f$    c #5055A5",
+"g$    c #3C3D66",
+"h$    c #4B4C81",
+"i$    c #3A3B64",
+"j$    c #6C6C3F",
+"k$    c #C2C200",
+"l$    c #CED093",
+"m$    c #4C4F90",
+"n$    c #505396",
+"o$    c #34345A",
+"p$    c #3E406C",
+"q$    c #7D7ECC",
+"r$    c #8D8EE1",
+"s$    c #9496E6",
+"t$    c #A0A2ED",
+"u$    c #ADAFF2",
+"v$    c #BCBDF4",
+"w$    c #D3D1F8",
+"x$    c #DEDEFB",
+"y$    c #E6E4FB",
+"z$    c #E8E7FA",
+"A$    c #D7D6FB",
+"B$    c #CCCDF8",
+"C$    c #C0C0F6",
+"D$    c #909073",
+"E$    c #A8A800",
+"F$    c #D8D800",
+"G$    c #B1B24C",
+"H$    c #6F70CA",
+"I$    c #676BC5",
+"J$    c #6464BC",
+"K$    c #6466AF",
+"L$    c #6266AF",
+"M$    c #6468AE",
+"N$    c #6063AE",
+"O$    c #6264AD",
+"P$    c #444364",
+"Q$    c #444769",
+"R$    c #444465",
+"S$    c #666528",
+"T$    c #B2B493",
+"U$    c #9091AF",
+"V$    c #505297",
+"W$    c #4C4D8C",
+"X$    c #464680",
+"Y$    c #48487A",
+"Z$    c #7F82D2",
+"`$    c #8A8DE0",
+" %    c #9796E4",
+".%    c #9FA0EA",
+"+%    c #AEAEF2",
+"@%    c #BABBF6",
+"#%    c #C6C6F6",
+"$%    c #D2D2F8",
+"%%    c #E4E3FB",
+"&%    c #DADBFA",
+"*%    c #D1D1F8",
+"=%    c #C8C8F8",
+"-%    c #C0C0F5",
+";%    c #8F8E73",
+">%    c #A6A74C",
+",%    c #7376D0",
+"'%    c #5A5DA0",
+")%    c #6F704D",
+"!%    c #B5B500",
+"~%    c #CCCC00",
+"{%    c #989800",
+"]%    c #9E9E1E",
+"^%    c #B6B8AF",
+"/%    c #62648A",
+"(%    c #414077",
+"_%    c #5858A9",
+":%    c #3E4274",
+"<%    c #676BB3",
+"[%    c #8184D6",
+"}%    c #878ADC",
+"|%    c #9294E5",
+"1%    c #9C9DE8",
+"2%    c #AAABF0",
+"3%    c #B6B5F3",
+"4%    c #C2C0F5",
+"5%    c #CACAF6",
+"6%    c #D3D2F7",
+"7%    c #D7D9FC",
+"8%    c #DEE0FC",
+"9%    c #E5E4FC",
+"0%    c #E3E5FC",
+"a%    c #E0E1FA",
+"b%    c #DADBFB",
+"c%    c #D5D4F9",
+"d%    c #CCCEF7",
+"e%    c #C0C2F6",
+"f%    c #ABAAE6",
+"g%    c #86860B",
+"h%    c #88894C",
+"i%    c #7174CD",
+"j%    c #6A6EC7",
+"k%    c #7A7EA3",
+"l%    c #BEBF13",
+"m%    c #C9C900",
+"n%    c #AEAF65",
+"o%    c #6D6FC7",
+"p%    c #5C5D99",
+"q%    c #232546",
+"r%    c #21213B",
+"s%    c #7576C6",
+"t%    c #8181D6",
+"u%    c #8588DB",
+"v%    c #8E90E0",
+"w%    c #9898E6",
+"x%    c #AEAFF1",
+"y%    c #C0C1F5",
+"z%    c #CACAF7",
+"A%    c #D2CFF8",
+"B%    c #D7D7FA",
+"C%    c #D8D8FC",
+"D%    c #D9DAF9",
+"E%    c #D6D5FA",
+"F%    c #D6D6F9",
+"G%    c #CDCEF8",
+"H%    c #C8C6F6",
+"I%    c #BEBDF5",
+"J%    c #B1B1F2",
+"K%    c #A4A6EE",
+"L%    c #8B8D72",
+"M%    c #9D9D00",
+"N%    c #6D6E4C",
+"O%    c #696CA7",
+"P%    c #999917",
+"Q%    c #8B8B12",
+"R%    c #767724",
+"S%    c #6E6F25",
+"T%    c #6E6F24",
+"U%    c #9F9F24",
+"V%    c #76751A",
+"W%    c #83831B",
+"X%    c #72720F",
+"Y%    c #59596B",
+"Z%    c #CACCC6",
+"`%    c #767AD1",
+" &    c #7F82D8",
+".&    c #5B5CAA",
+"+&    c #787ACD",
+"@&    c #7B7CD4",
+"#&    c #8084DA",
+"$&    c #8A8ADE",
+"%&    c #9296E6",
+"&&    c #999DE9",
+"*&    c #C1C0F4",
+"=&    c #C6C6F5",
+"-&    c #CAC9F7",
+";&    c #CECEF7",
+">&    c #D0CFF7",
+",&    c #C3C3F6",
+"'&    c #BABCF6",
+")&    c #B3B4F4",
+"!&    c #AAAAEF",
+"~&    c #9E9EEA",
+"{&    c #7D7E8A",
+"]&    c #B0B000",
+"^&    c #DBDB00",
+"/&    c #7F804A",
+"(&    c #6D71C8",
+"_&    c #7B7C43",
+":&    c #A5A517",
+"<&    c #616374",
+"[&    c #585A95",
+"}&    c #5B5FBA",
+"|&    c #46457D",
+"1&    c #45487D",
+"2&    c #262544",
+"3&    c #3F3F79",
+"4&    c #7C7FD6",
+"5&    c #6969C0",
+"6&    c #4A4C8C",
+"7&    c #373864",
+"8&    c #7579D0",
+"9&    c #797AD3",
+"0&    c #7C7FD8",
+"a&    c #8484D9",
+"b&    c #8C8EE0",
+"c&    c #9294E3",
+"d&    c #9C9DEA",
+"e&    c #B5B6F4",
+"f&    c #BBBAF5",
+"g&    c #BEBCF3",
+"h&    c #C0BEF5",
+"i&    c #BEC0F6",
+"j&    c #BBBEF5",
+"k&    c #B8B8F5",
+"l&    c #B2B1F1",
+"m&    c #A8A9EE",
+"n&    c #9E9EEB",
+"o&    c #7D7FAD",
+"p&    c #838306",
+"q&    c #76774A",
+"r&    c #494B66",
+"s&    c #707000",
+"t&    c #5C5C58",
+"u&    c #5C60B6",
+"v&    c #5B5D62",
+"w&    c #5C60B1",
+"x&    c #414276",
+"y&    c #46477F",
+"z&    c #2C2C4D",
+"A&    c #39386E",
+"B&    c #6D70CB",
+"C&    c #6062BA",
+"D&    c #4A4988",
+"E&    c #2E3055",
+"F&    c #7274CC",
+"G&    c #7375CD",
+"H&    c #7578D0",
+"I&    c #7E7FD6",
+"J&    c #8587DC",
+"K&    c #8E8FE2",
+"L&    c #9696E6",
+"M&    c #9B9CE9",
+"N&    c #9E9FE9",
+"O&    c #ABAAF0",
+"P&    c #ACAEF2",
+"Q&    c #B6B6F4",
+"R&    c #B6B5F4",
+"S&    c #B4B5F5",
+"T&    c #B2B2F2",
+"U&    c #AEAEF0",
+"V&    c #A1A4ED",
+"W&    c #A8A7ED",
+"X&    c #9192D0",
+"Y&    c #89890B",
+"Z&    c #686807",
+"`&    c #7E7E04",
+" *    c #BEBE00",
+".*    c #87873B",
+"+*    c #545593",
+"@*    c #6F6F8E",
+"#*    c #A9A900",
+"$*    c #C3C311",
+"%*    c #6A6C6D",
+"&*    c #5F60B8",
+"**    c #404175",
+"=*    c #44467A",
+"-*    c #232442",
+";*    c #323264",
+">*    c #6367C0",
+",*    c #656AC2",
+"'*    c #424475",
+")*    c #2D2E51",
+"!*    c #7274CB",
+"~*    c #777AD4",
+"{*    c #8083D7",
+"]*    c #8688DB",
+"^*    c #8B8EE0",
+"/*    c #9093E2",
+"(*    c #9799E8",
+"_*    c #9D9FEA",
+":*    c #9E9FE8",
+"<*    c #A2A4EC",
+"[*    c #A7A7EE",
+"}*    c #A6A8EF",
+"|*    c #A0A2EC",
+"1*    c #9A98E9",
+"2*    c #9193E4",
+"3*    c #898ECE",
+"4*    c #808128",
+"5*    c #C9C902",
+"6*    c #ABAB00",
+"7*    c #858500",
+"8*    c #6F6F00",
+"9*    c #727310",
+"0*    c #909014",
+"a*    c #A7A712",
+"b*    c #8F9022",
+"c*    c #6060B9",
+"d*    c #3B3C6E",
+"e*    c #323358",
+"f*    c #121222",
+"g*    c #2F2E5B",
+"h*    c #4D4C8E",
+"i*    c #2E2F54",
+"j*    c #6F73CA",
+"k*    c #6F71C9",
+"l*    c #7D7ED6",
+"m*    c #8284D9",
+"n*    c #8B8EE1",
+"o*    c #8E92E0",
+"p*    c #9093E4",
+"q*    c #9698E8",
+"r*    c #9899E8",
+"s*    c #9B9CEA",
+"t*    c #9C9CE8",
+"u*    c #9A9AE7",
+"v*    c #9597E6",
+"w*    c #8C91E2",
+"x*    c #8C8DE0",
+"y*    c #979AE6",
+"z*    c #8B8D56",
+"A*    c #848400",
+"B*    c #B4B400",
+"C*    c #9E9E00",
+"D*    c #898900",
+"E*    c #828200",
+"F*    c #7C7D20",
+"G*    c #5E61B7",
+"H*    c #6062BC",
+"I*    c #3E4074",
+"J*    c #292A4A",
+"K*    c #12101E",
+"L*    c #6D70C9",
+"M*    c #53549A",
+"N*    c #2D2C4F",
+"O*    c #676ABA",
+"P*    c #7778D1",
+"Q*    c #7A7BD4",
+"R*    c #8180D7",
+"S*    c #8586DA",
+"T*    c #8888DC",
+"U*    c #8F91E1",
+"V*    c #8C8FE0",
+"W*    c #8D92E1",
+"X*    c #8889DC",
+"Y*    c #8283DA",
+"Z*    c #8384D8",
+"`*    c #7D80D8",
+" =    c #8687AA",
+".=    c #838313",
+"+=    c #888800",
+"@=    c #A3A300",
+"#=    c #8C8C40",
+"$=    c #5E62BD",
+"%=    c #3D3D6D",
+"&=    c #222342",
+"*=    c #101121",
+"==    c #38366D",
+"-=    c #6064BA",
+";=    c #5C5EA5",
+">=    c #7276CE",
+",=    c #7679D3",
+"'=    c #7A7ED5",
+")=    c #8282D8",
+"!=    c #8285D9",
+"~=    c #8084D9",
+"{=    c #8586D9",
+"]=    c #8083D9",
+"^=    c #797CD1",
+"/=    c #6A6A2A",
+"(=    c #B7B700",
+"_=    c #808004",
+":=    c #59598E",
+"<=    c #383A65",
+"[=    c #262645",
+"}=    c #0F101E",
+"|=    c #424380",
+"1=    c #585BAA",
+"2=    c #4F5091",
+"3=    c #494980",
+"4=    c #484D8F",
+"5=    c #56589B",
+"6=    c #6467BF",
+"7=    c #6868C2",
+"8=    c #7578D1",
+"9=    c #797CD5",
+"0=    c #767AD2",
+"a=    c #7478D0",
+"b=    c #7074CC",
+"c=    c #6F73CC",
+"d=    c #7A7A3B",
+"e=    c #9A9A00",
+"f=    c #E0E000",
+"g=    c #717100",
+"h=    c #555741",
+"i=    c #353358",
+"j=    c #1E1D36",
+"k=    c #09080F",
+"l=    c #595AA4",
+"m=    c #8B8CA4",
+"n=    c #484B7F",
+"o=    c #494C80",
+"p=    c #474882",
+"q=    c #484B84",
+"r=    c #6366C0",
+"s=    c #6565BE",
+"t=    c #676BC3",
+"u=    c #696DC5",
+"v=    c #6B6DC6",
+"w=    c #7173CB",
+"x=    c #7577CD",
+"y=    c #7475CD",
+"z=    c #7376CE",
+"A=    c #7272C8",
+"B=    c #6C6EC6",
+"C=    c #787A57",
+"D=    c #818100",
+"E=    c #B2B200",
+"F=    c #D3D300",
+"G=    c #50512F",
+"H=    c #2D2E52",
+"I=    c #131220",
+"J=    c #9294BE",
+"K=    c #AFB0BA",
+"L=    c #3E416D",
+"M=    c #4A4B83",
+"N=    c #505092",
+"O=    c #5D60B3",
+"P=    c #6263BC",
+"Q=    c #6767C0",
+"R=    c #6468C0",
+"S=    c #6A6EC6",
+"T=    c #6C70C8",
+"U=    c #6C6EC7",
+"V=    c #6969C2",
+"W=    c #6364A7",
+"X=    c #57584D",
+"Y=    c #757500",
+"Z=    c #606002",
+"`=    c #3D3D3D",
+" -    c #282849",
+".-    c #0B0C18",
+"+-    c #28284A",
+"@-    c #B2B4C8",
+"#-    c #42426E",
+"$-    c #424270",
+"%-    c #444782",
+"&-    c #3A3B6E",
+"*-    c #454580",
+"=-    c #5F61BB",
+"--    c #6365BF",
+";-    c #696DC6",
+">-    c #6466C0",
+",-    c #6163BB",
+"'-    c #5C60A5",
+")-    c #6E6E69",
+"!-    c #787800",
+"~-    c #929200",
+"{-    c #9B9B00",
+"]-    c #7D7D0A",
+"^-    c #5E5F21",
+"/-    c #262746",
+"(-    c #1D1C32",
+"_-    c #08060C",
+":-    c #464683",
+"<-    c #808190",
+"[-    c #212039",
+"}-    c #42437B",
+"|-    c #4E5191",
+"1-    c #353864",
+"2-    c #4D5096",
+"3-    c #6666BE",
+"4-    c #6666C0",
+"5-    c #6465BE",
+"6-    c #6769C2",
+"7-    c #6063BC",
+"8-    c #5F63BE",
+"9-    c #6062A9",
+"0-    c #646688",
+"a-    c #666740",
+"b-    c #8D8D00",
+"c-    c #AEAE00",
+"d-    c #646455",
+"e-    c #19172B",
+"f-    c #19172A",
+"g-    c #0C0B15",
+"h-    c #131221",
+"i-    c #9394BA",
+"j-    c #FFFD41",
+"k-    c #5459A9",
+"l-    c #4E5294",
+"m-    c #6367C1",
+"n-    c #6262BC",
+"o-    c #5D61B5",
+"p-    c #6B6E6A",
+"q-    c #82832D",
+"r-    c #878856",
+"s-    c #595B66",
+"t-    c #27273C",
+"u-    c #414470",
+"v-    c #1C1C33",
+"w-    c #07040A",
+"x-    c #343462",
+"y-    c #000000",
+"z-    c #38375F",
+"A-    c #252645",
+"B-    c #242442",
+"C-    c #0A0912",
+"D-    c #120F1E",
+"E-    c #7676B2",
+"F-    c #222240",
+"G-    c #5F62BB",
+"H-    c #6061BA",
+"I-    c #5E60B9",
+"J-    c #5F64BD",
+"K-    c #6063BD",
+"L-    c #0B0B15",
+"M-    c #3B3D70",
+"N-    c #323256",
+"O-    c #393A68",
+"P-    c #4E4E95",
+"Q-    c #5C5FB8",
+"R-    c #5A5FB9",
+"S-    c #6267BA",
+"T-    c #141526",
+"U-    c #22253F",
+"V-    c #9295BC",
+"W-    c #626484",
+"X-    c #5A5EB8",
+"Y-    c #07050C",
+"Z-    c #101223",
+"`-    c #6B6EA0",
+" ;    c #6666BF",
+".;    c #0D0B16",
+"+;    c #494986",
+"@;    c #2F3258",
+"#;    c #3E3E74",
+"$;    c #585CB1",
+"%;    c #5C5EB8",
+"&;    c #5D60B9",
+"*;    c #43447A",
+"=;    c #12101F",
+"-;    c #1C1B33",
+";;    c #0E0E1A",
+">;    c #5857A5",
+",;    c #50529F",
+"';    c #444783",
+");    c #373863",
+"!;    c #42427B",
+"~;    c #454887",
+"{;    c #35365C",
+"];    c #262644",
+"^;    c #12101C",
+"/;    c #B0B3C6",
+"(;    c #515369",
+"_;    c #0D0E1C",
+":;    c #0E0E1C",
+"<;    c #3C3D6E",
+"[;    c #5759B0",
+"};    c #5558AB",
+"|;    c #4E5094",
+"1;    c #3B3E77",
+"2;    c #3F407C",
+"3;    c #3B3D73",
+"4;    c #3A3A6E",
+"5;    c #383A6F",
+"6;    c #3B3B70",
+"7;    c #454680",
+"8;    c #18172D",
+"9;    c #090A13",
+"0;    c #60607F",
+"a;    c #18172B",
+"b;    c #18182C",
+"c;    c #464882",
+"d;    c #545BAF",
+"e;    c #2F3158",
+"f;    c #363760",
+"g;    c #383860",
+"h;    c #303358",
+"i;    c #414272",
+"j;    c #0B0A12",
+"k;    c #262745",
+"l;    c #ACAEB6",
+"m;    c #55566D",
+"n;    c #1B1B32",
+"o;    c #2F2F4F",
+"p;    c #303054",
+"q;    c #393960",
+"r;    c #393A62",
+"s;    c #3D3E69",
+"t;    c #4C4E8E",
+"u;    c #4A4B8A",
+"v;    c #52539A",
+"w;    c #3C4070",
+"x;    c #20213B",
+"y;    c #110F1C",
+"z;    c #1E2038",
+"A;    c #616386",
+"B;    c #ADB1C2",
+"C;    c #0C0912",
+"D;    c #0A0A15",
+"E;    c #0F0F1B",
+"F;    c #121223",
+"G;    c #1A1B34",
+"H;    c #131223",
+"I;    c #141527",
+"J;    c #181A30",
+"K;    c #161324",
+"L;    c #0F0D19",
+"M;    c #080810",
+"N;    c #0B080F",
+"O;    c #0D0C18",
+"P;    c #20223B",
+"Q;    c #444379",
+"R;    c #AEB0BC",
+"S;    c #1E1E36",
+"T;    c #0B0D19",
+"U;    c #0A080E",
+"V;    c #08050A",
+"W;    c #09070D",
+"X;    c #090911",
+"Y;    c #10101D",
+"Z;    c #252946",
+"`;    c #373A69",
+" >    c #8A8CA2",
+".>    c #B0B0C0",
+"+>    c #8E8EA8",
+"@>    c #8A8BA0",
+"#>    c #868A9E",
+"$>    c #848698",
+"%>    c #838698",
+"&>    c #83879A",
+"*>    c #89889D",
+"=>    c #898DA4",
+"                                . + @ # $ % &     *                                           = - . ",
+"                                ; > , + ' ) ! ~ { ] ^                                         / ( _ ",
+"                                : < [ } + | 1 2 3 4                                         5 6 1 7 ",
+"                                    8 9 0 a ) b c d e f g h i j                             k l m n ",
+"                                o p q r s a s t u v w x y z A B C D E                       k F 1 G ",
+"                            H I J K L M . + , N O P Q R S T U V W X Y Z `                    ...# +.",
+"                        @.#.$.%.&.*.=.-.;.>.a + . ,.'.).!.~.{.].^./.(._.:.<.[.            }.|.1.2.3.",
+"                      4.5.6.7.8.9.0.a.b.c.d.e.' a s f.g.h.i.j.k.l.m.n.o.p.q.r.s.          t.u.v.w.  ",
+"                    x.y.z.A.B.C.D.E.F.G.H.I.J.+ K.L.M.N.O.P.Q.%.R.S.T.U.V.W.X.Y.Z.        `. +.+++  ",
+"                  @+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+s ]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+      7+8+9+0+  ",
+"                a+b+c+d+e+f+g+h+,+i+j+k+l+m+n+o+$ p+q+r+s+t+u+v+w+x+R.y+z+A+B+C+D+E+F+    G+H+I+J+  ",
+"              K+L+M+N+O+P+g+Q+R+S+T+U+V+W+X+Y+Z+a `+}  @.@+@@@#@$@%@&@M+*@z+=@-@;@>@,@'@  )@!@~@{@  ",
+"            ]@^@/@(@_@:@<@[@R+}@|@1@2@3@4@5@Y+6@a K.`+7@8@9@0@a@b@c@d@e@f@|+g@h@i@j@k@l@m@n@1.e.o@  ",
+"            p@q@r@s@t@u@v@w@j+x@y@z@A@B@B@C@D@E@p+s ..F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@  ",
+"          s. #.#+#@###$#%#R+&#*#=#-#;#>#,#'#)#!#m ~#{#..]#^#/#(#_#:+j.:#<#[#}#|#1#2#3#4#5#6#7#| 8#9#",
+"          0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#n#p#q#r#s#t#u#H+v#w#x#y#z#%@k.A#f@z+B#C#D#E#F#_@G#H#N I#J#",
+"        K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#Z#`# $.$+$@$#$$$7 @ e.%$&$:+*$N@<#P@z+=$1#C#-$;$>$,$'$I#a )$",
+"        !$~${$w ]$^$Q#=+/$($_$:$<$[$}$`#Z#}$|$1$2$3$4$5$6$,.7$8$9$$@0$a$b$P@c$d$e$C#f$g$h$i$j$k$K.l$",
+"        m$n$o$p$q$r$s$t$u$v$U#w$x$y$Z#Z#Z#Z#z$1$A$B$C$D$E$s F$t G$$@H$I$N@J$K$L$M$N$O$P$Q$R$S$8$!@T$",
+"      U$V$W$X$Y$Z$`$ %.%+%@%#%$%z@%%Y#Z#}$|$%%&%*%=%-%;%~+@ | ) >%,%%@&@'%)%!%_ @ k$Y+~%{%~+6$8$]%^%",
+"      /%(%_%:%<%[%}%|%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%R+f%g%1.. 0 h%i%j%k%l%7 s @ s 7$t m `+Z@m%!#n%  ",
+"      o%p%q%r%s%t%u%v%w%g+x%R+y%z%A%B%C%D%E%F%G%H%I%J%K%L%M%+ 8$N%c@O%P%+ p+I#Q%R%S%T%U%V%W%X%Y%Z%  ",
+"      `% &.&i$+&@&#&$&%&&&K%[@R+*&=&-&;&>&;&T+,&'&)&!&~&{&]&^&O /&(&_&`+m :&<&[&}&}&1#1#|&1&2&3&    ",
+"      4&5&6&7&8&9&0&a&b&c&d&K%u$e&f&g&h&i&i&j&k&l&m&n&o&p&m I#!@q&r&s&k$I#t&u&v&w&e$C#d$x&y&z&A&    ",
+"      B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&)&Q&R&S&T&U&V&W&X&Y&b ~%% r#Z&`& *M%.*+*@*#*$*%*1#&***=*-*;*    ",
+"      >*,*'*)*!*%@L@~*{*]*^*/*(*_*:*<*[*}*F.|*$#1*2*3*4*5*9+6*M%7*M%2 8*9*0*a*6$L.b*}&c*d*e*f*g*    ",
+"      c@i%h*i*j*d@k*L@H&l*m*n*o*p*q*r*s*t*u*v*/*w*x*y*J&z*A*A*_ B*K., F !%C*w#D*E*F*G*H*I*J*K*;*    ",
+"      L*z#M*N*O*&@k.<+:+P*Q*R*S*T*$&^*U*V*W*$&X*t+Y*Z*`* =.=m%# m%( #*!@+=I+7$@=`+I##=$=%=&=*===    ",
+"      -=:#3#i$;=N@k.Y.%@c@>=,='=R*)=O.!=~={=Z*]=l*^=y#y#l*/=(=e.e.( (=0 H+E@6@m ' $ _=:=<=[=}=|=    ",
+"      1=2=3=4=5=}+6=:#7=M@k*w+,%8=v+9&9=Q*_+~*0=a=G&b=Q.c=d=~+v#( e=B*e=6*% p+f=8$# g=h=i=j=k=l=    ",
+"      m=n=o=p=q=r=P@s=t=N@u=v=%@w=i%x=y=F&z=w+%.c=j.A=[+B=C=~#D=w##*u.e=e=E=^&F=I#M%e=G=H=}=I=J=    ",
+"      K=h$L=M=N=O=P=|+P@Q=R=7=:#S=&@T=%@j.j.U=d@k.V=x+b$:#W=X=D@Y=B* +H+D*D=O `+v.~+Z=`= -.-+-@-    ",
+"        #-$-%-&-*-=-|+P=[#--Q=}+t=:#N@e@Y.N@N@;-O@6=[+f@>->-,-'-)-6$ +!-2 } ~-..{-]-^-/-(-_-:-      ",
+"        <-[-}-|-1-2-|#|#H*[#P@[#P@P@O@3-}+4-5-P@--[#6-7-[#8-P@[#9-0-a-b-E*{-c-b-u.d-e-f-g-h-i-      ",
+"  j-j-j-j-j-k-l-j-j-j-j-j-j-j-H*[#$=H*j-j-j-|+[#7-|#m-j-j-j-H*n-j-j-o-p-q-r-j-j-s-t-u-v-w-x-[.      ",
+"  j-j-j-j-j-y-z-j-j-j-j-j-j-y-y-$=|#|#j-j-j-j-|#$=|#j-j-j-j-y-e$j-j-y-d$|#z+j-j-y-A-B-C-D-E-        ",
+"    y-y-j-j-y-F-j-j-y-y-y-y-y-}&c*G-H-j-j-j-j-j-I-j-j-j-j-j-y-1#j-j-y-J-K-[#j-j-y-B-L-_-M-          ",
+"        j-j-y-N-j-j-y-O-P-Q-C#R-C#|#C#j-j-y-j-j-y-j-j-y-j-j-y-C#j-j-y-P=|+S-j-j-y-T-_-U-V-          ",
+"        y-j-y-W-j-j-j-j-j-j-j-C#e$X-1#j-j-y-C#j-j-j-y-y-j-j-y-d$j-j-j-j-j-j-j-j-y-Y-Z-`-            ",
+"        y-j-y-  j-j-j-j-j-j-y-y-|#C#C#j-j-y-C#j-j-j-y-C#j-j-y- ;j-j-j-j-j-j-j-j-y-.;+;              ",
+"        y-j-y-  j-j-y-y-y-y-y-@;#;$;%;j-j-y-&;|#j-y-y-G-j-j-y-P@j-j-y-y-y-y-j-j-y-*;H               ",
+"        y-j-y-  j-j-y-=;-;;;>;,;';);!;j-j-y-B#n-=-y-K-P=j-j-y-~;j-j-y-{;];^;j-j-y-/;                ",
+"j-j-j-j-j-j-y-  j-j-y-(;_;:;<;j-[;};|;j-j-y-1;2;3;4;5;6;j-j-y-7;j-j-y-8;9;w-j-j-y-                  ",
+"  j-j-j-j-y-y-  j-j-y-  0;a;b;j-y-c;d;j-j-y-e;f;g;h;i;S j-j-y-U@j-j-y-k=j;k;j-j-y-                  ",
+"    y-y-y-y-      y-y-    l;m;j-y-n;o;p;y-y-q;r;s;t;u;v;w;y-y-x;y;y-y-z;A;B;  y-y-                  ",
+"                        j-j-j-j-j-j-j-C;D;E;F;G;H;I;v-J;K;L;M;N;O;P;Q;R;                            ",
+"                          y-y-j-y-y-y-y-S;=;T;U;V;_-W;X;Y;b;Z;`; >.>                                ",
+"                              j-y-        +>@>#>$>%>&>*>=>U$                                        ",
+"                              j-y-                                                                  ",
+"                                y-                                                                  "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.bmp
new file mode 100644 (file)
index 0000000..9112b6f
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_bl_voi.xpm
new file mode 100644 (file)
index 0000000..b91164c
--- /dev/null
@@ -0,0 +1,865 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_bl_voi_xpm[] = {
+"50 50 812 2",
+"      c #CED0CC",
+".     c #A9ABD5",
+"+     c #ACB0D6",
+"@     c #8D8FE2",
+"#     c #7D80D7",
+"$     c #5E5EB2",
+"%     c #6468C0",
+"&     c #5458AE",
+"*     c #5556AA",
+"=     c #5254A6",
+"-     c #6162B5",
+";     c #6667BE",
+">     c #808395",
+",     c #7E7E8E",
+"'     c #AAA8D2",
+")     c #9092D1",
+"!     c #5C5FAC",
+"~     c #505092",
+"{     c #5E5D9C",
+"]     c #6F70C1",
+"^     c #6A6FC6",
+"/     c #52549C",
+"(     c #42447A",
+"_     c #3F406E",
+":     c #36365D",
+"<     c #31325A",
+"[     c #2A2D51",
+"}     c #42447E",
+"|     c #5A60AD",
+"1     c #6362B9",
+"2     c #4B4C8B",
+"3     c #8081BE",
+"4     c #9899C5",
+"5     c #B2B3C6",
+"6     c #9092D0",
+"7     c #7678CE",
+"8     c #8487DA",
+"9     c #797CCC",
+"0     c #5B5DA9",
+"a     c #373968",
+"b     c #201F38",
+"c     c #1E1D34",
+"d     c #23223A",
+"e     c #1B1A2F",
+"f     c #1E1E37",
+"g     c #29294A",
+"h     c #373963",
+"i     c #43457C",
+"j     c #3E3E6E",
+"k     c #403E68",
+"l     c #45467C",
+"m     c #383964",
+"n     c #6669C0",
+"o     c #4C4D8A",
+"p     c #6A6E9A",
+"q     c #ACADB6",
+"r     c #BFC0D1",
+"s     c #8A8CCE",
+"t     c #585AA0",
+"u     c #6F72CB",
+"v     c #6D6DC5",
+"w     c #5A5CAD",
+"x     c #4B4F8E",
+"y     c #5A5996",
+"z     c #6466A4",
+"A     c #7F85D2",
+"B     c #8386D8",
+"C     c #8283D6",
+"D     c #7F80D4",
+"E     c #7A7BCF",
+"F     c #7072C9",
+"G     c #6D6EC4",
+"H     c #686ABF",
+"I     c #5E62B2",
+"J     c #53569B",
+"K     c #454378",
+"L     c #2D2F52",
+"M     c #3C3C66",
+"N     c #414170",
+"O     c #5658AA",
+"P     c #454476",
+"Q     c #7575A9",
+"R     c #B5B5C9",
+"S     c #BFC2D2",
+"T     c #8487DB",
+"U     c #5A5EAF",
+"V     c #45457D",
+"W     c #5B61B6",
+"X     c #4F5294",
+"Y     c #6C6EAF",
+"Z     c #8D90DB",
+"`     c #9898E7",
+" .    c #9697E5",
+"..    c #9797E4",
+"+.    c #9498E5",
+"@.    c #9094E4",
+"#.    c #8E92E2",
+"$.    c #8A8DDF",
+"%.    c #8386DA",
+"&.    c #7C7BD3",
+"*.    c #7275CD",
+"=.    c #6C70C9",
+"-.    c #696BC4",
+";.    c #5A5DAE",
+">.    c #414178",
+",.    c #3B3A67",
+"'.    c #3F4272",
+").    c #444476",
+"!.    c #666AC0",
+"~.    c #6B6AC4",
+"{.    c #B7B9CC",
+"].    c #9EA1CB",
+"^.    c #7C7ED4",
+"/.    c #5C5DA8",
+"(.    c #3B3B6A",
+"_.    c #464682",
+":.    c #696AAA",
+"<.    c #9A9AE6",
+"[.    c #9C9DE6",
+"}.    c #A6A6ED",
+"|.    c #A8A6EE",
+"1.    c #A9A8EF",
+"2.    c #A9A7EF",
+"3.    c #A1A1ED",
+"4.    c #9D9CEA",
+"5.    c #9698E8",
+"6.    c #8A8CDE",
+"7.    c #8183D9",
+"8.    c #7A7CD5",
+"9.    c #7578D2",
+"0.    c #686CC5",
+"a.    c #6466BE",
+"b.    c #595DB3",
+"c.    c #424078",
+"d.    c #33335A",
+"e.    c #5A59A4",
+"f.    c #6568C0",
+"g.    c #6A6AC4",
+"h.    c #9B9CC7",
+"i.    c #989BD9",
+"j.    c #7C80D7",
+"k.    c #4C4E91",
+"l.    c #3D3F6E",
+"m.    c #32345A",
+"n.    c #898BD0",
+"o.    c #A3A3EC",
+"p.    c #A9A8EE",
+"q.    c #AEAFF2",
+"r.    c #B5B4F2",
+"s.    c #B7B8F4",
+"t.    c #B8B9F4",
+"u.    c #B4B4F4",
+"v.    c #B4B3F1",
+"w.    c #AFAEF1",
+"x.    c #A8A8EF",
+"y.    c #9FA0EA",
+"z.    c #989AEA",
+"A.    c #868CDE",
+"B.    c #7E82D8",
+"C.    c #7A7DD6",
+"D.    c #7376CF",
+"E.    c #6E71CA",
+"F.    c #6A6CC4",
+"G.    c #6567C0",
+"H.    c #6163BD",
+"I.    c #4D5098",
+"J.    c #32335C",
+"K.    c #474B86",
+"L.    c #6768BF",
+"M.    c #6C6CC5",
+"N.    c #7576B5",
+"O.    c #9498D7",
+"P.    c #8588DC",
+"Q.    c #7378CD",
+"R.    c #3F3F72",
+"S.    c #373961",
+"T.    c #8484C4",
+"U.    c #A4A4EC",
+"V.    c #AFB0F2",
+"W.    c #BCBCF6",
+"X.    c #C2C2F6",
+"Y.    c #C5C4F6",
+"Z.    c #C4C4F7",
+"`.    c #C0C1F5",
+" +    c #BDBEF6",
+".+    c #BBBBF5",
+"++    c #B6B5F2",
+"@+    c #ADABF0",
+"#+    c #9899E7",
+"$+    c #9193E3",
+"%+    c #8688DC",
+"&+    c #8080D5",
+"*+    c #7879D2",
+"=+    c #7374CC",
+"-+    c #6C6EC8",
+";+    c #6466BF",
+">+    c #6262BB",
+",+    c #5357A8",
+"'+    c #42437C",
+")+    c #525196",
+"!+    c #5F60B6",
+"~+    c #6263BB",
+"{+    c #7878BB",
+"]+    c #BBBED0",
+"^+    c #878BDF",
+"/+    c #666AC2",
+"(+    c #55549F",
+"_+    c #40406B",
+":+    c #8A8CD0",
+"<+    c #B1B2F1",
+"[+    c #BAB9F4",
+"}+    c #C4C2F6",
+"|+    c #C9C8F6",
+"1+    c #CBCDF9",
+"2+    c #CCCEF8",
+"3+    c #000000",
+"4+    c #8A8EDF",
+"5+    c #444884",
+"6+    c #4B4D94",
+"7+    c #54539D",
+"8+    c #5656A4",
+"9+    c #AEAEB9",
+"0+    c #B3B3C6",
+"a+    c #888ADD",
+"b+    c #7F81D6",
+"c+    c #5C5EAD",
+"d+    c #4B4B7E",
+"e+    c #8A8ACA",
+"f+    c #A3A2EB",
+"g+    c #AEADF0",
+"h+    c #C2C2F5",
+"i+    c #CDCCF8",
+"j+    c #D0D1F9",
+"k+    c #D6D6FA",
+"l+    c #DADCFC",
+"m+    c #CCCCCC",
+"n+    c #9194E2",
+"o+    c #595BAD",
+"p+    c #41447E",
+"q+    c #4E529B",
+"r+    c #4F508F",
+"s+    c #4F4F8E",
+"t+    c #B4B5C8",
+"u+    c #8586C8",
+"v+    c #7A7DD4",
+"w+    c #696AC2",
+"x+    c #3C3C6A",
+"y+    c #7879B8",
+"z+    c #A09FE9",
+"A+    c #A8A8F0",
+"B+    c #B6B6F3",
+"C+    c #C9CAF8",
+"D+    c #D0D2F9",
+"E+    c #D9D9FC",
+"F+    c #DCDEFC",
+"G+    c #E0E0FA",
+"H+    c #5F5FB8",
+"I+    c #5B5AAB",
+"J+    c #302F52",
+"K+    c #4E5090",
+"L+    c #4E4E88",
+"M+    c #70709F",
+"N+    c #7679D1",
+"O+    c #515396",
+"P+    c #46467E",
+"Q+    c #515385",
+"R+    c #9796E3",
+"S+    c #A1A2EC",
+"T+    c #ACACF1",
+"U+    c #C7C7F7",
+"V+    c #D1D0F8",
+"W+    c #D9DAFB",
+"X+    c #E0E0FB",
+"Y+    c #E4E3FA",
+"Z+    c #E7E5FA",
+"`+    c #9B9EE8",
+" @    c #5D61BC",
+".@    c #595DB4",
+"+@    c #41407C",
+"@@    c #454677",
+"#@    c #4A4A7C",
+"$@    c #484876",
+"%@    c #AFB1C0",
+"&@    c #6669C1",
+"*@    c #5B5DAE",
+"=@    c #343660",
+"-@    c #393C65",
+";@    c #8A8DD8",
+">@    c #9798E6",
+",@    c #A1A4EE",
+"'@    c #B0B0F1",
+")@    c #BEBEF6",
+"!@    c #C8C9F7",
+"~@    c #D2D1F9",
+"{@    c #DBDDFB",
+"]@    c #E5E4FA",
+"^@    c #E6EAFC",
+"/@    c #E9ECFC",
+"(@    c #9B9CE9",
+"_@    c #5D5FB8",
+":@    c #5A5EB6",
+"<@    c #5A5BAF",
+"[@    c #37375E",
+"}@    c #4D508E",
+"|@    c #4A4882",
+"1@    c #9396C1",
+"2@    c #5B5DB2",
+"3@    c #484C8D",
+"4@    c #2D2F54",
+"5@    c #6A6AA8",
+"6@    c #9290E0",
+"7@    c #666666",
+"8@    c #996666",
+"9@    c #333333",
+"0@    c #D4D3F8",
+"a@    c #DDE0FC",
+"b@    c #E6E6FB",
+"c@    c #EBEAFC",
+"d@    c #EAEBFC",
+"e@    c #9B9DEA",
+"f@    c #6060B8",
+"g@    c #5C60BA",
+"h@    c #464782",
+"i@    c #4A4A81",
+"j@    c #4D4E8A",
+"k@    c #3E3D67",
+"l@    c #9797C0",
+"m@    c #7A7AB6",
+"n@    c #5A5AAA",
+"o@    c #4C4C8B",
+"p@    c #797BC3",
+"q@    c #9090E1",
+"r@    c #FFFFCC",
+"s@    c #999999",
+"t@    c #336666",
+"u@    c #DDDEFC",
+"v@    c #E4E5FB",
+"w@    c #EAECFC",
+"x@    c #E9ECFD",
+"y@    c #9C9EEA",
+"z@    c #5E60BA",
+"A@    c #5A5EB8",
+"B@    c #5055A5",
+"C@    c #3C3D66",
+"D@    c #4B4C81",
+"E@    c #3A3B64",
+"F@    c #6D6D99",
+"G@    c #4C4F90",
+"H@    c #505396",
+"I@    c #34345A",
+"J@    c #3E406C",
+"K@    c #7D7ECC",
+"L@    c #FFFFFF",
+"M@    c #663366",
+"N@    c #E6E4FB",
+"O@    c #9C9CE9",
+"P@    c #5C60BB",
+"Q@    c #5C60B9",
+"R@    c #5B5FBA",
+"S@    c #5D5FB9",
+"T@    c #3B3A6B",
+"U@    c #3F4271",
+"V@    c #40416C",
+"W@    c #3B3867",
+"X@    c #9091AF",
+"Y@    c #505297",
+"Z@    c #4C4D8C",
+"`@    c #464680",
+" #    c #48487A",
+".#    c #7F82D2",
+"+#    c #E4E3FB",
+"@#    c #9799E5",
+"##    c #5E60B9",
+"$#    c #4B4B8E",
+"%#    c #373661",
+"&#    c #323358",
+"*#    c #1C1A2D",
+"=#    c #9898C4",
+"-#    c #62648A",
+";#    c #414077",
+">#    c #5858A9",
+",#    c #3E4274",
+"'#    c #676BB3",
+")#    c #8184D6",
+"!#    c #D7D9FC",
+"~#    c #DEE0FC",
+"{#    c #E5E4FC",
+"]#    c #E3E5FC",
+"^#    c #E0E1FA",
+"/#    c #DADBFB",
+"(#    c #D5D4F9",
+"_#    c #CCCEF7",
+":#    c #C0C2F6",
+"<#    c #A0A1EB",
+"[#    c #9796E6",
+"}#    c #898DDE",
+"|#    c #8184D8",
+"1#    c #777AD2",
+"2#    c #7174CD",
+"3#    c #6A6EC7",
+"4#    c #686CC4",
+"5#    c #6266BF",
+"6#    c #5F61BB",
+"7#    c #5E5EB6",
+"8#    c #31335E",
+"9#    c #2A2E50",
+"0#    c #232440",
+"a#    c #7474A8",
+"b#    c #6D6FC7",
+"c#    c #5C5D99",
+"d#    c #232546",
+"e#    c #21213B",
+"f#    c #7576C6",
+"g#    c #8181D6",
+"h#    c #D2CFF8",
+"i#    c #D7D7FA",
+"j#    c #D8D8FC",
+"k#    c #8E90E1",
+"l#    c #5E5FBA",
+"m#    c #4B4A86",
+"n#    c #272849",
+"o#    c #4A4A8B",
+"p#    c #767AD1",
+"q#    c #7F82D8",
+"r#    c #5B5CAA",
+"s#    c #787ACD",
+"t#    c #FFCC00",
+"u#    c #C1C0F4",
+"v#    c #C6C6F5",
+"w#    c #CAC9F7",
+"x#    c #CECEF7",
+"y#    c #8C8DDF",
+"z#    c #5D60B9",
+"A#    c #5B5FB9",
+"B#    c #46457D",
+"C#    c #45487D",
+"D#    c #262544",
+"E#    c #3F3F79",
+"F#    c #7C7FD6",
+"G#    c #6969C0",
+"H#    c #4A4C8C",
+"I#    c #373864",
+"J#    c #FF6600",
+"K#    c #666699",
+"L#    c #CC6600",
+"M#    c #BEBCF3",
+"N#    c #C0BEF5",
+"O#    c #8488DC",
+"P#    c #5A5EB9",
+"Q#    c #414276",
+"R#    c #46477F",
+"S#    c #2C2C4D",
+"T#    c #39386E",
+"U#    c #6D70CB",
+"V#    c #6062BA",
+"W#    c #4A4988",
+"X#    c #2E3055",
+"Y#    c #FFCC99",
+"Z#    c #333366",
+"`#    c #B6B6F4",
+" $    c #7F81D7",
+".$    c #5F60B8",
+"+$    c #404175",
+"@$    c #44467A",
+"#$    c #232442",
+"$$    c #323264",
+"%$    c #6367C0",
+"&$    c #656AC2",
+"*$    c #424475",
+"=$    c #2D2E51",
+"-$    c #336633",
+";$    c #A7A7EE",
+">$    c #7C7CD6",
+",$    c #6060B9",
+"'$    c #3B3C6E",
+")$    c #121222",
+"!$    c #2F2E5B",
+"~$    c #7073CC",
+"{$    c #4D4C8E",
+"]$    c #2E2F54",
+"^$    c #663333",
+"/$    c #9B9CEA",
+"($    c #6062BC",
+"_$    c #3E4074",
+":$    c #292A4A",
+"<$    c #12101E",
+"[$    c #6D70C9",
+"}$    c #7477D0",
+"|$    c #53549A",
+"1$    c #2D2C4F",
+"2$    c #8F91E1",
+"3$    c #5B5FB8",
+"4$    c #6061B9",
+"5$    c #5E62BD",
+"6$    c #3D3D6D",
+"7$    c #222342",
+"8$    c #101121",
+"9$    c #38366D",
+"0$    c #6064BA",
+"a$    c #8285D9",
+"b$    c #7A7BD4",
+"c$    c #5F62BB",
+"d$    c #5A5AAB",
+"e$    c #383A65",
+"f$    c #262645",
+"g$    c #0F101E",
+"h$    c #424380",
+"i$    c #585BAA",
+"j$    c #4F5091",
+"k$    c #494980",
+"l$    c #484D8F",
+"m$    c #797CD5",
+"n$    c #7071CA",
+"o$    c #5E60B8",
+"p$    c #494C8E",
+"q$    c #353358",
+"r$    c #1E1D36",
+"s$    c #09080F",
+"t$    c #595AA4",
+"u$    c #8B8CA4",
+"v$    c #484B7F",
+"w$    c #494C80",
+"x$    c #474882",
+"y$    c #666633",
+"z$    c #7475CD",
+"A$    c #7274CC",
+"B$    c #7376CE",
+"C$    c #6F73CC",
+"D$    c #7272C8",
+"E$    c #6C6EC6",
+"F$    c #6467C1",
+"G$    c #6565BE",
+"H$    c #6164BF",
+"I$    c #6364BC",
+"J$    c #6465BE",
+"K$    c #5F62BA",
+"L$    c #5B5EB6",
+"M$    c #3B3C66",
+"N$    c #2D2E52",
+"O$    c #131220",
+"P$    c #9294BE",
+"Q$    c #AFB0BA",
+"R$    c #3E416D",
+"S$    c #4A4B83",
+"T$    c #6D71CA",
+"U$    c #6466C0",
+"V$    c #5F63BC",
+"W$    c #4C4D95",
+"X$    c #333258",
+"Y$    c #282849",
+"Z$    c #0B0C18",
+"`$    c #28284A",
+" %    c #B2B4C8",
+".%    c #42426E",
+"+%    c #424270",
+"@%    c #444782",
+"#%    c #3A3B6E",
+"$%    c #686AC3",
+"%%    c #6464BC",
+"&%    c #6463BA",
+"*%    c #333767",
+"=%    c #262746",
+"-%    c #1D1C32",
+";%    c #08060C",
+">%    c #464683",
+",%    c #808190",
+"'%    c #212039",
+")%    c #42437B",
+"!%    c #4E5191",
+"~%    c #CC3300",
+"{%    c #6868C0",
+"]%    c #6666BE",
+"^%    c #5F63BE",
+"/%    c #6064BE",
+"(%    c #4A4A8E",
+"_%    c #19172B",
+":%    c #19172A",
+"<%    c #0C0B15",
+"[%    c #131221",
+"}%    c #9394BA",
+"|%    c #ACAFBC",
+"1%    c #4B4C86",
+"2%    c #5459A9",
+"3%    c #4E5294",
+"4%    c #660000",
+"5%    c #990000",
+"6%    c #5E62BC",
+"7%    c #6668C0",
+"8%    c #5A5EB2",
+"9%    c #242443",
+"0%    c #414470",
+"a%    c #1C1C33",
+"b%    c #07040A",
+"c%    c #343462",
+"d%    c #6A6B90",
+"e%    c #3E3F69",
+"f%    c #38375F",
+"g%    c #6164B9",
+"h%    c #302F5A",
+"i%    c #252645",
+"j%    c #242442",
+"k%    c #0A0912",
+"l%    c #120F1E",
+"m%    c #7676B2",
+"n%    c #282948",
+"o%    c #222240",
+"p%    c #6061BA",
+"q%    c #454684",
+"r%    c #393A63",
+"s%    c #0B0B15",
+"t%    c #3B3D70",
+"u%    c #87889D",
+"v%    c #323256",
+"w%    c #4D4D88",
+"x%    c #323458",
+"y%    c #434476",
+"z%    c #393A68",
+"A%    c #4E4E95",
+"B%    c #5C5FB8",
+"C%    c #5A5FB9",
+"D%    c #484A7C",
+"E%    c #141526",
+"F%    c #22253F",
+"G%    c #9295BC",
+"H%    c #626484",
+"I%    c #333459",
+"J%    c #484A88",
+"K%    c #4D4E94",
+"L%    c #3E4073",
+"M%    c #3D3E75",
+"N%    c #5A5EB7",
+"O%    c #6064BD",
+"P%    c #4C4E86",
+"Q%    c #242542",
+"R%    c #07050C",
+"S%    c #101223",
+"T%    c #6B6EA0",
+"U%    c #34345D",
+"V%    c #191A30",
+"W%    c #36365E",
+"X%    c #4A4A88",
+"Y%    c #313056",
+"Z%    c #30305D",
+"`%    c #5255A3",
+" &    c #6064BF",
+".&    c #2E2E50",
+"+&    c #0C0912",
+"@&    c #0D0B16",
+"#&    c #494986",
+"$&    c #ADAFBA",
+"%&    c #292B4C",
+"&&    c #18172B",
+"*&    c #333456",
+"=&    c #38385F",
+"-&    c #232240",
+";&    c #34335C",
+">&    c #2F3258",
+",&    c #3E3E74",
+"'&    c #585CB1",
+")&    c #5C5EB8",
+"!&    c #6265BD",
+"~&    c #6464BD",
+"{&    c #6263BC",
+"]&    c #5E60B6",
+"^&    c #444684",
+"/&    c #2C2E52",
+"(&    c #2C2A4A",
+"_&    c #424474",
+":&    c #232543",
+"<&    c #0C0C16",
+"[&    c #0E0D19",
+"}&    c #43447A",
+"|&    c #ACAFB9",
+"1&    c #2E2E52",
+"2&    c #12101F",
+"3&    c #1C1B33",
+"4&    c #0E0E1A",
+"5&    c #5857A5",
+"6&    c #50529F",
+"7&    c #444783",
+"8&    c #373863",
+"9&    c #42427B",
+"0&    c #474A8E",
+"a&    c #52529E",
+"b&    c #595BB0",
+"c&    c #6262BC",
+"d&    c #6062BB",
+"e&    c #6063BD",
+"f&    c #575EB2",
+"g&    c #454887",
+"h&    c #3C3F76",
+"i&    c #2F3056",
+"j&    c #383965",
+"k&    c #35365C",
+"l&    c #262644",
+"m&    c #12101C",
+"n&    c #0A060C",
+"o&    c #0F101C",
+"p&    c #424479",
+"q&    c #B0B3C6",
+"r&    c #515369",
+"s&    c #0D0E1C",
+"t&    c #0E0E1C",
+"u&    c #3C3D6E",
+"v&    c #4A4F8E",
+"w&    c #5759B0",
+"x&    c #5558AB",
+"y&    c #4E5094",
+"z&    c #363764",
+"A&    c #3C3B6E",
+"B&    c #3B3E77",
+"C&    c #3F407C",
+"D&    c #3B3D73",
+"E&    c #3A3A6E",
+"F&    c #383A6F",
+"G&    c #3B3B70",
+"H&    c #3C3B70",
+"I&    c #3A3B6D",
+"J&    c #34355E",
+"K&    c #454680",
+"L&    c #4E5095",
+"M&    c #474C8A",
+"N&    c #18172D",
+"O&    c #090A13",
+"P&    c #161728",
+"Q&    c #64668E",
+"R&    c #60607F",
+"S&    c #18182C",
+"T&    c #292A49",
+"U&    c #3C3C68",
+"V&    c #464882",
+"W&    c #545BAF",
+"X&    c #50529A",
+"Y&    c #3D406D",
+"Z&    c #3B3E6B",
+"`&    c #2F3158",
+" *    c #363760",
+".*    c #383860",
+"+*    c #303358",
+"@*    c #414272",
+"#*    c #46487E",
+"$*    c #4C4A7E",
+"%*    c #4D5091",
+"&*    c #383962",
+"**    c #0A060E",
+"=*    c #0B0A12",
+"-*    c #262745",
+";*    c #7070A4",
+">*    c #ACAEB6",
+",*    c #55566D",
+"'*    c #131528",
+")*    c #141221",
+"!*    c #1B1B32",
+"~*    c #2F2F4F",
+"{*    c #303054",
+"]*    c #292847",
+"^*    c #323257",
+"/*    c #393960",
+"(*    c #393A62",
+"_*    c #3D3E69",
+":*    c #4C4E8E",
+"<*    c #4A4B8A",
+"[*    c #52539A",
+"}*    c #3C4070",
+"|*    c #343459",
+"1*    c #20213B",
+"2*    c #110F1C",
+"3*    c #08070E",
+"4*    c #1E2038",
+"5*    c #616386",
+"6*    c #ADB1C2",
+"7*    c #AAAEB6",
+"8*    c #32335B",
+"9*    c #19182C",
+"0*    c #0F0E1B",
+"a*    c #0A0A15",
+"b*    c #0F0F1B",
+"c*    c #121223",
+"d*    c #1A1B34",
+"e*    c #131223",
+"f*    c #141527",
+"g*    c #181A30",
+"h*    c #161324",
+"i*    c #0F0D19",
+"j*    c #080810",
+"k*    c #0B080F",
+"l*    c #0D0C18",
+"m*    c #20223B",
+"n*    c #444379",
+"o*    c #AEB0BC",
+"p*    c #ADAEB8",
+"q*    c #848394",
+"r*    c #2E3054",
+"s*    c #1E1E36",
+"t*    c #0B0D19",
+"u*    c #0A080E",
+"v*    c #08050A",
+"w*    c #09070D",
+"x*    c #090911",
+"y*    c #10101D",
+"z*    c #252946",
+"A*    c #373A69",
+"B*    c #8A8CA2",
+"C*    c #B0B0C0",
+"D*    c #8E8EA8",
+"E*    c #8A8BA0",
+"F*    c #868A9E",
+"G*    c #848698",
+"H*    c #838698",
+"I*    c #83879A",
+"J*    c #89889D",
+"K*    c #898DA4",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F G H I J K L M N O P Q R                       ",
+"                      S T U V W X Y Z `  ...+.@.#.$.%.# &.*.=.-.;.>.,.'.).!.~.{.                    ",
+"                    ].^./.(._.:.<.[.}.|.1.|.2.3.4.5.#.6.7.8.9.u 0.a.b.c.d.e.f.g.h.                  ",
+"                  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.                ",
+"                O.P.Q.R.S.T.U.V.s.W.X.Y.Z.`. +.+++@+y.#+$+%+&+*+=+-+0.;+>+,+'+)+!+~+{+              ",
+"              ]+^+/+(+_+:+U.<+[+}+|+1+2+3+3+3+3+3+3+3+3+3+4+3+3+3+3+3+3+3+3+3+5+6+7+8+9+            ",
+"            0+a+b+c+d+e+f+g+[+h+i+j+k+l+3+3+3+m+3+3+3+3+3+n+3+3+3+m+3+3+3+3+3+o+p+q+r+s+t+          ",
+"            u+v+w+x+y+z+A+B+X.C+D+E+F+G+3+3+3+3+m+3+3+3+3+5.3+3+3+3+m+3+3+3+3+H+I+J+K+L+M+          ",
+"          {.N+O+P+Q+R+S+T+[+U+V+W+X+Y+Z+3+3+3+3+3+m+m+m+3+`+3+3+3+3+3+m+m+m+3+ @.@+@@@#@$@%@        ",
+"          &@*@=@-@;@>@,@'@)@!@~@{@]@^@/@3+3+m+3+m+3+3+3+3+(@3+3+m+3+m+3+3+3+3+_@:@<@[@}@d+|@        ",
+"        1@2@3@4@5@6@#+7@7@8@9@0@a@b@c@d@3+3+3+m+m+3+3+3+3+e@3+3+3+m+m+3+3+3+3+f@g@g@h@i@j@k@l@      ",
+"        m@n@o@: p@q@7@r@m+s@t@3+u@v@w@x@3+3+3+m+3+3+3+3+3+y@3+3+3+m+3+3+3+3+3+z@A@g@B@C@D@E@F@      ",
+"        G@H@I@J@K@7@L@L@L@m+s@M@3+N@d@d@3+3+3+3+m+3+3+3+3+O@3+3+3+3+m+3+3+3+3+P@Q@R@S@T@U@V@W@      ",
+"      X@Y@Z@`@ #.#7@m+L@L@m+s@7@3++#c@d@3+3+3+3+3+3+3+3+3+@#3+3+3+3+3+3+3+3+3+f@Q@R@##$#%#&#*#=#    ",
+"      -#;#>#,#'#)#s@s@m+L@m+s@9@3+!#~#{#]#^#/#(#_#:#[+g+<#[#}#|#1#2#3#4#5#H. @6#g@g@R@7#8#9#0#a#    ",
+"      b#c#d#e#f#g#7@7@s@s@s@7@9@3+h#i#j#3+3+3+3+3+3+3+3+3+k#3+3+3+3+3+3+3+3+3+g@Q@P@R@l#m#Z@n#o#    ",
+"      p#q#r#E@s#7@t#7@7@7@9@7@7@u#v#w#x#3+3+3+m+3+3+3+3+3+y#3+3+3+m+3+3+3+3+3+z#A#R@P@P@B#C#D#E#    ",
+"      F#G#H#I#s@m+t#J#7@7@K#7@L#9@9@M#N#3+3+3+3+m+3+3+3+3+O#3+3+3+3+m+3+3+3+3+g@Q@P#g@z@Q#R#S#T#    ",
+"      U#V#W#X#s@Y#L@L@J#J#J#L#L#L#t#Z#`#3+3+3+3+3+m+m+m+3+ $3+3+3+3+3+m+m+m+3+g@g@g@P@.$+$@$#$$$    ",
+"      %$&$*$=$s@Y#r@r@L@L@t#t#t#t#J#-$;$3+3+m+3+m+3+3+3+3+>$3+3+m+3+m+3+3+3+3+g@A#g@R@,$'$&#)$!$    ",
+"      ~$2#{$]$s@Y#Y#Y#r@r@L@r@t#J#L#^$/$3+3+3+m+m+3+3+3+3+C.3+3+3+m+m+3+3+3+3+g@:@g@z#($_$:$<$$$    ",
+"      [$}$|$1$s@Y#t#Y#Y#Y#r@r@J#J#L#t@2$3+3+3+m+3+3+3+3+3+ $3+3+3+m+3+3+3+3+3+g@3$g@4$5$6$7$8$9$    ",
+"      0$4#@@E@s@Y#t#t#Y#Y#Y#Y#J#J#L#9@a$3+3+3+3+m+3+3+3+3+b$3+3+3+3+m+3+3+3+3+g@Q@c$>+d$e$f$g$h$    ",
+"      i$j$k$l$s@Y#t#t#t#Y#Y#Y#J#L#L#Z#m$3+3+3+3+3+3+3+3+3+n$3+3+3+3+3+3+3+3+3+g@:@o$H.p$q$r$s$t$    ",
+"      u$v$w$x$s@Y#t#t#t#t#t#Y#J#L#L#y$z$A$B$=+u C$=.D$F.E$0.F$G$H$I$($R@P#P#J$K$c$>+L$M$N$g$O$P$    ",
+"      Q$D@R$S$s@Y#t#t#t#t#t#t#J#L#L#9@T$3+3+3+3+3+3+3+3+3+U$3+3+3+3+3+3+3+3+3+V$K$H.W$X$Y$Z$`$ %    ",
+"        .%+%@%#%s@Y#t#t#t#t#t#J#L#L#Z#$%3+3+3+m+3+3+3+3+3+U$3+3+3+m+3+3+3+3+3+f.%%&%*%=%-%;%>%      ",
+"        ,%'%)%!%s@Y#t#t#t#t#t#J#~%9@{%]%3+3+3+3+m+3+3+3+3+^%3+3+3+3+m+3+3+3+3+f./%(%_%:%<%[%}%      ",
+"        |%1%2%3%s@Y#t#4%t#t#t#5%~%y$($($3+3+3+3+3+m+m+m+3+6%3+3+3+3+3+m+m+m+3+7%8%9%0%a%b%c%R       ",
+"          d%e%f%s@Y#t#5%t#t#4%5%L#Z# @6%3+3+m+3+m+3+3+3+3+ @3+3+m+3+m+3+3+3+3+g%h%i%j%k%l%m%        ",
+"            n%o%s@Y#t#5%t#t#J#J#L#9@p%p%3+3+3+m+m+3+3+3+3+g@3+3+3+m+m+3+3+3+3+q%r%j%s%;%t%          ",
+"            u%v%w%x%y%z%A%B%g@C%g@ @g@g@3+3+3+m+3+3+3+3+3+g@3+3+3+m+3+3+3+3+3+r%D%E%;%F%G%          ",
+"              H%I%i%J%K%L%M%N%g@P#A@P@C%3+3+3+3+m+3+3+3+3+O%3+3+3+3+m+3+3+3+3+P%Q%R%S%T%            ",
+"                U%V%W%O X%Y%Z%`% @g@g@g@3+3+3+3+3+3+3+3+3+ &3+3+3+3+3+3+3+3+3+.&+&@&#&              ",
+"                $&%&&&*&=&-&;&>&,&'&)&_@g@g@z# @g@c$p%c$4$!&/%~&{&]&^&/&(&_&:&<&[&}&5               ",
+"                  |&1&2&3&4&5&6&7&8&9&0&a&b&_@c&6#d&e&{&H.($f&g&h&i&j&k&l&m&n&o&p&q&                ",
+"                      r&s&t&u&v&w&x&y&_.z&A&B&C&D&E&F&G&H&I&J&K&L&M&`$N&O&b%P&Q&                    ",
+"                        R&&&S&T&U&V&W&X&Y&Z&`& *.*+*@*i #*$*%*K+&*J+**s$=*-*;*                      ",
+"                          >*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*&*|*1*2*;%3*4*5*6*                        ",
+"                              7*8*9*0*+&a*b*c*d*e*f*a%g*h*i*j*k*l*m*n*o*                            ",
+"                                  p*q*r*s*2&t*u*v*;%w*x*y*S&z*A*B*C*                                ",
+"                                          D*E*F*G*H*I*J*K*X@                                        ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.bmp
new file mode 100644 (file)
index 0000000..638b93b
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_mask.xpm
new file mode 100644 (file)
index 0000000..dca5bb5
--- /dev/null
@@ -0,0 +1,55 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_mask_xpm[] = {
+"50 50 2 1",
+"      c #000000",
+".     c #FFFFFF",
+"                                                  ",
+"                                                  ",
+"                                                  ",
+"                   .............                  ",
+"                ...................               ",
+"              .......................             ",
+"            ...........................           ",
+"           .............................          ",
+"          ...............................         ",
+"         .................................        ",
+"        ...................................       ",
+"       .....................................      ",
+"      .......................................     ",
+"      .......................................     ",
+"     .........................................    ",
+"     .........................................    ",
+"    ...........................................   ",
+"    ...........................................   ",
+"    ...........................................   ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"   .............................................  ",
+"    ...........................................   ",
+"    ...........................................   ",
+"    ...........................................   ",
+"     .........................................    ",
+"      .......................................     ",
+"      .......................................     ",
+"       .....................................      ",
+"        ...................................       ",
+"        ...................................       ",
+"         .................................        ",
+"           .............................          ",
+"            ...........................           ",
+"             .........................            ",
+"               .....................              ",
+"                 .................                ",
+"                     .........                    ",
+"                                                  ",
+"                                                  "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.bmp
new file mode 100644 (file)
index 0000000..2c7a021
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_ListPatient.xpm
new file mode 100644 (file)
index 0000000..9a3f080
--- /dev/null
@@ -0,0 +1,804 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_re_ListPatient_xpm[] = {
+"50 50 751 2",
+"      c #CED0CC",
+".     c #D0B4B2",
+"+     c #D49B9A",
+"@     c #D09594",
+"#     c #D39A9A",
+"$     c #D19A97",
+"%     c #C38A8A",
+"&     c #C88E8D",
+"*     c #CD9391",
+"=     c #CD9392",
+"-     c #CEB0AE",
+";     c #D09796",
+">     c #CE7778",
+",     c #DE6F70",
+"'     c #E78382",
+")     c #E88585",
+"!     c #E17373",
+"~     c #C05051",
+"{     c #CE5758",
+"]     c #BC4647",
+"^     c #B64345",
+"/     c #B24243",
+"(     c #C25454",
+"_     c #CB595A",
+":     c #9D3A3C",
+"<     c #945354",
+"[     c #C38E8D",
+"}     c #D29796",
+"|     c #DE7172",
+"1     c #DA6A6A",
+"2     c #BA5152",
+"3     c #A94848",
+"4     c #B05050",
+"5     c #C86261",
+"6     c #D06262",
+"7     c #B24747",
+"8     c #953638",
+"9     c #822E2D",
+"0     c #6C2523",
+"a     c #662526",
+"b     c #571819",
+"c     c #8E3334",
+"d     c #BD4F4E",
+"e     c #C95558",
+"f     c #9B3A3A",
+"g     c #C35354",
+"h     c #CD9190",
+"i     c #D39897",
+"j     c #D25E5F",
+"k     c #D46666",
+"l     c #D66867",
+"m     c #E17879",
+"n     c #D96E6E",
+"o     c #C85858",
+"p     c #A03D3F",
+"q     c #7A2C2D",
+"r     c #581D1E",
+"s     c #571C1B",
+"t     c #401211",
+"u     c #2A0A0A",
+"v     c #340E0E",
+"w     c #5D1E1C",
+"x     c #903433",
+"y     c #802E2E",
+"z     c #7E2A2A",
+"A     c #9E3D3E",
+"B     c #6E2323",
+"C     c #CF5C5C",
+"D     c #9E3B3C",
+"E     c #983839",
+"F     c #B68683",
+"G     c #D0B5B3",
+"H     c #E06F71",
+"I     c #DA686A",
+"J     c #B34A4B",
+"K     c #BF5354",
+"L     c #BD5251",
+"M     c #B64B4C",
+"N     c #A64041",
+"O     c #AF5353",
+"P     c #C06A6A",
+"Q     c #D67C7B",
+"R     c #E08482",
+"S     c #D67A78",
+"T     c #CD7574",
+"U     c #CF7374",
+"V     c #CF6D6D",
+"W     c #BE5F60",
+"X     c #BF5E5E",
+"Y     c #C55D5E",
+"Z     c #A34444",
+"`     c #8D3635",
+" .    c #662222",
+"..    c #742626",
+"+.    c #7A2A2A",
+"@.    c #BA4748",
+"#.    c #8A3334",
+"$.    c #B24748",
+"%.    c #CEB2B0",
+"&.    c #D1B6B3",
+"*.    c #E27878",
+"=.    c #E47C7C",
+"-.    c #BB504F",
+";.    c #983D40",
+">.    c #AE5757",
+",.    c #D88383",
+"'.    c #ED9999",
+").    c #EF9898",
+"!.    c #EE9492",
+"~.    c #EE9595",
+"{.    c #EC908E",
+"].    c #EB8F8D",
+"^.    c #EA8A89",
+"/.    c #E88584",
+"(.    c #E37E7E",
+"_.    c #E27676",
+":.    c #DE7170",
+"<.    c #DC6B6C",
+"[.    c #D66668",
+"}.    c #D36162",
+"|.    c #A74847",
+"1.    c #893434",
+"2.    c #8B3332",
+"3.    c #7E292A",
+"4.    c #CA5757",
+"5.    c #D0595A",
+"6.    c #D0B3B0",
+"7.    c #D17D7D",
+"8.    c #D66466",
+"9.    c #DF7273",
+"0.    c #BC4F4E",
+"a.    c #762828",
+"b.    c #652224",
+"c.    c #A25452",
+"d.    c #666666",
+"e.    c #F1A1A1",
+"f.    c #F4A4A4",
+"g.    c #F3A5A6",
+"h.    c #999900",
+"i.    c #F09697",
+"j.    c #ED9394",
+"k.    c #EB8B8A",
+"l.    c #E68382",
+"m.    c #E57A7B",
+"n.    c #DF7272",
+"o.    c #DC7070",
+"p.    c #D96868",
+"q.    c #D56464",
+"r.    c #D66061",
+"s.    c #CE5B5C",
+"t.    c #9A3C3D",
+"u.    c #6F2424",
+"v.    c #B44949",
+"w.    c #CB5858",
+"x.    c #D25C5C",
+"y.    c #CC7374",
+"z.    c #D57D7D",
+"A.    c #DF7574",
+"B.    c #AC4446",
+"C.    c #8A3232",
+"D.    c #5C2223",
+"E.    c #C47978",
+"F.    c #F3A2A2",
+"G.    c #999999",
+"H.    c #FFFFFF",
+"I.    c #F5B4B4",
+"J.    c #ED9595",
+"K.    c #EC8A88",
+"L.    c #E48182",
+"M.    c #E17574",
+"N.    c #DE6E6E",
+"O.    c #DB6A6A",
+"P.    c #D66262",
+"Q.    c #D46060",
+"R.    c #D05A5B",
+"S.    c #AB4445",
+"T.    c #692221",
+"U.    c #8C3232",
+"V.    c #CB5657",
+"W.    c #D35E5F",
+"X.    c #E07475",
+"Y.    c #E47B7C",
+"Z.    c #D86A6A",
+"`.    c #9B3C3C",
+" +    c #944544",
+".+    c #CA7B7B",
+"++    c #F4A09F",
+"@+    c #F6ADAD",
+"#+    c #FFFF99",
+"$+    c #E98C89",
+"%+    c #E57E7F",
+"&+    c #E17475",
+"*+    c #DD6E6F",
+"=+    c #D76766",
+"-+    c #D05C5D",
+";+    c #CD5A58",
+">+    c #CD5657",
+",+    c #B64A4A",
+"'+    c #7D2C2A",
+")+    c #9F3C3C",
+"!+    c #C45051",
+"~+    c #C95353",
+"{+    c #C8ADAA",
+"]+    c #CFB4B1",
+"^+    c #D86666",
+"/+    c #E67E7E",
+"(+    c #CA5C5C",
+"_+    c #AE4646",
+":+    c #9A4545",
+"<+    c #E08D8C",
+"[+    c #F2A09F",
+"}+    c #F5ACAC",
+"|+    c #F8B4B4",
+"1+    c #666699",
+"2+    c #E47978",
+"3+    c #DD7070",
+"4+    c #CC5556",
+"5+    c #B8494A",
+"6+    c #872F2E",
+"7+    c #AE4545",
+"8+    c #AE4444",
+"9+    c #B14546",
+"0+    c #BFABA8",
+"a+    c #CC5456",
+"b+    c #E57E7D",
+"c+    c #D46C6C",
+"d+    c #A94546",
+"e+    c #F5ABAB",
+"f+    c #F6B7B6",
+"g+    c #F9C0C0",
+"h+    c #FFFFCC",
+"i+    c #000000",
+"j+    c #C14C4D",
+"k+    c #9A3738",
+"l+    c #BA4847",
+"m+    c #A23C3E",
+"n+    c #9F3A3C",
+"o+    c #CD9291",
+"p+    c #CD5A5A",
+"q+    c #D66A6C",
+"r+    c #A64443",
+"s+    c #893A3C",
+"t+    c #FCC8C8",
+"u+    c #FFCC99",
+"v+    c #CCCC66",
+"w+    c #B34847",
+"x+    c #7B2A28",
+"y+    c #A63F40",
+"z+    c #9A3B3C",
+"A+    c #B18381",
+"B+    c #DA6C6C",
+"C+    c #9C3A39",
+"D+    c #742625",
+"E+    c #B76161",
+"F+    c #C74F50",
+"G+    c #943737",
+"H+    c #8A3231",
+"I+    c #923838",
+"J+    c #8C3233",
+"K+    c #CF7878",
+"L+    c #BC4C4E",
+"M+    c #692020",
+"N+    c #6E2627",
+"O+    c #E58080",
+"P+    c #EE9090",
+"Q+    c #FFCCFF",
+"R+    c #C64E4E",
+"S+    c #742525",
+"T+    c #923536",
+"U+    c #925453",
+"V+    c #C34C4E",
+"W+    c #C34F4E",
+"X+    c #A03939",
+"Y+    c #5F1C1B",
+"Z+    c #B25657",
+"`+    c #E48282",
+" @    c #EC9492",
+".@    c #C64E4F",
+"+@    c #A03C3C",
+"@@    c #913737",
+"#@    c #9D3E40",
+"$@    c #7C292A",
+"%@    c #CF9693",
+"&@    c #BC4948",
+"*@    c #B74A4B",
+"=@    c #752828",
+"-@    c #DD7576",
+";@    c #EA8382",
+">@    c #EC908F",
+",@    c #F39F9E",
+"'@    c #FFCCCC",
+")@    c #C6504F",
+"!@    c #BE494B",
+"~@    c #852F2F",
+"{@    c #973A3A",
+"]@    c #782526",
+"^@    c #A77E7C",
+"/@    c #C77071",
+"(@    c #9F3E40",
+"_@    c #A84242",
+":@    c #903D3E",
+"<@    c #E27879",
+"[@    c #E98383",
+"}@    c #F29D9D",
+"|@    c #C65050",
+"1@    c #C54E4E",
+"2@    c #842D2C",
+"3@    c #8E3435",
+"4@    c #832E2D",
+"5@    c #814C4C",
+"6@    c #B64848",
+"7@    c #A64241",
+"8@    c #9D3C3D",
+"9@    c #822E2E",
+"0@    c #B05252",
+"a@    c #DF7473",
+"b@    c #E88282",
+"c@    c #ED8F8D",
+"d@    c #F09D9B",
+"e@    c #996666",
+"f@    c #333333",
+"g@    c #CCCCCC",
+"h@    c #C64E4D",
+"i@    c #C64F50",
+"j@    c #C75050",
+"k@    c #9A3838",
+"l@    c #7D2A2A",
+"m@    c #692222",
+"n@    c #3A0F10",
+"o@    c #D39A99",
+"p@    c #8F3535",
+"q@    c #862E2C",
+"r@    c #AF4444",
+"s@    c #6D2625",
+"t@    c #D66768",
+"u@    c #E88D8B",
+"v@    c #F09998",
+"w@    c #336666",
+"x@    c #669966",
+"y@    c #C84E52",
+"z@    c #C04C4D",
+"A@    c #521919",
+"B@    c #511C1B",
+"C@    c #4C1514",
+"D@    c #B28684",
+"E@    c #CE9392",
+"F@    c #D36161",
+"G@    c #A84F4F",
+"H@    c #561A1B",
+"I@    c #421212",
+"J@    c #D76666",
+"K@    c #DE6F6F",
+"L@    c #E67D7F",
+"M@    c #EB8886",
+"N@    c #EF9293",
+"O@    c #663366",
+"P@    c #C6504E",
+"Q@    c #C64C4C",
+"R@    c #8A3031",
+"S@    c #963638",
+"T@    c #5A1A1B",
+"U@    c #9C7776",
+"V@    c #C98F8C",
+"W@    c #DC6D6E",
+"X@    c #E27777",
+"Y@    c #B84E4E",
+"Z@    c #631E1F",
+"`@    c #D46566",
+" #    c #DB6B6C",
+".#    c #E37676",
+"+#    c #E68181",
+"@#    c #EA8D8A",
+"##    c #000033",
+"$#    c #C75051",
+"%#    c #923636",
+"&#    c #8F3435",
+"*#    c #531516",
+"=#    c #8D7270",
+"-#    c #C48A88",
+";#    c #E07473",
+">#    c #CF5A5A",
+",#    c #9D3838",
+"'#    c #5E1A18",
+")#    c #D06161",
+"!#    c #D86869",
+"~#    c #E07274",
+"{#    c #E4797A",
+"]#    c #EA8584",
+"^#    c #C84E50",
+"/#    c #933636",
+"(#    c #973837",
+"_#    c #621B1C",
+":#    c #846E6C",
+"<#    c #D46161",
+"[#    c #CA5252",
+"}#    c #9C393A",
+"|#    c #591918",
+"1#    c #CE5D5D",
+"2#    c #D76263",
+"3#    c #DC6B6A",
+"4#    c #E07474",
+"5#    c #E67C7C",
+"6#    c #999966",
+"7#    c #C74F51",
+"8#    c #C65051",
+"9#    c #903434",
+"0#    c #973838",
+"a#    c #511717",
+"b#    c #786B6B",
+"c#    c #C28A89",
+"d#    c #CC5958",
+"e#    c #CD5859",
+"f#    c #641E1E",
+"g#    c #CA5D5C",
+"h#    c #D25E5E",
+"i#    c #DC6D6C",
+"j#    c #FFCC00",
+"k#    c #C74D4E",
+"l#    c #C84E4E",
+"m#    c #BF4C4C",
+"n#    c #812E2E",
+"o#    c #772727",
+"p#    c #2B0A07",
+"q#    c #726A68",
+"r#    c #D86565",
+"s#    c #A13B3A",
+"t#    c #722322",
+"u#    c #C25858",
+"v#    c #CE5C5C",
+"w#    c #D66264",
+"x#    c #FF6600",
+"y#    c #CC6600",
+"z#    c #C85051",
+"A#    c #B44444",
+"B#    c #5F1A1B",
+"C#    c #290806",
+"D#    c #766B6A",
+"E#    c #C68B8B",
+"F#    c #D46263",
+"G#    c #D86A6B",
+"H#    c #AA4042",
+"I#    c #712525",
+"J#    c #B95150",
+"K#    c #CE5958",
+"L#    c #D15E5D",
+"M#    c #333366",
+"N#    c #CCCCFF",
+"O#    c #C64D4E",
+"P#    c #C75252",
+"Q#    c #B74846",
+"R#    c #722424",
+"S#    c #4D1616",
+"T#    c #2B0808",
+"U#    c #826F6D",
+"V#    c #CC928F",
+"W#    c #C65454",
+"X#    c #CE5C5D",
+"Y#    c #8D3232",
+"Z#    c #862E30",
+"`#    c #AC4849",
+" $    c #CE5757",
+".$    c #CF5C5B",
+"+$    c #336633",
+"@$    c #C65152",
+"#$    c #C85050",
+"$$    c #C85253",
+"%$    c #B04444",
+"&$    c #752626",
+"*$    c #541617",
+"=$    c #270808",
+"-$    c #927472",
+";$    c #CFB3B0",
+">$    c #B64B4B",
+",$    c #A0403F",
+"'$    c #953536",
+")$    c #9E3A3B",
+"!$    c #CB5455",
+"~$    c #663333",
+"{$    c #C75150",
+"]$    c #C44E4E",
+"^$    c #A53E3E",
+"/$    c #6A2221",
+"($    c #441112",
+"_$    c #110302",
+":$    c #BCA8A4",
+"<$    c #A73F3E",
+"[$    c #943838",
+"}$    c #8F3332",
+"|$    c #7F2D2D",
+"1$    c #CA5354",
+"2$    c #CC5656",
+"3$    c #C95354",
+"4$    c #B44848",
+"5$    c #812B2B",
+"6$    c #621E1D",
+"7$    c #270906",
+"8$    c #260A08",
+"9$    c #B88784",
+"0$    c #802B2A",
+"a$    c #933534",
+"b$    c #7D2D2C",
+"c$    c #669999",
+"d$    c #996699",
+"e$    c #993A3A",
+"f$    c #702223",
+"g$    c #591919",
+"h$    c #1C0606",
+"i$    c #756B69",
+"j$    c #C9ADAB",
+"k$    c #842E2E",
+"l$    c #822D2E",
+"m$    c #8F3636",
+"n$    c #682223",
+"o$    c #752929",
+"p$    c #3C0F0E",
+"q$    c #110304",
+"r$    c #ACA09E",
+"s$    c #903332",
+"t$    c #461515",
+"u$    c #883738",
+"v$    c #A04040",
+"w$    c #601C1C",
+"x$    c #AA4242",
+"y$    c #666633",
+"z$    c #AE4543",
+"A$    c #481414",
+"B$    c #330E0E",
+"C$    c #1D0506",
+"D$    c #C1ABA8",
+"E$    c #943938",
+"F$    c #B84A4A",
+"G$    c #A23E3E",
+"H$    c #752825",
+"I$    c #702726",
+"J$    c #762B2B",
+"K$    c #792A2A",
+"L$    c #3C100F",
+"M$    c #0A0101",
+"N$    c #A19D9B",
+"O$    c #A05A5A",
+"P$    c #7F2A2A",
+"Q$    c #722425",
+"R$    c #661E1E",
+"S$    c #5C1B1A",
+"T$    c #8E3534",
+"U$    c #C65352",
+"V$    c #863233",
+"W$    c #5B1A1B",
+"X$    c #531818",
+"Y$    c #190506",
+"Z$    c #433636",
+"`$    c #C2ACA8",
+" %    c #561A18",
+".%    c #4F1516",
+"+%    c #8D3334",
+"@%    c #6D2122",
+"#%    c #621F1F",
+"$%    c #CC3300",
+"%%    c #C75052",
+"&%    c #C05254",
+"*%    c #873333",
+"=%    c #672020",
+"-%    c #4F1414",
+";%    c #1A0504",
+">%    c #0D0202",
+",%    c #A79F9C",
+"'%    c #A25C5A",
+")%    c #6B1F1F",
+"!%    c #9C3A3A",
+"~%    c #6B2020",
+"{%    c #953838",
+"]%    c #660000",
+"^%    c #990000",
+"/%    c #C84E4F",
+"(%    c #CC5455",
+"_%    c #893232",
+":%    c #742627",
+"<%    c #863231",
+"[%    c #2D0C09",
+"}%    c #130204",
+"|%    c #5B3D3D",
+"1%    c #935554",
+"2%    c #501716",
+"3%    c #9F3C3B",
+"4%    c #C74E4F",
+"5%    c #C64F51",
+"6%    c #CB5454",
+"7%    c #CA5453",
+"8%    c #B04948",
+"9%    c #6C2526",
+"0%    c #873130",
+"a%    c #54181A",
+"b%    c #0E0201",
+"c%    c #483836",
+"d%    c #732426",
+"e%    c #3A0D0D",
+"f%    c #6F2525",
+"g%    c #C74E51",
+"h%    c #CA5254",
+"i%    c #9E4142",
+"j%    c #5C1E1D",
+"k%    c #893334",
+"l%    c #621F20",
+"m%    c #180403",
+"n%    c #1A0604",
+"o%    c #C3ABA8",
+"p%    c #591C1C",
+"q%    c #340C0C",
+"r%    c #6C2223",
+"s%    c #702221",
+"t%    c #431313",
+"u%    c #7C2E2D",
+"v%    c #812C2C",
+"w%    c #8B3131",
+"x%    c #B54848",
+"y%    c #C34E4F",
+"z%    c #C75152",
+"A%    c #C85251",
+"B%    c #C85252",
+"C%    c #CA5454",
+"D%    c #CA5455",
+"E%    c #CB5656",
+"F%    c #CA5656",
+"G%    c #C45454",
+"H%    c #7E2D2C",
+"I%    c #571919",
+"J%    c #561A1A",
+"K%    c #893130",
+"L%    c #511A18",
+"M%    c #1B0404",
+"N%    c #210705",
+"O%    c #A89E9B",
+"P%    c #C0AAA7",
+"Q%    c #704442",
+"R%    c #26080A",
+"S%    c #3E0F11",
+"T%    c #1F0706",
+"U%    c #BD4C4D",
+"V%    c #BB4A4A",
+"W%    c #9F3E3F",
+"X%    c #792A29",
+"Y%    c #A84443",
+"Z%    c #B74A4A",
+"`%    c #C45050",
+" &    c #C85250",
+".&    c #B84C4C",
+"+&    c #4E1718",
+"@&    c #782A2A",
+"#&    c #521717",
+"$&    c #23080A",
+"%&    c #0E0202",
+"&&    c #433736",
+"*&    c #ACA09D",
+"=&    c #774745",
+"-&    c #210807",
+";&    c #812D2C",
+">&    c #A03C3D",
+",&    c #C14A4B",
+"'&    c #BC4848",
+")&    c #A23C3C",
+"!&    c #852E2F",
+"~&    c #5E1B1C",
+"{&    c #6B2223",
+"]&    c #702827",
+"^&    c #843334",
+"/&    c #8C3637",
+"(&    c #903839",
+"_&    c #9A3D3C",
+":&    c #983A3A",
+"<&    c #7C2C2B",
+"[&    c #863031",
+"}&    c #9C3B3B",
+"|&    c #953435",
+"1&    c #4E1516",
+"2&    c #370C0D",
+"3&    c #170404",
+"4&    c #080200",
+"5&    c #483837",
+"6&    c #997975",
+"7&    c #350D0C",
+"8&    c #390E0E",
+"9&    c #5A1A19",
+"0&    c #7B2928",
+"a&    c #BB4848",
+"b&    c #A9403F",
+"c&    c #7A292A",
+"d&    c #782828",
+"e&    c #6B2021",
+"f&    c #742425",
+"g&    c #752628",
+"h&    c #722728",
+"i&    c #8B3433",
+"j&    c #913434",
+"k&    c #8F3434",
+"l&    c #A33E3F",
+"m&    c #742726",
+"n&    c #632020",
+"o&    c #120401",
+"p&    c #130304",
+"q&    c #1D0505",
+"r&    c #7B6D69",
+"s&    c #8A7271",
+"t&    c #310B0C",
+"u&    c #2A090A",
+"v&    c #3E0F0E",
+"w&    c #601E1D",
+"x&    c #621F1D",
+"y&    c #571A19",
+"z&    c #681E1F",
+"A&    c #782624",
+"B&    c #762626",
+"C&    c #802A2B",
+"D&    c #A03B3B",
+"E&    c #9C3A3B",
+"F&    c #AA4041",
+"G&    c #832F2F",
+"H&    c #6C2222",
+"I&    c #4A1514",
+"J&    c #280908",
+"K&    c #100302",
+"L&    c #87706D",
+"M&    c #380F0F",
+"N&    c #200606",
+"O&    c #180405",
+"P&    c #1A0506",
+"Q&    c #200709",
+"R&    c #2C0B0A",
+"S&    c #3F1010",
+"T&    c #2D0A0A",
+"U&    c #300B0A",
+"V&    c #401011",
+"W&    c #380E0D",
+"X&    c #2E0B0C",
+"Y&    c #22070A",
+"Z&    c #170304",
+"`&    c #110203",
+" *    c #1E0606",
+".*    c #756A68",
+"+*    c #B5A3A1",
+"@*    c #826E6B",
+"#*    c #573D3C",
+"$*    c #250809",
+"%*    c #1E0604",
+"&*    c #0C0403",
+"**    c #100304",
+"=*    c #140405",
+"-*    c #170403",
+";*    c #250808",
+">*    c #503A38",
+",*    c #796C6A",
+"'*    c #AAA09D",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                        . + @ # $ % & * = -                                         ",
+"                                  ; > , ' ) ! ~ { ] ^ / ( _ : < [                                   ",
+"                              } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h                               ",
+"                          i j k l m n o p q r s t u v w x y z A B C D E F                           ",
+"                      G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.#.$.%.                      ",
+"                    &.*.=.-.+.` ;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.                    ",
+"                  7.8.9.0.a.b.c.d.d.e.f.g.h.h.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.                  ",
+"                z.A.A.B.C.D.E.F.G.H.d.G.I.h.H.H.h.h.J.K.L.M.N.O.P.Q.R.4.S.T.U.V.W.P                 ",
+"              %.X.Y.Z.`. +.+++@+d.H.H.H.d.d.#+#+H.H.h.h.$+%+&+*+=+Q.-+;+>+,+'+)+!+~+{+              ",
+"            ]+^+/+(+_+:+<+[+}+|+d.H.H.H.H.H.d.1+#+#+H.H.h.h.2+3+h.h.h.h.h.4+5+6+7+8+9+0+            ",
+"            a+b+c+d+h.h.h.e+f+g+G.H.h+H.H.H.H.H.d.d.#+#+H.H.h.h.H.H.H.H.H.i+i+j+k+l+m+n+            ",
+"          o+p+q+r+s+h.H.H.h.h.t+d.H.H.h+H.h+H.H.H.H.d.1+#+#+H.H.#+#+u+#+#+u+v+i+w+x+y+z+A+          ",
+"          V.B+C+D+E+{.h.H.h+H.h.h.H.H.H.h+H.H.h+H.H.H.H.d.d.#+#+#+u+#+#+u+u+v+i+F+G+H+I+J+          ",
+"        K+p+L+M+N+O+P+h.H.#+#+H.H.h.h.H.H.Q+h+H.H.h+H.H.H.H.d.1+#+#+#+u+#+#+u+v+i+R+S+`.T+U+        ",
+"        V+W+X+Y+Z+`+ @h.H.#+#+#+#+H.h+h.h.H.H.h+H.H.h+H.H.H.H.H.d.d.#+#+u+u+u+v+i+.@+@@@#@$@        ",
+"      %@&@*@f =@-@;@>@,@h.H.#+#+#+#+#+H.H.h.h.H.H.'@H.H.h+H.h+H.H.H.d.1+#+u+#+v+i+)@!@~@{@]@^@      ",
+"      /@(@_@S+:@<@[@>@}@h.H.#+#+#+#+#+#+#+H.h+h.h.H.H.h+H.H.H.h+H.H.H.H.d.#+u+v+i+|@1@2@3@4@5@      ",
+"      6@7@8@9@0@a@b@c@d@h.H.d.d.e@f@#+#+#+u+#+H.H.h.h.H.H.h+g@H.g@H.g@H.d.u+v+i+h@i@j@k@l@m@n@      ",
+"    o@p@q@r@s@t@n.O+u@v@h.d.h+g@G.w@i+u+#+#+#+#+u+H.h+h.h.H.H.g@H.g@H.H.x@u+v+i+|@i@y@z@A@B@C@D@    ",
+"    E@F@G@H@I@J@K@L@M@N@d.H.H.H.g@G.O@i+#+u+#+#+#+#+u+H.Q+h.h.H.g@H.g@H.1+u+v+i+i@i@P@Q@R@S@T@U@    ",
+"    V@W@X@Y@Z@`@ #.#+#@#d.g@H.H.g@G.d.i+#+#+u+#+u+#+#+#+u+H.h+i+H.g@H.H.d.u+v+##i@$#$#.@%#&#*#=#    ",
+"    -#;#>#,#'#)#!#~#{#]#G.G.g@H.g@G.f@i+#+#+#+u+#+u+#+u+#+#+v+i+g@H.g@H.d.v+i+|@i@h@R+^#/#(#_#:#    ",
+"    % <#[#}#|#1#2#3#4#5#d.d.G.G.G.d.f@i+#+u+#+#+u+#+u+#+#+u+v+i+H.g@g@H.6#v+i+i@7#8#|@.@9#0#a#b#    ",
+"    c#d#e#C.f#g#h#!#i#d.j#d.d.d.f@d.d.u+#+u+#+u+#+u+u+#+u+#+#+v+i+'@H.d.u+v+i+i@k#l#i@m#n#o#p#q#    ",
+"    -#^+r#s#t#u#v#w#G.g@j#x#d.d.1+d.y#f@f@#+u+#+u+#+#+#+u+#+u+v+i+g@H.1+v+i+i@$#8#|@z#A#$@B#C#D#    ",
+"    E#F#G#H#I#J#K#L#G.u+H.H.x#x#x#y#y#y#j#M##+u+#+u+u+u+#+u+#+v+i+N#H.x@v+i+i@O#l#^#P#Q#R#S#T#U#    ",
+"    V#W#X#Y#Z#`# $.$G.u+h+h+H.H.j#j#j#j#x#+$#+u+u+#+u+#+u+#+u+v+i+'@H.d.v+i+@$8#|@#$$$%$&$*$=$-$    ",
+"    ;$>$,$'$)$8@!${ G.u+u+u+h+h+H.h+j#x#y#~$u+u+u+#+u+u+#+u+u+v+i+g@H.e@i+d.[#l#i@{$]$^$/$($_$:$    ",
+"      <$%#[$}$|$1$2$G.u+j#u+u+u+h+h+x#x#y#w@#+#+u+u+u+#+u+#+#+v+i+N#H.d.i+d.G.{$z#3$4$5$6$7$8$      ",
+"      9$[$0$a$b$4$~+G.u+j#j#u+u+u+u+x#x#y#f@u+u+#+u+u+u+u+u+u+u+v+i+H.c$i+d.d$G.G.8#e$f$g$h$i$      ",
+"      j$k$l$m$n$o$|@G.u+j#j#j#u+u+u+x#y#y#M#u+#+u+u+#+u+u+u+u+#+v+i+H.e@i+d.x@d.c$G.&$|#p$q$r$      ",
+"        s$t$u$v$w$x$G.u+j#j#j#j#j#u+x#y#y#y$v+v+u+#+u+u+#+u+u+u+v+i+H.d.f@d.d.e@G.z$A$B$C$8$        ",
+"        D$E$F$G$H$I$G.u+j#j#j#j#j#j#x#y#y#f@i+i+v+v+#+u+u+u+u+u+v+i+H.i+f@d.d.G.$$J$K$L$M$N$        ",
+"          O$P$Q$R$S$T$G.u+j#j#j#j#j#x#y#y#M#@$#$i+i+v+v+u+u+u+u+v+i+f@i+d.d.G.U$V$W$X$Y$Z$          ",
+"          `$ %.%+%@%#%G.u+j#j#j#j#j#x#$%f@{$O#i@%%$#i+i+v+v+#+u+v+i+i+i+d.G.&%*%=%-%;%>%,%          ",
+"            '%)%!%~%{%G.u+j#]%j#j#j#^%$%y$@$|@j@R+R+/%(%i+i+v+v+u+v+i+f@d.2 _%:%<%[%}%|%            ",
+"              1%/$2%3%G.u+j#^%j#j#]%^%y#M#O#4%5%@$5%)@|@6%7%i+i+v+v+i+f@8%9%0%/#a%b%c%              ",
+"                d%e%f%G.u+j#^%j#j#x#x#y#f@|@j@R+R+/%g%.@^#h%e#{ i+i+i+i%j%k%C.l%m%n%                ",
+"                o%p%q%r%s%t%u%v%w%x%y%j@i@^#z%@$$#{$A%B%C%D%E%F%e#G%H%I%J%K%L%M%N%O%                ",
+"                  P%Q%R%S%T%U%V%W%X%9@[$Y%Z%`%A% &C%C%!$C%F%!$.&I++&@&~%#&$&%&&&*&                  ",
+"                      =&R%-&;&>&,&'&)&!&~&{&]&^&/&(&_&v$:&%#<&[&}&|&1&2&3&4&5&                      ",
+"                        6&7&8&9&0&I+a&b&c&d&e&f&g&h&l$i&j&k&v$l&m&n&o&p&q&r&                        ",
+"                            s&t&u&v&w&x&y&z&A&B&C&D&E&F&G&S+H&I&J&K&_$q#                            ",
+"                                L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&`& *.*                                ",
+"                                    +*@*#*$*%*K&&***=*-*;*>*,*'*                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.bmp
new file mode 100644 (file)
index 0000000..1bb1e33
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_re_voi.xpm
new file mode 100644 (file)
index 0000000..6bf6f3c
--- /dev/null
@@ -0,0 +1,874 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_re_voi_xpm[] = {
+"50 50 821 2",
+"      c #CED0CC",
+".     c #D0B4B2",
+"+     c #D49B9A",
+"@     c #D09594",
+"#     c #D39A9A",
+"$     c #D19A97",
+"%     c #C38A8A",
+"&     c #C88E8D",
+"*     c #CD9391",
+"=     c #CD9392",
+"-     c #CEB0AE",
+";     c #D09796",
+">     c #CE7778",
+",     c #DE6F70",
+"'     c #E78382",
+")     c #E88585",
+"!     c #E17373",
+"~     c #C05051",
+"{     c #CE5758",
+"]     c #BC4647",
+"^     c #B64345",
+"/     c #B24243",
+"(     c #C25454",
+"_     c #CB595A",
+":     c #9D3A3C",
+"<     c #945354",
+"[     c #C38E8D",
+"}     c #D29796",
+"|     c #DE7172",
+"1     c #DA6A6A",
+"2     c #BA5152",
+"3     c #A94848",
+"4     c #B05050",
+"5     c #C86261",
+"6     c #D06262",
+"7     c #B24747",
+"8     c #953638",
+"9     c #822E2D",
+"0     c #6C2523",
+"a     c #662526",
+"b     c #571819",
+"c     c #8E3334",
+"d     c #BD4F4E",
+"e     c #C95558",
+"f     c #9B3A3A",
+"g     c #C35354",
+"h     c #CD9190",
+"i     c #D39897",
+"j     c #D25E5F",
+"k     c #D46666",
+"l     c #D66867",
+"m     c #E17879",
+"n     c #D96E6E",
+"o     c #C85858",
+"p     c #A03D3F",
+"q     c #7A2C2D",
+"r     c #581D1E",
+"s     c #571C1B",
+"t     c #401211",
+"u     c #2A0A0A",
+"v     c #340E0E",
+"w     c #5D1E1C",
+"x     c #903433",
+"y     c #802E2E",
+"z     c #7E2A2A",
+"A     c #9E3D3E",
+"B     c #6E2323",
+"C     c #CF5C5C",
+"D     c #9E3B3C",
+"E     c #983839",
+"F     c #B68683",
+"G     c #D0B5B3",
+"H     c #E06F71",
+"I     c #DA686A",
+"J     c #B34A4B",
+"K     c #BF5354",
+"L     c #BD5251",
+"M     c #B64B4C",
+"N     c #A64041",
+"O     c #AF5353",
+"P     c #C06A6A",
+"Q     c #D67C7B",
+"R     c #E08482",
+"S     c #D67A78",
+"T     c #CD7574",
+"U     c #CF7374",
+"V     c #CF6D6D",
+"W     c #BE5F60",
+"X     c #BF5E5E",
+"Y     c #C55D5E",
+"Z     c #A34444",
+"`     c #8D3635",
+" .    c #662222",
+"..    c #742626",
+"+.    c #7A2A2A",
+"@.    c #BA4748",
+"#.    c #8A3334",
+"$.    c #B24748",
+"%.    c #CEB2B0",
+"&.    c #D1B6B3",
+"*.    c #E27878",
+"=.    c #E47C7C",
+"-.    c #BB504F",
+";.    c #983D40",
+">.    c #AE5757",
+",.    c #D88383",
+"'.    c #ED9999",
+").    c #EF9898",
+"!.    c #EE9492",
+"~.    c #EE9595",
+"{.    c #EC908E",
+"].    c #EB8F8D",
+"^.    c #EA8A89",
+"/.    c #E88584",
+"(.    c #E37E7E",
+"_.    c #E27676",
+":.    c #DE7170",
+"<.    c #DC6B6C",
+"[.    c #D66668",
+"}.    c #D36162",
+"|.    c #A74847",
+"1.    c #893434",
+"2.    c #8B3332",
+"3.    c #7E292A",
+"4.    c #CA5757",
+"5.    c #D0595A",
+"6.    c #D0B3B0",
+"7.    c #D17D7D",
+"8.    c #D66466",
+"9.    c #DF7273",
+"0.    c #BC4F4E",
+"a.    c #762828",
+"b.    c #652224",
+"c.    c #A25452",
+"d.    c #E69493",
+"e.    c #EC9795",
+"f.    c #F1A1A1",
+"g.    c #F4A4A4",
+"h.    c #F3A5A6",
+"i.    c #F4A4A3",
+"j.    c #F4A3A3",
+"k.    c #F19E9C",
+"l.    c #F09697",
+"m.    c #ED9394",
+"n.    c #EB8B8A",
+"o.    c #E68382",
+"p.    c #E57A7B",
+"q.    c #DF7272",
+"r.    c #DC7070",
+"s.    c #D96868",
+"t.    c #D56464",
+"u.    c #D66061",
+"v.    c #CE5B5C",
+"w.    c #9A3C3D",
+"x.    c #6F2424",
+"y.    c #B44949",
+"z.    c #CB5858",
+"A.    c #D25C5C",
+"B.    c #CC7374",
+"C.    c #D57D7D",
+"D.    c #DF7574",
+"E.    c #AC4446",
+"F.    c #8A3232",
+"G.    c #5C2223",
+"H.    c #C47978",
+"I.    c #F3A2A2",
+"J.    c #F2A6A6",
+"K.    c #F6ADAD",
+"L.    c #F5B0AE",
+"M.    c #F6B7B6",
+"N.    c #F5B4B4",
+"O.    c #F7B2B0",
+"P.    c #F5B2B0",
+"Q.    c #F4ACAB",
+"R.    c #F19C9A",
+"S.    c #ED9595",
+"T.    c #EC8A88",
+"U.    c #E48182",
+"V.    c #E17574",
+"W.    c #DE6E6E",
+"X.    c #DB6A6A",
+"Y.    c #D66262",
+"Z.    c #D46060",
+"`.    c #D05A5B",
+" +    c #AB4445",
+".+    c #692221",
+"++    c #8C3232",
+"@+    c #CB5657",
+"#+    c #D35E5F",
+"$+    c #E07475",
+"%+    c #E47B7C",
+"&+    c #D86A6A",
+"*+    c #9B3C3C",
+"=+    c #944544",
+"-+    c #CA7B7B",
+";+    c #F4A09F",
+">+    c #F7B6B4",
+",+    c #F7BCBB",
+"'+    c #FABEBE",
+")+    c #FAC0C1",
+"!+    c #F9C1C1",
+"~+    c #F8BFC0",
+"{+    c #F8BABA",
+"]+    c #F7BAB8",
+"^+    c #F6B4B2",
+"/+    c #F4A8A7",
+"(+    c #F19D9B",
+"_+    c #EE9594",
+":+    c #E98C89",
+"<+    c #E57E7F",
+"[+    c #E17475",
+"}+    c #DD6E6F",
+"|+    c #D76766",
+"1+    c #D05C5D",
+"2+    c #CD5A58",
+"3+    c #CD5657",
+"4+    c #B64A4A",
+"5+    c #7D2C2A",
+"6+    c #9F3C3C",
+"7+    c #C45051",
+"8+    c #C95353",
+"9+    c #C8ADAA",
+"0+    c #CFB4B1",
+"a+    c #D86666",
+"b+    c #E67E7E",
+"c+    c #CA5C5C",
+"d+    c #AE4646",
+"e+    c #9A4545",
+"f+    c #E08D8C",
+"g+    c #F2A09F",
+"h+    c #F5ACAC",
+"i+    c #F8B4B4",
+"j+    c #FABFC0",
+"k+    c #FCC8C8",
+"l+    c #FCCBCC",
+"m+    c #FBCDCD",
+"n+    c #000000",
+"o+    c #E88484",
+"p+    c #872F2E",
+"q+    c #A44141",
+"r+    c #AE4444",
+"s+    c #B14546",
+"t+    c #BFABA8",
+"u+    c #CC5456",
+"v+    c #E57E7D",
+"w+    c #D46C6C",
+"x+    c #A94546",
+"y+    c #913C3C",
+"z+    c #DA8A8B",
+"A+    c #F29F9E",
+"B+    c #F5ABAB",
+"C+    c #F9C0C0",
+"D+    c #FCCBCA",
+"E+    c #FACECE",
+"F+    c #FAD2D2",
+"G+    c #FBD6D6",
+"H+    c #CCCCCC",
+"I+    c #E98C8B",
+"J+    c #C14C4D",
+"K+    c #993738",
+"L+    c #BA4847",
+"M+    c #A23C3E",
+"N+    c #9F3A3C",
+"O+    c #CD9291",
+"P+    c #CD5A5A",
+"Q+    c #D66A6C",
+"R+    c #A64443",
+"S+    c #893A3C",
+"T+    c #CC7676",
+"U+    c #EF9996",
+"V+    c #F4A5A6",
+"W+    c #F4B3B2",
+"X+    c #F9BFBE",
+"Y+    c #FBCFD0",
+"Z+    c #FBDADA",
+"`+    c #FCDFDF",
+" @    c #FCE2E3",
+".@    c #EC908D",
+"+@    c #C74F4E",
+"@@    c #B04746",
+"#@    c #7B2A28",
+"$@    c #A63F40",
+"%@    c #9A3B3C",
+"&@    c #B18381",
+"*@    c #DA6C6C",
+"=@    c #9C3A39",
+"-@    c #742625",
+";@    c #B76161",
+">@    c #F09B9A",
+",@    c #F6A9AA",
+"'@    c #F6B7B8",
+")@    c #FAC4C5",
+"!@    c #FACFD0",
+"~@    c #FDE0E0",
+"{@    c #FCE2E2",
+"]@    c #FBE6E7",
+"^@    c #EF9896",
+"/@    c #C85052",
+"(@    c #C04C4D",
+"_@    c #943737",
+":@    c #8A3231",
+"<@    c #923838",
+"[@    c #8C3233",
+"}@    c #CF7878",
+"|@    c #BC4C4E",
+"1@    c #692020",
+"2@    c #6E2627",
+"3@    c #E58080",
+"4@    c #EE9090",
+"5@    c #F4AAAB",
+"6@    c #F8B9BA",
+"7@    c #FAD0D0",
+"8@    c #FCDBDA",
+"9@    c #FBE4E1",
+"0@    c #FDE7E7",
+"a@    c #EF9696",
+"b@    c #C65050",
+"c@    c #C24E4E",
+"d@    c #C64E4E",
+"e@    c #742525",
+"f@    c #923536",
+"g@    c #925453",
+"h@    c #C34C4E",
+"i@    c #C34F4E",
+"j@    c #A03939",
+"k@    c #5F1C1B",
+"l@    c #B25657",
+"m@    c #E48282",
+"n@    c #EC9492",
+"o@    c #666666",
+"p@    c #996666",
+"q@    c #333333",
+"r@    c #FAD2D4",
+"s@    c #FDDEDD",
+"t@    c #FCE6E6",
+"u@    c #FEE8EA",
+"v@    c #F09694",
+"w@    c #C54F50",
+"x@    c #C64E4F",
+"y@    c #A03C3C",
+"z@    c #913737",
+"A@    c #9D3E40",
+"B@    c #7C292A",
+"C@    c #CF9693",
+"D@    c #BC4948",
+"E@    c #B74A4B",
+"F@    c #752828",
+"G@    c #DD7576",
+"H@    c #EA8382",
+"I@    c #FFFFCC",
+"J@    c #999999",
+"K@    c #336666",
+"L@    c #FEDEDE",
+"M@    c #F09896",
+"N@    c #C85051",
+"O@    c #C6504F",
+"P@    c #BE494B",
+"Q@    c #852F2F",
+"R@    c #973A3A",
+"S@    c #782526",
+"T@    c #A77E7C",
+"U@    c #C77071",
+"V@    c #9F3E40",
+"W@    c #A84242",
+"X@    c #903D3E",
+"Y@    c #E27879",
+"Z@    c #FFFFFF",
+"`@    c #663366",
+" #    c #EE9795",
+".#    c #C54E4E",
+"+#    c #842D2C",
+"@#    c #8E3435",
+"##    c #832E2D",
+"$#    c #814C4C",
+"%#    c #B64848",
+"&#    c #A64241",
+"*#    c #9D3C3D",
+"=#    c #822E2E",
+"-#    c #B05252",
+";#    c #DF7473",
+">#    c #FDE4E3",
+",#    c #ED9290",
+"'#    c #C85252",
+")#    c #C54E4D",
+"!#    c #C64F50",
+"~#    c #C75050",
+"{#    c #9A3838",
+"]#    c #7D2A2A",
+"^#    c #692222",
+"/#    c #3A0F10",
+"(#    c #D39A99",
+"_#    c #8F3535",
+":#    c #862E2C",
+"<#    c #AF4444",
+"[#    c #6D2625",
+"}#    c #D66768",
+"|#    c #FBD8D7",
+"1#    c #FCE2E0",
+"2#    c #FCE6E4",
+"3#    c #FCE3E0",
+"4#    c #FCDADA",
+"5#    c #FAD4D4",
+"6#    c #FCCACA",
+"7#    c #F9BEBF",
+"8#    c #F6B4B3",
+"9#    c #F4A8A8",
+"0#    c #F19E9D",
+"a#    c #EC8E8E",
+"b#    c #E88282",
+"c#    c #E47779",
+"d#    c #DD6E6E",
+"e#    c #D86665",
+"f#    c #D25F5F",
+"g#    c #CF5A5B",
+"h#    c #CE5757",
+"i#    c #CB5455",
+"j#    c #CA5252",
+"k#    c #C84E52",
+"l#    c #521919",
+"m#    c #511C1B",
+"n#    c #4C1514",
+"o#    c #B28684",
+"p#    c #CE9392",
+"q#    c #D36161",
+"r#    c #A84F4F",
+"s#    c #561A1B",
+"t#    c #421212",
+"u#    c #D76666",
+"v#    c #DE6F6F",
+"w#    c #FCD0CF",
+"x#    c #FDD6D4",
+"y#    c #FDD8D7",
+"z#    c #E98A88",
+"A#    c #C64D4E",
+"B#    c #C6504E",
+"C#    c #C64C4C",
+"D#    c #8A3031",
+"E#    c #963638",
+"F#    c #5A1A1B",
+"G#    c #9C7776",
+"H#    c #C98F8C",
+"I#    c #DC6D6E",
+"J#    c #E27777",
+"K#    c #B84E4E",
+"L#    c #631E1F",
+"M#    c #D46566",
+"N#    c #FFCC00",
+"O#    c #F8BBBD",
+"P#    c #FAC5C6",
+"Q#    c #FBCBCC",
+"R#    c #FCCCCA",
+"S#    c #E78282",
+"T#    c #C75150",
+"U#    c #C75051",
+"V#    c #923636",
+"W#    c #8F3435",
+"X#    c #531516",
+"Y#    c #8D7270",
+"Z#    c #C48A88",
+"`#    c #E07473",
+" $    c #CF5A5A",
+".$    c #9D3838",
+"+$    c #5E1A18",
+"@$    c #FF6600",
+"#$    c #666699",
+"$$    c #CC6600",
+"%$    c #F8BCBE",
+"&$    c #F8BCBC",
+"*$    c #E57C7C",
+"=$    c #C64E4D",
+"-$    c #C84E50",
+";$    c #933636",
+">$    c #973837",
+",$    c #621B1C",
+"'$    c #846E6C",
+")$    c #D46161",
+"!$    c #9C393A",
+"~$    c #591918",
+"{$    c #FFCC99",
+"]$    c #333366",
+"^$    c #F6B1B1",
+"/$    c #E37576",
+"($    c #C74F51",
+"_$    c #C65051",
+":$    c #903434",
+"<$    c #973838",
+"[$    c #511717",
+"}$    c #786B6B",
+"|$    c #C28A89",
+"1$    c #CC5958",
+"2$    c #CD5859",
+"3$    c #641E1E",
+"4$    c #336633",
+"5$    c #F3A3A2",
+"6$    c #C54C4D",
+"7$    c #C84E4E",
+"8$    c #BF4C4C",
+"9$    c #812E2E",
+"0$    c #772727",
+"a$    c #2B0A07",
+"b$    c #726A68",
+"c$    c #D86565",
+"d$    c #A13B3A",
+"e$    c #722322",
+"f$    c #663333",
+"g$    c #EC9696",
+"h$    c #DE7071",
+"i$    c #C24E4F",
+"j$    c #B44444",
+"k$    c #5F1A1B",
+"l$    c #290806",
+"m$    c #766B6A",
+"n$    c #C68B8B",
+"o$    c #D46263",
+"p$    c #D86A6B",
+"q$    c #AA4042",
+"r$    c #712525",
+"s$    c #E88887",
+"t$    c #E17576",
+"u$    c #C64D4D",
+"v$    c #C75252",
+"w$    c #B74846",
+"x$    c #722424",
+"y$    c #4D1616",
+"z$    c #2B0808",
+"A$    c #826F6D",
+"B$    c #CC928F",
+"C$    c #C65454",
+"D$    c #CE5C5D",
+"E$    c #8D3232",
+"F$    c #862E30",
+"G$    c #E3797A",
+"H$    c #DD7070",
+"I$    c #C55050",
+"J$    c #C85050",
+"K$    c #C85253",
+"L$    c #B04444",
+"M$    c #752626",
+"N$    c #541617",
+"O$    c #270808",
+"P$    c #927472",
+"Q$    c #CFB3B0",
+"R$    c #B64B4B",
+"S$    c #A0403F",
+"T$    c #953536",
+"U$    c #9E3A3B",
+"V$    c #D76363",
+"W$    c #C14D4E",
+"X$    c #C44E4E",
+"Y$    c #A53E3E",
+"Z$    c #6A2221",
+"`$    c #441112",
+" %    c #110302",
+".%    c #BCA8A4",
+"+%    c #A73F3E",
+"@%    c #943838",
+"#%    c #8F3332",
+"$%    c #666633",
+"%%    c #DB696A",
+"&%    c #D9696A",
+"*%    c #D86869",
+"=%    c #D86464",
+"-%    c #D76464",
+";%    c #D46061",
+">%    c #D66465",
+",%    c #D25D5D",
+"'%    c #D25B5C",
+")%    c #CD5658",
+"!%    c #CC5656",
+"~%    c #CA5656",
+"{%    c #C95354",
+"]%    c #B44848",
+"^%    c #812B2B",
+"/%    c #621E1D",
+"(%    c #270906",
+"_%    c #260A08",
+":%    c #B88784",
+"<%    c #802B2A",
+"[%    c #933534",
+"}%    c #CE5858",
+"|%    c #CB5353",
+"1%    c #C85353",
+"2%    c #993A3A",
+"3%    c #702223",
+"4%    c #591919",
+"5%    c #1C0606",
+"6%    c #756B69",
+"7%    c #C9ADAB",
+"8%    c #842E2E",
+"9%    c #822D2E",
+"0%    c #8F3636",
+"a%    c #682223",
+"b%    c #D05C5C",
+"c%    c #CE5657",
+"d%    c #CB5757",
+"e%    c #C24E50",
+"f%    c #3C0F0E",
+"g%    c #110304",
+"h%    c #ACA09E",
+"i%    c #903332",
+"j%    c #461515",
+"k%    c #883738",
+"l%    c #A04040",
+"m%    c #CC3300",
+"n%    c #CD5857",
+"o%    c #CF5A59",
+"p%    c #AE4543",
+"q%    c #481414",
+"r%    c #330E0E",
+"s%    c #1D0506",
+"t%    c #C1ABA8",
+"u%    c #943938",
+"v%    c #B84A4A",
+"w%    c #A23E3E",
+"x%    c #660000",
+"y%    c #990000",
+"z%    c #CE595A",
+"A%    c #762B2B",
+"B%    c #792A2A",
+"C%    c #3C100F",
+"D%    c #0A0101",
+"E%    c #A19D9B",
+"F%    c #A05A5A",
+"G%    c #7F2A2A",
+"H%    c #722425",
+"I%    c #C65352",
+"J%    c #863233",
+"K%    c #5B1A1B",
+"L%    c #531818",
+"M%    c #190506",
+"N%    c #433636",
+"O%    c #C2ACA8",
+"P%    c #561A18",
+"Q%    c #4F1516",
+"R%    c #C74E51",
+"S%    c #C75152",
+"T%    c #873333",
+"U%    c #672020",
+"V%    c #4F1414",
+"W%    c #1A0504",
+"X%    c #0D0202",
+"Y%    c #A79F9C",
+"Z%    c #A25C5A",
+"`%    c #6B1F1F",
+" &    c #9C3A3A",
+".&    c #6B2020",
+"+&    c #953838",
+"@&    c #883231",
+"#&    c #C14C4C",
+"$&    c #742627",
+"%&    c #863231",
+"&&    c #2D0C09",
+"*&    c #130204",
+"=&    c #5B3D3D",
+"-&    c #935554",
+";&    c #501716",
+">&    c #9F3C3B",
+",&    c #AD4344",
+"'&    c #7A2B2C",
+")&    c #813030",
+"!&    c #CA5453",
+"~&    c #54181A",
+"{&    c #0E0201",
+"]&    c #483836",
+"^&    c #732426",
+"/&    c #3A0D0D",
+"(&    c #6F2525",
+"_&    c #B94846",
+":&    c #963636",
+"<&    c #56191A",
+"[&    c #682424",
+"}&    c #AC4243",
+"|&    c #C44F4E",
+"1&    c #CA5254",
+"2&    c #621F20",
+"3&    c #180403",
+"4&    c #1A0604",
+"5&    c #C3ABA8",
+"6&    c #591C1C",
+"7&    c #340C0C",
+"8&    c #6C2223",
+"9&    c #702221",
+"0&    c #431313",
+"a&    c #7C2E2D",
+"b&    c #812C2C",
+"c&    c #8B3131",
+"d&    c #B54848",
+"e&    c #C34E4F",
+"f&    c #C65152",
+"g&    c #C85251",
+"h&    c #CA5454",
+"i&    c #CA5455",
+"j&    c #CB5656",
+"k&    c #C45454",
+"l&    c #7E2D2C",
+"m&    c #571919",
+"n&    c #561A1A",
+"o&    c #893130",
+"p&    c #511A18",
+"q&    c #1B0404",
+"r&    c #210705",
+"s&    c #A89E9B",
+"t&    c #C0AAA7",
+"u&    c #704442",
+"v&    c #26080A",
+"w&    c #3E0F11",
+"x&    c #1F0706",
+"y&    c #BD4C4D",
+"z&    c #BB4A4A",
+"A&    c #9F3E3F",
+"B&    c #792A29",
+"C&    c #A84443",
+"D&    c #B74A4A",
+"E&    c #C45050",
+"F&    c #C85250",
+"G&    c #B84C4C",
+"H&    c #4E1718",
+"I&    c #782A2A",
+"J&    c #521717",
+"K&    c #23080A",
+"L&    c #0E0202",
+"M&    c #433736",
+"N&    c #ACA09D",
+"O&    c #774745",
+"P&    c #210807",
+"Q&    c #812D2C",
+"R&    c #A03C3D",
+"S&    c #C14A4B",
+"T&    c #BC4848",
+"U&    c #A23C3C",
+"V&    c #852E2F",
+"W&    c #5E1B1C",
+"X&    c #6B2223",
+"Y&    c #702827",
+"Z&    c #843334",
+"`&    c #8C3637",
+" *    c #903839",
+".*    c #9A3D3C",
+"+*    c #983A3A",
+"@*    c #7C2C2B",
+"#*    c #863031",
+"$*    c #9C3B3B",
+"%*    c #953435",
+"&*    c #4E1516",
+"**    c #370C0D",
+"=*    c #170404",
+"-*    c #080200",
+";*    c #483837",
+">*    c #997975",
+",*    c #350D0C",
+"'*    c #390E0E",
+")*    c #5A1A19",
+"!*    c #7B2928",
+"~*    c #BB4848",
+"{*    c #A9403F",
+"]*    c #7A292A",
+"^*    c #782828",
+"/*    c #6B2021",
+"(*    c #742425",
+"_*    c #752628",
+":*    c #722728",
+"<*    c #8B3433",
+"[*    c #913434",
+"}*    c #8F3434",
+"|*    c #A33E3F",
+"1*    c #742726",
+"2*    c #632020",
+"3*    c #120401",
+"4*    c #130304",
+"5*    c #1D0505",
+"6*    c #7B6D69",
+"7*    c #8A7271",
+"8*    c #310B0C",
+"9*    c #2A090A",
+"0*    c #3E0F0E",
+"a*    c #601E1D",
+"b*    c #621F1D",
+"c*    c #571A19",
+"d*    c #681E1F",
+"e*    c #782624",
+"f*    c #762626",
+"g*    c #802A2B",
+"h*    c #A03B3B",
+"i*    c #9C3A3B",
+"j*    c #AA4041",
+"k*    c #832F2F",
+"l*    c #6C2222",
+"m*    c #4A1514",
+"n*    c #280908",
+"o*    c #100302",
+"p*    c #87706D",
+"q*    c #380F0F",
+"r*    c #200606",
+"s*    c #180405",
+"t*    c #1A0506",
+"u*    c #200709",
+"v*    c #2C0B0A",
+"w*    c #3F1010",
+"x*    c #2D0A0A",
+"y*    c #300B0A",
+"z*    c #401011",
+"A*    c #380E0D",
+"B*    c #2E0B0C",
+"C*    c #22070A",
+"D*    c #170304",
+"E*    c #110203",
+"F*    c #1E0606",
+"G*    c #756A68",
+"H*    c #B5A3A1",
+"I*    c #826E6B",
+"J*    c #573D3C",
+"K*    c #250809",
+"L*    c #1E0604",
+"M*    c #0C0403",
+"N*    c #100304",
+"O*    c #140405",
+"P*    c #170403",
+"Q*    c #250808",
+"R*    c #503A38",
+"S*    c #796C6A",
+"T*    c #AAA09D",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                        . + @ # $ % & * = -                                         ",
+"                                  ; > , ' ) ! ~ { ] ^ / ( _ : < [                                   ",
+"                              } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h                               ",
+"                          i j k l m n o p q r s t u v w x y z A B C D E F                           ",
+"                      G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.#.$.%.                      ",
+"                    &.*.=.-.+.` ;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.                    ",
+"                  7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.                  ",
+"                C.D.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.i.R.S.T.U.V.W.X.Y.Z.`.4. +.+++@+#+P                 ",
+"              %.$+%+&+*+=+-+;+K.>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+Z.1+2+3+4+5+6+7+8+9+              ",
+"            0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+n+n+n+n+n+n+n+n+o+n+n+n+n+n+n+n+n+n+p+q+r+s+t+            ",
+"            u+v+w+x+y+z+A+B+M.C+D+E+F+G+n+n+n+H+n+n+n+n+n+I+n+n+n+H+n+n+n+n+n+J+K+L+M+N+            ",
+"          O+P+Q+R+S+T+U+V+W+X+k+Y+Z+`+ @n+n+n+n+H+n+n+n+n+.@n+n+n+n+H+n+n+n+n++@@@#@$@%@&@          ",
+"          @+*@=@-@;@{.>@,@'@)@!@G+~@{@]@n+n+n+n+n+H+H+H+n+^@n+n+n+n+n+H+H+H+n+/@(@_@:@<@[@          ",
+"        }@P+|@1@2@3@4@g+5@6@k+7@8@9@0@0@n+n+H+n+H+n+n+n+n+a@n+n+H+n+H+n+n+n+n+b@c@d@e@*+f@g@        ",
+"        h@i@j@k@l@m@n@o@o@p@q@r@s@t@0@u@n+n+n+H+H+n+n+n+n+v@n+n+n+H+H+n+n+n+n+b@w@x@y@z@A@B@        ",
+"      C@D@E@f F@G@H@o@I@H+J@K@n+L@9@u@0@n+n+n+H+n+n+n+n+n+M@n+n+n+H+n+n+n+n+n+N@w@O@P@Q@R@S@T@      ",
+"      U@V@W@e@X@Y@o@Z@Z@Z@H+J@`@n+t@0@0@n+n+n+n+H+n+n+n+n+ #n+n+n+n+H+n+n+n+n+N@d@b@.#+#@###$#      ",
+"      %#&#*#=#-#;#o@H+Z@Z@H+J@o@n+>#0@u@n+n+n+n+n+n+n+n+n+,#n+n+n+n+n+n+n+n+n+'#)#!#~#{#]#^#/#      ",
+"    (#_#:#<#[#}#q.J@J@H+Z@H+J@q@n+|#1#9@2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#N@b@!#k#(@l#m#n#o#    ",
+"    p#q#r#s#t#u#v#o@o@J@J@J@o@q@n+w#x#y#n+n+n+n+n+n+n+n+n+z#n+n+n+n+n+n+n+n+n+A#w@!#B#C#D#E#F#G#    ",
+"    H#I#J#K#L#M#o@N#o@o@o@q@o@o@O#P#Q#R#n+n+n+H+n+n+n+n+n+S#n+n+n+H+n+n+n+n+n+T#w@U#U#x@V#W#X#Y#    ",
+"    Z#`# $.$+$J@H+N#@$o@o@#$o@$$q@q@%$&$n+n+n+n+H+n+n+n+n+*$n+n+n+n+H+n+n+n+n+b@w@=$d@-$;$>$,$'$    ",
+"    % )$j#!$~$J@{$Z@Z@@$@$@$$$$$$$N#]$^$n+n+n+n+n+H+H+H+n+/$n+n+n+n+n+H+H+H+n+!#($_$b@x@:$<$[$}$    ",
+"    |$1$2$F.3$J@{$I@I@Z@Z@N#N#N#N#@$4$5$n+n+H+n+H+n+n+n+n+v#n+n+H+n+H+n+n+n+n+!#6$7$!#8$9$0$a$b$    ",
+"    Z#a+c$d$e$J@{${${$I@I@Z@I@N#@$$$f$g$n+n+n+H+H+n+n+n+n+h$n+n+n+H+H+n+n+n+n+U#i$b@N@j$B@k$l$m$    ",
+"    n$o$p$q$r$J@{$N#{${${$I@I@@$@$$$K@s$n+n+n+H+n+n+n+n+n+t$n+n+n+H+n+n+n+n+n+A#u$-$v$w$x$y$z$A$    ",
+"    B$C$D$E$F$J@{$N#N#{${${${$@$@$$$q@G$n+n+n+n+H+n+n+n+n+H$n+n+n+n+H+n+n+n+n+_$I$J$K$L$M$N$O$P$    ",
+"    Q$R$S$T$U$J@{$N#N#N#{${${$@$$$$$]$H$n+n+n+n+n+n+n+n+n+V$n+n+n+n+n+n+n+n+n+7$W$T#X$Y$Z$`$ %.%    ",
+"      +%V#@%#%J@{$N#N#N#N#N#{$@$$$$$$%%%I &%*%=%-%;%>%,%Z.'%)%i#!%!%K$!#B#_$~%T#N@{%]%^%/%(%_%      ",
+"      :%@%<%[%J@{$N#N#N#N#N#N#@$$$$$q@;%n+n+n+n+n+n+n+n+n+}%n+n+n+n+n+n+n+n+n+|%1%_$2%3%4%5%6%      ",
+"      7%8%9%0%a%J@{$N#N#N#N#N#@$$$$$]$b%n+n+n+H+n+n+n+n+n+c%n+n+n+H+n+n+n+n+n+d%1%e%M$~$f%g%h%      ",
+"        i%j%k%l%J@{$N#N#N#N#N#@$m%q@{ n%n+n+n+n+H+n+n+n+n+!%n+n+n+n+H+n+n+n+n+o%8+p%q%r%s%_%        ",
+"        t%u%v%w%J@{$N#x%N#N#N#y%m%$%i#i#n+n+n+n+n+H+H+H+n+U#n+n+n+n+n+H+H+H+n+z%K$A%B%C%D%E%        ",
+"          F%G%H%J@{$N#y%N#N#x%y%$$]$K$T#n+n+H+n+H+n+n+n+n+b@n+n+H+n+H+n+n+n+n+I%J%K%L%M%N%          ",
+"          O%P%Q%J@{$N#y%N#N#@$@$$$q@R%S%n+n+n+H+H+n+n+n+n+~#n+n+n+H+H+n+n+n+n+T%U%V%W%X%Y%          ",
+"            Z%`% &.&+&@&u%#&b@d@O@b@+@+@n+n+n+H+n+n+n+n+n+!#n+n+n+H+n+n+n+n+n+$&%&&&*&=&            ",
+"              -&Z$;&>&,&'&)&O@d@~#R%U#O@n+n+n+n+H+n+n+n+n+!&n+n+n+n+H+n+n+n+n+;$~&{&]&              ",
+"                ^&/&(&_&:&<&[&}&|&d@T#A#n+n+n+n+n+n+n+n+n+1&n+n+n+n+n+n+n+n+n+2&3&4&                ",
+"                5&6&7&8&9&0&a&b&c&d&e&~#!#-$S%f&U#T#g&'#h&i&j&~%2$k&l&m&n&o&p&q&r&s&                ",
+"                  t&u&v&w&x&y&z&A&B&=#@%C&D&E&g&F&h&h&i#h&~%i#G&<@H&I&.&J&K&L&M&N&                  ",
+"                      O&v&P&Q&R&S&T&U&V&W&X&Y&Z&`& *.*l%+*V#@*#*$*%*&***=*-*;*                      ",
+"                        >*,*'*)*!*<@~*{*]*^*/*(*_*:*9%<*[*}*l%|*1*2*3*4*5*6*                        ",
+"                            7*8*9*0*a*b*c*d*e*f*g*h*i*j*k*e@l*m*n*o* %b$                            ",
+"                                p*q*r*s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*                                ",
+"                                    H*I*J*K*L*o*M*N*O*P*Q*R*S*T*                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.bmp
new file mode 100644 (file)
index 0000000..6b31964
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_MPR.xpm
new file mode 100644 (file)
index 0000000..24f8d5c
--- /dev/null
@@ -0,0 +1,566 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_tr_MPR_xpm[] = {
+"50 50 513 2",
+"      c #CED0CC",
+".     c #DFE0EF",
+"+     c #E0E2F0",
+"@     c #D5D5F4",
+"#     c #CFD0F0",
+"$     c #C3C3E2",
+"%     c #C5C7E8",
+"&     c #BFC1E1",
+"*     c #C0C0DF",
+"=     c #BFBFDE",
+"-     c #C4C5E3",
+";     c #C6C6E7",
+">     c #D0D1D8",
+",     c #CFCFD5",
+"'     c #DFDFEE",
+")     c #D6D6EE",
+"!     c #C2C3E0",
+"~     c #BEBED6",
+"{     c #C3C3DA",
+"]     c #C9CAE8",
+"^     c #C7C9EA",
+"/     c #BFBFDA",
+"(     c #B9B9CD",
+"_     c #B7B8C9",
+":     c #B4B4C3",
+"<     c #B2B3C2",
+"[     c #B0B1BE",
+"}     c #B9B9CF",
+"|     c #C2C4E0",
+"1     c #C5C5E5",
+"2     c #BCBCD4",
+"3     c #D0D0E7",
+"4     c #D9D9E9",
+"5     c #E2E3EA",
+"6     c #D6D6ED",
+"7     c #CCCDED",
+"8     c #D1D2F1",
+"9     c #CDCEEC",
+"0     c #C2C3DF",
+"a     c #B4B5C7",
+"b     c #ACACB5",
+"c     c #ABABB3",
+"d     c #ADADB6",
+"e     c #AAAAB2",
+"f     c #ABABB4",
+"g     c #AFAFBC",
+"h     c #B4B5C5",
+"i     c #B9BACE",
+"j     c #B7B7C9",
+"k     c #B8B7C7",
+"l     c #BABACE",
+"m     c #B5B5C5",
+"n     c #C6C7E8",
+"o     c #BCBDD3",
+"p     c #C7C9D9",
+"q     c #E0E0E4",
+"r     c #E7E8EE",
+"s     c #D3D4ED",
+"t     c #C1C2DC",
+"u     c #C9CAEC",
+"v     c #C9C9E9",
+"w     c #C2C2E0",
+"x     c #BCBDD5",
+"y     c #C2C1D8",
+"z     c #C5C6DD",
+"A     c #CFD2EE",
+"B     c #D1D2F0",
+"C     c #D0D1F0",
+"D     c #CFD0EF",
+"E     c #CDCEED",
+"F     c #CACAEB",
+"G     c #C7C7E7",
+"H     c #C3C5E2",
+"I     c #BFC0DA",
+"J     c #BAB9CD",
+"K     c #B1B2BF",
+"L     c #B6B6C6",
+"M     c #B8B8CA",
+"N     c #C0C1DF",
+"O     c #BAB9CC",
+"P     c #CCCCDF",
+"Q     c #E3E3EB",
+"R     c #D1D2F2",
+"S     c #C2C3E1",
+"T     c #BABACF",
+"U     c #C2C4E4",
+"V     c #BDBFD7",
+"W     c #C8C9E1",
+"X     c #D5D6F2",
+"Y     c #D9D9F6",
+"Z     c #D8D8F5",
+"`     c #D7D9F5",
+" .    c #D6D7F5",
+"..    c #D5D6F4",
+"+.    c #D3D5F3",
+"@.    c #CECEEF",
+"#.    c #CACCEC",
+"$.    c #C8CAEB",
+"%.    c #C7C8E9",
+"&.    c #B8B8CD",
+"*.    c #B7B9CA",
+"=.    c #B9B9CC",
+"-.    c #C8C7E9",
+";.    c #E4E5EC",
+">.    c #DBDCEC",
+",.    c #CECFEF",
+"'.    c #B6B6C7",
+").    c #BABAD0",
+"!.    c #C7C7DF",
+"~.    c #DADAF6",
+"{.    c #DEDEF8",
+"].    c #DFDEF9",
+"^.    c #DFDFF9",
+"/.    c #DCDCF8",
+"(.    c #DADAF7",
+"_.    c #D8D9F6",
+":.    c #D3D4F3",
+"<.    c #D0D1F1",
+"[.    c #CDCEEF",
+"}.    c #CCCDEE",
+"|.    c #C5C6E7",
+"1.    c #C1C3E3",
+"2.    c #B9B8CD",
+"3.    c #B3B3C2",
+"4.    c #C2C1DD",
+"5.    c #C7C7E9",
+"6.    c #DADAEA",
+"7.    c #D9DAF1",
+"8.    c #CED0F0",
+"9.    c #BCBDD6",
+"0.    c #DDDDF8",
+"a.    c #E1E1FA",
+"b.    c #E3E3FA",
+"c.    c #E4E5FB",
+"d.    c #E5E5FB",
+"e.    c #E3E3FB",
+"f.    c #DBDCF7",
+"g.    c #D9D9F7",
+"h.    c #D2D4F3",
+"i.    c #CDCFF0",
+"j.    c #CBCCED",
+"k.    c #C9CAEB",
+"l.    c #C6C6E8",
+"m.    c #C4C5E6",
+"n.    c #BDBED9",
+"o.    c #BABCD2",
+"p.    c #C6C7E7",
+"q.    c #C8C8E9",
+"r.    c #CCCCE3",
+"s.    c #D7D9F0",
+"t.    c #D2D3F2",
+"u.    c #CBCDEC",
+"v.    c #B7B7CA",
+"w.    c #B4B5C4",
+"x.    c #D1D1E9",
+"y.    c #E1E2FA",
+"z.    c #E6E6FC",
+"A.    c #E8E8FC",
+"B.    c #E9E9FC",
+"C.    c #E8E8FB",
+"D.    c #E6E7FC",
+"E.    c #E6E6FB",
+"F.    c #E4E3FA",
+"G.    c #E0E0F9",
+"H.    c #D0D0EF",
+"I.    c #CDCDEE",
+"J.    c #CBCBEC",
+"K.    c #C8C9EB",
+"L.    c #C5C5E6",
+"M.    c #BFC0DF",
+"N.    c #B9B9CE",
+"O.    c #BFBED8",
+"P.    c #C3C4E4",
+"Q.    c #CDCDE6",
+"R.    c #E6E7ED",
+"S.    c #C0BFDB",
+"T.    c #B8B8C8",
+"U.    c #E2E2FA",
+"V.    c #E9E8FC",
+"W.    c #EBEBFC",
+"X.    c #ECECFD",
+"Y.    c #ECEDFC",
+"Z.    c #EDECFC",
+"`.    c #EAEAFC",
+" +    c #E7E6FC",
+".+    c #E3E4FA",
+"++    c #E0DFF9",
+"@+    c #D0D1F2",
+"#+    c #CDCEEE",
+"$+    c #C5C5E7",
+"%+    c #C2C2E1",
+"&+    c #B9BBD1",
+"*+    c #BEBFDA",
+"=+    c #C0C0DD",
+"-+    c #E1E1E5",
+";+    c #E3E3EA",
+">+    c #D3D3F2",
+",+    c #BCBCCF",
+"'+    c #D3D3EB",
+")+    c #DDDCF8",
+"!+    c #E1E0F9",
+"~+    c #ECECFC",
+"{+    c #EDEEFD",
+"]+    c #F0F0FD",
+"^+    c #F1F2FE",
+"/+    c #F0F0FE",
+"(+    c #EFEEFD",
+"_+    c #EDEDFD",
+":+    c #DBDAF7",
+"<+    c #D6D7F4",
+"[+    c #D0D0F0",
+"}+    c #CACBEC",
+"|+    c #C7C8EA",
+"1+    c #C4C4E5",
+"2+    c #C1C2E0",
+"3+    c #B9BACF",
+"4+    c #BDBFDA",
+"5+    c #BDBED5",
+"6+    c #BDBDD5",
+"7+    c #D2D2EB",
+"8+    c #CDCFEF",
+"9+    c #C7C7E8",
+"0+    c #CDCDE5",
+"a+    c #DCDBF7",
+"b+    c #E4E4FB",
+"c+    c #F1F1FE",
+"d+    c #F2F3FE",
+"e+    c #F3F3FD",
+"f+    c #F2F2FE",
+"g+    c #EFEFFD",
+"h+    c #EBEAFC",
+"i+    c #E2E2F9",
+"j+    c #D3D4F4",
+"k+    c #CFD0F1",
+"l+    c #CACCED",
+"m+    c #C3C3E5",
+"n+    c #B2B2BF",
+"o+    c #BDBED6",
+"p+    c #BDBDD3",
+"q+    c #CACADB",
+"r+    c #BEBFD8",
+"s+    c #BEBFD2",
+"t+    c #E0E0FA",
+"u+    c #EEEDFC",
+"v+    c #F3F3FE",
+"w+    c #A0A0A0",
+"x+    c #D5D5F3",
+"y+    c #BCBCCE",
+"z+    c #BBBBCC",
+"A+    c #E1E2E8",
+"B+    c #B3B4C4",
+"C+    c #B5B6C6",
+"D+    c #D3D5F0",
+"E+    c #C6C6C6",
+"F+    c #D9C6C6",
+"G+    c #B3B3B3",
+"H+    c #EEEEFD",
+"I+    c #F5F5FD",
+"J+    c #FFFFFF",
+"K+    c #D6D6F4",
+"L+    c #BCBBD0",
+"M+    c #D7D8E8",
+"N+    c #C2C3E2",
+"O+    c #BBBCD5",
+"P+    c #FFFFEC",
+"Q+    c #ECECEC",
+"R+    c #D9D9D9",
+"S+    c #B3C6C6",
+"T+    c #EFEFFC",
+"U+    c #F6F6FE",
+"V+    c #BCBCD0",
+"W+    c #B7B7C6",
+"X+    c #D8D8E8",
+"Y+    c #CDCDE4",
+"Z+    c #C2C2DF",
+"`+    c #C6B3C6",
+" @    c #F5F5FE",
+".@    c #B6B7C6",
+"+@    c #B6B6C5",
+"@@    c #C9C9D9",
+"#@    c #B7B8C8",
+"$@    c #F6F5FE",
+"%@    c #B6B6C8",
+"&@    c #B6B5C6",
+"*@    c #D6D6E1",
+"=@    c #BCBDD4",
+"-@    c #BBBBCD",
+";@    c #D4D6F4",
+">@    c #BCBCD5",
+",@    c #B4B4C4",
+"'@    c #B3B3C1",
+")@    c #AAAAB1",
+"!@    c #C5C5D3",
+"~@    c #B8B8CC",
+"{@    c #C1C1DF",
+"]@    c #B7B9CB",
+"^@    c #C6C8E3",
+"/@    c #EFEEFC",
+"(@    c #F0F1FE",
+"_@    c #C3C3E4",
+":@    c #B2B3C3",
+"<@    c #ADADB8",
+"[@    c #CBCBDF",
+"}@    c #C9C9EA",
+"|@    c #C2C3D9",
+"1@    c #ADAEBA",
+"2@    c #ACACB6",
+"3@    c #FFECA0",
+"4@    c #BCBCD2",
+"5@    c #AFAFBB",
+"6@    c #FFC6A0",
+"7@    c #C6C6D9",
+"8@    c #ECC6A0",
+"9@    c #EAEAFB",
+"0@    c #D0D2F1",
+"a@    c #C2C4E6",
+"b@    c #BABBCF",
+"c@    c #AEAEB9",
+"d@    c #B7B7CD",
+"e@    c #CECFF0",
+"f@    c #FFECD9",
+"g@    c #B3B3C6",
+"h@    c #C3C4E5",
+"i@    c #B8B9CC",
+"j@    c #B0B0BD",
+"k@    c #B5B5C9",
+"l@    c #C4C5E5",
+"m@    c #BCBBD3",
+"n@    c #B3C6B3",
+"o@    c #B9BACD",
+"p@    c #ADADB9",
+"q@    c #B3B3C5",
+"r@    c #C5C6E8",
+"s@    c #C6B3B3",
+"t@    c #DCDDF8",
+"u@    c #DEDEF9",
+"v@    c #DEDFF9",
+"w@    c #D2D2F2",
+"x@    c #CECEF0",
+"y@    c #CBCDED",
+"z@    c #C2C4E5",
+"A@    c #C2C3E5",
+"B@    c #B6B6C9",
+"C@    c #A7A7AD",
+"D@    c #B2B1C2",
+"E@    c #BDBCD5",
+"F@    c #B7B8CB",
+"G@    c #AFB0BC",
+"H@    c #A7A6AB",
+"I@    c #BFBFD9",
+"J@    c #C9C9EB",
+"K@    c #C3C5E6",
+"L@    c #A6A6AC",
+"M@    c #B5B4C9",
+"N@    c #BABACC",
+"O@    c #AEAEBA",
+"P@    c #A6A6AB",
+"Q@    c #B9B9D0",
+"R@    c #C1C2DF",
+"S@    c #BBBBD0",
+"T@    c #C6C6B3",
+"U@    c #B4B3C1",
+"V@    c #A3A3A6",
+"W@    c #C1C2DD",
+"X@    c #D4D4DD",
+"Y@    c #BBBCCF",
+"Z@    c #BBBCD0",
+"`@    c #B1B1BF",
+" #    c #A7A7AC",
+".#    c #D6D7E7",
+"+#    c #E1E2E5",
+"@#    c #BCBCD1",
+"##    c #A4A4A9",
+"$#    c #E2E3EB",
+"%#    c #B9B9C9",
+"&#    c #B9B9CA",
+"*#    c #B9BAD0",
+"=#    c #ECB3A0",
+"-#    c #AEAFBA",
+";#    c #ABAAB3",
+">#    c #A3A2A4",
+",#    c #BABAD1",
+"'#    c #D0D0D6",
+")#    c #C6A0A0",
+"!#    c #D9A0A0",
+"~#    c #A9A9B0",
+"{#    c #A4A4A8",
+"]#    c #D7D7E5",
+"^#    c #E0E1E6",
+"/#    c #BFC1DF",
+"(#    c #AAAAB3",
+"_#    c #A3A1A4",
+":#    c #C7C8D6",
+"<#    c #B7B7C7",
+"[#    c #C3C4E6",
+"}#    c #A4A3A7",
+"|#    c #CCCCE2",
+"1#    c #B9BBCF",
+"2#    c #B2B3C1",
+"3#    c #BABBD2",
+"4#    c #B6B7CA",
+"5#    c #D2D3DA",
+"6#    c #B3B3C0",
+"7#    c #B5B6C7",
+"8#    c #BDBDD8",
+"9#    c #ADAEB7",
+"0#    c #D6D8E6",
+"a#    c #C5C5D1",
+"b#    c #BBBCD3",
+"c#    c #BDBDD7",
+"d#    c #B7B7CC",
+"e#    c #C2C3E4",
+"f#    c #B2B2C3",
+"g#    c #BCBDD2",
+"h#    c #ADAEB9",
+"i#    c #A6A7AD",
+"j#    c #C8C9DC",
+"k#    c #B3B3C3",
+"l#    c #A9AAB2",
+"m#    c #BCBCD3",
+"n#    c #B2B2C0",
+"o#    c #BFC0DD",
+"p#    c #C4C5E7",
+"q#    c #BDBED8",
+"r#    c #B0B0BF",
+"s#    c #B9BBCC",
+"t#    c #B1B1BE",
+"u#    c #A5A4A8",
+"v#    c #BBBBD2",
+"w#    c #E0E1E5",
+"x#    c #B5B5C3",
+"y#    c #B7B7CB",
+"z#    c #C1C2E2",
+"A#    c #C5C6E6",
+"B#    c #B9BAD1",
+"C#    c #B0B1BF",
+"D#    c #B0B0BC",
+"E#    c #B9B9CB",
+"F#    c #A5A5A9",
+"G#    c #CFD1CD",
+"H#    c #A7A6AC",
+"I#    c #A5A5AA",
+"J#    c #C1C0DD",
+"K#    c #BEBFDB",
+"L#    c #BABCD5",
+"M#    c #BFBFDB",
+"N#    c #C0C3E2",
+"O#    c #B6B7CC",
+"P#    c #B5B5C6",
+"Q#    c #B4B4C2",
+"R#    c #A7A6AA",
+"S#    c #A4A2A4",
+"T#    c #A6A6AA",
+"U#    c #D1D3D0",
+"V#    c #BEBFC7",
+"W#    c #B6B7C9",
+"X#    c #C0C1E2",
+"Y#    c #C0C1E0",
+"Z#    c #BDBED7",
+"`#    c #B4B4C5",
+" $    c #B7B8CE",
+".$    c #B6B7CB",
+"+$    c #B5B6C9",
+"@$    c #B6B6CA",
+"#$    c #B3B4C3",
+"$$    c #BABCD3",
+"%$    c #A9A9B1",
+"&$    c #A3A4A7",
+"*$    c #A8A9AF",
+"=$    c #C5C6D5",
+"-$    c #D0D2CE",
+";$    c #C4C4CF",
+">$    c #AFB0BB",
+",$    c #BABBD0",
+"'$    c #BFC2E1",
+")$    c #BEBFD9",
+"!$    c #B6B7C8",
+"~$    c #B2B2C1",
+"{$    c #B5B5C4",
+"]$    c #B8B9CA",
+"^$    c #A4A2A5",
+"/$    c #A4A4A7",
+"($    c #CACADD",
+"_$    c #E0E1E4",
+":$    c #C0C0C9",
+"<$    c #A7A8AF",
+"[$    c #B2B2BD",
+"}$    c #AFAFBA",
+"|$    c #B5B6C5",
+"1$    c #B6B8CA",
+"2$    c #A3A3A5",
+"3$    c #ABACB5",
+"4$    c #C4C5D2",
+"5$    c #E0E2E8",
+"6$    c #DFE1E4",
+"7$    c #A6A5AA",
+"8$    c #A8A7AD",
+"9$    c #A6A5A9",
+"0$    c #A4A3A6",
+"a$    c #A5A4A9",
+"b$    c #ACADB6",
+"c$    c #E1E2E6",
+"d$    c #D1D1D7",
+"e$    c #A4A5A9",
+"f$    c #A4A3A5",
+"g$    c #B4B6C7",
+"h$    c #D3D4DC",
+"i$    c #E2E2E8",
+"j$    c #D5D5DF",
+"k$    c #D2D3DB",
+"l$    c #D1D2D9",
+"m$    c #D3D3DA",
+"n$    c #D3D5DD",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F v G H I J K L M N O P Q                       ",
+"                      r R S T U V W X Y Z Z `  ...+.8 # @.#.$.%.S &.L *.=.n -.;.                    ",
+"                    >.,.0 '.).!.Y ~.{.].^.].]./.(._...:.<.[.}.u %.|.1.2.3.4.n 5.6.                  ",
+"                  7.8.9.j 3.s 0.^.a.b.c.d.e.b.a.^.f.g. .h.# i.j.k.%.l.m.n.3.o.p.q.r.                ",
+"                s.t.u.v.w.x.0.y.c.z.A.B.B.C.D.E.F.G.f.Y  .t.H.I.J.K.%.|.L.M.N.O.P.L.Q.              ",
+"              R.h.n S.T.s 0.U.d.V.W.X.Y.Z.Z.W.`. +.+++f.g.+.@+#+j.k.%.n $+L.%+&+*+/ =+-+            ",
+"            ;+>+# ! ,+'+)+!+d.C.~+{+]+^+/+/+(+_+W.E.e.^.:+<+>+[+I.}+|+5.$+m.1+2+3+4+5+6+Q           ",
+"            7+8+9+'.0+a+^.b+A.W.{+c+d+e+e+d+f+g+~+h+d.i+/._.j+k+#+l+K.9+9+L.1+m+%+n+o+p+q+          ",
+"          ;.}.r+T s+Z /.t+d.`.u+c+v+w+w+w+w+w+w+w+w+w+w+w+w+x+w+w+w+w+w+w+w+w+w+w+w+w+y+z+A+        ",
+"          n S B+C+D+E+E+F+G+W.H+f+I+w+w+w+w+w+w+w+J+w+w+w+w+K+w+w+w+w+w+J+w+w+w+w+w+w+5+,+L+        ",
+"        M+N+O+K !.E+P+Q+R+S+w+T+d+U+w+w+w+J+w+w+w+J+w+w+w+w+K+w+w+w+w+w+J+w+w+w+w+w+w+V+p+W+X+      ",
+"        Y+Z+2 : E+J+J+J+Q+R+`+w+d+ @w+w+w+J+w+w+w+J+w+w+w+w+ .w+w+w+w+w+J+w+w+w+w+w+w+.@V++@@@      ",
+"        9.r+3.#@E+Q+J+J+Q+R+E+w+v+$@w+w+w+J+J+w+w+J+w+w+w+w+@ w+w+w+w+w+J+w+w+w+w+w+w+%@*.T.&@      ",
+"      *@r+=@).-@R+R+Q+J+Q+R+G+w+c+ @w+w+w+w+J+J+J+J+w+w+w+w+;@w+w+w+w+w+J+J+w+w+w+w+w+>@,@'@)@4     ",
+"      !@~@{@]@^@E+E+R+R+R+E+G+w+/@(@w+w+w+w+J+J+w+w+w+w+w+w++.w+w+w+w+w+w+J+w+w+w+w+w+_@:@[ <@[@    ",
+"      }@|@1@2@E+3@E+E+E+G+E+E+C.W.u+w+w+w+w+J+J+w+w+w+w+w+w+t.w+w+w+w+w+w+J+w+w+w+w+w+m+4@=@5@2     ",
+"      }.# Z+R+Q+3@6@E+E+7@E+8@G+G+9@w+w+w+w+J+w+w+w+w+w+w+w+0@w+w+w+w+w+w+J+w+w+w+w+w+a@T b@c@d@    ",
+"      e@9+2 R+f@J+J+6@6@6@8@8@8@3@g@w+w+w+w+J+w+w+w+w+w+w+w+e@w+w+w+w+w+w+J+w+w+w+w+w+h@i@T j@k@    ",
+"      u l@m@R+f@P+P+J+J+3@3@3@3@6@n@w+w+w+w+w+w+w+w+w+w+w+w+}.w+w+w+w+w+w+w+w+w+w+w+w+h@~@o@p@q@    ",
+"      r@n =.R+f@f@f@P+P+J+P+3@6@8@s@t@u@v@{././.g. ...+.w@x@y@k.|+9+; m.L.z@A@z@z@z@A@1+B@'@C@D@    ",
+"      }+}+E@R+f@3@f@f@f@P+P+6@6@8@S+w+w+w+w+w+w+w+w+w+w+w+w+}+w+w+w+w+w+w+w+w+w+w+w+w+m.F@G@H@q@    ",
+"      k.j.I@R+f@3@3@f@f@f@f@6@6@8@G+w+w+w+w+w+w+w+w+w+w+w+w+J@w+w+w+w+w+w+w+w+w+w+w+w+K@j p@L@M@    ",
+"      l@%.N@R+f@3@3@3@f@f@f@6@8@8@g@w+w+w+w+w+w+w+w+w+w+w+w+u w+w+w+w+w+w+w+w+w+w+w+w+w C+O@P@Q@    ",
+"      R@o+S@R+f@3@3@3@3@3@f@6@8@8@T@w+w+w+w+w+w+w+w+w+w+w+w+5.w+w+w+w+w+w+w+w+w+w+w+w+O+U@f V@W@    ",
+"      X@Y@Z@R+f@3@3@3@3@3@3@6@8@8@G+w+w+w+w+w+w+w+w+w+w+w+w+r@w+w+w+w+w+w+w+w+w+w+w+w+L `@P@ #.#    ",
+"      +#V+_ @#R+f@3@3@3@3@3@6@8@8@g@w+w+J+J+w+w+w+J+J+J+w+w+L.w+w+w+w+w+w+w+w+w+w+w+w+'@5@##g $#    ",
+"        %#&#*#R+f@3@3@3@3@3@6@=#G+%.w+w+w+J+J+J+J+J+w+w+w+w+m.w+w+w+w+w+w+w+w+w+w+w+w+-#;#>#,#      ",
+"        '#b N.R+f@3@)#3@3@3@!#=#T@L.w+w+w+w+w+w+w+w+w+w+w+w+L.w+w+w+w+w+w+w+w+w+w+w+w+~#{# #]#      ",
+"        ^#4@/#R+f@3@!#3@3@)#!#8@g@K@w+w+w+w+w+w+w+w+w+w+w+w+m.w+w+w+w+w+w+w+w+w+w+w+w+(#_#q@Q       ",
+"          :#<#R+f@3@!#3@3@6@6@8@G+[#w+w+w+w+w+w+w+w+w+w+w+w+z@w+w+w+w+w+w+w+w+w+w+w+w+}#H@|#        ",
+"            5@<@1#2#5@3#a@A@z@A@1+K@w+w+w+w+w+w+w+w+w+w+w+w+z@w+w+w+w+w+w+w+w+w+w+w+w+>#4#          ",
+"            5#6#p+'@=.7#8#A@z@A@z@[#w+w+w+w+w+w+w+w+w+w+w+w+A@w+w+w+w+w+w+w+w+w+w+w+w+9#0#          ",
+"              a#'@O@b#c#F@d#e#z@A@A@a@A@z@z@z@z@z@A@A@a@$+m.h@h@h@L.$+; %+f#_ g#h#>#i#j#            ",
+"                k#l#: N m#n#f#o#[#z@z@z@z@z@z@z@z@z@A@z@K@p#r@; n n |.q#r#%@s#t#}#u#v#              ",
+"                w#G@~#6#x#<@3.2#y#z#A@m+z@z@h@[#z@K@1+K@1+A#p#L.L.P.B#C#D#E#h#{#F#( 5               ",
+"    G#            w#`@H#(#I#J#K#B#h N.L#M#z#m+L.[#m.m.L.m.m.N#3#O#n#P#Q#c@R#S#T#( 5                 ",
+"    U#                V#I#I#W#x X#Y#Z#).`#B@O# $.$B@+$@$@$B@#$).q#$$g %$&$_#*$=$                    ",
+"    -$                  ;$~#~#>$'.,$'$)$_ !$~$,@{$2#]$i b@,+o+o+m n+^$V@/$-#($                      ",
+"                          _$:$<$ #(#[$n+}$6#{$|$<#x m#I@1$m '@2@T#>#2$3$4$5$                        ",
+"                              6$3.~#7$}#{#T#C@(#C@<$(#l#8$9$V@0$a$b$( c$                            ",
+"                                  w#d$K f H#e$f$>#>#2$V@P@~#-#g$h$i$                                ",
+"                                          j$h$k$l$l$l$m$n$*@                                        ",
+"      G#                                                                                            ",
+"      G#                                                                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.bmp
new file mode 100644 (file)
index 0000000..6d42907
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Processing.xpm
new file mode 100644 (file)
index 0000000..b421d4b
--- /dev/null
@@ -0,0 +1,576 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_tr_Processing_xpm[] = {
+"50 50 523 2",
+"      c #CED0CC",
+".     c #DDDEDC",
+"+     c #ECECEC",
+"@     c #EBEBEB",
+"#     c #EAEAEA",
+"$     c #D6D7D4",
+"%     c #E2E2E2",
+"&     c #ACACAC",
+"*     c #8B8B8B",
+"=     c #B9B9BA",
+"-     c #BBBBBB",
+";     c #BCBCBC",
+">     c #B8B8B8",
+",     c #B3B4B6",
+"'     c #E9E9E9",
+")     c #F4F4F4",
+"!     c #DCDDF6",
+"~     c #CFD0F0",
+"{     c #C3C3E2",
+"]     c #C5C7E8",
+"^     c #BFC1E1",
+"/     c #C0C0DF",
+"(     c #BFBFDE",
+"_     c #C4C5E3",
+":     c #C6C6E7",
+"<     c #D0D1D8",
+"[     c #CFCFD5",
+"}     c #C6C7C7",
+"|     c #ABABAB",
+"1     c #E6E6E6",
+"2     c #6F6F6F",
+"3     c #9D9D9D",
+"4     c #E7E7E8",
+"5     c #F5F5F6",
+"6     c #FDFDFD",
+"7     c #FFFFFF",
+"8     c #FEFEFE",
+"9     c #F9F9F9",
+"0     c #EFEFEF",
+"a     c #E5E5E5",
+"b     c #DEDEDE",
+"c     c #EDEDED",
+"d     c #BFBFDA",
+"e     c #B9B9CD",
+"f     c #B7B8C9",
+"g     c #B4B4C3",
+"h     c #B2B3C2",
+"i     c #B0B1BE",
+"j     c #B9B9CF",
+"k     c #C2C4E0",
+"l     c #C5C5E5",
+"m     c #BCBCD4",
+"n     c #D0D0E7",
+"o     c #D9D9E9",
+"p     c #E3E3E4",
+"q     c #B7B7B7",
+"r     c #7F7F7F",
+"s     c #828282",
+"t     c #6D6D6D",
+"u     c #757575",
+"v     c #C9C9C9",
+"w     c #F2F2F2",
+"x     c #F6F6F6",
+"y     c #DDDDDD",
+"z     c #F8F8F8",
+"A     c #ABABB4",
+"B     c #AFAFBC",
+"C     c #B4B5C5",
+"D     c #B9BACE",
+"E     c #B7B7C9",
+"F     c #B8B7C7",
+"G     c #BABACE",
+"H     c #B5B5C5",
+"I     c #C6C7E8",
+"J     c #BCBDD3",
+"K     c #C7C9D9",
+"L     c #E0E0E4",
+"M     c #D8D8D8",
+"N     c #838384",
+"O     c #C2C2C2",
+"P     c #606060",
+"Q     c #CACACA",
+"R     c #E1E1E2",
+"S     c #D6D6D6",
+"T     c #E8E8F5",
+"U     c #CACAEB",
+"V     c #C9C9E9",
+"W     c #C7C7E7",
+"X     c #C3C5E2",
+"Y     c #BFC0DA",
+"Z     c #BAB9CD",
+"`     c #B1B2BF",
+" .    c #B6B6C6",
+"..    c #B8B8CA",
+"+.    c #C0C1DF",
+"@.    c #BAB9CC",
+"#.    c #CCCCDF",
+"$.    c #E3E3EB",
+"%.    c #DDDEDE",
+"&.    c #7C7D7E",
+"*.    c #C1C1C2",
+"=.    c #B9B9B9",
+"-.    c #7D7D7D",
+";.    c #707070",
+">.    c #CDCDCD",
+",.    c #E1E0E1",
+"'.    c #DADADA",
+").    c #D1D2F1",
+"!.    c #CECEEF",
+"~.    c #CACCEC",
+"{.    c #C8CAEB",
+"].    c #C7C8E9",
+"^.    c #C2C3E1",
+"/.    c #B8B8CD",
+"(.    c #B7B9CA",
+"_.    c #B9B9CC",
+":.    c #C8C7E9",
+"<.    c #E4E5EC",
+"[.    c #7C7C7D",
+"}.    c #A6A6A7",
+"|.    c #D2D2D2",
+"1.    c #D4D4D4",
+"2.    c #EEEEEE",
+"3.    c #D0D0D0",
+"4.    c #FCFCFC",
+"5.    c #D5D5D5",
+"6.    c #D3D4F3",
+"7.    c #D0D1F1",
+"8.    c #CDCEEF",
+"9.    c #CCCDEE",
+"0.    c #C9CAEC",
+"a.    c #C5C6E7",
+"b.    c #C1C3E3",
+"c.    c #B9B8CD",
+"d.    c #B3B3C2",
+"e.    c #C2C1DD",
+"f.    c #C7C7E9",
+"g.    c #DADAEA",
+"h.    c #CBCBCB",
+"i.    c #6F7071",
+"j.    c #A2A2A2",
+"k.    c #D6D7F5",
+"l.    c #D2D4F3",
+"m.    c #CDCFF0",
+"n.    c #CBCCED",
+"o.    c #C9CAEB",
+"p.    c #C6C6E8",
+"q.    c #C4C5E6",
+"r.    c #BDBED9",
+"s.    c #BABCD2",
+"t.    c #C6C7E7",
+"u.    c #C8C8E9",
+"v.    c #CCCCE3",
+"w.    c #8A8A89",
+"x.    c #999999",
+"y.    c #C9CACA",
+"z.    c #C5C5C5",
+"A.    c #DCDCDC",
+"B.    c #E8E8E8",
+"C.    c #CCCCCC",
+"D.    c #E0E0E0",
+"E.    c #F7F7F7",
+"F.    c #CBCBCC",
+"G.    c #D9D9F6",
+"H.    c #D2D3F2",
+"I.    c #D0D0EF",
+"J.    c #CDCDEE",
+"K.    c #CBCBEC",
+"L.    c #C8C9EB",
+"M.    c #C5C5E6",
+"N.    c #BFC0DF",
+"O.    c #B9B9CE",
+"P.    c #BFBED8",
+"Q.    c #C3C4E4",
+"R.    c #CDCDE6",
+"S.    c #727273",
+"T.    c #B2B2B0",
+"U.    c #BCBDBD",
+"V.    c #CECECE",
+"W.    c #F3F3F3",
+"X.    c #F5F5F5",
+"Y.    c #D9D9F7",
+"Z.    c #D3D5F3",
+"`.    c #D0D1F2",
+" +    c #CDCEEE",
+".+    c #C5C5E7",
+"++    c #C2C2E1",
+"@+    c #B9BBD1",
+"#+    c #BEBFDA",
+"$+    c #C0C0DD",
+"%+    c #E1E1E5",
+"&+    c #7A7A7B",
+"*+    c #E7E7E7",
+"=+    c #E4E4E4",
+"-+    c #CFCFCF",
+";+    c #CECECF",
+">+    c #DBDAF7",
+",+    c #D6D7F4",
+"'+    c #D3D3F2",
+")+    c #D0D0F0",
+"!+    c #CACBEC",
+"~+    c #C7C8EA",
+"{+    c #C4C4E5",
+"]+    c #C1C2E0",
+"^+    c #B9BACF",
+"/+    c #BDBFDA",
+"(+    c #BDBED5",
+"_+    c #BDBDD5",
+":+    c #8D8D8D",
+"<+    c #9C9C9D",
+"[+    c #C3C3C3",
+"}+    c #C4C4C4",
+"|+    c #F5F6F6",
+"1+    c #CACACB",
+"2+    c #E2E2F9",
+"3+    c #DCDCF8",
+"4+    c #D8D9F6",
+"5+    c #D3D4F4",
+"6+    c #CFD0F1",
+"7+    c #CACCED",
+"8+    c #C7C7E8",
+"9+    c #C3C3E5",
+"0+    c #B2B2BF",
+"a+    c #BDBED6",
+"b+    c #BDBDD3",
+"c+    c #CACADB",
+"d+    c #E4E4E5",
+"e+    c #828283",
+"f+    c #F1F1F1",
+"g+    c #E1E1E1",
+"h+    c #FBFBFB",
+"i+    c #D7D7D6",
+"j+    c #E2E2FA",
+"k+    c #DEDEF8",
+"l+    c #DADBF6",
+"m+    c #D5D5F3",
+"n+    c #D0D2F2",
+"o+    c #C3C5E6",
+"p+    c #C3C4E6",
+"q+    c #C2C4E6",
+"r+    c #B8B8CE",
+"s+    c #BABACC",
+"t+    c #BCBCCE",
+"u+    c #BBBBCC",
+"v+    c #E1E2E8",
+"w+    c #949494",
+"x+    c #DFDFDF",
+"y+    c #E5E5FB",
+"z+    c #DFDFF9",
+"A+    c #DADAF7",
+"B+    c #D6D6F4",
+"C+    c #D1D2F2",
+"D+    c #CECFF0",
+"E+    c #C2C4E5",
+"F+    c #BCBCCF",
+"G+    c #BCBBD0",
+"H+    c #D7D8E8",
+"I+    c #DADADB",
+"J+    c #EBEBEC",
+"K+    c #E9E9FB",
+"L+    c #E4E4FB",
+"M+    c #D1D3F2",
+"N+    c #CFCFEF",
+"O+    c #A0A0A0",
+"P+    c #BABAD0",
+"Q+    c #BCBCD0",
+"R+    c #B7B7C6",
+"S+    c #D8D8E8",
+"T+    c #CDCDE4",
+"U+    c #C2C2DF",
+"V+    c #F0F0F0",
+"W+    c #E5E6E6",
+"X+    c #D9D9DA",
+"Y+    c #EDEDFC",
+"Z+    c #DFDFFA",
+"`+    c #DADBF7",
+" @    c #C3C4E5",
+".@    c #C2C3E5",
+"+@    c #BEC0DD",
+"@@    c #B6B7C6",
+"#@    c #B6B6C5",
+"$@    c #C9C9D9",
+"%@    c #BCBDD6",
+"&@    c #BEBFD8",
+"*@    c #C2C2CD",
+"=@    c #F8F9F9",
+"-@    c #F0F0FE",
+";@    c #ECECFC",
+">@    c #E8E8FC",
+",@    c #E4E3FA",
+"'@    c #D5D5F4",
+")@    c #CECFEF",
+"!@    c #C0C0C0",
+"~@    c #B6B6C8",
+"{@    c #B8B8C8",
+"]@    c #B6B5C6",
+"^@    c #D6D6E1",
+"/@    c #BCBDD4",
+"(@    c #BBBBCD",
+"_@    c #F4F5F4",
+":@    c #E3E3E3",
+"<@    c #F6F6FD",
+"[@    c #F1F2FD",
+"}@    c #EEEEFC",
+"|@    c #EBEBFC",
+"1@    c #E8E8FB",
+"2@    c #E3E2FA",
+"3@    c #DEDDF9",
+"4@    c #D8D9F5",
+"5@    c #D4D6F4",
+"6@    c #D3D3D3",
+"7@    c #BCBCD5",
+"8@    c #B4B4C4",
+"9@    c #B3B3C1",
+"0@    c #AAAAB1",
+"a@    c #C5C5D3",
+"b@    c #B8B8CC",
+"c@    c #C1C1DF",
+"d@    c #B7B9CB",
+"e@    c #C6C8E3",
+"f@    c #D0D1F0",
+"g@    c #E5E5F8",
+"h@    c #E7E7F8",
+"i@    c #F5F5FE",
+"j@    c #F3F4FD",
+"k@    c #F1F2FE",
+"l@    c #EFEFFD",
+"m@    c #ECEDFC",
+"n@    c #E1E0F9",
+"o@    c #D8D8F6",
+"p@    c #D9FFEC",
+"q@    c #B2B3C3",
+"r@    c #ADADB8",
+"s@    c #CBCBDF",
+"t@    c #C9C9EA",
+"u@    c #C2C3D9",
+"v@    c #ADAEBA",
+"w@    c #ACACB6",
+"x@    c #CCCCEA",
+"y@    c #D5D6F3",
+"z@    c #DDDDF8",
+"A@    c #EBEBFA",
+"B@    c #E3E3E2",
+"C@    c #F1F1FD",
+"D@    c #F0EFFD",
+"E@    c #F0F0FD",
+"F@    c #EBEAFC",
+"G@    c #E7E6FB",
+"H@    c #DDDEF9",
+"I@    c #D8D9F7",
+"J@    c #D5D6F4",
+"K@    c #AFAFBB",
+"L@    c #CDCDEC",
+"M@    c #D3D3F3",
+"N@    c #D6D8F6",
+"O@    c #D9DAF7",
+"P@    c #D3D3D4",
+"Q@    c #ECECED",
+"R@    c #E9E9FC",
+"S@    c #E5E6FC",
+"T@    c #E3E3FB",
+"U@    c #DBDBF7",
+"V@    c #D7D8F6",
+"W@    c #D4D5F3",
+"X@    c #D0D2F1",
+"Y@    c #CCCDED",
+"Z@    c #CDCDEF",
+"`@    c #D1D1F1",
+" #    c #E0E1FA",
+".#    c #D5D5D6",
+"+#    c #E6E7FB",
+"@#    c #DBDBF8",
+"##    c #D4D6F3",
+"$#    c #000000",
+"%#    c #C4C5E5",
+"&#    c #BCBBD3",
+"*#    c #B1B2C0",
+"=#    c #CBCCEC",
+"-#    c #CFCFF0",
+";#    c #D2D2F2",
+">#    c #E0DFF9",
+",#    c #E3E4E5",
+"'#    c #D1D1D1",
+")#    c #C6C6C6",
+"!#    c #E1E1F9",
+"~#    c #DCDDF8",
+"{#    c #DFDEF8",
+"]#    c #D8D8F5",
+"^#    c #C5C6E8",
+"/#    c #B1B1BE",
+"(#    c #CCCDEF",
+"_#    c #DBDBF6",
+":#    c #DEDEF9",
+"<#    c #DEDFF9",
+"[#    c #CECEF0",
+"}#    c #BDBCD5",
+"|#    c #C9CBEB",
+"1#    c #D4D5F4",
+"2#    c #D9C6C6",
+"3#    c #B3B3B3",
+"4#    c #D0D2F0",
+"5#    c #BFBFD9",
+"6#    c #B1B0BD",
+"7#    c #C6C7E5",
+"8#    c #D2D2F1",
+"9#    c #D9D9D9",
+"0#    c #B3C6C6",
+"a#    c #D1D1F0",
+"b#    c #C2C3DD",
+"c#    c #CDCFEF",
+"d#    c #D3D3F1",
+"e#    c #C6B3C6",
+"f#    c #C1C2DF",
+"g#    c #BBBBD0",
+"h#    c #BBBDD5",
+"i#    c #C0C1DA",
+"j#    c #D3D3F0",
+"k#    c #C9CBEC",
+"l#    c #D4D4DD",
+"m#    c #BBBCCF",
+"n#    c #BBBCD0",
+"o#    c #BABBD0",
+"p#    c #BBBCD1",
+"q#    c #C6C8E9",
+"r#    c #C7C9E9",
+"s#    c #C8C9EA",
+"t#    c #A0ECA0",
+"u#    c #E1E2E5",
+"v#    c #BCBCD1",
+"w#    c #BEBED6",
+"x#    c #C3C4E3",
+"y#    c #C7C9EA",
+"z#    c #FEA0A0",
+"A#    c #B9B9C9",
+"B#    c #B9B9CA",
+"C#    c #B9BAD0",
+"D#    c #B6B6C9",
+"E#    c #FFECA0",
+"F#    c #D0D0D6",
+"G#    c #ACACB5",
+"H#    c #BDBED8",
+"I#    c #FFC6A0",
+"J#    c #C6C6D9",
+"K#    c #ECC6A0",
+"L#    c #E0E1E6",
+"M#    c #BCBCD2",
+"N#    c #BFC1DF",
+"O#    c #BDBFD7",
+"P#    c #B8B9CA",
+"Q#    c #B3B4C5",
+"R#    c #C2C3E3",
+"S#    c #FFECD9",
+"T#    c #B3B3C6",
+"U#    c #C7C8D6",
+"V#    c #B7B7C7",
+"W#    c #B5B4C3",
+"X#    c #B3B3C0",
+"Y#    c #B0B0BC",
+"Z#    c #B7B8CD",
+"`#    c #C2C3E4",
+" $    c #B3C6B3",
+".$    c #B9BBCF",
+"+$    c #B2B3C1",
+"@$    c #BABBD2",
+"#$    c #C6B3B3",
+"$$    c #D2D3DA",
+"%$    c #B5B6C7",
+"&$    c #BDBDD8",
+"*$    c #ADADAD",
+"=$    c #444444",
+"-$    c #C5C5D1",
+";$    c #AEAEBA",
+">$    c #BBBCD3",
+",$    c #BDBDD7",
+"'$    c #B7B8CB",
+")$    c #B7B7CC",
+"!$    c #222222",
+"~$    c #B3B3C3",
+"{$    c #A9AAB2",
+"]$    c #BCBCD3",
+"^$    c #B2B2C0",
+"/$    c #B2B2C3",
+"($    c #BFC0DD",
+"_$    c #555555",
+":$    c #E0E1E5",
+"<$    c #AFB0BC",
+"[$    c #A9A9B0",
+"}$    c #B5B5C3",
+"|$    c #C6C6B3",
+"1$    c #CFD1CD",
+"2$    c #B1B1BF",
+"3$    c #A7A6AC",
+"4$    c #AAAAB3",
+"5$    c #A5A5AA",
+"6$    c #C1C0DD",
+"7$    c #BEBFDB",
+"8$    c #D1D3D0",
+"9$    c #BEBFC7",
+"0$    c #B6B7C9",
+"a$    c #BCBDD5",
+"b$    c #C0C1E2",
+"c$    c #D0D2CE",
+"d$    c #C4C4CF",
+"e$    c #AFB0BB",
+"f$    c #B6B6C7",
+"g$    c #ECB3A0",
+"h$    c #E0E1E4",
+"i$    c #C0C0C9",
+"j$    c #A7A8AF",
+"k$    c #A7A7AC",
+"l$    c #C6A0A0",
+"m$    c #D9A0A0",
+"n$    c #DFE1E4",
+"o$    c #A8A7AD",
+"p$    c #A3A3A6",
+"q$    c #A6A6AB",
+"r$    c #AEAFBA",
+"s$    c #D5D5DF",
+"t$    c #D3D4DC",
+"u$    c #D2D3DB",
+"v$    c #D1D2D9",
+"w$    c #D3D3DA",
+"x$    c #D3D5DD",
+"                                                                                                    ",
+"                                                                                                    ",
+"                          . + @ + #                                                                 ",
+"                  $ % & * = - ; - > , ' ) ! ~ { ] ^ / ( _ : < [                                     ",
+"                } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o                               ",
+"            p q 2 r s 2 t u v w 7 7 7 7 6 x y b z A B C D E F G H I J K L                           ",
+"          M N O P 2 2 2 v Q Q 7 7 7 7 7 7 7 6 R S T U V W X Y Z `  ...+.@.#.$.                      ",
+"        %.&.*.=.-.;.;.S >.v Q + 9 7 7 7 7 7 7 6 ,.'.).~ !.~.{.].^./. .(._.I :.<.                    ",
+"        [.}.|.2 2 2 1.7 2.Q v v 3.7 7 7 7 7 7 7 4.5.+ 6.7.8.9.0.].a.b.c.d.e.I f.g.                  ",
+"      h.i.1.& j.r v '.7 4.v Q a w 7 7 7 7 7 7 7 7 4 S k.l.~ m.n.o.].p.q.r.d.s.t.u.v.                ",
+"      w.x.y.}.z.A.v v B.A.v C.7 7 D.1.7 7 7 7 7 7 E.F.G.k.H.I.J.K.L.].a.M.N.O.P.Q.M.R.              ",
+"      S.T.U.}.b v Q V.Q v v v W.z v '.7 7 7 7 7 7 6 V.X.Y.Z.`. +n.o.].I .+M.++@+#+d $+%+            ",
+"      &+q - b *+>.0 1 Q 7 =+v -+3.v v C.v w 7 7 7 6 ;+x >+,+'+)+J.!+~+f..+q.{+]+^+/+(+_+$.          ",
+"      :+<+Q b # 7 7 7 [+7 B.}+v v v v Q Q 7 7 7 7 |+1+2+3+4+5+6+ +7+L.8+8+M.{+9+++0+a+b+c+          ",
+"      d+e+f+D.g+h+7 7 2.7 a -+Q Q S >.v Q + 9 7 8 % i+j+k+l+m+n+!.n.{.].I M.o+p+q+r+s+t+u+v+        ",
+"        w+4 + x+c 8 7 7 2.v v v 1.7 2.Q v v 3.7 E.C.2.y+z+A+B+C+D+n.o.].] .+M.9+E+++g (+F+G+        ",
+"        H+I+w J+% W.7 7 7 A.-+v '.7 4.v Q a w z |.D.K+L+z+A+B+M+N+O+O+O+I M.M.{+q+E+P+Q+b+R+S+      ",
+"        T+U+1 w V+W+X.8 7 7 A.v v B.A.v C.8 0 -+X+Y+K+y+Z+`+k.C+D+O+x+x+O+O+o+ @.@E++@@@Q+#@$@      ",
+"        %@&@*@2.w =@w 9 7 b v Q V.Q v v v f+w # -@;@>@,@z+A+'@H.)@O+!@!@x+x+O+O+E+.@9+~@(.{@]@      ",
+"      ^@&@/@P+(@X.z _@) z *+>.0 1 Q 5.:@x+B.<@[@}@|@1@2@3@4@5@7.O+!@C.C.!@!@x+6@O+O+ @7@8@9@0@o     ",
+"      a@b@c@d@e@f@H.g@h@c ' 5.h+7 [+0 1 i@j@k@l@m@>@y+n@3+o@Z.f@O+!@C.p@C.C.!@!@6@6@O+O+q@i r@s@    ",
+"      t@u@v@w@x@)+H.y@G.z@A@3.M h++ 5.B@C@D@E@m@F@G@j+H@I@J@H.~ O+!@C.p@p@p@C.C.!@!@6@6@O+O+K@m     ",
+"      9.~ U+#@L@!.7.M@N@O@H@X.P@|.x Q@h.x Y+|@R@S@T@z+U@V@W@X@O+!@C.p@p@p@p@p@p@C.C.!@!@6@6@O+O+    ",
+"      D+8+m C Y@Z@D+`@W@k.A+H@ #D.F..#1+V.z +#y+j+z+@#4+##M+D+O+!@C.p@p@p@p@p@p@p@p@C.C.!@!@6@6@$#  ",
+"      0.%#&#*#!+=#Y@-#;#'@o@A+U@>#X.,#'#)#B.j+!#~#{#]#B+H.~ 9.O+!@C.p@p@p@p@p@p@p@p@p@p@C.C.)#)#$#  ",
+"      ^#I _./#!+o.7+(#f@H.W@,+4+`+_#~#:#<#k+3+3+Y.k.J@Z.;#[#O+!@C.p@p@p@p@p@p@p@p@p@p@p@p@p@6@)#$#  ",
+"      !+!+}#` |#~+o.7+Y@-#7.1#y@k.4+G.A+)#)#2#3#5@W@4+;#4#m.O+!@C.p@p@p@p@p@p@p@p@p@p@p@p@6@)#=.$#  ",
+"      o.n.5#6#7#].].o.n.9.8.)+8#'+M@W@)#B.+ 9#0#O+7.a#~ -#~ O+!@C.p@p@p@p@p@p@p@p@p@p@p@p@6@)#=.$#  ",
+"      %#].s+#@b#8+].f.o.!+7+(#c#)+d#)#B.B.B.+ 9#e#O+D+D+-#O+!@C.p@p@p@p@p@p@p@p@p@p@p@p@p@6@)#=.$#  ",
+"      f#a+g#h#i#p.a.].8+L.o.K.n.9.j#)#+ B.B.+ 9#)#O+!+9.k#O+!@6@6@6@p@p@p@p@p@p@p@p@p@p@6@)#=.O+    ",
+"      l#m#n#o#p#^#M.: q#8+r#s#o.!+!+9#9#+ B.+ 9#3#O+U ].s#6@O+6@t#6@6@6@p@p@p@p@p@p@p@p@6@)#=.O+    ",
+"      u#Q+f v#w#x#M.q.M.p.] 8+].y#].)#)#9#9#9#)#3#O+L.O+O+=.1 1 z#6@6@6@6@6@p@p@p@p@p@p@6@)#=.O+    ",
+"        A#B#C#D#P+p+q.M.M.a.p.p.q#)#E#)#)#)#3#)#)#O+O+1 6@6@=.=.1 1 6@6@6@6@6@6@p@p@p@6@)#=.O+      ",
+"        F#G#O.a+C H#p+p+q.M.M.M.9#+ E#I#)#)#J#)#K#3#3#6@w )#6@6@=.=.1 1 6@6@6@6@6@6@p@6@)#=.O+      ",
+"        L#M#N#O#P#Q#R#o+p+p+q.q.9#S#B.B.I#I#I#K#K#K#E#T#)#6@w )#6@6@=.=.1 1 6@!@6@6@6@6@)#=.O+      ",
+"          U#V#W#X#Y#Z#`#.@p+E+p+9#S#B.B.B.B.E#E#E#E#I# $6@1 )#6@w )#6@6@=.=.1 1 6@!@6@)#=.O+        ",
+"            K@r@.$+$K@@$q+.@E+.@9#S#S#S#B.B.B.B.E#I#K##$C.C.6@1 )#6@w )#6@6@=.=.1 1 6@)#O+$#        ",
+"            $$X#b+9@_.%$&$.@E+.@9#S#E#S#S#S#B.B.I#I#K#0#9 7 C.6@6@w )#6@w )#6@6@=.=.1 O+*$=$=$      ",
+"              -$9@;$>$,$'$)$`#E+9#S#E#E#S#S#S#S#I#I#K#3#1 1 !@C.w )#6@w )#6@w )#6@6@=.=.$#!$=$=$    ",
+"                ~${$g +.]$^$/$($9#S#E#E#E#S#S#S#I#K#K#T#!@C.C.6@6@6@w )#6@w )#6@6@6@!@_$$#!$!$=$    ",
+"                :$<$[$X#}$r@d.+$9#S#E#E#E#E#E#S#I#K#K#|$C.!@6@6@6@6@6@6@w )#6@6@!@!@=.=$$#!$=$=$    ",
+"    1$            :$2$3$4$5$6$7$9#S#E#E#E#E#E#E#I#K#K#3#1 1 6@6@6@6@6@6@6@6@!@!@=.=.$#$#!$=$=$      ",
+"    8$                9$5$5$0$a$b$9#S#E#E#E#E#E#I#K#K#T#)#)#1 1 6@6@6@6@!@!@=.=.$#$#!$!$=$          ",
+"    c$                  d$[$[$e$f$9#S#E#E#E#E#E#I#g$3#O+)#)#)#)#1 1 !@!@=.=.O+$#!$!$=$              ",
+"                          h$i$j$k$9#S#E#l$E#E#E#m$g$|$!@O+O+)#)#)#)#=.=.O+O+!$!$=$                  ",
+"                              n$d.9#S#E#m$E#E#l$m$K#T#{$o$!@O+O+)#)#O+O+!$!$=$                      ",
+"                                  9#S#E#m$E#E#I#I#K#3#p$q$[$r$!@O+O+!$!$=$                          ",
+"                                          s$t$u$v$v$v$w$x$^@      =$=$                              ",
+"      1$                                                                                            ",
+"      1$                                                                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.bmp
new file mode 100644 (file)
index 0000000..12a0018
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_Quantification.xpm
new file mode 100644 (file)
index 0000000..f77e799
--- /dev/null
@@ -0,0 +1,615 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_tr_Quantification_xpm[] = {
+"50 50 562 2",
+"      c #CED0CC",
+".     c #DFE0EF",
+"+     c #E0E2F0",
+"@     c #D5D5F4",
+"#     c #CFD0F0",
+"$     c #C3C3E2",
+"%     c #C5C7E8",
+"&     c #BFC1E1",
+"*     c #C0C0DF",
+"=     c #BFBFDE",
+"-     c #C4C5E3",
+";     c #C6C6E7",
+">     c #D0D1D8",
+",     c #CFCFD5",
+"'     c #DFDFEE",
+")     c #D6D6EE",
+"!     c #C2C3E0",
+"~     c #BEBED6",
+"{     c #C3C3DA",
+"]     c #C9CAE8",
+"^     c #C7C9EA",
+"/     c #BFBFDA",
+"(     c #B9B9CD",
+"_     c #B7B8C9",
+":     c #B4B4C3",
+"<     c #B2B3C2",
+"[     c #B0B1BE",
+"}     c #B9B9CF",
+"|     c #C2C4E0",
+"1     c #C5C5E5",
+"2     c #BCBCD4",
+"3     c #D0D0E7",
+"4     c #D9D9E9",
+"5     c #E2E3EA",
+"6     c #D6D6ED",
+"7     c #CCCDED",
+"8     c #D1D2F1",
+"9     c #CDCEEC",
+"0     c #C2C3DF",
+"a     c #B4B5C7",
+"b     c #ACACB5",
+"c     c #ABABB3",
+"d     c #ADADB6",
+"e     c #AAAAB2",
+"f     c #ABABB4",
+"g     c #AFAFBC",
+"h     c #B4B5C5",
+"i     c #B9BACE",
+"j     c #B7B7C9",
+"k     c #B8B7C7",
+"l     c #BABACE",
+"m     c #B5B5C5",
+"n     c #C6C7E8",
+"o     c #BCBDD3",
+"p     c #C7C9D9",
+"q     c #E0E0E4",
+"r     c #E7E8EE",
+"s     c #D3D4ED",
+"t     c #C1C2DC",
+"u     c #C9CAEC",
+"v     c #C9C9E9",
+"w     c #C2C2E0",
+"x     c #BCBDD5",
+"y     c #C2C1D8",
+"z     c #C5C6DD",
+"A     c #CFD2EE",
+"B     c #D1D2F0",
+"C     c #D0D1F0",
+"D     c #CFD0EF",
+"E     c #CDCEED",
+"F     c #CACAEB",
+"G     c #C7C7E7",
+"H     c #C3C5E2",
+"I     c #BFC0DA",
+"J     c #BAB9CD",
+"K     c #B1B2BF",
+"L     c #B6B6C6",
+"M     c #B8B8CA",
+"N     c #C0C1DF",
+"O     c #BAB9CC",
+"P     c #CCCCDF",
+"Q     c #E3E3EB",
+"R     c #D1D2F2",
+"S     c #C2C3E1",
+"T     c #BABACF",
+"U     c #C2C4E4",
+"V     c #BDBFD7",
+"W     c #C8C9E1",
+"X     c #D5D6F2",
+"Y     c #D9D9F6",
+"Z     c #D8D8F5",
+"`     c #D7D9F5",
+" .    c #D6D7F5",
+"..    c #D5D6F4",
+"+.    c #D3D5F3",
+"@.    c #CECEEF",
+"#.    c #CACCEC",
+"$.    c #C8CAEB",
+"%.    c #C7C8E9",
+"&.    c #B8B8CD",
+"*.    c #B7B9CA",
+"=.    c #B9B9CC",
+"-.    c #C8C7E9",
+";.    c #E4E5EC",
+">.    c #DBDCEC",
+",.    c #CECFEF",
+"'.    c #B6B6C7",
+").    c #BABAD0",
+"!.    c #C7C7DF",
+"~.    c #DADAF6",
+"{.    c #DEDEF8",
+"].    c #DFDEF9",
+"^.    c #DFDFF9",
+"/.    c #DCDCF8",
+"(.    c #DADAF7",
+"_.    c #D8D9F6",
+":.    c #D3D4F3",
+"<.    c #D0D1F1",
+"[.    c #CDCEEF",
+"}.    c #CCCDEE",
+"|.    c #C5C6E7",
+"1.    c #C1C3E3",
+"2.    c #B9B8CD",
+"3.    c #B3B3C2",
+"4.    c #C2C1DD",
+"5.    c #C7C7E9",
+"6.    c #DADAEA",
+"7.    c #D9DAF1",
+"8.    c #CED0F0",
+"9.    c #BCBDD6",
+"0.    c #DDDDF8",
+"a.    c #E1E1FA",
+"b.    c #E3E3FA",
+"c.    c #E4E5FB",
+"d.    c #E5E5FB",
+"e.    c #E3E3FB",
+"f.    c #DBDCF7",
+"g.    c #D9D9F7",
+"h.    c #D2D4F3",
+"i.    c #CDCFF0",
+"j.    c #CBCCED",
+"k.    c #C9CAEB",
+"l.    c #C6C6E8",
+"m.    c #C4C5E6",
+"n.    c #BDBED9",
+"o.    c #BABCD2",
+"p.    c #C6C7E7",
+"q.    c #C8C8E9",
+"r.    c #CCCCE3",
+"s.    c #D7D9F0",
+"t.    c #D2D3F2",
+"u.    c #CBCDEC",
+"v.    c #B7B7CA",
+"w.    c #B4B5C4",
+"x.    c #D1D1E9",
+"y.    c #E1E2FA",
+"z.    c #E6E6FC",
+"A.    c #E8E8FC",
+"B.    c #E9E9FC",
+"C.    c #E8E8FB",
+"D.    c #E6E7FC",
+"E.    c #E6E6FB",
+"F.    c #E4E3FA",
+"G.    c #E0E0F9",
+"H.    c #D0D0EF",
+"I.    c #CDCDEE",
+"J.    c #CBCBEC",
+"K.    c #C8C9EB",
+"L.    c #C5C5E6",
+"M.    c #BFC0DF",
+"N.    c #B9B9CE",
+"O.    c #BFBED8",
+"P.    c #C3C4E4",
+"Q.    c #CDCDE6",
+"R.    c #E6E7ED",
+"S.    c #C0BFDB",
+"T.    c #B8B8C8",
+"U.    c #E2E2FA",
+"V.    c #E9E8FC",
+"W.    c #EBEBFC",
+"X.    c #ECECFD",
+"Y.    c #ECEDFC",
+"Z.    c #EDECFC",
+"`.    c #EAEAFC",
+" +    c #E7E6FC",
+".+    c #E3E4FA",
+"++    c #E0DFF9",
+"@+    c #D0D1F2",
+"#+    c #D9B3D9",
+"$+    c #C5C5E7",
+"%+    c #C2C2E1",
+"&+    c #B9BBD1",
+"*+    c #BEBFDA",
+"=+    c #C0C0DD",
+"-+    c #E1E1E5",
+";+    c #E3E3EA",
+">+    c #D3D3F2",
+",+    c #BCBCCF",
+"'+    c #D3D3EB",
+")+    c #DDDCF8",
+"!+    c #E1E0F9",
+"~+    c #B3B3B3",
+"{+    c #ECECFC",
+"]+    c #EDEEFD",
+"^+    c #F0F0FD",
+"/+    c #F1F2FE",
+"(+    c #F0F0FE",
+"_+    c #EFEEFD",
+":+    c #EDEDFD",
+"<+    c #ECB3A0",
+"[+    c #DBDAF7",
+"}+    c #D6D7F4",
+"|+    c #CACBEC",
+"1+    c #C7C8EA",
+"2+    c #D9C6D9",
+"3+    c #C1C2E0",
+"4+    c #B9BACF",
+"5+    c #BDBFDA",
+"6+    c #BDBED5",
+"7+    c #BDBDD5",
+"8+    c #D2D2EB",
+"9+    c #CDCFEF",
+"0+    c #C7C7E8",
+"a+    c #CDCDE5",
+"b+    c #DCDBF7",
+"c+    c #E4E4FB",
+"d+    c #A0A0A0",
+"e+    c #F1F1FE",
+"f+    c #F2F3FE",
+"g+    c #F3F3FD",
+"h+    c #F2F2FE",
+"i+    c #EFEFFD",
+"j+    c #D3D4F4",
+"k+    c #CACCED",
+"l+    c #C3C3E5",
+"m+    c #B2B2BF",
+"n+    c #BDBED6",
+"o+    c #BDBDD3",
+"p+    c #CACADB",
+"q+    c #BEBFD8",
+"r+    c #BEBFD2",
+"s+    c #E0E0FA",
+"t+    c #F5F5FD",
+"u+    c #F6F5FD",
+"v+    c #F6F6FE",
+"w+    c #F4F4FE",
+"x+    c #DADBF6",
+"y+    c #D5D5F3",
+"z+    c #C3C5E6",
+"A+    c #C3C4E6",
+"B+    c #C2C4E6",
+"C+    c #B8B8CE",
+"D+    c #BABACC",
+"E+    c #BCBCCE",
+"F+    c #BBBBCC",
+"G+    c #E1E2E8",
+"H+    c #B3B4C4",
+"I+    c #B5B6C6",
+"J+    c #D3D5F0",
+"K+    c #DCDDF9",
+"L+    c #E7E7FC",
+"M+    c #F7F8FE",
+"N+    c #D6D6F4",
+"O+    c #ECA0D9",
+"P+    c #C2C4E5",
+"Q+    c #BCBBD0",
+"R+    c #D7D8E8",
+"S+    c #C2C3E2",
+"T+    c #BBBCD5",
+"U+    c #D6D6F3",
+"V+    c #E2E3FB",
+"W+    c #E7E8FB",
+"X+    c #C6C6C6",
+"Y+    c #F3F3FE",
+"Z+    c #E9E9FB",
+"`+    c #D9A0D9",
+" @    c #BCBCD0",
+".@    c #B7B7C6",
+"+@    c #D8D8E8",
+"@@    c #CDCDE4",
+"#@    c #C2C2DF",
+"$@    c #CDCEE9",
+"%@    c #E3E2FB",
+"&@    c #E7E7FB",
+"*@    c #ECEBFC",
+"=@    c #F1F0FD",
+"-@    c #EDEDFC",
+";@    c #D9D9D9",
+">@    c #ECD9C6",
+",@    c #C2C3E5",
+"'@    c #BEC0DD",
+")@    c #B6B7C6",
+"!@    c #B6B6C5",
+"~@    c #C9C9D9",
+"{@    c #B7B8C8",
+"]@    c #CFCFEC",
+"^@    c #D7D8F6",
+"/@    c #E0E1FA",
+"(@    c #ECD9D9",
+"_@    c #B6B6C8",
+":@    c #B6B5C6",
+"<@    c #D6D6E1",
+"[@    c #BCBDD4",
+"}@    c #BBBBCD",
+"|@    c #CFD0EE",
+"1@    c #E5E6FC",
+"2@    c #E3E2FA",
+"3@    c #ECC6D9",
+"4@    c #ECECD9",
+"5@    c #D9D9C6",
+"6@    c #C4C4E5",
+"7@    c #C3C4E5",
+"8@    c #BCBCD5",
+"9@    c #B4B4C4",
+"0@    c #B3B3C1",
+"a@    c #AAAAB1",
+"b@    c #C5C5D3",
+"c@    c #B8B8CC",
+"d@    c #C1C1DF",
+"e@    c #B7B9CB",
+"f@    c #C6C8E3",
+"g@    c #DFE0F9",
+"h@    c #E4E3FB",
+"i@    c #D9C6C6",
+"j@    c #C3C3E4",
+"k@    c #B2B3C3",
+"l@    c #ADADB8",
+"m@    c #CBCBDF",
+"n@    c #C9C9EA",
+"o@    c #C2C3D9",
+"p@    c #ADAEBA",
+"q@    c #ACACB6",
+"r@    c #CCCCEA",
+"s@    c #D0D0F0",
+"t@    c #D5D6F3",
+"u@    c #FFD9C6",
+"v@    c #C4C5E5",
+"w@    c #BCBCD2",
+"x@    c #AFAFBB",
+"y@    c #CDCDEC",
+"z@    c #D3D3F3",
+"A@    c #D6D8F6",
+"B@    c #D9DAF7",
+"C@    c #DDDEF9",
+"D@    c #BABBCF",
+"E@    c #AEAEB9",
+"F@    c #B7B7CD",
+"G@    c #CECFF0",
+"H@    c #CDCDEF",
+"I@    c #D1D1F1",
+"J@    c #D4D5F3",
+"K@    c #D1D3F2",
+"L@    c #B8B9CC",
+"M@    c #B0B0BD",
+"N@    c #B5B5C9",
+"O@    c #BCBBD3",
+"P@    c #B1B2C0",
+"Q@    c #CBCCEC",
+"R@    c #CFCFF0",
+"S@    c #D2D2F2",
+"T@    c #C6B3B3",
+"U@    c #B9BACD",
+"V@    c #ADADB9",
+"W@    c #B3B3C5",
+"X@    c #C5C6E8",
+"Y@    c #B1B1BE",
+"Z@    c #CCCDEF",
+"`@    c #B3B3A0",
+" #    c #CECEF0",
+".#    c #CBCDED",
+"+#    c #B6B6C9",
+"@#    c #A7A7AD",
+"##    c #B2B1C2",
+"$#    c #BDBCD5",
+"%#    c #C9CBEB",
+"&#    c #D4D5F4",
+"*#    c #C6C6B3",
+"=#    c #D0D2F0",
+"-#    c #B7B8CB",
+";#    c #AFB0BC",
+">#    c #A7A6AB",
+",#    c #BFBFD9",
+"'#    c #B1B0BD",
+")#    c #C6C7E5",
+"!#    c #D9B3C6",
+"~#    c #A6A6AC",
+"{#    c #B5B4C9",
+"]#    c #C2C3DD",
+"^#    c #B3A0A0",
+"/#    c #B3A0B3",
+"(#    c #D9A0C6",
+"_#    c #C6C7E9",
+":#    c #C3C5E7",
+"<#    c #AEAEBA",
+"[#    c #A6A6AB",
+"}#    c #B9B9D0",
+"|#    c #C1C2DF",
+"1#    c #BBBBD0",
+"2#    c #BBBDD5",
+"3#    c #C0C1DA",
+"4#    c #B4B3C1",
+"5#    c #A3A3A6",
+"6#    c #C1C2DD",
+"7#    c #D4D4DD",
+"8#    c #BBBCCF",
+"9#    c #BBBCD0",
+"0#    c #BABBD0",
+"a#    c #BBBCD1",
+"b#    c #C6C8E9",
+"c#    c #C6A0C6",
+"d#    c #C4C5E7",
+"e#    c #C3C5E5",
+"f#    c #C2C3E4",
+"g#    c #B1B1BF",
+"h#    c #A7A7AC",
+"i#    c #D6D7E7",
+"j#    c #E1E2E5",
+"k#    c #BCBCD1",
+"l#    c #C3C4E3",
+"m#    c #BCBDD8",
+"n#    c #A4A4A9",
+"o#    c #E2E3EB",
+"p#    c #B9B9C9",
+"q#    c #B9B9CA",
+"r#    c #B9BAD0",
+"s#    c #B3B4C6",
+"t#    c #AEAFBA",
+"u#    c #ABAAB3",
+"v#    c #A3A2A4",
+"w#    c #BABAD1",
+"x#    c #D0D0D6",
+"y#    c #BDBED8",
+"z#    c #A9A9B0",
+"A#    c #A4A4A8",
+"B#    c #D7D7E5",
+"C#    c #E0E1E6",
+"D#    c #BFC1DF",
+"E#    c #B8B9CA",
+"F#    c #B3B4C5",
+"G#    c #C2C3E3",
+"H#    c #AAAAB3",
+"I#    c #A3A1A4",
+"J#    c #C7C8D6",
+"K#    c #B7B7C7",
+"L#    c #B5B4C3",
+"M#    c #B3B3C0",
+"N#    c #B0B0BC",
+"O#    c #B7B8CD",
+"P#    c #B2B2C2",
+"Q#    c #A4A3A7",
+"R#    c #CCCCE2",
+"S#    c #B9BBCF",
+"T#    c #B2B3C1",
+"U#    c #BABBD2",
+"V#    c #B5B6C5",
+"W#    c #B6B7CA",
+"X#    c #D2D3DA",
+"Y#    c #B5B6C7",
+"Z#    c #BDBDD8",
+"`#    c #C5C6E5",
+" $    c #BBBCCE",
+".$    c #A7A8AE",
+"+$    c #ADAEB7",
+"@$    c #D6D8E6",
+"#$    c #C5C5D1",
+"$$    c #BBBCD3",
+"%$    c #BDBDD7",
+"&$    c #B7B7CC",
+"*$    c #B2B2C3",
+"=$    c #BCBDD2",
+"-$    c #ADAEB9",
+";$    c #A6A7AD",
+">$    c #C8C9DC",
+",$    c #B3B3C3",
+"'$    c #A9AAB2",
+")$    c #BCBCD3",
+"!$    c #B2B2C0",
+"~$    c #BFC0DD",
+"{$    c #B0B0BF",
+"]$    c #B9BBCC",
+"^$    c #A5A4A8",
+"/$    c #BBBBD2",
+"($    c #E0E1E5",
+"_$    c #B5B5C3",
+":$    c #B7B7CB",
+"<$    c #C1C2E2",
+"[$    c #C5C6E6",
+"}$    c #B9BAD1",
+"|$    c #B0B1BF",
+"1$    c #B9B9CB",
+"2$    c #A5A5A9",
+"3$    c #CFD1CD",
+"4$    c #A7A6AC",
+"5$    c #A5A5AA",
+"6$    c #C1C0DD",
+"7$    c #BEBFDB",
+"8$    c #BABCD5",
+"9$    c #BFBFDB",
+"0$    c #C0C3E2",
+"a$    c #B6B7CC",
+"b$    c #B5B5C6",
+"c$    c #B4B4C2",
+"d$    c #A7A6AA",
+"e$    c #A4A2A4",
+"f$    c #A6A6AA",
+"g$    c #D1D3D0",
+"h$    c #BEBFC7",
+"i$    c #B6B7C9",
+"j$    c #C0C1E2",
+"k$    c #C0C1E0",
+"l$    c #BDBED7",
+"m$    c #B4B4C5",
+"n$    c #B7B8CE",
+"o$    c #B6B7CB",
+"p$    c #B5B6C9",
+"q$    c #B6B6CA",
+"r$    c #B3B4C3",
+"s$    c #BABCD3",
+"t$    c #A9A9B1",
+"u$    c #A3A4A7",
+"v$    c #A8A9AF",
+"w$    c #C5C6D5",
+"x$    c #D0D2CE",
+"y$    c #C4C4CF",
+"z$    c #AFB0BB",
+"A$    c #BFC2E1",
+"B$    c #BEBFD9",
+"C$    c #B6B7C8",
+"D$    c #B2B2C1",
+"E$    c #B5B5C4",
+"F$    c #A4A2A5",
+"G$    c #A4A4A7",
+"H$    c #CACADD",
+"I$    c #E0E1E4",
+"J$    c #C0C0C9",
+"K$    c #A7A8AF",
+"L$    c #B2B2BD",
+"M$    c #AFAFBA",
+"N$    c #B6B8CA",
+"O$    c #A3A3A5",
+"P$    c #ABACB5",
+"Q$    c #C4C5D2",
+"R$    c #E0E2E8",
+"S$    c #DFE1E4",
+"T$    c #A6A5AA",
+"U$    c #A8A7AD",
+"V$    c #A6A5A9",
+"W$    c #A4A3A6",
+"X$    c #A5A4A9",
+"Y$    c #ACADB6",
+"Z$    c #E1E2E6",
+"`$    c #D1D1D7",
+" %    c #A4A5A9",
+".%    c #A4A3A5",
+"+%    c #B4B6C7",
+"@%    c #D3D4DC",
+"#%    c #E2E2E8",
+"$%    c #D5D5DF",
+"%%    c #D2D3DB",
+"&%    c #D1D2D9",
+"*%    c #D3D3DA",
+"=%    c #D3D5DD",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F v G H I J K L M N O P Q                       ",
+"                      r R S T U V W X Y Z Z `  ...+.8 # @.#.$.%.S &.L *.=.n -.;.                    ",
+"                    >.,.0 '.).!.Y ~.{.].^.].]./.(._...:.<.[.}.u %.|.1.2.3.4.n 5.6.                  ",
+"                  7.8.9.j 3.s 0.^.a.b.c.d.e.b.a.^.f.g. .h.# i.j.k.%.l.m.n.3.o.p.q.r.                ",
+"                s.t.u.v.w.x.0.y.c.z.A.B.B.C.D.E.F.G.f.Y  .t.H.I.J.K.%.|.L.M.N.O.P.L.Q.              ",
+"              R.h.n S.T.s 0.U.d.V.W.X.Y.Z.Z.W.`. +.+++f.g.+.@+#+j.k.%.n $+L.%+&+*+/ =+-+            ",
+"            ;+>+# ! ,+'+)+!+~+~+{+]+^+/+(+(+_+:+<+<+<+<+[+}+>+#+I.|+1+5.$+2+#+3+4+5+6+7+Q           ",
+"            8+9+0+'.a+b+^.c+~+d+~+e+f+g+g+f+h+i+{+<+<+<+/._.j+#+2+k+K.0+2+#+2+l+%+m+n+o+p+          ",
+"          ;.}.q+T r+Z /.s+d.~+d+d+d+t+u+v+t+w+/+<+<+<+<+{.x+y+#+#+j.#+#+#+L.z+A+B+C+D+E+F+G+        ",
+"          n S H+I+J+_.K+U.L+~+d+d+d+d+d+~+M+u+<+e+Z.B.d.^.(.N+#+O+2+k.%.% $+L.l+P+%+: 6+,+Q+        ",
+"        R+S+T+K !.U+Y 0.V+W+X+d+d+d+d+d+d+d+v+Y+e+:+Z+c+^.#+#+#+`+j.k.X+X+X+X+d+B+P+). @o+.@+@      ",
+"        @@#@2 : $@N+Y 0.%@&@*@d+d+d+d+d+d+d+d+~+=@-@Z+d.#+#+2+R #+X+u ;@;@>@>@d+,@P+'@)@ @!@~@      ",
+"        9.q+3.{@]@@ ^@/./@E.W.d+d+d+d+d+d+d+d+d+~+{+#+#+#+(.@ t.#+;@(@(@>@>@(@d+P+,@l+_@*.T.:@      ",
+"      <@q+[@).}@|@+.Z f.a.1@`.d+d+d+d+d+d+d+d+d+d+d+~+2@X+X+;@;@3@(@(@4@4@5@X+6@P+,@7@8@9@0@a@4     ",
+"      b@c@d@e@f@C t. .~.g@h@C.d+d+d+d+d+d+d+d+d+d+d+~+X+i@;@(@(@(@(@(@;@;@X+A+A+P+P+,@j@k@[ l@m@    ",
+"      n@o@p@q@r@s@t.t@Y 0.a.d.d+d+d+d+d+d+d+d+d+d+d+~+;@;@(@u@(@(@;@;@i@X+L.v@P+P+B+,@l+w@[@x@2     ",
+"      }.# #@!@y@@.<.z@A@B@C@!+d+d+d+d+d+d+d+d+~+d+~+X+(@>@u@(@;@;@i@X+X+; m.7@7@,@,@B+B+T D@E@F@    ",
+"      G@0+2 h 7 H@G@I@J@#+#+#+~+d+d+d+d+~+X+5@(@u@>@>@;@;@K@X+X+|+#+5.l.m.L.P+P+P+,@P+7@L@T M@N@    ",
+"      u v@O@P@|+Q@7 R@S@@ #+2+~+d+d+d+d+~+5@>@u@>@i@X+T@X+# }.k+k.#+n $+$+6@6@P+P+P+B+7@c@U@V@W@    ",
+"      X@n =.Y@|+k.k+Z@C t.#+}+~+d+d+d+d+`@>@>@;@X+~+d+~+S@ #.#k.1+#+; m.L.P+,@P+P+P+,@6@+#0@@###    ",
+"      |+|+$#K %#1+k.k+7 R@O+&#~+d+d+d+d+d+*#i@X+`@d+d+d+=#i.|+2+#+`+#+2+6@7@P+P+P+P+7@m.-#;#>#W@    ",
+"      k.j.,#'#)#%.%.k.j.X+!#X+~+d+d+d+d+d+d+~+`@d+d+d+d+R@2+#+#+#+2+#+#+#+P+P+P+P+P+6@z+j V@~#{#    ",
+"      v@%.D+!@]#0+%.5.k.4@4@;@~+d+d+d+d+d+d+d+d+^#/#(#`+#+[.u 1+_#; m.A+:##+#+P+P+z+L.w I+<#[#}#    ",
+"      |#n+1#2#3#l.|.%.0+4@(@5@X+d+d+d+d+d+d+d+/#`+(#/#d+~+F 5.0+l.; 7@7@B+m.2+P+P+7@m.T+4#f 5#6#    ",
+"      7#8#9#0#a#X@L.; b#;@i@X+X+d+d+d+d+/#c#`+`+/#d+d+d+~+%.X@; d#L.m.,@,@,@|.e#z+L.f#L g#[#h#i#    ",
+"      j# @_ k#~ l#L.m.L.X+#+0+X+d+d+d+/#`+c#/#d+d+d+d+d+d+X@L.m.m.L.A+,@A+,@z+z+z+m.m#0@x@n#g o#    ",
+"        p#q#r#+#).A+m.L.L.O+2+#+`+c#/#d+d+d+d+d+d+d+d+d+d+X@m.d#L.L.P+,@,@P+l+n L.1 s#t#u#v#w#      ",
+"        x#b N.n+h y#A+A+#+O+`+#+d+d+d+d+d+d+d+d+d+d+d+d+d+:#L.L.m.m.P+P+,@2+#+n d#8@z#z#A#h#B#      ",
+"        C#w@D#V E#F#G#z+#+O+2+m.~+~+d+d+d+d+d+d+d+d+d+d+d+z+m.L.m.2+2+#+#+#+#+n S+V@E#H#I#W@Q       ",
+"          J#K#L#M#N#O#f#,@O+P+A+z+A+A+z+X+~+~+d+d+d+d+d+d+A+P+2+#+#+#+#+2+L.|.v@P#<#V@Q#>#R#        ",
+"            x@l@S#T#x@U#B+,@P+,@6@z+6@6@z+z+,@7@7@B+A+z+,@P+P+B+P+P+z+z+m.L.G w#V#V@A#v#W#          ",
+"            X#M#o+0@=.Y#Z#,@P+,@P+A+P+P+,@,@P+,@P+,@A+m.P+P+,@P+A+6@m.L.m.`#r#V# $.$v#+$@$          ",
+"              #$0@<#$$%$-#&$f#P+,@,@B+,@P+P+P+P+P+,@,@B+$+m.7@7@7@L.$+; %+*$_ =$-$v#;$>$            ",
+"                ,$'$: N )$!$*$~$A+P+P+P+P+P+P+P+P+P+,@P+z+d#X@; n n |.y#{$_@]$Y@Q#^$/$              ",
+"                ($;#z#M#_$l@3.T#:$<$,@l+P+P+7@A+P+z+6@z+6@[$d#L.L.P.}$|$N#1$-$A#2$( 5               ",
+"    3$            ($g#4$H#5$6$7$}$h N.8$9$<$l+L.A+m.m.L.m.m.0$U#a$!$b$c$E@d$e$f$( 5                 ",
+"    g$                h$5$5$i$x j$k$l$).m$+#a$n$o$+#p$q$q$+#r$).y#s$g t$u$I#v$w$                    ",
+"    x$                  y$z#z#z$'.0#A$B$_ C$D$9@E$T#E#i D@,+n+n+m m+F$5#G$t#H$                      ",
+"                          I$J$K$h#H#L$m+M$M#E$V#K#x )$,#N$m 0@q@f$v#O$P$Q$R$                        ",
+"                              S$3.z#T$Q#A#f$@#H#@#K$H#'$U$V$5#W$X$Y$( Z$                            ",
+"                                  ($`$K f 4$ %.%v#v#O$5#[#z#t#+%@%#%                                ",
+"                                          $%@%%%&%&%&%*%=%<@                                        ",
+"      3$                                                                                            ",
+"      3$                                                                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.bmp
new file mode 100644 (file)
index 0000000..502e58d
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_STLFormat.xpm
new file mode 100644 (file)
index 0000000..a62d088
--- /dev/null
@@ -0,0 +1,594 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_tr_STLFormat_xpm[] = {
+"50 50 541 2",
+"      c #CED0CC",
+".     c #DFE0EF",
+"+     c #E0E2F0",
+"@     c #D5D5F4",
+"#     c #CFD0F0",
+"$     c #C3C3E2",
+"%     c #C5C7E8",
+"&     c #BFC1E1",
+"*     c #C0C0DF",
+"=     c #BFBFDE",
+"-     c #C4C5E3",
+";     c #C6C6E7",
+">     c #D0D1D8",
+",     c #CFCFD5",
+"'     c #DFDFEE",
+")     c #D6D6EE",
+"!     c #C2C3E0",
+"~     c #BEBED6",
+"{     c #C3C3DA",
+"]     c #C9CAE8",
+"^     c #C7C9EA",
+"/     c #BFBFDA",
+"(     c #B9B9CD",
+"_     c #B7B8C9",
+":     c #B4B4C3",
+"<     c #B2B3C2",
+"[     c #B0B1BE",
+"}     c #B9B9CF",
+"|     c #C2C4E0",
+"1     c #C5C5E5",
+"2     c #BCBCD4",
+"3     c #D0D0E7",
+"4     c #D9D9E9",
+"5     c #E2E3EA",
+"6     c #D6D6ED",
+"7     c #CCCDED",
+"8     c #D1D2F1",
+"9     c #CDCEEC",
+"0     c #C2C3DF",
+"a     c #B4B5C7",
+"b     c #ACACB5",
+"c     c #ABABB3",
+"d     c #ADADB6",
+"e     c #AAAAB2",
+"f     c #ABABB4",
+"g     c #AFAFBC",
+"h     c #B4B5C5",
+"i     c #B9BACE",
+"j     c #B7B7C9",
+"k     c #B8B7C7",
+"l     c #BABACE",
+"m     c #B5B5C5",
+"n     c #C6C7E8",
+"o     c #BCBDD3",
+"p     c #C7C9D9",
+"q     c #E0E0E4",
+"r     c #E7E8EE",
+"s     c #D3D4ED",
+"t     c #C1C2DC",
+"u     c #C9CAEC",
+"v     c #C9C9E9",
+"w     c #C2C2E0",
+"x     c #BCBDD5",
+"y     c #C2C1D8",
+"z     c #C5C6DD",
+"A     c #CFD2EE",
+"B     c #D1D2F0",
+"C     c #D0D1F0",
+"D     c #CFD0EF",
+"E     c #CDCEED",
+"F     c #CACAEB",
+"G     c #C7C7E7",
+"H     c #C3C5E2",
+"I     c #BFC0DA",
+"J     c #BAB9CD",
+"K     c #B1B2BF",
+"L     c #B6B6C6",
+"M     c #B8B8CA",
+"N     c #C0C1DF",
+"O     c #BAB9CC",
+"P     c #CCCCDF",
+"Q     c #E3E3EB",
+"R     c #D1D2F2",
+"S     c #C2C3E1",
+"T     c #BABACF",
+"U     c #C2C4E4",
+"V     c #BDBFD7",
+"W     c #C8C9E1",
+"X     c #D5D6F2",
+"Y     c #D9D9F6",
+"Z     c #D8D8F5",
+"`     c #D7D9F5",
+" .    c #D6D7F5",
+"..    c #D5D6F4",
+"+.    c #D3D5F3",
+"@.    c #CECEEF",
+"#.    c #CACCEC",
+"$.    c #C8CAEB",
+"%.    c #C7C8E9",
+"&.    c #B8B8CD",
+"*.    c #B7B9CA",
+"=.    c #B9B9CC",
+"-.    c #C8C7E9",
+";.    c #E4E5EC",
+">.    c #DBDCEC",
+",.    c #CECFEF",
+"'.    c #B6B6C7",
+").    c #BABAD0",
+"!.    c #C7C7DF",
+"~.    c #DADAF6",
+"{.    c #DEDEF8",
+"].    c #DFDEF9",
+"^.    c #DFDFF9",
+"/.    c #DCDCF8",
+"(.    c #DADAF7",
+"_.    c #D8D9F6",
+":.    c #D3D4F3",
+"<.    c #D0D1F1",
+"[.    c #CDCEEF",
+"}.    c #CCCDEE",
+"|.    c #C5C6E7",
+"1.    c #C1C3E3",
+"2.    c #B9B8CD",
+"3.    c #B3B3C2",
+"4.    c #C2C1DD",
+"5.    c #C7C7E9",
+"6.    c #DADAEA",
+"7.    c #D9DAF1",
+"8.    c #CED0F0",
+"9.    c #BCBDD6",
+"0.    c #DDDDF8",
+"a.    c #E1E1FA",
+"b.    c #E3E3FA",
+"c.    c #E4E5FB",
+"d.    c #E5E5FB",
+"e.    c #E3E3FB",
+"f.    c #DBDCF7",
+"g.    c #D9D9F7",
+"h.    c #D2D4F3",
+"i.    c #CDCFF0",
+"j.    c #CBCCED",
+"k.    c #C9CAEB",
+"l.    c #C6C6E8",
+"m.    c #C4C5E6",
+"n.    c #BDBED9",
+"o.    c #BABCD2",
+"p.    c #C6C7E7",
+"q.    c #C8C8E9",
+"r.    c #CCCCE3",
+"s.    c #D7D9F0",
+"t.    c #D2D3F2",
+"u.    c #CBCDEC",
+"v.    c #B7B7CA",
+"w.    c #B4B5C4",
+"x.    c #D1D1E9",
+"y.    c #E1E2FA",
+"z.    c #E6E6FC",
+"A.    c #E8E8FC",
+"B.    c #E9E9FC",
+"C.    c #E8E8FB",
+"D.    c #E6E7FC",
+"E.    c #E6E6FB",
+"F.    c #E4E3FA",
+"G.    c #E0E0F9",
+"H.    c #FFFEB8",
+"I.    c #C5C5E6",
+"J.    c #BFC0DF",
+"K.    c #B9B9CE",
+"L.    c #BFBED8",
+"M.    c #C3C4E4",
+"N.    c #CDCDE6",
+"O.    c #E6E7ED",
+"P.    c #C0BFDB",
+"Q.    c #B8B8C8",
+"R.    c #E2E2FA",
+"S.    c #E9E8FC",
+"T.    c #EBEBFC",
+"U.    c #ECECFD",
+"V.    c #ECEDFC",
+"W.    c #EDECFC",
+"X.    c #EAEAFC",
+"Y.    c #E7E6FC",
+"Z.    c #E3E4FA",
+"`.    c #C5C5E7",
+" +    c #C2C2E1",
+".+    c #B9BBD1",
+"++    c #BEBFDA",
+"@+    c #C0C0DD",
+"#+    c #E1E1E5",
+"$+    c #E3E3EA",
+"%+    c #D3D3F2",
+"&+    c #BCBCCF",
+"*+    c #D3D3EB",
+"=+    c #DDDCF8",
+"-+    c #E1E0F9",
+";+    c #ECECFC",
+">+    c #EDEEFD",
+",+    c #F0F0FD",
+"'+    c #F1F2FE",
+")+    c #F0F0FE",
+"!+    c #EFEEFD",
+"~+    c #EDEDFD",
+"{+    c #BABABA",
+"]+    c #A0A0A0",
+"^+    c #AAAAAA",
+"/+    c #C4C4E5",
+"(+    c #C1C2E0",
+"_+    c #B9BACF",
+":+    c #BDBFDA",
+"<+    c #BDBED5",
+"[+    c #BDBDD5",
+"}+    c #D2D2EB",
+"|+    c #CDCFEF",
+"1+    c #C7C7E8",
+"2+    c #CDCDE5",
+"3+    c #DCDBF7",
+"4+    c #F3F3B6",
+"5+    c #F3F3FD",
+"6+    c #F2F3FE",
+"7+    c #B3B3B3",
+"8+    c #C8C8C8",
+"9+    c #C3C3E5",
+"0+    c #B2B2BF",
+"a+    c #BDBED6",
+"b+    c #BDBDD3",
+"c+    c #CACADB",
+"d+    c #BEBFD8",
+"e+    c #BEBFD2",
+"f+    c #B1B1B1",
+"g+    c #C3C5E6",
+"h+    c #C3C4E6",
+"i+    c #C2C4E6",
+"j+    c #B8B8CE",
+"k+    c #BABACC",
+"l+    c #BCBCCE",
+"m+    c #BBBBCC",
+"n+    c #E1E2E8",
+"o+    c #B3B4C4",
+"p+    c #B5B6C6",
+"q+    c #D3D5F0",
+"r+    c #DCDDF9",
+"s+    c #E3E3E3",
+"t+    c #C2C4E5",
+"u+    c #BCBBD0",
+"v+    c #D7D8E8",
+"w+    c #C2C3E2",
+"x+    c #BBBCD5",
+"y+    c #D6D6F3",
+"z+    c #B7B7B7",
+"A+    c #D1D3F2",
+"B+    c #CFCFEF",
+"C+    c #ECECF4",
+"D+    c #BCBCD0",
+"E+    c #B7B7C6",
+"F+    c #D8D8E8",
+"G+    c #CDCDE4",
+"H+    c #C2C2DF",
+"I+    c #CDCEE9",
+"J+    c #D6D6F4",
+"K+    c #CECFF0",
+"L+    c #C3C4E5",
+"M+    c #C2C3E5",
+"N+    c #BEC0DD",
+"O+    c #B6B7C6",
+"P+    c #B6B6C5",
+"Q+    c #C9C9D9",
+"R+    c #B7B8C8",
+"S+    c #CFCFEC",
+"T+    c #D7D8F6",
+"U+    c #B6B6C8",
+"V+    c #B6B5C6",
+"W+    c #D6D6E1",
+"X+    c #BCBDD4",
+"Y+    c #BBBBCD",
+"Z+    c #CFD0EE",
+"`+    c #F5F5FE",
+" @    c #F8F7FE",
+".@    c #F7F8FE",
+"+@    c #F6F6FE",
+"@@    c #BCBCD5",
+"#@    c #B4B4C4",
+"$@    c #B3B3C1",
+"%@    c #AAAAB1",
+"&@    c #C5C5D3",
+"*@    c #B8B8CC",
+"=@    c #C1C1DF",
+"-@    c #B7B9CB",
+";@    c #C6C8E3",
+">@    c #DFE0F9",
+",@    c #F3F3FE",
+"'@    c #F3F4FD",
+")@    c #EFEFFD",
+"!@    c #CACBEC",
+"~@    c #C3C3E4",
+"{@    c #B2B3C3",
+"]@    c #ADADB8",
+"^@    c #CBCBDF",
+"/@    c #C9C9EA",
+"(@    c #C2C3D9",
+"_@    c #ADAEBA",
+":@    c #ACACB6",
+"<@    c #CCCCEA",
+"[@    c #D0D0F0",
+"}@    c #D5D6F3",
+"|@    c #F1F1FD",
+"1@    c #F0EFFD",
+"2@    c #EBEAFC",
+"3@    c #E7E6FB",
+"4@    c #BCBCD2",
+"5@    c #AFAFBB",
+"6@    c #CDCDEC",
+"7@    c #D3D3F3",
+"8@    c #D6D8F6",
+"9@    c #D9DAF7",
+"0@    c #EDEDFC",
+"a@    c #E5E6FC",
+"b@    c #CACCED",
+"c@    c #BABBCF",
+"d@    c #AEAEB9",
+"e@    c #B7B7CD",
+"f@    c #CDCDEF",
+"g@    c #D1D1F1",
+"h@    c #D4D5F3",
+"i@    c #DDDEF9",
+"j@    c #E6E7FB",
+"k@    c #CDCDED",
+"l@    c #B8B9CC",
+"m@    c #B0B0BD",
+"n@    c #B5B5C9",
+"o@    c #C4C5E5",
+"p@    c #BCBBD3",
+"q@    c #B1B2C0",
+"r@    c #CBCCEC",
+"s@    c #CFCFF0",
+"t@    c #D2D2F2",
+"u@    c #D8D8F6",
+"v@    c #B6B6B6",
+"w@    c #E1E1F9",
+"x@    c #DCDDF8",
+"y@    c #DFDEF8",
+"z@    c #BCBCBC",
+"A@    c #B9BACD",
+"B@    c #ADADB9",
+"C@    c #B3B3C5",
+"D@    c #C5C6E8",
+"E@    c #B1B1BE",
+"F@    c #CCCDEF",
+"G@    c #D6D7F4",
+"H@    c #DADBF7",
+"I@    c #B8B8B8",
+"J@    c #C7C8EA",
+"K@    c #BDBDBD",
+"L@    c #B6B6C9",
+"M@    c #A7A7AD",
+"N@    c #B2B1C2",
+"O@    c #BDBCD5",
+"P@    c #C9CBEB",
+"Q@    c #D4D5F4",
+"R@    c #D4D6F4",
+"S@    c #CACAEC",
+"T@    c #B7B8CB",
+"U@    c #AFB0BC",
+"V@    c #A7A6AB",
+"W@    c #BFBFD9",
+"X@    c #B1B0BD",
+"Y@    c #C6C7E5",
+"Z@    c #D2D2F1",
+"`@    c #A6A6AC",
+" #    c #B5B4C9",
+".#    c #C2C3DD",
+"+#    c #CDCEEE",
+"@#    c #C6C7E9",
+"##    c #AEAEBA",
+"$#    c #A6A6AB",
+"%#    c #B9B9D0",
+"&#    c #C1C2DF",
+"*#    c #BBBBD0",
+"=#    c #BBBDD5",
+"-#    c #C0C1DA",
+";#    c #C8C9EB",
+">#    c #CBCBEC",
+",#    c #B4B4B4",
+"'#    c #CBCDED",
+")#    c #B4B3C1",
+"!#    c #A3A3A6",
+"~#    c #C1C2DD",
+"{#    c #D4D4DD",
+"]#    c #BBBCCF",
+"^#    c #BBBCD0",
+"/#    c #BABBD0",
+"(#    c #BBBCD1",
+"_#    c #C6C8E9",
+":#    c #C7C9E9",
+"<#    c #C9CBEC",
+"[#    c #B1B1BF",
+"}#    c #A7A7AC",
+"|#    c #D6D7E7",
+"1#    c #E1E2E5",
+"2#    c #BCBCD1",
+"3#    c #A4A4A9",
+"4#    c #E2E3EB",
+"5#    c #B9B9C9",
+"6#    c #B9B9CA",
+"7#    c #B9BAD0",
+"8#    c #A3A2A4",
+"9#    c #BABAD1",
+"0#    c #D0D0D6",
+"a#    c #D7D7E5",
+"b#    c #E0E1E6",
+"c#    c #BFC1DF",
+"d#    c #BDBDB1",
+"e#    c #C7C8D6",
+"f#    c #B7B7C7",
+"g#    c #B5B4C3",
+"h#    c #B3B3C0",
+"i#    c #B0B0BC",
+"j#    c #A6A6A6",
+"k#    c #B2B2C2",
+"l#    c #A4A3A7",
+"m#    c #CCCCE2",
+"n#    c #B9BBCF",
+"o#    c #B2B3C1",
+"p#    c #AFAFAF",
+"q#    c #B5B6C5",
+"r#    c #A4A4A8",
+"s#    c #B6B7CA",
+"t#    c #D2D3DA",
+"u#    c #B5B6C7",
+"v#    c #BDBDD8",
+"w#    c #C5C6E5",
+"x#    c #BBBCCE",
+"y#    c #A7A8AE",
+"z#    c #ADAEB7",
+"A#    c #D6D8E6",
+"B#    c #C5C5D1",
+"C#    c #BBBCD3",
+"D#    c #BDBDD7",
+"E#    c #B7B7CC",
+"F#    c #C2C3E4",
+"G#    c #B2B2C3",
+"H#    c #BCBDD2",
+"I#    c #ADAEB9",
+"J#    c #A6A7AD",
+"K#    c #C8C9DC",
+"L#    c #B3B3C3",
+"M#    c #A9AAB2",
+"N#    c #BCBCD3",
+"O#    c #B2B2C0",
+"P#    c #BFC0DD",
+"Q#    c #C4C5E7",
+"R#    c #BDBED8",
+"S#    c #B0B0BF",
+"T#    c #B9BBCC",
+"U#    c #A5A4A8",
+"V#    c #BBBBD2",
+"W#    c #E0E1E5",
+"X#    c #A9A9B0",
+"Y#    c #B5B5C3",
+"Z#    c #B7B7CB",
+"`#    c #C1C2E2",
+" $    c #C5C6E6",
+".$    c #B9BAD1",
+"+$    c #B0B1BF",
+"@$    c #B9B9CB",
+"#$    c #A5A5A9",
+"$$    c #CFD1CD",
+"%$    c #A7A6AC",
+"&$    c #AAAAB3",
+"*$    c #A5A5AA",
+"=$    c #C1C0DD",
+"-$    c #BEBFDB",
+";$    c #BABCD5",
+">$    c #BFBFDB",
+",$    c #C0C3E2",
+"'$    c #BABBD2",
+")$    c #B6B7CC",
+"!$    c #B5B5C6",
+"~$    c #B4B4C2",
+"{$    c #A7A6AA",
+"]$    c #A4A2A4",
+"^$    c #A6A6AA",
+"/$    c #D1D3D0",
+"($    c #BEBFC7",
+"_$    c #B6B7C9",
+":$    c #C0C1E2",
+"<$    c #C0C1E0",
+"[$    c #BDBED7",
+"}$    c #B4B4C5",
+"|$    c #B7B8CE",
+"1$    c #B6B7CB",
+"2$    c #B5B6C9",
+"3$    c #B6B6CA",
+"4$    c #B3B4C3",
+"5$    c #BABCD3",
+"6$    c #A9A9B1",
+"7$    c #A3A4A7",
+"8$    c #A3A1A4",
+"9$    c #A8A9AF",
+"0$    c #C5C6D5",
+"a$    c #D0D2CE",
+"b$    c #C4C4CF",
+"c$    c #AFB0BB",
+"d$    c #BFC2E1",
+"e$    c #BEBFD9",
+"f$    c #B6B7C8",
+"g$    c #B2B2C1",
+"h$    c #B5B5C4",
+"i$    c #B8B9CA",
+"j$    c #A4A2A5",
+"k$    c #A4A4A7",
+"l$    c #AEAFBA",
+"m$    c #CACADD",
+"n$    c #E0E1E4",
+"o$    c #C0C0C9",
+"p$    c #A7A8AF",
+"q$    c #B2B2BD",
+"r$    c #AFAFBA",
+"s$    c #B6B8CA",
+"t$    c #A3A3A5",
+"u$    c #ABACB5",
+"v$    c #C4C5D2",
+"w$    c #E0E2E8",
+"x$    c #DFE1E4",
+"y$    c #A6A5AA",
+"z$    c #A8A7AD",
+"A$    c #A6A5A9",
+"B$    c #A4A3A6",
+"C$    c #A5A4A9",
+"D$    c #ACADB6",
+"E$    c #E1E2E6",
+"F$    c #D1D1D7",
+"G$    c #A4A5A9",
+"H$    c #A4A3A5",
+"I$    c #B4B6C7",
+"J$    c #D3D4DC",
+"K$    c #E2E2E8",
+"L$    c #D5D5DF",
+"M$    c #D2D3DB",
+"N$    c #D1D2D9",
+"O$    c #D3D3DA",
+"P$    c #D3D5DD",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F v G H I J K L M N O P Q                       ",
+"                      r R S T U V W X Y Z Z `  ...+.8 # @.#.$.%.S &.L *.=.n -.;.                    ",
+"                    >.,.0 '.).!.Y ~.{.].^.].]./.(._...:.<.[.}.u %.|.1.2.3.4.n 5.6.                  ",
+"                  7.8.9.j 3.s 0.^.a.b.c.d.e.b.a.^.f.g. .h.# i.j.k.%.l.m.n.3.o.p.q.r.                ",
+"                s.t.u.v.w.x.0.y.c.z.A.B.B.C.D.E.F.G.f.Y  .t.H.H.H.H.%.|.I.J.K.L.M.I.N.              ",
+"              O.h.n P.Q.s 0.R.d.S.T.U.V.W.W.T.X.Y.Z.H.H.H.H.H.H.H.H.%.n `.I. +.+++/ @+#+            ",
+"            $+%+# ! &+*+=+-+d.C.;+>+,+'+)+)+!+~+{+H.H.H.H.H.H.H.H.H.]+^+`.m./+(+_+:+<+[+Q           ",
+"            }+|+1+'.2+3+4+H.H.H.H.H.H.5+5+6+H.H.H.H.H.H.H.H.H.H.7+8+]+^+1+I./+9+ +0+a+b+c+          ",
+"          ;.}.d+T e+Z /.H.H.H.H.H.H.H.H.f+H.H.H.H.H.H.H.H.]+]+]+]+]+H.H.H.I.g+h+i+j+k+l+m+n+        ",
+"          n S o+p+q+_.r+H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.]+]+]+]+s+H.H.H.`.I.9+t+ +: <+&+u+        ",
+"        v+w+x+K !.y+Y 0.H.H.H.f+z+H.H.H.H.H.H.H.H.H.H.H.H.]+]+A+B+C+H.H.H.]+]+/+i+t+).D+b+E+F+      ",
+"        G+H+2 : I+J+Y 0.H.H.H.]+]+]+]+]+7+7+7+]+]+]+H.H.H.]+]+R K+C+H.H.H.]+]+L+M+t+N+O+D+P+Q+      ",
+"        9.d+3.R+S+@ T+/.H.H.H.]+]+f+z+]+]+]+]+]+]+]+H.H.H.]+]+t.,.j.H.H.H.]+]+i+t+M+9+U+*.Q.V+      ",
+"      W+d+X+).Y+Z++.Z f.H.H.H.H.]+`+ @.@.@+@7+7+7+T.H.H.H.]+]+<.,.j.H.H.H.]+]+/+t+M+L+@@#@$@%@4     ",
+"      &@*@=@-@;@C t. .~.>@H.H.H.H.4+,@`+`+'@'+)@V.A.H.H.H.]+]+C }.!@H.H.H.]+]+h+t+t+M+~@{@[ ]@^@    ",
+"      /@(@_@:@<@[@t.}@Y 0.H.H.H.H.H.H.H.|@1@,+V.2@3@H.H.H.]+]+# }.7+H.H.H.]+]+t+t+i+M+9+4@X+5@2     ",
+"      }.# H+P+6@@.<.7@8@9@f+H.H.H.H.H.H.H.0@T.B.a@e.H.H.H.]+]+[.b@7+H.H.H.]+]+L+M+M+i+i+T c@d@e@    ",
+"      K+1+2 h 7 f@K+g@h@ .(.i@H.H.H.H.H.H.H.j@d.R.^.H.H.H.]+]+k@!@7+H.H.f+]+]+t+t+M+t+L+l@T m@n@    ",
+"      u o@p@q@!@r@7 s@t@@ u@(.f+]+v@H.H.H.H.]+w@x@y@H.H.H.]+]+b@k.7+H.H.z@]+]+t+t+t+i+L+*@A@B@C@    ",
+"      D@n =.E@!@k.b@F@C t.h@G@_.H@]+I@H.H.H.]+]+g. .H.H.H.]+]+k.J@7+H.H.K@]+f+t+t+t+M+/+L@$@M@N@    ",
+"      !@!@O@K P@J@k.b@7 s@<.Q@}@ ._.Y H.H.H.]+]+R@h@H.H.H.]+]+S@u H.H.H.z@]+z@t+t+t+L+m.T@U@V@C@    ",
+"      k.j.W@X@Y@%.%.k.j.}.[.[@Z@%+7@H.H.H.H.]+]+t.<.H.H.H.z@]+%.n H.H.H.z@]+K@t+t+t+/+g+j B@`@ #    ",
+"      o@%.k+P+.#1+%.5.k.!@b@F@|+[@H.H.H.H.H.]+]+s@+#H.H.H.K@]+J@@#H.H.H.K@]+z@t+t+g+I.w p+##$#%#    ",
+"      &#a+*#=#-#l.|.%.1+;#k.>#j.H.H.H.H.H.,#]+]+'#H.H.H.H.z@]+z@H.H.H.H.]+]+z@t+t+L+m.x+)#f !#~#    ",
+"      {#]#^#/#(#D@I.; _#1+:#4+H.H.H.H.H.z+]+]+]+<#H.H.H.H.K@]+K@H.H.H.H.H.H.H.H.H.H.H.L [#$#}#|#    ",
+"      1#D+_ 2#~ H.H.H.H.H.H.H.H.H.H.H.]+]+]+]+,#%.H.H.H.H.K@]+z@H.H.H.H.H.H.H.H.H.H.H.$@5@3#g 4#    ",
+"        5#6#7#L@H.H.H.H.H.H.H.H.H.H.]+]+]+]+z+^ 1+|.H.H.H.K@]+K@H.H.H.H.H.H.H.H.H.H.H.]+]+8#9#      ",
+"        0#b K.a+H.H.H.H.H.H.H.H.H.]+]+]+]+l.|.I.|.I.n ]+]+]+]+K@H.H.H.H.H.]+]+]+]+]+]+]+]+}#a#      ",
+"        b#4@c#V H.H.H.H.H.d#]+]+]+]+]+]+`.|.m.I.m.h+D@g+^+]+]+K@m.i+]+]+]+]+]+]+]+]+]+]+]+C@Q       ",
+"          e#f#g#h#i#]+]+]+]+]+]+]+]+j#g+h+h+g+h+g+h+I./+L+h+t+M+M+t+^+^+^+^+^+o@k###B@l#V@m#        ",
+"            5@]@n#o#]+]+]+]+]+p#/+g+/+/+g+g+M+L+L+i+h+g+M+t+t+i+t+t+g+g+m.I.G 9#q#B@r#8#s#          ",
+"            t#h#b+$@=.u#v#M+t+M+t+h+t+t+M+M+t+M+t+M+h+m.t+t+M+t+h+/+m.I.m.w#7#q#x#y#8#z#A#          ",
+"              B#$@##C#D#T@E#F#t+M+M+i+M+t+t+t+t+t+M+M+i+`.m.L+L+L+I.`.;  +G#_ H#I#8#J#K#            ",
+"                L#M#: N N#O#G#P#h+t+t+t+t+t+t+t+t+t+M+t+g+Q#D@; n n |.R#S#U+T#E@l#U#V#              ",
+"                W#U@X#h#Y#]@3.o#Z#`#M+9+t+t+L+h+t+g+/+g+/+ $Q#I.I.M..$+$i#@$I#r##$( 5               ",
+"    $$            W#[#%$&$*$=$-$.$h K.;$>$`#9+I.h+m.m.I.m.m.,$'$)$O#!$~$d@{$]$^$( 5                 ",
+"    /$                ($*$*$_$x :$<$[$).}$L@)$|$1$L@2$3$3$L@4$).R#5$g 6$7$8$9$0$                    ",
+"    a$                  b$X#X#c$'./#d$e$_ f$g$#@h$o#i$i c@&+a+a+m 0+j$!#k$l$m$                      ",
+"                          n$o$p$}#&$q$0+r$h#h$q#f#x N#W@s$m $@:@^$8#t$u$v$w$                        ",
+"                              x$3.X#y$l#r#^$M@&$M@p$&$M#z$A$!#B$C$D$( E$                            ",
+"                                  W#F$K f %$G$H$8#8#t$!#$#X#l$I$J$K$                                ",
+"                                          L$J$M$N$N$N$O$P$W+                                        ",
+"      $$                                                                                            ",
+"      $$                                                                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.bmp b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.bmp
new file mode 100644 (file)
index 0000000..a821683
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.bmp differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/bitmaps2/v2_sm_tr_VOI.xpm
new file mode 100644 (file)
index 0000000..da6814f
--- /dev/null
@@ -0,0 +1,577 @@
+/* XPM */
+static char * TOOLBAR_V2_sm_tr_VOI_xpm[] = {
+"50 50 524 2",
+"      c #CED0CC",
+".     c #DFE0EF",
+"+     c #E0E2F0",
+"@     c #D5D5F4",
+"#     c #CFD0F0",
+"$     c #C3C3E2",
+"%     c #C5C7E8",
+"&     c #BFC1E1",
+"*     c #C0C0DF",
+"=     c #BFBFDE",
+"-     c #C4C5E3",
+";     c #C6C6E7",
+">     c #D0D1D8",
+",     c #CFCFD5",
+"'     c #DFDFEE",
+")     c #D6D6EE",
+"!     c #C2C3E0",
+"~     c #BEBED6",
+"{     c #C3C3DA",
+"]     c #C9CAE8",
+"^     c #C7C9EA",
+"/     c #BFBFDA",
+"(     c #B9B9CD",
+"_     c #B7B8C9",
+":     c #B4B4C3",
+"<     c #B2B3C2",
+"[     c #B0B1BE",
+"}     c #B9B9CF",
+"|     c #C2C4E0",
+"1     c #C5C5E5",
+"2     c #BCBCD4",
+"3     c #D0D0E7",
+"4     c #D9D9E9",
+"5     c #E2E3EA",
+"6     c #D6D6ED",
+"7     c #CCCDED",
+"8     c #D1D2F1",
+"9     c #CDCEEC",
+"0     c #C2C3DF",
+"a     c #B4B5C7",
+"b     c #ACACB5",
+"c     c #ABABB3",
+"d     c #ADADB6",
+"e     c #AAAAB2",
+"f     c #ABABB4",
+"g     c #AFAFBC",
+"h     c #B4B5C5",
+"i     c #B9BACE",
+"j     c #B7B7C9",
+"k     c #B8B7C7",
+"l     c #BABACE",
+"m     c #B5B5C5",
+"n     c #C6C7E8",
+"o     c #BCBDD3",
+"p     c #C7C9D9",
+"q     c #E0E0E4",
+"r     c #E7E8EE",
+"s     c #D3D4ED",
+"t     c #C1C2DC",
+"u     c #C9CAEC",
+"v     c #C9C9E9",
+"w     c #C2C2E0",
+"x     c #BCBDD5",
+"y     c #C2C1D8",
+"z     c #C5C6DD",
+"A     c #CFD2EE",
+"B     c #D1D2F0",
+"C     c #D0D1F0",
+"D     c #CFD0EF",
+"E     c #CDCEED",
+"F     c #CACAEB",
+"G     c #C7C7E7",
+"H     c #C3C5E2",
+"I     c #BFC0DA",
+"J     c #BAB9CD",
+"K     c #B1B2BF",
+"L     c #B6B6C6",
+"M     c #B8B8CA",
+"N     c #C0C1DF",
+"O     c #BAB9CC",
+"P     c #CCCCDF",
+"Q     c #E3E3EB",
+"R     c #D1D2F2",
+"S     c #C2C3E1",
+"T     c #BABACF",
+"U     c #C2C4E4",
+"V     c #BDBFD7",
+"W     c #C8C9E1",
+"X     c #D5D6F2",
+"Y     c #D9D9F6",
+"Z     c #D8D8F5",
+"`     c #D7D9F5",
+" .    c #D6D7F5",
+"..    c #D5D6F4",
+"+.    c #D3D5F3",
+"@.    c #CECEEF",
+"#.    c #CACCEC",
+"$.    c #C8CAEB",
+"%.    c #C7C8E9",
+"&.    c #B8B8CD",
+"*.    c #B7B9CA",
+"=.    c #B9B9CC",
+"-.    c #C8C7E9",
+";.    c #E4E5EC",
+">.    c #DBDCEC",
+",.    c #CECFEF",
+"'.    c #B6B6C7",
+").    c #BABAD0",
+"!.    c #C7C7DF",
+"~.    c #DADAF6",
+"{.    c #DEDEF8",
+"].    c #DFDEF9",
+"^.    c #DFDFF9",
+"/.    c #DCDCF8",
+"(.    c #DADAF7",
+"_.    c #D8D9F6",
+":.    c #D3D4F3",
+"<.    c #D0D1F1",
+"[.    c #CDCEEF",
+"}.    c #CCCDEE",
+"|.    c #C5C6E7",
+"1.    c #C1C3E3",
+"2.    c #B9B8CD",
+"3.    c #B3B3C2",
+"4.    c #C2C1DD",
+"5.    c #C7C7E9",
+"6.    c #DADAEA",
+"7.    c #D9DAF1",
+"8.    c #CED0F0",
+"9.    c #BCBDD6",
+"0.    c #DDDDF8",
+"a.    c #E1E1FA",
+"b.    c #E3E3FA",
+"c.    c #E4E5FB",
+"d.    c #E5E5FB",
+"e.    c #E3E3FB",
+"f.    c #DBDCF7",
+"g.    c #D9D9F7",
+"h.    c #D2D4F3",
+"i.    c #CDCFF0",
+"j.    c #CBCCED",
+"k.    c #C9CAEB",
+"l.    c #C6C6E8",
+"m.    c #C4C5E6",
+"n.    c #BDBED9",
+"o.    c #BABCD2",
+"p.    c #C6C7E7",
+"q.    c #C8C8E9",
+"r.    c #CCCCE3",
+"s.    c #D7D9F0",
+"t.    c #D2D3F2",
+"u.    c #CBCDEC",
+"v.    c #B7B7CA",
+"w.    c #B4B5C4",
+"x.    c #D1D1E9",
+"y.    c #E1E2FA",
+"z.    c #E6E6FC",
+"A.    c #E8E8FC",
+"B.    c #E9E9FC",
+"C.    c #E8E8FB",
+"D.    c #E6E7FC",
+"E.    c #E6E6FB",
+"F.    c #E4E3FA",
+"G.    c #E0E0F9",
+"H.    c #D0D0EF",
+"I.    c #CDCDEE",
+"J.    c #CBCBEC",
+"K.    c #C8C9EB",
+"L.    c #C5C5E6",
+"M.    c #BFC0DF",
+"N.    c #B9B9CE",
+"O.    c #BFBED8",
+"P.    c #C3C4E4",
+"Q.    c #CDCDE6",
+"R.    c #E6E7ED",
+"S.    c #C0BFDB",
+"T.    c #B8B8C8",
+"U.    c #E2E2FA",
+"V.    c #E9E8FC",
+"W.    c #EBEBFC",
+"X.    c #ECECFD",
+"Y.    c #ECEDFC",
+"Z.    c #A0A0A0",
+"`.    c #B9BBD1",
+" +    c #BCBDD7",
+".+    c #C0C0DD",
+"++    c #E1E1E5",
+"@+    c #E3E3EA",
+"#+    c #D3D3F2",
+"$+    c #BCBCCF",
+"%+    c #D3D3EB",
+"&+    c #DDDCF8",
+"*+    c #E1E0F9",
+"=+    c #ECECFC",
+"-+    c #EDEEFD",
+";+    c #F0F0FD",
+">+    c #F1F2FE",
+",+    c #ECECEC",
+"'+    c #D6D7F4",
+")+    c #C1C2E0",
+"!+    c #B8B9CF",
+"~+    c #BDBFDA",
+"{+    c #BDBED5",
+"]+    c #BDBDD5",
+"^+    c #D2D2EB",
+"/+    c #CDCFEF",
+"(+    c #C7C7E8",
+"_+    c #CDCDE5",
+":+    c #DCDBF7",
+"<+    c #E4E4FB",
+"[+    c #F1F1FE",
+"}+    c #F2F3FE",
+"|+    c #F3F3FD",
+"1+    c #C3C3E5",
+"2+    c #B2B2BF",
+"3+    c #BDBED6",
+"4+    c #BDBDD3",
+"5+    c #CACADB",
+"6+    c #BEBFD8",
+"7+    c #BEBFD2",
+"8+    c #E0E0FA",
+"9+    c #EAEAFC",
+"0+    c #EEEDFC",
+"a+    c #F3F3FE",
+"b+    c #F5F5FD",
+"c+    c #F6F5FD",
+"d+    c #DADBF6",
+"e+    c #C3C4E6",
+"f+    c #B8B8CE",
+"g+    c #BABACC",
+"h+    c #BCBCCE",
+"i+    c #BBBBCC",
+"j+    c #E1E2E8",
+"k+    c #B3B4C4",
+"l+    c #B5B6C6",
+"m+    c #D3D5F0",
+"n+    c #DCDDF9",
+"o+    c #E7E7FC",
+"p+    c #EEEEFD",
+"q+    c #F2F2FE",
+"r+    c #F6F7FE",
+"s+    c #F7F8FE",
+"t+    c #C2C3E4",
+"u+    c #C2C2E1",
+"v+    c #BCBBD0",
+"w+    c #D7D8E8",
+"x+    c #C2C3E2",
+"y+    c #BBBCD5",
+"z+    c #D6D6F3",
+"A+    c #C6C6C6",
+"B+    c #D9C6C6",
+"C+    c #B3B3B3",
+"D+    c #EFEFFC",
+"E+    c #F6F6FE",
+"F+    c #F8F7FE",
+"G+    c #C4C4E5",
+"H+    c #C2C4E5",
+"I+    c #BCBCD0",
+"J+    c #B7B7C6",
+"K+    c #D8D8E8",
+"L+    c #CDCDE4",
+"M+    c #C2C2DF",
+"N+    c #CDCEE9",
+"O+    c #D6D6F4",
+"P+    c #FFFFEC",
+"Q+    c #D9D9D9",
+"R+    c #B3C6C6",
+"S+    c #F5F5FE",
+"T+    c #DADBF7",
+"U+    c #C3C4E5",
+"V+    c #C2C3E5",
+"W+    c #BEC0DD",
+"X+    c #B6B7C6",
+"Y+    c #B6B6C5",
+"Z+    c #C9C9D9",
+"`+    c #B7B8C8",
+" @    c #CFCFEC",
+".@    c #FFFFFF",
+"+@    c #C6B3C6",
+"@@    c #F6F5FE",
+"#@    c #C2C4E6",
+"$@    c #B6B6C8",
+"%@    c #B6B5C6",
+"&@    c #D6D6E1",
+"*@    c #BCBDD4",
+"=@    c #BBBBCD",
+"-@    c #CFD0EE",
+";@    c #D8D9F5",
+">@    c #BCBCD5",
+",@    c #B4B4C4",
+"'@    c #B3B3C1",
+")@    c #AAAAB1",
+"!@    c #C5C5D3",
+"~@    c #B8B8CC",
+"{@    c #C1C1DF",
+"]@    c #B7B9CB",
+"^@    c #C6C8E3",
+"/@    c #F0F1FE",
+"(@    c #F3F4FD",
+"_@    c #EFEFFD",
+":@    c #D8D8F6",
+"<@    c #CACBEC",
+"[@    c #C3C3E4",
+"}@    c #B2B3C3",
+"|@    c #ADADB8",
+"1@    c #CBCBDF",
+"2@    c #C9C9EA",
+"3@    c #C2C3D9",
+"4@    c #ADAEBA",
+"5@    c #ACACB6",
+"6@    c #CCCCEA",
+"7@    c #D0D0F0",
+"8@    c #F0F0FE",
+"9@    c #BCBCD2",
+"0@    c #AFAFBB",
+"a@    c #CDCDEC",
+"b@    c #FFECA0",
+"c@    c #EAEAFB",
+"d@    c #EDEDFC",
+"e@    c #D4D5F3",
+"f@    c #BABBCF",
+"g@    c #AEAEB9",
+"h@    c #B7B7CD",
+"i@    c #CECFF0",
+"j@    c #FFC6A0",
+"k@    c #C6C6D9",
+"l@    c #ECC6A0",
+"m@    c #E7E6FB",
+"n@    c #E8E7FB",
+"o@    c #D1D3F2",
+"p@    c #B8B9CC",
+"q@    c #B0B0BD",
+"r@    c #B5B5C9",
+"s@    c #C4C5E5",
+"t@    c #BCBBD3",
+"u@    c #B1B2C0",
+"v@    c #FFECD9",
+"w@    c #B3B3C6",
+"x@    c #B9BACD",
+"y@    c #ADADB9",
+"z@    c #B3B3C5",
+"A@    c #C5C6E8",
+"B@    c #B1B1BE",
+"C@    c #B3C6B3",
+"D@    c #DEDEF9",
+"E@    c #CECEF0",
+"F@    c #B6B6C9",
+"G@    c #A7A7AD",
+"H@    c #B2B1C2",
+"I@    c #BDBCD5",
+"J@    c #C6B3B3",
+"K@    c #B7B8CB",
+"L@    c #AFB0BC",
+"M@    c #A7A6AB",
+"N@    c #BFBFD9",
+"O@    c #B1B0BD",
+"P@    c #C3C5E6",
+"Q@    c #A6A6AC",
+"R@    c #B5B4C9",
+"S@    c #D0D2F1",
+"T@    c #AEAEBA",
+"U@    c #A6A6AB",
+"V@    c #B9B9D0",
+"W@    c #C1C2DF",
+"X@    c #BBBBD0",
+"Y@    c #BBBDD5",
+"Z@    c #B4B3C1",
+"`@    c #A3A3A6",
+" #    c #C1C2DD",
+".#    c #D4D4DD",
+"+#    c #BBBCCF",
+"@#    c #BBBCD0",
+"##    c #BABBD0",
+"$#    c #C6C6B3",
+"%#    c #CBCCEC",
+"&#    c #C9CBEC",
+"*#    c #C8C9EA",
+"=#    c #C4C5E7",
+"-#    c #C3C5E5",
+";#    c #B1B1BF",
+">#    c #A7A7AC",
+",#    c #D6D7E7",
+"'#    c #E1E2E5",
+")#    c #BCBCD1",
+"!#    c #BCBDD8",
+"~#    c #A4A4A9",
+"{#    c #E2E3EB",
+"]#    c #B9B9C9",
+"^#    c #B9B9CA",
+"/#    c #B9BAD0",
+"(#    c #B3B4C6",
+"_#    c #AEAFBA",
+":#    c #ABAAB3",
+"<#    c #A3A2A4",
+"[#    c #BABAD1",
+"}#    c #D0D0D6",
+"|#    c #ECB3A0",
+"1#    c #C3C5E7",
+"2#    c #A9A9B0",
+"3#    c #A4A4A8",
+"4#    c #D7D7E5",
+"5#    c #E0E1E6",
+"6#    c #BFC1DF",
+"7#    c #C6A0A0",
+"8#    c #D9A0A0",
+"9#    c #B8B9CA",
+"0#    c #AAAAB3",
+"a#    c #A3A1A4",
+"b#    c #C7C8D6",
+"c#    c #B7B7C7",
+"d#    c #B5B4C3",
+"e#    c #B2B2C2",
+"f#    c #A4A3A7",
+"g#    c #CCCCE2",
+"h#    c #B5B6C5",
+"i#    c #B6B7CA",
+"j#    c #D2D3DA",
+"k#    c #B3B3C0",
+"l#    c #B5B6C7",
+"m#    c #BDBDD8",
+"n#    c #BBBCCE",
+"o#    c #A7A8AE",
+"p#    c #ADAEB7",
+"q#    c #D6D8E6",
+"r#    c #C5C5D1",
+"s#    c #BBBCD3",
+"t#    c #BDBDD7",
+"u#    c #B7B7CC",
+"v#    c #BCBDD2",
+"w#    c #ADAEB9",
+"x#    c #A6A7AD",
+"y#    c #C8C9DC",
+"z#    c #B3B3C3",
+"A#    c #A9AAB2",
+"B#    c #BCBCD3",
+"C#    c #B2B2C0",
+"D#    c #B2B2C3",
+"E#    c #BFC0DD",
+"F#    c #A5A4A8",
+"G#    c #BBBBD2",
+"H#    c #E0E1E5",
+"I#    c #B5B5C3",
+"J#    c #B2B3C1",
+"K#    c #B7B7CB",
+"L#    c #C1C2E2",
+"M#    c #C5C6E6",
+"N#    c #B9BAD1",
+"O#    c #B0B1BF",
+"P#    c #B0B0BC",
+"Q#    c #B9B9CB",
+"R#    c #A5A5A9",
+"S#    c #CFD1CD",
+"T#    c #A7A6AC",
+"U#    c #A5A5AA",
+"V#    c #C1C0DD",
+"W#    c #BEBFDB",
+"X#    c #BABCD5",
+"Y#    c #BFBFDB",
+"Z#    c #C0C3E2",
+"`#    c #BABBD2",
+" $    c #B6B7CC",
+".$    c #B5B5C6",
+"+$    c #B4B4C2",
+"@$    c #A7A6AA",
+"#$    c #A4A2A4",
+"$$    c #A6A6AA",
+"%$    c #D1D3D0",
+"&$    c #BEBFC7",
+"*$    c #B6B7C9",
+"=$    c #C0C1E2",
+"-$    c #C0C1E0",
+";$    c #BDBED7",
+">$    c #B4B4C5",
+",$    c #B7B8CE",
+"'$    c #B6B7CB",
+")$    c #B5B6C9",
+"!$    c #B6B6CA",
+"~$    c #B3B4C3",
+"{$    c #BDBED8",
+"]$    c #BABCD3",
+"^$    c #A9A9B1",
+"/$    c #A3A4A7",
+"($    c #A8A9AF",
+"_$    c #C5C6D5",
+":$    c #D0D2CE",
+"<$    c #C4C4CF",
+"[$    c #AFB0BB",
+"}$    c #BFC2E1",
+"|$    c #BEBFD9",
+"1$    c #B6B7C8",
+"2$    c #B2B2C1",
+"3$    c #B5B5C4",
+"4$    c #A4A2A5",
+"5$    c #A4A4A7",
+"6$    c #CACADD",
+"7$    c #E0E1E4",
+"8$    c #C0C0C9",
+"9$    c #A7A8AF",
+"0$    c #B2B2BD",
+"a$    c #AFAFBA",
+"b$    c #B6B8CA",
+"c$    c #A3A3A5",
+"d$    c #ABACB5",
+"e$    c #C4C5D2",
+"f$    c #E0E2E8",
+"g$    c #DFE1E4",
+"h$    c #A6A5AA",
+"i$    c #A8A7AD",
+"j$    c #A6A5A9",
+"k$    c #A4A3A6",
+"l$    c #A5A4A9",
+"m$    c #ACADB6",
+"n$    c #E1E2E6",
+"o$    c #D1D1D7",
+"p$    c #A4A5A9",
+"q$    c #A4A3A5",
+"r$    c #B4B6C7",
+"s$    c #D3D4DC",
+"t$    c #E2E2E8",
+"u$    c #D5D5DF",
+"v$    c #D2D3DB",
+"w$    c #D1D2D9",
+"x$    c #D3D3DA",
+"y$    c #D3D5DD",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                                                                                    ",
+"                                      . + @ # $ % & * = - ; > ,                                     ",
+"                                ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4                               ",
+"                            5 6 7 8 9 0 a b c d e f g h i j k l m n o p q                           ",
+"                        r s t u v w x y z A B C D E F v G H I J K L M N O P Q                       ",
+"                      r R S T U V W X Y Z Z `  ...+.8 # @.#.$.%.S &.L *.=.n -.;.                    ",
+"                    >.,.0 '.).!.Y ~.{.].^.].]./.(._...:.<.[.}.u %.|.1.2.3.4.n 5.6.                  ",
+"                  7.8.9.j 3.s 0.^.a.b.c.d.e.b.a.^.f.g. .h.# i.j.k.%.l.m.n.3.o.p.q.r.                ",
+"                s.t.u.v.w.x.0.y.c.z.A.B.B.C.D.E.F.G.f.Y  .t.H.I.J.K.%.|.L.M.N.O.P.L.Q.              ",
+"              R.h.n S.T.s 0.U.d.V.W.X.Y.Z.Z.Z.Z.Z.Z.Z.Z.Z.+.Z.Z.Z.Z.Z.Z.Z.Z.Z.`. +/ .+++            ",
+"            @+#+# ! $+%+&+*+d.C.=+-+;+>+Z.Z.Z.,+Z.Z.Z.Z.Z.'+Z.Z.Z.,+Z.Z.Z.Z.Z.)+!+~+{+]+Q           ",
+"            ^+/+(+'._+:+^.<+A.W.-+[+}+|+Z.Z.Z.Z.,+Z.Z.Z.Z._.Z.Z.Z.Z.,+Z.Z.Z.Z.1+w 2+3+4+5+          ",
+"          ;.}.6+T 7+Z /.8+d.9+0+[+a+b+c+Z.Z.Z.Z.Z.,+,+,+Z.d+Z.Z.Z.Z.Z.,+,+,+Z.e+1.f+g+h+i+j+        ",
+"          n S k+l+m+_.n+U.o+W.p+q+b+r+s+Z.Z.,+Z.,+Z.Z.Z.Z.(.Z.Z.,+Z.,+Z.Z.Z.Z.1+t+u+: {+$+v+        ",
+"        w+x+y+K !.z+Y A+A+B+C+D+}+E+F+s+Z.Z.Z.,+,+Z.Z.Z.Z.(.Z.Z.Z.,+,+Z.Z.Z.Z.G+H+H+).I+4+J+K+      ",
+"        L+M+2 : N+O+A+P+,+Q+R+Z.}+S+s+s+Z.Z.Z.,+Z.Z.Z.Z.Z.T+Z.Z.Z.,+Z.Z.Z.Z.Z.U+V+H+W+X+I+Y+Z+      ",
+"        9.6+3.`+ @A+.@.@.@,+Q++@Z.@@s+s+Z.Z.Z.Z.,+Z.Z.Z.Z.(.Z.Z.Z.Z.,+Z.Z.Z.Z.#@H+V+1+$@*.T.%@      ",
+"      &@6+*@).=@-@A+,+.@.@,+Q+A+Z.S+F+s+Z.Z.Z.Z.Z.Z.Z.Z.Z.;@Z.Z.Z.Z.Z.Z.Z.Z.Z.G+H+V+U+>@,@'@)@4     ",
+"      !@~@{@]@^@C Q+Q+,+.@,+Q+C+Z./@a+S+S+(@>+_@Y.A.d.*+/.:@+.C }.<@^ %.|.m.e+e+H+H+V+[@}@[ |@1@    ",
+"      2@3@4@5@6@7@A+A+Q+Q+Q+A+C+Z.0+;+8@Z.Z.Z.Z.Z.Z.Z.Z.Z...Z.Z.Z.Z.Z.Z.Z.Z.Z.H+H+#@V+1+9@*@0@2     ",
+"      }.# M+Y+a@A+b@A+A+A+C+A+A+C.c@W.d@Z.Z.Z.,+Z.Z.Z.Z.Z.e@Z.Z.Z.,+Z.Z.Z.Z.Z.U+V+V+#@#@T f@g@h@    ",
+"      i@(+2 h Q+,+b@j@A+A+k@A+l@C+C+m@n@Z.Z.Z.Z.,+Z.Z.Z.Z.o@Z.Z.Z.Z.,+Z.Z.Z.Z.H+H+V+H+U+p@T q@r@    ",
+"      u s@t@u@Q+v@.@.@j@j@j@l@l@l@b@w@<+Z.Z.Z.Z.Z.,+,+,+Z.# Z.Z.Z.Z.Z.,+,+,+Z.H+H+H+#@U+~@x@y@z@    ",
+"      A@n =.B@Q+v@P+P+.@.@b@b@b@b@j@C@D@Z.Z.,+Z.,+Z.Z.Z.Z.E@Z.Z.,+Z.,+Z.Z.Z.Z.H+V+H+V+G+F@'@G@H@    ",
+"      <@<@I@K Q+v@v@v@P+P+.@P+b@j@l@J@(.Z.Z.Z.,+,+Z.Z.Z.Z.i.Z.Z.Z.,+,+Z.Z.Z.Z.H+t+H+U+m.K@L@M@z@    ",
+"      k.j.N@O@Q+v@b@v@v@v@P+P+j@j@l@R+..Z.Z.Z.,+Z.Z.Z.Z.Z.# Z.Z.Z.,+Z.Z.Z.Z.Z.H+V+H+G+P@j y@Q@R@    ",
+"      s@%.g+Y+Q+v@b@b@v@v@v@v@j@j@l@C+S@Z.Z.Z.Z.,+Z.Z.Z.Z.[.Z.Z.Z.Z.,+Z.Z.Z.Z.H+H+P@L.w l+T@U@V@    ",
+"      W@3+X@Y@Q+v@b@b@b@v@v@v@j@l@l@w@[.Z.Z.Z.Z.Z.Z.Z.Z.Z.F Z.Z.Z.Z.Z.Z.Z.Z.Z.H+t+U+m.y+Z@f `@ #    ",
+"      .#+#@###Q+v@b@b@b@b@b@v@j@l@l@$#%#<@j.J.u &#$.F %.*#%.A@; =#L.m.V+V+V+|.-#P@L.t+L ;#U@>#,#    ",
+"      '#I+_ )#Q+v@b@b@b@b@b@b@j@l@l@C+k.Z.Z.Z.Z.Z.Z.Z.Z.Z.A@Z.Z.Z.Z.Z.Z.Z.Z.Z.P@-#m.!#'@0@~#g {#    ",
+"        ]#^#/#F@Q+v@b@b@b@b@b@j@l@l@w@5.Z.Z.Z.,+Z.Z.Z.Z.Z.A@Z.Z.Z.,+Z.Z.Z.Z.Z.n L.1 (#_#:#<#[#      ",
+"        }#b N.3+Q+v@b@b@b@b@b@j@|#C+(+; Z.Z.Z.Z.,+Z.Z.Z.Z.1#Z.Z.Z.Z.,+Z.Z.Z.Z.n =#>@2#2#3#>#4#      ",
+"        5#9@6#V Q+v@b@7#b@b@b@8#|#$#m.m.Z.Z.Z.Z.Z.,+,+,+Z.P@Z.Z.Z.Z.Z.,+,+,+Z.n x+y@9#0#a#z@Q       ",
+"          b#c#d#Q+v@b@8#b@b@7#8#l@w@e+P@Z.Z.,+Z.,+Z.Z.Z.Z.e+Z.Z.,+Z.,+Z.Z.Z.Z.s@e#T@y@f#M@g#        ",
+"            0@|@Q+v@b@8#b@b@j@j@l@C+G+G+Z.Z.Z.,+,+Z.Z.Z.Z.H+Z.Z.Z.,+,+Z.Z.Z.Z.[#h#y@3#<#i#          ",
+"            j#k#4+'@=.l#m#V+H+V+H+e+H+H+Z.Z.Z.,+Z.Z.Z.Z.Z.H+Z.Z.Z.,+Z.Z.Z.Z.Z.h#n#o#<#p#q#          ",
+"              r#'@T@s#t#K@u#t+H+V+V+#@V+Z.Z.Z.Z.,+Z.Z.Z.Z.m.Z.Z.Z.Z.,+Z.Z.Z.Z.v#w#<#x#y#            ",
+"                z#A#: N B#C#D#E#e+H+H+H+Z.Z.Z.Z.Z.Z.Z.Z.Z.=#Z.Z.Z.Z.Z.Z.Z.Z.Z.B@f#F#G#              ",
+"                H#L@2#k#I#|@3.J#K#L#V+1+H+H+U+e+H+P@G+P@G+M#=#L.L.P.N#O#P#Q#w#3#R#( 5               ",
+"    S#            H#;#T#0#U#V#W#N#h N.X#Y#L#1+L.e+m.m.L.m.m.Z#`# $C#.$+$g@@$#$$$( 5                 ",
+"    %$                &$U#U#*$x =$-$;$).>$F@ $,$'$F@)$!$!$F@~$).{$]$g ^$/$a#($_$                    ",
+"    :$                  <$2#2#[$'.##}$|$_ 1$2$,@3$J#9#i f@$+3+3+m 2+4$`@5$_#6$                      ",
+"                          7$8$9$>#0#0$2+a$k#3$h#c#x B#N@b$m '@5@$$<#c$d$e$f$                        ",
+"                              g$3.2#h$f#3#$$G@0#G@9$0#A#i$j$`@k$l$m$( n$                            ",
+"                                  H#o$K f T#p$q$<#<#c$`@U@2#_#r$s$t$                                ",
+"                                          u$s$v$w$w$w$x$y$&@                                        ",
+"      S#                                                                                            ",
+"      S#                                                                                            "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/marDiagParameters.h b/lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/marDiagParameters.h
new file mode 100644 (file)
index 0000000..fede254
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * marDiagParameters.h
+ * Window identifiers file written by Dialog Editor
+ */
+
+#define ID_EDT_SAMPLE 6130
+#define ID_RAD_NORMAL 6154
+#define ID_CHECKBOX6055 6055
+#define ID_CHECKBOX6056 6056
+#define ID_RAD_DERICHE 6114
+#define ID_TEXTCTRL6031 6031
+#define ID_TEXTCTRL6032 6032
+#define ID_TEXTCTRL6050 6050
+#define ID_TEXTCTRL6033 6033
+#define ID_TEXTCTRL6051 6051
+#define ID_TEXTCTRL6034 6034
+#define ID_TEXTCTRL6052 6052
+#define ID_TEXTCTRL6053 6053
+#define ID_CHK_CONSOLE 6081
+#define ID_TEXTCTRL6036 6036
+#define ID_TEXTCTRL6054 6054
+#define ID_TEXTCTRL6037 6037
+#define ID_TEXTCTRL6038 6038
+#define ID_TEXTCTRL6048 6048
+#define ID_TEXTCTRL6049 6049
+#define ID_STATICBOX6001 6001
+#define ID_STATICBOX6100 6100
+#define ID_STATICBOX6002 6002
+#define ID_STATICBOX6020 6020
+#define ID_STATICBOX6101 6101
+#define ID_STATICBOX6021 6021
+#define ID_STATICBOX6102 6102
+#define ID_STATICBOX6022 6022
+#define ID_STATICBOX6103 6103
+#define ID_STATICBOX6123 6123
+#define ID_STATICBOX6132 6132
+#define ID_STATICBOX6152 6152
+#define ID_CHECK_SLICES 6011
+#define ID_STATICBOX6063 6063
+#define ID_STATICBOX6126 6126
+#define ID_STATICBOX6028 6028
+#define ID_STATICBOX6064 6064
+#define ID_EDT_VOXEL_X 6149
+#define ID_STATICBOX6065 6065
+#define ID_STATICBOX6074 6074
+#define ID_EDT_VOXEL_Y 6150
+#define ID_STATICBOX6057 6057
+#define ID_STATICBOX6084 6084
+#define ID_STATICBOX6138 6138
+#define ID_EDT_VOXEL_Z 6151
+#define ID_STATICBOX6058 6058
+#define ID_STATICBOX6085 6085
+#define ID_STATICBOX6139 6139
+#define ID_STATICBOX6059 6059
+#define ID_STATICBOX6077 6077
+#define ID_STATICBOX6159 6159
+#define ID_BUTTON_COLOR 6013
+#define ID_EDT_WORK_DIR 6070
+#define ID_EDT_CELL_COEF 6169
+#define ID_CHK_PERIMETER 6092
+#define ID_RAD_PERIMETER 6094
+#define ID_EDT_DICOM_DIR 6071
+#define ID_EDT_STEP_COEF 6170
+#define ID_CHK_SHOW_CELL 6155
+#define ID_EDT_MASK_SIZE 6143
+#define ID_RADIOBUTTON6030 6030
+#define ID_RADIOBUTTON6060 6060
+#define ID_RADIOBUTTON6061 6061
+#define ID_RADIOBUTTON6062 6062
+#define ID_RADIOBUTTON6029 6029
+#define ID_EDT_THRESHOLD_ISO_CONTOURS 6105
+#define ID_CHK_DIAMETER_FROM_PERIMETER 6286
+#define ID_RAD_DIAMETER_FROM_PERIMETER 6096
+#define ID_BTN_AXIS_COLOR 6157
+#define ID_EDT_MASS_POWER 6171
+#define ID_DICOM_DIRECTORY 6007
+#define ID_DLG_AXIS_PARAMS 6017
+#define ID_EDT_DISTANCE_CDG 6140
+#define ID_EDT_FLEXION_COEF 6141
+#define ID_EDT_DISTANCE_INT 6167
+#define ID_CHK_DEBUG_WINDOW 6080
+#define ID_EDT_TENSION_COEF 6142
+#define ID_DLG_QUANT_PARAMS 6019
+#define ID_RAD_ISO_CONTOURS 6106
+#define ID_EDT_SIGMA_DERICHE 6122
+#define ID_BTN_3D_BACK_COLOR 6082
+#define ID_CHK_DIAMETERS_VIS 6125
+#define ID_EDT_DISCREET_STEP 6144
+#define ID_EDT_ROI_DIMENSION 6172
+#define ID_CHK_FILL_CONTOURS 6131
+#define ID_CHK_SHOW_INT_CELL 6156
+#define ID_RAD_MINIMUM_VOXEL 6153
+#define ID_DLG_GENERAL_PARAMS 100
+#define ID_DLG_CONTOUR_PARAMS 6018
+#define ID_EDT_WORK_DIRECTORY 6006
+#define ID_EDT_THRESHOLD_SNAKE 6111
+#define ID_CHK_AVERAGE_DIAMETER 6088
+#define ID_RAD_AVERAGE_DIAMETER 6098
+#define ID_BTN_BROWSE_WORK_DIR 6075
+#define ID_CHK_MINIMUM_DIAMETER 6258
+#define ID_RAD_MINIMUM_DIAMETER 6253
+#define ID_CHK_MAXIMUM_DIAMETER 6089
+#define ID_RAD_MAXIMUM_DIAMETER 6097
+#define ID_CHK_MIP 6078
+#define ID_EDT_ITERATIONS_SNAKE 6112
+#define ID_GRADIENT_COEF_DERICHE 6121
+#define ID_BTN_BROWSE_DICOM_DIR 6076
+#define ID_CHK_AREA 6090
+#define ID_RAD_AREA 6093
+#define ID_CHK_ISO_CONTOURS_VIS 6124
+#define ID_EDT_EXTERN_COEF_SNAKE 6113
+#define ID_EDT_STEP 6173
+#define ID_EDT_CELL_MAX_INT_COEF 6168
+#define ID_STATIC6110 6110
+#define ID_STATIC6012 6012
+#define ID_STATIC6004 6004
+#define ID_STATIC6040 6040
+#define ID_STATIC6005 6005
+#define ID_STATIC6023 6023
+#define ID_STATIC6041 6041
+#define ID_STATIC6104 6104
+#define ID_STATIC6024 6024
+#define ID_STATIC6042 6042
+#define ID_STATIC6025 6025
+#define ID_STATIC6043 6043
+#define ID_STATIC6115 6115
+#define ID_STATIC6133 6133
+#define ID_STATIC6160 6160
+#define ID_STATIC6026 6026
+#define ID_STATIC6044 6044
+#define ID_STATIC6116 6116
+#define ID_STATIC6134 6134
+#define ID_STATIC6161 6161
+#define ID_STATIC6027 6027
+#define ID_STATIC6045 6045
+#define ID_STATIC6072 6072
+#define ID_STATIC6108 6108
+#define ID_STATIC6117 6117
+#define ID_STATIC6135 6135
+#define ID_STATIC6162 6162
+#define ID_STATIC6046 6046
+#define ID_STATIC6073 6073
+#define ID_STATIC6109 6109
+#define ID_STATIC6118 6118
+#define ID_STATIC6127 6127
+#define ID_STATIC6136 6136
+#define ID_STATIC6145 6145
+#define ID_STATIC6163 6163
+#define ID_STATIC6047 6047
+#define ID_STATIC6083 6083
+#define ID_STATIC6128 6128
+#define ID_STATIC6137 6137
+#define ID_STATIC6146 6146
+#define ID_STATIC6164 6164
+#define ID_STATIC6147 6147
+#define ID_STATIC6165 6165
+#define ID_STATIC6166 6166
+#define ID_STATIC6158 6158
+#define ID_BROWSE_WORK_DIRECTORY 6008
+#define ID_CHECK_MIP 6010
+#define ID_CHK_DIAMETER_FROM_AREA 6086
+#define ID_EDT_SCALE 6129
+#define ID_RAD_DIAMETER_FROM_AREA 6095
+#define ID_RAD_SNAKE 6107
+#define ID_EDT_ITERATIONS_DERICHE 6119
+#define ID_BUTTON6039 6039
+#define ID_BTN_RESET 6177
+#define ID_BROWSE_DICOM_DIRECTORY 6009
+#define ID_BTN_APPLY 6178
+#define ID_EDT_BALLON_COEF_DERICHE 6120
+#define ID_CHK_SLICES 6079
+#define ID_DLG_PARAMS 6174
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/marDiagParameters.wxr b/lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/marDiagParameters.wxr
new file mode 100644 (file)
index 0000000..862815f
--- /dev/null
@@ -0,0 +1,264 @@
+static char *dlgGeneralParameters = "dialog(name = 'dlgGeneralParameters',\
+  style = 'wxNO_BORDER | wxCAPTION',\
+  title = 'General Parameters',\
+  id = 100,\
+  x = 17, y = 20, width = 518, height = 400,\
+  background_colour = 'D4D0C8',\
+  use_dialog_units = 0,\
+  use_system_defaults = 0,\
+  font = [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg'],\
+  control = [6070, wxTextCtrl, '', '0', 'edtWorkDir', 105, 44, 315, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6071, wxTextCtrl, '', '0', 'edtDICOMDir', 105, 90, 315, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6072, wxStaticText, 'Work directory:', '0', 'statictext3', 24, 48, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6073, wxStaticText, 'DICOM directory:', '0', 'statictext4', 17, 96, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6074, wxStaticBox, 'Data locations', '0', 'staticbox5', 7, 12, 500, 132,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6075, wxButton, 'Browse...', '0', 'btnBrowseWorkDir', 421, 42, 73, 22, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6076, wxButton, 'Browse...', '0', 'btnBrowseDICOMDir', 421, 88, 73, 22, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6077, wxStaticBox, 'User configuration', '0', 'staticbox8', 7, 156, 287, 234,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6078, wxCheckBox, 'Calculate MIP by default?', '0', 'chkMIP', 15, 180, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6079, wxCheckBox, 'Select all slices by default?', '0', 'chkSlices', 14, 202, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6080, wxCheckBox, 'Debug window visible?', '0', 'chkDebugWindow', 14, 226, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6081, wxCheckBox, 'Console window visible?', '0', 'chkConsole', 14, 250, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6082, wxButton, '', '0', 'btn3DBackColor', 19, 298, 259, 58, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6083, wxStaticText, '3D background color:', '0', 'statictext14', 98, 276, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']]).";
+
+static char *dlgContourParameters = "dialog(name = 'dlgContourParameters',\
+  style = 'wxNO_BORDER | wxCAPTION',\
+  title = 'Contour Parameters',\
+  id = 6018,\
+  x = 17, y = 20, width = 518, height = 400,\
+  background_colour = 'D4D0C8',\
+  use_dialog_units = 0,\
+  use_system_defaults = 0,\
+  font = [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg'],\
+  control = [6100, wxStaticBox, 'Contour calculation algorithm', '0', 'staticbox17', 7, 8, 504, 256,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6101, wxStaticBox, '', '0', 'staticbox18', 245, 46, 252, 206,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6102, wxStaticBox, '', '0', 'staticbox19', 21, 46, 217, 60,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6103, wxStaticBox, '', '0', 'staticbox20', 21, 132, 217, 120,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6104, wxStaticText, 'Threshold:', '0', 'statictext21', 28, 68, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6105, wxTextCtrl, '', '0', 'edtThresholdIsoContours', 84, 64, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6106, wxRadioButton, 'IsoContours', '0', 'radIsoContours', 21, 26, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6107, wxRadioButton, 'Snake + IsoContours', '0', 'radSnake', 21, 112, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6108, wxStaticText, 'Threshold:', '0', 'statictext25', 59, 162, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6109, wxStaticText, 'Iterations No:', '0', 'statictext26', 45, 188, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6110, wxStaticText, 'Extern coeficient:', '0', 'statictext27', 28, 214, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6111, wxTextCtrl, '', '0', 'edtThresholdSnake', 112, 158, 105, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6112, wxTextCtrl, '', '0', 'edtIterationsSnake', 112, 182, 105, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6113, wxTextCtrl, '', '0', 'edtExternCoefSnake', 112, 208, 105, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6114, wxRadioButton, 'Snake + Deriche', '0', 'radDeriche', 245, 26, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6115, wxStaticText, 'Iterations No:', '0', 'statictext32', 280, 78, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6116, wxStaticText, 'Ballon coeficient:', '0', 'statictext33', 262, 122, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6117, wxStaticText, 'Sigma:', '0', 'statictext34', 311, 210, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6118, wxStaticText, 'Gradient coeficient:', '0', 'statictext35', 252, 166, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6119, wxTextCtrl, '', '0', 'edtIterationsDeriche', 350, 72, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6120, wxTextCtrl, '', '0', 'edtBallonCoefDeriche', 350, 116, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6121, wxTextCtrl, '', '0', 'edtGradientCoefDeriche', 350, 160, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6122, wxTextCtrl, '', '0', 'edtSigmaDeriche', 350, 204, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6123, wxStaticBox, 'Slice', '0', 'staticbox40', 7, 272, 206, 92,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6124, wxCheckBox, 'Visible \"IsoContours\"?', '0', 'chkIsoContoursVis', 252, 294, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6125, wxCheckBox, 'Visible diameters?', '0', 'chkDiametersVis', 252, 318, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6126, wxStaticBox, 'Debug', '0', 'staticbox43', 231, 272, 161, 92,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6127, wxStaticText, 'Scale:', '0', 'statictext44', 31, 294, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6128, wxStaticText, 'Sample:', '0', 'statictext45', 24, 330, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6129, wxTextCtrl, '', '0', 'edtScale', 70, 288, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6130, wxTextCtrl, '', '0', 'edtSample', 70, 324, 119, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6131, wxCheckBox, 'Fill contours?', '0', 'chkFillContours', 252, 342, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']]).";
+
+static char *dlgAxisParameters = "dialog(name = 'dlgAxisParameters',\
+  style = 'wxNO_BORDER | wxCAPTION',\
+  title = 'Axis Parameters',\
+  id = 6017,\
+  x = 17, y = 20, width = 518, height = 400,\
+  background_colour = 'D4D0C8',\
+  use_dialog_units = 0,\
+  use_system_defaults = 0,\
+  font = [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg'],\
+  control = [6132, wxStaticBox, 'Static', '0', 'staticbox49', 21, 14, 469, 256,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6133, wxStaticText, 'Distance cdg:', '0', 'statictext50', 77, 64, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6134, wxStaticText, 'Flexion coeficient:', '0', 'statictext51', 57, 102, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6135, wxStaticText, 'Mask size:', '0', 'statictext52', 92, 180, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6136, wxStaticText, 'Discreet step for axis:', '0', 'statictext53', 42, 220, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6137, wxStaticText, 'Tension coeficient:', '0', 'statictext54', 52, 142, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6138, wxStaticBox, 'Extraction parameters', '0', 'staticbox55', 35, 38, 197, 212,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6139, wxStaticBox, 'Voxel size', '0', 'staticbox56', 238, 38, 126, 98,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6140, wxTextCtrl, '', '0', 'edtDistanceCdg', 147, 60, 70, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6141, wxTextCtrl, '', '0', 'edtFlexionCoef', 147, 98, 70, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6142, wxTextCtrl, '', '0', 'edtTensionCoef', 147, 136, 70, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6143, wxTextCtrl, '', '0', 'edtMaskSize', 147, 176, 70, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6144, wxTextCtrl, '', '0', 'edtDiscreetStep', 147, 214, 70, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6145, wxStaticText, 'X', '0', 'statictext62', 255, 66, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6146, wxStaticText, 'Y', '0', 'statictext63', 255, 86, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6147, wxStaticText, 'Z', '0', 'statictext64', 255, 106, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6149, wxTextCtrl, '', '0', 'edtVoxelX', 266, 60, 63, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6150, wxTextCtrl, '', '0', 'edtVoxelY', 267, 82, 63, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6151, wxTextCtrl, '', '0', 'edtVoxelZ', 267, 102, 63, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6152, wxStaticBox, 'Choose...', '0', 'staticbox69', 238, 144, 231, 104,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6153, wxRadioButton, 'Minimum voxel', '0', 'radMinimum', 245, 170, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6154, wxRadioButton, 'Normal voxel', '0', 'radNormal', 245, 206, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6155, wxCheckBox, 'Show cell?', '0', 'chkShowCell', 346, 172, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6156, wxCheckBox, 'Show intensity cell?', '0', 'chkShowIntCell', 346, 210, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6157, wxButton, '', '0', 'btnAxisColor', 371, 58, 98, 78, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6158, wxStaticText, 'Axis color', '0', 'statictext75', 374, 38, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6159, wxStaticBox, 'Other info', '0', 'staticbox76', 21, 272, 469, 112,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6160, wxStaticText, 'Distance int:', '0', 'statictext77', 83, 300, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'Arial']],\
+  control = [6161, wxStaticText, 'Cell max. int. coef (1/N):', '0', 'statictext78', 28, 329, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6162, wxStaticText, 'Cell coefcient:', '0', 'statictext79', 73, 358, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6163, wxStaticText, 'Step coeficient (1/N):', '0', 'statictext80', 206, 302, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6164, wxStaticText, 'Mass power:', '0', 'statictext81', 248, 329, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6165, wxStaticText, 'ROI dimension:', '0', 'statictext82', 236, 356, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6166, wxStaticText, 'Step:', '0', 'statictext83', 378, 300, -1, -1, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6167, wxTextCtrl, '', 'wxTE_READONLY', 'edtDistanceInt', 147, 298, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6168, wxTextCtrl, '', 'wxTE_READONLY', 'edtCellMaxIntCoef', 147, 325, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6169, wxTextCtrl, '', 'wxTE_READONLY', 'edtCellCoef', 147, 352, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6170, wxTextCtrl, '', 'wxTE_READONLY', 'edtStepCoef', 309, 296, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6171, wxTextCtrl, '', 'wxTE_READONLY', 'edtMassPower', 309, 324, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6172, wxTextCtrl, '', 'wxTE_READONLY', 'edtROIDimension', 309, 352, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6173, wxTextCtrl, '', 'wxTE_READONLY', 'edtStep', 406, 296, 56, 20, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']]).";
+
+static char *dlgQuantParameters = "dialog(name = 'dlgQuantParameters',\
+  style = 'wxNO_BORDER | wxCAPTION',\
+  title = 'Quantification Parameters',\
+  id = 6019,\
+  x = 17, y = 20, width = 518, height = 400,\
+  background_colour = 'D4D0C8',\
+  use_dialog_units = 0,\
+  use_system_defaults = 0,\
+  font = [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg'],\
+  control = [6084, wxStaticBox, 'Data types', '0', 'staticbox1', 14, 10, 231, 380,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6085, wxStaticBox, 'Stenosis type', '0', 'staticbox2', 273, 10, 231, 380,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6086, wxCheckBox, 'Diameter from area', '0', 'chkDiameterFromArea', 56, 156, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6089, wxCheckBox, 'Maximum diameter', '0', 'chkMaximumDiameter', 56, 268, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6088, wxCheckBox, 'Average diameter', '0', 'chkAverageDiameter', 56, 306, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6258, wxCheckBox, 'Minimum diameter', '0', 'chkMinimumDiameter', 56, 232, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6090, wxCheckBox, 'Area', '0', 'chkArea', 56, 80, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6286, wxCheckBox, 'Diameter from perimeter', '0', 'chkDiameterFromPerimeter', 56, 194, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6092, wxCheckBox, 'Perimeter', '0', 'chkPerimeter', 56, 118, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6093, wxRadioButton, 'Area', '0', 'radArea', 322, 76, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6094, wxRadioButton, 'Perimeter', '0', 'radPerimeter', 322, 114, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6095, wxRadioButton, 'Diameter from area', '0', 'radDiameterFromArea', 322, 152, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6096, wxRadioButton, 'Diameter from perimeter', '0', 'radDiameterFromPerimeter', 322, 190, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6097, wxRadioButton, 'Maximum diameter', '0', 'radMaximumDiameter', 322, 264, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6098, wxRadioButton, 'Average diameter', '0', 'radAverageDiameter', 322, 302, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6253, wxRadioButton, 'Minimum diameter', '0', 'radMinimumDiameter', 322, 228, -1, -1, 0,\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']]).";
+
+static char *dlgParams = "dialog(name = 'dlgParams',\
+  style = 'wxRAISED_BORDER | wxCAPTION',\
+  title = 'MARACAS Parameters...',\
+  id = 6174,\
+  x = 17, y = 20, width = 530, height = 500,\
+  background_colour = 'D4D0C8',\
+  use_dialog_units = 0,\
+  use_system_defaults = 0,\
+  font = [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg'],\
+  control = [5100, wxButton, 'Ok', '0', 'btnOk', 74, 454, 73, 22, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [5101, wxButton, 'Cancel', '0', 'btnCancel', 166, 454, 73, 22, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6177, wxButton, 'Reset', '0', 'btnReset', 259, 454, 73, 22, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']],\
+  control = [6178, wxButton, 'Apply', '0', 'btnApply', 352, 454, 73, 22, '',\
+      [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Shell Dlg']]).";
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/ressource.wxg b/lib/maracasVisuLib/src/interface/wxWindows/res/dialogs/ressource.wxg
new file mode 100644 (file)
index 0000000..864e5c4
--- /dev/null
@@ -0,0 +1,1133 @@
+<?xml version="1.0"?>
+<!-- generated by wxGlade 0.3pre1 on Thu Jul 17 15:06:49 2003 -->
+
+<application path="/home/malat/wxMaracas/src/interface/wxWindows" name="dlgMarParameter" class="wxMaracasParameterDialog" option="1" language="C++" top_window="" encoding="ISO-8859-15" use_gettext="0" overwrite="1">
+    <object class="wxMaracasParameterDialog" name="dlgMarParameter" base="EditDialog">
+        <style>wxCAPTION|wxDIALOG_NO_PARENT</style>
+        <title>MARACAS Parameters...</title>
+        <size>530, 500</size>
+        <object class="wxBoxSizer" name="object_1" base="EditBoxSizer">
+            <orient>wxVERTICAL</orient>
+            <object class="sizeritem">
+                <flag>wxALL|wxEXPAND</flag>
+                <border>0</border>
+                <option>1</option>
+                <object class="wxNotebook" name="notebookParameter" base="EditNotebook">
+                    <style>0</style>
+                    <tabs>
+                        <tab window="notebookParameterGeneral">General Parameters</tab>
+                        <tab window="notebookParameterContour">Contour Parameters</tab>
+                        <tab window="notebookParameterAxis">Axis Parameters</tab>
+                        <tab window="notebookParameterQuant">Quantification Parameters</tab>
+                    </tabs>
+                    <object class="wxPanel" name="notebookParameterGeneral" base="EditPanel">
+                        <style>wxTAB_TRAVERSAL</style>
+                        <object class="wxBoxSizer" name="object_2" base="EditBoxSizer">
+                            <orient>wxVERTICAL</orient>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxStaticBoxSizer" name="object_3" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>Data locations</label>
+                                    <object class="sizeritem">
+                                        <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxFlexGridSizer" name="object_4" base="EditFlexGridSizer">
+                                            <hgap>0</hgap>
+                                            <rows>2</rows>
+                                            <growable_cols>1</growable_cols>
+                                            <cols>3</cols>
+                                            <vgap>50</vgap>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_1_copy" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Work directory:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtWorkDir" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxButton" name="button_4_copy" base="EditButton">
+                                                    <label>Browse...</label>
+                                                    <id>ID_BTN_BROWSE_WORK_DIR=?</id>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_2_copy" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>DICOM directory:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtDICOMDir" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxButton" name="button_5_copy" base="EditButton">
+                                                    <label>Browse...</label>
+                                                    <id>ID_BTN_BROWSE_DICOM_DIR=?</id>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxStaticBoxSizer" name="object_5" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>User configuration</label>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxFlexGridSizer" name="object_6" base="EditFlexGridSizer">
+                                            <hgap>0</hgap>
+                                            <growable_rows>4</growable_rows>
+                                            <rows>6</rows>
+                                            <growable_cols>0</growable_cols>
+                                            <cols>1</cols>
+                                            <vgap>0</vgap>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkMIP" base="EditCheckBox">
+                                                    <label>Calculate MIP by default?</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkSlices" base="EditCheckBox">
+                                                    <label>Select all slices by default?</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkDebugWindow" base="EditCheckBox">
+                                                    <label>Debug window visible?</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkConsole" base="EditCheckBox">
+                                                    <label>Console window visible?</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_29" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>3D background color:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxButton" name="btn3DBackColor" base="EditButton">
+                                                    <label>btn3DBackColor</label>
+                                                    <id>ID_BTN_3D_BACK_COLOR=?</id>
+                                                    <size>511, 42</size>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                    <object class="wxPanel" name="notebookParameterContour" base="EditPanel">
+                        <style>wxTAB_TRAVERSAL</style>
+                        <object class="wxBoxSizer" name="object_7" base="EditBoxSizer">
+                            <orient>wxVERTICAL</orient>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>2</option>
+                                <object class="wxStaticBoxSizer" name="object_8" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>Contour calculation algorithm</label>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxFlexGridSizer" name="object_9" base="EditFlexGridSizer">
+                                            <hgap>0</hgap>
+                                            <growable_rows>1</growable_rows>
+                                            <rows>2</rows>
+                                            <growable_cols>1</growable_cols>
+                                            <cols>2</cols>
+                                            <vgap>0</vgap>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radIsoContours" base="EditRadioButton">
+                                                    <label>IsoContours</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radDeriche" base="EditRadioButton">
+                                                    <label>Snake + Deriche</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxBoxSizer" name="object_10" base="EditBoxSizer">
+                                                    <orient>wxVERTICAL</orient>
+                                                    <object class="sizeritem">
+                                                        <flag>wxEXPAND</flag>
+                                                        <border>0</border>
+                                                        <option>1</option>
+                                                        <object class="wxStaticBoxSizer" name="object_11" base="EditStaticBoxSizer">
+                                                            <orient>wxHORIZONTAL</orient>
+                                                            <label></label>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                                <border>0</border>
+                                                                <option>1</option>
+                                                                <object class="wxFlexGridSizer" name="object_12" base="EditFlexGridSizer">
+                                                                    <hgap>10</hgap>
+                                                                    <rows>1</rows>
+                                                                    <growable_cols>1</growable_cols>
+                                                                    <cols>2</cols>
+                                                                    <vgap>0</vgap>
+                                                                    <object class="sizeritem">
+                                                                        <flag>wxALIGN_RIGHT</flag>
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxStaticText" name="label_7_copy" base="EditStaticText">
+                                                                            <attribute>1</attribute>
+                                                                            <label>Threshold:</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxTextCtrl" name="edtThresholdIsoContours" base="EditTextCtrl">
+                                                                        </object>
+                                                                    </object>
+                                                                </object>
+                                                            </object>
+                                                        </object>
+                                                    </object>
+                                                    <object class="sizeritem">
+                                                        <border>0</border>
+                                                        <option>0</option>
+                                                        <object class="wxRadioButton" name="radSnake" base="EditRadioButton">
+                                                            <label>Snake + IsoContours</label>
+                                                        </object>
+                                                    </object>
+                                                    <object class="sizeritem">
+                                                        <flag>wxEXPAND</flag>
+                                                        <border>0</border>
+                                                        <option>1</option>
+                                                        <object class="wxStaticBoxSizer" name="object_13" base="EditStaticBoxSizer">
+                                                            <orient>wxHORIZONTAL</orient>
+                                                            <label></label>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                                <border>0</border>
+                                                                <option>1</option>
+                                                                <object class="wxFlexGridSizer" name="object_14" base="EditFlexGridSizer">
+                                                                    <hgap>10</hgap>
+                                                                    <rows>3</rows>
+                                                                    <cols>2</cols>
+                                                                    <vgap>0</vgap>
+                                                                    <object class="sizeritem">
+                                                                        <flag>wxALIGN_RIGHT</flag>
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxStaticText" name="label_8_copy" base="EditStaticText">
+                                                                            <attribute>1</attribute>
+                                                                            <label>Threshold:</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <flag>wxEXPAND</flag>
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxTextCtrl" name="edtThresholdSnake" base="EditTextCtrl">
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <flag>wxALIGN_RIGHT</flag>
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxStaticText" name="label_9_copy" base="EditStaticText">
+                                                                            <attribute>1</attribute>
+                                                                            <label>Iterations No:</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxTextCtrl" name="edtIterationsSnake" base="EditTextCtrl">
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <flag>wxALIGN_RIGHT</flag>
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxStaticText" name="label_10_copy" base="EditStaticText">
+                                                                            <attribute>1</attribute>
+                                                                            <label>Extern coefficient:</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxTextCtrl" name="edtExternCoefSnake" base="EditTextCtrl">
+                                                                        </object>
+                                                                    </object>
+                                                                </object>
+                                                            </object>
+                                                        </object>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxStaticBoxSizer" name="object_15" base="EditStaticBoxSizer">
+                                                    <orient>wxHORIZONTAL</orient>
+                                                    <label></label>
+                                                    <object class="sizeritem">
+                                                        <flag>wxEXPAND</flag>
+                                                        <border>0</border>
+                                                        <option>1</option>
+                                                        <object class="wxGridSizer" name="object_16" base="EditGridSizer">
+                                                            <hgap>0</hgap>
+                                                            <rows>4</rows>
+                                                            <cols>2</cols>
+                                                            <vgap>0</vgap>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_3_copy" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Iterations No:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtIterationsDeriche" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_4_copy" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Ballon coefficient:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtBallonCoefDeriche" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_5_copy" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Gradient coefficient:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtGradientCoefDeriche" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_6_copy" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Sigma:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtSigmaDeriche" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                        </object>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxBoxSizer" name="object_17" base="EditBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxStaticBoxSizer" name="object_18" base="EditStaticBoxSizer">
+                                            <orient>wxHORIZONTAL</orient>
+                                            <label>Slice</label>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxFlexGridSizer" name="object_19" base="EditFlexGridSizer">
+                                                    <hgap>10</hgap>
+                                                    <rows>2</rows>
+                                                    <growable_cols>1</growable_cols>
+                                                    <cols>2</cols>
+                                                    <vgap>10</vgap>
+                                                    <object class="sizeritem">
+                                                        <flag>wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</flag>
+                                                        <border>0</border>
+                                                        <option>0</option>
+                                                        <object class="wxStaticText" name="label_11" base="EditStaticText">
+                                                            <attribute>1</attribute>
+                                                            <label>Scale:</label>
+                                                        </object>
+                                                    </object>
+                                                    <object class="sizeritem">
+                                                        <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                        <border>0</border>
+                                                        <option>0</option>
+                                                        <object class="wxTextCtrl" name="edtScale" base="EditTextCtrl">
+                                                        </object>
+                                                    </object>
+                                                    <object class="sizeritem">
+                                                        <flag>wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</flag>
+                                                        <border>0</border>
+                                                        <option>0</option>
+                                                        <object class="wxStaticText" name="label_12" base="EditStaticText">
+                                                            <attribute>1</attribute>
+                                                            <label>Sample:</label>
+                                                        </object>
+                                                    </object>
+                                                    <object class="sizeritem">
+                                                        <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                        <border>0</border>
+                                                        <option>0</option>
+                                                        <object class="wxTextCtrl" name="edtSample" base="EditTextCtrl">
+                                                        </object>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxStaticBoxSizer" name="object_20" base="EditStaticBoxSizer">
+                                            <orient>wxVERTICAL</orient>
+                                            <label>Debug</label>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkIsoContoursVis" base="EditCheckBox">
+                                                    <label>Visible "IsoContours"</label>
+                                                    <size>145, 44</size>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkDiametersVis" base="EditCheckBox">
+                                                    <label>Visible diameters?</label>
+                                                    <size>129, 44</size>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkFillContours" base="EditCheckBox">
+                                                    <label>Fill contours?</label>
+                                                    <size>103, 44</size>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                    <object class="wxPanel" name="notebookParameterAxis" base="EditPanel">
+                        <style>wxTAB_TRAVERSAL</style>
+                        <object class="wxBoxSizer" name="object_21" base="EditBoxSizer">
+                            <orient>wxVERTICAL</orient>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxStaticBoxSizer" name="object_22" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>Static</label>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxBoxSizer" name="object_23" base="EditBoxSizer">
+                                            <orient>wxHORIZONTAL</orient>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxStaticBoxSizer" name="object_24" base="EditStaticBoxSizer">
+                                                    <orient>wxHORIZONTAL</orient>
+                                                    <label>Extraction parameters</label>
+                                                    <object class="sizeritem">
+                                                        <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                        <border>0</border>
+                                                        <option>1</option>
+                                                        <object class="wxFlexGridSizer" name="object_25" base="EditFlexGridSizer">
+                                                            <hgap>10</hgap>
+                                                            <growable_rows>4</growable_rows>
+                                                            <rows>5</rows>
+                                                            <growable_cols>1</growable_cols>
+                                                            <cols>2</cols>
+                                                            <vgap>10</vgap>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_13" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Distance cdg:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxEXPAND</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtDistanceCdg" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_14" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Flexion coefficient:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxEXPAND</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtFlexionCoef" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_15" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Tension coefficient:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxEXPAND</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtTensionCoef" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_16" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Mask size:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxEXPAND</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtMaskSize" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxStaticText" name="label_17" base="EditStaticText">
+                                                                    <attribute>1</attribute>
+                                                                    <label>Discreet step for axis:</label>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <flag>wxEXPAND</flag>
+                                                                <border>0</border>
+                                                                <option>0</option>
+                                                                <object class="wxTextCtrl" name="edtDiscreetStep" base="EditTextCtrl">
+                                                                </object>
+                                                            </object>
+                                                        </object>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxBoxSizer" name="object_26" base="EditBoxSizer">
+                                                    <orient>wxVERTICAL</orient>
+                                                    <object class="sizeritem">
+                                                        <flag>wxEXPAND</flag>
+                                                        <border>0</border>
+                                                        <option>1</option>
+                                                        <object class="wxBoxSizer" name="object_27" base="EditBoxSizer">
+                                                            <orient>wxHORIZONTAL</orient>
+                                                            <object class="sizeritem">
+                                                                <flag>wxEXPAND</flag>
+                                                                <border>0</border>
+                                                                <option>1</option>
+                                                                <object class="wxStaticBoxSizer" name="object_28" base="EditStaticBoxSizer">
+                                                                    <orient>wxHORIZONTAL</orient>
+                                                                    <label>Voxel size</label>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>1</option>
+                                                                        <object class="wxFlexGridSizer" name="object_29" base="EditFlexGridSizer">
+                                                                            <hgap>10</hgap>
+                                                                            <rows>3</rows>
+                                                                            <growable_cols>1</growable_cols>
+                                                                            <cols>2</cols>
+                                                                            <vgap>0</vgap>
+                                                                            <object class="sizeritem">
+                                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                                <border>0</border>
+                                                                                <option>0</option>
+                                                                                <object class="wxStaticText" name="label_18" base="EditStaticText">
+                                                                                    <attribute>1</attribute>
+                                                                                    <label>X</label>
+                                                                                </object>
+                                                                            </object>
+                                                                            <object class="sizeritem">
+                                                                                <flag>wxEXPAND</flag>
+                                                                                <border>0</border>
+                                                                                <option>0</option>
+                                                                                <object class="wxTextCtrl" name="edtVoxelX" base="EditTextCtrl">
+                                                                                </object>
+                                                                            </object>
+                                                                            <object class="sizeritem">
+                                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                                <border>0</border>
+                                                                                <option>0</option>
+                                                                                <object class="wxStaticText" name="label_19" base="EditStaticText">
+                                                                                    <attribute>1</attribute>
+                                                                                    <label>Y</label>
+                                                                                </object>
+                                                                            </object>
+                                                                            <object class="sizeritem">
+                                                                                <flag>wxEXPAND</flag>
+                                                                                <border>0</border>
+                                                                                <option>0</option>
+                                                                                <object class="wxTextCtrl" name="edtVoxelY" base="EditTextCtrl">
+                                                                                </object>
+                                                                            </object>
+                                                                            <object class="sizeritem">
+                                                                                <flag>wxALIGN_RIGHT</flag>
+                                                                                <border>0</border>
+                                                                                <option>0</option>
+                                                                                <object class="wxStaticText" name="label_20" base="EditStaticText">
+                                                                                    <attribute>1</attribute>
+                                                                                    <label>Z</label>
+                                                                                </object>
+                                                                            </object>
+                                                                            <object class="sizeritem">
+                                                                                <flag>wxEXPAND</flag>
+                                                                                <border>0</border>
+                                                                                <option>0</option>
+                                                                                <object class="wxTextCtrl" name="edtVoxelZ" base="EditTextCtrl">
+                                                                                </object>
+                                                                            </object>
+                                                                        </object>
+                                                                    </object>
+                                                                </object>
+                                                            </object>
+                                                            <object class="sizeritem">
+                                                                <border>0</border>
+                                                                <option>1</option>
+                                                                <object class="wxBoxSizer" name="object_30" base="EditBoxSizer">
+                                                                    <orient>wxVERTICAL</orient>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxStaticText" name="label_21" base="EditStaticText">
+                                                                            <attribute>1</attribute>
+                                                                            <label>Axis color</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <flag>wxEXPAND|wxALIGN_CENTER_HORIZONTAL</flag>
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxButton" name="btnAxisColor" base="EditButton">
+                                                                            <label>button_7</label>
+                                                                            <id>ID_BTN_AXIS_COLOR=?</id>
+                                                                        </object>
+                                                                    </object>
+                                                                </object>
+                                                            </object>
+                                                        </object>
+                                                    </object>
+                                                    <object class="sizeritem">
+                                                        <flag>wxEXPAND</flag>
+                                                        <border>0</border>
+                                                        <option>1</option>
+                                                        <object class="wxStaticBoxSizer" name="object_31" base="EditStaticBoxSizer">
+                                                            <orient>wxHORIZONTAL</orient>
+                                                            <label>Choose...</label>
+                                                            <object class="sizeritem">
+                                                                <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                                                <border>0</border>
+                                                                <option>1</option>
+                                                                <object class="wxFlexGridSizer" name="object_32" base="EditFlexGridSizer">
+                                                                    <hgap>0</hgap>
+                                                                    <rows>2</rows>
+                                                                    <cols>2</cols>
+                                                                    <vgap>10</vgap>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxRadioButton" name="radMinimum" base="EditRadioButton">
+                                                                            <label>Minimum voxel</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxCheckBox" name="chkShowCell" base="EditCheckBox">
+                                                                            <label>Show cell?</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxRadioButton" name="radNormal" base="EditRadioButton">
+                                                                            <label>Normal voxel</label>
+                                                                        </object>
+                                                                    </object>
+                                                                    <object class="sizeritem">
+                                                                        <border>0</border>
+                                                                        <option>0</option>
+                                                                        <object class="wxCheckBox" name="chkShowIntCell" base="EditCheckBox">
+                                                                            <label>Show intensity cell?</label>
+                                                                        </object>
+                                                                    </object>
+                                                                </object>
+                                                            </object>
+                                                        </object>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxStaticBoxSizer" name="object_33" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>Other info</label>
+                                    <object class="sizeritem">
+                                        <flag>wxALIGN_CENTER_VERTICAL</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxFlexGridSizer" name="object_34" base="EditFlexGridSizer">
+                                            <hgap>10</hgap>
+                                            <rows>3</rows>
+                                            <cols>6</cols>
+                                            <vgap>20</vgap>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_22" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Distance int:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtDistanceInt" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_26" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Step coefficient (1/N):</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtStepCoef" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_28" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Step:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtStep" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_23" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Cell max. int. \ncoef (1/N):</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtCellMaxIntCoef" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_25" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Mass power:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtMassPower" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxPanel" name="panel_3" base="EditPanel">
+                                                    <style>wxTAB_TRAVERSAL</style>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxPanel" name="panel_4" base="EditPanel">
+                                                    <style>wxTAB_TRAVERSAL</style>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_24" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>Cell coefficient:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtCellCoef" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxALIGN_RIGHT</flag>
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxStaticText" name="label_27" base="EditStaticText">
+                                                    <attribute>1</attribute>
+                                                    <label>ROI dimension:</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxTextCtrl" name="edtROIDimension" base="EditTextCtrl">
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxPanel" name="panel_5" base="EditPanel">
+                                                    <style>wxTAB_TRAVERSAL</style>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <flag>wxEXPAND</flag>
+                                                <border>0</border>
+                                                <option>1</option>
+                                                <object class="wxPanel" name="panel_6" base="EditPanel">
+                                                    <style>wxTAB_TRAVERSAL</style>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                    <object class="wxPanel" name="notebookParameterQuant" base="EditPanel">
+                        <style>wxTAB_TRAVERSAL</style>
+                        <object class="wxBoxSizer" name="object_35" base="EditBoxSizer">
+                            <orient>wxHORIZONTAL</orient>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxStaticBoxSizer" name="object_36" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>Data types</label>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxFlexGridSizer" name="object_37" base="EditFlexGridSizer">
+                                            <hgap>0</hgap>
+                                            <growable_rows>6</growable_rows>
+                                            <rows>7</rows>
+                                            <cols>1</cols>
+                                            <vgap>0</vgap>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkArea" base="EditCheckBox">
+                                                    <label>Area</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkPerimeter" base="EditCheckBox">
+                                                    <label>Perimeter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkDiameterFromArea" base="EditCheckBox">
+                                                    <label>Diameter from area</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkDiameterFromPerimeter" base="EditCheckBox">
+                                                    <label>Diameter from perimeter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkMinimumDiameter" base="EditCheckBox">
+                                                    <label>Minimum diameter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkMaximumDiameter" base="EditCheckBox">
+                                                    <label>Maximum diameter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxCheckBox" name="chkAverageDiameter" base="EditCheckBox">
+                                                    <label>Average diameter</label>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                            <object class="sizeritem">
+                                <flag>wxEXPAND</flag>
+                                <border>0</border>
+                                <option>1</option>
+                                <object class="wxStaticBoxSizer" name="object_38" base="EditStaticBoxSizer">
+                                    <orient>wxHORIZONTAL</orient>
+                                    <label>Stenosis type</label>
+                                    <object class="sizeritem">
+                                        <flag>wxEXPAND</flag>
+                                        <border>0</border>
+                                        <option>1</option>
+                                        <object class="wxFlexGridSizer" name="object_39" base="EditFlexGridSizer">
+                                            <hgap>0</hgap>
+                                            <growable_rows>6</growable_rows>
+                                            <rows>7</rows>
+                                            <cols>1</cols>
+                                            <vgap>0</vgap>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radArea" base="EditRadioButton">
+                                                    <label>Area</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radPerimeter" base="EditRadioButton">
+                                                    <label>Perimeter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radDiameterFromArea" base="EditRadioButton">
+                                                    <label>Diameter from area</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radDiameterFromPerimeter" base="EditRadioButton">
+                                                    <label>Diameter from perimeter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radMinimumDiameter" base="EditRadioButton">
+                                                    <label>Minimum diameter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radMaximumDiameter" base="EditRadioButton">
+                                                    <label>Maximum diameter</label>
+                                                </object>
+                                            </object>
+                                            <object class="sizeritem">
+                                                <border>0</border>
+                                                <option>0</option>
+                                                <object class="wxRadioButton" name="radAverageDiameter" base="EditRadioButton">
+                                                    <label>Average diameter</label>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+            </object>
+            <object class="sizeritem">
+                <flag>wxALL|wxEXPAND</flag>
+                <border>0</border>
+                <option>0</option>
+                <object class="wxBoxSizer" name="object_40" base="EditBoxSizer">
+                    <orient>wxHORIZONTAL</orient>
+                    <object class="sizeritem">
+                        <border>0</border>
+                        <option>1</option>
+                        <object class="wxButton" name="buttonOK" base="EditButton">
+                            <label>OK</label>
+                            <id>wxID_OK</id>
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <border>0</border>
+                        <option>1</option>
+                        <object class="wxButton" name="buttonCancel" base="EditButton">
+                            <label>Cancel</label>
+                            <id>wxID_CANCEL</id>
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <border>0</border>
+                        <option>1</option>
+                        <object class="wxButton" name="buttonReset" base="EditButton">
+                            <label>Reset</label>
+                            <id>ID_BTN_RESET=?</id>
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <border>0</border>
+                        <option>1</option>
+                        <object class="wxButton" name="buttonApply" base="EditButton">
+                            <label>Apply</label>
+                            <id>ID_BTN_APPLY=?</id>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </object>
+</application>
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.ico b/lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.ico
new file mode 100644 (file)
index 0000000..b1f0b17
Binary files /dev/null and b/lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.ico differ
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.xpm b/lib/maracasVisuLib/src/interface/wxWindows/res/icons/maracas.xpm
new file mode 100644 (file)
index 0000000..0d48142
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+static char *maracas_icon_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+"  c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+"                                ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+"                                ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++      ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++                    ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+"                                "
+};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/res/wxInterface.rc b/lib/maracasVisuLib/src/interface/wxWindows/res/wxInterface.rc
new file mode 100644 (file)
index 0000000..f181b4c
--- /dev/null
@@ -0,0 +1,84 @@
+MARACAS_ICON ICON "icons/maracas.ico"
+
+#include <wx/msw/wx.rc>
+
+TOOLBAR_CONNECT                BITMAP  "bitmaps/connect.bmp"
+TOOLBAR_LOADEXP                BITMAP  "bitmaps/loadexp.bmp"
+TOOLBAR_SAVE                   BITMAP  "bitmaps/save.bmp"
+TOOLBAR_EXCEL                  BITMAP  "bitmaps/excel.bmp"
+TOOLBAR_PARAMS                 BITMAP  "bitmaps/params.bmp"
+TOOLBAR_WIZARD                 BITMAP  "bitmaps/wizard.bmp"
+TOOLBAR_BACK                   BITMAP  "bitmaps/back.bmp"
+TOOLBAR_IMAGEBROWSER           BITMAP  "bitmaps/imagebrowser.bmp"
+TOOLBAR_SUBTRACT               BITMAP  "bitmaps/subtract.bmp"
+TOOLBAR_TRID                   BITMAP  "bitmaps/3D.bmp"
+TOOLBAR_PLANS                  BITMAP  "bitmaps/plans.bmp"
+TOOLBAR_QUANT                  BITMAP  "bitmaps/quant.bmp"
+TOOLBAR_ROTATE                 BITMAP  "bitmaps/rotate.bmp"
+TOOLBAR_BRIGHT                 BITMAP  "bitmaps/bright.bmp"
+TOOLBAR_PAN                    BITMAP  "bitmaps/pan.bmp"
+TOOLBAR_ZOOM                   BITMAP  "bitmaps/zoom.bmp"
+TOOLBAR_CLEAR                  BITMAP  "bitmaps/clear.bmp"
+TOOLBAR_INTENSITY              BITMAP  "bitmaps/intensity.bmp"
+TOOLBAR_LINEAR                 BITMAP  "bitmaps/linear.bmp"
+TOOLBAR_AREA                   BITMAP  "bitmaps/area.bmp"
+TOOLBAR_HELP                   BITMAP  "bitmaps/help.bmp"
+AXISTOOLBAR_EXTRACT            BITMAP  "bitmaps/extract.bmp"
+AXISTOOLBAR_ERASE              BITMAP  "bitmaps/del_axis.bmp"
+VESSELSTOOLBAR_EXTRACT         BITMAP  "bitmaps/vessels.bmp"
+VESSELSTOOLBAR_CUTTER          BITMAP  "bitmaps/cutter.bmp"
+VESSELSTOOLBAR_STL             BITMAP  "bitmaps/stl.bmp"
+AUTHORS                        BITMAP  "bitmaps/authors.bmp"
+CREATIS_LOGO                   BITMAP  "bitmaps/creatis_logo.bmp"
+CREATIS_LOGO2                  BITMAP  "bitmaps/creatis_logo2.bmp"
+TOOLBAR_MPR                    BITMAP  "bitmaps/MPR.bmp"
+TOOLBAR_PROCESSINGCT           BITMAP  "bitmaps/ProcessingCT.bmp"
+TOOLBAR_QUANTIFICATIONct       BITMAP  "bitmaps/QuantificationCT.bmp"
+TOOLBAR_AXIS_JF                        BITMAP  "bitmaps/Axis_JF.bmp"
+TOOLBAR_AXIS_JF_MH1            BITMAP  "bitmaps/Axis_JF_MH1.bmp"
+TOOLBAR_AXIS_JF_MH2            BITMAP  "bitmaps/Axis_JF_MH2.bmp"
+TOOLBAR_V2_bi_bl_ListPatient_Voi   BITMAP  "bitmaps2/V2_bi_bl_ListPatient_Voi.bmp"
+TOOLBAR_V2_bi_re_ListPatient_Voi   BITMAP  "bitmaps2/V2_bi_re_ListPatient_Voi.bmp"
+TOOLBAR_V2_bi_bl_Processing        BITMAP  "bitmaps2/V2_bi_bl_Processing.bmp"
+TOOLBAR_V2_bi_re_Processing        BITMAP  "bitmaps2/V2_bi_re_Processing.bmp"
+TOOLBAR_V2_bi_bl_Params            BITMAP  "bitmaps2/V2_bi_bl_Params.bmp"
+TOOLBAR_V2_bi_re_Params            BITMAP  "bitmaps2/V2_bi_re_Params.bmp"
+TOOLBAR_V2_bi_bl_Logo              BITMAP  "bitmaps2/V2_bi_bl_Logo.bmp"
+TOOLBAR_V2_bi_re_Logo              BITMAP  "bitmaps2/V2_bi_re_Logo.bmp"
+TOOLBAR_V2_bi_bl_IRMQuantification BITMAP  "bitmaps2/V2_bi_bl_IRMQuantification.bmp"
+TOOLBAR_V2_bi_re_IRMQuantification BITMAP  "bitmaps2/V2_bi_re_IRMQuantification.bmp"
+TOOLBAR_V2_bi_bl_CTQuantification  BITMAP  "bitmaps2/V2_bi_bl_CTQuantification.bmp"
+TOOLBAR_V2_bi_re_CTQuantification  BITMAP  "bitmaps2/V2_bi_re_CTQuantification.bmp"
+TOOLBAR_V2_bi_bl_STLFormat        BITMAP  "bitmaps2/V2_bi_bl_STLFormat.bmp"
+TOOLBAR_V2_bi_re_STLFormat        BITMAP  "bitmaps2/V2_bi_re_STLFormat.bmp"
+TOOLBAR_V2_bi_bl_VascularTree     BITMAP  "bitmaps2/V2_bi_bl_VascularTree.bmp"
+TOOLBAR_V2_bi_re_VascularTree     BITMAP  "bitmaps2/V2_bi_re_VascularTree.bmp"
+TOOLBAR_V2_bi_bl_ManualRegistration    BITMAP  "bitmaps2/V2_bi_bl_ManualRegistration.bmp"
+TOOLBAR_V2_bi_re_ManualRegistration    BITMAP  "bitmaps2/V2_bi_re_ManualRegistration.bmp"
+TOOLBAR_V2_bi_bl_Information      BITMAP  "bitmaps2/V2_bi_bl_Information.bmp"
+TOOLBAR_V2_bi_bl_Tests            BITMAP  "bitmaps2/V2_bi_bl_Tests.bmp"
+TOOLBAR_V2_bi_re_Tests            BITMAP  "bitmaps2/V2_bi_re_Tests.bmp"
+TOOLBAR_V2_bi_mask                BITMAP  "bitmaps2/V2_bi_mask.bmp"
+TOOLBAR_V2_sm_bl_ListPatient       BITMAP  "bitmaps2/V2_sm_bl_ListPatient.bmp"
+TOOLBAR_V2_sm_re_ListPatient       BITMAP  "bitmaps2/V2_sm_re_ListPatient.bmp"
+TOOLBAR_V2_sm_bl_voi               BITMAP  "bitmaps2/V2_sm_bl_voi.bmp"
+TOOLBAR_V2_sm_re_voi               BITMAP  "bitmaps2/V2_sm_re_voi.bmp"
+TOOLBAR_V2_sm_tr_voi               BITMAP  "bitmaps2/V2_sm_tr_VOI.bmp"
+TOOLBAR_V2_sm_bl_AxisExtraction    BITMAP  "bitmaps2/V2_sm_bl_AxisExtraction.bmp"
+TOOLBAR_V2_sm_bl_Quantification    BITMAP  "bitmaps2/V2_sm_bl_Quantification.bmp"
+TOOLBAR_V2_sm_tr_Quantification    BITMAP  "bitmaps2/V2_sm_tr_Quantification.bmp"
+TOOLBAR_V2_sm_bl_MPR              BITMAP  "bitmaps2/V2_sm_bl_MPR.bmp"
+TOOLBAR_V2_sm_tr_MPR              BITMAP  "bitmaps2/V2_sm_tr_MPR.bmp"
+TOOLBAR_V2_sm_bl_ProcessingCT     BITMAP  "bitmaps2/V2_sm_bl_ProcessingCT.bmp"
+TOOLBAR_V2_sm_bl_TreeExtraction_JF_MH  BITMAP  "bitmaps2/V2_sm_bl_TreeExtraction_JF_MH.bmp"
+TOOLBAR_V2_sm_bl_STLFormat        BITMAP  "bitmaps2/V2_sm_bl_STLFormat.bmp"
+TOOLBAR_V2_sm_tr_STLFormat        BITMAP  "bitmaps2/V2_sm_tr_STLFormat.bmp"
+TOOLBAR_V2_sm_bl_Processing       BITMAP  "bitmaps2/V2_sm_bl_Processing.bmp"
+TOOLBAR_V2_sm_tr_Processing       BITMAP  "bitmaps2/V2_sm_tr_Processing.bmp"
+TOOLBAR_V2_sm_mask                        BITMAP  "bitmaps2/V2_sm_mask.bmp"
+TOOLBAR_V2_sm_bl_OpenDirectory         BITMAP  "bitmaps2/V2_sm_bl_OpenDirectory.bmp"
+TOOLBAR_V2_sm_bl_OpenDICOMDIR          BITMAP  "bitmaps2/V2_sm_bl_OpenDICOMDIR.bmp"
+TOOLBAR_V2_sm_bl_AddAllPatients                BITMAP  "bitmaps2/V2_sm_bl_AddAllPatients.bmp"
+TOOLBAR_V2_sm_bl_AddPatient            BITMAP  "bitmaps2/V2_sm_bl_AddPatient.bmp"
+TOOLBAR_V2_sm_bl_CreateDICOMDIR                BITMAP  "bitmaps2/V2_sm_bl_CreateDICOMDIR.bmp"
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/tools/CMakeLists.txt b/lib/maracasVisuLib/src/interface/wxWindows/tools/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4bd1fdc
--- /dev/null
@@ -0,0 +1,31 @@
+
+
+#-----------------------------------------------------------------------------
+# Ubicacion de los lib - Lib location
+#-----------------------------------------------------------------------------
+LINK_DIRECTORIES(
+"C:/Creatis/ToolsOsgiFramework/bin/Debug"
+"C:/Creatis/ToolBundles/BundleToolbox/bin/bin/Debug"
+)
+
+#-----------------------------------------------------------------------------
+# Lista de archivos fuente - Source file list
+#-----------------------------------------------------------------------------
+SET(MARACAS_TOOLS_SOURCES
+    "MaracasTools.h"
+    "MaracasTools.cpp"
+)
+
+#-----------------------------------------------------------------------------
+# Project MaracasTools in workspace
+#-----------------------------------------------------------------------------
+ADD_LIBRARY(MaracasTools ${MARACAS_TOOLS_SOURCES})
+
+
+#-----------------------------------------------------------------------------
+# Required libraries (dll o so)
+#-----------------------------------------------------------------------------
+TARGET_LINK_LIBRARIES(MaracasTools 
+ToolsOsgiFramework 
+BundleToolbox
+)
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/tools/MaracasTools.cpp b/lib/maracasVisuLib/src/interface/wxWindows/tools/MaracasTools.cpp
new file mode 100644 (file)
index 0000000..b91c8ed
--- /dev/null
@@ -0,0 +1,245 @@
+/*---------------------------------------------------------------
+   INCLUDES WXWIDGETS
+-----------------------------------------------------------------*/
+#include "wx/wxprec.h"
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+/*-----------------------------------------------------------------*/
+
+//disable warnings on 255 char debug symbols
+#pragma warning (disable : 4786) 
+
+
+#include "osgi/framework/Bundle.h"
+#include "osgi/framework/BundleContext.h"
+
+#include "MaracasTools.h"
+#include "interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.h"
+
+#include <iostream>
+
+using namespace std;
+
+/*----------------------------------------------------
+Instance. Singleton pattern in this class
+-----------------------------------------------------*/
+MaracasTools* MaracasTools::INSTANCE = NULL;
+
+
+/*----------------------------------------------------
+GetInstance method
+-----------------------------------------------------*/
+MaracasTools* MaracasTools::GetInstance(){
+       if (INSTANCE == NULL){
+               INSTANCE = new MaracasTools();
+       }
+       return INSTANCE;
+}
+
+
+/*----------------------------------------------------
+Constructor
+-----------------------------------------------------*/
+MaracasTools::MaracasTools(){
+       framework = new Framework();
+       if(( logger=freopen("ToolsLogger.txt","w",stdout)) == NULL){
+               exit(-1);
+       }
+       std::cout << "Framework Creado "<<std::endl;
+       
+       toolsFrame = NULL;
+       optionsFrame = NULL;
+       currentToolPanel = NULL;
+}
+
+
+/*----------------------------------------------------
+It must load all the bundles this class is going to use.
+-----------------------------------------------------*/
+wxFrame* MaracasTools::GetToolbox(wxWindow* parent){
+       
+       
+       //1. Install ToolboxBundle
+       //-----------------------------------------------------------------------------------------------
+       std::cout << "Cargando Toolbox..." <<std::endl;
+       Bundle* bundle = framework->InstallBundle("ToolboxBundle");
+       bundle->Start(); 
+       //-----------------------------------------------------------------------------------------------
+
+       
+       
+       
+       //2. Query the OSGi framework for the IToolbox service (should be delivered in 1).
+       //-----------------------------------------------------------------------------------------------
+       BundleContext* ctx = bundle->getBundleContext();
+       const string interfaceName = "ToolboxService";
+       ServiceReference* ref = ctx->GetServiceReference(interfaceName); 
+       if (ref != NULL){
+               toolbox = (IToolbox*)ctx->GetService(ref);
+               toolbox->SetClient(this); // ACTIVATE THE CALLBACK: WHEN TOOLBOX NEES TO KNOW ANY PARAMETER
+                                                                 // THE METHOD GetParameter ON THE CLIENT WILL BE CALLED.
+       }
+       //-----------------------------------------------------------------------------------------------
+
+
+       
+
+       //3.Install tools
+       //TODO: Replace for discovery of bundles in the maracas' execute directory.
+       //-----------------------------------------------------------------------------------------------
+       Bundle* bundle1 = framework->InstallBundle("SimpleSegBundle");
+       bundle1->Start();
+
+       Bundle* bundle2 = framework->InstallBundle("FM3DBundle");
+       bundle2->Start();
+       //-----------------------------------------------------------------------------------------------
+
+
+       //4.Build Floating bar
+       //-----------------------------------------------------------------------------------------------
+       //FRAME
+       wxSize _size = wxSize(30,600);
+       toolsFrame = new wxFrame(parent,-1,_T("Maracas Tools"),wxDefaultPosition,_size);//,wxCAPTION | wxMINIMIZE | wxSTAY_ON_TOP | wxFRAME_TOOL_WINDOW | wxRESIZE_BORDER | wxCLOSE_BOX);
+
+       //SIZER
+       wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       
+       //BUTTONS
+       wxButton* button = NULL;
+
+
+       int count = toolbox->GetToolsCount();
+       
+               
+       //Storyboard
+       //4.1. MaracasTools asks IToolbox about registered ITools..
+       //-----------------------------------------------------------------------------------------------
+       int i=0;
+//     char* name = "";
+       char name[255]="";
+       for(i=0;i<count;i++){
+
+               string stName = toolbox->GetToolName(i);
+               sprintf(name,"%s",stName.c_str());
+       
+               button = new wxButton(toolsFrame,-1,_T(name));
+               SetIndexForButton(button->GetId());
+
+           sizer->Add( button,1, wxALL, 0);
+               toolsFrame->Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxToolsHandler::OnSelectToolEvent,NULL,this);
+       }
+       //-----------------------------------------------------------------------------------------------
+       
+       
+
+       //CONFIG FRAME
+       //-----------------------------------------------------------------------------------------------
+       toolsFrame->SetSize(25,600);
+       toolsFrame->SetAutoLayout(true);
+       toolsFrame->SetSizer(sizer);
+       toolsFrame->Layout();
+       
+
+       //BUILD TOOLS OPTIONS FRAME
+       //-----------------------------------------------------------------------------------------------
+       wxSize optSize = wxSize(300,300);
+       optionsFrame = new wxFrame(toolsFrame,-1,_T("Tool"),wxDefaultPosition,optSize);//,wxCAPTION | wxMINIMIZE |  wxSTAY_ON_TOP  | wxRESIZE_BORDER | wxCLOSE_BOX );
+       
+
+       return toolsFrame;
+       
+}
+
+
+
+
+
+void MaracasTools::OnSelectToolEvent(wxCommandEvent& event){
+
+
+       int id = event.GetId();
+
+       int idx = GetIndexForButton(id);
+       
+       const string name = toolbox->GetToolName(idx);
+
+       wxSizer* sizer = optionsFrame->GetSizer();
+
+       if (sizer == NULL){
+               sizer= new wxBoxSizer(wxBOTH);
+               optionsFrame->SetSizer(sizer);
+       }
+
+
+       if (currentToolPanel != NULL){
+               //bool t = sizer->Remove(currentToolPanel);
+               currentToolPanel->Destroy();
+       }
+       
+
+       currentToolPanel = toolbox->GetToolPanel(optionsFrame,idx);
+       sizer->Add(currentToolPanel, 1, wxEXPAND, 0);
+       sizer->Layout();
+       
+       optionsFrame->SetTitle(_T(name.c_str()));
+       optionsFrame->Layout();
+       optionsFrame->Show();
+
+
+}
+
+
+
+int MaracasTools::GetIndexForButton(int _wxbuttonid){
+       
+       for(int i=0; i < ids.size(); i++){
+               if (ids[i] == _wxbuttonid){
+                       return i;
+               }
+       }
+       return -1; //NOT FOUND.
+}
+
+
+void MaracasTools::SetIndexForButton(int _wxbuttonid){
+       ids.push_back(_wxbuttonid);
+       int size = ids.size();
+}
+
+
+IParameter* MaracasTools::GetParameter(string name){
+       
+       
+
+       IParameter* parameter = NULL;
+
+       if (name == string("MARACAS_MPR_XYZ")){
+
+               double* xyz = new double[3];
+               xyz[0] =widget->GetVtkMPRBaseData()->GetX();
+               xyz[1] =widget->GetVtkMPRBaseData()->GetY();
+               xyz[2] =widget->GetVtkMPRBaseData()->GetZ();
+               parameter = new IParameter(xyz);
+       }
+
+       else if (name == string("MARACAS_MPR_RENDERER")){
+               vtkRenderer* renderer = widget->GetRenderer();
+               parameter = new IParameter(renderer);
+       }
+
+       else if (name == string("MARACAS_MPR_IMAGE")){
+               vtkImageData* image = widget->GetVtkMPRBaseData()->GetImageData();
+               parameter = new IParameter(image);
+       }
+
+       else if (name == string("MARACAS_MPR_REFRESH")){
+               widget->Refresh();
+       }
+
+        
+       return parameter;
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/tools/MaracasTools.h b/lib/maracasVisuLib/src/interface/wxWindows/tools/MaracasTools.h
new file mode 100644 (file)
index 0000000..2a1fce7
--- /dev/null
@@ -0,0 +1,83 @@
+/*-----------------------------------------------------
+  DEFINE
+*------------------------------------------------------*/
+#if !defined(__TOOLS_MARACAS_TOOLS_H__)
+#define __TOOLS_MARACAS_TOOLS_H__
+
+//#include "interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.h"
+/*-----------------------------------------------------
+  INCLUDE
+*------------------------------------------------------*/
+#include <vector>
+
+#include "wx/frame.h"
+#include "wx/window.h"
+#include "wx/event.h"
+
+#include "osgi/impl/Framework.h"
+#include "maracas/toolbox/IToolbox.h"
+#include "maracas/toolbox/IClient.h"
+#include "maracas/toolbox/IParameter.h"
+
+
+
+
+class wxManualSegmentation_MPRWidget;
+
+
+
+
+//using namespace std;
+/*-----------------------------------------------------
+Class MaracasTools
+
+  Doc goes here.
+         
+*------------------------------------------------------*/
+
+class wxToolsHandler: public wxEvtHandler{
+public:
+       virtual void OnSelectToolEvent(wxCommandEvent& event)=0;
+};
+
+
+
+class MaracasTools: public wxToolsHandler, public IClient{
+       public:
+               static MaracasTools* GetInstance();
+               wxFrame* GetToolbox(wxWindow* parent);
+               IParameter* GetParameter(std::string name);
+               void SetMPRWidget(wxManualSegmentation_MPRWidget* pWidget){widget = pWidget;}
+               void OnSelectToolEvent(wxCommandEvent& event);
+               
+       protected:
+               MaracasTools();
+       private:
+               static MaracasTools* INSTANCE;
+               
+               wxManualSegmentation_MPRWidget* widget;
+               
+               std::vector<int> ids;
+               
+               FILE* logger;
+       
+               Framework* framework;
+               IToolbox* toolbox;
+               
+               wxFrame* toolsFrame;
+               wxFrame* optionsFrame;
+               wxPanel* currentToolPanel;
+               
+               
+
+               
+               int GetIndexForButton(int _wxbuttonid);
+               void SetIndexForButton(int _wxbuttonid);
+};
+
+
+
+#endif //__TOOLS_MARACAS_TOOLS_H__
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/ContourView.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/ContourView.cxx
new file mode 100644 (file)
index 0000000..080f484
--- /dev/null
@@ -0,0 +1,88 @@
+
+
+#include "ContourView.h"
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+ContourView::ContourView()
+{
+       _wxvtkbaseview = NULL;
+}
+
+// ----------------------------------------------------------------------------
+ContourView::~ContourView()
+{
+       DeleteContours();
+}
+
+// ----------------------------------------------------------------------------
+void ContourView::DeleteContours()
+{
+       DeleteVtkObjects();
+       contour_mapped.clear();
+       contour_actor.clear();
+}
+
+// ----------------------------------------------------------------------------
+void ContourView::SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview)
+{
+       _wxvtkbaseview = wxvtkbaseview;
+}
+
+// ----------------------------------------------------------------------------
+void ContourView::Refresh()
+{
+       _wxvtkbaseview->GetRenWin()->Render();
+}
+
+// ----------------------------------------------------------------------------
+void ContourView::CreateNewContour(vtkPolyData *contour, int type)
+{
+       contour_mapped.push_back(vtkPolyDataMapper::New());
+       contour_mapped.back()->ImmediateModeRenderingOn();
+       contour_mapped.back()->ScalarVisibilityOff( );
+       contour_mapped.back()->SetInput(contour);
+
+       contour_actor.push_back(vtkActor::New());
+       contour_actor.back()->SetMapper(contour_mapped.back());
+       contour_actor.back()->GetProperty()->BackfaceCullingOff();
+       
+       switch (type)
+       {
+       case ContourView::BLUE :        contour_actor.back()->GetProperty()->SetDiffuseColor(0, 0, 1);
+                                                               break;
+       case ContourView::MAGENTA : contour_actor.back()->GetProperty()->SetDiffuseColor(1, 0, 1);
+                                                               break;
+       case ContourView::GREEN :       contour_actor.back()->GetProperty()->SetDiffuseColor(0, 1, 0);
+                                                               break;
+       case ContourView::YELLOW :      contour_actor.back()->GetProperty()->SetDiffuseColor(0, 1, 1);
+                                                               break;
+       default:                                        contour_actor.back()->GetProperty()->SetDiffuseColor(0, 0, 1);
+
+       }
+       contour_actor.back()->GetProperty()->SetLineWidth(2);
+       contour_actor.back()->ApplyProperties();
+
+       _wxvtkbaseview->GetRenderer()->AddActor(contour_actor.back());
+       _wxvtkbaseview->GetRenWin()->Render();
+}
+
+// ----------------------------------------------------------------------------
+void ContourView::DeleteVtkObjects()
+{
+       int i,size=contour_mapped.size();
+       for (i=0;i<size; i++){
+               if ( contour_mapped[i]  != NULL )       { 
+                       contour_mapped[i]  -> Delete(); 
+               }
+               if ( contour_actor[i]   != NULL )       { 
+                       _wxvtkbaseview->GetRenderer()->RemoveActor(contour_actor[i]);
+                       contour_actor[i]  -> Delete(); 
+               }
+               contour_actor[i] = NULL;
+               contour_mapped[i] = NULL;
+       }
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/ContourView.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/ContourView.h
new file mode 100644 (file)
index 0000000..d7f7405
--- /dev/null
@@ -0,0 +1,49 @@
+
+#ifndef CONTOUR_VIEW_H
+#define CONTOUR_VIEW_H
+
+#include "vtkProperty.h"
+#include "vtkActor.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyData.h"
+#include "wxVtkBaseView.h"
+#include <vector>
+
+class ContourView  
+{
+public:
+       ContourView();
+       ~ContourView();
+
+
+
+       void    DeleteContours();
+       void    SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview);
+       void    Refresh();
+       void    CreateNewContour(vtkPolyData *contour, int type);
+
+private:
+
+       enum ContourTypes
+       {
+               BLUE = 0,         /*!< Lumen Type. */  
+               MAGENTA,              /*!< Wall Type. */ 
+               GREEN,     /*!< Calcification Type. */  
+               YELLOW          /*!< Hypodense Type. */
+       };
+
+       wxVtkBaseView                                   *_wxvtkbaseview;
+       
+       std::vector<vtkPolyDataMapper*> contour_mapped;
+       std::vector<vtkActor*>                  contour_actor;
+       //vtkActor                                              *_contourVtkActor;
+       //vtkPolyDataMapper                             *_bboxMapper;
+
+       void                    DeleteVtkObjects();
+
+       
+};
+
+#endif // ContourView
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.cxx
new file mode 100644 (file)
index 0000000..39b7e90
--- /dev/null
@@ -0,0 +1,28 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: InterfaceVtkPanelWidgets.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:40 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "InterfaceVtkPanelWidgets.h"
+
+
+void InterfaceVtkPanelWidgets::CallBackOnMouseWheel( wxMouseEvent& event )
+{
+}
+
+void InterfaceVtkPanelWidgets::CallBackOnLeftDClick( wxMouseEvent& event )
+{
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/InterfaceVtkPanelWidgets.h
new file mode 100644 (file)
index 0000000..17809bb
--- /dev/null
@@ -0,0 +1,30 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: InterfaceVtkPanelWidgets.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __INTERFACEVTKPANELWIDGET__
+#define __INTERFACEVTKPANELWIDGET__
+
+#include <wx/event.h>
+
+class InterfaceVtkPanelWidgets
+{
+public:
+       virtual void CallBackOnMouseWheel( wxMouseEvent& event );
+       virtual void CallBackOnLeftDClick( wxMouseEvent& event );
+};
+
+
+#endif         //__INTERFACEVTKPANELWIDGET__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/LineView.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/LineView.cxx
new file mode 100644 (file)
index 0000000..f8060a7
--- /dev/null
@@ -0,0 +1,94 @@
+
+
+#include "LineView.h"
+
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+LineView::LineView()
+{
+       _wxvtkbaseview = NULL;
+}
+
+// ----------------------------------------------------------------------------
+LineView::~LineView()
+{
+       DeleteLines();
+}
+
+// ----------------------------------------------------------------------------
+void LineView::DeleteLines() 
+{
+       DeleteVtkObjects();
+       contour_mapped.clear();
+       contour_actor.clear();
+}
+
+// ----------------------------------------------------------------------------
+void LineView::SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview)
+{
+       _wxvtkbaseview = wxvtkbaseview;
+}
+
+// ----------------------------------------------------------------------------
+void LineView::Refresh()
+{
+       _wxvtkbaseview->GetRenWin()->Render();
+}
+
+// ----------------------------------------------------------------------------
+void LineView::CreateNewLine(double x1, double y1, double z1, double x2, double y2, double z2)
+{
+
+       vtkPoints*  pointsLine = vtkPoints::New();
+       vtkPolyLine* aLine = vtkPolyLine::New();
+       vtkUnstructuredGrid* aLineGrid = vtkUnstructuredGrid::New();
+       contour_mapped.push_back(vtkDataSetMapper::New());
+       contour_actor.push_back(vtkActor::New());
+
+    pointsLine->SetNumberOfPoints(2);
+       pointsLine->InsertPoint(0,x1,y1,z1);
+       pointsLine->InsertPoint(1,x2,y2,z2);
+
+       (aLine->GetPointIds())->SetNumberOfIds(2);
+       (aLine->GetPointIds())->SetId(0,0);
+       (aLine->GetPointIds())->SetId(1,1);
+
+       aLineGrid->Allocate(1,1);
+       aLineGrid->InsertNextCell(aLine->GetCellType(),aLine->GetPointIds());
+       aLineGrid->SetPoints(pointsLine);
+
+       
+       contour_mapped.back()->SetInput(aLineGrid);
+       contour_mapped.back()->ImmediateModeRenderingOn();
+
+       contour_actor.back()->SetMapper(contour_mapped.back());
+       contour_actor.back()->GetProperty()->BackfaceCullingOn();
+       contour_actor.back()->GetProperty()->SetDiffuseColor(0, 0, 1);
+       contour_actor.back()->ApplyProperties();
+
+       _wxvtkbaseview->GetRenderer()->AddActor(contour_actor.back());
+       _wxvtkbaseview->GetRenWin()->Render();
+
+}
+
+// ----------------------------------------------------------------------------
+void LineView::DeleteVtkObjects()
+{
+       int i,size=contour_mapped.size();
+       for (i=0;i<size; i++){
+               if ( contour_mapped[i]  != NULL )       { 
+                       contour_mapped[i]  -> Delete(); 
+               }
+               if ( contour_actor[i]   != NULL )       { 
+                       _wxvtkbaseview->GetRenderer()->RemoveActor(contour_actor[i]);
+                       contour_actor[i]  -> Delete(); 
+               }
+               contour_actor[i] = NULL;
+               contour_mapped[i] = NULL;
+       }
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/LineView.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/LineView.h
new file mode 100644 (file)
index 0000000..ba7f2f6
--- /dev/null
@@ -0,0 +1,37 @@
+
+#ifndef LINE_VIEW_H
+#define LINE_VIEW_H
+
+#include <vtkProperty.h>
+#include <vtkActor.h>
+#include <vtkPolyLine.h>
+#include <vtkDataSetMapper.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkUnstructuredGrid.h>
+#include "wxVtkBaseView.h"
+#include <vector>
+
+class LineView  
+{
+public:
+       LineView();
+       ~LineView();
+
+       void    DeleteLines();
+       void    SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview);
+       void    Refresh();
+       void    CreateNewLine(double x1, double y1, double z1, double x2, double y2, double z2);
+
+private:
+       wxVtkBaseView                                   *_wxvtkbaseview;
+       
+       std::vector<vtkDataSetMapper*> contour_mapped;
+       std::vector<vtkActor*>                  contour_actor;
+       //vtkActor                                              *_contourVtkActor;
+       //vtkPolyDataMapper                             *_bboxMapper;
+
+       void                    DeleteVtkObjects();
+};
+
+#endif // LineView
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/PointView.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/PointView.cxx
new file mode 100644 (file)
index 0000000..77882a8
--- /dev/null
@@ -0,0 +1,92 @@
+#include "PointView.h"
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+PointView::PointView()
+{
+       _wxvtkbaseview = NULL;
+}
+
+// ----------------------------------------------------------------------------
+PointView::~PointView()
+{
+       DeletePoints();
+}
+
+// ----------------------------------------------------------------------------
+void PointView::DeletePoints()
+{
+       DeleteVtkObjects();
+       point_mapped.clear();
+       point_actor.clear();
+}
+
+// ----------------------------------------------------------------------------
+void PointView::SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview)
+{
+       _wxvtkbaseview = wxvtkbaseview;
+}
+
+// ----------------------------------------------------------------------------
+void PointView::Refresh()
+{
+       _wxvtkbaseview->GetRenWin()->Render();
+}
+
+// ----------------------------------------------------------------------------
+void PointView::CreateNewPoint(double x, double y, int type)
+{
+       vtkSphereSource* aSphere =vtkSphereSource::New();
+       aSphere->SetRadius(1);
+       aSphere->SetCenter(x,y,0);
+       
+       point_mapped.push_back(vtkPolyDataMapper::New());
+//     point_mapped.back()->ImmediateModeRenderingOn();
+       //point_mapped.back()->ScalarVisibilityOff( );
+       point_mapped.back()->SetInput(aSphere->GetOutput());
+
+       point_actor.push_back(vtkActor::New());
+       point_actor.back()->SetMapper(point_mapped.back());
+//     point_actor.back()->GetProperty()->BackfaceCullingOff();
+
+       switch (type)
+       {
+       case PointView::BLUE :          point_actor.back()->GetProperty()->SetColor(0, 0, 1);
+                                                               break;
+       case PointView::MAGENTA :       point_actor.back()->GetProperty()->SetColor(1, 0, 1);
+                                                               break;
+       case PointView::GREEN :         point_actor.back()->GetProperty()->SetColor(0, 1, 0);
+                                                               break;
+       case PointView::YELLOW :        point_actor.back()->GetProperty()->SetColor(0, 1, 1);
+                                                               break;
+       default:                                        point_actor.back()->GetProperty()->SetColor(0, 0, 1);
+
+       }
+
+       //point_actor.back()->GetProperty()->SetColor(0, 1, 0);
+       
+       point_actor.back()->ApplyProperties();
+
+       _wxvtkbaseview->GetRenderer()->AddActor(point_actor.back());
+       _wxvtkbaseview->GetRenWin()->Render();
+}
+
+// ----------------------------------------------------------------------------
+void PointView::DeleteVtkObjects()
+{
+       int i,size=point_mapped.size();
+       for (i=0;i<size; i++){
+               if ( point_mapped[i]    != NULL )       { 
+                       point_mapped[i]  -> Delete(); 
+               }
+               if ( point_actor[i]     != NULL )       { 
+                       _wxvtkbaseview->GetRenderer()->RemoveActor(point_actor[i]);
+                       point_actor[i]  -> Delete(); 
+               }
+               point_actor[i] = NULL;
+               point_mapped[i] = NULL;
+       }
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/PointView.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/PointView.h
new file mode 100644 (file)
index 0000000..c5168c3
--- /dev/null
@@ -0,0 +1,47 @@
+
+
+#ifndef POINT_VIEW_H
+#define POINT_VIEW_H
+
+
+#include "vtkProperty.h"
+#include "vtkActor.h"
+#include "vtkSphereSource.h"
+#include "vtkPolyDataMapper.h"
+#include "wxVtkBaseView.h"
+#include <vector>
+
+class PointView  
+{
+public:
+       PointView();
+       ~PointView();
+
+       void    DeletePoints();
+       void    SetWxVtkBaseView(wxVtkBaseView *wxvtkbaseview);
+       void    Refresh();
+       void    CreateNewPoint(double x, double y, int type);
+
+       enum PointTypes
+       {
+               BLUE = 0,           
+               MAGENTA,              
+               GREEN,       
+               YELLOW          
+       };
+
+private:
+       wxVtkBaseView                                   *_wxvtkbaseview;
+       
+       std::vector<vtkPolyDataMapper*> point_mapped;
+       std::vector<vtkActor*>                  point_actor;
+       //vtkActor                                              *_contourVtkActor;
+       //vtkPolyDataMapper                             *_bboxMapper;
+
+       void                    DeleteVtkObjects();
+
+};
+
+#endif // PointView
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/README b/lib/maracasVisuLib/src/interface/wxWindows/widgets/README
new file mode 100644 (file)
index 0000000..5dcd55b
--- /dev/null
@@ -0,0 +1,10 @@
+The files:
+
+wxParametersDialog.cpp
+wxParametersDialog.h
+
+should be part of the CVS, it is only there as a convenient way. In an ideal
+world they should be generated on the fly from ../res/dialogs/ressource.wxg
+to c++ code with the help of 'wxglade.py'
+
+See Maracas/include/Modules/FindwxGlade.cmake for more info
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.cxx
new file mode 100644 (file)
index 0000000..1cd27c5
--- /dev/null
@@ -0,0 +1,284 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: UtilVtk3DGeometriSelection.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include "UtilVtk3DGeometriSelection.h"
+
+#include <vtkPolyData.h>
+#include <vtkCell.h>
+#include <vtkCellLocator.h>
+#include <vtkPointData.h>
+
+#include <vector>
+#include "matrix.h"
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+UtilVtk3DGeometriSelection::UtilVtk3DGeometriSelection()
+{
+       _width  =       0;
+       _height =       0;
+       _depth  =       0;
+       _mCubes =       NULL;
+}
+//----------------------------------------------------------------------------
+UtilVtk3DGeometriSelection::~UtilVtk3DGeometriSelection()
+{
+}
+//----------------------------------------------------------------------------
+void UtilVtk3DGeometriSelection::SetDimentions(int w,int h,int d)
+{
+       _width  =       w;
+       _height =       h;
+       _depth  =       d;
+}
+//----------------------------------------------------------------------------
+void UtilVtk3DGeometriSelection::SetMarchingCube(vtkMarchingCubes *mCubes)
+{
+       _mCubes = mCubes;
+}
+//----------------------------------------------------------------------------
+bool UtilVtk3DGeometriSelection::FindCubePointsFromPoints( double* pO, double* pF, double* pickPoint, double* cameraPos )
+{
+    gtm::TVector< double > p1( 3 ), p2( 3 ), p3( 3 ), p4( 3 ), p5( 3 ), p6( 3 );
+    gtm::TVector< double > c( 3 );
+    gtm::TVector< double >* swp;
+    gtm::TVector< double > tpO( pO, 3, false ), tpF( pF, 3, false );
+    std::vector< gtm::TVector< double >* > points;
+    double x1[ 3 ], x2[ 3 ], x3[ 3 ], d1, d2;
+    int i, j;
+
+    // 1st plane intersection
+    x1[ 0 ] = 0; x1[ 1 ] = _height; x1[ 2 ] =      0;
+    x2[ 0 ] = 0; x2[ 1 ] =       0; x2[ 2 ] =      0;
+    x3[ 0 ] = 0; x3[ 1 ] =       0; x3[ 2 ] = _depth;
+    if( this->IntersectPlaneWithLine( p1.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p1 );
+
+    // 2nd plane intersection
+    x1[ 0 ] =      0; x1[ 1 ] = _height; x1[ 2 ] = _depth;
+    x2[ 0 ] =      0; x2[ 1 ] =       0; x2[ 2 ] = _depth;
+    x3[ 0 ] = _width; x3[ 1 ] =       0; x3[ 2 ] = _depth;
+    if( this->IntersectPlaneWithLine( p2.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p2 );
+
+    // 3rd plane intersection
+    x1[ 0 ] =      0; x1[ 1 ] = 0; x1[ 2 ] = _depth;
+    x2[ 0 ] =      0; x2[ 1 ] = 0; x2[ 2 ] =      0;
+    x3[ 0 ] = _width; x3[ 1 ] = 0; x3[ 2 ] =      0;
+    if( this->IntersectPlaneWithLine( p3.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p3 );
+
+    // 4th plane intersection
+    x1[ 0 ] = _width; x1[ 1 ] = _height; x1[ 2 ] = _depth;
+    x2[ 0 ] = _width; x2[ 1 ] =       0; x2[ 2 ] = _depth;
+    x3[ 0 ] = _width; x3[ 1 ] =       0; x3[ 2 ] =      0;
+    if( this->IntersectPlaneWithLine( p4.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p4 );
+
+    // 5th plane intersection
+    x1[ 0 ] = _width; x1[ 1 ] =       0; x1[ 2 ] = 0;
+    x2[ 0 ] =      0; x2[ 1 ] =       0; x2[ 2 ] = 0;
+    x3[ 0 ] =      0; x3[ 1 ] = _height; x3[ 2 ] = 0;
+    if( this->IntersectPlaneWithLine( p5.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p5 );
+
+    // 6th plane intersection
+    x1[ 0 ] =      0; x1[ 1 ] = _height; x1[ 2 ] =      0;
+    x2[ 0 ] =      0; x2[ 1 ] = _height; x2[ 2 ] = _depth;
+    x3[ 0 ] = _width; x3[ 1 ] = _height; x3[ 2 ] = _depth;
+    if( this->IntersectPlaneWithLine( p6.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p6 );
+
+    if( points.size( ) >= 2 ) { // Did I find at least 2 points?
+
+       c( 0 ) = ( double )_width  / 2.0;
+       c( 1 ) = ( double )_height / 2.0;
+       c( 2 ) = ( double )_depth  / 2.0;
+
+       // Sort with bubble sort. Only 30 iterations!
+       for( i = 0; i < points.size( ); i++ ) {
+           for( j = 0; j < points.size( ) - 1; j++ ) {
+
+               d1 = ( c - *points[ j ] ).GetNorm( );
+               d2 = ( c - *points[ j + 1 ] ).GetNorm( );
+               if( d2 < d1 ) {
+
+                   swp = points[ j ];
+                   points[ j ] = points[ j + 1 ];
+                   points[ j + 1 ] = swp;
+
+               } // fi
+
+    } // rof
+
+       } // rof
+
+       // Order the two points according to distance to camera.
+       c = cameraPos;
+       d1 = ( c - *points[ 0 ] ).GetNorm( );
+       d2 = ( c - *points[ 1 ] ).GetNorm( );
+       tpO = ( d1 < d2 )? *points[ 0 ]: *points[ 1 ];
+       tpF = ( d1 > d2 )? *points[ 0 ]: *points[ 1 ];
+       return( true );
+
+    } else return( false );
+
+}
+//----------------------------------------------------------------------------
+bool UtilVtk3DGeometriSelection::GetPointAndNormalIntersection( double* p, double* n, double* pO, double* pF )
+{
+    gtm::TVector< double > n1( 3 ), n2( 3 ), n3( 3 );
+    int subId, cellId, returnVal;
+    double t, pcoords[ 3 ], x[ 3 ];
+    double fpO[ 3 ], fpF[ 3 ];
+    double p1[ 3 ], p2[ 3 ], p3[ 3 ];
+    vtkPolyData* data = _mCubes->GetOutput( );
+    vtkCellLocator* locator = vtkCellLocator::New( );
+
+    locator->SetDataSet( data );
+    locator->Initialize( );
+    locator->Update( );
+
+    fpO[ 0 ] = pO[ 0 ]; fpO[ 1 ] = pO[ 1 ]; fpO[ 2 ] = pO[ 2 ];
+    fpF[ 0 ] = pF[ 0 ]; fpF[ 1 ] = pF[ 1 ]; fpF[ 2 ] = pF[ 2 ];
+    returnVal = locator->IntersectWithLine( fpO, fpF, 0.1, t, x, pcoords, subId, cellId );
+    locator->Delete( );
+
+    if( returnVal )
+    {
+        vtkCell* cell = data->GetCell( cellId );
+        vtkPoints* points = cell->GetPoints( );
+
+        data->GetPointData( )->GetNormals( )->GetTuple( cell->GetPointIds( )->GetId( 0 ), n1.GetAnsiRef( ) );
+        data->GetPointData( )->GetNormals( )->GetTuple( cell->GetPointIds( )->GetId( 1 ), n2.GetAnsiRef( ) );
+        data->GetPointData( )->GetNormals( )->GetTuple( cell->GetPointIds( )->GetId( 2 ), n3.GetAnsiRef( ) );
+   
+        n1 += n2 + n3;
+        n1 *= ( 1.0 / 3.0 );
+        n1.Normalize( );
+        n[ 0 ] = n1( 0 ); n[ 1 ] = n1( 1 ); n[ 2 ] = n1( 2 );
+
+        points->GetPoint( 0, p1 );
+        points->GetPoint( 1, p2 );
+        points->GetPoint( 2, p3 );
+        this->IntersectPlaneWithLine( p, p1, p2, p3, pO, pF );
+        return( true );
+    } else return( false );
+
+}
+
+//----------------------------------------------------------------------------
+bool UtilVtk3DGeometriSelection::IntersectPlaneWithLine( double* p, double* x1, double* x2, double* x3, double* x4, double* x5 )
+{
+    gtm::TVector< double > vx1( 3 ), vx2( 3 ), vx3( 3 );
+    gtm::TVector< double > vx4( 3 ), vx5( 3 ), vx6( p, 3, false );
+    gtm::TMatrix< double > mU( 4, 4 ), mD( 4, 4 );
+    double t;
+    bool ret;
+
+    vx1 = x1;
+    vx2 = x2;
+    vx3 = x3;
+    vx4 = x4;
+    vx5 = x5;
+    vx6 = vx5 - vx4;
+
+    mD( 0, 0 ) = mU( 0, 0 ) = 1;
+    mD( 0, 1 ) = mU( 0, 1 ) = vx1( 0 );
+    mD( 0, 2 ) = mU( 0, 2 ) = vx1( 1 );
+    mD( 0, 3 ) = mU( 0, 3 ) = vx1( 2 );
+    mD( 1, 0 ) = mU( 1, 0 ) = 1;
+    mD( 1, 1 ) = mU( 1, 1 ) = vx2( 0 );
+    mD( 1, 2 ) = mU( 1, 2 ) = vx2( 1 );
+    mD( 1, 3 ) = mU( 1, 3 ) = vx2( 2 );
+    mD( 2, 0 ) = mU( 2, 0 ) = 1;
+    mD( 2, 1 ) = mU( 2, 1 ) = vx3( 0 );
+    mD( 2, 2 ) = mU( 2, 2 ) = vx3( 1 );
+    mD( 2, 3 ) = mU( 2, 3 ) = vx3( 2 );
+    mU( 3, 0 ) = 1;
+    mU( 3, 1 ) = vx4( 0 );
+    mU( 3, 2 ) = vx4( 1 );
+    mU( 3, 3 ) = vx4( 2 );
+    mD( 3, 0 ) = 0;
+    mD( 3, 1 ) = vx6( 0 );
+    mD( 3, 2 ) = vx6( 1 );
+    mD( 3, 3 ) = vx6( 2 );
+
+    ret = ( mD.Det( ) != 0 );
+    if( ret ) {
+
+       t = mU.Det( ) / mD.Det( );
+       vx6 = ( ( vx4 - vx5 ) * t ) + vx4;
+
+    } // fi
+    return( ret );
+
+}
+
+
+
+//----------------------------------------------------------------------------
+// pResult  Result
+// n        Normal to plane
+// p        Point of the plane
+// pA       point1 of the line
+// pB       point2 of the line
+void UtilVtk3DGeometriSelection::IntersectionPlaneAndLine(double *pResult,double *n,double *p,double *pA,double *pB)
+{
+       double u,A,B,D;
+       D = - (n[0]*p[0] + n[1]*p[1] + n[2]*p[2]) ;
+       A= n[0]*pA[0] +  n[1]*pA[1] + n[2]*pA[2] + D;
+       B= n[0]*(pA[0]-pB[0]) +  n[1]*(pA[1]-pB[1]) + n[2]*(pA[2]-pB[2]);
+       if (B!=0)
+       {
+               u = A / B ;
+       } else {
+               u=-1;
+       }
+       pResult[0] = pA[0] + u*(pB[0] - pA[0]);
+       pResult[1] = pA[1] + u*(pB[1] - pA[1]);
+       pResult[2] = pA[2] + u*(pB[2] - pA[2]);
+}
+
+//----------------------------------------------------------------------------
+// p   point
+// pA  point1 of the line
+// pB  point2 of the line
+double UtilVtk3DGeometriSelection::DistanceMinPointToLine(double *p,double *pA, double *pB)
+{
+       double pResult[3];
+       double normalToPlane[3];
+       normalToPlane[0]=pA[0]-pB[0];
+       normalToPlane[1]=pA[1]-pB[1];
+       normalToPlane[2]=pA[2]-pB[2];
+    IntersectionPlaneAndLine(pResult,normalToPlane,p,pA,pB);
+
+       double dx = p[0]-pResult[0];
+       double dy = p[1]-pResult[1];
+       double dz = p[2]-pResult[2];
+
+    double result=sqrt( dx*dx + dy*dy + dz*dz );
+
+       return result;
+}
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/UtilVtk3DGeometriSelection.h
new file mode 100644 (file)
index 0000000..19209df
--- /dev/null
@@ -0,0 +1,51 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: UtilVtk3DGeometriSelection.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __UTILVTK3DGEOMETRISELECTION__
+#define __UTILVTK3DGEOMETRISELECTION__
+
+#include <vtkMarchingCubes.h>
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class UtilVtk3DGeometriSelection
+{
+public:
+       UtilVtk3DGeometriSelection();
+       ~UtilVtk3DGeometriSelection();
+       void    SetDimentions(int w,int h,int d);
+       void    SetMarchingCube(vtkMarchingCubes *mCubes);
+       bool    FindCubePointsFromPoints( double* pO, double* pF, double* pickPoint, double* cameraPos );
+       bool    GetPointAndNormalIntersection( double* p, double* n, double* pO, double* pF );
+       bool    IntersectPlaneWithLine( double* p, double* x1, double* x2, double* x3, double* x4, double* x5 );
+
+       double  DistanceMinPointToLine(double *p,double *pA, double *pB);
+       void    IntersectionPlaneAndLine(double *pResult,double *n,double *p,double *pA,double *pB);
+
+protected:
+private:
+       int                                     _width;
+       int                                     _height;
+       int                                     _depth;
+       vtkMarchingCubes        *_mCubes;
+};
+
+
+
+#endif //__UTILVTK3DGEOMETRISELECTION__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/chart.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/chart.cpp
new file mode 100644 (file)
index 0000000..7fe1294
--- /dev/null
@@ -0,0 +1,1034 @@
+
+
+//----------------------------------------------------------------
+#ifdef __GNUG__
+    #pragma implementation "chart.h"
+#endif
+
+#ifdef __BORLANDC__
+       #pragma hdrstop
+#endif
+
+//-------------------------------------------------------------------
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+       #include "wx/wx.h"
+#endif
+
+
+#include "chart.h"
+#include <math.h>
+
+//----------------------------------------------------------------
+// DataSet : Constructor & Destructor
+//-------------------------------------------------------------------
+wxDataSet::wxDataSet(wxPen *lStyle, wxBrush *dStyle, int dWidth,
+                     int lWidth, int dGap, int pMark, int disValues)
+{
+   m_lineStyle = lStyle;
+   m_dataStyle = dStyle;
+   m_dataWidth = dWidth;
+   m_lineWidth = lWidth;
+   m_pointMark = pMark;
+   m_displayValues = disValues;
+   m_display = false;
+   m_rowsList = NULL;
+   m_text = NULL;
+}
+
+wxDataSet::wxDataSet(wxPen *lStyle, wxBrush *dStyle,
+             wxString *lText, bool lDisplay)
+{
+   m_lineStyle = lStyle;
+   m_dataStyle = dStyle;
+   m_display = lDisplay;
+   m_text = lText;
+   m_rowsList = NULL;
+   m_dataWidth = 0;
+   m_lineWidth = 0;
+   m_pointMark = 0;
+   m_displayValues = 0;
+}
+
+
+
+wxDataSet::wxDataSet()
+{
+   m_lineStyle = NULL;
+   m_dataStyle = NULL;
+   m_dataWidth = 0;
+   m_lineWidth = 0;
+   m_pointMark = 0;
+   m_displayValues = 0;
+   m_display = false;
+   m_rowsList = NULL;
+   m_text = NULL;
+}
+
+
+wxDataSet::~wxDataSet()
+{
+  // Nothing
+}
+
+
+
+
+//-----------------------------------------------------------------
+// Chart
+//-------------------------------------------------------------------
+BEGIN_EVENT_TABLE(wxChart, wxWindow)
+  EVT_PAINT(wxChart::OnPaint)
+END_EVENT_TABLE()
+
+//---------------------------------------------------------------------
+// Constructor & Destructor
+wxChart::wxChart(wxFrame *parent, wxWindowID id,
+               const wxPoint& pos, const wxSize& size,
+               long  style, const wxString& name)
+ : wxWindow(parent, id, pos, size, style, name)
+{
+
+    SetMaxWidthHeight(size.GetWidth(), size.GetHeight());
+       SetCenterChart(pos.x + (GetLargeur()/2), pos.y + (GetHauteur()/2));
+
+    InitDataSet();
+
+    InitChart();
+}
+
+
+
+wxChart::~wxChart()
+{
+  // nothing
+}
+
+
+
+void  wxChart::InitChart()
+{
+    SetShowPer(false); //not display line % per default
+
+    for(int i=0; i<m_NumDataSet ; i++)
+               ShowDataSet(false, i);
+
+       InitData();
+}
+
+
+
+// Static Function
+//--------------------------------------------------------------
+static double st_difference(double val, int multi, bool sens=true)
+{
+    double retour=0;
+    div_t result;
+
+       result = div(int(val), multi);
+       // multiple sup
+       if ( sens )
+       {
+       if ( val > 1)
+          {
+          if ( result.rem == 0 )
+          {
+             if (val - (int)val > 0 )
+                 retour =  (multi - result.rem) - (val - int(val));
+                 }
+          else
+                 {
+              retour =  (multi - result.rem) - (val - int(val));
+                 }
+          }
+       }
+    // multiple inf
+       else
+               retour = result.rem + (val - (int)val);
+
+       return retour;
+}
+
+static double st_decalage(double IncX, double MinX)
+{
+  double retour = 0.00;
+  div_t result;
+
+  if (IncX >= 1)
+  {
+     result = div(MinX, IncX);
+     if ( result.rem == 0 )
+     {
+        if (MinX - (int)MinX > 0 )
+           retour = ((result.quot + 1) * IncX) - MinX;
+        }
+        else
+        {
+        retour = ((result.quot+1) * IncX) - MinX;
+        }
+  }
+  return retour;
+}
+
+
+static double st_origine(double IncX, double MinX)
+{
+   double retour = MinX;
+   div_t result;
+
+   if (IncX >=1)
+   {
+      result = div(MinX, IncX);
+         if (result.rem == 0)
+      {
+                 if (MinX - (int)MinX > 0 )
+                         retour = (result.quot + 1) * IncX;
+      }
+      else
+         {
+          retour = (result.quot + 1) * IncX;
+         }
+   }
+   return retour;
+}
+
+
+static void st_InverseCol(double *l_MinCol, double  *l_MaxCol)
+{
+   if  (*l_MinCol > *l_MaxCol)
+   {
+     int tempo = *l_MaxCol;
+        *l_MaxCol = *l_MinCol;
+        *l_MinCol = tempo;
+   }
+
+}
+
+
+//--------------------------------------------------------------
+void wxChart::SetInfX(double inf)
+{
+   m_InfX = inf;
+}
+
+void wxChart::SetSupX(double sup)
+{
+   m_SupX = sup;
+}
+
+
+void wxChart::SetSupY(double sup)
+{
+   m_SupY = sup;
+}
+
+
+
+void wxChart::SetIncAxisX(double minor, double major)
+{
+    m_MinorIncX = minor;
+    m_MajorIncX = major;
+}
+
+void wxChart::SetIncAxisY(double minor, double major)
+{
+    m_MinorIncY = minor;
+    m_MajorIncY = major;
+}
+
+
+void wxChart::SetInitEdge()
+{
+   SetEdgeTop(15);
+   SetEdgeBottom(35);
+   SetEdgeLeft(37);
+   SetEdgeRight(15);
+}
+
+
+
+void wxChart::SetChartBounds()
+{
+   m_Top = m_CenterY - (m_MaxHauteur/2) + m_EdgeTop;
+   m_Bottom = m_CenterY + (m_MaxHauteur/2) - m_EdgeBottom;
+   m_Left = m_CenterX - (m_MaxLargeur/2) + m_EdgeLeft;
+   m_Right = m_CenterX + (m_MaxLargeur/2) - m_EdgeRight;
+
+}
+
+void wxChart::SetChartBoundsLegend()
+{
+   m_TopLegend = m_CenterY - (m_MaxHauteur/2) + m_EdgeTopLegend;
+   m_BottomLegend = m_CenterY + (m_MaxHauteur/2) - m_EdgeBottomLegend;
+   m_LeftLegend = m_CenterX - (m_MaxLargeur/2) + m_EdgeLeftLegend;
+   m_RightLegend = m_CenterX + (m_MaxLargeur/2) - m_EdgeRightLegend;
+}
+
+
+void wxChart::SetCadreLegend(int nbr, int *bottom)
+{
+    int val=GetEdgeBottom();
+       div_t result = div(nbr, 2);
+
+       if (result.rem == 0)
+       val+= (nbr * 10) + 5;
+    else
+               val+= (( nbr + 1 ) * 10) + 5;
+
+    *bottom = val;
+
+    SetEdgeTopLegend(m_CenterY + (m_MaxHauteur/2) - val + 33);
+    SetEdgeBottomLegend(8);
+
+       int l_left = GetEdgeLeft();
+       int l_right = GetEdgeRight();
+
+       // more small for only 1 line
+       if (nbr == 1)
+       {
+       l_left+=m_CenterX - (m_MaxLargeur/3);
+       l_right+=m_CenterX - (m_MaxLargeur/3);
+       }
+
+       SetEdgeLeftLegend(l_left);
+    SetEdgeRightLegend(l_right);
+}
+
+
+
+void wxChart::SetShowPer(bool per)
+{
+  m_ShowPer = per;
+
+}
+
+
+void  wxChart::SetMaxValue(double max)
+{
+   // Axe Y
+   m_MaxValue = max;
+}
+
+
+
+
+double wxChart::MaxValue()
+{
+   double data, val = 1.00;
+   int maxdata = GetNumDataSet()-1;
+   int maxitem = GetNumItem();
+
+   // Exclure Stenosis for calcul MaxValue
+   for(int a=0; a < maxdata; a++)
+   {
+      if (GetShowDataSet(a))
+         {
+               for(int j=0; j<=maxitem; j++)
+               {
+           if ( IsEmpty(a,j) == false )
+                  {
+             data = GetDataY(a,j);
+                if (data > val)
+               val = data;
+                  }
+               }
+         }
+   }
+   return val;
+}
+
+
+
+double wxChart::MinCol(double min)
+{
+    double retour = 0.00;
+       int maxdata = GetNumDataSet()-1;
+
+       // Exclure Stenosis for calcul MaxValue
+       for(int a=0; a < maxdata; a++)
+    {
+      if (GetShowDataSet(a))
+         {
+            if (min > retour)
+                        retour = min;
+                a = maxdata - 1;
+         }
+       }
+
+    return retour;
+}
+
+
+double wxChart::MaxCol(double max)
+{
+    double retour = 1.00;
+       int maxdata = GetNumDataSet()-1;
+
+       // Exclure Stenosis for calcul MaxValue
+       for(int a=0; a < maxdata; a++)
+    {
+      if (GetShowDataSet(a))
+         {
+            if (max > retour)
+                        retour = max;
+                a = maxdata - 1;
+         }
+       }
+
+    return retour;
+}
+
+
+
+void  wxChart::SetStepSizeX(double stepX)
+{
+       m_StepSizeX = stepX;
+}
+
+void  wxChart::SetStepSizeY(double stepY)
+{
+       m_StepSizeY = stepY;
+}
+
+
+void  wxChart::SetStepSizePer(double stepPer)
+{
+       m_StepSizePer = stepPer;
+}
+
+
+void   wxChart::SetCenterChart(int x, int y)
+{
+   m_CenterX = x;
+   m_CenterY = y;
+}
+
+void wxChart::SetMaxWidthHeight(int x,int y)
+{
+   m_MaxLargeur = x;
+   m_MaxHauteur = y;
+}
+
+
+void wxChart::SetMinX(double MinX)
+{
+   m_MinX = MinX;
+}
+
+
+void wxChart::SetMaxX(double MaxX)
+{
+   m_MaxX = MaxX;
+}
+
+
+
+void wxChart::SetEdgeTop(int top)
+{
+  m_EdgeTop = top;
+}
+
+void wxChart::SetEdgeBottom(int bottom)
+{
+  m_EdgeBottom = bottom;
+}
+
+void wxChart::SetEdgeLeft(int left)
+{
+  m_EdgeLeft = left;
+}
+
+void wxChart::SetEdgeRight(int right)
+{
+  m_EdgeRight = right;
+}
+
+
+void  wxChart::SetEdgeTopLegend(int top)
+{
+       m_EdgeTopLegend = top;
+}
+
+void  wxChart::SetEdgeBottomLegend(int bottom)
+{
+       m_EdgeBottomLegend = bottom;
+}
+
+void  wxChart::SetEdgeLeftLegend(int left)
+{
+       m_EdgeLeftLegend = left;
+}
+
+
+void  wxChart::SetEdgeRightLegend(int right)
+{
+       m_EdgeRightLegend = right;
+}
+
+
+
+void   wxChart::SetNumDataSet(int num)
+{
+       m_NumDataSet = num;
+}
+
+void   wxChart::SetNumItem(int num)
+{
+       m_NumItem = num;
+}
+
+
+int  wxChart::GetShow()
+{
+   int retour = 0;
+
+   for(int i=0; i < m_NumDataSet ; i++)
+   {
+          if (GetShowDataSet(i))
+          retour++;
+   }
+   return retour;
+}
+
+
+void wxChart::InitDataSet()
+{
+
+       // Initialization
+       SetNumDataSet(8);
+       for(int i=0; i<MAX_DATASET ; i++)
+               m_dataSetArray[i]=NULL;
+
+    // Colour
+       wxColour *BlueColour       = new wxColour(0,0,255);
+       wxColour *GreyColour       = new wxColour(192,192,192);
+       wxColour *YellowColour     = new wxColour(255,255,0);
+    wxColour *VioletColour     = new wxColour(255,0,255);
+    wxColour *CyanColour       = new wxColour(0,255,255);
+
+
+       // Create All DataSet
+       // Per default : Show(false)
+       m_dataSetArray[wxArea] =
+         new wxDataSet(wxRED_PEN, wxRED_BRUSH, (wxString*)"Area");
+
+       m_dataSetArray[wxPerimeter] =
+         new wxDataSet(new wxPen(*BlueColour, 1, wxSOLID),
+                           new wxBrush(*BlueColour, wxSOLID),
+                                       (wxString*)"Perimeter");
+
+       m_dataSetArray[wxDiameterArea] =
+         new wxDataSet(new wxPen(*GreyColour, 1, wxSOLID),
+                       new wxBrush(*GreyColour, wxSOLID),
+                    (wxString*)"Diameter from area");
+
+       m_dataSetArray[wxDiameterPerimeter] =
+         new wxDataSet(new wxPen(*YellowColour, 1, wxSOLID),
+                           new wxBrush(*YellowColour, wxSOLID),
+                               (wxString*)"Diameter from perimeter");
+
+       m_dataSetArray[wxMinimumDiameter] =
+         new wxDataSet(new wxPen(*VioletColour, 1, wxSOLID),
+                       new wxBrush(*VioletColour, wxSOLID),
+                       (wxString*)"Minimum diameter");
+
+       m_dataSetArray[wxMaximumDiameter] =
+         new wxDataSet(new wxPen(*CyanColour, 1, wxSOLID),
+                           new wxBrush(*CyanColour, wxSOLID),
+                       (wxString*)"Maximum diameter");
+
+       m_dataSetArray[wxAverageDiameter] =
+         new wxDataSet(wxBLACK_PEN, wxBLACK_BRUSH, (wxString*)"Average diameter");
+
+       m_dataSetArray[wxStenosis] =
+         new wxDataSet(wxGREEN_PEN, wxGREEN_BRUSH, (wxString*)"Stenosis");
+
+}
+
+
+// Paint
+//---------------------------------------------------------------------
+void wxChart::OnPaint(wxPaintEvent& event)
+{
+    wxPaintDC dc(this);
+       Draw(dc);
+}
+
+
+
+void wxChart::Draw(wxDC& dc)
+{
+   wxBrush  *dataBrush;
+   wxPen    *dataPen;
+
+   //----------------------------------------------------------------------------
+   // Begin
+   dc.BeginDrawing();
+   dc.Clear();
+
+
+   //----------------------------------------------------------------------------
+   // Font : one for all chart
+   dc.SetFont(*(new wxFont(1, wxDEFAULT, wxNORMAL, wxLIGHT)));
+
+   //----------------------------------------------------------------------------
+   // Dimension
+   wxSize size = GetClientSize();
+   SetMaxWidthHeight(size.GetWidth(), size.GetHeight());
+   SetCenterChart((GetLargeur()/2), (GetHauteur()/2));
+   SetInitEdge();
+
+   //-----------------------------------------------------------------------------
+   // Show Line
+   ShowDataSet(true,wxArea);
+   ShowDataSet(true,wxPerimeter);
+   ShowDataSet(true,wxDiameterArea);
+   ShowDataSet(false,wxDiameterPerimeter);
+   ShowDataSet(false,wxMinimumDiameter);
+   ShowDataSet(false,wxMaximumDiameter);
+   ShowDataSet(false,wxAverageDiameter);
+   ShowDataSet(false,wxStenosis);
+
+   m_ShowPer = true;
+
+   // Show Axe %
+   if (m_ShowPer)
+   {
+          SetEdgeRight(45);
+          ShowDataSet(true,wxStenosis);
+   }
+
+
+   //--------------------------------------------------------------------
+   // Legend
+   int nbr = GetShow();
+   if (nbr > 0)
+   {
+         SetCadreLegend(nbr, &m_EdgeBottom);
+      SetChartBoundsLegend();
+      DrawLegend(dc, nbr);
+   }
+
+   //-------------------------------------------------------------------
+   // Valeur Min et Max des abscisses
+   SetMinX(MinCol(0));
+   SetMaxX(MaxCol(1));
+   SetInfX(st_difference(m_MinX,10,false));
+   SetSupX(st_difference(m_MaxX,10,true));
+
+   //------------------------------------------------------------------
+   // Data
+   // Stenosis
+   SetNumItem(6);
+   SetData(wxStenosis, 0,   0,  -45);
+   SetData(wxStenosis, 1, 0.4,    0);
+   SetData(wxStenosis, 2, 0.6,  -15);
+   SetData(wxStenosis, 3, 0.8,    0);
+   SetData(wxStenosis, 4, 0.9,  100);
+   SetData(wxStenosis, 5,   1,    0);
+
+   // Area
+   SetData(wxArea,0,   0, 0.8);
+   SetData(wxArea,1, 0.2, 0.6);
+   SetData(wxArea,2, 0.3, 0.8);
+   SetData(wxArea,3, 0.4,   1);
+   SetData(wxArea,4, 0.8, 0.4);
+   SetData(wxArea,5,   1, 0.2);
+
+   //-----------------------------------------------------------------
+   // Valeur Max du chart
+   SetMaxValue(MaxValue());
+   SetSupY(st_difference(m_MaxValue, 10, true));
+
+   //-------------------------------------------------------------------------------
+   // Scale
+   SetIncAxisX((m_MaxX + m_SupX  -  (m_MinX - m_InfX)) / (double)MINOR_STEP,
+                  (m_MaxX + m_SupX  -  (m_MinX - m_InfX)) / (double)MAJOR_STEP);
+   SetIncAxisY((m_MaxValue + m_SupY) / (double)MINOR_STEP,
+                  (m_MaxValue + m_SupY) / (double)MAJOR_STEP);
+
+   SetStepSizeX(( m_MaxLargeur - (m_EdgeLeft + m_EdgeRight + m_SupX + m_InfX)) /
+                   (m_MaxX - m_MinX));
+   SetStepSizeY(( m_MaxHauteur - (m_EdgeBottom + m_EdgeTop + m_SupY )) /
+                   (m_MaxValue));
+   SetStepSizePer(( m_MaxHauteur - (m_EdgeBottom + m_EdgeTop)) /
+                   (double)MAX_PER);
+
+
+   //-----------------------------------------------------------------------------
+   // Empty Chart
+   //---------------------------------------------------------------------------
+   SetChartBounds();
+   DrawGrille(dc);
+   DrawAxe(dc);
+   if (m_ShowPer)
+          DrawAxePer(dc);
+
+   //-----------------------------------------------------------------------------
+   // Clipping
+   //---------------------------------------------------------------------------
+   dc.DestroyClippingRegion();
+   dc.SetClippingRegion(m_Left , m_Top ,
+                           GetLargeur() - (m_EdgeRight + m_EdgeLeft   ),
+                                               GetHauteur() - (m_EdgeTop   + m_EdgeBottom ));
+
+   //---------------------------------------------------------------------------
+   // Draw line
+   //---------------------------------------------------------------------------
+   int maxdataset = GetNumDataSet();
+   for(int a=0; a < maxdataset; a++)
+   {
+          if(m_dataSetArray[a] && m_dataSetArray[a]->GetShow())
+       {
+         dataBrush = m_dataSetArray[a]->GetDataStyle();
+         dataPen = m_dataSetArray[a]->GetLineStyle();
+                dc.SetBrush(*dataBrush);
+         dc.SetPen(*dataPen);
+                DrawLine(dc, a);
+          }
+   }
+
+   //---------------------------------------
+   // end
+   dc.DestroyClippingRegion();
+   dc.EndDrawing();
+}
+
+
+
+void wxChart::DrawAxe(wxDC& dc)
+{
+   double x,y;
+   double val, supx;
+   char text[20];
+   int widthx,heighty;
+
+   double minorIncStepY= m_MinorIncY * m_StepSizeY;
+   double majorIncStepY= m_MajorIncY * m_StepSizeY;
+
+   double minorIncStepX= m_MinorIncX * m_StepSizeX;
+   double majorIncStepX= m_MajorIncX * m_StepSizeX;
+
+   dc.SetPen(*wxBLACK_PEN);
+   dc.SetBrush(*wxBLACK_BRUSH);
+
+   // Axe X
+   dc.DrawLine(m_Left, m_Bottom+(7*MARGE/4), m_Right, m_Bottom+(7*MARGE/4));
+   // Axe Y
+   dc.DrawLine(m_Left-(7*MARGE/4), m_Bottom, m_Left-(7*MARGE/4), m_Top);
+
+   // AXE Y
+   // Major Tick Marks with values
+   val=0.00;
+   for(x=m_Left,y=m_Bottom; y >= m_Top; y-=majorIncStepY, val+=m_MajorIncY)
+   {
+      dc.DrawLine(m_Left-7-(7*MARGE/4),y,m_Left-(7*MARGE/4),y);
+         sprintf(text,"%g", val);
+      dc.GetTextExtent(text,&widthx,&heighty);
+      dc.DrawText(text,m_Left-10-widthx-(7*MARGE/4),y-(heighty/2));
+   }
+   // Ne pas Depasser
+   if (m_SupY == 0 )
+   {
+      dc.DrawLine(m_Left-7-(7*MARGE/4),m_Top,m_Left-(7*MARGE/4),m_Top);
+      sprintf(text,"%g", val);
+      dc.GetTextExtent(text,&widthx,&heighty);
+      dc.DrawText(text,m_Left-10-widthx-(7*MARGE/4),m_Top-(heighty/2));
+   }
+
+   // Minor Tick Marks
+   for(x=m_Left,y=m_Bottom; y >= m_Top; y-=minorIncStepY)
+   {
+         dc.DrawLine(m_Left-3-(7*MARGE/4),y,m_Left-(7*MARGE/4),y);
+   }
+
+   // AXE X
+   // Major Tick Marks with values
+   supx = st_decalage(m_MajorIncX, m_MinX) * m_StepSizeX;
+   val = st_origine(m_MajorIncX, m_MinX);
+   for(y=m_Bottom,x=m_Left + supx; x <= m_Right; x+=majorIncStepX, val+=m_MajorIncX)
+   {
+      dc.DrawLine(x,m_Bottom+7+(7*MARGE/4),x,m_Bottom+(7*MARGE/4));
+      sprintf(text,"%g", val);
+      dc.GetTextExtent(text,&widthx,&heighty);
+      dc.DrawText(text,x-(widthx/2),y+3+heighty);
+   }
+   // Ne pas Depasser
+   if ( m_SupX == 0 )
+   {
+        dc.DrawLine(m_Right,m_Bottom+7+(7*MARGE/4),m_Right,m_Bottom+(7*MARGE/4));
+     sprintf(text,"%g", val);
+     dc.GetTextExtent(text,&widthx,&heighty);
+     dc.DrawText(text,m_Right-(widthx/2),m_Right+3+heighty);
+   }
+
+   supx = st_decalage(m_MinorIncX, m_MinX) * m_StepSizeX;
+   //Minor Tick Marks
+   for(y=m_Bottom,x=m_Left + supx; x <= m_Right; x+=minorIncStepX)
+   {
+     dc.DrawLine(x,m_Bottom+3+(7*MARGE/4),x,m_Bottom+(7*MARGE/4));
+   }
+}
+
+
+void wxChart::DrawAxePer(wxDC& dc)
+{
+   double x,y;
+   double val;
+   char text[20];
+   int widthx,heighty;
+
+   double minorIncStepPer= MINOR_PER * m_StepSizePer;
+   double majorIncStepPer= MAJOR_PER * m_StepSizePer;
+
+   dc.SetPen(*wxBLACK_PEN);
+   dc.SetBrush(*wxBLACK_BRUSH);
+
+   // AXE Per
+   dc.DrawLine(m_Right+(7*MARGE/4), m_Bottom, m_Right+(7*MARGE/4), m_Top);
+
+   // Major Tick Marks with values
+   val=0.00;
+   for(x=m_Right,y=m_Bottom; y >= m_Top; y-=majorIncStepPer, val+=MAJOR_PER)
+   {
+         dc.DrawLine(m_Right+(7*MARGE/4),y,m_Right+7+(7*MARGE/4),y);
+         sprintf(text,"%g",(val-(MAX_PER/2)));
+         dc.GetTextExtent(text,&widthx,&heighty);
+         dc.DrawText(text,m_Right+10+(7*MARGE/4),y-(heighty/2));
+   }
+   dc.DrawLine(m_Right+(7*MARGE/4),m_Top,m_Right+7+(7*MARGE/4),m_Top);
+   sprintf(text,"%g",(val-(MAX_PER/2)));
+   dc.GetTextExtent(text,&widthx,&heighty);
+   dc.DrawText(text,m_Right+10+(7*MARGE/4),m_Top-(heighty/2));
+
+   // Minor Tick Marks
+   for(x=m_Right,y=m_Bottom; y >= m_Top; y-=minorIncStepPer)
+   {
+         dc.DrawLine(m_Right+(7*MARGE/4),y,m_Right+3+(7*MARGE/4),y);
+   }
+}
+
+
+
+void wxChart::DrawGrille(wxDC& dc)
+{
+   double x,y;
+   double val;
+   double minorIncStepY = m_MinorIncY * m_StepSizeY;
+   double minorIncStepX = m_MinorIncX * m_StepSizeX;
+
+   dc.SetBrush(*wxLIGHT_GREY_BRUSH);
+
+   // Tracer DOT
+   wxPen *Pen = new wxPen(*wxLIGHT_GREY, 1, wxDOT);
+   dc.SetPen(*Pen);
+
+   // quadrillage en point
+   // axe Y
+   for(x=m_Left,y=m_Bottom; y >= m_Top; y-=minorIncStepY)
+      dc.DrawLine(m_Left-MARGE,y,m_Right+MARGE,y);
+   if (m_SupY == 0)
+     dc.DrawLine(m_Left-MARGE,m_Top,m_Right+MARGE,m_Top);
+
+   // axe X
+   val = st_decalage(m_MinorIncX, m_MinX) * m_StepSizeX;
+   for(y=m_Bottom, x=m_Left + val ; x <= m_Right; x+=minorIncStepX)
+      dc.DrawLine(x,m_Bottom+MARGE,x,m_Top-MARGE);
+   if (m_SupX == 0)
+      dc.DrawLine(m_Right,m_Bottom+MARGE,m_Right,m_Top-MARGE);
+
+   // Contour
+   Pen->SetStyle(wxSOLID);
+   dc.SetPen(*Pen);
+   dc.DrawLine(m_Left-MARGE, m_Top-MARGE, m_Right+MARGE, m_Top-MARGE);
+   dc.DrawLine(m_Right+MARGE, m_Top-MARGE, m_Right+MARGE, m_Bottom+MARGE);
+   dc.DrawLine(m_Right+MARGE, m_Bottom+MARGE, m_Left-MARGE, m_Bottom+MARGE);
+   dc.DrawLine(m_Left-MARGE, m_Bottom+MARGE, m_Left-MARGE, m_Top-MARGE);
+}
+
+
+
+void wxChart::DrawLegend(wxDC& dc, int nbre)
+{
+       // Init
+       wxString  *string;
+    wxPen     *dataPen;
+    wxBrush   *dataBrush;
+       int widthx, heighty, l_posx, l_posy;
+       char text[30];
+       int haut_ligne, compt = 0;
+       int l_haut = m_BottomLegend - m_TopLegend;
+    int l_larg = m_RightLegend - m_LeftLegend;
+       div_t result = div(nbre,2);
+       div_t resulta;
+    int l_debut = 30, l_trait = 15, l_space = 10;
+
+       if (result.rem == 0)
+          haut_ligne = l_haut / result.quot;
+       else
+       haut_ligne = l_haut / (result.quot+1);
+
+       // Contour
+       dc.SetPen(*wxBLACK_PEN);
+    dc.SetBrush(*wxBLACK_BRUSH);
+    dc.DrawLine(m_LeftLegend, m_TopLegend, m_RightLegend, m_TopLegend);
+    dc.DrawLine(m_RightLegend, m_TopLegend, m_RightLegend, m_BottomLegend);
+    dc.DrawLine(m_RightLegend, m_BottomLegend, m_LeftLegend, m_BottomLegend);
+    dc.DrawLine(m_LeftLegend, m_BottomLegend, m_LeftLegend, m_TopLegend);
+
+       // For each dataset
+       int maxdataset = GetNumDataSet();
+       for (int a=0; a < maxdataset; a++)
+       {
+          if (m_dataSetArray[a] && m_dataSetArray[a]->GetShow())
+       {
+          compt++;
+          // Text
+             string = m_dataSetArray[a]->GetText();
+                 sprintf(text,"%s",string);
+          dc.GetTextExtent(text,&widthx,&heighty);
+
+          resulta = div(compt, 2);
+          l_posx = m_LeftLegend;
+          l_posy =  m_TopLegend;
+                 if (resulta.rem == 0)
+          {
+                        l_posx+= l_larg/2;
+                    l_posy+= (haut_ligne * resulta.quot);
+                 }
+                 else
+             l_posy+= (haut_ligne * (resulta.quot+1));
+
+                 l_posy-= (haut_ligne/2);
+
+          // proportion
+             if (nbre==1)
+            l_posx = m_LeftLegend + ((l_larg - l_trait - l_space - widthx)/2) - l_debut;
+
+             // ligne
+                 dataBrush = m_dataSetArray[a]->GetDataStyle();
+          dataPen = m_dataSetArray[a]->GetLineStyle();
+                 dataPen->SetWidth(2);
+                 dc.SetBrush(*dataBrush);
+          dc.SetPen(*dataPen);
+          dc.DrawLine(l_posx + l_debut, l_posy, l_posx + l_debut + 15, l_posy);
+          dataPen->SetWidth(1);
+                 // text
+                 dc.SetFont(*(new wxFont(1, wxDEFAULT, wxNORMAL, wxBOLD)));
+                 dc.SetPen(*wxBLACK_PEN);
+          dc.SetBrush(*wxBLACK_BRUSH);
+          dc.DrawText(text,l_posx + l_debut + l_trait + l_space ,l_posy - (heighty/2));
+             dc.SetFont(*(new wxFont(1, wxDEFAULT, wxNORMAL, wxLIGHT)));
+          }
+       }
+}
+
+
+
+void wxChart::DrawLine(wxDC &dc, int a)
+{
+   int compt=0;
+   double val;
+   double mid = m_Bottom - ((m_Bottom-m_Top)/2);
+   int maxitem = GetNumItem();
+
+   float yprec, xprec;
+   float xsuiv, ysuiv;
+
+   for(int j=0; j < maxitem; j++)
+   {
+      if ( IsEmpty(a,j) == false )
+      {
+         compt++;
+                xsuiv = m_Left + ((GetDataX(a,j) - m_MinX ) * m_StepSizeX);
+         val = GetDataY(a,j);
+            if ( a == wxStenosis)
+              // Axe Per for Stenosis
+           ysuiv = mid - (val * m_StepSizePer);
+         else
+           // Axe X
+              ysuiv = m_Bottom - (val * m_StepSizeY);
+              // Draw line
+         if (compt > 1)
+                   dc.DrawLine(xprec, yprec, xsuiv, ysuiv);
+
+         // save point prec
+         xprec = xsuiv;
+                yprec = ysuiv;
+         }
+   }
+}
+
+
+// Click Mouse
+//-----------------------------------------------------------------
+void wxChart::OnLeftClick(wxDC &dc, double x, double y, int keys)
+{
+  // TO IMPLEMENT
+}
+
+void wxChart::OnRightClick(wxDC &dc, double x, double y, int keys)
+{
+  // TO IMPLEMENT
+}
+
+
+// Data
+//--------------------------------------------------------------------
+void wxChart::InitData()
+{
+  SetNumItem(0);
+  for(int a=0; a<MAX_DATASET; a++)
+  {
+        for(int j=0; j<MAX_ITEM; j++)
+        {
+         m_table[a][j].x=0.00;
+         m_table[a][j].y=0.00;
+                m_table[a][j].empty = true;
+     }
+  }
+}
+
+bool  wxChart::IsEmpty(int a, int j)
+{
+   return m_table[a][j].empty;
+}
+
+
+double wxChart::GetDataX(int a, int j)
+{
+
+   return  m_table[a][j].x;
+}
+
+double wxChart::GetDataY(int a, int j)
+{
+
+   return  m_table[a][j].y;
+}
+
+
+void wxChart::SetData(int a, int j, double x, double y)
+{
+     m_table[a][j].x = x;
+     m_table[a][j].y = y;
+        m_table[a][j].empty = false;
+}
+
+
+void wxChart::ShowDataSet(bool show,int dataset)
+{
+   if(m_dataSetArray[dataset])
+      m_dataSetArray[dataset]->Show(show);
+}
+
+bool wxChart::GetShowDataSet(int dataset)
+{
+
+   if(m_dataSetArray[dataset])
+      return m_dataSetArray[dataset]->GetShow();
+   else
+      return 1;
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/chart.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/chart.h
new file mode 100644 (file)
index 0000000..9fedff3
--- /dev/null
@@ -0,0 +1,213 @@
+#ifndef wx_chart_h
+#define wx_chart_h
+
+
+//-----------------------------------------------------------------
+#ifdef __GNUG__
+    #pragma interface "chart.h"
+#endif
+
+#ifdef __BORLANDC__
+       #pragma hdrstop
+#endif
+
+//---------------------------------------------------------------------
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+       #include "wx/wx.h"
+#endif
+
+
+//---------------------------------------------------------------------
+#define MAX_DATASET   10
+#define MAX_ITEM      50 
+#define MARGE             5
+#define MINOR_STEP    10
+#define MAJOR_STEP     5
+#define MAX_PER      200 
+#define MINOR_PER     25
+#define MAJOR_PER     50
+       
+enum 
+{
+  wxArea              = 0,
+  wxPerimeter         = 1,
+  wxDiameterArea      = 2, 
+  wxDiameterPerimeter = 3,
+  wxMinimumDiameter   = 4,
+  wxMaximumDiameter   = 5,
+  wxAverageDiameter   = 6,
+  wxStenosis          = 7
+};
+
+
+//-------------------------------------------------------------------
+class wxDataSet: public wxObject
+{
+ protected:
+   wxBrush  *m_dataStyle;
+   wxPen    *m_lineStyle;
+   wxString *m_text;
+   int       m_dataWidth;     // Scaled|Fixed
+   int       m_lineWidth;
+   int       m_pointMark;
+   int       m_displayValues; // def=NONE |IN | OUT 
+   bool      m_display;
+
+ public:
+   wxList *m_rowsList;
+ public :
+   // Constructor & Destructor
+   wxDataSet(wxPen *lStype, wxBrush *dStyle,
+             int dWidth, int lWidth, int dGap, int pMark,
+             int disValues);
+   wxDataSet(wxPen *lStype, wxBrush *dStyle,
+             wxString *lText, bool lDisplay=false);
+   wxDataSet();
+   ~wxDataSet();
+    // Set
+   void SetDataStyle(wxBrush* brush)  { m_dataStyle = brush;}
+   void SetDataWidth(int width)       { m_dataWidth = width;}
+   void SetLineStyle(wxPen* style)    { m_lineStyle = style;}
+   void SetPointMark(int mark)        { m_pointMark = mark; }
+   void SetText(wxString* string)     { m_text = string;    }
+   void Show(bool show)               { m_display=show;     }
+   
+   // Get
+   bool      GetShow()      { return m_display;   }
+   wxBrush*  GetDataStyle() { return m_dataStyle; }
+   int       GetDataWidth() { return m_dataWidth; }
+   wxPen*    GetLineStyle() { return m_lineStyle; }
+   int       GetPointMark() { return m_pointMark; }
+   wxString* GetText()      { return m_text;      }
+   
+};
+//---------------------------------------------------------------
+
+
+class Table
+{
+  public :
+    double x,y;
+       bool   empty;
+};
+
+//----------------------------------------------------------------------
+class wxChart: public wxWindow
+{
+private:
+       
+    int         m_NumDataSet;
+       int         m_NumItem;
+       Table       m_table[MAX_DATASET][MAX_ITEM];
+    wxDataSet  *m_dataSetArray[MAX_DATASET]; 
+    double  m_MinX, m_MaxX;
+    double  m_InfX, m_SupX, m_SupY;
+       
+       double  m_StepSizeX, m_StepSizeY, m_StepSizePer;
+    double  m_MaxValue; 
+    
+       int     m_ValueCol;      
+    bool    m_ShowPer;
+
+       int     m_MaxHauteur, m_MaxLargeur;
+    int     m_CenterX, m_CenterY;
+       int     m_EdgeTop, m_EdgeBottom, m_EdgeLeft, m_EdgeRight;
+    int     m_Top,m_Bottom, m_Left, m_Right;
+           
+    int     m_EdgeTopLegend, m_EdgeBottomLegend, m_EdgeLeftLegend, m_EdgeRightLegend;
+    int     m_TopLegend, m_BottomLegend, m_LeftLegend, m_RightLegend;
+       
+       double  m_MinorIncX, m_MajorIncX;
+    double  m_MinorIncY, m_MajorIncY;
+
+       void    DrawLine(wxDC &dc, int a);
+       void    DrawFond(wxDC& dc);
+    void    DrawAxe(wxDC& dc);
+    void    DrawAxePer(wxDC& dc);
+       void    DrawLegend(wxDC& dc, int nbr);
+       void    DrawGrille(wxDC& dc);
+       void    SetInitEdge();
+    void    SetChartBounds();
+       void    SetChartBoundsLegend();
+       void    SetCadreLegend(int nbr, int* bottom);
+    void    InitDataSet();
+    void    InitData();
+       double  MaxValue();
+       double  MinCol(double inf);
+    double  MaxCol(double sup);
+    void    SetInfX(double sup);
+       void    SetSupX(double sup);
+       void    SetSupY(double sup);
+    void    InitChart();
+    int     GetShow();
+
+public:
+       // Constructor et Destructor
+       wxChart(wxFrame *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition,
+               const wxSize& size = wxDefaultSize, long  style = wxDEFAULT_FRAME_STYLE,
+               const wxString& name = wxPanelNameStr);
+    ~wxChart();
+       
+       void    OnPaint(wxPaintEvent& event);
+       void    OnLeftClick(wxDC &dc, double x, double y, int keys);
+       void    OnRightClick(wxDC &dc, double x, double y, int keys);
+       
+       void    Draw(wxDC& dc);
+       bool    IsEmpty(int a, int item);
+       double  GetDataX(int a, int item);
+       double  GetDataY(int a, int item);
+    void    SetData(int a, int item, double x, double y);
+    
+    void    SetMinX(double MinX);
+       void    SetMaxX(double MaxX);
+       void    SetMaxWidthHeight(int x,int y); 
+       void    SetCenterChart(int x, int y);
+       void    SetShowPer(bool per);
+       void    SetMaxValue(double max);
+       void    SetStepSizeX(double sizeX);
+    void    SetStepSizeY(double sizeY);
+    void    SetStepSizePer(double sizePer);
+    void    SetNumDataSet(int NumDataSet);
+       void    SetNumItem(int NumItem);
+       void    SetIncAxisX(double minor, double major);
+    void    SetIncAxisY(double minor, double major);
+    void    SetEdgeTop(int top);
+       void    SetEdgeBottom(int bottom);
+       void    SetEdgeLeft(int left);
+       void    SetEdgeRight(int right);
+    void    SetEdgeTopLegend(int top);
+       void    SetEdgeBottomLegend(int bottom);
+       void    SetEdgeLeftLegend(int left);
+       void    SetEdgeRightLegend(int right);
+       void    ShowDataSet(bool show,int dataset);
+       
+       double  GetMinX()          { return m_MinX;       }
+    double  GetMaxX()          { return m_MaxX;       }
+       int     GetMaxValue()      { return m_MaxValue;   }
+       double  GetStepSizeX()     { return m_StepSizeX;  }
+    double  GetStepSizeY()     { return m_StepSizeY;  }
+    double  GetStepSizePer()   { return m_StepSizePer;}
+    int     GetValueCol()      { return m_ValueCol;   }
+    int     GetNumDataSet()    { return m_NumDataSet; }
+       int     GetNumItem()       { return m_NumItem;    }
+       bool    GetShowPer()       { return m_ShowPer;    }
+       int     GetLargeur()       { return m_MaxLargeur; }
+    int     GetHauteur()       { return m_MaxHauteur; }
+       int     GetEdgeTop()       { return m_EdgeTop;    }
+    int     GetEdgeBottom()    { return m_EdgeBottom; }
+    int     GetEdgeLeft()      { return m_EdgeLeft;   }
+    int     GetEdgeRight()     { return m_EdgeRight;  }
+       int     GetEdgeTopLegend()    { return m_EdgeTopLegend;    }
+    int     GetEdgeBottomLegend() { return m_EdgeBottomLegend; }
+    int     GetEdgeLeftLegend()   { return m_EdgeLeftLegend;   }
+    int     GetEdgeRightLegend()  { return m_EdgeRightLegend;  }
+       bool    GetShowDataSet(int dataset);
+  
+   DECLARE_EVENT_TABLE()
+};
+
+#endif // wx_chart_h
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/Histogram.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/Histogram.cxx
new file mode 100644 (file)
index 0000000..5e56df7
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ This class plots image's histograms in a plotter
+*/
+
+ //---------------------
+ // Includes
+ //----------------------
+ #include "Histogram.h"
+ #include  "vtkImageCast.h"
+ #include  <math.h>
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+       #ifndef WX_PRECOMP
+       #include <wx/wx.h>
+       #endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(Histogram, wxWindow)
+//----------------------------------------------------------------------------
+// Event Table
+//----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(Histogram, wxWindow)
+       EVT_SIZE  (Histogram::OnSize)
+END_EVENT_TABLE()
+ //---------------------
+ // Constructor
+ //----------------------
+
+       Histogram::Histogram( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag,vtkImageData* imageData):
+       wxPanel(parent,id,pos,size,flag)
+       {
+                SetBackgroundColour(wxColour(255,255,255));
+               //histogram
+               histogram= new pHistogram(imageData);
+               
+               //plotter
+               plotter=new pPlotterWindow(this, -1, wxPoint(0,0), wxSize(742,476), wxSUNKEN_BORDER );
+               
+               plotter->AddLayer(new pPlotterScaleX());
+               plotter->AddLayer(new pPlotterScaleY());
+               //is a plotter of histograms
+               plotter->setType(2);
+               //setting the popMenu
+               plotter->setPopUpMenu(true,true,true,true,true,true,false,false,false,false,false,false,false);
+               histogramSize=0;
+               
+               idHistogram=-1;
+               
+               //drawing
+               drawHistogram();
+               
+               
+       }
+
+       Histogram::~Histogram()
+       {
+               delete histogram;
+               delete plotter;
+
+       }
+       /*
+       Draw the histogram in the plotter
+       */
+       void Histogram::drawHistogram()
+       {
+               //int xValues[MAX],yValues[MAX],extent[6];
+               double* xValues;
+               double* yValues;
+               
+               vtkImageData* histogramImageData=histogram->getHistogram();
+               
+               //size
+               histogramSize=histogram->getSize();
+
+               //plotting
+               xValues=(double*)malloc(NUM_POINTS*sizeof(double));
+               yValues=(double*)malloc(NUM_POINTS*sizeof(double));
+               
+               unsigned short* histogramPointer=(unsigned short*)histogramImageData->GetScalarPointer(0,0,0);
+               
+               for(int i=0; i< histogramSize; i++)
+               {
+                       xValues[i]=i;
+                       yValues[i]=log( (double) histogramPointer[i])*10;
+               }
+
+               
+               pGraphicalFunction* histogramFunction=plotter->getFunctionForVectors(xValues,histogramSize,yValues,histogramSize);
+               
+               if (histogramFunction)
+               {
+                       histogramFunction->setEditable(false);
+                       //smooth function
+                       histogramFunction->setType(2);
+                       //it is an histogram
+                       histogramFunction->setmType(2);
+                       idHistogram=plotter->addFunction(histogramFunction);
+                       //for setting range the vision
+                       plotter->addFunctionToMove(histogramFunction);
+                       wxPen mypen1(*wxBLUE, 1, wxSOLID );
+                       mypen1.SetWidth(2);
+                       histogramFunction->SetPen( mypen1 );
+               }
+               
+               
+                       free(xValues);
+                       free(yValues);
+               
+               //plotter->setPopUpMenu(true,true,false,false,true,true,false,false,false,false,false,false,false);
+       }
+       
+       /*
+               if the user resize the window   
+       */
+       void Histogram::OnSize(wxSizeEvent &WXUNUSED(event))
+       {
+               int scrX,scrY;
+               GetClientSize(&scrX,&scrY);
+               plotter->SetSize(scrX,scrY);
+               /*
+               pGraphicalFunction* actual=plotter->getFunction(idTransferenceFunction);
+               actual->setScreens(scrX,scrY);
+               actual->setScales();
+               */
+       }
+       
+       /*
+               get a point of the Histogram
+               given the grey value
+       */
+       int Histogram::getHistogramPoint(int gValue)
+       {
+               return histogram->getHistogramPoint(gValue);
+       }
+       
+
+       //-------------------
+       // Getter and setters
+       //-------------------
+
+       int Histogram::getHistogramSize()
+       {
+               return histogramSize;
+       }
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/Histogram.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/Histogram.h
new file mode 100644 (file)
index 0000000..5138dc6
--- /dev/null
@@ -0,0 +1,81 @@
+
+
+#ifndef __HISTOGRAMW1__
+#define __HISTOGRAMW1__
+
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include "pPlotterWindow.h"
+#include "pFunctionPoint.h"
+#include  "vtkImageData.h"
+#include "pHistogram.h"
+#include "pPlotterScaleY.h"
+#include "pPlotterScaleX.h"
+
+#define MAX 500
+#define NUM_POINTS 100
+#define WINDOW_SIZE 10
+
+class Histogram:public wxPanel
+{
+public:
+       //---------------------
+       // Constructor
+       //----------------------
+
+       //HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag );
+       
+       Histogram( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag,vtkImageData* imageData);
+       
+       ~Histogram();
+
+       /*
+       Draw the histogram in the plotter
+       */
+       void drawHistogram();
+       /*
+               if the user resize the window   
+       */
+       void OnSize( wxSizeEvent &WXUNUSED(event) );
+       //---------------------------------------
+       // Get Information from the widget
+       //---------------------------------------
+       
+       /*
+               get a point of the Histogram
+               given the grey value
+       */
+       int getHistogramPoint(int gValue);
+       int getHistogramSize();
+       
+       
+private:
+       
+        pHistogram*            histogram;
+        pPlotterWindow*        plotter;
+        int                            histogramSize;
+        int                             idHistogram;
+        
+        
+        DECLARE_CLASS(Histogram);
+        //----------------------------------------------------------------------------
+       // wxWidget macro use declaration for handdling events
+       //----------------------------------------------------------------------------
+       DECLARE_EVENT_TABLE()
+       
+};
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx
new file mode 100644 (file)
index 0000000..7c5675b
--- /dev/null
@@ -0,0 +1,490 @@
+#include "HistogramDialog.h"
+#include <vector>
+
+// IMPLEMENT_CLASS(HistogramDialog, wxDialog)
+
+
+//id for events
+enum {
+    ID_SAVE  = 108,
+       ID_LOAD,
+       ID_REFRESH
+};
+
+//-------------------------
+//Constructor
+//-------------------------
+HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* imageData,int type)
+:wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE   ,_T("dialogBox"))
+{
+
+       _ctfun=NULL;
+       _tfun=NULL;
+
+       SetBackgroundColour(wxColour(255,255,255));
+       /*
+       Pointers
+       */
+       wxvtkmpr3Dview=NULL;
+       wxvtkclipping3Dview=NULL;
+       
+       /*
+        Histogram
+       */
+       
+       histogramW=new HistogramWidget(this, -1, wxPoint(0,0), wxSize(400,400),wxNO_BORDER ,imageData,type);
+       
+       refreshed=false;
+
+       /*
+       Buttons
+       */
+       okBtn = new wxButton(this,wxID_OK ,_T("OK"));
+       cancelBtn = new wxButton(this,wxID_CANCEL,_T("Cancel"));
+       
+       saveDataBtn = new wxButton(this,ID_SAVE,_T("Save"));
+       loadDataBtn = new wxButton(this,ID_LOAD,_T("Load"));
+       refreshBtn = new wxButton(this,ID_REFRESH,_T("Refresh"));
+       
+       Connect(saveDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnSaveData       );
+       Connect(loadDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnLoadData       );
+       Connect(refreshBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnRefreshBtn      );
+       
+       //-------------------
+       //GUI
+       //-------------------
+       
+       //Upper Box
+       wxBoxSizer * upper_box = new wxBoxSizer( wxHORIZONTAL );
+       //Including components for plotter control
+       upper_box->Add( histogramW, 4, wxGROW);
+       
+
+       //bottom Sizer
+       wxBoxSizer *bottomBox = new wxBoxSizer( wxHORIZONTAL );
+       bottomBox->Add( okBtn, wxSizerFlags().Center());
+       bottomBox->AddSpacer(40);
+       bottomBox->Add( saveDataBtn,wxSizerFlags().Center() );
+       bottomBox->AddSpacer(40);
+       bottomBox->Add( loadDataBtn,wxSizerFlags().Center() );
+       bottomBox->AddSpacer(40);
+       bottomBox->Add( refreshBtn,wxSizerFlags().Center() );
+       bottomBox->AddSpacer(40);
+       bottomBox->Add( cancelBtn,wxSizerFlags().Center() );
+       //Sizer
+       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add(upper_box,1,wxEXPAND);       
+    sizer->Add(bottomBox,0,wxCENTER);
+       SetAutoLayout( TRUE );
+       SetSizer( sizer );
+       SetBestSize(wxSize(600,600));
+}
+
+//-----------------------
+//Handling events
+//-----------------------
+
+void HistogramDialog::OnSaveData(wxCommandEvent& event)
+{
+       wxString nameF=wxFileSelector(_T("Save Data"), _T(" "),_T(""),_T(""),_T("*.*"),wxSAVE, NULL, -1,  -1);//wxFileSelector(_T("Save Data"),wxSAVE);
+       std::ofstream file;
+       if(nameF.CompareTo( _T("/0") )>0)
+               file.open( (const char*)(nameF.mb_str()) );
+
+       if(file.is_open())
+       {
+               file << "<histogram Data>" << std::endl;
+               //histograms points
+               /*
+               file << "       <histogramPoints>" << std::endl;
+               int histogramS=histogramW->getHistogramSize();
+               int i=0;        
+               while(i<histogramS)
+               {
+                       file << "               <HistogramPoint>" << std::endl;
+                       file << "                       <greyValue>" << i << "</greyValue>" <<std::endl;
+                       file << "                       <number>" << histogramW->getHistogramPoint(i) << "</number>"<<std::endl;
+                       file << "               </HistogramPoint>" << std::endl;
+                       i++;
+               }
+               file << "       </histogramPoints>" << std::endl;
+               */
+               //points transference Function
+               file << " <TransferenceFunction>"<< std::endl;
+               int tfPointS=histogramW->getSizeTransferenceFunction();
+               int i=0;
+               int gv,in;
+               while(i<tfPointS)
+               {
+                       
+                       histogramW->getTransferenceFunctionPoint(i,gv,in);
+                       file << "               <Transferencepoint>" << std::endl;
+                       file << "                       <greyValue>" << gv << "</greyValue>" <<std::endl;
+                       file << "                       <intensity>" << in << "</intensity> "<<std::endl;
+                       file << "               </Transferencepoint>" << std::endl;
+                       i++;
+               }
+               file << "       </TransferenceFunction>"<< std::endl;
+               //colorPoints
+               file << "       <Colors>"<< std::endl;
+               int ctfPointS=histogramW->getSizeBarColor();
+
+               i=0;
+               int red,green,blue;
+               while(i<ctfPointS)
+               {
+                       
+                       histogramW->getDataBarColorPoint(i,gv,red,green,blue);
+                       file << "               <greyValueRGBpoint>" << std::endl;
+                       file << "                       <RGBgreyValue>" << gv << "</RGBgreyValue>" <<std::endl;
+                       file << "                       <red>" << red << "</red>" <<std::endl;
+                       file << "                       <green>" << green << "</green>" <<std::endl;
+                       file << "                       <blue>" << blue << "</blue>" <<std::endl;
+                       file << "               </greyValueRGBpoint>" << std::endl;
+                       i++;
+               }
+
+               file << "       </Colors>"<< std::endl;
+               file << "</histogram Data>" << std::endl;
+       }
+       file.close();
+}
+
+void HistogramDialog::OnLoadData(wxCommandEvent& event)
+{
+       wxString nameF=wxFileSelector(_T("Load Data") );
+       //std::string line;
+       std::ifstream file;
+       if(nameF.CompareTo( _T("/0") )>0)
+               file.open(  (const char*) (nameF.mb_str()) );
+       
+       bool histogramReading=false,histogramPoints=false,histogramPoint=false,tf=false,ctf=false,tfp=false,ctfp=false;
+       int gv=-1,in=-1,red=-1,gr=-1,bl=-1,nPoints=-1;
+       if(file.is_open())
+       {
+               //-------------
+               erasePointsTransferenceFunction();
+               eraseColorPoints();
+               //--------------
+       
+               //std::getline(file,line);
+               int i=0;
+               while(!file.eof())
+               {
+                       std::string line;
+                       std::getline(file,line);
+                       //int a=line.find("histogram Data");
+                       if(line.find("histogram Data")!=-1)
+                       {
+                               histogramReading=true;
+                       
+                       }
+                       /*
+                       else if(line.find("histogramPoints")!=0 && histogramReading)
+                       {
+                               histogramPoints=true;
+                       }
+                       else if(line.find("histogramPoint")!=0 && histogramReading && histogramPoints)
+                       {
+
+                       }
+                       else if(line.find("greyValue")!=0 && histogramReading && histogramPoints)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos+1);
+                               std::string x=line.substr(pos1+1,pos2-1);
+                               gv=atoi(x.c_str());
+                       }
+                       else if(line.find("number")!=0 && histogramReading && histogramPoints)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos+1);
+                               std::string x=line.substr(pos1+1,pos2-1);
+                               nP=atoi(x.c_str());
+                               //add to the histogram
+                               //histogramW->addPointToTransferenceFunction(gc,in);
+                       }
+                       */
+                       else if(line.find("TransferenceFunction")!=-1 && histogramReading)
+                       {
+                               tf=true;
+                       }
+                       else if(line.find("<Transferencepoint>")!=-1 && histogramReading && tf)
+                       {
+                               tfp=true;
+                       }
+                       else if(line.find("greyValue")!=-1 && histogramReading && tf && tfp)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos1+1);
+                               std::string x=line.substr(pos1+1,pos2-pos1-1);
+                               gv=atoi(x.c_str());
+                               
+                       }
+                       else if(line.find("intensity")!=-1 && histogramReading && tf && tfp)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos1+1);
+                               std::string x=line.substr(pos1+1,pos2-pos1-1);
+                               in=atoi(x.c_str());
+                               histogramW->addPointToTransferenceFunction(gv,in);
+                               tfp=false;
+                               
+                       }
+                       else if(line.find("Colors")!=-1 && histogramReading)
+                       {
+                               ctf=true;
+                       }
+                       
+                       else if(line.find("greyValueRGBpoint")!=-1 && histogramReading && ctf )
+                       {
+                               ctfp=true;
+                               
+                       }
+                       else if(line.find("RGBgreyValue")!=-1 && histogramReading && ctf && ctfp)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos1+1);
+                               std::string x=line.substr(pos1+1,pos2-pos1-1);
+                               gv=atoi(x.c_str());
+                               
+                       }
+                       else if(line.find("red")!=-1 && histogramReading && ctf && ctfp)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos1+1);
+                               std::string x=line.substr(pos1+1,pos2-pos1-1);
+                               red=atoi(x.c_str());
+                               
+                       }
+                       else if(line.find("green")!=-1 && histogramReading && ctf && ctfp)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos1+1);
+                               std::string x=line.substr(pos1+1,pos2-pos1-1);
+                               gr=atoi(x.c_str());
+                       }
+                       else if(line.find("blue")!=-1 && histogramReading && ctf && ctfp)
+                       {
+                               int pos1=line.find(">");
+                               int pos2=line.find("<",pos1+1);
+                               std::string x=line.substr(pos1+1,pos2-pos1-1);
+                               bl=atoi(x.c_str());
+                               histogramW->addColorPoint(gv,red,gr,bl);
+                               ctfp=false;
+                       }
+                       line.clear();
+            }
+     }
+       
+       file.close();
+       histogramW->updatePlotter();
+}
+/*
+ On refresh btn
+*/
+
+void HistogramDialog::OnRefreshBtn(wxCommandEvent &event)
+{
+       refreshed=true;
+                       
+                       int i=0,xi,yi,r,g,b;
+                       
+                       // -- TransferenceFunction --
+                       int nPointsTF=getSizeTransferenceFunction();
+
+                       if(nPointsTF>0)
+                       {
+
+                               int nTFPoints=getSizeTransferenceFunction();
+                               i=0;
+                               while(i<nTFPoints)
+                               {
+                                       getTransferenceFunctionPoint(i,xi,yi);
+                                       _tfun->AddPoint( xi , yi/100.0 );
+                                       i++;
+                               }
+                       }
+                       //-- Color bar --
+                       //clean colors
+                       int nPointsCTF=getSizeBarColor();
+                       if(nPointsCTF>0)
+                       {                       
+                               _ctfun->RemoveAllPoints();
+                               
+                               int nCTFpoints=getSizeBarColor();
+                               i=0;    
+                               while(i<nCTFpoints)
+                               {
+                                       getDataBarColorPoint(i,xi,r,g,b);
+                                       _ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
+                                       i++;
+                               }
+                       }
+
+//EED Borrame
+
+       /*
+        NOTE I NEED THE UPDATE
+       */
+       //if it was call from the clipping ctnrl panel
+       if(wxvtkclipping3Dview!=NULL)
+       {
+               wxvtkclipping3Dview->Refresh();
+
+       }
+       else if(wxvtkmpr3Dview!=NULL)
+       {
+               wxvtkmpr3Dview->Refresh();
+
+       }
+}
+
+
+//-----------------------
+//Methods
+//-----------------------
+
+/*
+               get number of points of the transference function
+       */
+       int HistogramDialog::getSizeTransferenceFunction()
+       {
+               return histogramW->getSizeTransferenceFunction();
+               
+       }
+       /*
+               get number of points of the barColor
+       */
+       int HistogramDialog::getSizeBarColor()
+       {
+               return histogramW->getSizeBarColor();
+       }
+       /*
+               get a point of the transference function
+       */
+       void HistogramDialog::getTransferenceFunctionPoint(int index,int& x,int& y)
+       {
+               histogramW->getTransferenceFunctionPoint(index,x,y);
+       }
+       /*
+               get a  color int the bqr color
+       */
+       void HistogramDialog::getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue)
+       {
+               histogramW->getDataBarColorPoint(index,x,red,green,blue);
+       }
+       /*
+               get a point of the Histogram
+               given the grey value
+       */
+       int HistogramDialog::getHistogramPoint(int gValue)
+       {
+               return histogramW->getHistogramPoint(gValue);
+       }
+
+       //--------------------
+       // bar Information
+       //---------------------
+       /*
+        Get the porcentage of the positions of 
+        the min,max and actual in the bar range
+       */
+       float HistogramDialog::getMaxShowedPorcentage()
+       {
+               return histogramW->getMaxShowedPorcentage();
+       }
+       float HistogramDialog::getMinShowedPorcentage()
+       {
+               return histogramW->getMinShowedPorcentage();
+       }
+       float HistogramDialog::getActualShowedPorcentage()
+       {
+               return histogramW->getActualShowedPorcentage();
+       }
+       //---------------------------------------
+       // setting data in transferences function
+       // and in bar color
+       //----------------------------------------
+       bool  HistogramDialog::addPointToTransferenceFunction(double x, double y)
+       {
+               return histogramW->addPointToTransferenceFunction(x,y);
+       }
+       bool  HistogramDialog::addColorPoint(double x,int red,int green, int blue)
+       {
+               return histogramW->addColorPoint(x,red,green,blue);
+       }
+       //------------------------
+       //Erase data
+       //------------------------
+       
+       /*
+        Erase all the points that are in the transference function
+       */
+       void HistogramDialog::erasePointsTransferenceFunction()
+       {
+               histogramW->erasePointsTransferenceFunction();
+       }
+       /*
+       Erase the  color points in the plotter
+       */
+       void HistogramDialog::eraseColorPoints()
+       {
+               histogramW->eraseColorPoints();
+       }
+
+       //-------------------
+       // Getter and setters
+       //-------------------
+
+       void HistogramDialog::setCTF(vtkColorTransferFunction *cf)
+       {
+               _ctfun=cf;
+       
+       }
+       void HistogramDialog:: setTF(vtkPiecewiseFunction *tf)
+       {
+               _tfun=tf;
+       }
+
+       bool HistogramDialog::getRefreshed()
+       {
+               return refreshed;
+       }
+       
+       void HistogramDialog::setVolumeMapper(vtkVolumeRayCastMapper* volMapper)
+       {
+               volumeMapper=volMapper;
+       }
+       void HistogramDialog::setVolume(vtkVolume* vol)
+       {
+               newvol=vol;     
+       }
+       void HistogramDialog::setMPR3Dview(wxVtkMPR3DView *wxvtkmpr3Dview1)
+       {
+               wxvtkmpr3Dview=wxvtkmpr3Dview1;
+       }
+       void HistogramDialog::setClipping3DView(wxVtkClipping3DView *wxvtkclipping3Dview1)
+       {
+               wxvtkclipping3Dview=wxvtkclipping3Dview1;
+       }
+
+
+       void  HistogramDialog::setTransferenceFunctionHasPoints(bool hasPoints)
+       {
+               histogramW->setTransferenceFunctionHasPoints(hasPoints);
+       }
+       void  HistogramDialog::setTransferenceFunctionHasColor(bool hasColorPoints)
+       {
+               histogramW->setTransferenceFunctionHasColor(hasColorPoints);
+       }
+
+       //--------------------
+       // plotter Information
+       //---------------------
+       void  HistogramDialog::updatePlotter()
+       {
+               histogramW->updatePlotter();
+       }
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.h
new file mode 100644 (file)
index 0000000..a23cd3b
--- /dev/null
@@ -0,0 +1,178 @@
+
+#ifndef __HISTOGRAMSDIALOG__
+#define __HISTOGRAMSDIALOG__
+
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+ //---------------------
+ // Includes
+ //----------------------
+ #include "HistogramWidget.h"
+ #include "vtkImageData.h"     
+ //#include <vector>
+ #include <vtkPiecewiseFunction.h>
+ #include <vtkColorTransferFunction.h>
+ #include <vtkVolumeRayCastMapper.h>
+ #include <vtkVolume.h>
+ #include "../wxMPRWidget.h"
+
+class HistogramDialog:public wxDialog
+{
+public:
+       /*
+        Constructor
+       */
+       HistogramDialog(wxWindow *parent,wxString title,vtkImageData* imageData,int type);
+       /*
+        Methods
+       */
+       /*
+               get number of points of the transference function
+       */
+       int getSizeTransferenceFunction();
+       /*
+               get number of points of the barColor
+       */
+       int getSizeBarColor();
+       /*
+               get a point of the transference function
+       */
+       void getTransferenceFunctionPoint(int index,int& x,int& y);
+       /*
+               get a  color int the bqr color
+       */
+       void getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue);
+       /*
+               get a point of the Histogram
+               given the grey value
+       */
+       int getHistogramPoint(int gValue);
+
+       //--------------------
+       // bar Information
+       //---------------------
+       /*
+        Get the porcentage of the positions of 
+        the min,max and actual in the bar range
+       */
+       float getMaxShowedPorcentage();
+       float getMinShowedPorcentage(); 
+       float getActualShowedPorcentage();
+
+       //---------------------------------------
+       // setting data in transferences function
+       // and in bar color
+       //----------------------------------------
+       /*
+         Adds a point to the transference function
+       */
+       bool addPointToTransferenceFunction(double x, double y);
+       /*
+               add a color point to the histogram
+               @param x the level of grey to which the color is assigned
+               @param red the level of red for the color
+               @param green the level of red for the color
+               @param blue the level of red for the color
+       */
+       bool addColorPoint(double x,int red,int green, int blue);
+       //------------------------
+       //Erase data
+       //------------------------
+       
+       /*
+        Erase all the points that are in the transference function
+       */
+       void erasePointsTransferenceFunction();
+       void eraseColorPoints();
+       //-------------------
+       // Getter and setters
+       //-------------------
+
+       void setTransferenceFunctionHasPoints(bool hasPoints);
+       void setTransferenceFunctionHasColor(bool hasColorPoints);
+       
+       //returns if the user has pressed refresh       
+       
+       bool getRefreshed();
+       void setCTF(vtkColorTransferFunction* cf);
+       void setTF(vtkPiecewiseFunction* tf);
+       void setVolumeMapper(vtkVolumeRayCastMapper* volMapper);
+       void setVolume(vtkVolume* vol);
+       void setMPR3Dview(wxVtkMPR3DView *wxvtkmpr3Dview1);
+       void setClipping3DView(wxVtkClipping3DView *wxvtkclipping3Dview1);
+
+       //--------------------
+       // plotter Information
+       //---------------------
+       void updatePlotter();
+       
+       //-----------------------
+       //Handling events
+       //-----------------------
+
+       void OnSaveData(wxCommandEvent& event);
+       void OnLoadData(wxCommandEvent& event);
+       void OnRefreshBtn(wxCommandEvent& event);
+       
+private:
+       /*
+       Histogram Widget
+       */
+       HistogramWidget*  histogramW;
+
+       /*
+        ok Button
+       */
+       wxButton                *okBtn;
+       /*
+        cancel Button
+       */
+       wxButton                *cancelBtn;
+       /*
+        save Button
+       */
+       wxButton                *saveDataBtn;   
+       /*
+       Load Button
+       */
+       wxButton                *loadDataBtn;
+       /*
+       Refresh Button
+       */
+       wxButton                *refreshBtn;
+
+       
+       
+       // the user had pressed refresh
+       bool refreshed;
+       
+       vtkColorTransferFunction                        *_ctfun;
+       vtkPiecewiseFunction                            *_tfun;
+       vtkVolumeRayCastMapper                          *volumeMapper; 
+       vtkVolume                                                       *newvol;
+
+       //things to refresh
+       wxVtkMPR3DView                                          *wxvtkmpr3Dview;
+       wxVtkClipping3DView                                     *wxvtkclipping3Dview;
+       
+       
+//     DECLARE_CLASS(HistogramDialog);
+       // any class wishing to process wxWindows events must use this macro
+       //DECLARE_EVENT_TABLE()
+};
+
+#endif
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.cxx
new file mode 100644 (file)
index 0000000..4febab2
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ This class plots image's histograms in a plotter
+*/
+
+ //---------------------
+ // Includes
+ //----------------------
+ #include "HistogramWidget.h"
+ #include  "vtkImageCast.h"
+ #include  <math.h>
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+       #ifndef WX_PRECOMP
+       #include <wx/wx.h>
+       #endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(HistogramWidget, wxWindow)
+//----------------------------------------------------------------------------
+// Event Table
+//----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(HistogramWidget, wxWindow)
+       EVT_SIZE  (HistogramWidget::OnSize)
+END_EVENT_TABLE()
+ //---------------------
+ // Constructor
+ //----------------------
+//wxScrolledWindow(wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxHSCROLL | wxVSCROLL, const wxString& name = "scrolledWindow")
+//wxWindow(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxPanelNameStr)
+//pPlotterWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag )
+/*
+HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag):wxWindow(parent,id,pos,size,flag)
+       {
+       }
+ */
+       HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag,vtkImageData* imageData,int type):
+       wxPanel(parent,id,pos,size,flag)
+       {
+                SetBackgroundColour(wxColour(255,255,255));
+               //histogram
+               histogram= new pHistogram(imageData);
+               
+               //plotter
+               plotter=new pPlotter(this, 400,350);
+
+               //is a plotter of histograms
+               plotter->setType(2);
+               //setting the popMenu
+               plotter->setPopUpMenu(true,true,true,true,true,true,false,false,false,false,false,false,false);
+               histogramSize=0;
+               idTransferenceFunction=-1;
+               idHistogram=-1;
+               transferenceFunctionHasColor=true;
+               transferenceFunctionHasPoints=true;
+               this->type=type;;
+               
+               //drawing
+               drawHistogram();
+               drawTransferenceFunction();
+               
+       }
+
+       HistogramWidget::~HistogramWidget()
+       {
+               delete histogram;
+               delete plotter;
+
+       }
+       /*
+       Draw the histogram in the plotter
+       */
+       void HistogramWidget::drawHistogram()
+       {
+               //int xValues[MAX],yValues[MAX],extent[6];
+               double* xValues;
+               double* yValues;
+               
+               vtkImageData* histogramImageData=histogram->getHistogram();
+               
+               //size
+               histogramSize=histogram->getSize();
+
+               //plotting
+               xValues=(double*)malloc(NUM_POINTS*sizeof(double));
+               yValues=(double*)malloc(NUM_POINTS*sizeof(double));
+               
+               unsigned short* histogramPointer=(unsigned short*)histogramImageData->GetScalarPointer(0,0,0);
+               
+               for(int i=0; i< histogramSize; i++)
+               {
+                       xValues[i]=i;
+                       yValues[i]=log( (double) histogramPointer[i]);
+               }
+
+               
+               pGraphicalFunction* histogramFunction=plotter->getFunctionForVectors(xValues,histogramSize,yValues,histogramSize);
+               
+               if (histogramFunction)
+               {
+                       histogramFunction->setEditable(false);
+                       //smooth function
+                       histogramFunction->setType(2);
+                       //it is an histogram
+                       histogramFunction->setmType(2);
+                       idHistogram=plotter->addFunction(histogramFunction);
+                       //for setting range the vision
+                       plotter->addFunctionToMove(histogramFunction);
+                       wxPen mypen1(*wxBLUE, 1, wxSOLID );
+                       mypen1.SetWidth(2);
+                       histogramFunction->SetPen( mypen1 );
+               }
+                       
+                       free(xValues);
+                       free(yValues);
+               
+       }
+       /*
+       Draw the transference function in the plotter
+       one  for default
+       */
+       void HistogramWidget::drawTransferenceFunction()
+       {
+       
+                       double xValues[5],yValues[5];
+                       //xValues
+                       int maxValueGrey=histogram->getMaximumLevelOfGrey();
+                       xValues[0]=0;
+                       xValues[1]=maxValueGrey/16;
+                       xValues[2]=maxValueGrey/8;
+                       xValues[3]=maxValueGrey/16+(maxValueGrey-maxValueGrey/2)/2;
+                       xValues[4]=maxValueGrey;
+                       
+                       //yValues
+                       yValues[0]=0;
+                       yValues[1]=25;
+                       yValues[2]=100;
+                       yValues[3]=25;
+                       yValues[4]=0;
+                       
+                       pGraphicalFunction * tf = plotter ->getFunctionForVectors( xValues, 5, yValues, 5 ); 
+                       // Including and drawing the created function in the plotter
+                       if (tf)
+                       {
+                               tf->setType(1);
+                               //is the actual Function
+                               tf->setActual(true);
+                               //show points
+                               tf->SetShowPoints(true);
+                               idTransferenceFunction=plotter->addFunction( tf );
+                               if(type==1)
+                                       plotter->addFunctionToMove(tf);
+                               wxPen mypen(*wxBLACK,0.5, wxSOLID  );
+                               mypen.SetWidth(2);
+                               tf->SetPen( mypen );
+                       }
+       }
+
+       /*
+               if the user resize the window   
+       */
+       void HistogramWidget::OnSize(wxSizeEvent &WXUNUSED(event))
+       {
+               int scrX,scrY;
+               GetClientSize(&scrX,&scrY);
+               plotter->SetSize(scrX,scrY);
+               pGraphicalFunction* actual=plotter->getFunction(idTransferenceFunction);
+               actual->setScreens(scrX,scrY);
+               actual->setScales();
+               
+       }
+       /*
+               get number of points of the transference function
+       */
+       int HistogramWidget::getSizeTransferenceFunction()
+       {
+               pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
+               return tf->getSizePoints();
+
+       }
+       /*
+               get a point of the transference function
+       */
+       void HistogramWidget::getTransferenceFunctionPoint(int index,int& x,int& y)
+       {
+               pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
+               if(tf)
+               {
+                       wxNode* pnode=tf->GetPointAt(index);
+                       pFunctionPoint* point=(pFunctionPoint*)pnode->GetData();
+                       x=point->getRealX();
+                       y=point->getRealY();
+               }
+       }
+       /*
+               get a point of the Histogram
+               given the grey value
+       */
+       int HistogramWidget::getHistogramPoint(int gValue)
+       {
+               return histogram->getHistogramPoint(gValue);
+       }
+       /*
+               get number of points of the barColor
+       */
+       int HistogramWidget::getSizeBarColor()
+       {
+               return  plotter->getColorPointsSize();
+       }
+       /*
+               get a  color int the bqr color
+       */
+       void HistogramWidget:: getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue)
+       {
+               double tmp=x;
+               plotter->getBarColorDataAt(index,tmp,red,green,blue);
+               x=(int)tmp;
+       }
+       /*
+        Returns the  maximum value ot the histogram that is show to the user 
+       */
+       float HistogramWidget::getMaxShowedPorcentage()
+       {
+               float  porcentageMaxX=plotter->getMaxShowedPorcentage();
+               pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
+               int min=histogramFunction->getMinX();
+               float x=porcentageMaxX*(histogramFunction->getMaxX()-min);
+               return min+ x;
+       }
+       /*
+        Returns the  minimum value ot the histogram that is show to the user 
+       */
+       float HistogramWidget::getMinShowedPorcentage()
+       {
+               float  porcentageMinX=plotter->getMinShowedPorcentage();
+               pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
+               int min=histogramFunction->getMinX();
+               float x=porcentageMinX*(histogramFunction->getMaxX()-min);
+               return min+ x;
+       }
+       /*
+        Returns the  minimum value ot the histogram that is show to the user 
+       */
+       float HistogramWidget::getActualShowedPorcentage()
+       {
+               float  porcentageActualX=plotter->getMinShowedPorcentage();
+               pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
+               int min=histogramFunction->getMinX();
+               float x=porcentageActualX*(histogramFunction->getMaxX()-min);
+               return min+ x;
+       }
+       //---------------------------------------
+       // setting data in transferences function
+       // and in bar color
+       //----------------------------------------
+       /*
+         Adds a point to the transference function
+       */
+       bool  HistogramWidget::addPointToTransferenceFunction(double x, double y)
+       {
+               pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
+               return tf->AddPoint(x,y);
+       }
+       /*
+               add a color point to the histogram
+               @param x the level of grey to which the color is assigned
+               @param red the level of red for the color
+               @param green the level of red for the color
+               @param blue the level of red for the color
+       */
+       bool  HistogramWidget::addColorPoint(double x,int red,int green, int blue)
+       {
+               return plotter->addColorPoint(x,red,green,blue);
+       }
+        
+       //------------------------
+       //Erase data
+       //------------------------
+       /*
+        Erase all the points that are in the transference function
+       */
+
+       void HistogramWidget::erasePointsTransferenceFunction(/*bool allPoints*/)
+       {
+               if(transferenceFunctionHasPoints)
+               {
+                       // we have to erase the points
+                       pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
+                       int numOfPoints=tf->getSizePoints();
+                       int i=numOfPoints-1;//-2;
+                       while(i>=0)
+                       {
+                               tf->deletePointAt(i);
+                               i--;
+                       }
+                       
+               }
+               
+       //we set for actual the histogram
+               //plotter->setActual()
+       }
+       /*
+       Erase the  color points in the plotter
+       */
+       void HistogramWidget::eraseColorPoints()
+       {
+               plotter->eraseColorPoints();
+       }
+       //------------------
+       //Updating plotter
+       //------------------
+       void HistogramWidget::updatePlotter()
+       {
+               plotter->update();
+       }
+
+       //-------------------
+       // Getter and setters
+       //-------------------
+
+       void HistogramWidget::setTransferenceFunctionHasPoints(bool hasPoints)
+       {
+               transferenceFunctionHasPoints=hasPoints;
+       }
+
+       void HistogramWidget::setTransferenceFunctionHasColor(bool hasColorPoints)
+       {
+               transferenceFunctionHasPoints=hasColorPoints;
+       }
+       int HistogramWidget::getHistogramSize()
+       {
+               return histogramSize;
+       }
+       void HistogramWidget::setType(int type)
+       {
+               this->type=type;
+       }
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.h
new file mode 100644 (file)
index 0000000..ff2d803
--- /dev/null
@@ -0,0 +1,167 @@
+
+
+#ifndef __HISTOGRAMW__
+#define __HISTOGRAMW__
+
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include "pPlotter.h"
+#include "pFunctionPoint.h"
+#include  "vtkImageData.h"
+#include "pHistogram.h"
+#include "pPlotterScaleY.h"
+#include "pPlotterScaleX.h"
+
+#define MAX 500
+#define NUM_POINTS 100
+#define WINDOW_SIZE 10
+
+class HistogramWidget:public wxPanel
+{
+public:
+       //---------------------
+       // Constructor
+       //----------------------
+
+       //HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag );
+       
+       HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag,vtkImageData* imageData,int type);
+       
+       ~HistogramWidget();
+
+       /*
+       Draw the histogram in the plotter
+       */
+       void drawHistogram();
+       /*
+       Draw the transference function in the plotter
+       */
+       void drawTransferenceFunction();
+       /*
+               if the user resize the window   
+       */
+       void OnSize( wxSizeEvent &WXUNUSED(event) );
+       //---------------------------------------
+       // Get Information from the widget
+       //---------------------------------------
+       /*
+               get number of points of the transference function
+       */
+       int getSizeTransferenceFunction();
+       /*
+               get number of points of the barColor
+       */
+       int getSizeBarColor();
+       /*
+               get a point of the transference function
+       */
+       void getTransferenceFunctionPoint(int index,int& x,int& y);
+       /*
+               get a  color int the bqr color
+       */
+       void getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue);
+       /*
+               get a point of the Histogram
+               given the grey value
+       */
+       int getHistogramPoint(int gValue);
+
+       //--------------------
+       // bar Information
+       //---------------------
+       /*
+        Get the porcentage of the positions of 
+        the min,max and actual in the bar range
+       */
+       float getMaxShowedPorcentage();
+       float getMinShowedPorcentage(); 
+       float getActualShowedPorcentage();      
+
+       //---------------------------------------
+       // setting data in transferences function
+       // and in bar color
+       //----------------------------------------
+       /*
+         Adds a point to the transference function
+       */
+       bool addPointToTransferenceFunction(double x, double y);
+       /*
+               add a color point to the histogram
+               @param x the level of grey to which the color is assigned
+               @param red the level of red for the color
+               @param green the level of red for the color
+               @param blue the level of red for the color
+       */
+       bool addColorPoint(double x,int red,int green, int blue);
+       //--------------------
+       // plotter Information
+       //---------------------
+       void updatePlotter();
+       
+       //------------------------
+       //Erase data
+       //------------------------
+       
+
+       /*
+        Erase all the points that are in the transference function
+       */
+       void erasePointsTransferenceFunction();
+       /*
+       Erase the  color points in the plotter
+       */
+       void eraseColorPoints();
+
+       //-------------------
+       // Getter and setters
+       //-------------------
+
+       void setTransferenceFunctionHasPoints(bool hasPoints);
+       void setTransferenceFunctionHasColor(bool hasColorPoints);
+       int getHistogramSize();
+       void setType(int type);
+
+
+
+private:
+       
+        pHistogram* histogram;
+        pPlotter* plotter;
+        int idTransferenceFunction;
+        int histogramSize;
+        int idHistogram;
+        /*
+         if the image has already a transference
+         function and color defines to that function
+         we have to draw it in the widget
+        */
+        bool transferenceFunctionHasPoints;
+        bool transferenceFunctionHasColor;
+        /*
+        * type=1 with transference function for moving
+        * type=2 without transference function for moving
+        */
+        int type;
+        
+        DECLARE_CLASS(HistogramWidget);
+        //----------------------------------------------------------------------------
+       // wxWidget macro use declaration for handdling events
+       //----------------------------------------------------------------------------
+       DECLARE_EVENT_TABLE()
+       
+};
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.cxx
new file mode 100644 (file)
index 0000000..642f0d6
--- /dev/null
@@ -0,0 +1,308 @@
+//------------------------------------------------------------------------------------------------------------
+// Class definition include
+//------------------------------------------------------------------------------------------------------------
+#include "LogicalColorBar.h"
+
+
+//------------------------------------------------------------------------------------------------------------
+// Class implementation
+//------------------------------------------------------------------------------------------------------------
+/** file LogicalColorBar.cxx */
+
+
+//------------------------------------------------------------------------------------------------------------
+// Constructors & Destructors
+//------------------------------------------------------------------------------------------------------------
+
+       LogicalColorBar :: LogicalColorBar () 
+       {
+               minValue = 0;
+               maxValue = 0;
+               bar_orientation = true;
+       }
+
+       LogicalColorBar :: ~ LogicalColorBar () 
+       {
+               //logicColorPoints.clear();
+       }
+
+//------------------------------------------------------------------------------------------------------------
+// Methods Implementation 
+//------------------------------------------------------------------------------------------------------------
+
+
+
+//
+       // Gets the first point
+       //
+       pColorPoint * LogicalColorBar :: getFirstPoint()
+       {
+               return logicColorPoints.front();
+       }
+
+
+       //
+       // Gets the last point
+       //
+       pColorPoint * LogicalColorBar :: getLastPoint()
+       {
+               return logicColorPoints.back();
+       }
+
+
+       double LogicalColorBar :: getMinValue()
+       {
+               return minValue;
+       }
+
+
+       void  LogicalColorBar :: setMinValue(double valueMin)
+       {
+               minValue = valueMin;
+       }
+
+
+       double LogicalColorBar :: getMaxValue()
+       {
+               return maxValue;
+       }
+
+
+       void LogicalColorBar :: setMaxValue(double valueMax)
+       {
+               maxValue = valueMax;
+       }
+
+
+       bool LogicalColorBar :: getOrientation()
+       {
+               return bar_orientation;
+       }
+
+       void LogicalColorBar :: setOrientation(bool orientation)
+       {
+               bar_orientation = orientation;
+       }
+
+       //
+       // Adds a color degrade point to the color bar.
+       // param xRealValue The real xValue of the point
+       // param theColour The assigned color for the point
+       // param temporalStart Indicates if the inserted point is the temporal startShowing point
+       // param temporalEnd Indicates if the inserted point is the temporal startShowing point
+       // return Returns true if the point was succesfully inserted.
+       ////
+       bool LogicalColorBar :: addColorPoint (double xRealValue, wxColour theColour )
+       {
+               bool addedPoint = false;
+               
+               if(xRealValue>=minValue && xRealValue<=maxValue)
+               {
+                       bool ifContinue = true;
+                       //pColorPoint * colorPoint, nextColorPoint;
+                       int maxIndex= logicColorPoints.size()-1;
+                       int nextIndex = 0;
+                       int nextX = 0;
+                       int i = 0;
+                                       
+                       std::vector <pColorPoint*>::iterator iter;
+                       std::vector <pColorPoint*>::iterator nextIter;
+                       pColorPoint * newColorPoint = new pColorPoint ( xRealValue, theColour, false );
+                       if(logicColorPoints.empty())
+                       {
+                               logicColorPoints.push_back(newColorPoint);
+                               addedPoint = true;
+                       }
+                       for ( iter = logicColorPoints.begin(); i<=maxIndex && !addedPoint; iter++ )
+                       {
+                               nextIter = iter;
+                               int before = (*iter)->getRealX() ;
+                               if(before>xRealValue && i==0)
+                               {
+                                       //Is the first point
+                                       logicColorPoints.insert( iter, newColorPoint );
+                                       addedPoint =true;
+                                       lastAddedPoint = newColorPoint;
+                               }
+                               else if(before<xRealValue && i==maxIndex)
+                               {
+                                       //Is the last point 
+                                       logicColorPoints.insert( iter+1, newColorPoint );       
+                                       addedPoint =true;
+                                       lastAddedPoint = newColorPoint;
+                               }
+                               else if(i<maxIndex)
+                               {
+                                       //
+                                       nextIter++;                     
+                                       int after = (*nextIter)->getRealX();                            
+                                       if( before < xRealValue && after> xRealValue)
+                                       {
+                                               logicColorPoints.insert( nextIter, newColorPoint );     
+                                               addedPoint =true;
+                                               lastAddedPoint = newColorPoint;
+                                       }
+                               }                               
+                               i++;
+                       }               
+               }
+               return addedPoint;              
+       }
+
+       bool LogicalColorBar :: deleteColorPoint ( double  valErase )
+       {
+               bool deletedPoint = false;              
+               std::vector <pColorPoint*>::iterator pointIterator = logicColorPoints.begin();
+               for(int i=0; i<logicColorPoints.size() && !deletedPoint; i++)
+               {
+                       pColorPoint  aPoint =**pointIterator;
+                       if(aPoint.getRealX() == valErase)
+                       {
+                               logicColorPoints.erase(pointIterator);
+                               deletedPoint = true;
+                       }                       
+                       pointIterator++;
+               }
+               return deletedPoint;
+       }
+       
+       void LogicalColorBar :: getPointersToRangeLimits( std::deque<pColorPoint *> &theInputQueue, int &startIndex, int &endIndex, int startSearched, int endSearched )
+       //void LogicalColorBar :: getListIndexRangeLimits( std::vector<pColorPoint *> &theVector, bool &startFOUND, bool &endFOUND, int startSearched, int endSearched );
+       {
+               bool foundedStart = false;
+               bool foundedEnd = false;
+               
+               /*for (int i=0; i<logicColorPoints.size()&&(!foundedStart || !foundedEnd);i++)
+               {
+                       pColorPoint colorPoint = logicColorPoints[i];
+                       double actualValue = colorPoint->getRealX();
+                       if(!foundedStart)
+                       {
+                               if((startSearched <= actualValue) )
+                               {
+                                       startIndex = i;
+                                       if((startSearched == actualValue) )
+                                               foundedStart = true;
+                               }                                       
+                       }
+                       if(!foundedEnd)
+                       {
+                               if((actualValue <= endSearched) )
+                               {
+                                       endIndex = i;
+                                       if((endSearched == actualValue))
+                                               foundedEnd = true;
+                               }                       
+                       }                                               
+               }               */
+
+               for (int i=0; i<logicColorPoints.size()&& !foundedEnd;i++)
+               {
+                       pColorPoint * colorPoint = logicColorPoints[i];
+                       double actualValue = colorPoint->getRealX();
+                       if(!foundedStart)
+                       {
+                               if((startSearched <= actualValue) )
+                               {
+                                       startIndex = i;
+                                       //if((startSearched == actualValue) )                                   
+                                       foundedStart = true;                                                                                    
+                               }                                       
+                       }
+                       if(!foundedEnd)
+                       {
+                               if((actualValue <= endSearched) )
+                               {
+                                       endIndex = i;
+                                       if((endSearched == actualValue))
+                                       {
+                                               foundedEnd = true;                                              
+                                       }
+                               }                       
+                       }                                               
+                       if(actualValue>=startSearched && actualValue<=endSearched)
+                       {
+                               if(startSearched<endSearched)
+                                       theInputQueue.push_back(colorPoint);
+                       }
+               }                       
+       }
+
+       pColorPoint * LogicalColorBar :: getLastAddedPoint()
+       {
+               return lastAddedPoint;
+       }
+
+       pColorPoint * LogicalColorBar :: getPointAtIndex(int anIndex)
+       {
+               if(anIndex>=0 && logicColorPoints.size()>anIndex)
+                       return logicColorPoints[anIndex];
+               else
+                       return NULL;
+       }
+
+       
+       int LogicalColorBar :: getCount()
+       {
+               return logicColorPoints.size();
+       }
+
+       void LogicalColorBar :: getDataAt(int index, double &x,int &red,int &green,int &blue)
+       {
+               pColorPoint * colorPoint = logicColorPoints[index];             
+               wxColour color = colorPoint->getColor();
+               red = color.Red();
+               blue = color.Blue();
+               green = color.Green();
+               x = colorPoint->getRealX();
+       }
+
+       void LogicalColorBar :: clearPoints()
+       {       
+               logicColorPoints.clear();
+       }
+
+       double LogicalColorBar :: getMinAddedValue()
+       {
+               return logicColorPoints.front()->getRealX();            
+       }
+
+       double LogicalColorBar :: getMaxAddedValue()
+       {
+               return logicColorPoints.back()->getRealX();
+       }
+
+       void LogicalColorBar :: changeColor(double pointValue, wxColour theNewColor)
+       {
+               bool changedCol = false;
+               for(int i=0; i<logicColorPoints.size() && !changedCol; i++)
+               {
+                       pColorPoint * aPoint = logicColorPoints[i];
+                       if(aPoint->getRealX() == pointValue)
+                       {
+                               aPoint->setColor( theNewColor );
+                               changedCol = true;
+                       }                       
+               }
+       }
+
+       bool LogicalColorBar :: setColorPoints (std::vector<pColorPoint *> pointsVector)
+       {
+               bool addedAll = true;
+               for(int i=0; i<pointsVector.size() && addedAll; i++)
+               {
+                       pColorPoint * aPoint  = pointsVector[i];
+                       addedAll &= addColorPoint(aPoint->getRealX(), aPoint->getColor());
+               }
+               if(addedAll)
+               {
+                       minValue = getMinAddedValue();
+                       maxValue = getMaxAddedValue();
+               }
+               else
+                       logicColorPoints.clear();
+
+               return addedAll;
+       }
+   
+   
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/LogicalColorBar.h
new file mode 100644 (file)
index 0000000..ced5500
--- /dev/null
@@ -0,0 +1,113 @@
+#ifndef __LOGICAL_COLOR_BAR__
+#define __LOGICAL_COLOR_BAR__
+
+// -----------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// -----------------------------------------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+//------------------------------------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------------------------------------
+
+#include <vector>
+#include <math.h>
+#include <iostream>
+#include <string>
+#include <deque>
+#include <vector>
+
+#include "pColorPoint.h"
+
+/** file LogicalColorBar.h */
+class LogicalColorBar {
+
+public:
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+
+       LogicalColorBar ();
+
+       ~LogicalColorBar();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+       /*
+       * Gets the first point
+       */
+       pColorPoint * getFirstPoint();
+
+       /*
+       * Gets the last point
+       */
+       pColorPoint * getLastPoint();
+
+       double getMinValue();
+
+       void  setMinValue(double valueMin);
+
+       double getMaxValue();
+
+       void setMaxValue(double valueMax);
+
+       bool getOrientation();
+
+       void setOrientation(bool orientation);
+
+       bool addColorPoint(double xRealValue, wxColour theColour);
+
+       bool deleteColorPoint ( double  valErase );
+
+       //void getListIndexRangeLimits( int &startIndex, int &endIndex, int startSearched, int endSearched );
+       
+       void getPointersToRangeLimits( std::deque<pColorPoint *> &theInputQueue, int &startIndex, int &endIndex, int startSearched, int endSearched );
+
+       pColorPoint * getLastAddedPoint();
+
+       pColorPoint * getPointAtIndex(int anIndex);
+
+       int getCount();
+
+       void getDataAt(int index, double &x,int &red,int &green,int &blue);
+
+       void clearPoints();
+
+       double getMinAddedValue();
+
+       double getMaxAddedValue();
+
+       void changeColor(double pointValue, wxColour theNewColor);
+
+       bool setColorPoints (std::vector<pColorPoint *> pointsVector);
+//     
+//private: 
+
+       bool bar_orientation;
+
+       //wxList        logicColorPoints;
+       std::vector<pColorPoint * > logicColorPoints;
+
+       pColorPoint * lastAddedPoint;
+
+       double minValue;
+
+       double maxValue;
+
+       //DECLARE_CLASS(LogicalColorBar)
+};     
+#endif 
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.cxx
new file mode 100644 (file)
index 0000000..e1cec14
--- /dev/null
@@ -0,0 +1,77 @@
+#include "MaximumsDialog.h"
+
+IMPLEMENT_CLASS(MaximumsDialog, wxDialog)
+
+MaximumsDialog::MaximumsDialog(wxWindow *parent,wxString title)
+:wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize, wxDEFAULT_DIALOG_STYLE,_T("dialogBox"))
+{
+       /*
+        where the user can put the values of the maxX and maxY of the axes of the plotter
+       */
+       m_maxX = new wxTextCtrl( this, -1, wxT(""));
+    m_maxY = new wxTextCtrl( this, -1, wxT(""));
+
+       /*
+       * just labels
+       */
+       maxX=new wxStaticText(this,-1,_T("Max X:"));
+       maxY=new wxStaticText(this,-1,_T("Max Y:"));
+       
+       /*
+       Buttons
+       */
+       okBtn = new wxButton(this,wxID_OK ,_T("OK"));
+       cancelBtn = new wxButton(this,wxID_CANCEL,_T("Cancel"));
+
+       //BOXES
+       //Upper Box
+       wxBoxSizer * upper_box = new wxBoxSizer( wxHORIZONTAL );
+       //Including components for plotter control
+       upper_box->Add( maxX, wxSizerFlags().Border(wxALL,6));
+       upper_box->Add( m_maxX, wxSizerFlags().Border(wxALL,6));
+       upper_box->Add( maxY, wxSizerFlags().Border(wxALL,6));
+       upper_box->Add( m_maxY, wxSizerFlags().Border(wxALL,6));
+       
+
+       //bottom Sizer
+       wxBoxSizer *bottomBox = new wxBoxSizer( wxHORIZONTAL );
+       bottomBox->Add( okBtn, wxSizerFlags().Center());
+       bottomBox->AddSpacer(40);
+       bottomBox->Add( cancelBtn,wxSizerFlags().Center() );
+
+       // Adding the components to the sizer
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+       sizer->Add( upper_box,0,wxALIGN_BOTTOM);
+       //sizer->AddGrowableRow (1,1);
+       sizer->Add( bottomBox,0,wxALIGN_CENTER);
+    
+       SetAutoLayout( TRUE );
+    SetSizer( sizer );
+       SetBestSize(wxSize(325,100));
+}
+//-----------------------------------------------------------------
+float MaximumsDialog::getXValue()
+{
+       wxString mx=m_maxX->GetValue();
+       if(mx.IsNumber())
+       {
+                       return (float)atoi( (const char*)(mx.mb_str()) );
+       }
+       else
+               return -1;
+}
+//----------------------------------------------------------------
+float MaximumsDialog::getYValue()
+{
+       wxString my=m_maxY->GetValue();
+       if(my.IsNumber())
+       {
+                       return atof( (const char*) (my.mb_str()) );
+       }
+       else
+               return -1;
+}
+//----------------------------------------------------------------
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/MaximumsDialog.h
new file mode 100644 (file)
index 0000000..0e170c5
--- /dev/null
@@ -0,0 +1,94 @@
+
+/*=========================================================================
+
+  Program:   wido
+  Module:    $RCSfile: MaximumsDialog.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:47 $
+  Version:   $Revision: 1.1 $
+  Author: Monica Lozano
+
+  Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
+  l'Image). All rights reserved. See Doc/License.txt or
+  http://www.creatis.insa-lyon.fr/Public/wido/License.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+Description:
+Is a Dialog that sets two numbers: 
+1)a x-value: maximum number that can take the x-axis
+2)a y-value: maximum number that can take the y-axis
+=========================================================================*/
+
+
+#ifndef __MAXIMUMSDIALOG__
+#define __MAXIMUMSDIALOG__
+
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+class MaximumsDialog:public wxDialog
+{
+public:
+       /*
+        Constructor
+       */
+       MaximumsDialog(wxWindow *parent,wxString title);
+       /*
+        Destructor
+       */
+       //~MaximumsDialog();
+       /*
+        Returns the X value wrote by the user
+       */
+       float getXValue();
+       /*
+        Returns the X value wrote by the user
+       */
+       float getYValue();
+
+private:
+       /*
+               TextControl for the x-maxvalue
+       */
+       wxTextCtrl      *m_maxX;
+       /*
+               TextControl for the y-maxvalue
+       */
+       wxTextCtrl      *m_maxY;
+       /*
+        used to show the names of the text controls
+       */
+       wxStaticText    *maxX;
+       wxStaticText    *maxY;
+
+       /*
+        ok Button
+       */
+       wxButton                *okBtn;
+       /*
+        cancel Button
+       */
+       wxButton                *cancelBtn;
+
+
+       DECLARE_CLASS(MaximumsDialog);
+       // any class wishing to process wxWindows events must use this macro
+       //DECLARE_EVENT_TABLE()
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mBarRange.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mBarRange.cxx
new file mode 100644 (file)
index 0000000..e678d73
--- /dev/null
@@ -0,0 +1,1397 @@
+//----------------------------------------------------------------------------
+#include "mBarRange.h"
+
+
+DEFINE_EVENT_TYPE(wxEVT_TSBAR)
+DEFINE_EVENT_TYPE(wxEVT_TSBAR_ACTUAL)
+DEFINE_EVENT_TYPE(wxEVT_TSBAR_START)
+DEFINE_EVENT_TYPE(wxEVT_TSBAR_END)
+DEFINE_EVENT_TYPE(wxEVT_TSBAR_MOVED)
+DEFINE_EVENT_TYPE(wxEVT_SELECTION_END)
+
+//----------------------------------------------------------------------------
+//EVENT TABLE
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(mBarRange, wxScrolledWindow)
+BEGIN_EVENT_TABLE(mBarRange, wxScrolledWindow)
+       EVT_PAINT (mBarRange::OnPaint)
+       EVT_SIZE  (mBarRange::OnSize)
+       EVT_MOTION (mBarRange::OnMouseMove)
+       EVT_RIGHT_DOWN (mBarRange :: onShowPopupMenu)
+       EVT_MENU(cntID_CHANGE_COLOR, mBarRange :: onChangePartColor)
+       EVT_MENU(cntID_ENABLE_ACTUAL, mBarRange :: onEnableRange_Actual)
+       EVT_MENU(cntID_MOVABLE_ACTUAL_BAR, mBarRange :: onMovable_ActualWithBar)
+
+       //
+       EVT_LEFT_DOWN( mBarRange :: onLeftClicDown)
+       EVT_LEFT_UP( mBarRange :: onLeftClickUp)
+
+       //how to catch the new event (our event)
+       //EVT_COMMAND  (ID_MY_WINDOW, wxEVT_MY_EVENT, MyFrame::OnMyEvent)
+END_EVENT_TABLE()
+
+
+//----------------------------------------------------------------------------
+//CONSTRUCTOR
+//----------------------------------------------------------------------------
+
+mBarRange::mBarRange(wxWindow *parent, int w, int h)
+:wxScrolledWindow(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL)
+{
+       acceptedClick = true;
+       _bitmap_bar                     =       NULL;
+       SetWidth (w);
+       SetHeight(h);
+       _initialPoint           =       0;
+       trianglesHalfWidth = 5;
+       
+       wxColour start_Colour;
+
+       // Setting the default parts colors
+       start_Colour            =       wxColour(0,0,255);
+       actual_Colour           =       wxColour(255,255,202);
+       end_Colour                      =       wxColour(0,0,255);
+       bar_Colour                      =       wxColour(255,0,255);
+       backgroundColor     =   parent ->GetBackgroundColour();
+       guideLineColor          =   wxColour(255,0,0);
+
+       //actual is in _start and end
+       //false means that it could be anywhere
+       _moveActualWithBar      =       false;
+       _in_rangeProperty       =       false;
+       _selectionMoveId        =       -1;
+       realX_vertical_line =   -1;
+       activeState                     =       false;
+       _actual=0;
+       deviceEndMargin = 0;
+
+       SetOrientation(true);
+       setIfWithActualDrawed(true);
+
+       b_popmenu.Append (cntID_CHANGE_COLOR, _("Change Color"), _("Changes the color of the selected part"));
+       b_popmenu.Append (cntID_ENABLE_ACTUAL, _("Enable actual in range"), _("Enables/Disables the actual triangle to be or not in range"));
+       b_popmenu.Append (cntID_MOVABLE_ACTUAL_BAR, _("Move actual-bar simultaneously"), _("Disables the actual triangle to move with the bar"));
+
+       SetSize(w,h);
+}
+
+//----------------------------------------------------------------------------
+//DESTRUCTOR
+//----------------------------------------------------------------------------
+
+mBarRange::~mBarRange()
+{
+}
+//---------------------------------------------------------------------------
+//Draw bar: vertical or Horizontal
+//---------------------------------------------------------------------------
+void mBarRange::DrawBar()
+{
+       //Horizontal
+       if(_orientation)
+       {
+               SetWindowStyle(wxNO_FULL_REPAINT_ON_RESIZE);
+               _bitmap_bar             = new wxBitmap(_w+1280,_h+100);
+               //SIL//_bitmap_info     = new wxBitmap(_w+100+1280, _h+100);
+       }
+       //vertical
+       else
+       {
+               SetWindowStyle(wxNO_FULL_REPAINT_ON_RESIZE);
+               _bitmap_bar = new wxBitmap(_h+deviceStart_y+100,_w+1280);
+               _bitmap_info = new wxBitmap(_h+deviceStart_y+100, _w+1280);
+       }
+}
+//----------------------------------------------------------------------------
+//Getters & Setters
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//the property condition on actual triangle
+//----------------------------------------------------------------------------
+bool mBarRange::GetInRangeProperty()
+{
+       return _in_rangeProperty;
+}
+//----------------------------------------------------------------------------
+void mBarRange::SetInRangeProperty(bool in)
+{
+       _in_rangeProperty=in;
+}
+//----------------------------------------------------------------------------
+//the information about the actual triangle in range or not, true if is between start and end
+//----------------------------------------------------------------------------
+bool mBarRange::IsActualInRange()
+{
+       return ( _actual <= _end && _actual >= _start );
+}
+
+//----------------------------------------------------------------------------
+// the position of the rectangle, vertical or horizontal
+//----------------------------------------------------------------------------
+bool mBarRange::GetOrientation()
+{
+       return _orientation;
+}
+//-----------------------------------------------------------------------------
+void mBarRange::SetOrientation(bool orientation)
+{
+       if(_orientation)
+       {
+               SetSize(_h,_w);
+       }
+       _orientation=orientation;
+
+}
+//----------------------------------------------------------------------------
+// _start of the pixel rectangle
+//----------------------------------------------------------------------------
+
+int mBarRange::GetPixelStart()
+{
+       return ((_start - _min)*(_w-deviceEndMargin))/(_max - _min);    
+}
+//----------------------------------------------------------------------------
+// param i: value in pixels
+//----------------------------------------------------------------------------
+void mBarRange::SetPixelStart(int i)
+{
+       _start = _min+((i - deviceStart_x)*( _max - _min))/(_w-deviceEndMargin);
+       
+}
+//----------------------------------------------------------------------------
+// _actual of the pixel rectangle
+//----------------------------------------------------------------------------
+int mBarRange::GetPixelActual()
+{
+       return ((_actual - _min)*(_w-deviceEndMargin))/(_max - _min);
+}
+//----------------------------------------------------------------------------
+// param i: value in pixels
+//----------------------------------------------------------------------------
+void mBarRange::SetPixelActual(int i)
+{
+       _actual = _min + (i-deviceStart_x)*(_max-_min)/(_w-deviceEndMargin);
+}
+//----------------------------------------------------------------------------
+// _end of the pixel rectangle
+//----------------------------------------------------------------------------
+int mBarRange::GetPixelEnd()
+{
+       return ((_end - _min)*(_w-deviceEndMargin))/(_max - _min);
+}
+//----------------------------------------------------------------------------
+// param i: value in pixels to be converted to real logical value
+//----------------------------------------------------------------------------
+void mBarRange::SetPixelEnd(int i)
+{
+       _end = _min + (i-deviceStart_x)*(_max-_min)/(_w-deviceEndMargin);
+}
+//----------------------------------------------------------------------------
+// Logical max of the triangle
+//----------------------------------------------------------------------------
+
+double mBarRange::GetMax()
+{
+       return _max;
+}
+
+//----------------------------------------------------------------------------
+void mBarRange::SetMax(double i)
+{
+       _max=i;
+}
+//----------------------------------------------------------------------------
+// Logical min of the triangle
+//----------------------------------------------------------------------------
+
+double mBarRange::GetMin()
+{
+       return _min;
+}
+
+//----------------------------------------------------------------------------
+void mBarRange::SetMin(double i)
+{
+       _min=i;
+}
+
+//----------------------------------------------------------------------------
+// pixel dimensions of the rectangle
+//----------------------------------------------------------------------------
+
+int mBarRange::GetWidth()
+{
+       return _w;
+}
+//----------------------------------------------------------------------------
+void mBarRange::SetWidth(int w)
+{
+       _w=w;
+}
+//----------------------------------------------------------------------------
+int mBarRange::GetHeight()
+{
+       return _h;
+}
+
+//----------------------------------------------------------------------------
+void mBarRange::SetHeight(int h)
+{
+       _h=h;   
+}
+
+//----------------------------------------------------------------------------
+// Logical  Start of the rectangle
+//----------------------------------------------------------------------------
+
+int mBarRange::GetStart()
+{
+       return _start;
+
+}
+//----------------------------------------------------------------------------
+// param start: value real units
+//----------------------------------------------------------------------------
+void mBarRange::SetStart(int newstart)
+{
+       if(newstart<_min)
+               newstart = _min;
+       _start = newstart;
+       RefreshForce(); 
+}
+//----------------------------------------------------------------------------
+// Logical End of the rectangle
+//----------------------------------------------------------------------------
+
+int mBarRange::GetEnd()
+{
+       return _end;
+}
+//----------------------------------------------------------------------------
+// param end: value pixel units
+//----------------------------------------------------------------------------
+void mBarRange::SetEnd(int nwend)
+{
+       if(nwend>_max)
+               _end = _max;
+       _end=nwend;
+       RefreshForce(); 
+}
+//----------------------------------------------------------------------------
+// logical  Actual of the rectangle
+//----------------------------------------------------------------------------
+int mBarRange::GetActual()
+{
+       return _actual;
+}
+//----------------------------------------------------------------------------
+void mBarRange::SetActual(int actual)
+{
+       if(actual<_min)
+               _actual = _min;
+       else if (actual>_max)
+               _actual = _max;
+       _actual=actual;
+       RefreshForce();
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+int mBarRange::GetTrianglesHalfWidth()
+{
+       return trianglesHalfWidth;
+}
+//----------------------------------------------------------------------------
+void mBarRange::SetTrianglesHalfWidth(int nwTriHalfWidth)
+{
+       trianglesHalfWidth = nwTriHalfWidth;
+}
+
+void mBarRange::OnSize( wxSizeEvent &WXUNUSED(event) )
+{
+       wxRect rectTotal = GetClientRect(); 
+       if(_orientation)
+       {               
+               SetWidth( rectTotal.GetWidth() - deviceEndMargin );                     
+       } 
+       else 
+       {
+               SetWidth( rectTotal.GetHeight() - deviceEndMargin);                             
+       }
+       _selectionMoveId = -1;
+       Refresh();              
+}
+
+//----------------------------------------------------------------------------
+
+void mBarRange::Refresh(bool eraseBackground, const wxRect* rect)
+{
+// EED Borrame
+//FILE *ff;
+//ff=fopen ("c:/temp/xxx.txt", "a+");
+//fprintf( ff , "mBarRange :: Refresh 01\n" );
+//fclose(ff);
+
+       wxScrolledWindow::Refresh(false);
+
+
+// EED Borrame
+//ff=fopen ("c:/temp/xx.txt", "a+");
+//fprintf( ff , "mBarRange :: Refresh 02\n" );
+//fclose(ff);
+}
+
+
+//----------------------------------------------------------------------------
+//Bar Methods
+//----------------------------------------------------------------------------
+void mBarRange::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+
+// EED Borrame
+//FILE *ff;
+//ff=fopen ("c:/temp/xx.txt", "a+");
+//fprintf( ff , "pColorBar :: OnPaint 01\n" );
+//fclose(ff);
+
+       if (_bitmap_bar!=NULL){
+               //repaint rectangle
+               if(_orientation)
+               {
+                       RefreshHorizontalView();
+                       wxMemoryDC temp_dc;
+                       temp_dc.SelectObject( *_bitmap_bar );
+                       wxPaintDC dc( this );
+                       dc.Blit(deviceStart_x-(trianglesHalfWidth+2), deviceStart_y, _w-deviceEndMargin+2*(trianglesHalfWidth+2), _h, &temp_dc, 0, 0);
+                       //repaint info
+//                     if (_visibleLables)
+//                     {
+//                             temp_dc.SelectObject( *_bitmap_info );                          
+//                             dc.Blit(deviceStart_x,deviceStart_y+_h, _w+deviceStart_x-deviceEndMargin, _h+deviceStart_y+200, &temp_dc, deviceStart_x, deviceStart_y);
+//                             //dc.Blit(deviceStart_x,deviceStart_y+_h, _w+deviceStart_x-deviceEndMargin, _h+deviceStart_y+60, &temp_dc, 0, 0);
+//                     }
+       
+               } else {
+                       RefreshVerticalView();
+                       wxMemoryDC temp_dc;
+                       temp_dc.SelectObject( *_bitmap_bar );
+                       wxPaintDC dc( this );                   
+//                     dc.Blit(deviceStart_y,deviceStart_x, _h+deviceStart_y-deviceEndMargin,_w+deviceStart_x-deviceEndMargin, &temp_dc, 0, 0);        
+                       dc.Blit(deviceStart_y,deviceStart_x-(trianglesHalfWidth+2), _h,_w-deviceEndMargin+2*(trianglesHalfWidth+2), &temp_dc, 0, 0);    
+                       
+                       //repaint info
+//                     if (_visibleLables)
+//                     {
+//                             temp_dc.SelectObject( *_bitmap_info );
+//                             dc.Blit(0,_w, _h+deviceStart_y+200, _w+deviceStart_x+200-deviceEndMargin, &temp_dc, deviceStart_y,_w+deviceStart_x);
+//                     }
+
+
+               } 
+       } 
+
+// EED Borrame
+//ff=fopen ("c:/temp/xx.txt", "a+");
+//fprintf( ff , "pColorBar :: OnPaint 02\n" );
+//fclose(ff);
+
+
+}
+//----------------------------------------------------------------------------
+//Repaint the bar if it is horizontal
+//----------------------------------------------------------------------------
+void mBarRange::RefreshHorizontalView()
+{
+
+// EED Borrame
+//FILE *ff;
+//ff=fopen ("c:/temp/xxx.txt", "a+");
+//fprintf( ff , "mBarRange :: RefreshHorizontalView 01\n" );
+//fclose(ff);
+
+       wxPoint points[3];
+
+       int largestNumberWidthInPixels = 15;
+       int pxStart=GetPixelStart();
+       int pxEnd=GetPixelEnd();
+       int pxActual=GetPixelActual();
+
+       
+       int letterHeight = 9;
+       int barHeight = 2*letterHeight;
+       int tempHeight = _h-(6*letterHeight);
+       
+       
+       if (_visibleLables)
+       {
+               barHeight = (tempHeight>0)  ? tempHeight : (int) _h/2;
+       }
+       else
+               barHeight = _h; 
+
+       wxMemoryDC temp_dc;
+       temp_dc.SelectObject( *_bitmap_bar );
+
+       
+       // Background of this widget
+       
+       
+       temp_dc.SetPen(wxPen( backgroundColor ));
+       temp_dc.SetBrush(wxBrush( backgroundColor ,wxSOLID  ));
+       
+       temp_dc.DrawRectangle(0,0,_w+2*trianglesHalfWidth,_h);
+       
+
+       temp_dc.SetPen(wxPen( wxColour(167,165,191) ,1,wxSOLID  ));
+       temp_dc.DrawLine(trianglesHalfWidth+2, 0, _w-deviceEndMargin, 0);
+       temp_dc.DrawLine(trianglesHalfWidth+2, barHeight, (_w-deviceEndMargin-trianglesHalfWidth-2), barHeight);
+       temp_dc.SetDeviceOrigin(trianglesHalfWidth+2,0);
+
+
+       // Filling the bar
+       temp_dc.SetBrush(wxBrush( wxColour(104,104,104),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(104,104,104),1,wxSOLID  ));
+       temp_dc.DrawRectangle( pxStart , 0, pxEnd-pxStart, barHeight);
+
+
+       //  The Bar
+       if( _selectionMoveId==4 )
+       {
+               temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+       }
+       else
+       {
+               temp_dc.SetBrush(wxBrush( bar_Colour,wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(164,0,164),1,wxSOLID  ));
+       }
+       temp_dc.DrawRectangle( pxStart,1, pxEnd-pxStart, barHeight );
+
+       // 2 Shadow Triangles: Start and End 
+       temp_dc.SetBrush(wxBrush( wxColour(104,104,104),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(104,104,104),1,wxSOLID  ));
+       points[0].x= 0;
+       points[0].y= barHeight;
+       points[1].x= -trianglesHalfWidth-1;
+       points[1].y= 0;
+       points[2].x= trianglesHalfWidth+2;
+       points[2].y= 0;
+       temp_dc.DrawPolygon(3,points,pxStart,0);
+       temp_dc.DrawPolygon(3,points,pxEnd,0);
+
+       // 2 Triangles: Start and End 
+       points[1].x = -trianglesHalfWidth;      
+       points[2].x = trianglesHalfWidth;
+       
+       //first triangle (start)
+       if( _selectionMoveId == 1 )
+       {
+               temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+       }
+       else
+       {
+               temp_dc.SetBrush(wxBrush( start_Colour,wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(0,51,204),1,wxSOLID  ));
+       }
+       temp_dc.DrawPolygon(3,points,pxStart,0);
+       //second triangle (end)
+       if( _selectionMoveId == 2 )
+       {
+               temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+       }
+       else
+       {
+               temp_dc.SetBrush(wxBrush( end_Colour,wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(0,0,255),1,wxSOLID  ));
+       }
+       temp_dc.DrawPolygon(3,points,pxEnd,0);
+
+       if( withActualDrawed )
+       {
+               // 1 Shadow Triangle: Actual
+               temp_dc.SetBrush(wxBrush( wxColour(104,104,104),wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(104,104,104),1,wxSOLID  ));
+               points[1].x = -trianglesHalfWidth-1;
+               points[2].x = trianglesHalfWidth+2;
+               
+               temp_dc.DrawPolygon(3,points,pxActual,0);
+
+               // 1 Triangle: Actual (red)
+               if( _selectionMoveId==3 )
+               {
+                       temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+                       temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+               }
+               else
+               {
+                       temp_dc.SetBrush(wxBrush( actual_Colour,wxSOLID  ));
+                       temp_dc.SetPen(wxPen( wxColour(205,160,5),1,wxSOLID  ));
+               }
+               points[1].x = -trianglesHalfWidth;
+               points[2].x = trianglesHalfWidth;
+               temp_dc.DrawPolygon(3,points,pxActual,0);
+       }
+
+       if (realX_vertical_line!=-1)
+       {
+               temp_dc.SetPen(wxPen(  guideLineColor,1,wxDOT ));
+               int pixelX_guide = ((realX_vertical_line - _min)*(_w-deviceEndMargin))/(_max - _min) ; 
+               temp_dc.DrawLine(pixelX_guide, 0, pixelX_guide, barHeight);
+       }
+
+       //Information Device drawing
+
+       if (_visibleLables)
+       {
+               //temp_dc.SelectObject( *_bitmap_info );
+               /*temp_dc.SetBrush(wxBrush( colourParent ,wxSOLID  ));
+               temp_dc.SetPen(wxPen( colourParent ,1,wxSOLID  ));*/
+               //temp_dc.DrawRectangle(deviceStart_x,_h+deviceStart_y,_w+deviceStart_x+40,_h+deviceStart_y+40);
+               //temp_dc.DrawRectangle(0,_h,_w+40-deviceEndMargin,_h+40);
+
+               wxFont font(letterHeight-1, wxFONTFAMILY_SWISS, wxNORMAL, wxNORMAL);
+               temp_dc.SetFont(font);
+               temp_dc.SetTextForeground(*wxBLACK);
+
+
+               //the **MIN** value, always at the same y level that corresponds to barHeight+1
+               wxString text_min;
+//             text_min<< GetMin();
+               text_min.Printf(_T("%d"), (int)GetMin() );
+               
+               temp_dc.DrawText(text_min,0,barHeight+1);
+
+               //the **MAX** value always at the same place
+               wxString text_max;
+//             text_max << GetMax();
+               text_max.Printf(_T("%d"), (int)GetMax() );
+
+               //As there is a margin of 40 extra most numbers (max) should be visibles
+//             stringSize = temp_dc.GetTextExtent(text_max);
+        wxCoord tmpX,tmpY;
+               temp_dc.GetTextExtent(text_max,&tmpX,&tmpY);
+               wxSize stringSize(tmpX,tmpY);
+               
+               temp_dc.DrawText(text_max,_w-deviceEndMargin -(stringSize.GetWidth())/*2*trianglesHalfWidth*/,barHeight+1);     
+               
+               //show logical values
+               //show the **START TRIANGLE** value 
+               wxString text_start;
+//             text_start << GetStart();               
+               text_start.Printf(_T("%d"), (int)GetStart() );
+
+               temp_dc.DrawText(text_start, pxStart,barHeight+2*letterHeight);
+               //show the **END TRIANGLE** value
+               wxString text_end;
+//             text_end << GetEnd();
+               text_end.Printf(_T("%d"), (int)GetEnd() );
+
+//             stringSize = temp_dc.GetTextExtent(text_end);
+               temp_dc.GetTextExtent(text_end,&tmpX,&tmpY);
+               stringSize.SetHeight(tmpY);
+               stringSize.SetWidth(tmpX);
+               temp_dc.DrawText(text_end, pxEnd-stringSize.GetWidth(),barHeight+3*letterHeight);
+               if( withActualDrawed )
+               {
+                       //show the actual value of actual
+                       wxString text_actual;
+//                     text_actual << GetActual();
+                       text_actual.Printf(_T("%d"), (int)GetActual() );
+//                     stringSize = temp_dc.GetTextExtent(text_actual);
+                       temp_dc.GetTextExtent(text_actual,&tmpX,&tmpY);
+                   stringSize.SetHeight(tmpY);
+                   stringSize.SetWidth(tmpX);
+                       temp_dc.DrawText(text_actual, pxActual-(stringSize.GetWidth()/2),barHeight+letterHeight);                       
+               }                       
+       }
+
+// EED Borrame
+//ff=fopen ("c:/temp/xxx.txt", "a+");
+//fprintf( ff , "mBarRange :: RefreshHorizontalView 02\n" );
+//fclose(ff);
+}
+
+//----------------------------------------------------------------------------
+//Repaint the bar if it is vertical
+//----------------------------------------------------------------------------
+
+void mBarRange::RefreshVerticalView()
+{
+
+// EED Borrame
+//FILE *ff;
+//ff=fopen ("c:/temp/xxx.txt", "a+");
+//fprintf( ff , "mBarRange :: RefreshVerticalView 01\n" );
+//fclose(ff);
+       wxPoint points[3];
+
+       int px1=GetPixelStart();
+       int px2=GetPixelEnd();
+       int px3=GetPixelActual();
+       int letterHeight = 9;
+       int panelHeight = 9*3+_w;
+
+       int barWidth;
+       if (_visibleLables)
+       {
+               barWidth = (_w-30)>0 ? _w-30 : (int) _w/2;
+       }
+       else
+               barWidth = _w;  
+
+       wxMemoryDC temp_dc;
+       temp_dc.SelectObject( *_bitmap_bar );
+
+       // Background
+       temp_dc.SetBrush(wxBrush( backgroundColor ,wxSOLID  ));
+       temp_dc.SetPen(wxPen( backgroundColor ));
+
+       temp_dc.DrawRectangle(0,0,_h,_w+2*trianglesHalfWidth);
+       
+
+       temp_dc.SetPen(wxPen( wxColour(167,165,191) ,1,wxSOLID  ));
+       temp_dc.DrawLine(0,trianglesHalfWidth+2, 0, _w-deviceEndMargin);
+       temp_dc.DrawLine(barWidth, trianglesHalfWidth+2, barWidth, (_w-deviceEndMargin-trianglesHalfWidth-2));
+       temp_dc.SetDeviceOrigin(0,trianglesHalfWidth+2);
+
+       // Filling the bar
+       temp_dc.SetBrush(wxBrush( wxColour(104,104,104),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(104,104,104),1,wxSOLID  ));
+       temp_dc.DrawRectangle( 0,px1 ,_h, px2-px1 );
+
+
+       //  The Bar
+               if( _selectionMoveId==4 )
+       {
+               temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+       }
+       else
+       {
+               temp_dc.SetBrush(wxBrush( bar_Colour,wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(164,0,164),1,wxSOLID  ));
+       }
+       temp_dc.DrawRectangle( 1,px1,_h, px2-px1);
+
+
+       // 2 Shadow Triangles: Start and End 
+       points[0].x=_h;
+       points[0].y=0;
+       points[1].x=0;
+       points[1].y=-trianglesHalfWidth-1;
+       points[2].x=0;
+       points[2].y=trianglesHalfWidth+2;
+       temp_dc.SetBrush(wxBrush( wxColour(104,104,104),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(104,104,104),1,wxSOLID  ));
+       temp_dc.DrawPolygon(3,points,0,px1);
+       temp_dc.DrawPolygon(3,points,0,px2);
+
+       // 2 Triangles: Start and End 
+       points[0].x=_h;
+       points[0].y=0;
+       points[1].x=0;
+       points[1].y=-trianglesHalfWidth;
+       points[2].x=0;
+       points[2].y=trianglesHalfWidth;
+       //first triangle (start)
+       if( _selectionMoveId==1 )
+       {
+               temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+       }
+       else
+       {
+               temp_dc.SetBrush(wxBrush( start_Colour,wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(0,51,204),1,wxSOLID  ));
+       }
+       temp_dc.DrawPolygon(3,points,0,px1);
+       //second triangle (end)
+       if( _selectionMoveId==2 )
+       {
+               temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+       }
+       else
+       {
+               temp_dc.SetBrush(wxBrush( end_Colour,wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(0,0,255),1,wxSOLID  ));
+       }
+       temp_dc.DrawPolygon(3,points,0,px2);
+
+       if( withActualDrawed )
+       {
+               // 1 Shadow Triangle: Actual
+               temp_dc.SetBrush(wxBrush( wxColour(104,104,104),wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(104,104,104),1,wxSOLID  ));
+               points[0].x=_h;
+               points[0].y=0;
+               points[1].x=0;
+               points[1].y=-trianglesHalfWidth-1;
+               points[2].x=0;
+               points[2].y=trianglesHalfWidth+2;
+               temp_dc.DrawPolygon(3,points,0,px3);
+
+               // 1 Triangle: Actual (red)
+               points[0].x = _h;
+               points[0].y = 0;
+               points[1].x = 0;
+               points[1].y = -trianglesHalfWidth;
+               points[2].x = 0;
+               points[2].y = trianglesHalfWidth;
+               if( _selectionMoveId==3 )
+               {
+                       temp_dc.SetBrush(wxBrush( wxColour(128,255,0),wxSOLID  ));
+                       temp_dc.SetPen(wxPen(  wxColour(0,128,0),1,wxSOLID  ));
+               }
+               else
+               {
+                       temp_dc.SetBrush(wxBrush( actual_Colour,wxSOLID  ));
+                       temp_dc.SetPen(wxPen( wxColour(205,160,5),1,wxSOLID  ));
+               }
+               temp_dc.DrawPolygon(3,points,0,px3);
+       }
+
+       if (realX_vertical_line!=-1)
+       {
+               temp_dc.SetPen(wxPen(  guideLineColor,1,wxDOT  ));
+               int pixelX_guide = realX_vertical_line*_w/(_max-_min)+deviceStart_x; 
+               temp_dc.DrawLine(0,pixelX_guide, _h, pixelX_guide);
+       }
+
+       //Information Device drawing
+       if (_visibleLables)
+       {
+               /*temp_dc.SelectObject( *_bitmap_info );
+
+               temp_dc.SetBrush(wxBrush( backgroundColor ,wxSOLID  ));
+               temp_dc.SetPen(wxPen( backgroundColor ,1,wxSOLID  ));
+               temp_dc.DrawRectangle(deviceStart_y,_w+deviceStart_x,_h+deviceStart_y+200,_w+deviceStart_x+200);
+*/
+
+               temp_dc.SetBackgroundMode(wxTRANSPARENT);
+               wxFont font(letterHeight-1, wxFONTFAMILY_SWISS, wxNORMAL, wxNORMAL);
+               temp_dc.SetFont(font);
+               temp_dc.SetTextForeground(*wxBLACK);
+
+               //show logical values
+               //show the actual value of start
+               wxString text_start;
+//             text_start<<"Start:"<< GetStart();
+               text_start.Printf(_T("%s %d"),_T("Start: "), (int)GetStart() );
+               temp_dc.DrawText( text_start ,deviceStart_y, _w+deviceStart_x+letterHeight+1);
+               //show the actual value of end
+               wxString text_end;
+//             text_end <<"End: "<<GetEnd();
+               text_end.Printf(_T("%s %d"),_T("End: "), (int)GetEnd() );
+               temp_dc.DrawText( text_end ,deviceStart_y,_w+deviceStart_x+letterHeight*2 );
+               if( withActualDrawed )
+               {
+                       //show the actual value of actual
+                       wxString text_actual;
+//                     text_actual <<"Actual: " <<GetActual();
+                       text_actual.Printf(_T("%s %d"),_T("Actual: "), (int)GetActual() );
+                       temp_dc.DrawText( text_actual ,deviceStart_y,_w+deviceStart_x+letterHeight*3);
+               }
+               //the min value, always at the same place
+               wxString text_min;
+//             text_min<<"Min: " << GetMin();
+               text_min.Printf(_T("%s %d"),_T("Min: "), (int)GetMin() );
+               temp_dc.DrawText( text_min ,deviceStart_y,_w+deviceStart_x+3);
+               //the max value always at the samen place
+               wxString text_max;
+//             text_max <<"Max: "<< GetMax();
+               text_max.Printf(_T("%s %d"),_T("Max: "), (int)GetMax() );
+               //toca calcular cuantol lo corremos
+               temp_dc.DrawText(text_max,deviceStart_y,_w+deviceStart_x+43);           
+       }
+
+}
+
+//----------------------------------------------------------------------------
+void mBarRange::RefreshForce()
+{
+       Refresh();
+       Update();
+}
+//----------------------------------------------------------------------------
+void mBarRange::OnMouseMove(wxMouseEvent& event )
+{
+// EED Borrame
+//FILE *ff;
+//ff=fopen ("c:/temp/xxx.txt", "a+");
+//fprintf( ff , "mBarRange :: OnMouseMove 01\n" );
+//fclose(ff);
+
+       int px1=GetPixelStart();
+       int px2=GetPixelEnd();
+       int px3=GetPixelActual();
+       if (activeState)
+       {
+               wxPoint point = event.GetPosition();
+               int barHeight;
+               if (_orientation)
+               {
+                       setClickedX(point.x);
+                       barHeight = point.y;
+               }
+               else
+               {
+                       setClickedX(point.y);
+                       barHeight = point.x;
+               }
+               int logicClick = getLogicValueofPixel(clickedX);
+                       
+               if( _selectionMoveId==-1 )
+               {
+                       if (barHeight <=_h)
+                       {
+                               bool in_StartTri = (clickedX>=GetPixelStart()-5+ deviceStart_x) && (clickedX<=GetPixelStart()+5+ deviceStart_x);
+                               bool in_EndTri = (clickedX>=GetPixelEnd()-5+ deviceStart_x) && (clickedX<=GetPixelEnd()+5+ deviceStart_x);
+                               bool in_actualT= withActualDrawed && (clickedX>=GetPixelActual()-5+ deviceStart_x) && (clickedX<=GetPixelActual()+5+ deviceStart_x);
+                               bool in_movingBar = (clickedX>GetPixelStart()+5+ deviceStart_x) && (clickedX<GetPixelEnd()-5+ deviceStart_x);
+
+                               if( in_actualT )
+                                       _selectionMoveId = 3;
+                               else if(in_StartTri)
+                                       _selectionMoveId = 1;  
+                               else if( in_EndTri )
+                                       _selectionMoveId = 2;
+                               else if( in_movingBar )
+                                       _selectionMoveId = 4;
+                       }
+               }
+               else
+               {
+                       if(acceptedClick)
+                       {
+                               //is in start triagle
+                               if( _selectionMoveId ==1 && event.LeftIsDown())
+                               {
+                                       bool validPos_StartTri = (logicClick<GetEnd() && logicClick >=_min);
+                                       if( validPos_StartTri && !_in_rangeProperty)
+                                       {       
+                                               SetPixelStart(clickedX);
+                                               RefreshForce();
+                                               RefreshHorizontalView();
+                                               //-------------------------------------------
+                                               // Sending the event of start triangle moved
+                                               //-------------------------------------------
+                                               createAndSendEvent( wxEVT_TSBAR_START );                                        
+                                       }
+                                       //start has to be less than actual
+                                       else if (validPos_StartTri && _in_rangeProperty)
+                                       {
+                                               if(logicClick<=GetActual())
+                                               {
+                                                       SetPixelStart(clickedX);
+                                                       RefreshForce();
+                                               //      RefreshHorizontalView();
+                                                       //-------------------------------------------
+                                                       // Sending the event of start triangle moved
+                                                       //-------------------------------------------
+                                                       createAndSendEvent( wxEVT_TSBAR_START );
+                                               }
+                                       }
+                               } // _selectionMoveId == 1
+                               //is in end triangle
+                               else if( _selectionMoveId == 2 && event.LeftIsDown() )
+                               {
+                                       bool validPos_EndTri = logicClick>GetStart()&& logicClick<=_max;  
+                                       if( validPos_EndTri && !_in_rangeProperty )
+                                       {                                       
+                                               SetPixelEnd(clickedX);
+                                               RefreshForce();
+       //                                      RefreshHorizontalView();        
+                                               //-------------------------------------------
+                                               //Sending the event of end triangle moved
+                                               //-------------------------------------------
+                                               createAndSendEvent( wxEVT_TSBAR_END );
+                                       }
+                                       //the end triangle cant be less than actual
+                                       else if( validPos_EndTri && _in_rangeProperty )
+                                       {
+                                               if(logicClick>=GetActual())
+                                               {
+                                                       SetPixelEnd(clickedX);
+                                                       RefreshForce();
+                                               //      RefreshHorizontalView();
+                                                       //-------------------------------------------
+                                                       //Sending the event of end triangle moved
+                                                       //-------------------------------------------
+                                                       createAndSendEvent( wxEVT_TSBAR_END );
+                                               }
+                                       }
+                               } 
+                               //is the actual triangle
+                               else if( _selectionMoveId == 3 && event.LeftIsDown())
+                               {
+                                       bool validPos_ActualTri=(logicClick<=_max) && (logicClick>=_min);
+                                       //is in actual triangle but it could be anywhere
+                                       if( validPos_ActualTri && !_in_rangeProperty )
+                                       {
+                                               SetPixelActual(clickedX);
+                                               RefreshForce();
+                                               RefreshHorizontalView();
+                                               //-------------------------------------------
+                                               //Sending the event of actual triangle moved
+                                               //-------------------------------------------
+                                               createAndSendEvent( wxEVT_TSBAR_ACTUAL );                                       
+                                       }
+                                       else if( validPos_ActualTri && _in_rangeProperty )
+                                       // the tringle in between start and end
+                                       {
+                                               if( logicClick>=GetStart() && logicClick<=GetEnd())
+                                               {
+                                                       SetPixelActual(clickedX);
+                                                       RefreshForce();
+                                                       RefreshHorizontalView();
+                                                       //-------------------------------------------
+                                                       //Sending the event of actual triangle moved
+                                                       //-------------------------------------------
+                                                       createAndSendEvent( wxEVT_TSBAR_ACTUAL );
+                                               }
+                                       } 
+                               } 
+                               //is the bar
+                               else if ( _selectionMoveId == 4 &&  event.LeftIsDown() )
+                               {       
+                                       //FILE * f=fopen("E:/borrar/file.txt","a+");
+                                       if(_initialPoint == 0)
+                                       {
+                                               _initialPoint = logicClick;
+                                               logicInitial_start = GetStart(); 
+                                               logicInitial_end = GetEnd();
+                                               logicInitial_actual = GetActual();
+                                               //SIL//fprintf(f,"\n\n---- Inicia draggin:\n  logicInitial_start:%d, logicInitial_end:%d,logicInitial_actual:%d \n", _initialPoint,logicInitial_start,logicInitial_end,logicInitial_actual);
+                                       }
+                                       int difference = logicClick -_initialPoint;
+                                       int next_end = difference + logicInitial_end;
+                                       int next_start = difference + logicInitial_start;
+                                       int next_actual = difference + logicInitial_actual;
+                                       
+                                       /*SIL//fprintf(f,"diff:%d, next_end%d, next_start%d, next_actual%d \n", difference,next_end,next_start,next_actual);
+                                       fclose(f);*/
+                                       
+                                       //if actual is not fixed to be in the middle
+                                       if( ((logicClick>next_start) && (logicClick<next_end)&& (next_end<=_max)&& (next_start>=_min)) && !_in_rangeProperty)
+                                       {
+                                               SetStart(next_start);
+                                               SetEnd(next_end);
+                                               if( _moveActualWithBar )
+                                               {
+                                                       SetActual (next_actual);
+                                                       //-------------------------------------------
+                                                       //Sending the event of actual triangle moved
+                                                       //-------------------------------------------
+                                                       createAndSendEvent( wxEVT_TSBAR_ACTUAL );
+                                               }
+                                               RefreshForce();
+                                               RefreshHorizontalView();        
+                                                                                       
+                                               //-------------------------------------------
+                                               // Sending the event that the bar ahs being moved
+                                               //-------------------------------------------
+                                               createAndSendEvent( wxEVT_TSBAR_MOVED );
+                                       }
+                                       //if actual has to be between start and end
+                                       else if(_in_rangeProperty && ((next_start<=GetActual()) && (next_end>=GetActual()) && (next_end<=_max)&& (next_start>=_min)) )
+                                       {
+                                               SetStart(next_start);
+                                               SetEnd(next_end);
+                                               if( _moveActualWithBar )
+                                               {
+                                                       SetActual (next_actual);
+                                                       //-------------------------------------------
+                                                       //Sending the event of actual triangle moved
+                                                       //-------------------------------------------
+                                                       createAndSendEvent( wxEVT_TSBAR_ACTUAL );
+                                               }
+                                               RefreshForce();
+                                               RefreshHorizontalView();        
+                                               
+                                               //-------------------------------------------
+                                               // Sending the event that the bar ahs being moved
+                                               //-------------------------------------------
+                                               createAndSendEvent( wxEVT_TSBAR_MOVED );
+                                       }
+                               }                       
+                       }
+                       if( !event.LeftIsDown())
+                       {
+                               _initialPoint=0;
+                               _selectionMoveId = -1;
+                               RefreshForce();
+                               //-------------------------------------------
+                               //Sending a general event just because
+                               //-------------------------------------------
+                               //SIL//createAndSendEvent( wxEVT_TSBAR );
+                               createAndSendEvent(wxEVT_SELECTION_END);
+                       }
+               }                               
+       }       
+
+// EED Borrame
+//ff=fopen ("c:/temp/xxx.txt", "a+");
+//fprintf( ff , "  mBarRange :: OnMouseMove 02\n" );
+//fclose(ff);
+
+}
+/*
+* Sets the represented minimum and maximunm values
+* param minRealValue The minimum represented value (real value)
+* param maxRealValue The maximum represented value (real value)
+*/
+void mBarRange :: setRepresentedValues ( double minRealValue, double maxRealValue)
+{
+       _min = minRealValue;
+       _max = maxRealValue;
+       _start=_min;
+       _end=_max;
+}
+
+/*
+* Sets the property for viewing or not the bar labels information
+*/
+void mBarRange :: setVisibleLabels ( bool setVisibleLB )
+{
+       _visibleLables = setVisibleLB;
+}
+
+/*
+       * Sets the property for viewing or not the bar labels information
+       * return _visibleLables The state of visible labels or not 
+       */
+       bool mBarRange ::getIfVisibleLabels ()
+       {
+               return _visibleLables;
+       }
+
+       /**
+       * Sets the device start drawing left-superior (pixel) start point 
+       * param deviceStart_x Pixel start for x-coord
+       * param deviceStart_y Pixel start for y-coord
+       */
+       void mBarRange :: setDeviceBlitStart ( wxCoord devStart_x, wxCoord devStart_y )
+       {
+               deviceStart_x = devStart_x;
+               deviceStart_y = devStart_y;
+               // For the initialization case
+               if (GetPixelEnd()<0)
+               {
+                       if (_orientation)
+                       {
+                               SetPixelStart(deviceStart_x);
+                               SetPixelEnd(_w+deviceStart_x);
+                               SetPixelActual(deviceStart_x);
+                       }
+                       else
+                       {
+                               SetPixelStart(deviceStart_x);
+                               SetPixelEnd(_h+deviceStart_x);
+                               SetPixelActual(deviceStart_x);
+                       }
+               }
+               DrawBar();
+       }
+       
+       /**
+       * Shows the popup menu 
+       */
+       void mBarRange :: onShowPopupMenu (wxMouseEvent& event)
+       {
+               if (activeState)
+               {
+                       bool validClic = false;
+                       if (_orientation)
+                       {
+                               validClic = event.GetX() >= deviceStart_x && event.GetY()<= (_h + deviceStart_y);
+                       }
+                       else
+                       {
+                               validClic = event.GetX()>=deviceStart_y && event.GetX()<= (_h+deviceStart_y) && event.GetY()>deviceStart_x;
+                       }
+                       if (validClic)
+                       {
+                               if(_orientation)
+                                       setClickedX(event.GetX());
+                               else
+                                       setClickedX(event.GetY());
+
+                               if (getClickedX()<=_h)
+                               {                                               
+                                       bool in_StartTri = (clickedX>=GetPixelStart()-5+ deviceStart_x) && (clickedX<=GetPixelStart()+5+ deviceStart_x);
+                                       bool in_EndTri = (clickedX>=GetPixelEnd()-5+ deviceStart_x) && (clickedX<=GetPixelEnd()+5+ deviceStart_x);
+                                       bool in_actualT= (clickedX>=GetPixelActual()-5+ deviceStart_x) && (clickedX<=GetPixelActual()+5+ deviceStart_x);
+                                       bool in_movingBar = (clickedX>GetPixelStart()+5+ deviceStart_x) && (clickedX<GetPixelEnd()-5+ deviceStart_x);
+
+                                       if(in_StartTri)
+                                               _selectionMoveId = 1;
+                                       else if( in_EndTri )
+                                               _selectionMoveId = 2;
+                                       else if( in_actualT )
+                                               _selectionMoveId = 3;
+                                       else if( in_movingBar )
+                                               _selectionMoveId = 4;
+                               }                               
+                               PopupMenu( &b_popmenu, event.GetX(), event.GetY());
+                       }               
+               }
+       }
+       
+       /**
+       * Reacts to the cntID_ADD_COLOR_POINT wxCommandEvent and adds a color degrade point to the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void mBarRange :: onChangePartColor ( wxCommandEvent& anEvent )
+       {
+               bool okSelectedColor = false;
+               wxColour selectedColour;
+               wxColourData data;
+               wxColourDialog dialog( GetParent(), &data);
+
+               if ( dialog.ShowModal() == wxID_OK )
+               {
+                       selectedColour = dialog.GetColourData().GetColour();
+                       okSelectedColor = true;
+               }
+               if( okSelectedColor )
+               {
+                       if (_selectionMoveId==1 )
+                               start_Colour = selectedColour;
+                       else if (_selectionMoveId==2 )
+                               end_Colour = selectedColour;
+                       else if( _selectionMoveId==3 )
+                               actual_Colour = selectedColour;
+                       else if( _selectionMoveId==4 )
+                               bar_Colour = selectedColour;            
+               }
+               _selectionMoveId = -1;
+        RefreshForce();
+               
+       }
+       
+       /**
+       * Reacts to the cntID_ENABLE_ACTUAL (false) wxCommandEvent enables the actual to be between the the range.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void mBarRange :: onEnableRange_Actual ( wxCommandEvent& anEvent )
+       {
+               if (!_in_rangeProperty)
+               {
+                       if(IsActualInRange())
+                       {
+                               SetInRangeProperty (true);
+                               b_popmenu.SetLabel (cntID_ENABLE_ACTUAL, _T("Disable actual in range"));
+                       }
+               }
+               else
+               {
+                       SetInRangeProperty (false);
+                       b_popmenu.SetLabel (cntID_ENABLE_ACTUAL, _T("Enable actual in range"));                 
+               }
+       }
+
+       /**
+       * Reacts to the cntID_MOVABLE_ACTUAL_BAR wxCommandEvent by enabling or disabling the property of moving the actual triangle with the bar, just when it is inside of it.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void  mBarRange :: onMovable_ActualWithBar ( wxCommandEvent& anEvent )
+       {
+               if (_moveActualWithBar )
+               {
+                       _moveActualWithBar = false;
+                       b_popmenu.SetLabel (cntID_MOVABLE_ACTUAL_BAR, _T("Move actual+bar simultaneously"));
+               }
+               else
+               {
+                       if(IsActualInRange())
+                       {
+                               _moveActualWithBar = true;
+                               b_popmenu.SetLabel (cntID_MOVABLE_ACTUAL_BAR, _T("Move actual-bar independent"));
+                       }
+               }
+       }
+
+               /*
+       * Set active state 
+       * param activeNow The new state
+       */
+       void mBarRange :: setActiveStateTo (bool activeNow)
+       {
+               activeState = activeNow;
+       }
+       
+       /*
+       * Gets the active state of the bar
+       *  return activeState The actual state
+       */
+       bool mBarRange :: isActive()
+       {
+               return activeState;
+       }
+
+       /*
+       * Gets the real-x value to draw a vertical line
+       * return realX_vertical_line The real x value for the vertical line
+       */
+       int     mBarRange :: getRealX_vertical_line()
+       {
+               return realX_vertical_line;
+       }
+
+       /*
+       * Sets the real-x value to draw a vertical line
+       * param newReal_x The new real x value for the vertical line
+       */
+       void mBarRange :: setRealX_vertical_line(int newReal_x)
+       {
+               realX_vertical_line = newReal_x;
+       }
+
+       /*
+       * Gets the device value form the end of this panel to the end of the drawing area in the device in pixels
+       * return deviceEndMargin The value asigned to the right margin
+       */
+       int     mBarRange :: getDeviceEndX()
+       {
+               return deviceEndMargin;
+       }
+
+       /*
+       * Sets the new device (deviceEndMargin) value form the end of this panel to the end of the drawing area in the device
+       * param newDeviceEnd_pixels The new pixel value to asign to the right(horizontal view), underneath(vertical view) margin in pixels
+       */
+       void mBarRange :: setDeviceEndMargin(int newDeviceEnd_pixels)
+       {
+               deviceEndMargin = newDeviceEnd_pixels;
+       }
+
+       /*
+       * Gets the last clickedX pixel coord inside the bar with respect to the container panel.
+       * return clickedX The x-coord pixel value
+       */
+       int mBarRange :: getClickedX()
+       {
+               return clickedX;
+       }
+
+       /*
+       * Sets the last clickedX pixel coord inside the bar with respect to the container panel.
+       * param nwClickX The x-coord pixel value
+       */
+       void mBarRange :: setClickedX(int nwClickX)
+       {
+               clickedX = nwClickX;
+       }
+
+
+               /*
+       * Gets the start porcentage with respect to the represented values of the bar
+       * return The porcentage represented by the start  showing point
+       */
+       float mBarRange :: getStartShowPorcentage()
+       {
+               return (float)( 1+(_start - _max)/(_max-_min));
+       }
+
+       /*
+       * Gets the end porcentage with respect to the represented values of the bar
+       * return The porcentage represented by the end showing point
+       */
+       float mBarRange :: getEndShowPorcentage()
+       {
+               return (float) (1+(_end - _max)/(_max-_min));
+       }
+
+       /*
+       * Gets the actual porcentage with respect to the represented values of the bar
+       * return The porcentage represented by the actual  showing point
+       */
+       float mBarRange :: getActualShowPorcentage()
+       {
+               return (float) (1+(_actual - _max)/(_max-_min));
+       }
+
+       int mBarRange :: getLogicValueofPixel(int thePixel)
+       {
+               return _min+((thePixel - deviceStart_x)*( _max - _min))/(_w-deviceEndMargin);
+       }
+
+       /*
+       * Sets the condition for knowing if the actual triangle is being drawed or not
+       * param drawActual The condition to set for drawing or not the actual control (true for drawing)
+       */
+       void mBarRange :: setIfWithActualDrawed(bool drawActual)
+       {
+               if(!withActualDrawed && drawActual)
+               {       
+                       b_popmenu.Append (cntID_ENABLE_ACTUAL, _("Enable actual in range"), _("Enables/Disables the actual triangle to be or not in range"));
+                       b_popmenu.Append (cntID_MOVABLE_ACTUAL_BAR, _("Move actual-bar simultaneously"), _("Disables the actual triangle to move with the bar"));               
+               }
+               else if (withActualDrawed && !drawActual)
+               {
+                       b_popmenu.Remove(cntID_ENABLE_ACTUAL);
+                       b_popmenu.Remove(cntID_MOVABLE_ACTUAL_BAR);
+               }
+               withActualDrawed = drawActual;
+               Refresh();      
+       }
+
+       /*
+       * Gets the condition for knowing if the actual triangle is being drawed or not
+       * return withActualDrawed The condition for drawing or not the actual control
+       */
+       bool mBarRange :: getIfWithActualDrawed()
+       {
+               return withActualDrawed;
+       }
+
+       void mBarRange :: createAndSendEvent(WXTYPE theEventType)
+       {
+               wxCommandEvent cevent( theEventType, GetId() );
+               cevent.SetEventObject( this );
+               GetEventHandler()->ProcessEvent( cevent );
+       }
+
+       /*
+       * Sets the background color od the bar
+       * theColor The color to set to the backgroundColor
+       */
+       void mBarRange :: setBackgroundColor(wxColour theColor)
+       {
+               backgroundColor = theColor;
+       }
+
+       /*
+       * Sets the guide line color
+       * param theNwGuideLineColor The color to set to the guideLineColor
+       */
+       void mBarRange :: setGuideLineColour(wxColour theNwGuideLineColor)
+       {
+               guideLineColor = theNwGuideLineColor;
+       }
+
+       /*
+       * Gets the guide line color
+       * return guideLineColor The color of the guideLine
+       */
+       wxColour mBarRange :: getGuideLineColour()
+       {
+               return guideLineColor;
+       }
+
+       void  mBarRange ::onLeftClicDown(wxMouseEvent& event )
+       {
+               acceptedClick = true;           
+       }
+
+       void  mBarRange ::onLeftClickUp(wxMouseEvent& event )
+       {       
+               acceptedClick = false;
+       }
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mBarRange.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mBarRange.h
new file mode 100644 (file)
index 0000000..4acc744
--- /dev/null
@@ -0,0 +1,449 @@
+
+
+#ifndef __mBAR__RANGE__
+#define __mBAR__RANGE__
+
+
+//-----------------------------------------------------------------------------
+// Includes
+//-----------------------------------------------------------------------------
+#include "wx/colordlg.h"
+
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+#include "marTypes.h"
+
+//----------------------------------------------------------------------------
+//DECLARING THE NEW EVENT
+//wxEVT_TSBAR= event of the two side bar
+//----------------------------------------------------------------------------
+BEGIN_DECLARE_EVENT_TYPES()
+ DECLARE_EVENT_TYPE(wxEVT_TSBAR, -1)
+ DECLARE_EVENT_TYPE(wxEVT_TSBAR_ACTUAL, -1)
+ DECLARE_EVENT_TYPE(wxEVT_TSBAR_START, -1)
+ DECLARE_EVENT_TYPE(wxEVT_TSBAR_END, -1)
+ DECLARE_EVENT_TYPE(wxEVT_TSBAR_MOVED, -1)
+ DECLARE_EVENT_TYPE(wxEVT_SELECTION_END, -1)
+END_DECLARE_EVENT_TYPES()
+
+
+//-------------------------------------------------------------------------------------------------------------
+// Enum declarations
+//-------------------------------------------------------------------------------------------------------------
+/** Command IDs used by pColorPoint */
+enum
+{
+       cntID_CHANGE_COLOR = 7000,
+       cntID_ENABLE_ACTUAL,    
+       cntID_MOVABLE_ACTUAL_BAR,
+};
+
+
+class MARACASVISULIB_EXPORTS mBarRange :public  wxScrolledWindow{
+public:
+       //------------------------------------
+       //Constructors & Destructors
+       //------------------------------------
+       mBarRange(wxWindow *parent, int w, int h/*, bool theOrientation, bool useWithActualDrawed*/);
+       ~mBarRange();
+       //------------------------------------
+       // Bar Methods
+       //------------------------------------
+       void Refresh(bool eraseBackground = true, const wxRect* rect = NULL);
+       void OnPaint( wxPaintEvent &WXUNUSED(event) );
+       void OnSize( wxSizeEvent &WXUNUSED(event) );
+       void RefreshHorizontalView();
+       void RefreshVerticalView();
+       void RefreshForce();
+       void OnMouseMove(wxMouseEvent& event );
+       void DrawBar();
+       //------------------------------------
+       // Getters & Setters
+       //------------------------------------
+       //Actual triangle
+       int GetPixelActual();
+       void SetPixelActual(int i);
+
+       //Start of the bar
+       int GetPixelStart();
+       void SetPixelStart(int i);
+
+       //End of the bar
+       int GetPixelEnd();
+       void SetPixelEnd(int i);
+
+       //Logical Max
+       double GetMax();
+       void SetMax(double i);
+
+       //Logical Min
+       double GetMin();
+       void SetMin(double i);
+
+       //Rectangule Height
+       int GetHeight();
+       void SetHeight(int h);
+
+       //Width
+       int GetWidth();
+       void SetWidth(int w);
+
+       //Logical Start
+       int GetStart();
+       void SetStart(int start);
+
+       //Logical End
+       int GetEnd();
+       void SetEnd(int end);
+
+       //logical actual
+       int GetActual();
+       void SetActual(int actual);
+
+
+       //The triangles half width managment
+       int GetTrianglesHalfWidth();
+       void SetTrianglesHalfWidth(int nwTriHalfWidth);
+       
+
+       //Orientation (false for vertical, true is default for horizontal)
+       bool GetOrientation();
+       void SetOrientation(bool orientation);
+
+       //Manage the property of the actual triangle to be between de start and the end
+       bool GetInRangeProperty();
+       void SetInRangeProperty(bool in);
+
+       //Inform if the actual triangle is between the start and the end triangles
+       bool IsActualInRange();
+
+       /*
+       * Sets the property for viewing or not the bar labels information
+       */
+       void setVisibleLabels (bool setVisible);
+
+       /*
+       * Sets the property for viewing or not the bar labels information
+       * return _visibleLables The state of visible labels or not 
+       */
+       bool getIfVisibleLabels ();
+
+       /*
+       * Sets the represented minimum and maximunm values
+       * param minRealValue The minimum represented value (real value)
+       * param maxRealValue The maximum represented value (real value)
+       */
+       void setRepresentedValues(double minRealValue,double maxRealValue);
+
+       /**
+       * Sets the device start drawing left-superior (pixel) start point 
+       * param deviceStart_x Pixel start for x-coord
+       * param deviceStart_y Pixel start for y-coord
+       */
+       void setDeviceBlitStart ( wxCoord deviceStart_x, wxCoord deviceStart_y );
+
+
+       /*
+       * Set active state 
+       * param activeNow The new state
+       */
+       void setActiveStateTo (bool activeNow);
+       
+       /*
+       * Gets the active state of the bar
+       *  return isActive The actual state
+       */
+       bool isActive();
+
+       /*
+       * Gets the real-x value to draw a vertical line
+       * return realX_vertical_line The real x value for the vertical line
+       */
+       int     getRealX_vertical_line();
+
+       /*
+       * Sets the real-x value to draw a vertical line
+       * param realX_vertical_line The new real x value for the vertical line
+       */
+       void setRealX_vertical_line(int newReal_x);
+
+       //*******************************************************************************************************
+       // Event methods
+       //*******************************************************************************************************
+
+       /**
+       * Shows the popup menu 
+       */
+       void onShowPopupMenu (wxMouseEvent& event);
+       /**
+       * Reacts to the cntID_CHANGE_COLOR wxCommandEvent and adds a color degrade point to the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onChangePartColor ( wxCommandEvent& anEvent );
+
+
+       /**
+       * Reacts to the cntID_ENABLE_ACTUAL wxCommandEvent enables the actual to be between the the range.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onEnableRange_Actual ( wxCommandEvent& anEvent );
+
+       /**
+       * Reacts to the cntID_MOVABLE_ACTUAL_BAR wxCommandEvent by enabling or disabling the property of moving the actual triangle with the bar, just when it is inside of it.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onMovable_ActualWithBar ( wxCommandEvent& anEvent );
+
+       /*
+       * Gets the device value form the end of this panel to the end of the drawing area in the device in pixels
+       * return deviceEndMargin The value asigned to the right margin
+       */
+       int     getDeviceEndX();
+       
+
+       /*
+       * Sets the new device (deviceEndMargin) value form the end of this panel to the end of the drawing area in the device
+       * param newDeviceEnd_pixels The new pixel value to asign to the right(horizontal view), underneath(vertical view) margin in pixels
+       */
+       void setDeviceEndMargin(int newDeviceEnd_pixels);
+
+       /*
+       * Gets the last clickedX pixel coord inside the bar with respect to the container panel.
+       * return clickedX The x-coord pixel value
+       */
+       int getClickedX();
+
+       /*
+       * Sets the last clickedX pixel coord inside the bar with respect to the container panel.
+       * param nwClickX The x-coord pixel value
+       */
+       void setClickedX(int nwClickX);
+
+       /*
+       * Gets the start porcentage with respect to the represented values of the bar
+       * return The porcentage represented by the start  showing point
+       */
+       float getStartShowPorcentage();
+
+       /*
+       * Gets the end porcentage with respect to the represented values of the bar
+       * return The porcentage represented by the end showing point
+       */
+       float getEndShowPorcentage();
+
+       /*
+       * Gets the actual porcentage with respect to the represented values of the bar
+       * return The porcentage represented by the actual  showing point
+       */
+       float getActualShowPorcentage();
+
+       /*
+       * Gets the logic value of a pixel point that comes in the coords of the container panel.
+    * param thePixel Is the pixel to convert
+       * return Is the correspondig value to the given pixel-value in logic bar coords
+       */
+       int getLogicValueofPixel(int thePixel);
+
+
+       /*
+       * Sets the condition for knowing if the actual triangle is being drawed or not
+       * param drawActual The condition to set for drawing or not the actual control (true for drawing)
+       */
+       void setIfWithActualDrawed(bool drawActual);
+
+       /*
+       * Gets the condition for knowing if the actual triangle is being drawed or not
+       * return withActualDrawed The condition for drawing or not the actual control
+       */
+       bool getIfWithActualDrawed();
+
+       /*
+       * Method that creates and send the given id-event to the event handler
+       * param theEventType Is the event id type identification for generating the event
+       */
+       void createAndSendEvent(WXTYPE theEventType);
+
+       /*
+       * Sets the background color od the bar
+       * theColor The color to set to the backgroundColor
+       */
+       void setBackgroundColor(wxColour theColor);
+
+       /*
+       * Sets the guide line color
+       * param theNwGuideLineColor The color to set to the guideLineColor
+       */
+       void setGuideLineColour(wxColour theNwGuideLineColor);
+
+
+       /*
+       * Gets the guide line color
+       * return guideLineColor The color of the guideLine
+       */
+       wxColour getGuideLineColour();
+
+       void onLeftClicDown(wxMouseEvent& event );
+
+       void onLeftClickUp(wxMouseEvent& event );
+
+
+private:
+       //Rectangle width
+       int                        _w;
+       //Rectangle Height
+       int                        _h;
+       //Actual value
+       int                        _actual;
+       //Start of the rectangule
+       int                        _start;
+       //End of the rectangule
+       int                        _end;
+       //Logical Max
+       double                        _max;
+       //Logical Min
+       double                                             _min;
+       //Initial point when moving the rectangule bar according to bar reference 
+       int                                                _initialPoint;
+       /*
+       * Represents the id of the selected moving part of the bar where:
+       * 1 is for Start triangle, 2 for end triangle, 3 for actual triangle and 4 for the bar
+       */
+       int                                                _selectionMoveId;
+
+       //orientation of the rectangle is true when is horizontal and is the default value
+       bool                                            _orientation;
+
+       /*
+       * The property for identifying if the actual triangle needs to be or not between the limit triangles
+       */
+       bool                                            _in_rangeProperty;
+
+       /*
+       * The property for setting the acutal triangle to move with the bar keeping proportions with the limits
+       */
+       bool                                            _moveActualWithBar;
+
+       /*
+       * The property for setting visible or not the bar labels information
+       */
+       bool                                       _visibleLables;
+       /*
+       * X-Coord for left-superior device visible drawing
+       */
+       wxCoord                                         deviceStart_x;  
+
+       /*
+       * Y-Coord for left-superior device visible drawing
+       */
+       wxCoord                                         deviceStart_y;
+
+       /*
+       * X-Coord for right device margin
+       */
+       wxCoord                                         deviceEndMargin;        
+
+       /*
+       * Represents the active state of the bar
+       */
+       bool activeState;
+
+       /*
+       * Represents the option of activating or not the drawing of the actual triangle, that in default value is true for drawing it
+       * The dafault value is true (use the actual triangle)
+       */
+       bool withActualDrawed;
+
+       /*
+       * The colour of the start triangle
+       */          
+       wxColour start_Colour;
+
+       /*
+       * The colour of the actual triangle
+       */          
+       wxColour actual_Colour;
+
+       /*
+       * The colour of the end triangle
+       */          
+       wxColour end_Colour;
+
+       /*
+       * The colour of the bar
+       */          
+       wxColour bar_Colour;
+       /*
+       * Represents the real-x value to draw a vertical line
+       */
+       int                     realX_vertical_line;
+
+       /*
+       * Represents the last clickedX coord inside the bar.
+       */
+       int                     clickedX;
+
+       /*
+       * Represents the orientation for the numbers view label in the information bitmap.
+       * Where  -4:left, -6:right, -8:up, -2: down respect to the bar
+       */
+       int                     numberOrientation;      
+       /*
+       * Represents the logic initial reference start point used for dragging
+       */
+       int                     logicInitial_start;
+       /*
+       * Represents the logic intial reference end point used for dragging
+       */
+       int                     logicInitial_end;
+       /*
+       * Represents the logic initial reference actual point used for dragging
+       */
+       int                     logicInitial_actual;
+
+       /*
+       * Represents the pixel value assigned to as half of the width of the triangles 
+       */
+       int                     trianglesHalfWidth;
+
+       /*
+       * Represents the background color of the panel (this) where the bar is. The default color is the imediately parent background color
+       */
+       wxColour        backgroundColor;
+       /*
+       * Represents the color of the dot-line use as guides. The default color is RED. 
+       */
+       wxColour        guideLineColor;
+
+
+       bool acceptedClick;
+       
+
+       /*
+       * The color bar pop menu
+       */
+       wxMenu b_popmenu; 
+       //the bar bitmap device
+       wxBitmap        *_bitmap_bar;
+       //the info bitmap device 
+       wxBitmap        *_bitmap_info;
+       DECLARE_CLASS(BarRange)
+       // any class wishing to process wxWindows events must use this macro
+       DECLARE_EVENT_TABLE()
+};
+
+
+
+#endif
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mathplot.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mathplot.cxx
new file mode 100644 (file)
index 0000000..bda1902
--- /dev/null
@@ -0,0 +1,739 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mathplot.cpp
+// Purpose:     Framework for mathematical graph plotting in wxWindows
+// Author:      David Schalig
+// Modified by:
+// Created:     21/07/2003
+// Copyright:   (c) David Schalig
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+/*EED
+#ifdef __GNUG__
+#pragma implementation "plot.h"
+#endif
+*/
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+/*EED
+#ifndef WX_PRECOMP
+#include "wx/object.h"
+#include "wx/font.h"
+#include "wx/colour.h"
+#include "wx/settings.h"
+#include "wx/sizer.h"
+#include "wx/log.h"
+#include "wx/intl.h"
+#include "wx/dcclient.h"
+#endif
+
+// EED
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+*/
+
+
+#include "mathplot.h"
+//#include "wx/bmpbuttn.h"
+//#include "wx/module.h"
+
+//#include <math.h>
+
+//-----------------------------------------------------------------------------
+// mpLayer
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(mpLayer, wxObject)
+
+mpLayer::mpLayer()
+{
+// EED wx 2.8.5
+//     SetPen( *wxBLACK_PEN);
+//     SetFont(*wxNORMAL_FONT);
+
+       wxFont ff( *wxNORMAL_FONT);
+       wxPen pp( *wxBLACK_PEN);
+       SetPen( pp );
+       SetFont( ff );
+
+}
+
+//-----------------------------------------------------------------------------
+// mpLayer implementations - functions
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(mpFX, mpLayer)
+
+mpFX::mpFX(wxString name, int flags)
+{ 
+       SetName(name);
+       m_flags = flags; 
+}
+
+void mpFX::Plot(wxDC & dc, mpWindow & w)
+{
+       dc.SetPen( m_pen);
+
+       if (m_pen.GetWidth() <= 1) 
+       {
+               for (wxCoord i = -(w.GetScrX()>>1); i < (w.GetScrX()>>1); ++i)
+               {
+                       dc.DrawPoint(i, (wxCoord) ((w.GetPosY() - GetY( (double)i / w.GetScaleX() + w.GetPosX()) ) * w.GetScaleY()));
+               }
+       }
+       else
+       {
+               for (wxCoord i = -(w.GetScrX()>>1); i < (w.GetScrX()>>1); ++i)
+               {
+                       wxCoord c = (wxCoord) ((w.GetPosY() - GetY( (double)i / w.GetScaleX() + w.GetPosX()) ) * w.GetScaleY());
+                       dc.DrawLine( i, c, i, c);
+               }
+       }
+
+       if (!m_name.IsEmpty())
+       {
+               dc.SetFont(m_font);
+
+               wxCoord tx, ty;
+               dc.GetTextExtent(m_name, &tx, &ty);
+
+               if ((m_flags & mpALIGNMASK) == mpALIGN_RIGHT)
+                       tx = (w.GetScrX()>>1) - tx - 8;
+               else if ((m_flags & mpALIGNMASK) == mpALIGN_CENTER)
+                       tx = -tx/2;
+               else
+                       tx = -(w.GetScrX()>>1) + 8;
+
+               dc.DrawText( m_name, tx, (wxCoord) ((w.GetPosY() - GetY( (double)tx / w.GetScaleX() + w.GetPosX())) * w.GetScaleY()) );
+       }
+}
+
+IMPLEMENT_ABSTRACT_CLASS(mpFY, mpLayer)
+
+mpFY::mpFY(wxString name, int flags)
+{ 
+       SetName(name);
+       m_flags = flags;
+}
+
+void mpFY::Plot(wxDC & dc, mpWindow & w)
+{
+       dc.SetPen( m_pen);
+
+       wxCoord i;
+
+       if (m_pen.GetWidth() <= 1) 
+       {
+               for (i = -(w.GetScrY()>>1); i < (w.GetScrY()>>1); ++i)
+               {
+                       dc.DrawPoint((wxCoord) ((GetX( (double)i / w.GetScaleY() + w.GetPosY()) - w.GetPosX()) * w.GetScaleX()), -i);
+               }
+       }
+       else
+       {
+               for (i = -(w.GetScrY()>>1); i < (w.GetScrY()>>1); ++i)
+               {
+                       wxCoord c =  (wxCoord) ((GetX( (double)i / w.GetScaleY() + w.GetPosY()) - w.GetPosX()) * w.GetScaleX());
+                       dc.DrawLine(c, -i, c, -i);
+               }
+       }
+
+       if (!m_name.IsEmpty())
+       {
+               dc.SetFont(m_font);
+
+               wxCoord tx, ty;
+               dc.GetTextExtent(m_name, &tx, &ty);
+
+               if ((m_flags & mpALIGNMASK) == mpALIGN_TOP)
+                       ty = (w.GetScrY()>>1) - 8;
+               else if ((m_flags & mpALIGNMASK) == mpALIGN_CENTER)
+                       ty = 16 - ty/2;
+               else
+                       ty = -(w.GetScrY()>>1) + 8;
+
+               dc.DrawText( m_name, (wxCoord) ((GetX( (double)i / w.GetScaleY() + w.GetPosY()) - w.GetPosX()) * w.GetScaleX()), -ty);
+       }
+}
+
+IMPLEMENT_ABSTRACT_CLASS(mpFXY, mpLayer)
+
+mpFXY::mpFXY(wxString name, int flags)
+{ 
+       SetName(name);
+       m_flags = flags; 
+}
+
+void mpFXY::Plot(wxDC & dc, mpWindow & w)
+{
+       dc.SetPen( m_pen);
+
+       double x, y;
+       Rewind();
+
+       // for some reason DrawPoint does not use the current pen,
+       // so we use DrawLine for fat pens
+
+       if (m_pen.GetWidth() <= 1) 
+       {
+               while (GetNextXY(x, y))
+               {
+                       dc.DrawPoint( (wxCoord) ((x - w.GetPosX()) * w.GetScaleX()) ,
+                               (wxCoord) ((w.GetPosY() - y) * w.GetScaleY()) );
+               }
+       }
+       else
+       {
+               while (GetNextXY(x, y))
+               {
+                       wxCoord cx = (wxCoord) ((x - w.GetPosX()) * w.GetScaleX());
+                       wxCoord cy = (wxCoord) ((w.GetPosY() - y) * w.GetScaleY());
+                       dc.DrawLine(cx, cy, cx, cy);
+               }
+       }
+
+       if (!m_name.IsEmpty())
+       {
+               dc.SetFont(m_font);
+
+               wxCoord tx, ty;
+               dc.GetTextExtent(m_name, &tx, &ty);
+
+               // xxx implement else ... if (!HasBBox())
+               {
+                       const int sx = w.GetScrX()>>1;
+                       const int sy = w.GetScrY()>>1;
+
+                       if ((m_flags & mpALIGNMASK) == mpALIGN_NE)
+                       {
+                               tx = sx - tx - 8;
+                               ty = -sy + 8;
+                       }
+                       else if ((m_flags & mpALIGNMASK) == mpALIGN_NW)
+                       {
+                               tx = -sx + 8;
+                               ty = -sy + 8;
+                       }
+                       else if ((m_flags & mpALIGNMASK) == mpALIGN_SW)
+                       {
+                               tx = -sx + 8;
+                               ty = sy - 8 - ty;
+                       }
+                       else
+                       {
+                               tx = sx - tx - 8;
+                               ty = sy - 8 - ty;
+                       }
+               }
+               //else
+               //{
+               //}
+
+               dc.DrawText( m_name, tx, ty);
+       }
+}
+
+//-----------------------------------------------------------------------------
+// mpLayer implementations - furniture (scales, ...)
+//-----------------------------------------------------------------------------
+
+#define mpLN10 2.3025850929940456840179914546844
+
+IMPLEMENT_CLASS(mpScaleX, mpLayer)
+
+mpScaleX::mpScaleX(wxString name)
+{ 
+       SetName(name);/*
+       SetFont(*wxSMALL_FONT);
+       SetPen(*wxGREY_PEN);*/
+
+       wxFont ff( *wxSMALL_FONT);
+       wxPen pp( *wxGREY_PEN);
+       SetPen( pp );
+       SetFont( ff );
+}
+
+void mpScaleX::Plot(wxDC & dc, mpWindow & w)
+{
+       dc.SetPen( m_pen);
+       dc.SetFont( m_font);
+
+       const int orgy   = (int)(w.GetPosY() * w.GetScaleY());
+       const int extend = w.GetScrX()/2;
+
+       dc.DrawLine( -extend, orgy, extend, orgy);
+
+       const double dig  = floor( log( 128.0 / w.GetScaleX() ) / mpLN10 );
+       const double step = exp( mpLN10 * dig);
+       const double end  = w.GetPosX() + (double)extend / w.GetScaleX();
+
+       wxCoord tx, ty;
+       wxString s;
+       wxString fmt;
+       int tmp = (int)dig;
+       if (tmp>=1)
+       {
+               fmt = wxT("%.f");
+       }
+       else
+       {
+               tmp=8-tmp;
+               fmt.Printf(wxT("%%.%df"), tmp >= -1 ? 2 : -tmp);
+       }
+
+       double n = floor( (w.GetPosX() - (double)extend / w.GetScaleX()) / step ) * step ;
+
+       tmp=-65535;
+       for (;n < end; n += step)
+       {
+               const int p = (int)((n - w.GetPosX()) * w.GetScaleX());
+               dc.DrawLine( p, orgy, p, orgy+4);
+
+               s.Printf(fmt, n);
+               dc.GetTextExtent(s, &tx, &ty);
+               if ((p-tx/2-tmp) > 64)
+               {
+                       dc.DrawText( s, p-tx/2, orgy+4);
+                       tmp=p+tx/2;
+               }
+       }
+
+       dc.GetTextExtent(m_name, &tx, &ty);
+       dc.DrawText( m_name, extend - tx - 4, orgy + 4 + ty);
+}
+
+IMPLEMENT_CLASS(mpScaleY, mpLayer)
+
+mpScaleY::mpScaleY(wxString name)
+{ 
+       SetName(name);/*
+       SetFont(*wxSMALL_FONT);
+       SetPen(*wxGREY_PEN);*/
+       wxFont ff( *wxSMALL_FONT);
+       wxPen pp( *wxGREY_PEN);
+       SetPen( pp );
+       SetFont( ff );
+}
+
+void mpScaleY::Plot(wxDC & dc, mpWindow & w)
+{
+       dc.SetPen( m_pen);
+       dc.SetFont( m_font);
+
+       const int orgx   = -(int)(w.GetPosX() * w.GetScaleX());
+       const int extend = w.GetScrY()/2;
+
+       dc.DrawLine( orgx, -extend, orgx, extend);
+
+       const double dig  = floor( log( 128.0 / w.GetScaleY() ) / mpLN10 );
+       const double step = exp( mpLN10 * dig);
+       const double end  = w.GetPosY() + (double)extend / w.GetScaleY();
+
+       wxCoord tx, ty;
+       wxString s;
+       wxString fmt;
+       int tmp = (int)dig;
+       if (tmp>=1)
+       {
+               fmt = wxT("%.f");
+       }
+       else
+       {
+               tmp=8-tmp;
+               fmt.Printf(wxT("%%.%df"), tmp >= -1 ? 2 : -tmp);
+       }
+
+       double n = floor( (w.GetPosY() - (double)extend / w.GetScaleY()) / step ) * step ;
+
+       tmp=65536;
+       for (;n < end; n += step)
+       {
+               const int p = (int)((w.GetPosY() - n) * w.GetScaleY());
+               dc.DrawLine( orgx, p, orgx+4, p);
+
+               s.Printf(fmt, n);
+               dc.GetTextExtent(s, &tx, &ty);
+               if ((tmp-p+ty/2) > 32)
+               {
+                       dc.DrawText( s, orgx+4, p-ty/2);
+                       tmp=p-ty/2;
+               }
+       }
+
+       dc.GetTextExtent(m_name, &tx, &ty);
+       dc.DrawText( m_name, orgx-tx-4, -extend + ty + 4);
+}
+
+//-----------------------------------------------------------------------------
+// mpWindow
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(mpWindow, wxScrolledWindow)
+
+BEGIN_EVENT_TABLE(mpWindow, wxScrolledWindow)
+EVT_PAINT    ( mpWindow::OnPaint)
+EVT_SIZE     ( mpWindow::OnSize)
+EVT_SCROLLWIN( mpWindow::OnScroll2)
+
+EVT_MIDDLE_UP( mpWindow::OnShowPopupMenu)
+EVT_RIGHT_UP ( mpWindow::OnShowPopupMenu)
+EVT_MENU( mpID_CENTER,    mpWindow::OnCenter)
+EVT_MENU( mpID_FIT,       mpWindow::OnFit)
+EVT_MENU( mpID_ZOOM_IN,   mpWindow::OnZoomIn)
+EVT_MENU( mpID_ZOOM_OUT,  mpWindow::OnZoomOut)
+//EVT_MENU( mpID_LINE_GUIDES, mpWindow::OnGuideLines)
+// New method that belongs to the mpWindow
+EVT_MENU( mpID_LOCKASPECT,mpWindow::OnLockAspect)
+END_EVENT_TABLE()
+
+mpWindow::mpWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag )
+: wxScrolledWindow( parent, id, pos, size, flag, wxT("wxPlotter") )
+{
+       m_scaleX = m_scaleY = 1.0;
+       m_posX   = m_posY   = 0;
+       m_scrX   = m_scrY   = 64;
+       m_minX   = m_minY   = 0;
+       m_maxX   = m_maxY   = 0;
+       maxScrX = maxScrY   = 200;
+       minScrX = minScrY   = 0;
+       m_clickedX =  0;
+       m_clickedY = 5000;
+       m_lockaspect = FALSE;
+       offsetX = offsetY = 0;
+       offsetPixelX = offsetPixelY= 0;
+
+       real_guideLine_X = -1;
+       real_guideLine_Y = -1;
+       drawGuides = true;
+       type=1;
+
+       m_popmenu.Append( mpID_CENTER,     _("Center"),      _("Center plot view to this position"));
+       m_popmenu.Append( mpID_FIT,        _("Fit"),         _("Set plot view to show all items"));
+       m_popmenu.Append( mpID_ZOOM_IN,    _("Zoom in"),     _("Zoom in plot view."));
+       m_popmenu.Append( mpID_ZOOM_OUT,   _("Zoom out"),    _("Zoom out plot view."));
+       m_popmenu.AppendCheckItem( mpID_LOCKASPECT, _("Lock aspect"), _("Lock horizontal and vertical zoom aspect."));
+
+       m_popmenu.AppendCheckItem( mpID_LINE_GUIDES, _("Turn off guide lines"), _("Enables/Disables the guide lines"));
+
+       m_layers.DeleteContents(TRUE);
+       SetBackgroundColour( *wxWHITE );
+       EnableScrolling(FALSE, FALSE);
+       SetSizeHints(128, 128);
+       
+       //_bitmap_functions= new wxBitmap(700,800);
+
+       UpdateAll();
+}
+
+mpWindow::~mpWindow()
+{
+}
+
+void mpWindow::Fit()
+{
+       if (UpdateBBox())
+       {
+               int cx, cy;
+               GetClientSize( &cx, &cy);
+
+               double d;
+               d = m_maxX - m_minX;
+               if (d!=0)
+               {
+                       m_scaleX = cx/d;
+                       m_posX = m_minX + d/2;
+               }
+               d = m_maxY - m_minY;
+               if (d!=0)
+               {
+                       m_scaleY = cy/d;
+                       m_posY = m_minY + d/2;
+               }
+
+               if (m_lockaspect)
+               {
+                       double s = (m_scaleX + m_scaleY)/2;
+                       m_scaleX = s;
+                       m_scaleY = s;
+               }
+
+               UpdateAll();
+       }
+}
+
+void mpWindow::ZoomIn()
+{
+       m_scaleX = m_scaleX * 2;
+       m_scaleY = m_scaleY * 2;
+       UpdateAll();
+}
+
+void mpWindow::ZoomOut()
+{
+       m_scaleX = m_scaleX / 2;
+       m_scaleY = m_scaleY / 2;
+       UpdateAll();
+}
+
+void mpWindow::LockAspect(bool enable)
+{
+       m_lockaspect = enable;
+
+       m_popmenu.Check(mpID_LOCKASPECT, enable);
+
+       if (m_lockaspect)
+       {
+               double s = (m_scaleX + m_scaleY)/2;
+               m_scaleX = s;
+               m_scaleY = s;
+       }
+
+       UpdateAll();
+}
+
+void mpWindow::OnShowPopupMenu(wxMouseEvent &event)
+{
+       m_clickedX = event.GetX();
+       m_clickedY = event.GetY();
+       PopupMenu( &m_popmenu, event.GetX(), event.GetY());
+}
+
+void mpWindow::OnLockAspect(wxCommandEvent &event)
+{
+       LockAspect( !m_popmenu.IsChecked(mpID_LOCKASPECT) );
+}
+
+void mpWindow::OnFit(wxCommandEvent &event)
+{
+       Fit();
+}
+
+void mpWindow::OnCenter(wxCommandEvent &event)
+{
+       int cx, cy;
+       GetClientSize(&cx, &cy);
+       SetPos( (double)(m_clickedX-cx/2) / m_scaleX + m_posX, (double)(cy/2-m_clickedY) / m_scaleY + m_posY);
+}
+
+void mpWindow::OnZoomIn(wxCommandEvent &event)
+{
+       int cx, cy;
+       GetClientSize(&cx, &cy);
+       m_posX = (double)(m_clickedX-cx/2) / m_scaleX + m_posX;
+       m_posY = (double)(cy/2-m_clickedY) / m_scaleY + m_posY;
+       ZoomIn();
+}
+
+void mpWindow::OnZoomOut(wxCommandEvent &event)
+{
+       ZoomOut();
+}
+
+void mpWindow::OnSize( wxSizeEvent &event )
+{
+       UpdateAll();
+}
+
+bool mpWindow::AddLayer( mpLayer* layer)
+{
+       bool ret = m_layers.Append( layer) != NULL;
+       UpdateAll();
+       return ret;
+}
+
+void mpWindow::DelLayer( mpLayer* layer)
+{
+       m_layers.DeleteObject( layer);
+       UpdateAll();
+}
+
+void mpWindow::Refresh(bool eraseBackground, const wxRect* rect)
+{
+       wxScrolledWindow::Refresh(false);
+}
+
+
+void mpWindow::OnPaint( wxPaintEvent &event )
+{
+       wxPaintDC dc(this);
+       dc.GetSize(&m_scrX, &m_scrY);
+
+       //m_scrX=200;
+       //m_scrY=200;
+
+       wxMemoryDC temp_dc;
+       //_bitmap_functions->SetWidth(m_scrX);
+       //_bitmap_functions->SetHeight(m_scrY);
+       _bitmap_functions=new wxBitmap(m_scrX,m_scrY);
+       temp_dc.SelectObject(*_bitmap_functions);
+
+       // Background
+       //      wxColour colourParent =  wxColour(255,0,0);
+       temp_dc.SetBrush(wxBrush( *wxWHITE_BRUSH  ) );
+       temp_dc.SetPen(wxPen( *wxBLACK_PEN  ));
+       temp_dc.DrawRectangle(0,0,m_scrX,m_scrY);
+       
+
+       wxNode *node = m_layers.GetFirst();
+       while (node)
+       {
+               ((mpLayer*)node->GetData())->Plot( temp_dc, *this);
+               node = node->GetNext();
+       }
+       
+       //dc.SetDeviceOrigin(70,40);
+       //dc.SetAxisOrientation(false,true);
+       temp_dc.SetAxisOrientation(true,false);
+       dc.Blit(0,0, m_scrX, m_scrY, &temp_dc,-70,-m_scrY+40);
+       delete _bitmap_functions; 
+       //_bitmap_functions
+       //dc.SetAxisOrientation(false,true);
+
+
+}
+
+/*
+void mpWindow::OnPaint( wxPaintEvent &event )
+{
+       wxPaintDC dc(this);
+       
+       //dc.BeginDrawing();
+       
+       dc.GetSize(&m_scrX, &m_scrY);
+       
+       //const int orgy   = m_scrY-40;
+       //dc.SetDeviceOrigin(70,orgy);
+       //dc.SetAxisOrientation(true,true);
+
+//     wxMemoryDC temp_dc;
+//     
+//     //_bitmap_functions=new wxBitmap(m_scrX,m_scrY);
+//     
+//     _bitmap_functions->SetWidth(100);//m_scrX);
+//     _bitmap_functions->SetHeight(200);//m_scrY);
+//     
+//     temp_dc.SelectObject(*_bitmap_functions);
+//     
+//     // Background
+//     wxColour colourParent =  wxColour(255,0,0);
+//     temp_dc.SetBrush(wxBrush( colourParent ,wxSOLID  ));
+//     temp_dc.SetPen(wxPen( colourParent ,1,wxSOLID  ));
+//     temp_dc.DrawRectangle(0,0,100,200);
+//     dc.Blit(0,0, 100, 200, &temp_dc,0,0);
+//     //dc.SetDeviceOrigin( m_scrX>>1, m_scrY>>1);
+
+       wxNode *node = m_layers.GetFirst();
+       while (node)
+       {
+               ((mpLayer*)node->GetData())->Plot( dc, *this);
+               node = node->GetNext();
+       }
+       //temp_dc.SetAxisOrientation(true,false);
+       //dc.EndDrawing();
+       // dc.SetAxisOrientation(true,true);
+        //dc.Blit(70,(int)(-m_scrY+40),m_scrX-100,m_scrY-50,&temp_dc,0,0);
+}
+*/
+
+void mpWindow::OnScroll2(wxScrollWinEvent &event)
+{
+       int width, height;
+       GetClientSize( &width, &height);
+       int px, py;
+       GetViewStart( &px, &py);
+
+       if (event.GetOrientation() == wxHORIZONTAL)
+       {
+               SetPosX( (double)px / GetScaleX() + m_minX + (double)(width>>1)/GetScaleX());
+       }
+       else
+       {
+               SetPosY( m_maxY - (double)py / GetScaleY() - (double)(height>>1)/GetScaleY());
+       }
+       event.Skip();
+}
+
+bool mpWindow::UpdateBBox()
+{
+       bool first = TRUE;
+
+       wxNode *node = m_layers.GetFirst();
+
+       while(node)
+       {
+               mpLayer* f = (mpLayer*)node->GetData();
+
+               if (f->HasBBox())
+               {
+                       if (first)
+                       {
+                               first = FALSE;
+                               m_minX = f->GetMinX(); m_maxX=f->GetMaxX();
+                               m_minY = f->GetMinY(); m_maxY=f->GetMaxY();
+                       }
+                       else
+                       {
+                               if (f->GetMinX()<m_minX) m_minX=f->GetMinX(); if (f->GetMaxX()>m_maxX) m_maxX=f->GetMaxX();
+                               if (f->GetMinY()<m_minY) m_minY=f->GetMinY(); if (f->GetMaxY()>m_maxY) m_maxY=f->GetMaxY();
+                       }
+               }
+               node = node->GetNext();
+       }
+
+       return first == FALSE;
+}
+
+void mpWindow :: UpdateAll()
+{
+       if (UpdateBBox())
+       {
+               int cx, cy;
+               GetClientSize( &cx, &cy);
+
+               const int sx = (int)((m_maxX - m_minX) * GetScaleX());
+               const int sy = (int)((m_maxY - m_minY) * GetScaleY());
+               const int px = (int)((GetPosX() - m_minX) * GetScaleX() - (cx>>1));
+               const int py = (int)((GetPosY() - m_minY) * GetScaleY() - (cy>>1));
+               //SetScrollbars( 1, 1, sx, sy, px, py);
+       }
+
+       FitInside();
+       Refresh( false );
+}
+
+/*
+* Guide lines menu handler method that reacts to the mpID_LINE_GUIDES cimmand event
+* event The corresponding event to handle
+*/
+/*
+void mpWindow :: OnGuideLines (wxCommandEvent   &event)
+{
+       wxString nextAction_text;
+       if( drawGuides )
+       {
+               setLineGuidesCondition(false);
+               nextAction_text << "Turn on guide lines";
+               UpdateAll();
+       }
+       else
+       {
+               setLineGuidesCondition(true);
+               nextAction_text << "Turn off guide lines";
+               UpdateAll();
+       }
+       m_popmenu.SetLabel ( mpID_LINE_GUIDES, nextAction_text ); 
+}
+*/
+
+
+
+bool mpWindow::drawGuideLines()
+       {
+               return drawGuides;
+       }       
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mathplot.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/mathplot.h
new file mode 100644 (file)
index 0000000..dc06a25
--- /dev/null
@@ -0,0 +1,887 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mathplot.h
+// Purpose:     Framework for mathematical graph plotting in wxWindows
+// Author:      David Schalig
+// Modified by:
+// Created:     21/07/2003
+// Copyright:   (c) David Schalig
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MP_MATHPLOT_H_
+#define _MP_MATHPLOT_H_
+#define ZOOM_FACTOR 1.5
+
+/* @file mathplot.h */
+/* @mainpage wxMathPlot
+wxMathPlot is a framework for mathematical graph plotting in wxWindows.
+
+The framework is designed for convenience and ease of use.
+
+@section screenshots Screenshots
+<a href="screenshots.html">Go to the screenshots page.</a>
+
+@section overview Overview
+The heart of wxMathPlot is mpWindow, which is a 2D canvas for plot layers.
+mpWindow can be embedded as subwindow in a wxPane, a wxFrame, or any other wxWindow.
+mpWindow provides a zoomable and moveable view of the layers. The current view can
+be controlled with the mouse, the scrollbars, and a context menu.
+
+Plot layers are implementations of the abstract base class mpLayer. Those can
+be function plots, scale rulers, or any other vector data visualisation. wxMathPlot provides
+two mpLayer implementations for plotting horizontal and vertical rulers: mpScaleX and mpScaleY.
+For convenient function plotting three more abstract base classes derived from mpLayer
+are provided: mpFX, mpFY and mpFXY. These base classes already come with plot code, own
+functions can be implemented by overiding just one member for retrieving a function value.
+
+@section coding Coding conventions
+wxMathPlot sticks to wxWindow's coding conventions. All entities defined by wxMathPlot
+have the prefix <i>mp</i>.
+
+@section author Author and license
+wxMathPlot is published under the terms of the wxWindow license.
+The author David Schalig can be contacted via the wxMathPlot's homepage at
+http://sourceforge.net/projects/wxmathplot
+*/
+
+/*
+#if defined(__GNUG__) && !defined(__APPLE__)
+#pragma interface "mathplot.h"
+#endif
+*/
+
+#include "wx/defs.h"
+#include <wx/wx.h>
+
+/*
+#include "wx/menu.h"
+#include "wx/scrolwin.h"
+#include "wx/event.h"
+#include "wx/dynarray.h"
+*/
+
+//-----------------------------------------------------------------------------
+// classes
+//-----------------------------------------------------------------------------
+
+class  mpLayer;
+class  mpFX;
+class  mpFY;
+class  mpFXY;
+class  mpScaleX;
+class  mpScaleY;
+class  mpWindow;
+
+/** Command IDs used by mpWindow */
+enum
+{
+       mpID_FIT = 2000,    //!< Fit view to match bounding box of all layers
+       mpID_ZOOM_IN,       //!< Zoom into view at clickposition / window center
+       mpID_ZOOM_OUT,      //!< Zoom out
+       mpID_CENTER,        //!< Center view on click position
+       mpID_LOCKASPECT,    //!< Lock x/y scaling aspect
+       mpID_LINE_GUIDES,       //!< Enables or disables the line guides drawing condition
+};
+
+//-----------------------------------------------------------------------------
+// mpLayer
+//-----------------------------------------------------------------------------
+
+/** Plot layer, abstract base class.
+Any number of mpLayer implementations can be attached to mpWindow.
+Examples for mpLayer implementations are function graphs, or scale rulers.
+
+For convenience mpLayer defines a name, a font (wxFont), and a pen (wxPen)
+as class members. These may or may not be used by implementations.
+*/
+class  mpLayer : public wxObject
+{
+public:
+       mpLayer();
+
+       /** Check whether this layer has a bounding box.
+       The default implementation returns \a TRUE. Overide and return
+       FALSE if your mpLayer implementation should be ignored by the calculation
+       of the global bounding box for all layers in a mpWindow.
+       @retval TRUE Has bounding box
+       @retval FALSE Has not bounding box
+       */
+       virtual bool   HasBBox() { return TRUE; }
+
+       /** Get inclusive left border of bounding box.
+       @return Value
+       */
+       virtual double GetMinX() { return -1.0; }
+
+       /** Get inclusive right border of bounding box.
+       @return Value
+       */
+       virtual double GetMaxX() { return  1.0; }
+
+       /** Get inclusive bottom border of bounding box.
+       @return Value
+       */
+       virtual double GetMinY() { return -1.0; }
+
+       /** Get inclusive top border of bounding box.
+       @return Value
+       */
+       virtual double GetMaxY() { return  1.0; }
+
+       /** Plot given view of layer to the given device context.
+       An implementation of this function has to transform layer coordinates to
+       wxDC coordinates based on the view parameters retrievable from the mpWindow
+       passed in \a w. The passed device context \a dc has its coordinate origin set
+       to the center of the visible area. The coordinate orientation is as show in the
+       following picture:
+       <pre>
+       +--------------------------------------------------+
+       |                                                  |
+       |                                                  |
+       |                (wxDC origin 0,0)                 |
+       |                       x-------------> acending X |
+       |                       |                          |
+       |                       |                          |
+       |                       V ascending Y              |
+       +--------------------------------------------------+
+       </pre>
+       Note that Y ascends in downward direction, whereas the usual vertical orientation
+       for mathematical plots is vice versa. Thus Y-orientation will be swapped usually,
+       when transforming between wxDC and mpLayer coordinates.
+
+       <b> Rules for transformation between mpLayer and wxDC coordinates </b>
+       @code
+       dc_X = (layer_X - mpWindow::GetPosX()) * mpWindow::GetScaleX()
+       dc_Y = (mpWindow::GetPosY() - layer_Y) * mpWindow::GetScaleY() // swapping Y-orientation
+
+       layer_X = (dc_X / mpWindow::GetScaleX()) + mpWindow::GetPosX() // scale guaranted to be not 0
+       layer_Y = mpWindow::GetPosY() - (dc_Y / mpWindow::GetScaleY()) // swapping Y-orientation
+       @endcode
+
+       @param dc Device context to plot to.
+       @param w  View to plot. The visible area can be retrieved from this object.
+       */
+       virtual void   Plot(wxDC & dc, mpWindow & w) = 0;
+
+       /** Get layer name.
+       @return Name
+       */
+       wxString       GetName() const { return m_name; }
+
+       /** Get font set for this layer.
+       @return Font
+       */
+       const wxFont&  GetFont() const { return m_font; }
+
+       /** Get pen set for this layer.
+       @return Pen
+       */
+       const wxPen&   GetPen()  const { return m_pen;  }
+
+       /** Set layer name
+       @param name Name, will be copied to internal class member
+       */
+       void SetName(wxString name) { m_name = name; }
+
+       /** Set layer font
+       @param font Font, will be copied to internal class member
+       */
+       void SetFont(wxFont& font)  { m_font = font; }
+
+       /** Set layer pen
+       @param pen Pen, will be copied to internal class member
+       */
+       void SetPen(wxPen& pen)     { m_pen  = pen;  }
+
+protected:
+       wxFont   m_font;    //!< Layer's font
+       wxPen    m_pen;     //!< Layer's pen
+       wxString m_name;    //!< Layer's name
+
+       DECLARE_CLASS(mpLayer)
+};
+
+//-----------------------------------------------------------------------------
+// mpLayer implementations - functions
+//-----------------------------------------------------------------------------
+
+/** @name Label alignment constants
+@{*/
+
+/** @internal */
+#define mpALIGNMASK    0x03
+/** Aligns label to the right. For use with mpFX. */
+#define mpALIGN_RIGHT  0x00
+/** Aligns label to the center. For use with mpFX and mpFY. */
+#define mpALIGN_CENTER 0x01
+/** Aligns label to the left. For use with mpFX. */
+#define mpALIGN_LEFT   0x02
+/** Aligns label to the top. For use with mpFY. */
+#define mpALIGN_TOP    mpALIGN_RIGHT
+/** Aligns label to the bottom. For use with mpFY. */
+#define mpALIGN_BOTTOM mpALIGN_LEFT
+/** Aligns label to north-east. For use with mpFXY. */
+#define mpALIGN_NE     0x00
+/** Aligns label to north-west. For use with mpFXY. */
+#define mpALIGN_NW     0x01
+/** Aligns label to south-west. For use with mpFXY. */
+#define mpALIGN_SW     0x02
+/** Aligns label to south-east. For use with mpFXY. */
+#define mpALIGN_SE     0x03
+
+/*@}*/
+
+/** @name mpLayer implementations - functions
+@{*/
+
+/** Abstract base class providing plot and labeling functionality for functions F:X->Y.
+Override mpFX::GetY to implement a function.
+Optionally implement a constructor and pass a name (label) and a label alignment
+to the constructor mpFX::mpFX. If the layer name is empty, no label will be plotted.
+*/
+class  mpFX : public mpLayer
+{
+public:
+       /** @param name  Label
+       @param flags Label alignment, pass one of #mpALIGN_RIGHT, #mpALIGN_CENTER, #mpALIGN_LEFT.
+       */
+       mpFX(wxString name = wxEmptyString, int flags = mpALIGN_RIGHT);
+
+       /** Get function value for argument.
+       Override this function in your implementation.
+       @param x Argument
+       @return Function value
+       */
+       virtual double GetY( double x ) = 0;
+
+       /** Layer plot handler.
+       This implementation will plot the function in the visible area and
+       put a label according to the aligment specified.
+       */
+       virtual void Plot(wxDC & dc, mpWindow & w);
+
+protected:
+       int m_flags; //!< Holds label alignment
+
+       DECLARE_CLASS(mpFX)
+};
+
+/** Abstract base class providing plot and labeling functionality for functions F:Y->X.
+Override mpFY::GetX to implement a function.
+Optionally implement a constructor and pass a name (label) and a label alignment
+to the constructor mpFY::mpFY. If the layer name is empty, no label will be plotted.
+*/
+class  mpFY : public mpLayer
+{
+public:
+       /** @param name  Label
+       @param flags Label alignment, pass one of #mpALIGN_BOTTOM, #mpALIGN_CENTER, #mpALIGN_TOP.
+       */
+       mpFY(wxString name = wxEmptyString, int flags = mpALIGN_TOP);
+
+       /** Get function value for argument.
+       Override this function in your implementation.
+       @param y Argument
+       @return Function value
+       */
+       virtual double GetX( double y ) = 0;
+
+       /** Layer plot handler.
+       This implementation will plot the function in the visible area and
+       put a label according to the aligment specified.
+       */
+       virtual void Plot(wxDC & dc, mpWindow & w);
+
+protected:
+       int m_flags; //!< Holds label alignment
+
+       DECLARE_CLASS(mpFY)
+};
+
+/** Abstract base class providing plot and labeling functionality for a locus plot F:N->X,Y.
+Locus argument N is assumed to be in range 0 .. MAX_N, and implicitely derived by enumrating
+all locus values. Override mpFXY::Rewind and mpFXY::GetNextXY to implement a locus.
+Optionally implement a constructor and pass a name (label) and a label alignment
+to the constructor mpFXY::mpFXY. If the layer name is empty, no label will be plotted.
+*/
+class  mpFXY : public mpLayer
+{
+public:
+       /** @param name  Label
+       @param flags Label alignment, pass one of #mpALIGN_NE, #mpALIGN_NW, #mpALIGN_SW, #mpALIGN_SE.
+       */
+       mpFXY(wxString name = wxEmptyString, int flags = mpALIGN_NE);
+
+       /** Rewind value enumeration with mpFXY::GetNextXY.
+       Override this function in your implementation.
+       */
+       virtual void Rewind() = 0;
+
+       /** Get locus value for next N.
+       Override this function in your implementation.
+       @param x Returns X value
+       @param y Returns Y value
+       */
+       virtual bool GetNextXY(double & x, double & y) = 0;
+
+       /** Layer plot handler.
+       This implementation will plot the locus in the visible area and
+       put a label according to the aligment specified.
+       */
+       virtual void Plot(wxDC & dc, mpWindow & w);
+
+protected:
+       int m_flags; //!< Holds label alignment
+
+       DECLARE_CLASS(mpFXY)
+};
+
+/*@}*/
+
+//-----------------------------------------------------------------------------
+// mpLayer implementations - furniture (scales, ...)
+//-----------------------------------------------------------------------------
+
+/** @name mpLayer implementations - furniture (scales, ...)
+@{*/
+
+/** Plot layer implementing a x-scale ruler.
+The ruler is fixed at Y=0 in the coordinate system. A label is plottet at
+the bottom-right hand of the ruler. The scale numbering automatically
+adjusts to view and zoom factor.
+*/
+class  mpScaleX : public mpLayer
+{
+public:
+       /** @param name Label to plot by the ruler */
+       mpScaleX(wxString name = wxT("X"));
+
+       /** Layer plot handler.
+       This implementation will plot the ruler adjusted to the visible area.
+       */
+       virtual void Plot(wxDC & dc, mpWindow & w);
+
+       /** Check whether this layer has a bounding box.
+       This implementation returns \a FALSE thus making the ruler invisible
+       to the plot layer bounding box calculation by mpWindow.
+       */
+       virtual bool HasBBox() { return FALSE; }
+
+       DECLARE_CLASS(mpScaleX)
+};
+
+/** Plot layer implementing a y-scale ruler.
+The ruler is fixed at X=0 in the coordinate system. A label is plottet at
+the top-right hand of the ruler. The scale numbering automatically
+adjusts to view and zoom factor.
+*/
+class  mpScaleY : public mpLayer
+{
+public:
+       /** @param name Label to plot by the ruler */
+       mpScaleY(wxString name = wxT("Y"));
+
+       /** Layer plot handler.
+       This implementation will plot the ruler adjusted to the visible area.
+       */
+       virtual void Plot(wxDC & dc, mpWindow & w);
+
+       /** Check whether this layer has a bounding box.
+       This implementation returns \a FALSE thus making the ruler invisible
+       to the plot layer bounding box calculation by mpWindow.
+       */
+       virtual bool HasBBox() { return FALSE; }
+
+protected:
+
+       DECLARE_CLASS(mpScaleY)
+};
+
+//-----------------------------------------------------------------------------
+// mpWindow
+//-----------------------------------------------------------------------------
+
+/** @name Constants defining mouse modes for mpWindow
+@{*/
+
+/** Mouse panning drags the view. Mouse mode for mpWindow. */
+#define mpMOUSEMODE_DRAG    0
+/** Mouse panning creates a zoom box. Mouse mode for mpWindow. */
+#define mpMOUSEMODE_ZOOMBOX 1
+
+/*@}*/
+
+/** Canvas for plotting mpLayer implementations.
+
+This class defines a zoomable and moveable 2D plot canvas. Any number
+of mpLayer implementations (scale rulers, function plots, ...) can be
+attached using mpWindow::AddLayer.
+
+The canvas window provides a context menu with actions for navigating the view.
+The context menu can be retrieved with mpWindow::GetPopupMenu, e.g. for extending it
+externally.
+*/
+class  mpWindow : public wxScrolledWindow
+{
+public:
+       mpWindow() {}
+       mpWindow( wxWindow *parent, wxWindowID id,
+               const wxPoint &pos = wxDefaultPosition, 
+               const wxSize &size = wxDefaultSize,
+               int flags = 0);
+       ~mpWindow();
+
+       /** Get reference to context menu of the plot canvas.
+       @return Pointer to menu. The menu can be modified.
+       */
+       wxMenu* GetPopupMenu() { return &m_popmenu; }
+
+       //-----------------------
+       // new methods for plotter
+       //-----------------------
+       /*
+        Set Type
+       */
+       void setType(int t)
+       {
+               type=t;
+       }
+       /*
+        Get Type
+       */
+       int getType()
+       {
+               return type;
+       }
+               
+       
+       /**
+        set the max value in the x axis
+        @param maxX 
+       */
+       void setMaxScrX(int maxX)
+       {
+               maxScrX=maxX;
+       }
+       /**
+        set the max value in the y axis
+        @param maxY
+       */
+       void setMaxScrY(int maxY)
+       {
+               maxScrY=maxY;
+       }
+       
+       
+       /**Get maximum value in x
+        @return maxScrX
+       */
+       double getMaxScrX()
+       {
+               return maxScrX;
+       }
+       /**Get maximum value in y
+        @return maxScrY
+       */
+       double getMaxScrY()
+       {
+               return maxScrY;
+       }
+       /*
+        returns the zoomFactor
+       */
+       float getZoomFactor()
+       {
+               return zoomFactor;
+       }
+       /**
+        set the min value in the x axis
+        @param minX 
+       */
+       void setMinScrX(int minX)
+       {
+               minScrX=minX;
+       }
+       /**
+        set the min value in the y axis
+        @param minY
+       */
+       void setMinScrY(int minY)
+       {
+               minScrY=minY;
+       }
+       
+       
+       /**Get miniimum value in x
+        @return minScrX
+       */
+       double getMinScrX()
+       {
+               return minScrX;
+       }
+       /**Get minimum value in y
+        @return minScrY
+       */
+       double getMinScrY()
+       {
+               return minScrY;
+       }
+
+       /**
+       Get the x-clicked by the user
+       @return m_clickedX
+       */
+       int getClickedX()
+       {
+               return m_clickedX;
+       }
+
+       /**
+       Get the y-clicked by the user
+       @return m_clickedY
+       */
+       int getClickedY()
+       {
+               return m_clickedY;
+       }
+       
+       /**
+       Gets the x-offset of the zoom
+       in pixels
+       */
+       int getOffsetPixelsX()
+       {
+               return offsetPixelX;
+       }       
+       
+       /**
+       Gets the offset of the zoom
+       in pixels
+       */
+       int getOffsetPixelsY()
+       {
+               return offsetPixelY;
+       }
+       /**
+        Set the x-offset of the zoom
+       */
+       void setOffsetPixelX(int offX)
+       {
+               offsetPixelX=offX;
+       }
+       /**
+        Set the y-offset of the zoom
+       */
+       void setOffsetPixelY(int offY)
+       {
+               offsetPixelY=offY;
+       }       
+       
+       /**
+       Gets the x-offset of the zoom
+       */
+       int getOffsetX()
+       {
+               return offsetX;
+       }       
+       
+       /**
+       Gets the offset of the zoom
+       */
+       int getOffsetY()
+       {
+               return offsetY;
+       }
+       /**
+        Set the x-offset of the zoom
+       */
+       void setOffsetX(int offX)
+       {
+               offsetX=offX;
+       }
+       /**
+        Set the y-offset of the zoom
+       */
+       void setOffsetY(int offY)
+       {
+               offsetY=offY;
+       }       
+       
+       /*
+       * Sets real value of the y-coord for the vertical guide line
+       * @param newX_realGuide The new value to assing for the vertical guide
+       */
+       void setRealGuideX(int newX_realGuide)
+       {               
+               real_guideLine_X = newX_realGuide;      
+               if(real_guideLine_X!=-1)
+                       UpdateAll();
+       }
+
+       /*
+       * Gets the real value of the y-coord for the vertical guide line
+       * @retval real_guideLine_X The assigned value for the vertical guide
+       */
+       int getRealGuideX()
+       {
+               return real_guideLine_X;
+       }       
+
+       /*
+       * Sets real value of the y-coord for the vertical guide line
+       * @param newY_realGuide The new value to assing for the vertical guide
+       */
+       void setRealGuideY(int newY_realGuide)
+       {               
+               real_guideLine_Y = newY_realGuide;      
+               if(real_guideLine_Y!=-1)
+                       UpdateAll();
+       }
+
+       /*
+       * Gets the real value of the y-coord for the vertical guide line
+       * @retval real_guideLine_Y The assigned value for the vertical guide
+       */
+       int getRealGuideY()
+       {
+               return real_guideLine_Y;
+       }               
+
+       /*
+       * Sets the condition for drawing or not the guide lines
+       * @param ifDrawing The new condition to assing 
+       */
+       /*void setLineGuidesCondition(bool ifDrawing)
+       {               
+               drawGuides = ifDrawing;         
+       }
+
+       /*
+       * Gets the condition for drawing or not the guide lines
+       * @retval drawGuides The assigned condition
+       */
+       bool drawGuideLines();
+
+       /*
+       * Guide lines menu handler method that reacts to the mpID_LINE_GUIDES cimmand event
+       * event The corresponding event to handle
+       */
+       
+       //void OnGuideLines (wxCommandEvent   &event); 
+
+       //----------------------------------------------------------------------------------
+       // Previous methods
+       //----------------------------------------------------------------------------------
+       
+       
+       /** Add a plot layer to the canvas.
+       @param layer Pointer to layer. The mpLayer object will get under control of mpWindow,
+       i.e. it will be delete'd on mpWindow destruction
+       @retval TRUE Success
+       @retval FALSE Failure due to out of memory.
+       */
+       bool AddLayer( mpLayer* layer);
+
+       /** Remove a plot layer from the canvas.
+       @param layer Pointer to layer. The mpLayer object will be destructed using delete.
+       */
+       void DelLayer( mpLayer* layer);
+
+       /** Get current view's X scale.
+       See @ref mpLayer::Plot "rules for coordinate transformation"
+       @return Scale
+       */
+       double GetScaleX(void) const { return m_scaleX; }
+
+       /** Get current view's Y scale.
+       See @ref mpLayer::Plot "rules for coordinate transformation"
+       @return Scale
+       */
+       double GetScaleY(void) const { return m_scaleY; }
+
+       /** Get current view's X position.
+       See @ref mpLayer::Plot "rules for coordinate transformation"
+       @return X Position in layer coordinate system, that corresponds to the center point of the view.
+       */
+       double GetPosX(void) const { return m_posX; }
+
+       /** Get current view's Y position.
+       See @ref mpLayer::Plot "rules for coordinate transformation"
+       @return Y Position in layer coordinate system, that corresponds to the center point of the view.
+       */
+       double GetPosY(void) const { return m_posY; }
+
+       /** Get current view's X dimension in device context units.
+       Usually this is equal to wxDC::GetSize, but it might differ thus mpLayer
+       implementations should rely on the value returned by the function.
+       See @ref mpLayer::Plot "rules for coordinate transformation"
+       @return X dimension. 
+       */
+       int GetScrX(void) const { return m_scrX; }
+
+       /** Get current view's Y dimension in device context units.
+       Usually this is equal to wxDC::GetSize, but it might differ thus mpLayer
+       implementations should rely on the value returned by the function.
+       See @ref mpLayer::Plot "rules for coordinate transformation"
+       @return Y dimension. 
+       */
+       int GetScrY(void) const { return m_scrY; }
+       //void SetScrY(int x) const { return m_scrY; }
+
+       /** Set current view's X scale and refresh display. 
+       @param scaleX New scale, must not be 0.
+       */
+       void SetScaleX(double scaleX) { if (scaleX!=0) m_scaleX=scaleX; /*UpdateAll();*/ }
+
+       /** Set current view's Y scale and refresh display. 
+       @param scaleY New scale, must not be 0.
+       */
+       void SetScaleY(double scaleY) { if (scaleY!=0) m_scaleY=scaleY; /*UpdateAll();*/ }
+
+       /** Set current view's X position and refresh display. 
+       @param posX New position that corresponds to the center point of the view.
+       */
+       void SetPosX(double posX) { m_posX=posX; UpdateAll(); }
+
+       /** Set current view's Y position and refresh display. 
+       @param posY New position that corresponds to the center point of the view.
+       */
+       void SetPosY(double posY) { m_posY=posY; UpdateAll(); }
+
+       /** Set current view's X and Y position and refresh display. 
+       @param posX New position that corresponds to the center point of the view.
+       @param posY New position that corresponds to the center point of the view.
+       */
+       void SetPos( double posX, double posY) { m_posX=posX; m_posY=posY; UpdateAll(); }
+
+       /** Enable or disable X/Y scale aspect locking for the view.
+       @note Explicit calls to mpWindow::SetScaleX and mpWindow::SetScaleY will set
+       an unlocked apect, but any other action changing the view scale will
+       lock the aspect again.
+       */
+       void LockAspect(bool enable = TRUE);
+
+       /** Checks whether the X/Y scale aspect is locked.
+       @retval TRUE Locked
+       @retval FALSE Unlocked
+       */
+       inline bool IsAspectLocked() { return m_lockaspect; }
+
+       /** Set view to fit global bounding box of all plot layers and refresh display.
+       Scale and position will be set to a show all attached mpLayers.
+       The X/Y scale aspect lock is taken into account.
+       */
+       void Fit();
+
+       /** Zoom into current view and refresh display */
+       void ZoomIn();
+
+       /** Zoom out current view and refresh display */
+       void ZoomOut();
+
+       /** Refresh display */
+       void UpdateAll();
+
+protected:
+
+       void Refresh(bool eraseBackground = true, const wxRect* rect = NULL);
+       void OnPaint         (wxPaintEvent     &event); //!< Paint handler, will plot all attached layers
+       void OnSize          (wxSizeEvent      &event); //!< Size handler, will update scroll bar sizes
+       void OnScroll2       (wxScrollWinEvent &event); //!< Scroll handler, will move canvas
+       void OnShowPopupMenu (wxMouseEvent     &event); //!< Mouse handler, will show context menu
+       void OnCenter        (wxCommandEvent   &event); //!< Context menu handler
+       void OnFit           (wxCommandEvent   &event); //!< Context menu handler
+       void OnZoomIn        (wxCommandEvent   &event); //!< Context menu handler
+       void OnZoomOut       (wxCommandEvent   &event); //!< Context menu handler
+       void OnLockAspect    (wxCommandEvent   &event); //!< Context menu handler
+       
+
+       bool UpdateBBox(); //!< Recalculate global layer bounding box
+
+       wxList m_layers;    //!< List of attached plot layers
+       wxMenu m_popmenu;   //!< Canvas' context menu
+       bool   m_lockaspect;//!< Scale aspect is locked or not
+
+       double m_minX;      //!< Global layer bounding box, left border incl.
+       double m_maxX;      //!< Global layer bounding box, right border incl.
+       double m_minY;      //!< Global layer bounding box, bottom border incl.
+       double m_maxY;      //!< Global layer bounding box, top border incl.
+       double m_scaleX;    //!< Current view's X scale
+       double m_scaleY;    //!< Current view's Y scale
+       double m_posX;      //!< Current view's X position
+       double m_posY;      //!< Current view's Y position
+       int    m_scrX;      //!< Current view's X dimension
+       int    m_scrY;      //!< Current view's Y dimension
+       int    m_clickedX;  //!< Last mouse click X position, for centering and zooming the view
+       int    m_clickedY;  //!< Last mouse click Y position, for centering and zooming the view
+       
+       //----------------------------------------------
+       //NEW ATTRIBUTES FOR COMPATIBILITY WITH PPlotter
+       //----------------------------------------------
+       /**
+        the max value in the x axis
+       */
+       int    maxScrX;
+       
+       /**
+        the max value in the y axis
+       */
+       int    maxScrY;
+       /**
+        the min value in the x axis
+       */
+       int  minScrX;
+       
+       /**
+        the min value in the y axis
+       */
+       int  minScrY;
+       /*
+        the zoom factor
+        of the zoom
+       */
+       float      zoomFactor;
+
+       
+       /**
+        offset in pixels where the user has clicked
+        before changing the scale (in the actual function)
+       */
+       int offsetPixelX;
+       int offsetPixelY;
+       /*
+        Offsets in real value according to the actual function
+       */
+       int offsetX;
+       int offsetY;
+
+       /*
+       * The real value of the y-coord for the horizontal guide line
+       */
+       int real_guideLine_X;
+       /*
+       * The real value of the y-coord for the vertical guide line
+       */
+       int real_guideLine_Y;
+
+       /*
+       * Represents the condition for drawing or not the line guides, default color is red and assigned to draw them
+       */
+       bool drawGuides;
+       /*
+        Use to know which type of plotter is
+        1= default Plotter
+        2= histogram plotter
+       */
+        int type;
+
+ private:
+       //bitmap of functions
+       wxBitmap        *_bitmap_functions;
+
+
+       DECLARE_CLASS(mpWindow)
+       DECLARE_EVENT_TABLE()
+};
+
+#endif // _MP_MATHPLOT_H_
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorBar.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorBar.cxx
new file mode 100644 (file)
index 0000000..22a156d
--- /dev/null
@@ -0,0 +1,1526 @@
+//------------------------------------------------------------------------------------------------------------
+// Class definition include
+//------------------------------------------------------------------------------------------------------------
+#include "pColorBar.h"
+#include <math.h>
+
+//------------------------------------------------------------------------------------------------------------
+// Generated events declaration and definition
+//------------------------------------------------------------------------------------------------------------
+/*
+* How to catch generated event: EVT_COMMAND(ID_CONTAINER_WINDOW_LISTENER, wxEVT_TYPE_EVENT, ContainerClass :: determinedEventFor)
+*/
+BEGIN_DECLARE_EVENT_TYPES()
+       DECLARE_EVENT_TYPE( wxEVT_ADDED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_REMOVED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_MOVED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_CHANGED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_ON_COLOR_BAR, -1 )
+END_DECLARE_EVENT_TYPES()
+
+
+DEFINE_EVENT_TYPE( wxEVT_ADDED_POINT )
+DEFINE_EVENT_TYPE( wxEVT_REMOVED_POINT )
+DEFINE_EVENT_TYPE( wxEVT_MOVED_POINT )
+DEFINE_EVENT_TYPE( wxEVT_CHANGED_POINT )
+DEFINE_EVENT_TYPE( wxEVT_ON_COLOR_BAR )
+
+//------------------------------------------------------------------------------------------------------------
+// Class implementation
+//------------------------------------------------------------------------------------------------------------
+/** file pColorBar.cxx */
+IMPLEMENT_CLASS(pColorBar, wxScrolledWindow)
+
+//------------------------------------------------------------------------------------------------------------
+// Handled events table
+//------------------------------------------------------------------------------------------------------------
+BEGIN_EVENT_TABLE(pColorBar, wxScrolledWindow)
+       EVT_PAINT( pColorBar :: onPaint)
+       EVT_SIZE ( pColorBar :: OnSize )
+       EVT_MOTION ( pColorBar :: onMouseMove)
+       EVT_RIGHT_DOWN( pColorBar :: onShowPopupMenu)
+       EVT_LEFT_DCLICK( pColorBar :: onLeftButtonDClick)
+       EVT_LEFT_DOWN( pColorBar :: onLeftClicDown)
+       EVT_LEFT_UP( pColorBar :: onLeftClickUp)
+       EVT_MENU( cntID_DEL_COLOR_POINT, pColorBar :: onDeleteColorPoint)
+       EVT_MENU( cntID_ADD_COLOR_POINT, pColorBar :: onAddColorPoint)
+       EVT_MENU( cntID_CHANGE_COLOR_POINT, pColorBar :: onChangeColourSelectedPoint)
+       EVT_MENU( cntID_TRIANGLES_UP, pColorBar :: onTrianglesUp_Figure)
+       EVT_MENU( cntID_TRIANGLES_DOWN, pColorBar :: onTrianglesDown_Figure)
+       EVT_MENU( cntID_TRIANGLES_LEFT, pColorBar :: onTrianglesLeft_Figure)
+       EVT_MENU( cntID_TRIANGLES_RIGHT, pColorBar :: onTrianglesRight_Figure)
+       EVT_MENU( cntID_RECTANGLES, pColorBar :: onRectangles_Figure)
+       EVT_MENU( cntID_DEGRADE_CONTROL, pColorBar :: onDegradeControl)
+       EVT_MIDDLE_UP( pColorBar :: onShowPopupMenu )
+       EVT_RIGHT_UP ( pColorBar :: onShowPopupMenu )
+END_EVENT_TABLE()
+
+//------------------------------------------------------------------------------------------------------------
+// Constructors & Destructors
+//------------------------------------------------------------------------------------------------------------
+
+/*
+* Creates a colorBar instance 
+* param *parent Container event listener window
+* param _w Width of the color bar drawing area
+* param _h Height of the color bar drawing area
+* param _bar_orientation VERTICAL (false) or HORIZONTAL (true) direction to set 
+*/
+pColorBar :: pColorBar (wxWindow *parent, int _w, int _h, bool _bar_orientation)
+:wxScrolledWindow(parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+               _logicalBar = new LogicalColorBar();
+               colourParent =  GetParent()->GetBackgroundColour();
+               deviceEndMargin = 0;
+               acceptedClick = true;
+               setGapValues (0,6);
+               setWidth(_w);
+               setHeight(_h);
+               
+               // Setting the default represented values 
+               setDegradeState(true);  
+               setStaticLimitsTo(false);
+               viewingRange = false;
+               accumTemporalPoints = 0;
+               deviceEndMargin = 0;
+               activeState = false;
+               avaliablePointToMove = -1;
+                                               
+               movingPointIndex = -1;
+               movingNodePoint = NULL;
+               realX_vertical_line = -1;
+               guideLineColor          =   wxColour(255,0,0);
+
+               //TRIANGLES UP
+               figure = new pFigure( RECTANGLE, FIGURE_WIDTH, bar_height, -2, _bar_orientation );
+               setOrientation ( _bar_orientation );
+               
+               // Appending menu items to the pop-menu
+               c_popmenu.Append( cntID_ADD_COLOR_POINT, _T("Add color point"), _T("Adds a color point in the clicked point"));
+               c_popmenu.Append( cntID_DEL_COLOR_POINT, _T("Delete color point"), _T("Deletes the color point at the clicked point"));
+               c_popmenu.Append( cntID_CHANGE_COLOR_POINT, _T("Change color"), _T("Changes the color at the clicked point"));
+               c_popmenu.Append ( cntID_DEGRADE_CONTROL, _T("Turn off degrade"), _T("Turns on/off the degrade"),wxITEM_SEPARATOR);
+               
+               changesMenu = new wxMenu;
+               changesMenu->AppendCheckItem ( cntID_TRIANGLES_UP, _T("Triangles up"),_T("Sets triangles up figure"));
+               changesMenu->AppendCheckItem ( cntID_TRIANGLES_DOWN, _T("Triangles down"),_T("Sets triangles down figure"));
+               changesMenu->AppendCheckItem ( cntID_TRIANGLES_LEFT, _T("Triangles left"),_T("Sets triangles left figure"));
+               changesMenu->AppendCheckItem ( cntID_TRIANGLES_RIGHT, _T("Triangles right"),_T("Sets triangles right figure"));
+               changesMenu->AppendCheckItem ( cntID_RECTANGLES, _T("Rectangles"),_T("Sets rectangle figure"));
+               c_popmenu.Append(cntID_CHANGE_FIGURE, _T("Change figure"),changesMenu, _T("Changes the figure of the color points"));
+               changesMenu->Check (cntID_TRIANGLES_UP, true);
+}
+
+pColorBar :: ~pColorBar()
+{
+
+}
+       //------------------------------------------------------------------------------------------------------------
+       // Color bar proccessed events methods implementation
+       //------------------------------------------------------------------------------------------------------------
+       
+       void pColorBar :: OnSize ( wxSizeEvent &WXUNUSED(event) )
+       {
+               wxRect rectTotal = GetClientRect();                     
+               if(getOrientation())
+               {               
+                       setWidth( rectTotal.GetWidth() - deviceEndMargin );                     
+               } 
+               else 
+               {
+                       setWidth( rectTotal.GetHeight() - deviceEndMargin);                             
+               }
+               Refresh();
+       }
+       /**
+       * Reacts to the mouse movement inside the color bar for moving the clicked color point in the x-axis.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_MOVED_COL_POINT if a point was moved.
+       * param event The mouse actioned event
+       */
+       void pColorBar ::  onMouseMove ( wxMouseEvent& event )
+       {       
+               if(!event.LeftIsDown())
+                       avaliablePointToMove = -1;
+
+               if (acceptedClick && activeState && _logicalBar->getCount()>0)
+               {
+                       bool movedPoint = false;
+                       wxPoint point = event.GetPosition();
+                       double realClicked = getOrientation() ? convertToRealValue(point.x) : convertToRealValue(point.y);
+                       bool rangeToMove = realClicked<=maxX_represented_Tshow && realClicked>=minX_represented_Tshow;//getOrientation() ? (point.x >=deviceStart_x && point.x<=bar_width+deviceStart_x-deviceEndMargin ) : ( point.y>=deviceStart_y && point.y<=bar_width+deviceStart_x-deviceEndMargin);
+                       if ( rangeToMove && acceptedClick && showedColorPoints.size()>0 )
+                       {       
+                               if ( movingPointIndex == -1 )
+                               {
+                                       startNode_show = showedColorPoints.front();
+                                       lastNode_show = showedColorPoints.back();
+                                                                       
+                                       int numberEdges = figure->getNumberEdges();
+                                       wxPoint points [4];
+                                       int i=0;
+                                       int a;
+                                       for (a=0; a<showedColorPoints.size() && movingPointIndex==-1 ; a++ )
+                                       {
+                                               pColorPoint * nodePoint = showedColorPoints[a];
+                                               int point_pixelX = convertToPixelValue(nodePoint -> getRealX());
+                                               point_pixelX+= deviceStart_x;
+                                               if ( getOrientation() )
+                                                       movingPointIndex  =  (figure ->isPointInside (point_pixelX,point.x))? a : -1;
+                                               else
+                                                       movingPointIndex  =  (figure ->isPointInside (point_pixelX,point.y))? a : -1;
+
+                                               if(movingPointIndex != -1)
+                                               {
+                                                       movingNodePoint = nodePoint;            
+                                                       if(avaliablePointToMove ==-1)
+                                                               avaliablePointToMove = movingPointIndex;
+                                               }                                                                                               
+                                       }                                               
+                               }
+                               if (event.LeftIsDown() && movingNodePoint && movingPointIndex!=-1 && avaliablePointToMove==movingPointIndex)
+                               {                                       
+                                       bool hasPrevPoint = movingPointIndex > 0;
+                                       bool hasNextPoint = movingPointIndex < showedColorPoints.size()-1;
+
+                                       pColorPoint * prevPoint =  hasPrevPoint? showedColorPoints[movingPointIndex-1]: NULL; 
+                                       pColorPoint * nextPoint = hasNextPoint ? showedColorPoints[movingPointIndex+1]: NULL;
+
+                                       if ( hasPrevPoint && prevPoint!=NULL )
+                                       {                                                       
+                                               if ( hasNextPoint && nextPoint!=NULL )
+                                               {                                                               
+                                                       double previousValue = prevPoint->getRealX();
+                                                       double nextValue = nextPoint->getRealX();
+                                                       movedPoint = prevPoint->isTemporalColor() ? 
+                                                               ( nextPoint->isTemporalColor() ? (realClicked>=previousValue)&&(realClicked<=nextValue) : (realClicked>=previousValue)&&(realClicked<nextValue))
+                                                               :(realClicked>previousValue)&&(realClicked<nextValue);  
+                                                       if(!movedPoint)
+                                                               avaliablePointToMove = movingPointIndex;
+                                                       if(!movedPoint && realClicked<previousValue) 
+                                                       {
+                                                               realClicked = previousValue+1;
+                                                               movedPoint = true;
+                                                       }
+                                                       else if(!movedPoint && realClicked>nextValue) 
+                                                       {
+                                                               realClicked = nextValue-1;
+                                                               movedPoint = true;
+                                                       }                                                                                                               
+                                               }
+                                               else 
+                                               {
+                                                       if ( !staticLimits )
+                                                       {
+                                                               // Is the last point
+                                                               double previousValue = prevPoint->getRealX();
+                                                               movedPoint = prevPoint->isTemporalColor() ? 
+                                                                       ( realClicked>=previousValue ) && ( realClicked<= maxX_represented_Tshow ) 
+                                                                       : ( realClicked>previousValue ) && ( realClicked<= maxX_represented_Tshow );
+                                                               if(!movedPoint)
+                                                                       avaliablePointToMove = movingPointIndex;
+                                                               if(!movedPoint && realClicked<previousValue)
+                                                               {
+                                                                       realClicked = prevPoint->isTemporalColor()? previousValue: previousValue+1;
+                                                                       movedPoint = true;
+                                                               }                                                               
+                                                               else if (!movedPoint && realClicked>=maxX_represented_Tshow) 
+                                                               {
+                                                                       realClicked = maxX_represented_Tshow;
+                                                                       movedPoint = true;
+                                                               }                                                               
+                                                       }
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if ( hasNextPoint && nextPoint!=NULL )
+                                               {
+                                                       if ( !staticLimits )
+                                                       {
+                                                               // Is the first point                                                           
+                                                               double nextValue = nextPoint->getRealX();
+                                                               movedPoint = ( nextPoint->isTemporalColor() ? (realClicked<=nextValue) && ( realClicked>= minX_represented_Tshow )
+                                                                       :( realClicked<nextValue ) && ( realClicked>= minX_represented_Tshow ));                                                                                
+                                                                       
+                                                               if(!movedPoint)
+                                                                       avaliablePointToMove = movingPointIndex;
+                                                               if(!movedPoint && realClicked>nextValue) 
+                                                               {
+                                                                       realClicked = nextPoint->isTemporalColor() ? nextValue : nextValue-1;
+                                                                       movedPoint = true;
+                                                               }       
+                                                               else if (!movedPoint && realClicked<=minX_represented_Tshow) 
+                                                               {
+                                                                       realClicked = minX_represented_Tshow;
+                                                                       movedPoint = true;
+                                                               }                                                               
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       //Is the only point in the color bar
+                                                       movedPoint = ( realClicked<= maxX_represented_Tshow ) && ( realClicked>= minX_represented_Tshow );      
+                                                       if(!movedPoint)
+                                                                       avaliablePointToMove = movingPointIndex;
+                                                       if (!movedPoint && realClicked<=minX_represented_Tshow) 
+                                                       {
+                                                               realClicked = minX_represented_Tshow;
+                                                               movedPoint = true;
+                                                       }
+                                                       else if(!movedPoint && realClicked>=maxX_represented_Tshow) 
+                                                       {
+                                                               realClicked = maxX_represented_Tshow;
+                                                               movedPoint = true;
+                                                       }
+                                               }
+                                       }
+                                       if(viewingRange)
+                                       {  
+                                               bool movingTempStart = movingNodePoint->getRealX() == startNode_show->getRealX() && movingNodePoint->isTemporalColor();
+                                               bool movingTempEnd = movingNodePoint->getRealX()== lastNode_show->getRealX() && movingNodePoint->isTemporalColor();
+                                               if( movingTempStart || movingTempEnd )
+                                                       movedPoint = false;
+                                       }
+                               }       
+                                       // Inform movedPoint event
+                               if ( movedPoint )
+                               {                                       
+                                       movingNodePoint->setRealX ( realClicked );
+                                       RefreshForce();//Refresh to show the point is moved
+                                       createAndSendEvent(wxEVT_MOVED_POINT);                                          
+                               }
+                               else
+                               {
+                                       movingPointIndex = -1;                                          
+                                       //Creating a general event of mouse move to actualize views
+                                       createAndSendEvent( wxEVT_ON_COLOR_BAR );
+                               }                       
+                       }
+                       else
+                       {
+                               movingPointIndex = -1;  
+                               //Creating a general event of mouse move to actualize views
+                               createAndSendEvent( wxEVT_ON_COLOR_BAR );
+                       }                       
+                       if ( movingPointIndex ==-1 )
+                       {
+                               RefreshForce();//Refresh to show the point is not selected anymore              
+                       }
+               }               
+       }
+
+       void pColorBar ::  Refresh(bool eraseBackground , const wxRect* rect )
+       {
+               wxScrolledWindow::Refresh(false);
+       }
+
+
+       /*
+       * Reacts to the event of drawing the bar and draws it
+       * param &WXUNUSED(event) The correspondig wxPaintEvent actioned event
+       */
+       void pColorBar ::  onPaint ( wxPaintEvent &WXUNUSED(event) )
+       {
+               repaintView();
+               if ( getOrientation() ) // HORIZONTAL
+               {
+                       wxMemoryDC temp_dc;
+                       temp_dc.SelectObject( * colorBar_Bitmap );
+                       wxPaintDC dc( this );
+                                       
+//                     dc.Blit(deviceStart_x, deviceStart_y, bar_width+deviceStart_x, bar_height+deviceStart_y, &temp_dc, deviceStart_x, deviceStart_y);
+
+                       dc.Blit(deviceStart_x, deviceStart_y, bar_width/*-deviceEndMargin*/, bar_height, &temp_dc, 0, 0);
+
+                       // Bitmap for posible needed information to be shown
+                       /*
+                       temp_dc.SelectObject( * information_Bitmap );
+                       dc.Blit(0,bar_height, width, height, &temp_dc, 0, height);
+                       */
+               }
+               else
+               {
+                       wxMemoryDC temp_dc;
+                       temp_dc.SelectObject( * colorBar_Bitmap );
+                       wxPaintDC dc( this );
+//                     dc.Blit(deviceStart_y,deviceStart_x, bar_height+deviceStart_y, bar_width+deviceStart_x, &temp_dc, deviceStart_y, deviceStart_x);        
+                       
+                       dc.Blit(deviceStart_y,deviceStart_x, bar_height, bar_width-deviceEndMargin, &temp_dc, 0, 0);                            
+                       // Bitmap for posible needed information to be shown
+                       /*
+                       temp_dc.SelectObject( * information_Bitmap );
+                       dc.Blit(0,bar_width, height, width, &temp_dc, 0, width );
+                       */
+                       temp_dc.SelectObject(wxNullBitmap);
+               }
+       }
+
+       /**
+       * Reacts to the cntID_ADD_COLOR_POINT wxCommandEvent and adds a color degrade point to the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_ADDED_COL_POINT if the point was inserted succesfully.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar ::  onAddColorPoint ( wxCommandEvent& anEvent )
+       {
+               bool addedPoint = false;
+               double real_x = getOrientation() ? convertToRealValue( clickedX ) : convertToRealValue( clickedY );;
+               wxColour selectedColor = getSelectedColour();
+               if (okSelectedColor)
+               {
+                       addedPoint = addColorPoint (real_x, selectedColor);                     
+               }
+               // Inform addedPoint event
+               if ( addedPoint )
+               {
+                       //RefreshForce();
+                       createAndSendEvent( wxEVT_ADDED_POINT );                        
+               }
+       }
+
+       /**
+       * Reacts to the cntID_DEL_COLOR_POINT wxCommandEvent and deletes a color degrade point of the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_REMOVED_COL_POINT if the point was succesfully removed.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onDeleteColorPoint ( wxCommandEvent& anEvent )
+       {
+               bool deletedPoint = false;
+               double real_x = getOrientation() ? convertToRealValue( clickedX ) : convertToRealValue( clickedY );
+               deletedPoint = deleteColorPoint(real_x);
+               // Inform deletedPoint event
+               if ( deletedPoint )
+               {
+                       //RefreshForce();
+                       createAndSendEvent( wxEVT_REMOVED_POINT );                      
+               }
+       }
+
+               /**
+       * Reacts to the cntID_CHANGE_COLOR_POINT wxCommandEvent and changes the assigned color to the selected color degrade point of the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_CHANGED_POINT if the point was succesfully removed.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onChangeColourSelectedPoint ( wxCommandEvent& anEvent )
+       {
+               bool changedColour = false;
+               changedColour = getOrientation() ? changeColor( clickedX ) : changeColor( clickedY );
+               // Inform deletedPoint event
+               if ( changedColour )
+               {
+                       //RefreshForce();
+                       createAndSendEvent( wxEVT_CHANGED_POINT );                      
+               }
+       }
+       /**
+       * Reacts to the cntID_TRIANGLES_UP wxCommandEvent and changes the assigned figure to -triangles up- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onTrianglesUp_Figure ( wxCommandEvent& anEvent  )
+       {
+               if( !changesMenu->IsChecked(cntID_TRIANGLES_UP) )
+               {
+                       changeFigure (-8);
+                       changesMenu->Check (cntID_TRIANGLES_UP, true);
+                       changesMenu->Check (cntID_TRIANGLES_DOWN, false);
+                       changesMenu->Check (cntID_TRIANGLES_LEFT, false);
+                       changesMenu->Check (cntID_TRIANGLES_RIGHT, false);
+                       changesMenu->Check (cntID_RECTANGLES, false);
+               }
+       }
+       /**
+       * Reacts to the cntID_TRIANGLES_DOWN wxCommandEvent and changes the assigned figure to -triangles down- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onTrianglesDown_Figure ( wxCommandEvent& anEvent  )
+       {
+               if( !changesMenu->IsChecked(cntID_TRIANGLES_DOWN) )
+               {
+                       changeFigure (-2);
+                       changesMenu->Check (cntID_TRIANGLES_UP, false);
+                       changesMenu->Check (cntID_TRIANGLES_DOWN, true);
+                       changesMenu->Check (cntID_TRIANGLES_LEFT, false);
+                       changesMenu->Check (cntID_TRIANGLES_RIGHT, false);
+                       changesMenu->Check (cntID_RECTANGLES, false);
+               }
+       }
+       /**
+       * Reacts to the cntID_TRIANGLES_LEFT wxCommandEvent and changes the assigned figure to -triangles left- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onTrianglesLeft_Figure ( wxCommandEvent& anEvent  )
+       {
+               if( !changesMenu->IsChecked(cntID_TRIANGLES_LEFT) )
+               {
+                       changeFigure (-4);
+                       changesMenu->Check (cntID_TRIANGLES_UP, false);
+                       changesMenu->Check (cntID_TRIANGLES_DOWN, false);
+                       changesMenu->Check (cntID_TRIANGLES_LEFT, true);
+                       changesMenu->Check (cntID_TRIANGLES_RIGHT, false);
+                       changesMenu->Check (cntID_RECTANGLES, false);
+               }
+       }
+       /**
+       * Reacts to the cntID_TRIANGLES_RIGHT wxCommandEvent and changes the assigned figure to -triangles right- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onTrianglesRight_Figure ( wxCommandEvent& anEvent  )
+       {
+               if( !changesMenu->IsChecked(cntID_TRIANGLES_RIGHT) )
+               {
+                       changeFigure (-6);
+                       changesMenu->Check (cntID_TRIANGLES_UP, false);
+                       changesMenu->Check (cntID_TRIANGLES_DOWN, false);
+                       changesMenu->Check (cntID_TRIANGLES_LEFT, false);
+                       changesMenu->Check (cntID_TRIANGLES_RIGHT, true);
+                       changesMenu->Check (cntID_RECTANGLES, false);
+               }
+       }
+       /**
+       * Reacts to the cntID_RECTANGLES wxCommandEvent and changes the assigned figure to -rectangles- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar :: onRectangles_Figure ( wxCommandEvent& anEvent  )
+       {
+               if( !changesMenu->IsChecked(cntID_TRIANGLES_RIGHT) )
+               {
+                       changeFigure (RECTANGLE);// RECTANGLE = 4
+                       changesMenu->Check (cntID_TRIANGLES_UP, false);
+                       changesMenu->Check (cntID_TRIANGLES_DOWN, false);
+                       changesMenu->Check (cntID_TRIANGLES_LEFT, false);
+                       changesMenu->Check (cntID_TRIANGLES_RIGHT, false);
+                       changesMenu->Check (cntID_RECTANGLES, true);
+               }
+       }
+
+       /**
+       * Reacts to the cntID_DEGRADE_CONTROL wxCommandEvent and turns on/off the degrade in the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void pColorBar ::  onDegradeControl ( wxCommandEvent& anEvent )
+       {
+               bool degrade = getDegradeState();
+               wxString nextAction_text;
+               if(degrade)
+               {
+                       nextAction_text = _T("Turn on degrade");        
+                       setDegradeState (false);
+               }
+               else
+               {
+                       nextAction_text = _T("Turn off degrade");
+                       setDegradeState (true);
+               }
+               c_popmenu.SetLabel ( cntID_DEGRADE_CONTROL, nextAction_text ); 
+       }
+
+       /**
+       * Reacts to the wxEVT_RIGHT_DCLICK wxMouseEvent and adds a color degrade point to the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_ADDED_COL_POINT if the point was succesfully inserted.
+       * param & event The wxMouseEvent actioned event 
+       */
+       void pColorBar ::  onLeftButtonDClick (wxMouseEvent& event)
+       {
+               if (activeState)
+               {
+                       bool addedPoint = false;
+                       wxPoint point = event.GetPosition();
+                       bool posiblePoint = false;
+                       if( getOrientation() )
+                       {
+                               posiblePoint = point.x>=deviceStart_x && point.y<= (bar_height + deviceStart_y);
+                       }
+                       else
+                       {
+                               posiblePoint = point.x>=deviceStart_y && point.x<= (bar_height+deviceStart_y) && point.y>deviceStart_x;
+                       }
+
+                       if (posiblePoint)
+                       {
+                               double real_x = getOrientation() ? convertToRealValue( point.x ) : convertToRealValue( point.y );
+                               wxColour selectedColor = getSelectedColour();
+                               if (okSelectedColor)
+                               {
+                                       addedPoint = addColorPoint (real_x, selectedColor);                                     
+                               }
+                               // Inform addedPoint event
+                               if ( addedPoint )
+                               {
+                                       //RefreshForce(); Is all ready refreshed on the adition of the point method
+                                       createAndSendEvent( wxEVT_ADDED_POINT );                        
+                               }
+                       }
+               }
+       }
+               
+       void  pColorBar ::onLeftClicDown(wxMouseEvent& event )
+       {
+               acceptedClick = true;           
+       }
+
+       void  pColorBar ::onLeftClickUp(wxMouseEvent& event )
+       {       
+               movingPointIndex = -1;
+               acceptedClick = false;
+       }
+       /*
+       * Shows the popup menu 
+       */
+       void pColorBar ::  onShowPopupMenu (wxMouseEvent &event)
+       {
+               if (activeState)
+               {
+                       if(showedColorPoints.empty())
+                       {
+                               c_popmenu.Enable(cntID_DEL_COLOR_POINT, false);                 
+                       }
+                       else
+                       {
+                               c_popmenu.Enable(cntID_DEL_COLOR_POINT, true);
+                       }
+                       bool setClickedValues = false;
+                       if( getOrientation() )
+                       {
+                               setClickedValues = event.GetX()>=deviceStart_x && event.GetY()<= (bar_height + deviceStart_y);
+                       }
+                       else
+                       {
+                               setClickedValues = event.GetX()>=deviceStart_y && event.GetX()<= (bar_height+deviceStart_y) && event.GetY()>deviceStart_x;
+                       }
+                       if (setClickedValues)
+                       {
+                               setClickedX ( event.GetX() );
+                               setClickedY ( event.GetY() );
+                               RefreshForce();
+                               PopupMenu( &c_popmenu, event.GetX(), event.GetY());
+                       }
+               }
+       }
+       //------------------------------------------------------------------------------------------------------------
+       // Other methods implementation
+       //------------------------------------------------------------------------------------------------------------
+
+       /*
+       * Method that reinitiates attributes of the color bar to the given points
+       * param minRealValue The minimum represented value (real value)
+       * param maxRealValue The maximum represented value (real value)
+       */
+       void pColorBar :: reinitiateColorBar(double minRealValue, double maxRealValue)
+       {
+
+               _logicalBar -> clearPoints();
+               showedColorPoints.clear();
+                               
+               movingPointIndex = -1;
+               realX_vertical_line = -1;
+               activeState = true;
+               accumTemporalPoints = 0;
+               viewingRange = false;
+               setDegradeState(true);                  
+               setRepresentedValues(minRealValue, maxRealValue);
+       }
+
+       /*
+       * Method that reinitiates  attributes of the color bar and set the points given by parameter
+       * param pointsVector The the vector of the new points, the color points must have at least two points.
+       */
+       void pColorBar :: reinitiateColorBarTo (std::vector<pColorPoint *> pointsVector)
+       {
+               _logicalBar -> clearPoints();
+               _logicalBar -> setColorPoints(pointsVector);
+               showedColorPoints.clear();
+               
+               movingPointIndex = -1;
+               realX_vertical_line = -1;
+               activeState = true;
+               accumTemporalPoints = 0;                
+               viewingRange = false;
+               setDegradeState(true);                                  
+               
+               double minRealValue = _logicalBar -> getMinValue();
+               double maxRealvalue = _logicalBar -> getMaxValue();
+
+               setRepresentedValues(minRealValue, maxRealvalue);
+       }
+
+       /*
+       * Method that sets a copy of the points of the color bar to the given pointer parameter
+       * param pointsList The list for getting the points
+       */
+       void pColorBar :: getPointsListWithTemps (std::vector<pColorPoint*> &pointsVector)
+       {               
+               pColorPoint* cPoint;
+               for (int a =0; a<showedColorPoints.size() ; a++)        
+               {
+                       cPoint = showedColorPoints[a];
+                       pColorPoint* copyPoint = new pColorPoint(cPoint->getRealX(), cPoint->getColor( ), (cPoint->isTemporalColor()));
+                       pointsVector.push_back(copyPoint);                      
+               }
+       }
+
+       /*
+       * Method that sets a copy of the points of the color bar to the given pointer parameter, and sets the default values to the needeed attributes, it doesn't
+       * includes the teporal points created
+       * param pointsList The list for getting the points
+       */
+       
+       void pColorBar :: getAddedColorsPointsList (std::vector<pColorPoint*> &pointsVector)
+       {
+               pColorPoint* cPoint;
+               for (int a =0; a<_logicalBar->getCount(); a++)  
+               {
+                       cPoint = _logicalBar ->getPointAtIndex(a);                      
+                       pColorPoint* copyPoint = new pColorPoint(cPoint->getRealX(), cPoint->getColor( ), (cPoint->isTemporalColor()));
+                       pointsVector.push_back(copyPoint);                      
+               }
+       }
+       
+
+       /**
+       * Adds a color degrade point to the color bar.
+       * param xRealValue The real xValue of the point
+       * param theColour The assigned color for the point
+       * param temporalStart Indicates if the inserted point is the temporal startShowing point
+       * param temporalEnd Indicates if the inserted point is the temporal startShowing point
+       * return Returns true if the point was succesfully inserted.
+       */
+       bool pColorBar :: addColorPoint (double xRealValue, wxColour theColour/*, bool temporalStart, bool temporalEnd*/)
+       {
+               bool addedPoint = false;
+               addedPoint = _logicalBar->addColorPoint(xRealValue,theColour);
+               if (addedPoint) 
+                       RefreshForce();
+               return addedPoint;
+       }
+
+
+       /**
+       * Delets a color degrade point to the color bar.
+       * param xRealValue The real xValue of the point to delete       
+       * return Returns true if the point was succesfully inserted.
+       */
+       bool pColorBar :: deleteColorPoint (double xRealValue)
+       {       
+               pColorPoint* actualPoint;               
+               bool deletedPoint = false;
+               for (int a =0; a<showedColorPoints.size() && !deletedPoint; a++)        
+               {
+                       actualPoint = showedColorPoints[a];
+                       int actualX = actualPoint -> getRealX();
+                       bool isInsideActual = figure -> isPointInside (convertToPixelValue(actualX), convertToPixelValue(xRealValue));
+                       if( actualX == xRealValue || isInsideActual)
+                       {
+                               movingPointIndex=-1;                                                            
+                               deletedPoint = _logicalBar->deleteColorPoint(actualPoint -> getRealX());                                        
+                       }                       
+               }                       
+               if (deletedPoint) 
+                       RefreshForce();
+               return deletedPoint;                    
+       }
+
+       /**
+       * Changes the color degrade point color value.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_CHANGED_COLOR_POINT if the point changed its colour.
+       * param clickedValue The x-coord pixel value of the point to which the color change interests   
+       * return Returns true if the color point was succesfully updated.
+       */
+       bool pColorBar :: changeColor ( int clickedValue )
+       {               
+               bool colourUpdated = false;
+               double xRealValue = convertToRealValue( clickedValue );
+               pColorPoint* actualPoint;
+               for (int a =0; a<showedColorPoints.size() && !colourUpdated; a++)       
+               {
+                       actualPoint = showedColorPoints[a];
+                       int actualX = actualPoint -> getRealX();
+                       bool isInsideActual = figure -> isPointInside (convertToPixelValue(actualX), clickedValue);
+                       if( actualX == xRealValue || isInsideActual)
+                       {
+                               wxColour newColour = getSelectedColour();
+                               if (okSelectedColor)
+                               {
+                                       actualPoint -> setColor(newColour);
+                                       colourUpdated = true;                                   
+                               }                               
+                       }                       
+               }               
+               if(colourUpdated)
+                       RefreshForce();
+               return colourUpdated;
+       }
+
+       /*
+       * Repaints the color bar in horizontal direction mode
+       */
+       void pColorBar ::  repaintView(  )
+       {
+               wxMemoryDC temp_dc;
+               temp_dc.SelectObject( * colorBar_Bitmap );              
+               temp_dc.SetBrush(wxBrush( colourParent ,wxSOLID  ));
+               temp_dc.SetPen(wxPen( colourParent,1,wxSOLID  ));
+               if (getOrientation())
+               {
+                       temp_dc.DrawRectangle(0, 0, bar_width, bar_height);
+                       temp_dc.SetPen(wxPen( wxColour(167,165,191),1,wxSOLID  ));
+                       temp_dc.DrawRectangle(0, 0, bar_width-deviceEndMargin, bar_height);
+               }
+               else
+               {
+                       temp_dc.DrawRectangle(0, 0, bar_height, bar_width);
+                       temp_dc.SetPen(wxPen( wxColour(167,165,191),1,wxSOLID  ));
+                       temp_dc.DrawRectangle(0, 0, bar_height, bar_width-deviceEndMargin);
+               }
+               wxPoint figPoints[4];
+               
+               if( _logicalBar -> getCount() >0)
+               {
+                       updatePointsToDraw();
+                       
+                       int numberEdges = figure->getNumberEdges();
+                       wxPoint points [4];
+                       figure->getVertexPoints(points);
+                       figure ->setVertexPoints (points);
+
+                       int maxValue = showedColorPoints.size();
+                       pColorPoint * iniPoint;
+                       pColorPoint * endPoint;
+                       wxColor intialColor, finalColor;
+                       for (int a=0; a<maxValue; a++)
+                       {
+                               iniPoint = showedColorPoints[a];
+                               int ini_pixelX = convertToPixelValue(iniPoint -> getRealX());                           
+                               intialColor = iniPoint -> getColor();
+                                                               
+                               if( a<maxValue-1 )
+                               {
+                                       if( doingDegrade )
+                                       {
+                                               endPoint = showedColorPoints[a+1];
+                                               int end_pixelX = convertToPixelValue(endPoint -> getRealX());
+                                               finalColor = endPoint -> getColor();                                    
+                                       
+                                               int rectangle_width = end_pixelX - ini_pixelX;
+                                               
+                                               //*************************************************************************************
+                                               int initial_r = intialColor.Red();
+                                               int final_r = finalColor.Red()  ;
+                                               int initial_g = intialColor.Green();
+                                               int final_g= finalColor.Green();
+                                               int initial_b = intialColor.Blue();
+                                               int final_b= finalColor.Blue();
+                                               
+                                               float m_scope_r = (float)(final_r-initial_r)/rectangle_width;
+                                               float m_scope_g = (float)(final_g-initial_g)/rectangle_width;
+                                               float m_scope_b = (float)(final_b-initial_b)/rectangle_width;                           
+
+                                               int next_r = initial_r;
+                                               int next_g = initial_g;
+                                               int next_b = initial_b;
+
+                                               float nxt_r = (float)next_r;
+                                               float nxt_g = (float)next_g;
+                                               float nxt_b = (float)next_b;
+
+                                               for (int Xi =ini_pixelX; Xi<= end_pixelX; Xi++)                                         
+                                               {
+                                                       temp_dc.SetBrush(wxBrush( wxColour(next_r, next_g, next_b),wxSOLID  ));
+                                                       temp_dc.SetPen(wxPen( wxColour(next_r, next_g, next_b),1,wxSOLID  ));
+                                                       if( getOrientation() )
+                                                               temp_dc.DrawLine(Xi, 0, Xi, bar_height);
+                                                       else
+                                                               temp_dc.DrawLine(0, Xi, bar_height, Xi);
+
+                                                       nxt_r = (m_scope_r + nxt_r);
+                                                       nxt_g = (m_scope_g + nxt_g);
+                                                       nxt_b = (m_scope_b + nxt_b);
+                                                       
+                                                       next_r = (int)(nxt_r);
+                                                       next_g = (int)(nxt_g);
+                                                       next_b = (int)(nxt_b);                                                          
+                                               }                                                                       
+                                       }                               
+                               }
+                               if( movingPointIndex!=-1 && movingNodePoint!=NULL )
+                               {                                       
+                                       if ( !(movingNodePoint -> isTemporalColor()) )
+                                       {
+                                               if( movingNodePoint==iniPoint && movingPointIndex!=-1 )
+                                               {
+                                                       temp_dc.SetBrush(wxBrush(  wxColour(5,36,180), wxSOLID  ));
+                                                       temp_dc.SetPen(wxPen( wxColour(239,239,239), 1, wxSOLID  ));
+                                                       if (getOrientation())
+                                                               temp_dc.DrawPolygon(numberEdges, points, ini_pixelX, 0);
+                                                       else
+                                                               temp_dc.DrawPolygon(numberEdges, points, 0, ini_pixelX);
+                                               }
+                                               else
+                                               {                                               
+                                                               temp_dc.SetBrush(wxBrush( intialColor, wxSOLID  ));     
+                                                               if(iniPoint->isTemporalColor())
+                                                                       temp_dc.SetPen(wxPen( intialColor, 1, wxSOLID  ));                      
+                                                               else
+                                                                       temp_dc.SetPen(wxPen( wxColour(0,0,0), 1, wxSOLID  ));
+                                                               if (getOrientation())
+                                                                       temp_dc.DrawPolygon(numberEdges, points, ini_pixelX, 0);
+                                                               else
+                                                                       temp_dc.DrawPolygon(numberEdges, points, 0, ini_pixelX);                                        
+                                               }
+                                       }
+                               }
+                               else
+                               {
+                                       if ( !(iniPoint -> isTemporalColor()) )
+                                       {
+                                               temp_dc.SetBrush(wxBrush( intialColor, wxSOLID  ));
+                                               temp_dc.SetPen(wxPen( wxColour(0,0,0), 1, wxSOLID  ));
+                                               if (getOrientation())
+                                                       temp_dc.DrawPolygon(numberEdges, points, ini_pixelX, 0);
+                                               else
+                                                       temp_dc.DrawPolygon(numberEdges, points, 0, ini_pixelX);
+                                       }                                                       
+                               }               
+                       }
+                       if (realX_vertical_line!=-1)
+                       {
+                               temp_dc.SetPen(wxPen(  guideLineColor,1,wxDOT  ));
+                               int pixelX_guide = convertToPixelValue(realX_vertical_line);
+                               if (getOrientation())
+                                       temp_dc.DrawLine(pixelX_guide, 0, pixelX_guide, bar_height);
+                               else
+                                       temp_dc.DrawLine(0, pixelX_guide, bar_height, pixelX_guide);
+                       }
+               }
+       }
+       
+       /*
+       * Forces the refresh view of the color bar
+       */
+       void pColorBar ::  RefreshForce ()
+       {
+               Refresh(false);         
+       }
+       
+       /*
+       * Draws the color bar with its degrades
+       * param recentlyChangedOrientation indicates if the orientation has been changed before calling this method
+       */
+       void pColorBar ::  drawColorBar (bool recentlyChangedOrientation)
+       {
+               wxRect rectTotal = GetClientRect(); 
+               if (recentlyChangedOrientation)
+               {
+                       if ( getOrientation() ) // HORIZONTAL
+                       {
+                               //SetSize(width, height );
+                               wxWindow::SetSize( width, height );
+                               //SetSize( rectTotal.GetWidth(), rectTotal.GetHeight() );
+                               setWidth(GetClientRect().GetWidth()- deviceEndMargin);
+                               //setHeight(GetClientRect().GetHeight());
+                               
+                               colorBar_Bitmap = new wxBitmap( bar_width+1280, bar_height+1280 );
+                               //information_Bitmap = new wxBitmap( width-bar_width, height-bar_height );
+                       }
+                       else // VERTICAL
+                       {
+                               wxWindow::SetSize( height, width );
+                               //SetSize( rectTotal.GetHeight(), rectTotal.GetWidth() );
+                               setWidth(GetClientRect().GetHeight()- deviceEndMargin);
+                               //setHeight(GetClientRect().GetWidth());
+                               
+                               //SetWindowStyle( wxNO_FULL_REPAINT_ON_RESIZE );
+                               colorBar_Bitmap = new wxBitmap( bar_height+1280, bar_width+1280 );
+                               //information_Bitmap = new wxBitmap( height-bar_height, width-bar_width );
+                       }               
+               }
+       }
+               
+       /*
+       * Changes the figure of the color points according to the parameter
+       * param figureOrientation Is the corresponding number for identifying the figure 
+       * RECTANGLE = 4,TRIANGLE LEFT = -4, TRIANGLE RIGHT = -6, TRIANGLE UP = -8, TRIANGLE DOWN = -2
+       */
+       void pColorBar :: changeFigure(int figureOrientation)
+       {               
+               if ( figureOrientation<1 ) //The figure is a  a rotated triangle 
+               {
+                       changePointsFigure_Edges(3);
+                       figure -> setFigureOrientation ( figureOrientation );
+                       
+               }
+               else //The figure is a rectangle
+               {
+                       changePointsFigure_Edges(4);
+               }       
+               RefreshForce();
+       }
+
+       /**
+       * Changes the figure used for the degreade color points to the indicated one by parameter
+       * param figEdges Is the constant that represents the figure number of edges (TRIANGLE | RECTANGLE)
+       */
+       void pColorBar :: changePointsFigure_Edges(int figEdges)
+       {
+               figure->setNumberEdges( figEdges);
+       }
+       
+       /**
+       * Gets the constant that represents the figure used for the degreade color points
+       * return figureEdges Is the constant that represents the figure number of edges (TRIANGLE | RECTANGLE)
+       */
+       int pColorBar :: getPointsFigure_Edges ()
+       {
+               return (figure -> getNumberEdges());
+       }
+       
+       /**
+       * Sets the height of the drawing bar area
+       * param _h The height to set
+       */
+       void pColorBar ::  setHeight (int _h)
+       {
+               height = _h;
+               bar_height = height-gapY;
+       }
+
+       /**
+       * Sets the height of the drawing bar area
+       * return _h The height to get
+       */
+       int pColorBar :: getHeight()
+       {
+                return height;
+       }
+
+       /**
+       * Sets the width of the drawing bar area
+       * param _w The width to set
+       */
+       void pColorBar ::  setWidth (int _w)
+       {
+               width = _w;
+               bar_width = width-gapX;
+       }
+
+       /**
+       * Gets the width of the drawing bar area
+       * param width The width to get
+       */
+       int pColorBar :: getWidth ()
+       {
+               return width;                   
+       }
+
+       /**
+       * Sets the height of the containing rectangle bar
+       * param _h The height to set
+       */
+       void pColorBar ::  setBarHeight (int _h)
+       {
+               bar_height = _h;
+       }
+
+       /**
+       * Gets the height of the containing rectangle bar
+       * return bar_height The height to get
+       */
+       int pColorBar :: getBarHeight()
+       {
+               return bar_height;
+       }
+
+       /**
+       * Sets the width of the containing rectangle bar
+       * param _w The width to set
+       */
+       void pColorBar ::  setBarWidth (int _w)
+       {
+               bar_width = _w;
+       }
+
+       /**
+       * Gets the width of the containing rectangle bar
+       * return bar_width The width to get
+       */
+       int pColorBar :: getBarWidth ()
+       {
+               return bar_width;
+       }
+
+       /**
+       * Sets the orientation of the color bar
+       * param _orientation The orientation to set VERTICAL = false, HORIZONTAL = true
+       */
+       void pColorBar ::  setOrientation (bool _orientation)
+       {
+               _logicalBar -> setOrientation(_orientation);
+               figure -> setBarOrientation (_orientation);
+       }
+
+       /**
+       * Gets the orientation of the color bar
+       * return bar_orientation The bar orientation assigned
+       */
+       bool pColorBar :: getOrientation ()
+       {
+               return _logicalBar->getOrientation();
+       }
+
+       /**
+       * Sets the collection of color points
+       * param _points The new points to set, each one of data type pColorPoint ( xValue, wxColour_assigned)
+       */
+       void pColorBar ::  setPoints (std::vector<pColorPoint *> _points)
+       {
+               _logicalBar->clearPoints();
+               showedColorPoints.clear();
+               _logicalBar->setColorPoints(_points);
+               //posible needed to update
+       }
+
+       /**
+       * Gets the last clickedX pixel coord inside the bar.
+       * return clickedX The x-coord pixel value
+       */
+       int pColorBar :: getClickedX()
+       {
+               return clickedX;
+       }
+
+       /**
+       * Sets the last clickedX pixel coord inside the bar.
+       * param xCoordPixel The x-coord value to set
+       */
+       void pColorBar :: setClickedX(int xCoordPixel)
+       {
+               clickedX = xCoordPixel;
+       }
+
+       /**
+       * Gets the last clickedY pixel coord inside the bar.
+       * return clickedY The y-coord pixel value
+       */
+       int pColorBar :: getClickedY()
+       {
+               return clickedY;
+       }
+
+       /**
+       * Sets the last clickedY pixel coord inside the bar.
+       * param yCoordPixel The y-coord pixel value to set
+       */
+       void pColorBar :: setClickedY(int yCoordPixel)
+       {
+               clickedY = yCoordPixel;
+       }
+
+       /**
+       * Gets the real x value for a given x-pixel value using the rule real_x = minX_represented_Tshow + ((x_Pixel * (maxX_represented_Tshow - minX_represented_Tshow) ) / bar_width)
+       * param x_Pixel The pixel value to convert into real value with respect to the x scale
+       * return realX The real-x value corresponding to the xPixel
+       */
+       double pColorBar :: convertToRealValue ( int x_Pixel )
+       {
+               /**
+               int newPixel = x_Pixel*(bar_width - deviceEndMargin - deviceStart_x)/(bar_width) ;
+               return newPixel*(maxX_represented_Tshow - minX_represented_Tshow)/(bar_width);
+*/
+               return minX_represented_Tshow + ((x_Pixel-deviceStart_x) * (maxX_represented_Tshow - minX_represented_Tshow) ) /( bar_width-deviceEndMargin);           
+       }
+
+       /**
+       * Gets the x-pixel value for a given x_real value using the rule x_pixel = ((x_real - minX_represented_Tshow) * bar_width)/(maxX_represented_Tshow - minX_represented_Tshow)
+       * param x_Pixel The pixel value to convert into real value with respect to the x scale
+       * return realX The real-x value corresponding to the xPixel
+       */
+       int pColorBar :: convertToPixelValue (double x_real )
+       {
+               return (int)( ((x_real - minX_represented_Tshow) * (bar_width-deviceEndMargin))/(maxX_represented_Tshow - minX_represented_Tshow) );            
+       }
+
+       /**
+       * Gets the selected color and updates the state of the okSelectedColor
+       * return selectedColor Is the selected rbg color
+       */
+       wxColour pColorBar :: getSelectedColour()
+       {
+               okSelectedColor = false;
+               wxColour col;
+               wxColourData data;
+               wxColourDialog dialog( GetParent(), &data);
+
+               if ( dialog.ShowModal() == wxID_OK )
+               {
+                       col = dialog.GetColourData().GetColour();
+                       okSelectedColor = true;
+               }
+               return col;
+       }
+
+       /**
+       * Sets the represented minimum and maximunm values
+       * param minRealValue The minimum represented value (real value)
+       * param maxRealValue The maximum represented value (real value)
+       */
+       void pColorBar :: setRepresentedValues ( double minRealValue, double maxRealValue )
+       {
+               temporalMinXToShow = minRealValue;
+               temporalMaxXToShow = maxRealValue;
+
+               minX_represented_Tshow = minRealValue;          
+               maxX_represented_Tshow = maxRealValue;
+               _logicalBar->setMinValue(minX_represented_Tshow);
+               _logicalBar->setMaxValue(maxX_represented_Tshow);
+       }
+
+       /**
+       * Gets the data of the last point moving in a pColorPoint copy
+       * return pointData Is a pColorPoint with the data of las moved color
+       */
+       pColorPoint * pColorBar :: getLastMovedColorPoint()
+       {
+               pColorPoint * dataPoint = new pColorPoint ( 0, wxColor (0,0,0), false);
+               if (movingNodePoint)
+               {               
+                       dataPoint ->setColor(movingNodePoint->getColor());
+                       dataPoint ->setRealX(movingNodePoint->getRealX());
+               }
+               return dataPoint;
+       }
+
+       /**
+       * Sets the gap values for the color bar bitmap
+       * param gap_x Gap in x
+       * param gap_y Gap in y
+       */
+       void pColorBar :: setGapValues (int gap_x, int gap_y)
+       {
+               gapX = gap_x;
+               gapY = gap_y;
+       }
+
+       /**
+       * Sets the degrade state of the color bar
+       * param newState The degrade stare to set 
+       */
+       void pColorBar :: setDegradeState(bool newState)
+       {
+               doingDegrade = newState;
+       }
+
+       /**
+       * Gets the degrade state of the color bar
+       * return doingDegrade is the actual degrade state of the bar
+       */
+       bool pColorBar :: getDegradeState()
+       {
+               return doingDegrade;
+       }
+
+       /**
+       * Sets the visible range of the bar and repaints the bar according to it, the min value must be less than the max value.
+       * param minToShow Is the minimum value to show in the colorbar
+       * param maxToShow Is the maximum value to show in the colorbar
+       */
+       void pColorBar :: setVisibleRange(int minToShow, int maxToShow)
+       {
+               minX_represented_Tshow = minToShow;
+               maxX_represented_Tshow = maxToShow; 
+               viewingRange = true;
+               RefreshForce();
+       }
+
+       /**
+       * Sets the state of static or not for the limit color points
+       * pamar areStatic Is the state to set for the limits
+       */
+       void pColorBar :: setStaticLimitsTo(bool areStatic)
+       {
+               staticLimits = areStatic;
+       }
+
+       /**
+       * Gets the state of static or not for the limit color points
+       * return staticLimits Is the state for limits
+       */
+       bool pColorBar :: getStaticLimits()
+       {
+               return staticLimits;
+       }
+
+       /**
+       * Sets the device start drawing left-superior (pixel) start point and draws automatically the color bar
+       * param deviceStart_x Pixel start for x-coord
+       * param deviceStart_y Pixel start for y-coord
+       */
+       void pColorBar :: setDeviceBlitStart ( wxCoord devStart_x, wxCoord devStart_y )
+       {
+               deviceStart_x = devStart_x;
+               deviceStart_y = devStart_y;
+               if (getOrientation())
+                       width += deviceStart_x;
+               else
+                       height += deviceStart_y;
+               drawColorBar(true);
+       }
+
+       /**
+       * Clears the temporal color points of the list
+       */
+       void pColorBar :: clearTemporalColors()
+       {
+               
+       }
+
+       /**
+       * Set active state 
+       * param activeNow The new state
+       */
+       void pColorBar :: setActiveStateTo (bool activeNow)
+       {
+               activeState = activeNow;
+       }
+       
+       /**
+       * Gets the active state of the bar
+       *  return isActive The actual state
+       */
+       bool pColorBar :: isActive()
+       {
+               return activeState;
+       }
+
+       /**
+       * Gets the real-x value to draw a vertical line
+       * return realX_vertical_line The real x value for the vertical line
+       */
+       int     pColorBar :: getRealX_vertical_line()
+       {
+               return realX_vertical_line;
+       }
+
+       /**
+       * Sets the real-x value to draw a vertical line
+       * param realX_vertical_line The new real x value for the vertical line
+       */
+       void pColorBar :: setRealX_vertical_line(int newReal_x)
+       {
+               realX_vertical_line = newReal_x;
+       }
+
+       /**
+       * Sets the new device (deviceEndMargin) value form the end of this panel to the end of the drawing area in the device
+       * param newDeviceEnd_pixels The new pixel value to asign to the right(horizontal view), underneath(vertical view) margin in pixels
+       */
+       void pColorBar :: setDeviceEndMargin(int newDeviceEnd_pixels)
+       {
+               deviceEndMargin = newDeviceEnd_pixels;
+       }
+
+       void pColorBar :: createAndSendEvent(WXTYPE theEventType)
+       {
+               wxCommandEvent cevent( theEventType, GetId() );
+               cevent.SetEventObject( this );
+               GetEventHandler()->ProcessEvent( cevent );
+       }
+
+       
+       /**
+               Returns the number of points that the bar color has
+       */
+       int pColorBar::getColorPointsSize()
+       {
+               return _logicalBar->getCount();
+       }
+
+       /*
+        Get the RGB values of the color point that is in the
+        index given with respecto to the
+       */
+       void pColorBar::getDataAt(int index, double& x,int& red,int& green,int& blue)
+       {
+               //******************************
+               _logicalBar->getDataAt(index, x, red, green, blue);
+       }
+
+       /*
+       * Sets the guide line color
+       * param theNwGuideLineColor The color to set to the guideLineColor
+       */
+       void pColorBar :: setGuideLineColour(wxColour theNwGuideLineColor)
+       {
+               guideLineColor = theNwGuideLineColor;
+       }
+
+       /*
+       * Gets the guide line color
+       * return guideLineColor The color of the guideLine
+       */
+       wxColour pColorBar :: getGuideLineColour()
+       {
+               return guideLineColor;
+       }
+
+       /*
+       * Sets the guide line color
+       * param theNwGuideLineColor The color to set to the guideLineColor
+       */
+       void pColorBar :: setBackGroundColour(wxColour theNwBackColor)
+       {
+               colourParent = theNwBackColor;
+       }
+
+       /*
+       * Gets the guide line color
+       * return guideLineColor The color of the guideLine
+       */
+       wxColour pColorBar :: getBackGroundColour()
+       {
+               return colourParent;
+       }
+
+       /*
+       * Gets the min value of the color bar
+       */
+       double  pColorBar :: getMinValue()
+       {
+               return (double)minX_represented_Tshow;
+       }
+
+       /*
+       * Gets the max value of the color bar
+       */
+       double pColorBar :: getMaxValue()
+       {
+               return (double)maxX_represented_Tshow;
+       }
+
+
+       void pColorBar :: updatePointsToDraw()
+       {               
+               accumTemporalPoints = 0;                
+               if (_logicalBar->getCount()>0)
+               {
+                       showedColorPoints.clear();
+                       
+                       int startIndex, endIndex;
+                       _logicalBar -> getPointersToRangeLimits( showedColorPoints, startIndex, endIndex, minX_represented_Tshow, maxX_represented_Tshow );
+               
+                       int internalCount = _logicalBar->getCount();                                            
+                       std::deque <pColorPoint*>::iterator iterStart = showedColorPoints.begin( );
+                       std::deque <pColorPoint*>::iterator iterEnd = showedColorPoints.end( );
+                       
+                       int pixelTmpStart = convertToPixelValue (minX_represented_Tshow);
+                       int pixelTmpEnd = convertToPixelValue (maxX_represented_Tshow);
+                       int initial_r, final_r, initial_g, final_g, initial_b, final_b, rectangle_width;
+                       double realINI, realEND;
+
+                       bool includeTempStart = false;
+                       bool includeTempEnd = false;
+                       //-----------------Adding the first visible point of the list
+                       if(showedColorPoints.size()>0)
+                       {
+                               includeTempStart = (int)(showedColorPoints.front()->getRealX())>minX_represented_Tshow ;                                                                        
+                               includeTempEnd = (int)(showedColorPoints.back()->getRealX())<maxX_represented_Tshow ;                                                                   
+                               if( startIndex >= 0 )
+                               {
+                                       if( startIndex == 0 )
+                                       {
+                                               //The temporal showing point for the start should have the same color of the initial point in range at startIndex
+                                               _logicalBar -> getDataAt( startIndex, realINI, initial_r, initial_g, initial_b );
+                                               realINI = minX_represented_Tshow;
+                                               _logicalBar -> getDataAt( startIndex, realEND, final_r, final_g, final_b );                                     
+                                       }
+                                       else if( startIndex > 0 )
+                                       {
+                                               _logicalBar -> getDataAt( startIndex-1, realINI, initial_r, initial_g, initial_b );
+                                               _logicalBar -> getDataAt( startIndex, realEND, final_r, final_g, final_b );
+                                       }
+                                       
+                                       if( includeTempStart )
+                                       {
+                                               int ini_pixelX = convertToPixelValue( realINI );
+                                               int end_pixelX = convertToPixelValue( realEND );
+
+                                               rectangle_width = end_pixelX - ini_pixelX;                                              
+                                               
+                                               float m_scope_r = (float)(final_r-initial_r)/rectangle_width;
+                                               float m_scope_g = (float)(final_g-initial_g)/rectangle_width;
+                                               float m_scope_b = (float)(final_b-initial_b)/rectangle_width;           
+
+                                               
+                                               float bRed = initial_r - m_scope_r*pixelTmpStart;
+                                               float bGreen = initial_g -  m_scope_g*pixelTmpStart;
+                                               float bBlue = initial_b - m_scope_b*pixelTmpStart;
+
+                                               showedColorPoints.push_front( new pColorPoint ( minX_represented_Tshow, wxColour( (m_scope_r*pixelTmpStart)+bRed, (m_scope_g*pixelTmpStart)+bGreen, (m_scope_b*pixelTmpStart)+bBlue ), true));                          
+                                       
+                                               accumTemporalPoints ++; 
+                                       }
+                               }                               
+                               if( includeTempEnd && minX_represented_Tshow < maxX_represented_Tshow )
+                               {       
+                                       if( internalCount>0 )
+                                       {
+                                               if( endIndex == internalCount-1 )
+                                               {
+                                                       _logicalBar -> getDataAt( endIndex, realINI, initial_r, initial_g, initial_b );
+                                                       _logicalBar -> getDataAt( endIndex, realEND, final_r, final_g, final_b );
+                                                       realEND = maxX_represented_Tshow;
+                                               }                                               
+                                               else
+                                               {
+                                                       _logicalBar -> getDataAt( endIndex, realINI, initial_r, initial_g, initial_b );
+                                                       _logicalBar -> getDataAt( endIndex+1, realEND, final_r, final_g, final_b );                                                     
+                                               }                                       
+
+                                               int ini_pixelX = convertToPixelValue( realINI );
+                                               int end_pixelX = convertToPixelValue( realEND );
+
+                                               rectangle_width = end_pixelX - ini_pixelX;                                              
+                                               
+                                               float m_scope_r = (float)(final_r-initial_r)/rectangle_width;
+                                               float m_scope_g = (float)(final_g-initial_g)/rectangle_width;
+                                               float m_scope_b = (float)(final_b-initial_b)/rectangle_width;           
+                                               
+                                               float bRed = initial_r - m_scope_r*pixelTmpEnd;
+                                               float bGreen = initial_g -  m_scope_g*pixelTmpEnd;
+                                               float bBlue = initial_b - m_scope_b*pixelTmpEnd;
+                                               showedColorPoints.push_back( new pColorPoint ( maxX_represented_Tshow, wxColour( ( m_scope_r*pixelTmpEnd)+bRed, (m_scope_g*pixelTmpEnd)+bGreen, (m_scope_b*pixelTmpEnd)+bBlue ), true));                                
+                                               accumTemporalPoints ++;                         
+                                       }                                       
+                               }
+                       }
+                       else
+                       {
+                               if(_logicalBar->getCount()>0)
+                               {
+                                       if ( minX_represented_Tshow > _logicalBar->getMaxAddedValue() )
+                                       {
+                                               endIndex = _logicalBar->getCount()-1;
+                                       }
+                                       else if ( maxX_represented_Tshow < _logicalBar->getMinAddedValue() )
+                                       {
+                                               endIndex = 0;
+                                       }
+
+                                       _logicalBar -> getDataAt( endIndex, realINI, initial_r, initial_g, initial_b );
+                                       _logicalBar -> getDataAt( endIndex, realEND, final_r, final_g, final_b );
+                                       
+                                       realINI = minX_represented_Tshow;
+                                       realEND = maxX_represented_Tshow;
+
+                                       showedColorPoints.push_back( new pColorPoint ( realINI, wxColour( initial_r, initial_g, initial_b ), true));    
+                                       accumTemporalPoints ++;         
+                                       showedColorPoints.push_back( new pColorPoint ( realEND, wxColour( initial_r, initial_g, initial_b ), true));    
+                                       accumTemporalPoints ++;         
+                               }
+                       }
+               }               
+                       
+               if ( !showedColorPoints.empty() )
+               {
+                       startNode_show = showedColorPoints.front();
+                       lastNode_show = showedColorPoints.back();
+               }
+       }
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorBar.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorBar.h
new file mode 100644 (file)
index 0000000..794ff50
--- /dev/null
@@ -0,0 +1,762 @@
+
+#ifndef __pCOLOR_BAR__
+#define __pCOLOR_BAR__
+
+// -----------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// -----------------------------------------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//------------------------------------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------------------------------------
+#include <iostream>
+#include <vector>
+#include <deque>
+
+#include "marTypes.h"
+#include "pColorPoint.h"
+#include "LogicalColorBar.h"
+//#include "DegradeRectangle.h"
+#include "pFigure.h"
+#include "wx/colordlg.h"
+
+
+#define TRIANGLE 3
+#define RECTANGLE 4
+//in pixels
+/*
+* Attribute that determines the width of each color point
+*/
+#define FIGURE_WIDTH 3
+
+BEGIN_DECLARE_EVENT_TYPES()
+       DECLARE_EVENT_TYPE( wxEVT_ADDED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_REMOVED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_MOVED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_CHANGED_POINT, -1 )
+       DECLARE_EVENT_TYPE( wxEVT_ON_COLOR_BAR, -1 )
+END_DECLARE_EVENT_TYPES()
+
+
+//-------------------------------------------------------------------------------------------------------------
+// Enum declarations
+//-------------------------------------------------------------------------------------------------------------
+/** Command IDs used by pColorPoint */
+enum
+{
+       cntID_ADD_COLOR_POINT = 6000,
+       cntID_DEL_COLOR_POINT,
+       cntID_CHANGE_COLOR_POINT,
+       cntID_DEGRADE_CONTROL,
+       cntID_CHANGE_FIGURE,
+       cntID_TRIANGLES_UP,
+       cntID_TRIANGLES_DOWN,
+       cntID_TRIANGLES_LEFT,
+       cntID_TRIANGLES_RIGHT,
+       cntID_RECTANGLES,
+};
+
+/** file pColorBar.h */
+class MARACASVISULIB_EXPORTS pColorBar :public  wxScrolledWindow{
+public:
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+       /**
+       * Creates a colorBar instance 
+       * param *parent Container event listener window
+       * param _w Width of the color bar drawing area
+       * param _h Height of the color bar drawing area
+       * param _bar_orientation VERTICAL (false) or HORIZONTAL (true) direction to set 
+       */
+       pColorBar (wxWindow *parent, int _w, int _h, bool _bar_orientation);
+
+       ~pColorBar ();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Color bar proccessed events methods
+       //------------------------------------------------------------------------------------------------------------
+       void OnSize( wxSizeEvent &WXUNUSED(event) );
+
+       /**
+       * Reacts to the mouse movement inside the color bar for moving the clicked color point in the x-axis.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_MOVED_POINT if a point was moved.
+       * param event The mouse actioned event
+       */
+       void onMouseMove ( wxMouseEvent& event );
+       /*
+       * Reacts to the event of drawing the bar and draws it
+       * param &WXUNUSED(event) The correspondig wxPaintEvent actioned event
+       */
+       void onPaint ( wxPaintEvent &WXUNUSED(event) );
+
+       /**
+       * Reacts to the cntID_ADD_COLOR_POINT wxCommandEvent and adds a color degrade point to the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_ADDED_POINT if the point was inserted succesfully.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onAddColorPoint ( wxCommandEvent& anEvent );
+
+       /**
+       * Reacts to the cntID_DEL_POINT wxCommandEvent and deletes a color degrade point of the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_REMOVED_POINT if the point was succesfully removed.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onDeleteColorPoint ( wxCommandEvent& anEvent );
+
+       /**
+       * Reacts to the cntID_CHANGE_COLOR_POINT wxCommandEvent and changes the assigned color to the selected color degrade point of the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_CHANGED_POINT if the point was succesfully removed.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onChangeColourSelectedPoint ( wxCommandEvent& anEvent );
+
+       /**
+       * Reacts to the cntID_TRIANGLES_UP wxCommandEvent and changes the assigned figure to -triangles up- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onTrianglesUp_Figure ( wxCommandEvent& anEvent  );
+       /**
+       * Reacts to the cntID_TRIANGLES_DOWN wxCommandEvent and changes the assigned figure to -triangles down- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onTrianglesDown_Figure ( wxCommandEvent& anEvent  );
+       /**
+       * Reacts to the cntID_TRIANGLES_LEFT wxCommandEvent and changes the assigned figure to -triangles left- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onTrianglesLeft_Figure ( wxCommandEvent& anEvent  );
+       /**
+       * Reacts to the cntID_TRIANGLES_RIGHT wxCommandEvent and changes the assigned figure to -triangles right- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onTrianglesRight_Figure ( wxCommandEvent& anEvent  );
+       /**
+       * Reacts to the cntID_RECTANGLES wxCommandEvent and changes the assigned figure to -rectangles- for the color points of the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onRectangles_Figure ( wxCommandEvent& anEvent  );
+
+       /**
+       * Reacts to the cntID_DEGRADE_CONTROL wxCommandEvent and turns on/off the degrade in the color bar.
+       * param & anEvent The wxCommandEvent actioned event 
+       */
+       void onDegradeControl ( wxCommandEvent& anEvent );
+
+       /**
+       * Reacts to the wxEVT_RIGHT_DCLICK wxMouseEvent and adds a color degrade point to the color bar.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_ADDED_POINT if the point was succesfully inserted.
+       * param & event The wxMouseEvent actioned event 
+       */
+       void onLeftButtonDClick (wxMouseEvent& event);
+
+       /**
+       * Shows the popup menu 
+       */
+       void onShowPopupMenu (wxMouseEvent& event);
+
+       
+       //------------------------------------------------------------------------------------------------------------
+       // Other methods
+       //------------------------------------------------------------------------------------------------------------
+
+       /**
+       * Set active state 
+       * param activeNow The new state
+       */
+       void setActiveStateTo (bool activeNow);
+       
+       /**
+       * Gets the active state of the bar
+       *  return activeState The actual state
+       */
+       bool isActive();
+
+       
+       /**
+       * Gets the real-x value to draw a vertical line
+       * return realX_vertical_line The real x value for the vertical line
+       */
+       int     getRealX_vertical_line();
+
+       /**
+       * Sets the real-x value to draw a vertical line
+       * param realX_vertical_line The new real x value for the vertical line
+       */
+       void setRealX_vertical_line(int newReal_x);
+
+
+       /**
+       * Method that reinitiates attributes of the color bar to the given points
+       * param minRealValue The minimum represented value (real value)
+       * param maxRealValue The maximum represented value (real value)
+       */
+       void reinitiateColorBar(double minRealValue, double maxRealValue);
+
+       /**
+       * Method that reinitiates  attributes of the color bar and set the points given by parameter
+       * param newPointsList Pointer to the list of the new points
+       */
+       void reinitiateColorBarTo (std::vector<pColorPoint *> pointsVector);
+
+       /**
+       *Method that sets a copy of the points of the color bar to the given pointer parameter
+       * param pointsList The list for getting the points
+       */
+       void getPointsListWithTemps (std::vector<pColorPoint*> &pointsVector);
+
+       /**
+       * Method that sets a copy of the points of the color bar to the given pointer parameter, and sets the default values to the needeed attributes, it doesn't
+       * includes the teporal points created
+       * param pointsVector The list for getting the points
+       */
+       void getAddedColorsPointsList (std::vector<pColorPoint*>& pointsVector);
+
+       /**
+       * Adds a color degrade point to the color bar.
+       * param xRealValue The real xValue of the point
+       * param theColour The assigned color for the point
+       * param temporalStart Indicates if the inserted point is the temporal startShowing point
+       * param temporalEnd Indicates if the inserted point is the temporal startShowing point
+       * return Returns true if the point was succesfully inserted.
+       */
+       bool addColorPoint (double xRealValue, wxColour theColour/*, bool temporalStart=false, bool temporalEnd=false*/);
+
+       /**
+       * Delets a color degrade point to the color bar.
+       * param xRealValue The real xValue of the point to delete       
+       * return Returns true if the point was succesfully inserted.
+       */
+       bool deleteColorPoint (double xRealValue);
+
+       /**
+       * Changes the color degrade point color value.
+       * Informs the result of the handled event like a wxCommandEvent wxEVT_CHANGED_COLOR_POINT if the point changed its colour.
+       * param clickedValue The x-coord pixel value of the point to which the color change interests   
+       * return Returns true if the color point was succesfully updated.
+       */
+       bool changeColor ( int clickedValue );
+
+       /**
+       * Repaints the color bar in direction mode of the orientation assigned 
+       * param createTempPoints True for creating temporal points for start and end when a visible range changes
+       */      
+       void repaintView (  );
+                       
+       /**
+       * Forces the refresh view of the color bar
+       */
+       void RefreshForce ();
+
+       void Refresh(bool eraseBackground = true, const wxRect* rect = NULL);
+       
+       /**
+       * Draws the color bar with its degrades
+       * param recentlyChangedOrientation indicates if the orientation has been changed before calling this method
+       */
+       void drawColorBar ( bool recentlyChangedOrientation);
+               
+       /**
+       * Changes the figure of the color points according to the parameter
+       * param theFigure Is the corresponding number for identifying the figure 
+       * RECTANGLE = 4,TRIANGLE LEFT = -4, TRIANGLE RIGHT = -6, TRIANGLE UP = -8, TRIANGLE DOWN = -2
+       */
+       void changeFigure(int theFigure);
+       /**
+       * Changes the figure number of edges used for the degreade color points to the indicated one by parameter
+       * param figEdges Is the constant that represents the figure number of edges (TRIANGLE | RECTANGLE)
+       */
+       void changePointsFigure_Edges (int figEdges);
+       
+       /**
+       * Gets the constant that represents the figure number of edges used for the degreade color points
+       * return figureEdges Is the constant that represents the figure number of edges (TRIANGLE | RECTANGLE)
+       */
+       int getPointsFigure_Edges ();
+
+       /**
+       * Sets the height of the drawing bar area
+       * param _h The height to set
+       */
+       void setHeight (int _h);
+
+       /**
+       * Sets the height of the drawing bar area
+       * return _h The height to get
+       */
+       int getHeight();
+
+       /**
+       * Sets the width of the drawing bar area
+       * param _w The width to set
+       */
+       void setWidth (int _w);
+
+       /**
+       * Gets the width of the drawing bar area
+       * param width The width to get
+       */
+       int getWidth ();
+
+       /**
+       * Sets the height of the containing rectangle bar
+       * param _h The height to set
+       */
+       void setBarHeight (int _h);
+
+       /**
+       * Gets the height  of the containing rectangle bar
+       * return bar_height The height to get
+       */
+       int getBarHeight();
+
+       /**
+       * Sets the width of the containing rectangle bar
+       * param _w The width to set
+       */
+       void setBarWidth (int _w);
+
+       /**
+       * Gets the width of the containing rectangle bar
+       * return bar_width The width to get
+       */
+       int getBarWidth ();
+
+       /**
+       * Sets the orientation of the color bar
+       * param _orientation The orientation to set VERTICAL = false, HORIZONTAL = true
+       */
+       void setOrientation (bool _orientation);
+
+       /**
+       * Gets the orientation of the color bar
+       * return bar_orientation The bar orientation assigned
+       */
+       bool getOrientation ();
+
+       /**
+       * Sets the collection of color points
+       * param _points The new points to set, each one of data type pColorPoint ( xValue, wxColour_assigned)
+       */
+       void setPoints (std::vector<pColorPoint *> _points);
+
+       /**
+       * Gets the last clickedX pixel coord inside the bar.
+       * return clickedX The x-coord pixel value
+       */
+       int getClickedX();
+
+       /**
+       * Sets the last clickedX pixel coord inside the bar.
+       * param xCoordPixel The x-coord value to set
+       */
+       void setClickedX(int xCoordPixel);
+
+       /**
+       * Gets the last clickedY pixel coord inside the bar.
+       * return clickedY The y-coord pixel value
+       */
+       int getClickedY();
+
+       /**
+       * Sets the last clickedY pixel coord inside the bar.
+       * param yCoordPixel The y-coord pixel value to set
+       */
+       void setClickedY(int yCoordPixel);
+
+       /**
+       * Gets the real x value for a givex x-pixel value using the rule real_x = (x_pixel * (maxX_represented_Tshow - minXRepresented) ) / bar_width
+       * param x_Pixel The pixel value to convert into real value with respect to the x scale
+       * return realX The real-x value corresponding to the xPixel
+       */
+       double convertToRealValue ( int x_Pixel );
+
+       /**
+       * Gets the x-pixel value for a given x_real value using the rule x_pixel = (x_real * bar_width)/(maxX_represented_Tshow - minX_represented_Tshow)
+       * param x_Pixel The pixel value to convert into real value with respect to the x scale
+       * return realX The real-x value corresponding to the xPixel
+       */
+       int convertToPixelValue ( double x_real );
+
+       /**
+       * Gets the selected color and updates the state of the okSelectedColor
+       * return selectedColor Is the selected rbg color
+       */
+       wxColour getSelectedColour();   
+
+       /**
+       * Sets the represented minimum and maximunm values
+       * param minRealValue The minimum represented value (real value)
+       * param maxRealValue The maximum represented value (real value)
+       */
+       void setRepresentedValues ( double minRealValue, double maxRealValue);
+
+       /**
+       * Gets the data of the last point moving
+       * return pointData Is a pColorPoint with the data of las moved color
+       */
+       pColorPoint * getLastMovedColorPoint();
+
+       /**
+       * Sets the gap values for the color bar bitmap
+       * param gap_x Gap in x
+       * param gap_y Gap in y
+       */
+       void setGapValues (int gap_x, int gap_y);
+
+       /**
+       * Sets the degrade state of the color bar
+       * param newState The degrade stare to set 
+       */
+       void setDegradeState(bool newState);
+
+       /*
+       * Sets the visible range of the bar and repaints the bar according to it, the min value must be less than the max value.
+       * param minToShow Is the minimum value to show in the colorbar
+       * param maxToShow Is the maximum value to show in the colorbar
+       */
+       void setVisibleRange(int minToShow, int maxToShow);
+
+       /**
+       * Gets the degrade state of the color bar
+       * return doingDegrade is the actual degrade state of the bar
+       */
+       bool getDegradeState();
+
+       /**
+       * Sets the state of static or not for the limit color points
+       * pamar areStatic Is the state to set for the limits
+       */
+       void setStaticLimitsTo(bool areStatic);
+
+       /**
+       * Gets the state of static or not for the limit color points
+       * return staticLimits Is the state for limits
+       */
+       bool getStaticLimits();
+
+       /**
+       * Sets the device start drawing left-superior (pixel) start point and draws automatically the color bar
+       * param deviceStart_x Pixel start for x-coord
+       * param deviceStart_y Pixel start for y-coord
+       */
+       void setDeviceBlitStart ( wxCoord deviceStart_x, wxCoord deviceStart_y );
+
+       /**
+       * Clears the temporal color points of the list
+       */
+       void clearTemporalColors();
+
+       /**
+       * Gets the device value form the end of this panel to the end of the drawing area in the device in pixels
+       * return deviceEndMargin The value asigned to the right margin
+       */
+       int     getDeviceEndX();
+       
+
+       /**
+       * Sets the new device (deviceEndMargin) value form the end of this panel to the end of the drawing area in the device
+       * param newDeviceEnd_pixels The new pixel value to asign to the right margin in pixels
+       */
+       void setDeviceEndX(int newDeviceEnd_pixels);
+
+
+       /**
+       * Sets the new device (deviceEndMargin) value form the end of this panel to the end of the drawing area in the device
+       * param newDeviceEnd_pixels The new pixel value to asign to the right(horizontal view), underneath(vertical view) margin in pixels
+       */
+       void setDeviceEndMargin(int newDeviceEnd_pixels);
+       
+       /**
+       * Method that creates and send the given id-event to the event handler
+       * param theEventType Is the event id type identification for generating the event
+       */
+       void createAndSendEvent(WXTYPE theEventType);
+
+
+       /**
+       * Returns the number of points that the bar color has
+       * return
+       */
+       int getColorPointsSize();
+
+       /**
+        Get the RGB values of the color point that is in the
+        index given
+       */
+       void getDataAt(int index, double& x,int& red,int& green,int& blue);
+       
+
+       /**
+       * Sets the guide line color
+       * param theNwGuideLineColor The color to set to the guideLineColor
+       */
+       void setGuideLineColour(wxColour theNwGuideLineColor);
+
+       /**
+       * Gets the guide line color
+       * return guideLineColor The color of the guideLine
+       */
+       wxColour getGuideLineColour();
+
+       /**
+       * Sets the background color
+       * param theNwBackColor The color to set to the colourParent
+       */
+       void setBackGroundColour(wxColour theNwBackColor);
+
+       /**
+       * Gets the background color
+       * return colourParent The color of the background
+       */
+       wxColour getBackGroundColour();
+
+       /**
+       * Gets the min value of the color bar
+       */
+       double  getMinValue();
+
+       /**
+       * Gets the max value of the color bar
+       */
+       double  getMaxValue();
+
+       /**
+       * Updates the colors of the first nonTemporal point in the list and the last nonTemporal point 
+       * That logically corresponds always to the the first and last nodes of the color bar
+       */
+       void updateExtremeColors();
+               
+       void onLeftClicDown(wxMouseEvent& event );
+
+       void onLeftClickUp(wxMouseEvent& event );
+
+       void updatePointsToDraw();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Attributes declaration
+       //------------------------------------------------------------------------------------------------------------
+       
+private:
+
+       /*
+       *
+       */
+       bool acceptedClick;
+
+       /*
+       * Represents the logical bar instance
+       */
+       LogicalColorBar * _logicalBar;
+       
+       /*
+       * Represents the margin gap on x
+       */
+       int gapX;
+       
+       /*
+       * Represents the margin gap on x
+       */
+       int gapY;
+       /*
+       * Represents the height of the color bar drawing area
+       */
+       int                     height;
+       /*
+       * Represents the width of the color bar drawing area
+       */
+       int                     width;
+
+       /*
+       * Represents the height  of the bar
+       */
+       int                     bar_height;
+
+       /*
+       * Represents the width of the bar
+       */
+       int                     bar_width;
+
+       /*
+       * Represents the collection of degrade definition points 
+       */
+       std::deque<pColorPoint *> showedColorPoints;
+       
+       /* 
+       * The orientation of the rectangule is true when is horizontal, false for vertical
+       */
+       //bool          bar_orientation;
+
+       /*
+       * The points figure orientation UP, DOWN, LEFT, or RIGTH
+       */ 
+       int                     points_orientation;
+
+       /*
+       * The minimum represented real value used for calculating the scaling for point by the rule real_x = (x_pixel * (maxX_represented_Tshow_Tshow - minX_represented_Tshow) ) / bar_width
+       */
+       int                     minX_represented_Tshow;
+
+       /**
+       * The maximum represented real value used for calculating the scaling for point by the rule real_x = (x_pixel * (maxX_represented_Tshow_Tshow - minXRepresented_Tshow) ) / bar_width
+       */
+       int                     maxX_represented_Tshow;
+
+       /**
+       * The minimum represented real value used for calculating the scaling for point by the rule real_x = (x_pixel * (maxX_represented_Tshow_Tshow - minX_represented_Tshow) ) / bar_width
+       */
+       int                     temporalMinXToShow;
+
+       /*
+       * The maximum represented real value used for calculating the scaling for point by the rule real_x = (x_pixel * (maxX_represented_Tshow_Tshow - minXRepresented_Tshow) ) / bar_width
+       */
+       int                     temporalMaxXToShow;
+       
+       /**
+       * Indicates the first node to show 
+       */
+       pColorPoint *   startNode_show;
+
+       /**
+       * Indicates the last node to show
+       */
+       pColorPoint *   lastNode_show;
+       
+       /**
+       *  Indicates the amount of temporal initial color points
+       */
+    int accumTemporalPoints;
+
+       /**
+       * Represents the state of viewing a range
+       */
+       bool viewingRange;
+
+       /**
+       * Is the constant that represents the figure number of edges (TRIANGLE | RECTANGLE)
+       */
+       pFigure*        figure;
+       /**
+       * Represents the last clickedX coord inside the bar.
+       */
+       int                     clickedX;
+
+       /*
+       * Represents the last clickedY coord inside the bar.
+       */
+       int                     clickedY;
+
+       /**
+       * Represents the movind index of the last moving point in the colorPoints list
+       */
+       int                     movingPointIndex;
+
+       /**
+       * Indicates if in the last colour selection the ok button was clicked
+       */
+       bool            okSelectedColor;
+
+       /**
+       * Represents the statc or movable state of limit start and end color points, default value true for static
+       */
+       bool            staticLimits;
+
+       /**
+       * Indicates the last node moving in the coloPoints list
+       */
+       pColorPoint *   movingNodePoint;
+
+//     pDegradeRectangle *                     degrade;
+       
+       /**
+       * Is the bitmap for the bar color
+       */
+       wxBitmap *                                      colorBar_Bitmap;
+       /**
+       * Is the bitmap of the information associated to the bar color
+       */
+       wxBitmap *                                      information_Bitmap;
+       /**
+       * Represents the state of doing or not the degrade in the bar (default value true for doing degrade)
+       */
+       bool                                            doingDegrade;
+
+       /**
+       * Represents that the minimum value for the visible range has been found in the original color points
+       */
+       bool                                            minFound;
+
+       /**
+       * Represents that the maximum value for the visible range has been found in the original color points
+       */
+       bool                                            maxFound;
+
+       /**
+       * X-Coord for left-superior device visible drawing
+       */
+       wxCoord                                         deviceStart_x;  
+
+       /**
+       * Y-Coord for left-superior device visible drawing
+       */
+       wxCoord                                         deviceStart_y;
+
+       /*
+       * X-Coord for left-superior device margin, important for horizontal view
+       */
+       wxCoord                                         deviceEndMargin;        
+
+       /**
+       * Y-Coord for left-superior device margin, important for vertical view
+       */
+       wxCoord                                         deviceEnd_y;
+       /**
+       * Represents the active state of the bar
+       */
+       bool                                            activeState;
+
+       int                                             avaliablePointToMove;
+
+       /**
+       * Represents the real-x value to draw a vertical line
+       */
+       int                                                     realX_vertical_line;
+
+    /**
+       * Represents the color of the dot-line use as guides. The default color is RED. 
+       */
+       wxColour        guideLineColor;
+
+        /*
+       * Represents the color of the backGround. Default color is the parent color. 
+       */
+       wxColour        colourParent;
+
+       /*
+       * The color bar pop menu
+       */
+       wxMenu c_popmenu; 
+       /*
+       * The figure changes submenu
+       */
+       wxMenu * changesMenu;
+       
+       
+       DECLARE_CLASS(pColorBar)
+       // any class wishing to process wxWindows events must use this macro
+       DECLARE_EVENT_TABLE()
+};
+
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorPoint.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorPoint.cxx
new file mode 100644 (file)
index 0000000..2a8b2b3
--- /dev/null
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------------------------------------
+// Class definition include
+//------------------------------------------------------------------------------------------------------------
+#include "pColorPoint.h"
+
+// -----------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// -----------------------------------------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//------------------------------------------------------------------------------------------------------------
+// Class implementation
+//------------------------------------------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(pColorPoint, wxObject)
+
+//------------------------------------------------------------------------------------------------------------
+// Constructors and destructors
+//------------------------------------------------------------------------------------------------------------
+
+/**
+* Create a point of the function.
+* @param x The x real value
+* @param _color The asigned colour 
+* @param isTemp The temporal o fixed asignation to the color
+*/
+pColorPoint :: pColorPoint(double  x , wxColour  col, bool isTemp)
+{
+       realX = x;
+       colour = col;   
+       isTemporal = isTemp;
+}
+
+pColorPoint :: ~pColorPoint()
+{
+
+}
+//------------------------------------------------------------------------------------------------------------
+// Methods implementation
+//------------------------------------------------------------------------------------------------------------
+/*
+* Returns the x-value of the point
+* @ realX
+*/
+double pColorPoint :: getRealX ()
+{
+       return realX;
+}
+/**
+       * Returns the colour of the point
+       * @retval colour
+       */
+wxColor pColorPoint :: getColor ()
+{
+       return colour;
+}
+
+/**
+* Indicates if the colour point is temporal or not
+* @retval isTemporal
+*/
+bool pColorPoint :: isTemporalColor ()
+{
+       return isTemporal;
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorPoint.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pColorPoint.h
new file mode 100644 (file)
index 0000000..ec832f8
--- /dev/null
@@ -0,0 +1,98 @@
+#ifndef __pColorPoint_h__
+#define __pColorPoint_h__
+
+//------------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+//------------------------------------------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//------------------------------------------------------------------------------------------------------------
+// Class definition
+//------------------------------------------------------------------------------------------------------------
+
+class pColorPoint : public wxObject {
+
+public:
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors and destructors
+       //------------------------------------------------------------------------------------------------------------
+
+       /**
+       * Create a point of the function.
+       * @param x The x real value
+       * @param _color The asigned colour 
+       * @param isTemp The temporal o fixed asignation to the color
+       */
+       pColorPoint(double  x , wxColour  col, bool isTemp);
+
+       ~pColorPoint();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Methods definition
+       //------------------------------------------------------------------------------------------------------------
+
+       /*
+       * Returns the x-value of the point
+       * @retval realX
+       */
+       double getRealX ();
+       /**
+       * Returns the colour of the point
+       * @retval colour
+       */
+       wxColor getColor ();
+       /**
+       * Sets the x-value of the point
+       * @param x
+       */
+       void setRealX(double x)
+       {
+               realX = x;
+       }
+       /**
+       * Sets the  colour of the point
+       * @param _col
+       */      
+       void setColor(wxColour _col)
+       {
+               colour = _col;
+       }
+
+       /**
+       * Indicates if the colour point is temporal or not
+       * @retval isTemporal
+       */
+       bool isTemporalColor ();
+       
+       //------------------------------------------------------------------------------------------------------------
+       // Attributes declration
+       //------------------------------------------------------------------------------------------------------------
+
+private:
+       /*
+       * The x-value of the point
+       */
+       double realX;
+       /*
+       * The colour of the point
+       */          
+       wxColour colour;
+       /*
+       * Represents the attibute of being temporal or not
+       */
+       bool isTemporal;
+       
+       DECLARE_CLASS (pColorPoint)
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFigure.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFigure.cxx
new file mode 100644 (file)
index 0000000..d3ad630
--- /dev/null
@@ -0,0 +1,288 @@
+
+//----------------------------------------------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------------------------------------------
+#include "pFigure.h"
+
+// ---------------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ---------------------------------------------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------------------------------------------
+/** @file pFigure.cxx */
+IMPLEMENT_CLASS(pFigure, wxObject)
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+       /**
+       * Create a figure with edges_n edges
+       * @param edges_n The number of edges of the new figure
+       * @param _w The width to set
+       * @param _h The height to set
+       * @param _orientation The orientation to set
+       */
+       pFigure :: pFigure(int edges_n, int _w, int _h, int _orientation, bool bar_orientation)
+       {
+               edges = edges_n;
+               orientation = _orientation;
+               width = _w;
+               heigth = _h;
+               setBarOrientation( bar_orientation );
+       }
+
+       pFigure :: ~pFigure()
+       {
+
+       }
+
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+       /**
+       * Gets the number of edges of the figure
+       * @retval edges Number of edges in the figure
+       */
+       int pFigure :: getNumberEdges()
+       {
+               return edges;
+       }
+
+       /**
+       * Sets the vertex points of the figure
+       * @param edges Number of edges in the figure to set
+       */
+       void pFigure :: setNumberEdges(int n_edges)
+       {
+               edges = n_edges;
+       }
+
+       /**
+       * Gets the vertex points of the figure
+       * @param wxPoint The vector to get the points
+       * @retval points Vertex points distribution in the figure
+       */
+       void pFigure :: getVertexPoints(wxPoint thePoints[])
+       {
+               if (edges == TRIANGLE)
+               {
+                       int halfWidth = 0;
+                       int halfHeigth = 0;
+                       if ( barOrientation ) // HORIZONTAL
+                       {
+                               halfWidth = (int)(width/2);
+                               halfHeigth = (int)(heigth/2);
+                               switch ( orientation ) 
+                               {
+                                 case UP : 
+                                       thePoints[0].x = halfWidth;
+                                       thePoints[0].y = 0;
+                                       thePoints[1].x = width;
+                                       thePoints[1].y = heigth;
+                                       thePoints[2].x = -halfWidth;
+                                       thePoints[2].y = heigth;
+                                       break;
+                                       
+                                 case DOWN : 
+                                       thePoints[0].x = halfWidth;
+                                       thePoints[0].y = heigth;
+                                       thePoints[1].x = width;
+                                       thePoints[1].y = 0;
+                                       thePoints[2].x = -halfWidth;
+                                       thePoints[2].y = 0;
+                                       break;
+
+                                 case LEFT : 
+                                       thePoints[0].x = 0;
+                                       thePoints[0].y = halfHeigth;
+                                       thePoints[1].x = width;
+                                       thePoints[1].y = 0;
+                                       thePoints[2].x = width;
+                                       thePoints[2].y = heigth;
+                                       break;
+
+                                 case RIGHT :          
+                                       thePoints[0].x = width;
+                                       thePoints[0].y = halfHeigth;            
+                                       thePoints[1].x = 0;
+                                       thePoints[1].y = 0;
+                                       thePoints[2].x = 0;
+                                       thePoints[2].y = heigth;
+                                       break;
+                               }                       
+                       }
+                       else // VERTICAL
+                       {
+                               halfWidth = (int)(heigth/2);
+                               halfHeigth = (int)(width/2);
+                               switch ( orientation ) 
+                               {
+                                 case UP : 
+                                       thePoints[0].x = halfWidth;
+                                       thePoints[0].y = 0;
+                                       thePoints[1].x = heigth;
+                                       thePoints[1].y = width;
+                                       thePoints[2].x = -halfWidth;
+                                       thePoints[2].y = width;
+                                       break;
+                                       
+                                 case DOWN : 
+                                       thePoints[0].x = halfWidth;
+                                       thePoints[0].y = width;
+                                       thePoints[1].x = heigth;
+                                       thePoints[1].y = 0;
+                                       thePoints[2].x = -halfWidth;
+                                       thePoints[2].y = 0;
+                                       break;
+
+                                 case LEFT : 
+                                       thePoints[0].x = 0;
+                                       thePoints[0].y = halfHeigth;
+                                       thePoints[1].x = heigth;
+                                       thePoints[1].y = -halfHeigth;
+                                       thePoints[2].x = heigth;
+                                       thePoints[2].y = width;
+                                       break;
+
+                                 case RIGHT :          
+                                       thePoints[0].x = heigth;
+                                       thePoints[0].y = halfHeigth;            
+                                       thePoints[1].x = 0;
+                                       thePoints[1].y = -halfHeigth;
+                                       thePoints[2].x = 0;
+                                       thePoints[2].y = width;
+                                       break;
+                               }       
+                       }                               
+               }
+               else if (edges == RECTANGLE)
+               {
+                       if ( barOrientation ) // HORIZONTAL
+                       {
+                               thePoints[0].x = 0;
+                               thePoints[0].y = 0;             
+                               thePoints[1].x = width;
+                               thePoints[1].y = 0;
+                               thePoints[2].x = width;
+                               thePoints[2].y = heigth;
+                               thePoints[3].x = 0;
+                               thePoints[3].y = heigth;
+                       }
+                       else // VERTICAL
+                       {
+                               thePoints[0].x = 0;
+                               thePoints[0].y = 0;             
+                               thePoints[1].x = heigth;
+                               thePoints[1].y = 0;
+                               thePoints[2].x = heigth;
+                               thePoints[2].y = width;
+                               thePoints[3].x = 0;
+                               thePoints[3].y = width;
+                       }
+               }
+       }
+
+       /**
+       * Sets the vertex points of the figure
+       * @param edges Vertex points distribution in the figure to set
+       */
+       void pFigure :: setVertexPoints(wxPoint * n_points)
+       {
+               v_points = n_points;
+       }
+
+       /*
+       * Sets the heigth of the figure
+       * @param _h The heigth to set
+       */
+       void pFigure :: setHeigth(int _h)
+       {
+               heigth = _h;
+       }
+
+       /*
+       * Gets the heigth of the figure
+       * @retval heigth The heigth of the figure
+       */
+       int pFigure :: getHeigth()
+       {
+               return heigth;
+       }
+
+       /*
+       * Sets the width of the figure
+       * @param _w The width to set
+       */
+       void pFigure :: setWidth(int _w)
+       {
+               width = _w;
+       }
+
+       /*
+       * Gets the width of the figure
+       * @retval width The width of the figure
+       */
+       int pFigure :: getWidth()
+       {
+               return width;
+       }
+
+       /*
+       * Indicates if a pixel point is inside the figure
+       * @param xFig_PixelPoint The known reference point inside the figure
+       * @param xPixel The x-pixel coord asking for
+       * @retval Returns true if the point is inside
+       */
+       bool pFigure :: isPointInside(int xFig_PixelPoint, int xPixel)
+       {
+               bool isInside = false;
+
+               if (edges == TRIANGLE)
+               {
+                       int halfWidth = (int)(width/2)+1;
+                       int halfHeigth = (int)(heigth/2)+1;
+                       if ( orientation == UP || orientation == DOWN )
+                       {
+                               isInside = (xPixel>=xFig_PixelPoint-halfWidth) && (xPixel<=xFig_PixelPoint+halfWidth);
+                       }
+                       else if( orientation == LEFT || orientation == RIGHT )
+                       {
+                               isInside = (xPixel>=xFig_PixelPoint-halfHeigth) && (xPixel<=xFig_PixelPoint+halfHeigth);
+                       }                                               
+               }
+               else if (edges == RECTANGLE)
+               {
+                       isInside = (xPixel >= xFig_PixelPoint) && (xPixel<=xFig_PixelPoint+width);
+               }
+               return isInside;
+       }
+
+       /*
+       * Sets the bar orientation 
+       * @ bar_orientation The orientation to set (true for horizontal, false for vertical)
+       */
+       void pFigure :: setBarOrientation(bool bar_orientation)
+       {
+               barOrientation = bar_orientation;
+       }
+
+       /*
+       * Sets the bar orientation used for triangles
+       * @ bar_orientation The orientation to set (LEFT = -4, RIGHT = -6, UP = -8, DOWN = -2)
+       */
+       void pFigure :: setFigureOrientation(int fig_orientation)
+       {
+               orientation = fig_orientation;
+       }
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFigure.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFigure.h
new file mode 100644 (file)
index 0000000..85ca33f
--- /dev/null
@@ -0,0 +1,163 @@
+#ifndef __pFIGURE__
+#define __pFIGURE__
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+/** @file pFigure.h */
+class pFigure :public  wxObject{
+
+public:
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+       /**
+       * Create a figure with edges_n edges
+       * @param edges_n The number of edges of the new figure
+       * @param _w The width to set
+       * @param _h The height to set
+       * @param _orientation The figure orientation to set
+       * @param bar_orientation The figure orientation to set
+       */
+       pFigure(int edges_n, int _w, int _h,int _orientation, bool bar_orientation);
+       ~pFigure();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+       /**
+       * Gets the number of edges of the figure
+       * @retval edges Number of edges in the figure
+       */
+       int getNumberEdges();
+
+       /**
+       * Sets the vertex points of the figure
+       * @param edges Number of edges in the figure to set
+       */
+       void setNumberEdges(int n_edges);
+       
+       /**
+       * Gets the vertex points of the figure
+       * @param wxPoint The vector to get the points
+       * @retval points Vertex points distribution in the figure
+       */
+       void getVertexPoints(wxPoint thePoints[]);
+
+       /**
+       * Sets the vertex points of the figure
+       * @param edges Vertex points distribution in the figure to set
+       */
+       void setVertexPoints(wxPoint * n_points);
+
+       /*
+       * Sets the heigth of the figure
+       * @param _h The heigth to set
+       */
+       void setHeigth(int _h);
+
+       /*
+       * Gets the heigth of the figure
+       * @retval heigth The heigth of the figure
+       */
+       int getHeigth();
+
+       /*
+       * Sets the width of the figure
+       * @param _w The width to set
+       */
+       void setWidth(int _w);
+
+       /*
+       * Gets the width of the figure
+       * @retval width The width of the figure
+       */
+       int getWidth();
+
+       /*
+       * Indicates if a pixel point is inside the figure
+       * @param xFig_PixelPoint The known reference point inside the figure
+       * @param xPixel The x-pixel coord asking for
+       * @retval Returns true if the point is inside
+       */
+       bool isPointInside(int xFig_PixelPoint, int xPixel);
+
+       /*
+       * Sets the bar orientation 
+       * @ bar_orientation The orientation to set (true for horizontal, false for vertical)
+       */
+       void setBarOrientation(bool bar_orientation);
+
+       /*
+       * Sets the bar orientation used for triangles
+       * @ bar_orientation The orientation to set (LEFT = -4, RIGHT = -6, UP = -8, DOWN = -2)
+       */
+       void setFigureOrientation(int fig_orientation);
+       
+       //------------------------------------------------------------------------------------------------------------
+       // Constants
+       //------------------------------------------------------------------------------------------------------------
+       
+       enum
+       {
+               TRIANGLE = 3,
+               RECTANGLE = 4,
+               LEFT = -4,
+               RIGHT = -6,
+               UP = -8,
+               DOWN = -2,
+       };
+
+private:
+
+       //------------------------------------------------------------------------------------------------------------
+       // Attributes
+       //------------------------------------------------------------------------------------------------------------
+
+       /*
+       * Represents the heigth of the figure
+       */
+       int heigth;
+
+       /*
+       * Represents the width of the figure
+       */
+       int width;
+
+       /*
+       * Represents the edges of the figure
+       */
+       int edges;
+
+       /**
+       * Represents the orientation UP, DOWN, LEFT, RIGTH of the figure
+       */
+       int orientation;
+
+       /*
+       * Is the bar orientation (true for HORIZONTAL, false VERTICAL)
+       */
+       bool barOrientation;
+
+       /*
+       * Represents the vertex points distribution of the figure in pixels scale
+       */
+       wxPoint *v_points;
+
+DECLARE_CLASS(pColorBar)
+
+};
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.cxx
new file mode 100644 (file)
index 0000000..ab7e248
--- /dev/null
@@ -0,0 +1,69 @@
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pFunctionPoint.h"
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(pFunctionPoint, wxObject)
+
+//----------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------
+/**
+* Create a point of the function.
+* @param x The x value
+* @param y The y value
+*/
+pFunctionPoint :: pFunctionPoint(int  x , int  y ) 
+{
+       realX = x;
+       realY = y;
+       hasColorForLevel = false;
+}
+//----------------------------------------------------------------------------
+// Methods
+//----------------------------------------------------------------------------
+/*
+* Returns the x-value of the point
+* @ realX
+*/
+int pFunctionPoint ::getRealX ()
+{
+       return realX;
+}
+/**
+* Returns the x-value of the point
+* @ realY
+*/
+int pFunctionPoint :: getRealY ()
+{
+       return realY;
+}
+/*
+* Sets the state of having an asigned color
+*/
+void  pFunctionPoint :: setHasColor (bool hasColor)
+{
+       hasColorForLevel = hasColor;
+}
+/*
+* Indicates if the point has an asigned color for the level 
+*/
+bool  pFunctionPoint :: getHasColorForLevel()
+{
+       return hasColorForLevel;
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pFunctionPoint.h
new file mode 100644 (file)
index 0000000..720c11d
--- /dev/null
@@ -0,0 +1,99 @@
+#ifndef __pFunctionPoint_h__
+#define __pFunctionPoint_h__
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+
+class pFunctionPoint : public wxObject {
+
+       //----------------------------------------------------------------------------
+       // Methods definition
+       //----------------------------------------------------------------------------
+public:
+       /**
+       * Create a point of the function.
+       * @param x The x value
+       * @param y The y value
+       */
+       pFunctionPoint(int  x , int  y ) ;
+
+       /*
+       * Returns the x-value of the point
+       * @ realX
+       */
+       int getRealX ();
+       /**
+       * Returns the y-value of the point
+       * @ realY
+       */
+       int getRealY ();
+       /**
+       * Sets the x-value of the point
+       * @param x
+       */
+       void setRealX(int x)
+       {
+               realX=x;
+       }
+       /**
+       * Sets the y-value of the point
+       * @param y
+       */      
+       void setRealY(int y)
+       {
+               realY=y;
+       }
+       /*
+       * Sets the state of having an asigned color
+       */
+       void setHasColor (bool hasColor);
+       /*
+       * Indicates if the point has an asigned color for the level 
+       */
+       bool getHasColorForLevel();
+
+
+       //----------------------------------------------------------------------------
+       // Attributes declration
+       //----------------------------------------------------------------------------
+
+private:
+       /*
+       * The x-value of the point
+       */
+       int realX;
+       /*
+       * The y-value of the point
+       */          
+       int realY;
+       /*
+       *  Indicates if the point has an asigned color for the level
+       */
+       bool hasColorForLevel;
+
+       DECLARE_CLASS (pFunctionPoint)
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.cxx
new file mode 100644 (file)
index 0000000..81f843b
--- /dev/null
@@ -0,0 +1,847 @@
+
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pGraphicalFunction.h"
+#include "math.h"
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(pGraphicalFunction, pPlotterLayer)
+
+pGraphicalFunction:: pGraphicalFunction(wxString name, int flags)
+{
+       SetName(name);
+       showPointsF = false;
+       validPointRange = 5;
+       logicFunction = new pLogicalFunction ();
+       fromWindow=false;
+       factorZoom=1;
+       drawing=false;
+       editable=true;
+       ifActual=false;
+       zoomIn=false;
+       setOffsetX(0);
+       setOffsetY(0);
+       initialDrawingPoint=NULL;
+       finalDrawingPoint=NULL;
+       //type=1 means that is going to be a piecewise function
+       _type=1;
+       xKSpline=NULL;
+       yKSpline=NULL;
+       offsetPixelX=0;
+       offsetPixelY=0;
+       xTraslation=0;
+       mType=DEFAULT;
+}
+
+/**
+* Is the destructor!!!
+*/
+pGraphicalFunction :: ~ pGraphicalFunction ()
+{
+       
+}
+
+//set if the function has to draw the points
+void pGraphicalFunction::SetShowPoints(bool showPoints)
+{
+       showPointsF = showPoints;
+}
+//get the paramater showPointsF
+bool pGraphicalFunction::getShowPoints()
+{
+       return showPointsF;
+}
+/*
+ * Set Up startPoint, endPoint, maxY,maxX points       
+*/
+void pGraphicalFunction::setUp()
+{
+       logicFunction->setUp();
+       setMaxX(logicFunction->getMaxX());
+       setMinX(logicFunction->getMinX());
+       setMaxY(logicFunction->getMaxY());
+       setMinY(logicFunction->getMinY());
+       setStartX(logicFunction->getStartX());
+       setEndX(logicFunction->getEndX());
+       setStartY(logicFunction->getStartY());
+       setEndY(logicFunction->getEndY());
+       
+}
+
+/*
+* validate if the function has that point in a sensible area returning the index where the point was found or -1 if is in not part of the function: define the sensible area is  
+* x1-validPointRange<x<x1+validPointRange y1-validPointRange<y<y1+validPointRange
+*/
+int pGraphicalFunction::validPointOnFunction(wxPoint realPoint)
+{
+       return (logicFunction -> validPointOnFunction (realPoint));
+}
+/*
+* returns the index in the list of the point 
+*/
+int pGraphicalFunction::getIndexOf(wxPoint realpoint)
+{
+       return logicFunction -> getIndexOf( realpoint );        
+}
+
+/*
+* This metohd returns the node of the point that is the movingPointIndex position in the list of points.
+* @param: int movingPointIndex, Is the index value of the searched node. 
+* @return: Return a pointer to the node corresponding to the index value by parameter.
+*/
+wxNode* pGraphicalFunction::GetPointAt( int movingPointIndex )
+{
+       return logicFunction -> GetPointAt ( movingPointIndex );        
+}
+/*
+ * Set the scales of the function in x and y
+ * 
+ */
+void pGraphicalFunction::setScales()
+{
+       //int dx= logicFunction->getMaxX()-logicFunction->getMinX();
+       //int dy= logicFunction->getMaxY()-logicFunction->getMinY();
+       int dx= maxShowedX-minShowedX;
+       int dy= maxShowedY-minShowedY;
+       
+       
+       if(dx!=0 && dy!=0)
+       {
+               double scaleX=(((float)(screenX-100))/dx)*factorZoom;
+               double scaleY=(((float)(screenY-50))/dy)*factorZoom;
+               setScaleX(scaleX);
+               setScaleY(scaleY);
+               logicFunction->setScaleX(scaleX);
+               logicFunction->setScaleY(scaleY);
+
+       }
+}
+/*
+* Includes a point between two existing points of this function. The new point (x,y) was not defined when the function was created.
+* @return Returns true is the point was succcesfully added to the funcion.
+*/
+bool pGraphicalFunction:: AddNewPoint(int x,int y)
+{
+       bool added= logicFunction -> AddNewPoint ( x, y );
+       if(!fromWindow)
+        setUp();
+       else
+       {
+               logicFunction->setEndPoints();
+               logicFunction->setStartPoints();
+       }
+       return added;
+}
+
+/*
+* This tries to Add a point to the function if possible it returns true.
+* @pre: The list of existing points is ordered.
+* @param: int aX, The x value of the point.
+* @param: int aY, The y value of the point.
+* @param: return Returns TRUE if the point was succesfuly included in the realPoints list.
+*/
+bool pGraphicalFunction::AddPoint(int aX, int aY,bool order) 
+{      
+       
+       bool added=logicFunction -> AddPoint( aX, aY,order );
+       if(!fromWindow)
+        setUp();
+       else
+       {
+               logicFunction->setEndPoints();
+               logicFunction->setStartPoints();
+       }
+       return added;
+}
+
+/**
+* deletes the point given by the  user  from the collection of logical points of the function
+* is not used
+*/
+
+bool pGraphicalFunction::DeletePoint(int aX, int aY) 
+{
+       bool added= logicFunction -> DeletePoint( aX, aY );     
+       if(!fromWindow)
+        setUp();
+       else
+       {
+               logicFunction->setEndPoints();
+               logicFunction->setStartPoints();
+       }
+       return added;
+}
+
+/**
+* deletes a point of the functio given its index
+*/
+bool pGraphicalFunction::deletePointAt(int index)
+{
+       bool added=logicFunction -> deletePointAt( index );
+       if(!fromWindow)
+        setUp();
+       else
+       {
+               logicFunction->setEndPoints();
+               logicFunction->setStartPoints();
+       }
+       return added;
+}
+
+/**
+* Change de coordinates of the given index point to the newCoords, if it is possible and return the result of the invoked action. 
+* @retun Return TRUE if it was possible to do the change. A valid change is when the new x value of the point is still between the previous and next point, when condition.
+*/
+bool pGraphicalFunction::changePoint(wxPoint newCoords, int movingIndexPoint) 
+{
+       bool added= (logicFunction -> changePoint( newCoords, movingIndexPoint ));
+       if(!fromWindow)
+        setUp();
+       else
+       {
+               logicFunction->setEndPoints();
+               logicFunction->setStartPoints();
+       }
+       return added;
+}
+/**
+* Evaluates if the given point belongs to the function.
+*/
+/*
+bool pGraphicalFunction::hasPoint(wxPoint aPoint) 
+{
+       return logicFunction -> hasPoint( aPoint );     
+}
+
+/**
+* Returns the real x values of the control points of the function. It dont includes the points calculated by interpolation.
+*/
+double* pGraphicalFunction::getX_RealValues() 
+{
+       return (logicFunction -> getX_RealValues( ));   
+}
+
+/**
+* Returns the real y values of the control points of the function. It dont includes the points calculated by interpolation.
+*/
+double * pGraphicalFunction::getY_RealValues() 
+{  
+
+       return (logicFunction -> getY_RealValues());    
+}
+
+//----------------------------------
+// Asking if it has a point (x,y)
+//----------------------------------
+
+/*
+* returns true if the point is along the function
+* false otherway
+*/
+bool pGraphicalFunction:: isInFunction(int x, int y)
+{
+       wxNode* before;
+       wxNode* next;
+       pFunctionPoint* point= new pFunctionPoint(x,y);
+       bool inLine;
+       before=getBefore(point);
+
+       if(before && before->GetNext())
+       {
+               next = before->GetNext();
+               //next = (before->GetNext())->GetNext();
+               inLine= isInLine((pFunctionPoint*)before->GetData(),(pFunctionPoint*)next->GetData(),point);
+       }
+       else 
+               inLine=false;
+       return inLine;
+}
+/*
+* give us the point that is in the function and is exactly before
+* the point we are giving
+*/
+wxNode* pGraphicalFunction:: getBefore(pFunctionPoint* point)
+{
+       int minDiference=10000000;
+       wxNode* node=logicFunction->GetPointAt(0);
+       wxNode* before=NULL;
+       while(node)
+       {
+               pFunctionPoint* before1=(pFunctionPoint*)node->GetData();
+               int beforeX=before1->getRealX();
+               int pointX=point->getRealX();
+               if(beforeX<pointX)
+               {
+                 int minDiference1=pointX-beforeX;
+                 if(minDiference1<minDiference)
+                 {
+                         minDiference=minDiference1;
+                         before=node;
+                 }
+               }
+               node=node->GetNext();
+       }
+       return before;
+}
+/*
+* Returns true if the point is in the line
+*/
+bool pGraphicalFunction::isInLine(pFunctionPoint* before,pFunctionPoint* next, pFunctionPoint* point)
+{
+       int x1,x2,x,y1,y2,y;
+       
+       x1=(float)before->getRealX();
+       x2=(float)next->getRealX();
+       y1=(float)before->getRealY();
+       y2=(float)next->getRealY();
+       x=(float)point->getRealX();
+       y=(float)point->getRealY();
+
+       
+       float d1= (float)sqrt(pow(float(x1-x),2)+ pow(float(y1-y),2));
+       float d2= (float)sqrt(pow(float(x2-x),2)+ pow(float(y2-y),2));
+       float d=(float)sqrt(pow(float(x2-x1),2)+ pow(float(y2-y1),2));
+       if(d1+d2<=(d*1.1) && d1<=d && d2<=d)
+               return true;
+       return false;
+}
+/**
+* give us the value of y in the line define by the arguments
+*/
+double pGraphicalFunction::interpolateY(double m, int x1,int y1,int x)
+{
+       return m*(x-x1)+y1;
+}
+
+//----------------------------
+//NEW METHODS
+//----------------------------
+
+//----------------------------
+// Spline Methods
+//----------------------------
+
+
+       /*
+       * clear the spline vectors
+       */
+       void pGraphicalFunction:: clearSplineVectors()
+       {
+               xSpline.clear();
+               ySpline.clear();
+       }
+
+       /*
+       Initiliaze xSpline and ySpline vectors
+       */
+       void pGraphicalFunction:: initializeSplines()
+       {
+               if(xKSpline==NULL)
+                       xKSpline = vtkKochanekSpline::New();
+               if(yKSpline==NULL)
+                       yKSpline= vtkKochanekSpline::New();
+               addSplinesPoints();
+
+       }
+
+       /*
+       Add the (x,y) points of the function to the 
+       spline
+       */
+       void pGraphicalFunction::addSplinesPoints()
+       {
+               xKSpline->RemoveAllPoints();
+               yKSpline->RemoveAllPoints();
+               wxNode *node= logicFunction->GetPointAt(0);
+               pFunctionPoint* p;
+               int i=0;
+               while(node)
+               {
+                       p=(pFunctionPoint*)node->GetData();
+                       xKSpline->AddPoint(i,p->getRealX());
+                       yKSpline->AddPoint(i,p->getRealY());
+                       i++;
+                       node=node->GetNext();
+               }
+       }
+       /*
+        This Method adds the point calculated by
+        the splines to the vectors
+       */
+       void pGraphicalFunction:: initializeSplineVectors()
+       {
+               double x=0,y=0,t,delta;
+               int i,np,nps;
+               //realPoints.DeleteC  
+
+               np = logicFunction->getSizePoints();
+               nps = 100;
+               delta=( double ) ( np ) / ( double ) ( nps );
+               for( i = 0; i < nps; i++ )
+               {
+                 t = delta * (double)i;
+                 GetSplinePoint(t,x,y);
+                 xSpline.push_back(x);
+                 ySpline.push_back(y);
+               }
+       }
+       /*
+        get the spline point for t, in xKSpline and yKSpline
+       */
+       void pGraphicalFunction::GetSplinePoint(double t, double &x, double &y)
+       {
+               if (logicFunction->getSizePoints()==0)
+               {
+                       x = 0;
+                       y = 0;
+               }
+               if (logicFunction->getSizePoints()>=2)
+               {
+                       x = xKSpline->Evaluate(t);
+                       y = yKSpline->Evaluate(t);
+               }
+       }
+
+//------------------------------
+// Zoom Methods
+//------------------------------
+
+/**
+This method set the initial point and the final point of drawing
+according with the width of the square around the point clicked
+@param clickedX
+@param clickedY
+@param width: width of the square
+Note: all the parameters are pixels
+Pre: screenX, screenY, zoom are set! with the actual data.
+DEPRECATED!
+*/
+void pGraphicalFunction::zooming(int clickedX,int clickedY,int width)
+{
+       int xS,yS,x1,x2,y1,y2;
+       setScales();
+       xS=clickedX/_scaleX+_offsetX;
+       yS=clickedY/_scaleY+_offsetY;
+       //square
+       x1=(clickedX-width)/_scaleX+_offsetX;
+       x2=(clickedX+width)/_scaleX+_offsetX;
+       y1=(clickedY-width)/_scaleY+_offsetY;
+       y2=(clickedY+width)/_scaleY+_offsetY;
+
+       int numberPoints=getSizePoints();
+       pFunctionPoint* point;
+       wxNode* p;
+       bool inSquare=false,first=false;
+       
+       //if the user made a zoom
+       if(zoomIn)
+       {
+               int i;
+               for(i=0; i<numberPoints;i++)
+               {
+                       p=logicFunction->GetPointAt(i);
+                       point=(pFunctionPoint*)p->GetData();
+                       int rx=point->getRealX();
+                       int ry=point->getRealY();
+                       inSquare= rx>=x1 && rx<=x2; //&& ry>=y1 && ry<=y2;
+                       if(inSquare)
+                       {
+                               if(!first)
+                               {
+                                       initialDrawingPoint=point;
+                                       _offsetX=rx;
+                                       _offsetY=ry;
+                                       first=true;
+                               }
+                               finalDrawingPoint=point;
+                       }
+               }
+       }       
+       else
+       {
+               //We extend the range of vision in x and y,20 and 10 respectively
+               if((_offsetX-20)>=0)
+               {
+                       _offsetX=_offsetX-20;
+               }
+               else
+                       _offsetX=0;
+               if((_offsetY-10)>=0)
+               {
+                       _offsetY=_offsetY-10;
+               }
+               else
+                       _offsetY=0;
+       }
+}
+
+       /*
+       This method sets the offsets according with the point 
+       clicked on the window
+       @param offx: x-value of the point clicked
+       @param offx: y-value of the point clicked
+       Note: all the parameters are pixels
+       Pre: screenX, screenY are set! with the actual data.
+       Pos: Sets the value of minXshowed,minYshowed 
+       */
+       void pGraphicalFunction::setOffsets(int offx,int offy)
+       {
+               int xS,yS;
+
+               setScales();
+               
+               xS=(offx-offsetPixelX)/_scaleX+_offsetX + minShowedX;
+               yS=(offy-offsetPixelY)/_scaleY+_offsetY+ minShowedY;
+               
+               setOffsetX(xS);
+               setOffsetY(yS);
+                       
+               //setMinShowedX(xS);
+               //setMinShowedY(yS);
+
+               setOffsetPixelX(offx);
+               setOffsetPixelY(offy);
+               //setMinShowed();
+       }
+       /*
+       *  This method sets the minShowedX 
+       *  and the minShowedY, accordig to the offset in
+       *  x-axis and y-axis respectively
+       *  pre: _offsetX>=0,_offsetY>=0
+       *               screenX and screenY are set with the actual size of the window
+       *               scaleX and scaleY are set to the actual size of the window
+       * DEPRECATED!
+       */
+       void pGraphicalFunction::setMinShowed()
+       {
+               bool firstX=false,firstY=false;
+               
+               wxNode* node=logicFunction->GetPointAt(0);
+               pFunctionPoint* p;
+
+               float middleWX=(((float)(screenX-100))/2)/scaleX;
+               float middleWY=(((float)(screenY-50))/2)/scaleY;
+               
+               //node=node->GetNext(); 
+               while(node)
+               {
+                       p=(pFunctionPoint*)node->GetData();
+                       int px=p->getRealX();
+                       int py=p->getRealY();
+                       int x=(px-_offsetX);//+middleWX;
+                       int y=(py-_offsetY);//+middleWY;
+                       if(!firstX && x>=0)
+                       {
+                               firstX=true;
+                               setMinShowedX(px);
+                       }
+                       if(!firstY && y>=0)
+                       {
+                               firstY=true;
+                               setMinShowedY(py);
+                       }       
+                       node=node->GetNext();
+               }
+       }
+
+//-----------------------
+// Persistence
+//-----------------------
+
+/*
+ Save the points of the function
+*/
+void pGraphicalFunction::save(wxString fileName)
+{
+       
+       logicFunction->save(fileName);
+
+}
+/*
+ Load the points of a function 
+*/
+void pGraphicalFunction::load(wxString fileName)
+{
+       logicFunction->load(fileName);
+       logicFunction->setUp();
+       setMaxShowedX(logicFunction->getMaxX());
+       setMinShowedX(logicFunction->getMinX());
+       setMaxShowedY(logicFunction->getMaxY());
+       setMinShowedY(logicFunction->getMinY());
+}
+       
+//--------------------------
+//GETTERS AND SETTERS
+//---------------------------
+/**
+* actual
+*/
+void pGraphicalFunction::setActual(bool act)
+{
+  ifActual=act;
+}
+bool pGraphicalFunction:: getActual()
+{
+       return ifActual;
+}
+/**
+* SCALE WAY
+* DEFECT_SCALE 1
+* MAX_SCALE 2
+* USER_SCALE 3
+*/
+void pGraphicalFunction::setScaleWay(int typeS)
+{
+  scaleWay=typeS;
+}
+
+int pGraphicalFunction:: getScaleWay()
+{
+ return scaleWay;
+}
+
+
+/*
+* SCREEN
+*/
+void pGraphicalFunction::setScreenX(int scrX)
+{
+  this->screenX=scrX;
+}
+int pGraphicalFunction::getScreenX()
+{
+  return this->screenX;
+}
+void pGraphicalFunction::setScreenY(int scrY)
+{
+  this->screenY=scrY;
+}
+int pGraphicalFunction::getScreenY()
+{
+  return this->screenY;
+}
+
+
+/*
+* STARTS
+*/
+void pGraphicalFunction::setStartX(double aStartX) {
+       
+       logicFunction->setStartX(aStartX);
+       this->_startX =logicFunction->getStartX();
+}
+
+double pGraphicalFunction::getStartX() 
+{
+       return logicFunction->getStartX();
+}
+
+void pGraphicalFunction::setStartY(double aStartY) 
+{
+       logicFunction->setStartY(aStartY);
+       this->_startY = aStartY;
+}
+
+double pGraphicalFunction::getStartY() {
+       return logicFunction->getStartY();
+}
+/*
+* ENDs
+*/
+void pGraphicalFunction::setEndX(double aEndX) 
+{
+       logicFunction->setEndX(aEndX);
+       this->_endX = aEndX;
+}
+
+double pGraphicalFunction::getEndX() {
+       return logicFunction->getEndX();
+}
+
+void pGraphicalFunction::setEndY(double aEndY) {
+       logicFunction->setEndY(aEndY);
+       this->_endY = aEndY;
+}
+
+double pGraphicalFunction::getEndY() {
+       return logicFunction->getEndY();
+}
+/*
+ * SCALES
+ */
+void pGraphicalFunction::setScaleX(double aScaleX) 
+{
+       logicFunction->setScaleX(aScaleX);
+       this->_scaleX = aScaleX;
+}
+
+double pGraphicalFunction::getScaleX() 
+{
+       return this->_scaleX;
+}
+
+void pGraphicalFunction::setScaleY(double aScaleY) 
+{
+       logicFunction->setScaleY(aScaleY);
+       this->_scaleY = aScaleY;
+}
+
+double pGraphicalFunction::getScaleY() {
+       return this->_scaleY;
+}
+/*
+ * Mins
+ */
+void pGraphicalFunction::setMinX(double aMinX) 
+{
+       logicFunction->setMinX(aMinX);
+       this->_minX = aMinX;
+}
+
+double pGraphicalFunction::getMinX() 
+{
+       return logicFunction->getMinX();
+}
+
+void pGraphicalFunction::setMinY(double aMinY) 
+{
+       logicFunction->setMinY(aMinY);
+       this->_minY = aMinY;
+}
+
+double pGraphicalFunction::getMinY() {
+       return logicFunction->getMinY();
+}
+/*
+ * MAXS
+ */
+void pGraphicalFunction::setMaxX(double aMaxX) 
+{
+       logicFunction->setMaxX(aMaxX);
+       this->_maxX = aMaxX;
+}
+
+double pGraphicalFunction::getMaxX() 
+{
+       return logicFunction->getMaxX();
+}
+
+void pGraphicalFunction::setMaxY(double aMaxY) 
+{
+       logicFunction->setMaxY(aMaxY);
+       this->_maxY = aMaxY;
+}
+
+double pGraphicalFunction::getMaxY() {
+       return logicFunction->getMaxY();
+}
+
+/*
+ * OFFSETS
+ */
+void pGraphicalFunction::setOffsetX(double aOffsetX) 
+{
+       logicFunction->setOffsetX(aOffsetX);
+       this->_offsetX = aOffsetX;
+}
+
+double pGraphicalFunction:: getOffsetX() 
+{
+       
+       return this->_offsetX;
+}
+
+void pGraphicalFunction:: setOffsetY(double aOffsetY) 
+{
+       logicFunction->setOffsetY(aOffsetY);
+       this->_offsetY = aOffsetY;
+}
+
+double pGraphicalFunction:: getOffsetY() {
+       return this->_offsetY;
+}
+
+/*
+ * TYPE
+ */
+void pGraphicalFunction:: setType(int aType) 
+{
+       logicFunction->setType(aType);
+       this->_type = aType;
+}
+
+int pGraphicalFunction :: getType() {
+       return this->_type;
+}
+
+/*
+ * validPoint
+ */
+int pGraphicalFunction :: getValidPointRange()
+{
+       return validPointRange;
+}
+
+void pGraphicalFunction :: setValidPointRange(int theRange)
+{
+       logicFunction->setValidPointRange(theRange);
+       validPointRange = theRange;
+}
+/*
+* Returns the number of points that the function
+* has
+*/
+int pGraphicalFunction :: getSizePoints()
+{
+       return logicFunction->getSizePoints();
+}
+
+/*
+* Sets the color points of the function by teh given parameter
+* @param colorVector Is the color points vector to set
+*/
+void pGraphicalFunction :: setColorPoints(std::vector<pColorPoint *> &colorVector)
+{
+       f_colorPoints.clear();
+       int i = 0;      
+       while(i<colorVector.size())
+       {
+               f_colorPoints.push_back(colorVector[i]);                
+               i++;
+       }
+}
+
+/*
+* Gets the color points of the function in the given parameter
+* @param colorVector Is the color points list to get the points
+*/
+void pGraphicalFunction :: getColorPoints(std::vector<pColorPoint *> &colorVector)
+{
+       int i = 0;      
+       while(i<f_colorPoints.size())
+       {
+               pColorPoint * originaslPoint = f_colorPoints[i];
+               pColorPoint * copyPoint = new pColorPoint(originaslPoint->getRealX(), originaslPoint->getColor(), originaslPoint->isTemporalColor());
+               colorVector.push_back(copyPoint);               
+               i++;
+       }
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pGraphicalFunction.h
new file mode 100644 (file)
index 0000000..5e4c844
--- /dev/null
@@ -0,0 +1,1021 @@
+
+
+#ifndef __pGraphicalFunction_h__
+#define __pGraphicalFunction_h__
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+
+
+#include "pPlotterLayer.h"
+#include "pFunctionPoint.h"
+#include "pLogicalFunction.h"
+#include "pColorPoint.h"
+#include "vtkKochanekSpline.h"
+#include <vector>
+#include <iostream>
+#include <fstream>
+
+/**
+ this scale, scales each function with its maximum x, and maximum y
+ in its points
+*/
+#define DEFECT_SCALE 1
+/**
+ this scale with the maximun x  and y of all the functions defined
+*/
+#define MAX_SCALE 2
+/**
+ this scales with the scale giving by the user of the widget
+*/
+#define USER_SCALE 3
+
+/*
+ Types of Plotter
+*/
+/*
+ Lets to the user to plot any number of the
+ functions
+*/
+#define DEFAULT 1
+/*
+ Dont let draw on the plotter, but lets to edit
+ the functions that are editables in the plotter
+*/
+#define HISTOGRAM 2
+
+class pGraphicalFunction;
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+
+
+class pGraphicalFunction: public pPlotterLayer
+{
+public:
+
+       //constructor 
+       pGraphicalFunction(wxString name= wxEmptyString, int flags= mpALIGN_RIGHT);
+
+       ~pGraphicalFunction( );
+       
+       //---------------------------
+       //Virtual Mehods
+       //---------------------------
+
+       /**
+        Get the value of the traslation
+       in the x-axis
+       */
+       virtual int getXTraslation()
+       {
+               return xTraslation;
+       }
+
+
+
+
+       /**
+        Get the type of the curve
+        1=normal function
+        2=Histogram
+       */
+       virtual int getmType()
+       {
+               return mType;
+       }
+
+       /**
+        Get the type of the curve
+        1=piecewise functio
+        2= smooth
+       */
+       virtual int vGetType()
+       {
+               return _type;
+       }
+
+       /**
+        Get _offsetX and _offsetY
+       */
+
+       virtual void getOffsets(int &offsetX,int &offSetY )
+       {
+               offsetX=_offsetX;
+               offsetY=_offsetY;
+       }
+       
+       /*
+       * Get the factor zoom
+       */
+       virtual void getFactorZoom(float & fz)
+       {
+               fz=factorZoom;
+       }
+
+
+       /*
+       * Get the value of fromWindow
+       */
+       virtual void getFromWindowV(bool &fw)
+       {
+               fw=fromWindow;
+       }
+
+
+       /**
+       * if the function that is drawing is the actual
+       */
+       virtual void getIfActual(bool &actual)
+       {
+               actual=ifActual;
+       }
+
+       /**
+       * get the max of the function in x and y
+       */
+       virtual void getMax(int & maxX, int &maxY)
+       {
+               maxX=(int)getMaxX();
+           maxY=(int)getMaxY();
+       }
+       /**
+       * get the maxShowed of the function in x and y
+       */
+       virtual void getMaxShowed(int & maxX, int &maxY)
+       {
+               maxX=(int)getMaxXShowed();
+               maxY=(int)getMaxYShowed();
+       }
+       /**
+       * get the minShowed of the function in x and y
+       */
+       virtual void getMinShowed(int & minX, int &minY)
+       {
+               minX=(int)getMinXShowed();
+               minY=(int)getMinYShowed();
+       }
+
+       /**
+       * Get screens of the function
+       */
+       virtual void getScreens(int & scrX, int & scrY)
+       {
+      scrX=screenX;
+         scrY=screenY;
+       }
+
+       /**
+       * Set screens value
+       */
+       virtual void setScreens(int scrX,int scrY)
+       {
+               screenX=scrX;
+               screenY=scrY;                   
+       }
+       
+       /**
+       * Let us know the scale of the function
+       */
+       virtual void getScales(double & scaleX,double & scaleY)
+       {
+               scaleX=_scaleX;
+               scaleY=_scaleY;
+       }
+       
+       
+       /**
+       * Let us Know if the user has finished the drawing
+       * that starts before.
+       */
+
+       virtual void getDrawing(bool &draw)
+       {
+               draw = drawing;
+       }
+
+       /**
+       Let us Know if the user want to see the points of the function
+       of other color than the color of the lines
+       */
+       virtual void ifShowPoints(bool & show)
+       {
+               show = showPointsF;
+       }
+
+       /**
+       *Rewind 
+       */
+       virtual void Rewind()
+       {
+                               
+               node = logicFunction->GetPointAt(0);
+               
+       }
+
+       /** Get locus value for next N.
+       Override this function in your implementation.
+       @param x Returns X value
+       @param y Returns Y value
+       */
+       virtual bool GetNextXY(double & x, double & y) 
+       {
+               if(node)
+               {
+                       pFunctionPoint* p=(pFunctionPoint*)node->GetData();
+                       x=p->getRealX();
+                       y=p->getRealY();
+                       node=node->GetNext();
+                       return true;
+               }
+               return false;
+       }
+       /**
+       Get Point list of the funcion
+       @param return points
+       */
+       virtual void GetPoints(wxList &points)
+       {
+               logicFunction->GetPoints(points);
+               //points = realPoints;
+       }  
+
+       /**
+       Get the point where the user
+       made a click
+       */
+
+       virtual void getMousePoint(int &x,int &y)
+       {
+               x=mousePoint.x;
+               y=mousePoint.y;
+       }
+
+       /**
+       * Get the number of points of the function
+       */
+       virtual void getSize(int &size)
+       {
+               size=getSizePoints();
+       }
+
+       /**
+       * this method gets the direction of the drawing
+       */
+       virtual void getDirection(bool &dir)
+       {               
+               logicFunction -> getDirection (dir);
+       }
+
+       //---------------------------
+       // Methods
+       //---------------------------
+       /*
+       * validate if the function has that point in a sensible area returning the index where the point was found or -1 if is in not part of the function: define the sensible area is  
+       * x1-validPointRange<x<x1+validPointRange y1-validPointRange<y<y1+validPointRange
+       */
+       int validPointOnFunction(wxPoint realPoint);
+
+       //returns the index in the list of the point  
+       int getIndexOf(wxPoint realpoint);
+
+       /*
+       * This metohd returns the node of the point that is the movingPointIndex position in the list of points.
+       * @param: int movingPointIndex, Is the index value of the searched node.
+       * @return: Return a pointer to the node corresponding to the index value by parameter.
+       */
+       wxNode* GetPointAt( int movingPointIndex);
+
+       /*
+       * Includes a point between two existing points of the this function. The new point (x,y) was not defined when the function was created.
+       *@ return Returns true is the point was succcesfully added to the funcion.
+       */
+       bool AddNewPoint(int x,int y);
+
+       /**
+       * this method add a new logical point to the function, this point is one of those used to draw the function
+       */
+       bool AddPoint(int aX, int aY,bool order=true);
+
+       /**
+       * deletes the point given by the  user  from the collection of logical points of the function
+       */
+       bool DeletePoint(int aX, int aY);
+
+       /**
+       * Change de coordinates of the given point if it is possible and return the result of the invoked action. True if it was possible to do the change.
+       */
+       bool changePoint(wxPoint newCoords, int movingIndexPoint);
+
+       /**
+       * Evaluates if the given point belongs to the function.
+       */
+       //bool hasPoint(wxPoint aAPoint);
+
+       /**
+       * Returns the real x values of the control points of the function. It dont includes the points calculated by interpolation.
+       */
+       double * getX_RealValues();
+
+       /**
+       * Returns the real y values of the control points of the function. It dont includes the points calculated by interpolation.
+       */
+       double* getY_RealValues();
+       /*
+       * This method orders the list of points taking into account that the last appended node in the list (realPoint) is the only one disordered.
+       * @return Returns true if the last point included has a valid value for x and was ordered, according to the definition of function.
+       */
+       bool orderPoints();
+
+       /**
+       * This method get a pointer to the node in the real points list that is inmediately previous to the searched by parameter.
+       * @pre The seached point (realX, realY) is not the first point of the list.
+       * @param realX
+       * @param realY 
+       */
+       //wxNode * findPreviousNodeTo( int realX, int realY );
+
+       /**
+       * Deletes a point of the function given its index 
+       */
+       bool deletePointAt(int index);
+       /*
+       * Returns the number of points that the function
+       * has
+       */
+       int getSizePoints();
+       /*
+       * Set the scales of the function in x and y
+       */
+       void setScales();
+
+       //----------------------------------
+       // Asking if it has a point (x,y)
+       //----------------------------------
+
+       /*
+       * returns true if the point is along the function
+       * false otherway
+       */
+       bool isInFunction(int x, int y);
+       /*
+       * give us the point that is in the function and is exactly before
+       * the point we are giving
+       */
+       wxNode* getBefore(pFunctionPoint* point);
+       /*
+       * Returns true if the point is in the line
+       */
+       bool isInLine(pFunctionPoint* before,pFunctionPoint* next, pFunctionPoint* point);
+       /**
+       * give us the value of y in the line define by the arguments
+       */
+       double interpolateY(double m, int x1,int y1,int x);
+       /*
+        * Set Up startPoint, endPoint, maxY,maxX points        
+       */
+       void setUp();
+       //----------------------------
+       // Spline Methods
+       //----------------------------
+       /*
+       * clear the spline vectors
+       */
+       void clearSplineVectors();
+
+
+       /*
+       Initiliaze xSpline and ySpline vectors
+       */
+       void initializeSplines();
+       
+       /*
+       Add the (x,y) points of the function to the 
+       spline
+       */
+       void addSplinesPoints();
+       
+       /*
+        This Method adds the point calculated by
+        the splines to the vectors
+       */
+       void initializeSplineVectors();
+       
+       /*
+        get the spline point for t, in xKSpline and yKSpline
+       */
+       void GetSplinePoint(double t, double &x, double &y); 
+       /*
+        returns the xSpline to plotter
+       */
+       virtual std::vector<double> getXSpline()
+       {
+               return xSpline;
+       }
+       /*
+        returns the ySpline to plotter
+       */
+       virtual std::vector<double> getYSpline()
+       {
+               return ySpline;
+       }
+
+
+       /**
+       Gets the x-offset of the zoom
+       in pixels
+       */
+       virtual int getOffsetPixelsXv()
+       {
+               return offsetPixelX;
+       }       
+       
+       /**
+       Gets the offset of the zoom
+       in pixels
+       */
+       virtual int getOffsetPixelsYv()
+       {
+               return offsetPixelY;
+       }
+
+       //-----------------------
+       // Persistence
+       //-----------------------
+
+       /*
+        Save the points of the function
+       */
+       void save(wxString fileName);
+       /*
+        Load the points of a function 
+       */
+       void load(wxString fileName);
+
+    //------------------------------
+       // Getters and Setters
+       //------------------------------
+
+       //set if the function has to draw the points  
+       void SetShowPoints(bool showPoints);
+
+       //get the paramater showPointsF
+       bool getShowPoints();
+
+       void setScreenX(int scrX);
+
+       int getScreenX();
+
+       void setScreenY(int scrY);
+
+       int getScreenY();
+       
+       void setStartX(double aStartX);
+
+       double getStartX();
+
+       void setStartY(double aStartY);
+
+       double getStartY();
+
+       void setEndX(double aEndX);
+
+       double getEndX();
+
+       void setEndY(double aEndY);
+
+       double getEndY();
+
+       void setScaleX(double aScaleX);
+
+       double getScaleX();
+
+       void setScaleY(double aScaleY);
+
+       double getScaleY();
+
+       void setMinX(double aMinX);
+
+       double getMinX();
+
+       void setMinY(double aMinY);
+
+       double getMinY();
+       
+       void setMaxX(double aMaxX);
+
+       double getMaxX();
+
+       void setMaxY(double aMaxY);
+
+       double getMaxY();
+
+       void setOffsetX(double aOffsetX);
+
+       double getOffsetX();
+
+       void setOffsetY(double aOffsetY);
+
+       double getOffsetY();
+
+       void setType(int aType);
+
+       int getType();
+
+       int getValidPointRange();
+
+       void setValidPointRange(int theRange);
+
+       void SetDrawing(bool d)
+       {
+               drawing = d;
+       }
+       //get if the function is being drawed
+       bool GetDrawing()
+       {
+               return drawing;
+       }
+
+       //set the mouse point
+       void SetMousePoint(wxPoint p)
+       { 
+               mousePoint = p;
+       }
+       //get the mousePoint
+       wxPoint getMousePoint()
+       {
+               return mousePoint;
+       }
+       /**
+       * actual
+       */
+       void setActual(bool act);
+
+       bool getActual();
+
+       /**
+       * SCALE WAY
+       * DEFECT_SCALE 1
+       * MAX_SCALE 2
+       * USER_SCALE 3
+       */
+       void setScaleWay(int typeS);
+
+       int  getScaleWay();
+       
+       /**
+       * set fromWindow: it is set to true if the
+       * function was created interactively
+       */
+       void setFromWindow(bool w)
+       {
+               fromWindow=w;
+       }
+       
+       /*
+       * Get the value of fromWindow
+       */
+       bool getFromWindow()
+       {
+               return fromWindow;
+       }
+       /*
+       *  Set factor zoom
+       */
+       void setFactorZoom(float factor)
+       {
+               factorZoom=factor;
+       }
+       /*
+       * Set editable
+       */
+       void setEditable(bool edit)
+       {
+               editable=edit;
+       }
+       /**
+       * Get editable
+       */
+       bool getEditable()
+       {
+               return editable;
+       }
+
+       //----------------------------
+       // Zoom
+       //----------------------------
+
+       /* 
+        * Get boolean zoom
+        */
+       bool getZoomB()
+       {
+               return zoomIn;
+       }
+       /* *
+        * Set boolean zoom
+        * @param z: the new value
+        */
+       void setZoomIn(bool z)
+       {
+               zoomIn=z;
+       }
+       /**
+       * Set the initial drawing point
+       * @param pFunctionPoint* initialPoint
+       */
+       void setInitialDrawPoint(pFunctionPoint* initialPoint)
+       {
+               initialDrawingPoint=initialPoint;       
+       }
+       /**
+       * Get the initial drawing point
+       * @return initialDrawingPoint
+       */
+       pFunctionPoint* getInitialDrawPoint()
+       {
+               return initialDrawingPoint;     
+       }
+       /**
+       * Set the final drawing point
+       * @param pFunctionPoint* finalPoint
+       */
+       void setFinalDrawPoint(pFunctionPoint* finalPoint)
+       {
+               finalDrawingPoint=finalPoint;   
+       }
+       /**
+       * Get the final drawing point
+       * @return finalDrawingPoint
+       */
+       pFunctionPoint* getFinallDrawPoint()
+       {
+               return finalDrawingPoint;       
+       }
+       /**
+       This method set the initial point and the final point of drawing
+       according with the width of the square around the point clicked
+       @param clickedX
+       @param clickedY
+       @param width: width of the square
+       */
+       
+       void zooming(int clickedX,int clickedY,int width);
+       
+       /*
+       * This method sets the offset 
+       */
+       void setOffsets(int offx,int offy);
+       
+       /*
+       *  This method sets the minShowedX 
+       *  and the minShowedY, accordig to the offset in
+       *  x-axis and y-axis respectively
+       *  pre: _offsetX>=0,_offsetY>=0
+       */
+       void setMinShowed();
+
+       /**
+       Get the minX Showed
+       */
+       int getMinXShowed()
+       {
+               return minShowedX;
+       }
+       /**
+       Get the minY Showed
+       */
+       int getMinYShowed()
+       {
+               return minShowedY;
+       }
+       /**
+       Get the maxX Showed
+       */
+       int getMaxXShowed()
+       {
+               return maxShowedX;
+       }
+       /**
+       Get the maxY Showed
+       */
+       int getMaxYShowed()
+       {
+               return maxShowedY;
+       }
+       /**
+        Set the minShowedX
+       */
+       void setMinShowedX(int msx)
+       {
+               minShowedX=msx;
+       }
+       /**
+        Set the minShowedY
+       */
+       void setMinShowedY(int msy)
+       {
+               minShowedY=msy;
+       }
+       /**
+        Set the maxShowedX
+       */
+       void setMaxShowedX(int msx)
+       {
+               maxShowedX=msx;
+       }
+       /**
+        Set the minShowedY
+       */
+       void setMaxShowedY(int msy)
+       {
+               maxShowedY=msy;
+       }
+
+       //------------------------
+       // Offsets in pixels 
+       //------------------------
+       
+       /**
+       Gets the x-offset of the zoom
+       in pixels
+       */
+       int getOffsetPixelsX()
+       {
+               return offsetPixelX;
+       }       
+       
+       /**
+       Gets the offset of the zoom
+       in pixels
+       */
+       int getOffsetPixelsY()
+       {
+               return offsetPixelY;
+       }
+       /**
+        Set the x-offset of the zoom
+       */
+       void setOffsetPixelX(int offX)
+       {
+               offsetPixelX=offX;
+       }
+       /**
+        Set the y-offset of the zoom
+       */
+       void setOffsetPixelY(int offY)
+       {
+               offsetPixelY=offY;
+       }       
+
+       
+
+       /*
+       * Sets the color points of the function by teh given parameter
+       * @param colorVector Is the color points vector to set
+       */
+       void setColorPoints(std::vector<pColorPoint *> &colorVector);
+
+       /*
+       * Gets the color points of the function in the given parameter
+       * @param colorVector Is the color points list to get the points
+       */
+       void getColorPoints(std::vector<pColorPoint *> &colorVector);
+       /*
+        Setter the mType
+       */
+       void setmType(int mt)
+       {
+               mType=mt;
+       }
+       //-----------------------
+       //TRASLATION
+       //-----------------------
+       /**
+        Set the value of the traslation
+        in the x-axis
+        @param xT value in pixels of the traslation in x-axis
+       */
+       void setXTraslation(int xT)
+       {
+                xTraslation=xT;
+       }
+       
+
+
+private:
+
+       /**
+       * Represents the logical function asociated to this graphical function.
+       */
+       pLogicalFunction* logicFunction;
+       /**
+       * If the function has to showpoints
+       */
+       bool showPointsF;
+
+       /**
+       * Is the initial discrete point on x axis of the drawed function.
+       */
+       double _startX;
+       /**
+       * Is the initial discrete point on y axis of the drawed function.
+       */
+       double _startY;
+       /**
+       * Is the last discrete point on x axis of the drawed function.
+       */
+       double _endX;
+       /**
+       * Is the last discrete point on y axis of the drawed function.
+       */
+       double _endY;
+       /**
+       * Is the x-scale percentage according to the context device.
+       */
+       double _scaleX;
+       /**
+       * Is the y-scale percentage according to the context device.
+       */
+       double _scaleY;
+       /**
+       * Is the minimun x-real value reacheable by the function.
+       */
+       double _minX;
+       /**
+       * Is the minimun y-real value reacheable by the function.
+       */
+       double _minY;
+       /**
+       * Is the maximun x-real value reacheable by the function.
+       */
+       double _maxX;
+       /**
+       * Is the maximun y-real value reacheable by the function.
+       */
+       double _maxY;
+       /**
+       * Is the logical x-offset of the drawed function.
+       */
+       double _offsetX;
+       /**
+       * Is the logical y-offset of the drawed function.
+       */
+       double _offsetY;
+       /**
+       * Is the way of how points are going to be connected. It could be smooth, line.
+       */
+       int _type;
+       /**
+       * The list of the function points
+       */
+       wxList realPoints;
+       /*
+       * The list of the color points of the function associated to the color bar
+       */
+       std::vector<pColorPoint *> f_colorPoints;
+
+       /**
+       *  node of the realPoints where are we
+       */
+       wxNode* node;
+       /**
+       * Number that determines the radius range for the valid area the point (sensible radius). Default value 5.
+       */
+       int validPointRange;
+
+       /**
+       * Indicates if the user is drawing the function
+       */
+       bool drawing; 
+
+       /**
+       * this is for the graphical function
+       * Mouse Point
+       */
+       wxPoint mousePoint;
+
+       /**
+       * The size of the screen in X
+       */
+       int screenX;
+       
+       /**
+       * The size of the screen in Y
+       */
+       int screenY;
+       /**
+         if is the actual
+       */
+       bool ifActual;
+       
+       /**
+        the way we scale
+        DEFECT_SCALE 1
+        MAX_SCALE 2
+        USER_SCALE 3
+       */
+       
+       int scaleWay;
+
+       /**
+        if the function comes from window
+       */
+    bool fromWindow;
+       /**
+       * factorZoom
+       */
+       float factorZoom;
+       /**
+       * The function is editable
+       */
+       bool editable;
+        /**
+        * if the user did a zoom in/out
+        */
+       bool zoomIn;
+       /**
+       * initial drawing point
+       */
+       pFunctionPoint* initialDrawingPoint;
+       /**
+       * final drawing point
+       */
+       pFunctionPoint* finalDrawingPoint;
+       /**
+        Minimum point showed to the user
+        (zoom)X
+       */
+       int minShowedX;
+       /**
+        Maximum point showed to the user
+        (zoom)X
+       */
+       int maxShowedX;
+       /**
+        Minimum point showed to the user
+        (zoom)Y
+       */
+       int minShowedY;
+       /**
+        Maximum point showed to the user
+        (zoom)X
+       */
+       int maxShowedY;
+       
+       
+       /*
+        Vectors where the spline is stored
+       */
+       std::vector<double> xSpline;
+       
+       std::vector<double>     ySpline;
+       
+       /*
+         Kochanek splines
+       */
+       vtkKochanekSpline* xKSpline;
+
+       vtkKochanekSpline* yKSpline;
+       
+       
+       /**
+        offset in pixels where the user has clicked
+        before changing the scale
+       */
+       int offsetPixelX;
+       int offsetPixelY;
+       /*
+        type of the meaning of the function
+        DEFAULT=1; the  function  has no meaning
+        HISTOGRAM=2. The function represents an histogram
+       */
+
+       int mType;
+
+       /*
+        is use for lets the user move the function
+       */
+       int xTraslation;
+
+       DECLARE_CLASS (pGraphicalFunction)
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pHistogram.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pHistogram.cxx
new file mode 100644 (file)
index 0000000..7a395e0
--- /dev/null
@@ -0,0 +1,270 @@
+
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+
+#include "pHistogram.h"
+//#include "vtkJPEGReader.h"
+#include "vtkImageData.h"
+#include  "vtkImageCast.h"
+//-----------------
+// C++
+//-----------------
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+/*
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+*/
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+//IMPLEMENT_CLASS(pHistogram, wxObject)
+
+//----------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------
+pHistogram::pHistogram(std::string filePath)
+{
+       path=filePath;
+       points= vtkImageData::New();
+       size=100;
+       sizeImage=0;
+       buildHistogram();
+}
+
+pHistogram::pHistogram(vtkImageData* imageData)
+{
+       points= vtkImageData::New();
+       size=100;
+       sizeImage=0;
+       //cast
+       /*
+       vtkImageCast* cast= vtkImageCast::New();
+       cast->SetInput(imageData);
+       cast->SetOutputScalarTypeToInt();
+       cast->Update();
+       */
+       //build the histogram
+       buildHistogram(imageData);
+}
+
+pHistogram::~pHistogram()
+{
+       if(points!=NULL)points->Delete();
+}
+//----------------------------------------------------------------------------
+// Methods
+//----------------------------------------------------------------------------
+
+void pHistogram::setImagePath(std::string filePath)
+{
+       path=filePath;
+}
+
+void pHistogram::buildHistogram()
+{
+       /*
+               reader: is the reader of the image
+               histogramVector:Is the image data of the original image
+               imageData: vtkImageData of the image that we are reading
+               range :it has the (min/max) range of the levels of grey
+       */
+       points= vtkImageData::New();
+       vtkMetaImageReader *reader = vtkMetaImageReader::New();
+       vtkImageData* imageData=NULL;
+       double range[2];
+       
+       //reading
+       reader->SetFileName(path.c_str());
+       reader->Update();
+
+       
+       // getting the data 
+       imageData=reader->GetOutput();
+       imageData->GetScalarRange(range);
+       initializePoints(size);
+       setPoints(imageData);
+       
+}
+
+/*
+Calculate the histogram and save it in the attribute points
+it is used if the user had given the imageData
+Pre: Size had to be setted if the user wants
+another value that 100
+*/
+void pHistogram::buildHistogram(vtkImageData* imageData)
+{
+       initializePoints(size);
+       setPoints(imageData);   
+}
+
+/*
+  getting ready the points
+*/
+void pHistogram::initializePoints(int xDimension)
+{
+       //setting image data of the points
+       points->SetDimensions(xDimension,1,1);
+       points->SetScalarTypeToUnsignedShort();
+       points->AllocateScalars();
+       points->Update();
+}
+
+/*
+        constructing the histogram
+*/
+void pHistogram::setPoints(vtkImageData* imageData)
+{
+       /*
+               Pointers
+       */
+       unsigned short* dataImagePointer=NULL;
+       unsigned short* dataHistogramPointer=NULL;
+
+       dataImagePointer=(unsigned short*)imageData->GetScalarPointer(0,0,0);
+       dataHistogramPointer=(unsigned short*)points->GetScalarPointer(0,0,0);
+       
+       /*
+        Range of greys
+       */
+       double range[2];
+       if(imageData==NULL)
+               range[1]=1;
+       else
+               imageData->GetScalarRange(range);
+       /*
+        Setting the  minimun and maximum levels of grey
+       */
+       maxLevelOfGrey=(int)range[1];
+       minLevelOfGrey=(int)range[0];
+       /*
+        Image Size
+       */
+       int ext[6];
+       imageData->GetExtent(ext);
+       int sx,sy,sz;
+       sx=ext[1]+1;
+       sy=ext[3]+1;
+       sz=ext[5]+1;
+
+       sizeImage=sx*sy*sz;
+
+       int i;
+       /*
+         getting ready the histogram
+       */
+       for(i=0;i<size;i++)
+       {
+               dataHistogramPointer[i]=0;
+       }
+       
+       /*
+       Constructing the Histogram
+       */
+       //int k=size/(maxLevelOfGrey-minLevelOfGrey);
+       int j=0;
+       for(i=0;i<sizeImage;i++)
+       {
+               /*
+                hashing the histogram
+               */
+               //double p=((float)*dataImagePointer-minLevelOfGrey);
+               //j=p*k;
+               
+               j=getIndex(*dataImagePointer);
+               dataHistogramPointer[j]++;
+               dataImagePointer++;
+       }
+       /*
+       BORRAME
+       */
+       /*
+       k=0;
+       for(i=0;i<size;i++)
+       {
+               k=dataHistogramPointer[i];
+       }
+       */
+}
+/*
+Returns the poins of the histograms
+*/
+vtkImageData* pHistogram::getHistogram()
+{
+       return points;
+}
+
+/*
+hash por getting the index for the histogram vector of the original
+image
+@gValue: Level of grey for which wants the index in the histogrram
+*/
+int pHistogram::getIndex(int gValue)
+{
+       double p=((float)gValue-minLevelOfGrey)/(maxLevelOfGrey-minLevelOfGrey);
+       double k=p*(size-1);
+       return (int)k;
+}
+/*
+Setting the size
+*/
+void pHistogram::setSize(int nSize)
+{
+       size=nSize;
+}
+/*
+       Get Image Size
+*/
+int pHistogram::getImageSize()
+{ 
+       return sizeImage;
+}
+/*
+       Get Size of the histogram
+*/
+int pHistogram::getSize()
+{
+       return size;
+}
+/*
+       Get the maximum value of grey of the histogram
+*/
+int pHistogram::getMaximumLevelOfGrey()
+{
+       return maxLevelOfGrey;
+}
+/*
+       Get the minimum value of grey of the histogram
+*/
+int pHistogram::getMinimumLevelOfGrey()
+{
+       return minLevelOfGrey;
+}
+/*
+               get a point of the Histogram
+               given the grey value
+*/
+int pHistogram::getHistogramPoint(int gValue)
+{
+       double p=((float)gValue-minLevelOfGrey)/(maxLevelOfGrey-minLevelOfGrey);
+       double k=p*size;
+
+       unsigned short* dataHistogramPointer=NULL;
+       dataHistogramPointer=(unsigned short*)points->GetScalarPointer(0,0,0);
+
+       return dataHistogramPointer[gValue];
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pHistogram.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pHistogram.h
new file mode 100644 (file)
index 0000000..3ef66b7
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+#ifndef __pHistogram_h__
+#define __pHistogram_h__
+
+// --------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// --------------------------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+*/
+
+//--------------------------------------------------------------------------------------------
+// Includes
+//--------------------------------------------------------------------------------------------
+
+//---------------------
+// VTK
+//---------------------
+
+#include "vtkImageData.h"
+#include "vtkMetaImageReader.h"
+
+
+//-----------------
+// C++
+//-----------------
+#include <iostream>
+#include <string>
+#include <vector>
+//--------------------------------------------------------------------------------------------
+// Class definition
+//--------------------------------------------------------------------------------------------
+
+class pHistogram //:public wxObject
+{
+
+       //----------------------------------------------------------------------------------------
+       // Methods definition
+       //----------------------------------------------------------------------------------------
+       public:
+               
+               /*
+                Constructor
+               */
+               pHistogram(std::string filePath);
+               /*
+                Constructor
+               */
+               pHistogram(vtkImageData* imageData);
+               ~pHistogram();
+               /*
+                @param filePath: is the path where the image is 
+               */
+               void setImagePath(std::string filePath);
+               /*
+                Return the points of the histogram of the image
+               */
+               std::vector <int> getPoints();
+               /*
+                Calculate the histogram and save it in the attribute points
+                it is used if the user had given the file's path
+               */
+//private:     
+               void buildHistogram();
+               /*
+                Calculate the histogram and save it in the attribute points
+                it is used if the user had given the imageData
+               */
+               void buildHistogram(vtkImageData* imageData);
+               /*
+               getting ready the points
+               */
+               void initializePoints(int xDimension);
+               /*
+               constructing the histogram
+               */
+               void setPoints(vtkImageData* imageData);
+               /*
+               Returns the poins of the histograms
+               */
+               vtkImageData* getHistogram();
+               /*
+                 hash por getting the index for the histogram vector of the original
+                 image
+               */
+               int getIndex(int gValue);
+               /*
+               Setting the size
+               */
+               void setSize(int nSize);
+               /*
+                Get Image Size
+               */
+               int getImageSize();
+               /*
+                Get Size of the histogram
+               */
+               int getSize();
+               /*
+                Get the maximum value of grey of the histogram
+               */
+               int getMaximumLevelOfGrey();
+               /*
+                Get the minimum value of grey of the histogram
+               */
+               int getMinimumLevelOfGrey();
+               /*
+               get a point of the Histogram
+               given the grey value
+               */
+               int getHistogramPoint(int gValue);
+
+
+       //----------------------------------------------------------------------------------------
+       // Attributes declaration
+       //----------------------------------------------------------------------------------------
+       private: 
+               /*
+                Points of the histogram of 
+                the image
+               */
+               vtkImageData* points;
+               /*
+                The path of the image
+               */
+               std::string path;
+               /*
+                the size of histogram vector
+               */
+               int size;
+               /*
+                Maximum Level of grey
+               */
+               int maxLevelOfGrey;
+               /*
+                Minimum Level of grey
+               */
+               int minLevelOfGrey;
+               /*
+                image size
+               */
+               int sizeImage;
+
+       //DECLARE_CLASS (pHistogram)
+};
+
+//#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.cxx
new file mode 100644 (file)
index 0000000..0c3f03b
--- /dev/null
@@ -0,0 +1,806 @@
+
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pLogicalFunction.h"
+#include <iostream>
+#include <fstream>
+#include <string>
+
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(pLogicalFunction, wxObject)
+
+//----------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------
+pLogicalFunction:: pLogicalFunction( )
+{
+
+       realPoints.DeleteContents(TRUE); 
+       validPointRange = 5;
+       leftToRigthDef = true;
+       _maxX=0;
+       _maxY=0;
+       _minX=0;
+       _minY=0;
+}
+/**
+* Is the destructor!!!
+*/
+pLogicalFunction:: ~pLogicalFunction ()
+{
+       realPoints.DeleteContents(TRUE);
+}
+/*
+* validate if the function has that point in a sensible area returning the index where the point was found or -1 if is in not part of the function: define the sensible area is  
+* x1-validPointRange<x<x1+validPointRange y1-validPointRange<y<y1+validPointRange
+*/
+int pLogicalFunction::validPointOnFunction(wxPoint realPoint)
+{
+       int pointIndex = -1;
+       wxNode* node= realPoints.GetFirst();
+       while(node && pointIndex==-1)
+       {
+               pFunctionPoint* point=(pFunctionPoint*)node->GetData();
+               int x = point->getRealX();
+               int y = point->getRealY();
+               double  vx=SENSIBLE_REGION/_scaleX;
+               double vy=SENSIBLE_REGION/_scaleY;
+
+               bool isInXRange= realPoint.x <= x + vx + SENSIBLE_REGION  && realPoint.x >= x - vx-SENSIBLE_REGION;
+               bool isInYRange= realPoint.y <= y + vy + SENSIBLE_REGION && realPoint.y >= y - vy-SENSIBLE_REGION;
+               if(isInXRange && isInYRange)
+                       pointIndex = realPoints.IndexOf(point);
+
+               node = node->GetNext();
+       }
+       return pointIndex;
+}
+
+
+
+/*
+* returns the index in the list of the point 
+*/
+int pLogicalFunction::getIndexOf(wxPoint realpoint)
+{
+       wxNode* node= realPoints.GetFirst();
+       while(node)
+       {
+               pFunctionPoint* point=(pFunctionPoint*)node->GetData();
+               if(point->getRealX()==realpoint.x && point->getRealY()==realpoint.y )
+               {
+                       return realPoints.IndexOf(point);
+               }
+
+               node= node->GetNext();
+       }
+       return -1;
+
+}
+
+/*
+* This metohd returns the node of the point that is the movingPointIndex position in the list of points.
+* @param: int movingPointIndex, Is the index value of the searched node. 
+* @return: Return a pointer to the node corresponding to the index value by parameter.
+*/
+wxNode* pLogicalFunction::GetPointAt( int movingPointIndex )
+{
+       if(!realPoints.IsEmpty())
+       {       
+               wxNode* node= realPoints.Item(movingPointIndex);
+               return node;
+       }
+       else
+               return NULL;
+}
+
+/*
+* Includes a point between two existing points of this function. The new point (x,y) was not defined when the function was created.
+* @return Returns true is the point was succcesfully added to the funcion.
+*/
+bool pLogicalFunction:: AddNewPoint(int x,int y)
+{
+       pFunctionPoint * newPoint = new pFunctionPoint ( x, y);
+       bool includedPoint = realPoints.Append(newPoint)!=NULL;
+       if(includedPoint)
+       {
+           bool order=orderPoints();
+               return order; 
+       }
+       return includedPoint;
+}
+/*
+* This method orders the list of points taking into account that the last appended node in the list (realPoint) is the only one disordered. 
+* @return Returns true if the last point included has a valid value for x and was ordered, according to the definition of function.
+*/
+bool pLogicalFunction::orderPoints()
+{
+       bool lastOrdered = false;
+       bool validToContinue = false;
+
+       wxNode* lastNodeIncluded = realPoints.GetLast();
+
+       wxNode* node = realPoints.GetFirst();
+       pFunctionPoint* lastPointIncluded = (pFunctionPoint*)lastNodeIncluded -> GetData();             
+       int xToOrder = lastPointIncluded -> getRealX();
+       int actualX;
+       int nextX;
+
+       // Used for validating 'leftToRigthDef'
+       pFunctionPoint* ordFirstPoint = (pFunctionPoint*)realPoints.GetFirst()-> GetData();
+       pFunctionPoint* ordLastPoint = (pFunctionPoint*)(lastNodeIncluded->GetPrevious())-> GetData();
+
+
+       // Normal drawing
+       if (leftToRigthDef)
+       {
+               validToContinue = ordFirstPoint->getRealX() < xToOrder; 
+       }
+       else
+       {
+               //validToContinue =ordFirstPoint->getRealX() >  xToOrder;
+               validToContinue =ordLastPoint->getRealX() >  xToOrder;
+       }
+
+       if ( validToContinue)
+       {               
+
+               while( node && !lastOrdered )
+               {
+                       pFunctionPoint* prevPoint =(pFunctionPoint*)node->GetData();
+                       actualX = prevPoint ->getRealX();
+                       if( actualX == xToOrder)
+                       {
+                               realPoints.DeleteNode(lastNodeIncluded);
+                               lastOrdered = false;
+                       }
+                       else if ( actualX < xToOrder )
+                       {
+                               //firstNode
+                               wxNode* nextNode = node->GetNext();
+                               pFunctionPoint* nextPoint;
+                               if( nextNode != lastNodeIncluded )                      
+                               {
+                                       nextPoint = (pFunctionPoint*)nextNode -> GetData();     
+                                       nextX = nextPoint->getRealX();
+                                       int nextIndex = realPoints.IndexOf(nextPoint);
+                                       if( nextX > xToOrder )
+                                       {
+                                               //we need to change the direction in memory of our node
+                                               pFunctionPoint* pointToInsert=new pFunctionPoint(lastPointIncluded->getRealX(),lastPointIncluded->getRealY());
+                                               // The last inserted point is ordered like: prevPoint - lastPointIncluded - nextPoint
+                                               lastOrdered = (realPoints.Insert(nextIndex, pointToInsert))!= NULL;
+                                               bool lastNodeDeleted=realPoints.DeleteNode(lastNodeIncluded);
+                                               return lastOrdered && lastNodeDeleted;
+
+                                       }
+
+                               }
+                               else 
+                               {
+                                       lastOrdered = true;
+                               }
+                       }
+                       else 
+                       {
+                               //firstNode
+                               wxNode* prevNode = node->GetPrevious();
+                               int insertIndex=realPoints.IndexOf(prevPoint);
+                               pFunctionPoint* prPoint;
+                               if(prevNode)
+                               {
+                                       prPoint = (pFunctionPoint*)prevNode -> GetData();       
+                                       int beforeX =prPoint->getRealX();
+                                       if( beforeX < xToOrder)
+                                       {
+                                               //we need to change the direction in memory of our node
+                                               pFunctionPoint* pointToInsert=new pFunctionPoint(lastPointIncluded->getRealX(),lastPointIncluded->getRealY());
+                                               // The last inserted point is ordered like: prevPoint - lastPointIncluded - nextPoint
+                                               lastOrdered = (realPoints.Insert(insertIndex, pointToInsert))!= NULL;
+                                               bool lastNodeDeleted=realPoints.DeleteNode(lastNodeIncluded);
+                                               return lastOrdered && lastNodeDeleted;
+                                       }
+                               }
+                               //is just the second point
+                               else
+                               {
+                                       //we need to change the direction in memory of our node
+                                       pFunctionPoint* pointToInsert=new pFunctionPoint(lastPointIncluded->getRealX(),lastPointIncluded->getRealY());
+                                       // The last inserted point is ordered like: prevPoint - lastPointIncluded - nextPoint
+                                       lastOrdered = (realPoints.Insert(insertIndex, pointToInsert))!= NULL;
+                                       bool lastNodeDeleted=realPoints.DeleteNode(lastNodeIncluded);
+                                       return lastOrdered && lastNodeDeleted;
+                               }
+                       }
+
+                       node = node->GetNext();
+               }
+
+       }
+       else
+       {
+               bool lastNodeDeleted = realPoints.DeleteNode(lastNodeIncluded);
+               lastOrdered = lastOrdered && lastNodeDeleted;
+       }
+       return lastOrdered;
+}
+/*
+* This tries to Add a point to the function if possible it returns true.
+* @pre: The list of existing points is ordered.
+* @param: int aX, The x value of the point.
+* @param: int aY, The y value of the point.
+* @param: return Returns TRUE if the point was succesfuly included in the realPoints list.
+*/
+bool pLogicalFunction::AddPoint(int aX, int aY,bool order) 
+{      
+       pFunctionPoint * newPoint = new pFunctionPoint (aX, aY);
+       wxNode* lastNode = realPoints.GetLast();
+       bool addedPoint = false;
+       if (lastNode)
+       {
+               pFunctionPoint* lastPoint = (pFunctionPoint*)lastNode->GetData();               
+               if( lastPoint->getRealX() != aX )
+               {
+                       addedPoint = realPoints.Append(newPoint)!=NULL;
+                       //In case that the definition of points is being done backwards.
+                       if( (aX < (lastPoint->getRealX()) ) && addedPoint )
+                       {
+                               if( realPoints.GetCount() == 2 )
+                               {
+                                       leftToRigthDef = false;                                 
+                               }
+                       if(order)
+                               addedPoint = orderPoints();     
+                       
+                       }
+                       else
+                       {
+                               if( realPoints.GetCount() == 2 )
+                               {
+                                       leftToRigthDef = true;                                  
+                               }                       
+                       }
+               }                
+       }
+       else
+       {
+               addedPoint = realPoints.Append(newPoint)!=NULL;         
+       }
+       
+       return addedPoint;
+}
+
+/*
+ * Set Up startPoint, endPoint, maxY,maxX points       
+*/
+void pLogicalFunction::setUp()
+{
+       //sets the start point of the function
+       setStartPoints();
+       //set the Last point of the function
+       setEndPoints();
+       //set the min value in x and y between all the points of the function
+       setMinPoints();
+       //set the max value in x and y between all the points of the function
+       setMaxPoints();
+}
+
+
+/*
+ * sets the start point of the function
+ */
+void pLogicalFunction:: setStartPoints()
+{
+  wxNode* first=realPoints.GetFirst();
+  if(first)
+       {
+         pFunctionPoint* startPoint=(pFunctionPoint*)first->GetData();
+         setStartX(startPoint->getRealX());
+         setStartY(startPoint->getRealY());
+       }
+  else
+  {
+         setStartX(-1);
+         setStartY(-1);
+  }
+}
+/*
+ * sets the end point of the function
+ */
+void pLogicalFunction:: setEndPoints()
+{
+  wxNode* last=realPoints.GetLast();
+  if(last)
+  {
+         pFunctionPoint* lastPoint=(pFunctionPoint*)last->GetData();
+         setEndX(lastPoint->getRealX());
+         setEndY(lastPoint->getRealY());
+  }
+  else
+  {
+         setEndX(-1);
+         setEndY(-1);
+  
+  }
+}
+
+/*
+ * set the min value in x and y between all the points of the function
+ */
+void pLogicalFunction::setMinPoints()
+{
+    int minX,minY;  
+       wxNode* node=realPoints.GetFirst();
+       if(node)
+       {
+               pFunctionPoint* point=(pFunctionPoint*)node->GetData();
+               minX=point->getRealX();
+               minY=point->getRealY();
+               wxNode* nextNode=node->GetNext();
+               while(nextNode)
+                       {
+                               point=(pFunctionPoint*)nextNode->GetData();
+                               int x=point->getRealX();
+                               int y=point->getRealY();
+                               if(x<minX)
+                                       minX=x;
+                               if(y<minY)
+                                       minY=y;
+                               nextNode=nextNode->GetNext();
+                       }
+               setMinX(minX);
+               setMinY(minY);
+       }
+       else
+       {
+               setMinX(0);
+               setMinY(0);
+       }
+               
+}
+/*
+ * set the max value in x and y between all the points of the function
+ */
+void pLogicalFunction::setMaxPoints()
+{
+    int maxX,maxY;  
+       wxNode* node=realPoints.GetFirst();
+       if(node)
+       {
+               pFunctionPoint* point=(pFunctionPoint*)node->GetData();
+               maxX=point->getRealX();
+               maxY=point->getRealY();
+               wxNode* nextNode=node->GetNext();
+               while(nextNode)
+                       {
+                               point=(pFunctionPoint*)nextNode->GetData();
+                               int x=point->getRealX();
+                               int y=point->getRealY();
+                               if(x>maxX)
+                                       maxX=x;
+                               if(y>maxY)
+                                       maxY=y;
+                               nextNode=nextNode->GetNext();
+                       }
+               setMaxX(maxX);
+               setMaxY(maxY);
+       }
+       else
+       {
+               setMaxX(0);
+               setMaxY(0);
+       }
+}
+
+/**
+* deletes the point given by the  user  from the collection of logical points of the function
+* IS NOT USE
+*/
+
+bool pLogicalFunction::DeletePoint(int aX, int aY) 
+{
+       wxNode* node= realPoints.GetFirst();
+       while(node)
+       {
+               pFunctionPoint* point=(pFunctionPoint*)node->GetData();
+               if(point->getRealX()==aX && point->getRealY()==aY)
+               {
+                       realPoints.Erase(node);
+                       return true;
+               }
+               node= node->GetNext();
+       }
+
+       return false;
+}
+
+/**
+* deletes a point of the functio given its index
+*/
+bool pLogicalFunction::deletePointAt(int index)
+{
+       if(index!=-1)  
+       {       
+               wxNode* node=GetPointAt(index);
+               
+               if(node)//point!=NULL)
+               {
+                       pFunctionPoint* point=(pFunctionPoint*)node->GetData();
+                       bool deleted=realPoints.DeleteNode(node);
+                       //delete point;
+                       //delete node;
+                       /*
+                       if(index==0)
+                               realPoints=realPoints.;
+                       */
+                       return deleted;
+               }
+       }
+       return false;
+}
+
+/**
+* Change de coordinates of the given index point to the newCoords, if it is possible and return the result of the invoked action. 
+* @retun Return TRUE if it was possible to do the change. A valid change is when the new x value of the point is still between the previous and next point, when condition.
+*/
+bool pLogicalFunction::changePoint(wxPoint newCoords, int movingIndexPoint) 
+{
+       wxNode* changingNode = GetPointAt(movingIndexPoint);
+       bool validChange = false; 
+       int newX = newCoords.x;
+       int newY = newCoords.y;
+       pFunctionPoint* changingPoint = (pFunctionPoint*)changingNode -> GetData();
+       bool hasPrevious = movingIndexPoint>0;
+       bool hasNext = movingIndexPoint < realPoints.size()-1;
+       
+       wxNode* prevNode = hasPrevious ? changingNode ->GetPrevious() : NULL;
+       wxNode* nextNode = hasNext ? changingNode -> GetNext() : NULL;
+       
+       if( hasPrevious )
+       {
+               pFunctionPoint* prevPoint = (pFunctionPoint*)prevNode -> GetData();
+               if ( hasNext )
+               {
+                       pFunctionPoint* nextPoint = (pFunctionPoint*) nextNode -> GetData();
+                       validChange = ((prevPoint->getRealX()) < newX) && ((nextPoint->getRealX()) > newX);
+                       if ( (prevPoint->getRealX()) > newX )
+                       {
+                               newX = prevPoint->getRealX()+1;
+                               validChange = true;
+                       }
+                       else if ( (nextPoint->getRealX()) < newX )
+                       {
+                               newX = nextPoint->getRealX()-1;
+                               validChange = true;
+                       }
+               }
+               else
+               {
+                       // Is the last point of the function.
+                       if ( (prevPoint->getRealX()) < newX )
+                       {
+                               validChange = true;
+                       }
+                       else
+                       {
+                               newX = prevPoint->getRealX();
+                               validChange = true;
+                       }
+               }               
+       }       
+       else
+       {
+               if ( hasNext )
+               {
+                       // Is the first point of the function.
+                       pFunctionPoint* nextPoint = (pFunctionPoint*) nextNode -> GetData();
+                       if ((nextPoint->getRealX()) > newX )
+                       {
+                               validChange = true;
+                       }
+                       else
+                       {
+                               newX = nextPoint->getRealX();
+                               validChange = true;
+                       }
+               }               
+       }
+       if( validChange )
+       {
+               changingPoint -> setRealX( newX );
+               changingPoint -> setRealY( newY );
+       }
+       return validChange;
+}
+/**
+* Evaluates if the given point belongs to the function.
+*/
+/*
+bool pLogicalFunction::hasPoint(wxPoint aPoint) 
+{
+       bool existPoint = false;
+       wxNode *nextNode = realPoints.GetFirst();                 
+
+       while (nextNode && !existPoint)
+       {
+               pFunctionPoint* nextPoint = (pFunctionPoint*)nextNode->GetData();
+               if( nextPoint -> getRealX() == aPoint.x && nextPoint-> getRealY() == aPoint.y)          
+               {
+                       existPoint = true;
+               }
+               nextNode = nextNode->GetNext();
+       }
+       return existPoint;
+}
+*/
+/**
+* Returns the real x values of the control points of the function. It dont includes the points calculated by interpolation.
+*/
+double* pLogicalFunction::getX_RealValues() 
+{
+       wxNode *nextNode = realPoints.GetFirst();
+       int size = realPoints.GetCount();
+       double * x_Values;
+       int i=0;
+
+       x_Values= new double[size];
+
+       while (nextNode)
+       {
+               pFunctionPoint* nextPoint = (pFunctionPoint*)nextNode->GetData();
+               x_Values[i] = nextPoint-> getRealX();
+               nextNode = nextNode->GetNext();
+               i++;
+       }
+       return x_Values;
+}
+
+/**
+* Returns the real y values of the control points of the function. It dont includes the points calculated by interpolation.
+*/
+double * pLogicalFunction::getY_RealValues() 
+{  
+       wxNode *nextNode = realPoints.GetFirst();
+       int i =0;
+       int size = realPoints.GetCount();
+       double * y_Values;
+
+       y_Values= new double[size];
+
+       while (nextNode)
+       {
+               pFunctionPoint*  nextPoint = (pFunctionPoint*)nextNode->GetData();
+               y_Values[i] = nextPoint-> getRealY();
+               nextNode = nextNode->GetNext();
+               i++;
+       }
+       return y_Values;
+}
+
+//-----------------------
+// Persistence
+//-----------------------
+
+/*
+ Save the points of the function
+ format: 
+       #number of points
+       x<<"\t"<<y<<endl 
+       for all (x,y) in the function
+*/
+void pLogicalFunction::save(wxString fileName)
+{
+
+       std::ofstream file;
+       file.open( (const char*)(fileName.mb_str()) );
+       if(file.is_open())
+       {
+               file << getSizePoints()<< std::endl;
+               wxNode* node= realPoints.GetFirst();
+               pFunctionPoint* p;
+               while(node)
+               {
+                       p=(pFunctionPoint*)node->GetData();
+                       file <<p->getRealX()<<"\t"<<p->getRealY()<<std::endl;
+                       node=node->GetNext();
+               }
+       }
+       file.close();
+}
+/*
+ Load the points of a function 
+*/
+void pLogicalFunction::load(wxString fileName)
+{
+       std::string line;
+       std::ifstream file;
+       file.open( (const char*)(fileName.mb_str()) );
+       
+       if(file.is_open())
+       {
+               std::getline(file,line);
+               int nPoints=atoi(line.c_str());
+               int i=0;
+               while(!file.eof() && i<nPoints)
+               {
+                       std::getline(file,line);
+                       int pos=line.find("\t");
+                       int size=line.size();
+                       std::string x=line.substr(0,pos);
+                       std::string y=line.substr(pos+1,size);
+                       int x0=atoi(x.c_str());
+                       int y0=atoi(y.c_str());
+                       AddPoint(x0,y0);
+                       i++;
+
+               }
+       }
+}
+
+
+//---------------------
+//Getters and Setters
+//---------------------
+
+/*
+ * STARTS
+ */
+void pLogicalFunction::setStartX(double aStartX) {
+       this->_startX = aStartX;
+}
+
+double pLogicalFunction::getStartX() {
+       return this->_startX;
+}
+
+void pLogicalFunction::setStartY(double aStartY) {
+       this->_startY = aStartY;
+}
+
+double pLogicalFunction::getStartY() {
+       return this->_startY;
+}
+
+/*
+ * ENDS
+ */
+void pLogicalFunction::setEndX(double aEndX) {
+       this->_endX = aEndX;
+}
+
+double pLogicalFunction::getEndX() {
+       return this->_endX;
+}
+
+void pLogicalFunction::setEndY(double aEndY) {
+       this->_endY = aEndY;
+}
+
+double pLogicalFunction::getEndY() {
+       return this->_endY;
+}
+/*
+ * SCALES
+ */
+void pLogicalFunction::setScaleX(double aScaleX) {
+       this->_scaleX = aScaleX;
+}
+
+double pLogicalFunction::getScaleX() {
+       return this->_scaleX;
+}
+
+void pLogicalFunction::setScaleY(double aScaleY) {
+       this->_scaleY = aScaleY;
+}
+
+double pLogicalFunction::getScaleY() {
+       return this->_scaleY;
+}
+/*
+ * MINS
+ */
+void pLogicalFunction::setMinX(double aMinX) {
+       this->_minX = aMinX;
+}
+
+double pLogicalFunction::getMinX() {
+       return this->_minX;
+}
+
+void pLogicalFunction::setMinY(double aMinY) {
+       this->_minY = aMinY;
+}
+
+double pLogicalFunction::getMinY() {
+       return this->_minY;
+}
+/*
+ * MAXS
+ */
+void pLogicalFunction::setMaxX(double aMaxX) {
+       this->_maxX = aMaxX;
+}
+
+double pLogicalFunction::getMaxX() {
+       return this->_maxX;
+}
+
+void pLogicalFunction::setMaxY(double aMaxY) {
+       this->_maxY = aMaxY;
+}
+
+double pLogicalFunction::getMaxY() {
+       return this->_maxY;
+}
+
+/*
+ * OFFSETS
+ */
+void pLogicalFunction::setOffsetX(double aOffsetX) {
+       this->_offsetX = aOffsetX;
+}
+
+double pLogicalFunction:: getOffsetX() {
+       return this->_offsetX;
+}
+
+void pLogicalFunction:: setOffsetY(double aOffsetY) {
+       this->_offsetY = aOffsetY;
+}
+
+double pLogicalFunction:: getOffsetY() {
+       return this->_offsetY;
+}
+
+/*
+ * TYPE
+ */
+void pLogicalFunction:: setType(int aType) {
+       this->_type = aType;
+}
+
+int pLogicalFunction :: getType() {
+       return this->_type;
+}
+
+/*
+ * ValidPoint
+ */
+int pLogicalFunction :: getValidPointRange()
+{
+       return validPointRange;
+}
+
+void pLogicalFunction :: setValidPointRange(int theRange)
+{
+       validPointRange = theRange;
+}
+/*
+* Returns the number of points that the function
+* has
+*/
+int pLogicalFunction::getSizePoints()
+{
+       return realPoints.GetCount();
+}
+void pLogicalFunction::getDirection(bool &dir)
+{
+       dir = leftToRigthDef;
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pLogicalFunction.h
new file mode 100644 (file)
index 0000000..b36ccbe
--- /dev/null
@@ -0,0 +1,368 @@
+
+#ifndef __pLogicalFunction_h__
+#define __pLogicalFunction_h__
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+
+#include "pFunctionPoint.h"
+#include <iostream>
+#include <fstream>
+#include <string>
+
+
+
+class pLogicalFunction;
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+#define MAX_POINTS 50
+
+//if your are going to change se sensible region  you have to change MOVE in pPlotterLayer
+#define SENSIBLE_REGION 5
+
+
+class pLogicalFunction: public wxObject
+{
+public:
+
+       //----------------------------------------------------------------------------
+       // Constructors
+       //----------------------------------------------------------------------------
+       pLogicalFunction( );
+
+       ~pLogicalFunction( );
+       
+       /**
+       *Rewind 
+       */
+       /*virtual void Rewind()
+       {
+               node = realPoints.GetFirst();
+       }
+       */
+       
+       /** Get locus value for next N.
+       Override this function in your implementation.
+       @param x Returns X value
+       @param y Returns Y value
+       */
+       /*virtual bool GetNextXY(double & x, double & y) 
+       {
+               if(node)
+               {
+                       pFunctionPoint* p=(pFunctionPoint*)node->GetData();
+                       x=p->getRealX();
+                       y=p->getRealY();
+                       node=node->GetNext();
+                       return true;
+               }
+               return false;
+       }
+       /**
+       Get Point list of the funcion
+       @param return points
+       */
+       /*virtual*/
+       void GetPoints(wxList &points)
+       {
+               points = realPoints;
+       }  
+       /*
+       * validate if the function has that point in a sensible area returning the index where the point was found or -1 if is in not part of the function: define the sensible area is  
+       * x1-validPointRange<x<x1+validPointRange y1-validPointRange<y<y1+validPointRange
+       */
+       int validPointOnFunction(wxPoint realPoint);
+
+       //returns the index in the list of the point  
+       int getIndexOf(wxPoint realpoint);
+
+       /*
+       * This metohd returns the node of the point that is the movingPointIndex position in the list of points.
+       * @param: int movingPointIndex, Is the index value of the searched node.
+       * @return: Return a pointer to the node corresponding to the index value by parameter.
+       */
+       wxNode* GetPointAt( int movingPointIndex);
+
+       /*
+       * Includes a point between two existing points of the this function. The new point (x,y) was not defined when the function was created.
+       *@ return Returns true is the point was succcesfully added to the funcion.
+       */
+       bool AddNewPoint(int x,int y);
+
+       /**
+       * this method add a new logical point to the function, this point is one of those used to draw the function
+       */
+       bool AddPoint(int aX, int aY,bool order=true);
+
+       /**
+       * deletes the point given by the  user  from the collection of logical points of the function
+       */
+       bool DeletePoint(int aX, int aY);
+
+       /**
+       * Change de coordinates of the given point if it is possible and return the result of the invoked action. True if it was possible to do the change.
+       */
+       bool changePoint(wxPoint newCoords, int movingIndexPoint);
+
+       /**
+       * Evaluates if the given point belongs to the function.
+       * IS NO USED
+       */
+       //bool hasPoint(wxPoint aAPoint);
+
+       /**
+       * Returns the real x values of the control points of the function. It dont includes the points calculated by interpolation.
+       */
+       double * getX_RealValues();
+
+       /**
+       * Returns the real y values of the control points of the function. It dont includes the points calculated by interpolation.
+       */
+       double* getY_RealValues();
+       /*
+       * This method orders the list of points taking into account that the last appended node in the list (realPoint) is the only one disordered.
+       * @return Returns true if the last point included has a valid value for x and was ordered, according to the definition of function.
+       */
+       bool orderPoints();
+
+       /**
+       * This method get a pointer to the node in the real points list that is inmediately previous to the searched by parameter.
+       * @pre The seached point (realX, realY) is not the first point of the list.
+       * @param realX
+       * @param realY
+       * IS NOT USED
+       */
+       //wxNode * findPreviousNodeTo( int realX, int realY );
+
+       /*
+        * sets the start point of the function
+        */
+       void  setStartPoints();
+
+       /*
+        * sets the end point of the function
+        */
+       void setEndPoints();
+
+       /*
+        * set the max value in x and y between all the points of the function
+        */
+       void setMaxPoints();
+
+
+       /*
+        * set the min value in x and y between all the points of the function
+        */
+       void setMinPoints();
+       /*
+        * Set Up startPoint, endPoint, maxY,maxX points        
+       */
+       void setUp();
+
+
+       //set if the function has to draw the points  
+       //void SetShowPoints(bool showPoints);
+
+       //get the paramater showPointsF
+       //bool getShowPoints();
+
+       //-----------------------
+       // Persistence
+       //-----------------------
+
+       /*
+        Save the points of the function
+       */
+       void save(wxString fileName);
+       /*
+        Load the points of a function 
+       */
+       void load(wxString fileName);
+
+       //----------------------------
+       //Getters and Setters
+       //----------------------------
+
+       void setStartX(double aStartX);
+
+       double getStartX();
+
+       void setStartY(double aStartY);
+
+       double getStartY();
+
+       void setEndX(double aEndX);
+
+       double getEndX();
+
+       void setEndY(double aEndY);
+
+       double getEndY();
+
+       void setScaleX(double aScaleX);
+
+       double getScaleX();
+
+       void setScaleY(double aScaleY);
+
+       double getScaleY();
+
+       void setMinX(double aMinX);
+
+       double getMinX();
+
+       void setMinY(double aMinY);
+
+       double getMinY();
+
+       void setMaxX(double aMaxX);
+
+       double getMaxX();
+
+       void setMaxY(double aMaxY);
+
+       double getMaxY();
+
+       void setOffsetX(double aOffsetX);
+
+       double getOffsetX();
+
+       void setOffsetY(double aOffsetY);
+
+       double getOffsetY();
+
+       void setType(int aType);
+
+       int getType();
+
+       int getValidPointRange();
+
+       void setValidPointRange(int theRange);
+
+       /**
+       * Deletes a point of the function given its index 
+       */
+       bool deletePointAt(int index);
+       /*
+       * Returns the number of points that the function
+       * has
+       */
+       int getSizePoints();
+
+       void getDirection(bool &dir);
+
+
+
+private:
+
+       /**
+       * Is the initial discrete point on x axis of the drawed function.
+       */
+       double _startX;
+       /**
+       * Is the initial discrete point on y axis of the drawed function.
+       */
+       double _startY;
+       /**
+       * Is the last discrete point on x axis of the drawed function.
+       */
+       double _endX;
+       /**
+       * Is the last discrete point on y axis of the drawed function.
+       */
+       double _endY;
+       /**
+       * Is the x-scale percentage according to the context device.
+       */
+       double _scaleX;
+       /**
+       * Is the y-scale percentage according to the context device.
+       */
+       double _scaleY;
+       /**
+       * Is the minimun x-real value reacheable by the function.
+       */
+       double _minX;
+       /**
+       * Is the minimun y-real value reacheable by the function.
+       */
+       double _minY;
+       /**
+       * Is the maximun y-real value reacheable by the function.
+       */
+       double _maxX;
+
+       /**
+       * Is the maximun y-real value reacheable by the function.
+       */
+       double _maxY;
+
+       /**
+       * Is the logical x-offset of the drawed function.
+       */
+       double _offsetX;
+       /**
+       * Is the logical y-offset of the drawed function.
+       */
+       double _offsetY;
+       /**
+       * Is the way of how points are going to be connected. It could be smooth, line.
+       */
+       int _type;
+       /**
+       * The list of the function points
+       */
+       wxList realPoints;
+
+       /**
+       *  x-values
+       */
+       double x_Values[MAX_POINTS];
+       /**
+       *  y-values
+       */
+       double y_Values[MAX_POINTS];
+       /**
+       *  node of the realPoints where are we
+       */
+       //wxNode* node;
+       
+       /**
+       * Number that determines the radius range for the valid area the point (sensible radius). Default value 5.
+       */
+       int validPointRange;
+
+       /**
+       * Indicates the way the function is being drawed when defining it. So that it is true if the direction is from left-to-right, and false if it is from right-to-left.
+       * It is initialized when the second point is included in the funcion.
+       */
+       bool leftToRigthDef;
+
+       /**
+       * Indicates if the user is drawing the function
+       */
+       //bool drawing;
+
+
+       DECLARE_CLASS (pLogicalFunction)
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotter.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotter.cxx
new file mode 100644 (file)
index 0000000..769aa45
--- /dev/null
@@ -0,0 +1,721 @@
+//---------------------------------------------------------------------------------------------
+// Class definition include
+//---------------------------------------------------------------------------------------------
+#include "pPlotter.h"
+
+// --------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// --------------------------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//---------------------------------------------------------------------------------------------
+// Class implementation
+//---------------------------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(pPlotter, wxPanel)
+
+//------------------------------------------------------------------------------------------------------------
+// Generated events declaration and definition
+//------------------------------------------------------------------------------------------------------------
+BEGIN_DECLARE_EVENT_TYPES()
+       DECLARE_EVENT_TYPE( wxEVT_NW_TEXT_MESAGGE, -1 ) 
+END_DECLARE_EVENT_TYPES()
+
+DEFINE_EVENT_TYPE( wxEVT_NW_TEXT_MESAGGE )
+
+// ----------------------------------------------------------------------------------------------------
+// Handdled events from pColorBar
+// ----------------------------------------------------------------------------------------------------
+DECLARE_EVENT_TYPE(wxEVT_ADDED_POINT, -1)
+DECLARE_EVENT_TYPE(wxEVT_REMOVED_POINT, -1)
+DECLARE_EVENT_TYPE(wxEVT_MOVED_POINT, -1)
+DECLARE_EVENT_TYPE(wxEVT_CHANGED_POINT, -1)
+DECLARE_EVENT_TYPE(wxEVT_ON_COLOR_BAR, -1)
+
+// ----------------------------------------------------------------------------------------------------
+// Handdled events from plotter
+// ----------------------------------------------------------------------------------------------------
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_CHANGED_FUNCTION, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_MOVE, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_ADD, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_DELETE, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_GUIDELINES, -1)
+
+// ----------------------------------------------------------------------------------------------------
+// Handdled events from max-min barrange
+// ----------------------------------------------------------------------------------------------------
+DECLARE_EVENT_TYPE(wxEVT_TSBAR, -1)
+DECLARE_EVENT_TYPE(wxEVT_TSBAR_ACTUAL, -1)
+DECLARE_EVENT_TYPE(wxEVT_TSBAR_START, -1)
+DECLARE_EVENT_TYPE(wxEVT_TSBAR_END, -1)
+DECLARE_EVENT_TYPE(wxEVT_TSBAR_MOVED, -1)
+DECLARE_EVENT_TYPE(wxEVT_SELECTION_END, -1)
+
+
+// ----------------------------------------------------------------------------------------------------
+// EVENT TABLE (->Connect: analogous)
+//-----------------------------------------------------------------------------------------------------
+BEGIN_EVENT_TABLE(pPlotter, wxPanel)
+       //OnSize
+       //EVT_SIZE  (pPlotter::OnSize)
+       
+       // Connectting the handled envents for the plotter to the corresponding methods
+       EVT_COMMAND  (-1,wxEVT_PPLOTTER_CHANGED_FUNCTION, pPlotter::onChangeFunction)
+       EVT_COMMAND  (-1,wxEVT_PPLOTTER_POINT_MOVE, pPlotter::onMovePoint_Plotter)
+       EVT_COMMAND  (-1,wxEVT_PPLOTTER_POINT_ADD, pPlotter::onAddedPoint_Plotter)
+       EVT_COMMAND  (-1,wxEVT_PPLOTTER_POINT_DELETE, pPlotter::onRemovedPoint_Plotter)
+       EVT_COMMAND  (-1,wxEVT_PPLOTTER_GUIDELINES, pPlotter::onGuideLines)
+
+       // Connectting the handled envents for the color bar  to the corresponding methods
+    EVT_COMMAND  (-1,wxEVT_ADDED_POINT, pPlotter :: onAdded_ColorPoint )
+       EVT_COMMAND  (-1,wxEVT_REMOVED_POINT, pPlotter :: onRemoved_ColorPoint )
+       EVT_COMMAND  (-1,wxEVT_MOVED_POINT, pPlotter :: onMoved_ColorPoint )
+       EVT_COMMAND  (-1,wxEVT_CHANGED_POINT, pPlotter :: onChanged_ColorPoint )
+       EVT_COMMAND  (-1,wxEVT_ON_COLOR_BAR, pPlotter :: onColorBar )
+
+       // Connectting the handled envents from the max-min barrange  to the corresponding methods
+       EVT_COMMAND  (-1,wxEVT_TSBAR, pPlotter::onBarrange)
+       EVT_COMMAND  (-1,wxEVT_SELECTION_END, pPlotter::onSelectionEnd)
+       EVT_COMMAND  (-1,wxEVT_TSBAR_MOVED, pPlotter::onMovedBar)
+       EVT_COMMAND  (-1,wxEVT_TSBAR_ACTUAL, pPlotter:: onActualChange_Bar)
+       EVT_COMMAND  (-1,wxEVT_TSBAR_START, pPlotter::onStartChange_Bar)
+       EVT_COMMAND  (-1,wxEVT_TSBAR_END, pPlotter::onEndChange_Bar)
+
+END_EVENT_TABLE()
+
+
+//---------------------------------------------------------------------------------------------
+// Constructors & Destructors
+//---------------------------------------------------------------------------------------------
+       /*
+       * Creates an integrated plotter instance 
+       * @param *parent Container window
+       */
+       pPlotter :: pPlotter  (wxWindow *parent,int nWidth, int nHeight)
+       :wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL)
+       {
+               SetBackgroundColour(wxColour(255,255,255));
+               m_plot = new pPlotterWindow( this, -1, wxPoint(0,0), wxSize(nWidth,nHeight), wxSUNKEN_BORDER );
+               
+               // Adding the axis layers to the plotter
+               m_plot->AddLayer( new pPlotterScaleX() );
+               m_plot->AddLayer( new pPlotterScaleY() );  
+
+               // Creating the log window
+       /*
+          
+               m_log = new wxTextCtrl( panel, -1, wxT("This is the log window.\n"), wxPoint(0,0), wxSize(400,100), wxTE_MULTILINE );
+               // Sharing the log window of the application with the plotter widget    
+               m_plot->setmLog(m_log);
+               
+               */
+
+
+               // Creating a function for the plotter with given points x-vector and y-vector
+
+               /*
+               double vectX_F1 [] = { 0, 20, 50, 80, 100, 115, 120, 210, 220,250 };
+
+               
+//             double vectX_F1 [] = { 0, 20, 50, 80, 100, 115, 120, 210, 220,250 };
+
+               double vectY_F1 [] = { 0, 40, 70, 100, 200, 100, 40, 170, 0, 50  };
+               pGraphicalFunction * f1 = m_plot ->getFunctionForVectors( vectX_F1, 10, vectY_F1, 10 ); 
+               // Including and drawing the created function in the plotter
+               if (f1)
+               {
+                       m_plot->addFunction( f1 );
+                       m_plot->addFunctionToMove(f1);
+                       //m_plot->addFunctionToMove(f1);
+                       wxPen mypen1(*wxBLUE, 2, wxDOT_DASH );
+                       mypen1.SetWidth(2);
+                       f1->SetPen( mypen1 );
+               }
+               */
+               
+               //=================== lines to sychronyze the bars width with the drawed plotter--------------------------
+
+               mpWindow* mplotWindow = ((mpWindow*)m_plot);
+               float minReal_X = 0; //(float)mplotWindow->getMinScrX();
+               float maxReal_X =(float)mplotWindow->getMaxScrX();
+               float scrX=(float)mplotWindow->GetScrX()-100;
+               double scaleX=(scrX/(maxReal_X))* (mplotWindow->getZoomFactor()); // ........
+                       
+               // Creating the color bar with values according to the plotter added widget
+               color_bar = new pColorBar(this, (m_plot->GetSize()).GetWidth(),40, true);
+               color_bar -> setRepresentedValues (minReal_X, maxReal_X);
+               color_bar -> setDeviceBlitStart (70,0);
+               color_bar -> setVisibleRange (minReal_X, maxReal_X);
+               color_bar -> setDeviceEndMargin (50);
+               
+               
+               // Creating the min-max barrange bar with values according to the plotter added widget
+               barrange = new mBarRange(this, (m_plot->GetSize()).GetWidth(),30);
+               barrange -> setVisibleLabels (false);
+               barrange -> setRepresentedValues (minReal_X, maxReal_X);
+               barrange -> setDeviceBlitStart (70,0);
+               barrange -> setDeviceEndMargin (50);
+
+               // Adding the components to the sizer 
+               /*
+               if(m_plot->getActualFunction())
+                       setAll();
+               */      
+               wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+               sizer->Add( m_plot, 4, wxEXPAND);       
+               sizer->Add( color_bar,0, wxEXPAND );
+               sizer->Add( barrange, 0, wxEXPAND );
+
+               // sizer->Add( m_log, 0, wxEXPAND);
+               
+               // Stablishing the layout and sizer of the panel
+               /*panel->*/SetAutoLayout(true);
+               /*panel->*/SetSizer(sizer);
+               /*panel->*/Layout();
+
+               /*panel->*/Refresh();
+       }
+
+
+       pPlotter :: ~pPlotter ()
+       {
+
+       }
+
+//---------------------------------------------------------------------------------------------
+// Methods
+//---------------------------------------------------------------------------------------------
+/*
+Set the bars according to the actual function 
+*/
+
+       void pPlotter::setAll()
+{
+       actualFunction = m_plot->getActualFunction();
+
+       if (actualFunction != NULL)
+       {
+               barrange -> setActiveStateTo(true);
+               color_bar -> setActiveStateTo(true);
+
+               text.Clear();
+               text = _T("minX=");
+               double realMin_X = actualFunction->getMinX();
+               text = text + realMin_X;        
+               text = text + _T(" maxX=");
+               double realMax_X = actualFunction->getMaxX();
+               text = text + realMax_X;
+
+               int minShowed = actualFunction->getMinXShowed();
+               int maxShowed = actualFunction->getMaxXShowed();
+
+               barrange -> setRepresentedValues (realMin_X, realMax_X);
+               barrange->SetStart( minShowed );
+               barrange->SetEnd( maxShowed );
+
+
+               std::vector<pColorPoint *> actualColorPoints;
+               actualFunction -> getColorPoints(actualColorPoints);
+               if(actualColorPoints.empty())
+                       color_bar ->reinitiateColorBar (realMin_X, realMax_X);
+               else
+                       color_bar ->reinitiateColorBarTo(actualColorPoints);
+
+               color_bar -> setVisibleRange (minShowed, maxShowed);
+               
+               // Refresh
+               color_bar -> RefreshForce();
+               barrange -> RefreshForce();     
+               
+               sendTMessage(text);
+       }
+}
+
+       
+//*****************************************************************************************************
+// Color bar control methods
+//*****************************************************************************************************
+
+//-----------------------------------------------------------------------------------------------------
+// Updating methods for occured events in the color bar
+//-----------------------------------------------------------------------------------------------------
+void  pPlotter :: onAdded_ColorPoint(wxCommandEvent& event)
+{
+       text.Clear();
+       text = _T( "Last event was on color bar: Color point added, total#");
+       
+       actualFunction = m_plot->getActualFunction();
+       if(actualFunction!=NULL)
+       {               
+               std::vector<pColorPoint *> actualColorPoints;
+               color_bar ->getAddedColorsPointsList(actualColorPoints);
+               actualFunction -> setColorPoints(actualColorPoints);
+               text << actualColorPoints.size();
+
+               sendTMessage(text);
+       }
+}
+void  pPlotter :: onRemoved_ColorPoint(wxCommandEvent& event)
+{      
+       text.Clear();
+       text = _T( "Last event on color bar: Color point removed total#");
+
+       actualFunction = m_plot->getActualFunction();
+       std::vector<pColorPoint *> actualColorPoints;
+       color_bar ->getAddedColorsPointsList(actualColorPoints);
+       actualFunction -> setColorPoints(actualColorPoints);
+       text << actualColorPoints.size();
+       
+       sendTMessage(text);
+}
+void  pPlotter :: onMoved_ColorPoint(wxCommandEvent& event)
+{
+       text.Clear();
+       text = _T( "Last event was on color bar: Color point moved to: ");
+       int lastReal_X = (color_bar->getLastMovedColorPoint())->getRealX();
+       text << lastReal_X;
+       
+       barrange ->setRealX_vertical_line (lastReal_X);
+       barrange -> RefreshForce();
+       
+       m_plot->setRealGuideX (lastReal_X);
+       m_plot->UpdateAll();
+       
+       sendTMessage(text);
+}
+void  pPlotter:: onChanged_ColorPoint(wxCommandEvent& event)
+{
+    text.Clear();
+       sendTMessage(_T("Last event was on color bar: Color point changed color"));
+}
+
+void pPlotter :: onColorBar( wxCommandEvent& event )
+{
+       if( (barrange->getRealX_vertical_line())!=-1)
+       {
+               barrange ->setRealX_vertical_line (-1); 
+               m_plot->setRealGuideX (-1);
+
+               barrange -> RefreshForce();
+               m_plot->UpdateAll();
+       }
+}
+
+//*****************************************************************************************************
+// Plotter control methods
+//*****************************************************************************************************
+
+
+/*
+* Method called when actual function is changed
+*/
+void pPlotter :: onChangeFunction (wxCommandEvent& event)
+{
+       actualFunction = m_plot->getActualFunction();
+       
+       if (actualFunction != NULL)
+       {
+               if( !barrange->isActive() )
+               {
+                       barrange -> setActiveStateTo(true);
+                       color_bar -> setActiveStateTo(true);
+               }
+
+               text.Clear();
+               text = _T("Last event was on plotter: function changed, minX=");
+               double realMin_X = actualFunction->getMinX();
+               text << realMin_X;      
+               text << _T(" maxX=");
+               double realMax_X = actualFunction->getMaxX();
+               text << realMax_X;
+
+               int minShowed = actualFunction->getMinXShowed();
+               int maxShowed = actualFunction->getMaxXShowed();
+
+               barrange -> setRepresentedValues (realMin_X, realMax_X);
+               barrange->SetStart( minShowed );
+               barrange->SetEnd( maxShowed );
+               
+               std::vector<pColorPoint *> actualColorPoints;
+               actualFunction -> getColorPoints(actualColorPoints);
+               if(actualColorPoints.empty())
+                       color_bar ->reinitiateColorBar (realMin_X, realMax_X);
+               else
+                       color_bar ->reinitiateColorBarTo(actualColorPoints);
+
+               color_bar -> setVisibleRange (realMin_X, maxShowed);
+               
+               // Refresh
+               color_bar -> RefreshForce();
+               barrange -> RefreshForce();     
+               
+               sendTMessage(text);
+       }
+}
+
+
+/*
+* Method called when a point is added to the actual function on the plotter
+*/
+
+void pPlotter :: onAddedPoint_Plotter (wxCommandEvent& event)
+{
+       text.Clear();
+       m_plot->writeInText(text);
+       sendTMessage(text);
+}
+
+/*
+* Method called when a point is removed to the actual function on the plotter
+*/
+void pPlotter :: onRemovedPoint_Plotter (wxCommandEvent& event)
+{
+       text.Clear();
+       m_plot->writeInText(text);
+       sendTMessage(text);     
+}
+
+/*
+* Method called when a point is moved from the actual function on the plotter
+*/
+void pPlotter :: onMovePoint_Plotter (wxCommandEvent& event)
+{
+       text.Clear();
+       m_plot->writeInText(text);
+       sendTMessage(text);
+}
+/*
+* Method called when turn off the guide line from the actual function on the plotter
+*/
+void pPlotter::onGuideLines(wxCommandEvent& event)
+{
+               
+}
+
+
+
+//*****************************************************************************************************
+// Max-Min Barrange control methods
+//*****************************************************************************************************
+/*
+*
+*/
+void  pPlotter::onBarrange(wxCommandEvent& event)
+{
+               
+}
+/*
+*
+*/
+void  pPlotter::onActualChange_Bar(wxCommandEvent& event)
+{
+       text.Clear();
+       text = _T( "Last event was on min-max bar: Actual triangle moved to: " );
+       int lastActual_X = barrange->GetActual();
+
+       text << lastActual_X;
+       
+       color_bar ->setRealX_vertical_line (lastActual_X);
+       m_plot->setRealGuideX (lastActual_X);
+
+       color_bar -> RefreshForce();    
+       m_plot->UpdateAll();
+
+       sendTMessage(text);
+}
+
+/*
+* Method called when the start triangle is moved. Adjusts the plotter and color bar view-range.
+*/
+void  pPlotter::onStartChange_Bar(wxCommandEvent& event)
+{
+       text.Clear();
+    
+       text = _T( "Last event was on min-max bar: Start triangle moved to: ");
+       int realMin_X = barrange->GetStart();
+       text += wxString::Format(_T("%d"), realMin_X);  
+       double realMax_X = m_plot->getMaxScrX();
+       
+       color_bar -> setVisibleRange (realMin_X, realMax_X);
+       
+       m_plot->actualizeViewRange(realMin_X,realMax_X);
+       
+       //setting the plotter for draw the functions that
+       //it has to move.
+       
+       float startP=(float)barrange->getStartShowPorcentage();
+       float endP=(float)barrange->getEndShowPorcentage();
+       m_plot->moveFunctions(startP,endP);
+       
+       //Updating
+       color_bar -> RefreshForce();
+       m_plot -> UpdateAll();
+       sendTMessage(text);
+}
+
+void  pPlotter::onEndChange_Bar(wxCommandEvent& event)
+{
+       text.Clear();
+       text += _T("Last event was on min-max bar: End  triangle moved to: ");
+       int realMax_X = barrange->GetEnd();
+       text += wxString::Format(_T("%d"),realMax_X);   
+       double realMin_X = m_plot->getMinScrX();
+       color_bar -> setVisibleRange (realMin_X, realMax_X);
+       m_plot->actualizeViewRange(realMin_X,realMax_X);
+       
+       float startP=(float)barrange->getStartShowPorcentage();
+       float endP=(float)barrange->getEndShowPorcentage();
+       m_plot->moveFunctions(startP,endP);
+       
+       color_bar -> RefreshForce();
+       m_plot -> UpdateAll();
+
+       sendTMessage(text);
+}
+
+void pPlotter :: onSelectionEnd(wxCommandEvent& event)
+{
+       if( (color_bar->getRealX_vertical_line())!=-1)
+       {
+               color_bar ->setRealX_vertical_line (-1);        
+               m_plot->setRealGuideX (-1);
+
+               color_bar -> RefreshForce();
+               m_plot->UpdateAll();    
+       }
+}
+void  pPlotter :: onMovedBar(wxCommandEvent& event)
+{
+       text.Clear();
+       text = _T( "Last event was on min-max bar: Moved bar to min:" );
+       
+       int realMin_X = barrange->GetStart();
+       text +=  wxString::Format(_T("%d"),realMin_X);  
+       text +=  _T(" max:");
+
+       int realMax_X = barrange->GetEnd();
+       text +=  wxString::Format(_T("%d"),realMax_X);
+
+       color_bar -> setVisibleRange (realMin_X, realMax_X);
+       
+       float startP=(float)barrange->getStartShowPorcentage();
+       float endP=(float)barrange->getEndShowPorcentage();
+       m_plot->moveFunctions(startP,endP);
+       
+       color_bar -> RefreshForce();
+       m_plot -> UpdateAll();
+
+       sendTMessage(text);
+}
+
+/*
+       * Method for sending a text message to the container window
+       * @param theText Is the text of the message
+       */
+void pPlotter :: sendTMessage(wxString theText)
+{
+       //Creating a message event 
+       wxCommandEvent puntualMSG_Event( wxEVT_NW_TEXT_MESAGGE, GetId() );
+       puntualMSG_Event.SetEventObject(this);
+       //Sending the event
+       GetEventHandler()->ProcessEvent( puntualMSG_Event );
+}
+
+/*
+       * Sets the text message
+       * @param nMessage Is the text message to set
+       */
+       void pPlotter :: setTextMessage(wxString nMessage)
+       {
+               text = nMessage;
+       }
+
+       /*
+       * Gets the text message
+       * @param text Is the actual text message 
+       */
+       wxString pPlotter :: getTextMessage()
+       {
+               return text;
+       }
+       /**
+       * Add a function to the plotter
+       * when the function doesnt come from window
+       */
+       int pPlotter:: addFunction(pGraphicalFunction * function)
+       {
+               return m_plot->addFunction(function);  
+       }
+       /**
+       * Creates and returns a graphical funcion according to the indicated vectors.
+       */
+       pGraphicalFunction* pPlotter::getFunctionForVectors( double* vectorX, int sizeX,double * vectorY, int sizeY )
+       {
+               return m_plot->getFunctionForVectors(vectorX,sizeX, vectorY, sizeY );
+       }
+               /*
+        Set Type
+       */
+       void pPlotter::setType(int t)
+       {
+               m_plot->setType(t);
+       }
+       /*
+        Get a function in the plotter given the index
+       */
+       pGraphicalFunction* pPlotter:: getFunction(int index)
+       {
+               return m_plot->getFunction(index);
+       }
+       /*
+        Adds  function to move with the bar min max
+       */
+       int pPlotter::addFunctionToMove(pGraphicalFunction * function)
+       {
+               return m_plot->addFunctionToMove(function);
+       }
+       
+       /*
+         move the functions that the user wants to move
+         and that were setted in functionsToMove
+         @param porcentageMinX:the porcentage that the minShowed
+         of the funcntions have to be move
+         @param porcentageMaxX:the porcentage that the maxShowed
+         of the funcntions have to be move
+
+       */
+       void pPlotter:: moveFunctions(float porcentageMinX,float porcentageMaxX)
+       {
+               m_plot->moveFunctions(porcentageMinX,porcentageMaxX);
+       }
+       /*
+       * deletes the function from the plotter
+       */
+       /*
+       bool pPlotter::deleteFunction(pGraphicalFunction * function);
+               {
+                       return m_plot->deleteFunction(function);
+
+               }
+
+       */
+       //--------------------
+       // Color information
+       //---------------------
+       /**
+               Returns the number of points that the bar color has
+       */
+       int pPlotter::getColorPointsSize()
+       {
+               return color_bar->getColorPointsSize();
+       }
+       /*
+        Get the RGB values of the color point that is in the
+        index given
+       */
+       void pPlotter::getBarColorDataAt(int index,double& x, int& red,int& green,int& blue)
+       {
+               color_bar->getDataAt(index,x,red,green,blue);
+       }
+       /*
+        add a color Point 
+        returns true if the point was succesfully added
+        PRE: 0<=red<=255 0<=green<=255 0<=blue<=255
+       */
+       bool pPlotter::addColorPoint(int x,int red,int green, int blue)
+       {
+               wxColour color= wxColour(red,green,blue);
+               return color_bar->addColorPoint((double)x, color);
+       }
+       void pPlotter::eraseColorPoints()
+       {
+               int min=color_bar->getMinValue();
+               int max=color_bar->getMaxValue();
+               color_bar->reinitiateColorBar(min,max);
+       }
+
+       //--------------------
+       // bar Information
+       //---------------------
+       float pPlotter::getMaxShowedPorcentage()
+       {
+               return barrange->getEndShowPorcentage();
+       }
+       float pPlotter::getMinShowedPorcentage()
+       {
+               return barrange->getStartShowPorcentage();
+       }
+       float pPlotter::getActualShowedPorcentage()
+       {
+               return barrange->getActualShowPorcentage();
+       }
+       
+       //--------------------
+       // plotter Information
+       //---------------------
+       void pPlotter::setActual(pGraphicalFunction* nActual)
+       {
+               m_plot->setActualFunction(nActual);
+       }
+       void pPlotter::update()
+       {
+               //if it is a plotter of histograms
+               if(m_plot->getType()==2)
+               {
+                       pGraphicalFunction* tf= m_plot->getActualFunction();
+                       if(tf->getType()==2)
+                       {
+                               tf->clearSplineVectors();
+                               tf->addSplinesPoints();
+                               tf->initializeSplineVectors();
+                       }
+               }
+
+               m_plot->UpdateAll();
+       }
+       //----------------------------
+       //Handling Options Menu
+       //----------------------------
+       
+       void pPlotter::setPopUpMenu(bool startD,bool stopD,bool smooth,bool line, bool zoomIn,
+                                         bool zoomOut,bool showPoints,bool noShowPoints,bool changeColor, bool addP,
+                                         bool delPoint,bool load,bool save)
+       {
+               m_plot->setPopUpMenu(startD, stopD, smooth, line,  zoomIn,
+                                          zoomOut, showPoints, noShowPoints, changeColor,  addP,
+                                          delPoint, load, save);
+       }
+
+
+       /*
+               if the user resize the window   
+       */
+       
+       
+       
+       /*
+       void pPlotter::OnSize( wxSizeEvent &WXUNUSED(event) )
+       {
+               int scrX,scrY;
+               GetClientSize(&scrX,&scrY);
+               m_plot->SetSize(scrX,scrY);
+               
+               
+               pGraphicalFunction* actual=m_plot->getActualFunction();
+               if(actual!=NULL)
+               {               
+                       actual->setScreens(scrX,scrY);
+                       actual->setScales();
+               }
+               
+               
+       }
+       */
+       
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotter.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotter.h
new file mode 100644 (file)
index 0000000..5049e85
--- /dev/null
@@ -0,0 +1,246 @@
+#ifndef __pPlotter_h__
+#define __pPlotter_h__
+
+// --------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// --------------------------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+//--------------------------------------------------------------------------------------------
+// Includes
+//--------------------------------------------------------------------------------------------
+
+#include "pColorBar.h"
+#include "mBarRange.h"
+#include "mathplot.h"
+#include "pFunctionPoint.h"
+#include "pGraphicalFunction.h"
+#include "pPlotterLayer.h"
+#include "pPlotterWindow.h"
+#include "pPlotterScaleY.h"
+#include "pPlotterScaleX.h"
+#include <iostream>
+#include <vector>
+
+//-------------------------------------------------------------------------------------------------------------
+// Enum declarations
+//-------------------------------------------------------------------------------------------------------------
+/** Command IDs used by pColorPoint */
+
+//--------------------------------------------------------------------------------------------
+// Class definition
+//--------------------------------------------------------------------------------------------
+
+/*
+* Represents the integrated plotter that consists of the a drawing area, and control bars (min-max bar, degrade bar)
+*/
+/** @file pPlotter.h */
+class pPlotter : public wxPanel{
+
+public:
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+       /*
+       * Creates an integrated plotter instance 
+       * @param *parent Container window
+       */
+       pPlotter (wxWindow *parent,int nWidth, int nHeight);
+
+       ~pPlotter ();
+
+    //----------------------------------------------------------------------------------------
+       // Methods definition
+       //----------------------------------------------------------------------------------------
+
+       // Plotter received events      
+       void            onChangeFunction (wxCommandEvent& event);
+       void            onAddedPoint_Plotter (wxCommandEvent& event);
+       void            onRemovedPoint_Plotter (wxCommandEvent& event);
+       void            onMovePoint_Plotter (wxCommandEvent& event);
+       void            onGuideLines (wxCommandEvent& event);
+
+       // Color bar received events
+       void            onAdded_ColorPoint ( wxCommandEvent& event );
+       void            onRemoved_ColorPoint ( wxCommandEvent& event );
+       void            onMoved_ColorPoint( wxCommandEvent& event );
+       void            onChanged_ColorPoint( wxCommandEvent& event );
+       void            onColorBar( wxCommandEvent& event );
+
+       // Min-Max Barrange received events
+       void         onBarrange(wxCommandEvent& event);
+       void         onActualChange_Bar(wxCommandEvent& event);
+       void         onStartChange_Bar(wxCommandEvent& event);
+       void         onEndChange_Bar(wxCommandEvent& event);
+       void         onSelectionEnd(wxCommandEvent& event);
+       void         onMovedBar(wxCommandEvent& event);
+
+       /*
+       * Method for sending a text message to the container window
+       * @param theText Is the text of the message
+       */
+       void             sendTMessage(wxString theText);
+
+       // Other methods
+       wxWindow*       initialize(wxWindow *parent);
+
+       /*
+       * Sets the text message
+       * @param nMessage Is the text message to set
+       */
+       void setTextMessage(wxString nMessage);
+
+       /*
+       * Gets the text message
+       * @param text Is the actual text message 
+       */
+       wxString getTextMessage();
+       /**
+       * Creates and returns a graphical funcion according to the indicated vectors.
+       */
+       pGraphicalFunction* getFunctionForVectors( double* vectorX, int sizeX,double * vectorY, int sizeY );
+       /**
+       * Add a function to the plotter
+       * when the function doesnt come from window
+       */
+       int addFunction(pGraphicalFunction * function);
+       /*
+        Set Type
+       */
+       void setType(int t);
+       /*
+        Get a function in the plotter given the index
+       */
+       pGraphicalFunction* getFunction(int index);
+       
+       /*
+               if the user resize the window   
+       */
+       void OnSize( wxSizeEvent &WXUNUSED(event) );
+       /*
+        Get a function in the plotter given the index
+       */
+       //pGraphicalFunction* getFunction(int index);
+       
+       /*
+         move the functions that the user wants to move
+         and that were setted in functionsToMove
+         @param porcentageMinX:the porcentage that the minShowed
+         of the funcntions have to be move
+         @param porcentageMaxX:the porcentage that the maxShowed
+         of the funcntions have to be move
+
+       */
+       void moveFunctions(float porcentageMinX,float porcentageMaxX);
+
+       /*
+        Adds  function to move with the bar min max
+       */
+       int addFunctionToMove(pGraphicalFunction * function);
+       /*
+       Set the bars according to the actual function 
+       */
+
+       void setAll();
+       /*
+       * deletes the function from the plotter
+       */
+       //bool deleteFunction(pGraphicalFunction* function);
+
+       
+       //--------------------
+       // Color information
+       //---------------------
+
+       /**
+               Returns the number of points that the bar color has
+       */
+       int getColorPointsSize();
+
+       /*
+        Get the RGB values of the color point that is in the
+        index given
+       */
+       void getBarColorDataAt(int index,double&x,int& red,int& green,int& blue);
+       /*
+        add a color Point 
+        returns true if the point was succesfully added
+        PRE: 0<=red<=255 0<=green<=255 0<=blue<=255
+       */
+       bool addColorPoint (int x,int red,int green, int blue);
+
+       void eraseColorPoints();
+
+               
+       //--------------------
+       // bar Information
+       //---------------------
+       float getMaxShowedPorcentage();
+       float getMinShowedPorcentage(); 
+       float getActualShowedPorcentage();      
+       //--------------------
+       // plotter Information
+       //---------------------
+       void setActual(pGraphicalFunction* nActual);
+       void update();
+       
+       //----------------------------
+       //Handling Options Menu
+       //----------------------------
+       /*
+       if any parameter is true, is going to be remove from the popUp menu
+       */
+       void setPopUpMenu(bool startD,bool stopD,bool smooth,bool line, bool zoomIn,
+                                         bool zoomOut,bool showPoints,bool noShowPoints,bool changeColor, bool addP,
+                                         bool delPoint,bool load,bool save);
+
+       //----------------------------------------------------------------------------------------
+       // Attributes declration
+       //----------------------------------------------------------------------------------------
+private: 
+
+       /*
+       * Represents the plotter widget drawing area
+       */
+       pPlotterWindow  *m_plot;
+       /*
+       * Represents the color bar instance
+       */
+       pColorBar       *color_bar;
+       /*
+       * Represents the barrange instance
+       */
+       mBarRange       *barrange;
+       /*
+       * Represents the pointer to the actual funtion in the unified plotter
+       */
+       pGraphicalFunction* actualFunction;
+
+       /*
+       * Represents the text message 
+       */
+       wxString text;
+
+       /*
+       * Declaring the existence of the class
+       */
+       DECLARE_CLASS (pPlotter)
+       /*
+       * Declaring the use of events
+       */
+       DECLARE_EVENT_TABLE()
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.cxx
new file mode 100644 (file)
index 0000000..a1a04ef
--- /dev/null
@@ -0,0 +1,628 @@
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pPlotterLayer.h"
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include <vector>
+#include <fstream>
+#include <iostream>
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(pPlotterLayer, mpLayer)
+//----------------------------------------------------------------------------
+// Methods
+//----------------------------------------------------------------------------
+
+/** 
+*@param name  Label
+*@param flags Label alignment, pass one of #mpALIGN_NE, #mpALIGN_NW, #mpALIGN_SW, #mpALIGN_SE.
+*/
+pPlotterLayer:: pPlotterLayer(wxString name , int flags )
+{
+       SetName(name);
+       m_flags = flags;
+       points.DeleteContents(TRUE);
+       offsetX=0;
+       offsetY=0;
+}
+
+/*
+Draw the line from (x1,y1) to (x2,y2) only passing by the 
+positive points in the line
+*/
+void  pPlotterLayer::draw(wxDC & dc,mpWindow & w,double x1,double y1,double x2,double y2)
+{
+       
+       //intercepts
+       float m=((float)(y2-y1))/(x2-x1);
+       float x0=-y1/m+x1;
+       float y0=-m*x1+y1;      
+
+
+       //analyzing the curve
+
+               if(x1<=0 && x2>=0)
+               {
+                       if(y2>=0 && y1>=0)
+                                       dc.DrawLine(0,y0, x2,y2);
+
+                       else if(y2<=0 && y1>=0)
+                       {
+                               if(y0>=0 && x0>=0)
+                                       dc.DrawLine(0,y0,x0,0 );
+                       }
+                       else if(y2>=0 && y1<=0)
+                       {
+                               if(y0>=0) 
+                               dc.DrawLine(0,y0,x2,y2 );
+                       }
+       
+               }
+
+               if(x1>=0 && x2>=0)
+               {
+                       if(y1>=0 && y2>=0 )
+                               dc.DrawLine(x1,y1, x2,y2);
+                       else if(y1>=0 && y2<=0)
+                               dc.DrawLine(x1,y1,x0,0 );
+                       else if(y1<=0 && y2>=0) 
+                                       dc.DrawLine(x0,0,x2,y2);
+               }
+               
+               
+}
+       
+/**
+* Draw the function with th spline points
+*
+*/
+void pPlotterLayer::drawSplineCurve(wxDC & dc,mpWindow & w)
+{
+       std::vector<double> vx=getXSpline();
+       std::vector<double> vy=getYSpline();
+       wxPoint* ppoints;
+       
+       int counter=0,minX,maxX,minY,maxY;
+       /*
+       This is the offset of every point scale to the window
+       pixel
+       */
+       int offsetpx=getOffsetPixelsXv();
+       int offsetpy=getOffsetPixelsYv();
+       
+       // type of plotter
+       int type=getmType();
+       wxPoint point;
+       /***********/
+       getMaxShowed(maxX,maxY);
+       getMinShowed(minX,minY);
+       /***********/
+
+       
+       if(type==2)
+       {
+        /*
+               Fill the function if it represented an histogram
+         */
+               ppoints=(wxPoint*)malloc(sizeof(int)*2*(vx.size()+2));
+               //initialize points
+               point.x=-5000;
+               point.y=-5000;
+               ppoints[0]=point;
+               ppoints[1]=point;
+       }
+       
+       int size=vx.size();
+       int j=2;
+
+       for(int i=0;(i+1)< size;i++)
+       {
+               
+               
+               double cxi=(vx.at(i)-minX-offsetX)*scaleX+offsetpx;
+               double cyi=(vy.at(i)-minY-offsetY)*scaleY+offsetpy;
+               
+               double cxj=(vx.at(i+1)-minX-offsetX)*scaleX+offsetpx;
+               double cyj=(vy.at(i+1)-minY-offsetY)*scaleY+offsetpy;
+               
+               
+               if(type!=2)     
+                       draw(dc,w,cxi,cyi,cxj,cyj);
+               else if(type==2)
+               {
+                       if(!initializePolygon(ppoints,cxi,cyi,cxj,cyj) && ((cxi<=0 && cxj>=0)||(cxi>=0 && cxj>=0)))
+                       {
+                                       point.x=cxj;
+                                       point.y=cyj;
+                                       ppoints[j]=point;
+                                       j++;
+               
+                       }
+               }
+               
+       }
+       if(type==2)
+       {
+               //point.x=vx.at(size-1)* scaleX + offsetpx;
+               point.x=ppoints[j-1].x;
+               point.y=0;
+               //ppoints[vx.size()]=point;
+               ppoints[j]=point;
+               /*
+               Fill the function if it represented an histogram
+         */
+               //ppoints=(wxPoint*)malloc(sizeof(int)*2*(vx.size()+1));
+               //settings for fill
+               //point.x=vx.at(0)*scaleX + offsetpx;
+               point.x=ppoints[0].x;
+               point.y=0;
+               //ppoints[vx.size()+1]=point;
+               ppoints[j+1]=point;
+
+               dc.SetBrush(wxBrush( wxColour(239,238,242) ,wxSOLID  ));
+               dc.SetPen(wxPen( wxColour(0,0,0) ,1,wxSOLID  ));
+               //dc.DrawPolygon(vx.size()+2,ppoints,0,0);
+               dc.DrawPolygon(j+2,ppoints,0,0);
+       }
+       
+       
+}
+
+/*
+ it define the first point of the polygon for be drawing
+ returs true if the first and second point of the polygon are setted
+*/
+bool pPlotterLayer::initializePolygon(wxPoint* points,double x1, double y1,double x2, double y2)
+{
+       bool setted=false;
+
+               //intercepts
+       float m=((float)(y2-y1))/(x2-x1);
+       float x0=-y1/m+x1;
+       float y0=-m*x1+y1;      
+
+       if(points[0].x<=0&& points[1].x<=0 && points[0].y<=0&& points[1].y<=0)
+       {
+       
+               int offsetpx=getOffsetPixelsXv();       
+
+               //analyzing the curve
+
+                       if(x1<=0 && x2>=0)
+                       {
+                               if(y2>=0 && y1>=0)
+                               {
+                                               //dc.DrawLine(0,y0, x2,y2);
+                                               points[0].x=0;
+                                               points[0].y=y0;
+                                               points[1].x=x2;
+                                               points[1].y=y2;
+                                               setted=true;                                    
+                                       
+                               }
+                               else if(y2<=0 && y1>=0)
+                               {
+                                       if(y0>=0 && x0>=0)
+                                       {
+                                               //dc.DrawLine(0,y0,x0,0 );
+                                               points[0].x=0;
+                                               points[0].y=y0;
+                                               points[1].x=x0;
+                                               points[1].y=0;
+                                               setted=true;    
+
+                                       }
+                                               
+                               }
+                               else if(y2>=0 && y1<=0)
+                               {       
+                                       if(y0>=0) 
+                                       {       
+                                               //dc.DrawLine(0,y0,x2,y2 );
+                                               points[0].x=0;
+                                               points[0].y=y0;
+                                               points[1].x=x2;
+                                               points[1].y=y2;
+                                               setted=true;    
+                                       }
+                               }
+               
+                       }
+
+                       if(x1>=0 && x2>=0)
+                       {
+                               if(y1>=0 && y2>=0 )
+                               {
+                                       //dc.DrawLine(x1,y1, x2,y2);
+                                       points[0].x=x1;
+                                       points[0].y=y1;
+                                       points[1].x=x2;
+                                       points[1].y=y2;
+                                       setted=true;    
+                               }
+                               else if(y1>=0 && y2<=0)
+                               {
+                                       //dc.DrawLine(x1,y1,x0,0 );
+                                       points[0].x=x1;
+                                       points[0].y=y1;
+                                       points[1].x=x0;
+                                       points[1].y=0;
+                                       setted=true;    
+                               }
+                               else if(y1<=0 && y2>=0) 
+                               {       
+                                       //dc.DrawLine(x0,0,x2,y2);
+                                       points[0].x=x0;
+                                       points[0].y=0;
+                                       points[1].x=x2;
+                                       points[1].y=y2;
+                                       setted=true;    
+                               }
+                       }
+                       else
+                       return setted;
+       }
+       else
+               return setted;
+}
+
+/**
+* Draw le lines between the points of the function
+*/
+void pPlotterLayer::drawFunction(wxDC & dc,mpWindow & w)
+{
+
+       
+       int scrwX,scrwY,offsetpx,offsetpy,maxX,minX,maxY,minY;
+       wxPoint* ppoints=NULL;
+
+       /*
+       This is the offset of every point scale to the window
+       pixel
+       */
+       offsetpx=getOffsetPixelsXv();
+       offsetpy=getOffsetPixelsYv();
+       
+
+       Rewind();
+       
+
+       dc.GetSize(&scrwX, &scrwY);
+       
+       //Lines between the points
+       
+       GetPoints(points);
+
+       // type of plotter
+       int type=getmType();
+       /***********/
+       getMaxShowed(maxX,maxY);
+       getMinShowed(minX,minY);
+       /***********/
+
+       //traslation
+       int xTraslation=getXTraslation();
+       wxNode* node= points.GetFirst();
+       int i=1;//points.GetCount()+1;
+       int j=2;
+       /*
+        Fill it if it is an histogram
+       */
+       wxPoint point;
+       pFunctionPoint* pointk;
+       if(type==2)
+       {
+               /*
+               Fill the function if it represented an histogram
+         */
+               ppoints=(wxPoint*)malloc(sizeof(int)*2*(points.GetCount()+2));
+               //initialize points
+               point.x=-5000;
+               point.y=-5000;
+               ppoints[0]=point;
+               ppoints[1]=point;
+
+       }
+       
+       
+       while (node!=NULL && node->GetNext()!=NULL)
+       { 
+               pFunctionPoint* pointi=(pFunctionPoint*)node->GetData();
+                               wxNode* nextNode=node->GetNext();
+               pFunctionPoint* pointj=(pFunctionPoint*)nextNode->GetData();
+                                               
+               // we do the offset
+               int pxi=(pointi->getRealX()-minX)-offsetX;
+               int pyi=(pointi->getRealY()-minY)-offsetY;
+               int pxj=(pointj->getRealX()-minX)-offsetX;
+               int pyj=(pointj->getRealY()-minY)-offsetY;
+
+
+               int cxi=pxi* scaleX + offsetpx; //+ xTraslation;
+               int cxj=pxj* scaleX + offsetpx; //+ xTraslation;
+               int cyi=pyi* scaleY+ offsetpy ;
+               int cyj=pyj* scaleY+ offsetpy ;
+               //dc.DrawLine(pxi* scaleX + offsetpx,pyi* scaleY+ offsetpy, pxj* scaleX + offsetpx,pyj* scaleY+ offsetpy );
+               if(type!=2)
+                       draw(dc,w,pxi* scaleX + offsetpx,pyi* scaleY+ offsetpy, pxj* scaleX + offsetpx,pyj* scaleY+ offsetpy );
+                       //dc.DrawLine(pxi* scaleX + offsetpx,pyi* scaleY+ offsetpy, pxj* scaleX + offsetpx,pyj* scaleY+ offsetpy );
+               else if(type==2)
+               {
+                       if(!initializePolygon(ppoints,cxi,cyi,cxj,cyj) && ((cxi<=0 && cxj>=0)||(cxi>=0 && cxj>=0)))
+                       {
+                                       point.x=cxj;
+                                       point.y=cyj;
+                                       ppoints[j]=point;
+                                       j++;
+               
+                       }
+               }
+               
+               node=node->GetNext();
+
+       } 
+       if(type==2)
+       {
+               //point.x=vx.at(size-1)* scaleX + offsetpx;
+               point.x=ppoints[j-1].x;
+               point.y=0;
+               //ppoints[vx.size()]=point;
+               ppoints[j]=point;
+               /*
+               Fill the function if it represented an histogram
+         */
+               //ppoints=(wxPoint*)malloc(sizeof(int)*2*(vx.size()+1));
+               //settings for fill
+               //point.x=vx.at(0)*scaleX + offsetpx;
+               point.x=ppoints[0].x;
+               point.y=0;
+               //ppoints[vx.size()+1]=point;
+               ppoints[j+1]=point;
+
+               dc.SetBrush(wxBrush( wxColour(239,238,242) ,wxSOLID  ));
+               dc.SetPen(wxPen( wxColour(0,0,0) ,1,wxSOLID  ));
+               //dc.DrawPolygon(vx.size()+2,ppoints,0,0);
+               dc.DrawPolygon(j+2,ppoints,0,0);
+
+       }
+       
+}
+
+/**
+*  Draw the points of the function
+*/
+void pPlotterLayer::drawPoints(wxDC & dc,mpWindow & w)
+{
+       
+       Rewind();
+       double x, y;
+       int minX,maxX,minY,maxY;
+
+       
+       /*
+       This is the offset of every point scale to the window
+       pixel
+       */
+       int offsetpx=getOffsetPixelsXv();
+       int offsetpy=getOffsetPixelsYv();
+       //traslation
+       int xTraslation=getXTraslation();
+       /*wxPen mypen(*wxBLACK, 5, wxSOLID);
+       dc.SetPen(mypen);*/
+       /***********/
+       getMaxShowed(maxX,maxY);
+       getMinShowed(minX,minY);
+       /***********/
+       //we have to draw the points
+
+       while (GetNextXY(x, y))
+       {
+               //GetNextXY(x, y);
+               //set the points of the polygons
+               wxPoint points[4];
+               dc.SetBrush(wxBrush( wxColour(255,0,0),wxSOLID  ));
+               //dc.SetPen(wxPen(wxColour(0,0,0),1,wxSOLID) );
+               points[0].x=((x-minX-offsetX)*scaleX + offsetpx-MOVE);
+               points[0].y=((y-minY-offsetY)*scaleY+ offsetpy-MOVE);
+               points[1].x=((x-minX-offsetX)*scaleX+ offsetpx+MOVE);
+               points[1].y=((y-minY-offsetY)*scaleY+ offsetpy-MOVE);
+               points[2].x=((x-minX-offsetX)*scaleX+ offsetpx+MOVE);
+               points[2].y=((y-minY-offsetY)*scaleY+ offsetpy+MOVE);
+               points[3].x=((x-minX-offsetX)*scaleX+ offsetpx-MOVE);
+               points[3].y=((y-minY-offsetY)*scaleY+ offsetpy+MOVE);
+               if((x-minX-offsetX)*scaleX >=0 && (y-minY-offsetY/*w.getMinScrY()*/)*scaleY>=0)
+               dc.DrawPolygon(4,points,0,0);
+       }
+}
+
+/**
+* Draw the line between the last point of the function
+* and the position of the mouse
+*/
+void pPlotterLayer::drawLineToMousePoint(wxDC & dc,mpWindow & w)
+{
+       int x,y,sizeP,maxX,maxY,minX,minY;
+       bool direction;
+       
+       Rewind();
+       
+       getMousePoint(x,y);
+       getDirection(direction);
+       getSize(sizeP);
+       //Lines betwen the points
+       GetPoints(points);
+
+       wxNode *node=points.GetLast();
+       wxNode *node1=points.GetFirst();
+       
+       
+       /*
+       This is the offset of every point scale to the window
+       pixel
+       */
+       int offsetpx = getOffsetPixelsXv();
+       int offsetpy = getOffsetPixelsYv();
+       /***********/
+       getMaxShowed(maxX,maxY);
+       getMinShowed(minX,minY);
+       /***********/
+       //traslation
+       int xTraslation=getXTraslation();
+       
+       if(node)
+       {
+               pFunctionPoint* lastPoint=(pFunctionPoint*)node->GetData();
+               pFunctionPoint* firstPoint=(pFunctionPoint*)node1->GetData();
+
+               //LeftDrawing
+               if(lastPoint->getRealX()<x && direction && sizeP >=2)
+                       
+                       dc.DrawLine((lastPoint->getRealX()-minX-offsetX)*scaleX + offsetpx,(lastPoint->getRealY()-minY-offsetY)*scaleY+ offsetpy, (x-minX)*scaleX + offsetpx, (y-minY)*scaleY + offsetpy);
+               
+               //right drawing
+               else if(firstPoint->getRealX()>x && !direction && sizeP >=2 )
+                       
+                       dc.DrawLine((firstPoint->getRealX()-minX-offsetX)*scaleX+ offsetpx,(firstPoint->getRealY()-minY-offsetY)*scaleY+ offsetpy,(x-minX)*scaleX+ offsetpx, (y-minY)*scaleY+ offsetpy);
+               
+               //just a point
+               else if(sizeP==1 )
+               {
+                       dc.DrawLine((lastPoint->getRealX()-minX-offsetX)*scaleX + offsetpx,(lastPoint->getRealY()-minY-offsetY)*scaleY+ offsetpy, (x-minX)*scaleX+ offsetpx, (y-minY)*scaleY+ offsetpy);
+               }
+       }                       
+       
+       if( w.drawGuideLines() )  
+       {
+               dc.SetPen(wxPen(  wxColour(255,0,0),1,wxDOT ));
+               // Drawing the horizontal guide line    
+               dc.DrawLine( 0, (y-minY)*scaleY + offsetpy, (x-minX)*scaleX + offsetpx, (y-minY)*scaleY + offsetpy);                                    
+               // Drawing the vertical guide line      
+               dc.DrawLine( (x-minX)*scaleX + offsetpx,0, (x-minX)*scaleX + offsetpx, (y-minY)*scaleY + offsetpy);     
+       }
+}
+
+
+/** 
+Layer plot handler.
+This implementation will plot the locus in the visible area and
+put a label according to the aligment specified.
+*/
+void pPlotterLayer::Plot(wxDC & dc, mpWindow & w)
+{
+       bool show,drawing,actual;
+       int scrwX,scrwY,maxX,maxY,minX,minY,type;
+       float factorZoom;
+       
+       ifShowPoints(show);
+       getDrawing(drawing);
+       type=vGetType();
+       
+       dc.SetPen( m_pen);
+       
+       /*
+        * Managing the scale and zoom
+        */
+       
+       dc.GetSize(&scrwX, &scrwY);
+       getIfActual(actual);
+       //getMax(maxX, maxY);
+       /***********/
+       getMaxShowed(maxX,maxY);
+       getMinShowed(minX,minY);
+       /***********/
+       getFactorZoom(factorZoom);
+       getOffsets(offsetX,offsetY);
+       /*
+       maxX=w.getMaxScrX();
+       maxY=w.getMaxScrY();
+       minX=w.getMinScrX();
+       minY=w.getMinScrY();
+       */
+       if((maxX-minX)!=0 && (maxY-minY)!=0)
+       {
+               
+               scaleX=(((double)scrwX-100)/(maxX-minX))*factorZoom;
+               scaleY=(((double)scrwY-50)/(maxY-minY))*factorZoom;
+               
+               if(actual)
+               {
+                       w.SetScaleX(scaleX);
+                       w.SetScaleY(scaleY);
+                       //w.setMinScrX(offsetX);
+                       //w.setMinScrY(offsetY);
+               }
+               
+       }
+       /*
+               Managing the drawing
+       */
+       int orgx=70;
+       int orgy=w.GetScrY()-40;
+       dc.SetDeviceOrigin( orgx ,orgy);
+       dc.SetAxisOrientation(true,true);
+
+
+       //if the user dont want to see the points of the function and if he stops drawing
+       //we have to draw the function
+       if(!show && !drawing && type==1)
+               drawFunction(dc,w);
+       else if(!show && !drawing && type==2)
+               drawSplineCurve(dc,w);
+       //we just draw the point that the user just clicked
+       else if(drawing && type==1)
+       { 
+               drawFunction(dc,w);
+               drawLineToMousePoint(dc,w);
+               drawPoints(dc,w);
+       }
+       else if(drawing && type==1)
+       {
+               drawSplineCurve(dc,w);
+               drawLineToMousePoint(dc,w);
+               drawPoints(dc,w);
+       }
+       else if(show && type==1)
+       {
+               drawFunction(dc,w);
+               drawPoints(dc,w);
+       }
+       else if(show && type==2)
+       {
+               drawSplineCurve(dc,w);
+               drawPoints(dc,w);
+       }
+
+       // Drawing the guides according to real values entered according to the integrated interaction (IS NOT WORKING!!!)
+       if ( actual )
+       {
+               dc.SetPen(wxPen(  wxColour(255,0,0),1,wxDOT ));
+               int offsetpx = getOffsetPixelsXv();
+               int offsetpy = getOffsetPixelsYv();
+
+               int realX_guide = w.getRealGuideX();
+               if( realX_guide!=-1 )
+               {
+               dc.DrawLine( (realX_guide/*-w.getMinScrX()*/-offsetX)*scaleX + offsetpx, 0, (realX_guide/*-w.getMinScrX()*/-offsetX)*scaleX + offsetpx, scrwY);                 
+               }
+                       
+               int realY_guide = w.getRealGuideY();
+               if( realY_guide!=-1 )
+               {
+                       dc.DrawLine( 0,(realY_guide/*-w.getMinScrY()*/-offsetX)*scaleX + offsetpx, scrwX, (realY_guide/*-w.getMinScrY()*/-offsetX)*scaleX + offsetpx);
+               }
+       }
+   
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterLayer.h
new file mode 100644 (file)
index 0000000..f43b0fc
--- /dev/null
@@ -0,0 +1,257 @@
+
+#ifndef __pPlotterLayer_h__
+#define __pPlotterLayer_h__
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+#include "mathplot.h"
+#include "pFunctionPoint.h"
+#include <vector>
+
+#define MAX_POINTS 50
+#define MOVE 5
+
+
+//using namespace std;
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+class pPlotterLayer: public mpLayer 
+{
+
+public:
+       /** @param name  Label
+       @param flags Label alignment, pass one of #mpALIGN_NE, #mpALIGN_NW, #mpALIGN_SW, #mpALIGN_SE.
+       */
+       pPlotterLayer(wxString name = wxEmptyString, int flags = mpALIGN_NE);
+       /*
+        it define the first point of the polygon for be drawing
+        returs true if the first and second point of the polygon are setted
+       */
+       bool initializePolygon(wxPoint* points,double x1, double y1,double x2, double y2);
+       /*
+       Draw the line from (x1,y1) to (x2,y2) only passing by the 
+       positive points in the line
+       */
+void draw(wxDC & dc,mpWindow & w,double x1,double y1,double x2,double y2);
+       
+       /**
+       * Draw the function with th spline points
+       *
+       */
+       void drawSplineCurve(wxDC & dc,mpWindow & w);
+       
+       /**
+       * Draw the line between the last point of the function
+       * and the position of the mouse
+       */
+       void drawLineToMousePoint(wxDC & dc,mpWindow & w);
+       /**
+       * Draw le lines between the points of the function
+       */
+       void drawFunction(wxDC & dc,mpWindow & w);
+       /**
+       *  Draw the points of the function
+       */
+       void drawPoints(wxDC & dc,mpWindow & w);
+       
+       /**
+        Get the value of the traslation
+       in the x-axis
+       */
+       virtual int getXTraslation()
+       {
+               return -1;
+       }
+       /**
+        Get the type of the curve
+        1=normal function
+        2=Histogram
+       */
+       virtual int getmType()
+       {
+               return -1;
+       }
+       /**
+       * get the maxShowed of the function in x and y
+       */
+       virtual void getMaxShowed(int & maxX, int &maxY)
+       {
+       }
+       /**
+       * get the minShowed of the function in x and y
+       */
+       virtual void getMinShowed(int & minX, int &minY)
+       {
+       }
+       
+       /**
+       Gets the x-offset of the zoom
+       in pixels
+       */
+       virtual int getOffsetPixelsXv(){return -1;}     
+       
+       
+       /**
+       Gets the Y-offset of the zoom
+       in pixels
+       */
+       virtual int getOffsetPixelsYv(){ return -1;}
+
+       
+       /*
+        returns the xSpline to plotter
+       */
+       virtual std::vector<double> getXSpline()
+       { 
+               std::vector<double> v;
+               return v;
+       }
+       /*
+        returns the ySpline to plotter
+       */
+       virtual std::vector<double> getYSpline()
+       { 
+               std::vector<double> v;
+               return v;
+       }
+
+       /**
+        Get the type of the curve
+        1=piecewise functio
+        2= smooth
+       */
+       virtual int vGetType()
+       { return -1;}
+
+
+       /**
+        Get _offsetX and _offsetY
+       */
+
+       virtual void getOffsets(int &offsetX,int &offSetY )
+       {}
+
+       /*
+       * Get the factor zoom
+       */
+       virtual void getFactorZoom(float & fz){}
+       /**
+       * if the function that is drawing is the actual
+       */
+       virtual void getIfActual(bool &actual){}
+       
+       
+       /**
+       * get the max of the function in x and y
+       */
+       virtual void getMax(int & maxX, int &maxY){}
+
+       /**
+       * Get screens of the function
+       */
+       virtual void  getScreens(int & scrX, int & scrY){}
+
+       /**
+       * Set screens value
+       */
+       virtual void setScreens(int scrX,int scrY){}
+
+       /**
+       * Let us know the scale of the function
+       */
+       virtual void getScales(double & scaleX,double & scaleY){}
+
+       /**
+       *Rewind the value of node
+       */
+       virtual void Rewind(){}
+
+       /** Get locus value for next N.
+       Override this function in your implementation.
+       @param x Returns X value
+       @param y Returns Y value
+       */
+       virtual bool GetNextXY(double & x, double & y){return false;}
+
+       /**
+       Get Point list of the funcion
+       @param return points
+       */
+       virtual void GetPoints(wxList &points){}
+
+       /** Layer plot handler.
+       This implementation will plot the locus in the visible area and
+       put a label according to the aligment specified.
+       */
+       virtual void Plot(wxDC & dc, mpWindow & w);
+       /**
+       Let us Know if the user want to see the points of the function
+       of other color than the color of the lines
+       */
+       virtual void ifShowPoints(bool & show){}
+
+       /**
+       * Let us Know if the user has finished the drawing
+       * that starts before.
+       */
+       virtual void getDrawing(bool &draw){}
+       /*
+       * Gets the point of the mouse where the user is
+       */
+       virtual void getMousePoint(int &x,int &y){}
+       /**
+       * this method gets the direction of the drawing
+       */
+       virtual void getDirection(bool &dir){}
+       /**
+       * Get the number of points of the function
+       */
+       virtual void getSize(int &size){};
+
+protected:
+       int m_flags; //!< Holds label alignment
+       /*
+       * Points of the function thats is drawing
+       */
+       wxList points;
+       /*
+       * the scale in x, with wich it must draw
+       */
+       double scaleX;
+       /*
+       * the scale in y, with wich it must draw
+       */
+       double scaleY;
+
+       /**
+       * offset X
+       */
+       int offsetX;
+       
+       /**
+       * offset Y
+       */
+       int offsetY;
+       
+
+       DECLARE_CLASS (pPlotterLayer)
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.cxx
new file mode 100644 (file)
index 0000000..1f95b6b
--- /dev/null
@@ -0,0 +1,103 @@
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pPlotterScaleX.h"
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+#define mpLN10 2.3025850929940456840179914546844
+
+IMPLEMENT_CLASS(pPlotterScaleX, pPlotterLayer)
+//----------------------------------------------------------------------------
+// Methods
+//----------------------------------------------------------------------------
+pPlotterScaleX::pPlotterScaleX(wxString aName,int flags) {
+
+       SetName(aName);/*
+       SetFont(*wxSMALL_FONT);
+       SetPen(*wxGREY_PEN);*/
+       wxFont ff( *wxSMALL_FONT);
+       wxPen pp( *wxGREY_PEN);
+       SetPen( pp );
+       SetFont( ff );
+}
+
+void pPlotterScaleX::Plot(wxDC& dc, mpWindow& w) 
+{
+
+       int divisions=20;
+       
+
+       dc.SetPen( m_pen);
+       dc.SetFont( m_font);
+       
+       //data
+       float min=(float)w.getMinScrX();
+       float max=(float)w.getMaxScrX();
+       float scrX=(float)w.GetScrX()-100;
+       double scaleX=(scrX/(max-min))*w.getZoomFactor();
+       int offsetpx=w.getOffsetPixelsX();
+       int offsetX=w.getOffsetX();
+
+       //setting origins
+       const int orgy   = w.GetScrY()-40;
+       const int extend = w.GetScrX()-100;
+
+       dc.SetDeviceOrigin(70,orgy);
+       dc.SetAxisOrientation(true,true);
+       
+       //draw the axe
+       dc.DrawLine(0,0,(max-min)*scaleX,0);
+
+       //maximum value in x
+       int d=max-min;
+       if(d<20)
+               {
+                       int k=d/divisions;
+                       while(k==0)
+                               {
+                                       divisions--;
+                                       k=d/divisions;
+                               }
+               }
+       float step=(max-min)/divisions;
+
+       //drawing the axe with the numbers
+       wxString s;
+       
+       
+       //drawing the first line
+       dc.DrawLine(0,0,0,-10);
+       s.Printf(_T("%d"),(int)(min));
+       dc.DrawText(s,(wxCoord)0,(wxCoord)-20);
+       
+       for(float i=0;i<=(max);i+=step)
+       {
+               
+               int p=(i-min-offsetX)*scaleX+offsetpx;
+               if(p>=0)
+               {       
+                       dc.DrawLine(p,0,p,-10);
+                       s.Printf(_T("%d"),(int)(i));
+                       dc.DrawText(s,(wxCoord)p,(wxCoord)-20);         
+               }
+       }
+       //drawing the last line
+       int p=(max-min-offsetX)*scaleX+offsetpx;
+       dc.DrawLine(p,0,p,-10);
+       s.Printf(_T("%d"),(int)(max));
+       dc.DrawText(s,(wxCoord)p,(wxCoord)-20);
+
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleX.h
new file mode 100644 (file)
index 0000000..9623e2f
--- /dev/null
@@ -0,0 +1,49 @@
+
+#ifndef __pPlotterScaleX_h__
+#define __pPlotterScaleX_h__
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+
+#include "pPlotterLayer.h"
+
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+class pPlotterScaleX: public pPlotterLayer
+{
+public:
+       /**
+       * This is the constructor of the class
+       */
+       pPlotterScaleX(wxString aName = wxT("X"),int flags = mpALIGN_NE);
+       /**
+       * This is how the x-axis draw itself
+       */
+       virtual void Plot(wxDC& dc, mpWindow& w);
+       /** Check whether this layer has a bounding box.
+       This implementation returns \a FALSE thus making the ruler invisible
+       to the plot layer bounding box calculation by mpWindow.
+       */
+       virtual bool HasBBox() { return FALSE; }
+
+       DECLARE_CLASS (pPlotterScaleX)
+};
+
+#endif
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.cxx
new file mode 100644 (file)
index 0000000..96cf2cf
--- /dev/null
@@ -0,0 +1,103 @@
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pPlotterScaleY.h"
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+#define mpLN10 2.3025850929940456840179914546844
+
+IMPLEMENT_CLASS(pPlotterScaleY, pPlotterLayer)
+//----------------------------------------------------------------------------
+// Methods
+//----------------------------------------------------------------------------
+pPlotterScaleY::pPlotterScaleY(wxString aName,int flags) {
+
+       SetName(aName);/*
+       SetFont(*wxSMALL_FONT);
+       SetPen(*wxGREY_PEN);*/
+       wxFont ff( *wxSMALL_FONT);
+       wxPen pp( *wxGREY_PEN);
+       SetPen( pp );
+       SetFont( ff );
+}
+
+void pPlotterScaleY::Plot(wxDC& dc, mpWindow& w) 
+{
+
+       int divisions=20;
+       
+       dc.SetPen( m_pen);
+       dc.SetFont( m_font);
+       
+       //data
+       float min= (float)w.getMinScrY();
+       float max=(float)w.getMaxScrY();
+       float scrY=(float)w.GetScrY()-50;
+       double scaleY=(scrY/(max-min))*w.getZoomFactor();
+       int offsetpy=w.getOffsetPixelsY();
+       int offsetY=w.getOffsetY();
+
+
+       //setting origins
+       const int orgy   = w.GetScrY()-40;
+       const int extend = w.GetScrY()-50;
+       dc.SetDeviceOrigin(70,orgy);
+       dc.SetAxisOrientation(true,true);
+
+       //draw the axe
+       dc.DrawLine( 0,0, 0, (max-min)*scaleY);
+
+       //maximum value in Y
+       int d=max-min;
+       if(d<20)
+               {
+                       int k=d/divisions;
+                       while(k==0)
+                               {
+                                       divisions--;
+                                       k=d/divisions;
+                               }
+               }
+       float step=(max-min)/divisions;
+       
+
+       //drawing the axe with the numbers
+       wxString s;
+       //drawing the first line
+       dc.DrawLine(0,0,-10,0);
+       s.Printf(_T("%d"),(int)(min));
+       dc.DrawText(s,(wxCoord)-20,(wxCoord)0);
+       
+       
+       for(float i=0;i<=(max);i+=step)
+       {
+               
+               int p=(i-min-offsetY)*scaleY+offsetpy;
+               if(p>=0)
+               {       
+                       dc.DrawLine(0,p,-10,p);
+                       s.Printf(_T("%d"),(int)(i));
+                       dc.DrawText(s,(wxCoord)-20,(wxCoord)p);
+               }
+       }       
+       //drawing the last line
+       int p=(max-min-offsetY)*scaleY+offsetpy;
+       dc.DrawLine(0,p,-10,p);
+       s.Printf(_T("%d"),(int)(max));
+       dc.DrawText(s,(wxCoord)-20,(wxCoord)p);
+}
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterScaleY.h
new file mode 100644 (file)
index 0000000..035a8b3
--- /dev/null
@@ -0,0 +1,50 @@
+
+#ifndef __pPlotterScaleY_h__
+#define __pPlotterScaleY_h__
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+
+#include "pPlotterLayer.h"
+
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+class pPlotterScaleY: public pPlotterLayer
+{
+public:
+       /**
+       * Constructor of the class
+       */
+       pPlotterScaleY(wxString aName = wxT("Y"),int flags = mpALIGN_NE);
+
+       /**
+       * This is how the y-axis plot itself
+       */
+       virtual void Plot(wxDC& dc, mpWindow& w);
+       /** Check whether this layer has a bounding box.
+       This implementation returns \a FALSE thus making the ruler invisible
+       to the plot layer bounding box calculation by mpWindow.
+       */
+       virtual bool HasBBox() { return FALSE; }
+
+       DECLARE_CLASS (pPlotterScaleY)
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.cxx
new file mode 100644 (file)
index 0000000..57c5e2b
--- /dev/null
@@ -0,0 +1,1856 @@
+//----------------------------------------------------------------------------
+// Class definition include
+//----------------------------------------------------------------------------
+#include "pPlotterWindow.h"
+#include "MaximumsDialog.h"
+#include <iostream>
+#include <fstream>
+#include <string>
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include "wx/colordlg.h"
+//----------------------------------------------------------------------------
+//DECLARING THE NEW EVENT
+//wxEVT_TSBAR= event of the two side bar
+//----------------------------------------------------------------------------
+BEGIN_DECLARE_EVENT_TYPES()
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_CHANGED_FUNCTION, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_MOVE, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_ADD, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_DELETE, -1)
+DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_GUIDELINES, -1)
+END_DECLARE_EVENT_TYPES()
+
+//definitions
+DEFINE_EVENT_TYPE(wxEVT_PPLOTTER)
+DEFINE_EVENT_TYPE(wxEVT_PPLOTTER_CHANGED_FUNCTION)
+DEFINE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_MOVE)
+DEFINE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_ADD)
+DEFINE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_DELETE)
+DEFINE_EVENT_TYPE(wxEVT_PPLOTTER_GUIDELINES)
+
+
+//----------------------------------------------------------------------------
+// Class implementation
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(pPlotterWindow, mpWindow)
+
+//----------------------------------------------------------------------------
+// Event Table
+//----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(pPlotterWindow,mpWindow)
+EVT_MOTION (pPlotterWindow::onMouseMove)
+EVT_LEFT_DCLICK(pPlotterWindow::onChangeActual)
+EVT_LEFT_DOWN(pPlotterWindow::onAddPoint)
+EVT_MENU(pwID_DELPOINT, pPlotterWindow::onDeletePoint)
+EVT_MENU(pwID_SHOWPOINTS, pPlotterWindow::onShowPoints)
+EVT_MENU(pwID_STARTDRAWING, pPlotterWindow::onStartDrawing)
+//EVT_MENU(pwID_DELFUNCTION,pPlotterWindow::onDeleteFunction)
+EVT_MENU(pwID_STOPDRAWING, pPlotterWindow::onStopDrawing)
+EVT_MENU(pwID_ADDNEWPOINT, pPlotterWindow::onAddNewPoint)
+EVT_MENU(pwID_NOSHOWPOINTS, pPlotterWindow::onNoShowPoints)
+EVT_MENU(pwID_MYZOOMOUT,pPlotterWindow::onMyZoomOut)
+EVT_MENU(pwID_MYZOOMIN,pPlotterWindow::onMyZoomIn)
+EVT_MENU(pwID_SPLINE,pPlotterWindow::onSplinePoints)
+EVT_MENU(pwID_LINE,pPlotterWindow::onLine)
+EVT_MENU(pwID_SAVE,pPlotterWindow::onSave)
+EVT_MENU(pwID_LOAD,pPlotterWindow::onLoad)
+EVT_MENU(pwID_CHANGECOLOR,pPlotterWindow::onChangeColor)
+EVT_MENU( mpID_LINE_GUIDES, pPlotterWindow::OnGuideLines)
+EVT_MENU( pwID_TRASLATEACTUALFUNCTION, pPlotterWindow::onMoveFunction)
+EVT_LEFT_UP(pPlotterWindow::onLeftUp)
+END_EVENT_TABLE()
+
+//----------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------
+
+pPlotterWindow::pPlotterWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag )
+: mpWindow( parent, id, pos, size, flag)
+{
+       drawing=false;
+       movingPointIndex=-1;
+       actual=NULL;
+       scaleWay=DEFAULT_SCALE;
+       zoomFactor=1;
+       //drawGuideLines=true;
+       type=DEFAULT_PLOTTER;
+       drawGuides=false;
+       movingFunction=false;
+       initialMovingCLick=-1;
+       movingPoints=false;
+       
+       /*
+       PopMenu options
+       */
+       m_popmenu.Remove( mpID_ZOOM_IN);
+       m_popmenu.Remove( mpID_ZOOM_OUT);
+       m_popmenu.Remove( mpID_CENTER);
+       m_popmenu.Remove( mpID_FIT);
+       m_popmenu.Remove( mpID_LOCKASPECT);
+
+       m_popmenu.Append(pwID_STARTDRAWING ,   _("Start Drawing"),    _("Starts to draw a new function"));//it changes the actual function
+       m_popmenu.Append(pwID_STOPDRAWING ,   _("Stop drawing"),    _("Stops of drawing the new function"));
+       m_popmenu.Append(pwID_LOAD,   _("Load"),    _("Load the actual function from a plane file"));
+       m_popmenu.Append(pwID_SHOWPOINTS ,   _("Show Points"),    _("shows the discrete points of the function"));
+       m_popmenu.Append(pwID_NOSHOWPOINTS,  _("No show Points"),    _("Dont show the points of the function"));
+       m_popmenu.Append(pwID_ADDNEWPOINT,   _("Add point"),    _("Add New point to the actual function"));
+       m_popmenu.Append(pwID_DELPOINT ,   _("Delete point"),    _("Deletes a point from the actual function."));
+       m_popmenu.Append(pwID_MYZOOMIN,   _("Zoom in"),    _("Zoom in the points of the function"));
+       m_popmenu.Append(pwID_MYZOOMOUT,   _("Zoom out"),    _("Zoom out the points of the function"));
+       m_popmenu.Append(pwID_SPLINE,   _("Smooth"),    _("Splines the points ofthe actual curve"));
+       m_popmenu.Append(pwID_LINE,   _("Line"),    _("Piecewise the points ofthe actual curve"));      
+       m_popmenu.Append(pwID_SAVE,   _("Save"),    _("Save the actual function in plane file"));       
+       m_popmenu.Append(pwID_CHANGECOLOR,   _("Change Color"),    _("Change the color of the function"));              
+       m_popmenu.Append(pwID_TRASLATEACTUALFUNCTION, _("Start Moving Function"),  _("Move the actual Function"));
+       
+       m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+       m_popmenu.Enable(pwID_ADDNEWPOINT,false);
+       m_popmenu.Enable(pwID_SHOWPOINTS,false);
+       m_popmenu.Enable(pwID_DELPOINT,false);
+       m_popmenu.Enable(pwID_STOPDRAWING,false);
+       m_popmenu.Enable(pwID_MYZOOMIN,false);
+       m_popmenu.Enable(pwID_MYZOOMOUT,false);
+       m_popmenu.Enable(pwID_SPLINE,false);
+       m_popmenu.Enable(pwID_LINE,false);
+       m_popmenu.Enable(pwID_SAVE,false);
+       m_popmenu.Enable(pwID_LOAD,true);
+       m_popmenu.Enable(pwID_CHANGECOLOR,false);
+       m_popmenu.Enable(pwID_STARTDRAWING,true);
+       m_popmenu.Enable(pwID_LOAD,true);
+       //m_popmenu.Enable(pwID_STARTDRAWING,false);
+       m_popmenu.Enable(mpID_LINE_GUIDES,false);
+       m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,false);
+       
+        
+}
+
+
+pPlotterWindow::~pPlotterWindow()
+{
+}
+//----------------------------------------------------------------------------
+// Methods
+//----------------------------------------------------------------------------
+
+/**
+* Sets the actual function
+*/
+void  pPlotterWindow::setActualFunction(pGraphicalFunction* newActual)
+{
+       if(actual!=NULL)
+               actual->setActual(false);
+       newActual->setActual(true);
+       actual=newActual;
+}
+
+/**
+* Gets the actual function
+*/
+pGraphicalFunction* pPlotterWindow:: getActualFunction()
+{
+       return actual;
+}
+
+/**
+* Transform the point clicked  from window
+* to the real value,given by the scale
+* Pre: m_scaleX and m_scaleY are already actualized
+* with setActualScales() method
+*/
+wxPoint pPlotterWindow:: getRealPoint(wxPoint pixelPoint)
+{
+       int x,y;        
+       x=pixelPoint.x-70;
+       y=pixelPoint.y-40;                      
+       //real point on the function
+       wxPoint realPoint;
+       int xS=(x-offsetPixelX)/m_scaleX + offsetX + minScrX;
+       int yS=(y-offsetPixelY)/m_scaleY + offsetY + minScrY;
+       
+       if(xS<=maxScrX && yS<=maxScrY )
+       {
+               //setActualScales();
+               realPoint.x= xS;
+               realPoint.y= yS;                
+       }
+       else
+       {
+               realPoint.x= -1;
+               realPoint.y= -1;                
+       }
+       return realPoint;
+}
+/*
+ Set the scales according to the size of the window
+ and the maximum given by the user
+*/
+
+void pPlotterWindow::setActualScales()
+{
+       int maxX,maxY;//,minX,minY;
+       /*
+       if the function is drawed interactively the maxX and the 
+       maxY in actual are sets by the user
+       */
+       /*
+       maxX=actual->getMaxX();
+       maxY=actual->getMaxY();
+
+       int dx=maxX;
+       int dy=maxY;
+       
+       */
+       int dx=actual->getMaxXShowed()-actual->getMinXShowed();
+       int dy=actual->getMaxYShowed()-actual->getMinYShowed();
+       
+       if(dx!=0 && dy!=0)
+       {
+               m_scaleX= (((float)m_scrX-100)/dx)*zoomFactor;
+               m_scaleY= (((float)m_scrY-50)/dy)*zoomFactor;
+       }
+       //setting the maximums and minimums showed in the window
+       /*
+       setMaxScrX(maxX);
+       setMaxScrY(maxY);
+       */
+       setMaxScrX(actual->getMaxXShowed());
+       setMinScrX(actual->getMinXShowed());
+       setMaxScrY(actual->getMaxYShowed());
+       setMinScrY(actual->getMinYShowed());
+       actual->setScreens(m_scrX,m_scrY);
+       actual->setScales();
+}
+//-------------------------
+// Methods for interaction
+//-------------------------
+
+       //------------------------------------
+       //      Manipulating clicks on the plotter
+       //-------------------------------------
+       
+
+       /*
+               Manipulating clicks on the plotter
+       */
+       void pPlotterWindow::onLeftUp(wxMouseEvent& event)
+       {
+               movingPoints=false;
+               movingPointIndex=-1;
+       }
+
+
+
+       //-------------------------------
+       //Traslating the actual function
+       //-------------------------------
+       /*
+        Move the actual function  when the user
+        is moving the mouse
+       */
+       void pPlotterWindow::onMoveFunction(wxCommandEvent& aEvent)
+       {
+               if(movingFunction)
+               {
+                       movingFunction=false;
+                       m_popmenu.SetLabel(pwID_TRASLATEACTUALFUNCTION, _("Start Moving Function"));
+               }
+               else
+               {
+                       movingFunction=true;
+                       m_popmenu.SetLabel(pwID_TRASLATEACTUALFUNCTION, _("Stop Moving Function"));
+               }
+       }
+
+//-----------------------
+// Color Function
+//-----------------------
+
+
+       /**
+       * Change the color of the function
+       */
+void pPlotterWindow::onChangeColor(wxCommandEvent& aEvent)
+       {
+                       
+               wxColour colour;
+               wxColourData data;
+               wxColourDialog dialog(this, &data);
+
+               if ( dialog.ShowModal() == wxID_OK )
+               {
+                       colour = dialog.GetColourData().GetColour();
+               }
+       
+               wxPen mypen(colour);
+               mypen.SetWidth(2);
+               actual->SetPen( mypen);
+               UpdateAll();
+       }
+
+
+//----------------------
+//Persistence
+//----------------------
+       
+
+       /**
+       * Load the function from a .txt file
+       */
+       void pPlotterWindow::onLoad(wxCommandEvent& aEvent)
+       {
+               
+               actual=new pGraphicalFunction(wxT("f(x) = function1(x)"),mpALIGN_NE);
+               actual->setActual(true);
+               actual->setFromWindow(false);
+               actual->SetDrawing(drawing);
+               actual->setFactorZoom(zoomFactor);
+               
+               wxPen mypen(*wxRED, 5, wxSOLID);
+               mypen.SetWidth(2);
+               actual->SetPen( mypen);
+                               
+               wxString nameF=wxFileSelector(_T("Save Function"));
+               actual->load(nameF);
+               AddLayer(actual);
+               
+               functions.Append(actual);
+               addFunctionToMove(actual);
+               
+               m_popmenu.Enable(pwID_STARTDRAWING,true);
+               
+               UpdateAll();
+
+               //------------------------------------------
+               //Sending the paarticular event of changed actual function
+               //-------------------------------------------
+               wxCommandEvent cevent( wxEVT_PPLOTTER_CHANGED_FUNCTION, GetId() );
+               cevent.SetEventObject(this);
+        GetEventHandler()->ProcessEvent( cevent );
+       }
+
+
+       /**
+       * Save the points of the function in a .txt file
+       */
+       void pPlotterWindow::onSave(wxCommandEvent& aEvent)
+       {
+               wxString nameF=wxFileSelector(_T("Save Function"));
+               actual->save(nameF);
+       }
+
+//-----------------------
+// Spline
+//----------------------
+/**
+* Spline the points of the actual curve
+*/
+
+void pPlotterWindow::onSplinePoints(wxCommandEvent& aEvent)
+{
+       actual->setType(2);
+       actual->initializeSplines();
+       actual->initializeSplineVectors();
+       UpdateAll();
+       m_popmenu.Enable(pwID_SPLINE,false);
+       m_popmenu.Enable(pwID_LINE,true);
+}
+
+/**
+* Change the type of drawing of the actual function
+* to a piecewise function
+*/
+void pPlotterWindow::onLine(wxCommandEvent& aEvent)
+{
+       actual->clearSplineVectors();
+       actual->setType(1);
+       UpdateAll();
+       m_popmenu.Enable(pwID_SPLINE,true);
+       m_popmenu.Enable(pwID_LINE,false);
+
+}
+
+//--------------------------
+// Zooming
+//---------------------------
+
+/**
+* Zoom out the functions
+*/
+void pPlotterWindow::onMyZoomOut(wxCommandEvent& aEvent)
+{
+       wxNode* node=functions.GetFirst();
+       zoomFactor=zoomFactor*(float)(1/(float)ZOOM_FACTOR);
+       while(node)
+       {
+               pGraphicalFunction* f= (pGraphicalFunction*)node->GetData();
+               
+               f->setScreenX(m_scrX);
+               f->setScreenY(m_scrY);
+
+               
+               if(zoomFactor>1.01)
+               {       
+                       f->setOffsets(m_clickedX-70,m_scrY-m_clickedY-40);
+                       f->setFactorZoom(zoomFactor);
+               }
+               
+               else
+               {
+                       f->setOffsetPixelX(0);
+                       f->setOffsetPixelY(0);
+                       f->setOffsetX(0);
+                       f->setOffsetY(0);
+                       f->setFactorZoom(zoomFactor);
+               }
+               
+
+               if(f->getActual())
+               {
+                       //TODO: send a event of resize
+                       //setMinScrX(f->getMinXShowed());
+                       //setMinScrY(f->getMinYShowed());
+                       setOffsetPixelX(f->getOffsetPixelsX());
+                       setOffsetPixelY(f->getOffsetPixelsY());
+                       setOffsetX(f->getOffsetX());
+                       setOffsetY(f->getOffsetY());
+               }
+               node=node->GetNext();
+       }
+       UpdateAll();
+}
+/**
+* Zoom in the functions
+*/
+void pPlotterWindow::onMyZoomIn(wxCommandEvent& aEvent)
+{
+               
+       zoomFactor=zoomFactor*(float)ZOOM_FACTOR;
+       wxNode* node=functions.GetFirst();
+       while(node)
+       {
+               pGraphicalFunction* f= (pGraphicalFunction*)node->GetData();
+               if(zoomFactor > 1.01)
+               {       
+                       f->setScreenX(m_scrX);
+                       f->setScreenY(m_scrY);
+                       f->setOffsets(m_clickedX-70,m_scrY-m_clickedY-40);
+                       f->setFactorZoom(zoomFactor);
+               }
+               else 
+               {
+                       f->setOffsetPixelX(0);
+                       f->setOffsetPixelY(0);
+                       f->setOffsetX(0);
+                       f->setOffsetY(0);
+                       f->setFactorZoom(zoomFactor);
+               }
+               if(f->getActual())
+               {
+                       //TODO: send an event of resize
+                       //setMinScrX(f->getMinXShowed());
+                       //setMinScrY(f->getMinYShowed());
+                       setOffsetPixelX(f->getOffsetPixelsX());
+                       setOffsetPixelY(f->getOffsetPixelsY());
+                       setOffsetX(f->getOffsetX());
+                       setOffsetY(f->getOffsetY());
+
+               }
+               
+               node=node->GetNext();
+       }
+
+       UpdateAll();
+}
+
+
+//-------------------------
+// Drawing
+//-------------------------
+
+
+/**
+* Let to the user to start drawing
+*/
+void pPlotterWindow::onStartDrawing(wxCommandEvent& aEvent)
+{
+
+       if(actual!=NULL)
+       {
+               actual->setActual(false);
+               if(actual->getShowPoints())
+                       actual->SetShowPoints(false);
+       }       
+       m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+       m_popmenu.Enable(pwID_ADDNEWPOINT,false);
+       m_popmenu.Enable(pwID_SHOWPOINTS,false);
+       m_popmenu.Enable(pwID_DELPOINT,false);
+       m_popmenu.Enable(pwID_MYZOOMIN,false);
+       m_popmenu.Enable(pwID_MYZOOMOUT,false);
+       m_popmenu.Enable(pwID_STARTDRAWING,false);
+       m_popmenu.Enable(pwID_SPLINE,false);
+       m_popmenu.Enable(pwID_LINE,false);
+       m_popmenu.Enable(pwID_STOPDRAWING,true);
+       m_popmenu.Enable(pwID_SAVE,false);
+       m_popmenu.Enable(pwID_LOAD,false);
+       m_popmenu.Enable(pwID_CHANGECOLOR,false);
+       m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,false);
+
+       if(!drawing)
+       {
+               drawing=true;
+               
+               
+               actual=new pGraphicalFunction(wxT("f(x) = function1(x)"),mpALIGN_NE);
+               actual->setActual(true);
+               actual->setFromWindow(true);
+               actual->setScaleWay(USER_SCALE);
+               actual->SetDrawing(drawing);
+               actual->setFactorZoom(zoomFactor);
+               
+               //we change the offsets
+               setOffsetPixelX(actual->getOffsetPixelsX());
+               setOffsetPixelY(actual->getOffsetPixelsY());
+               setOffsetX(actual->getOffsetX());
+               setOffsetY(actual->getOffsetY());
+       
+               AddLayer(actual);
+               wxPen mypen(*wxRED, 5, wxSOLID);
+               mypen.SetWidth(2);
+               actual->SetPen( mypen);
+               
+               /*
+               int result = wxMessageBox("Do you Want a Smooth Curve?", "Spline Points", wxYES_NO | wxCANCEL);
+               if(result==wxYES)
+               {
+                       actual->setType(2);
+               }
+               */
+               
+               /**************************************************************************/
+               // Setting Maximums
+               /**************************************************************************/
+       
+               //opening  the dialog of maximums
+               float maxX=0,maxY=0;
+               MaximumsDialog *dlg=new MaximumsDialog(this,_T("Set Maximums"));
+               
+               if(dlg->ShowModal()== wxID_OK )
+               {
+                       maxX=dlg->getXValue();
+                       maxY=dlg->getYValue();
+                       if(maxX>0 && maxY>0 && actual->getFromWindow())
+                       {
+                               setMaxScrX(maxX);
+                               setMaxScrY(maxY);
+                               
+                               actual->setMaxX(maxScrX);                               
+                               actual->setMinX(minScrX);
+                               actual->setMaxY(maxY);
+                               actual->setMinY(0);
+                               
+                               actual->setMinShowedX(0);
+                               actual->setMinShowedY(0);
+                               actual->setMaxShowedX(maxX);
+                               actual->setMaxShowedY(maxY);
+                               
+                               setActualScales();
+                       }
+                       else if(maxX<0 || maxY<0)
+                       {
+                                wxMessageBox(_T("Both numbers have to be positive, please enter valid numbers"), _T("Error"),
+                            wxOK);
+                                
+                                DelLayer(actual);
+                                actual=NULL;
+                                               
+                               m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+                               m_popmenu.Enable(pwID_ADDNEWPOINT,false);
+                               m_popmenu.Enable(pwID_SHOWPOINTS,false);
+                               m_popmenu.Enable(pwID_DELPOINT,false);
+                               m_popmenu.Enable(pwID_MYZOOMIN,false);
+                               m_popmenu.Enable(pwID_MYZOOMOUT,false);
+                               m_popmenu.Enable(pwID_STARTDRAWING,true);
+                               m_popmenu.Enable(pwID_SPLINE,false);
+                               m_popmenu.Enable(pwID_LINE,false);
+                               m_popmenu.Enable(pwID_STOPDRAWING,false);
+                               m_popmenu.Enable(pwID_SAVE,false);
+                               m_popmenu.Enable(pwID_LOAD,true);
+                               m_popmenu.Enable(pwID_CHANGECOLOR,false);
+                               m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,false);
+                               drawing=false;
+                               //actual->SetDrawing(false);
+
+                       }
+
+                       else if(maxX==0 && maxY==0)
+                       {
+                               actual->setMaxX(100);
+                               actual->setMinX(0);
+                               actual->setMaxY(100);
+                               actual->setMinY(0);
+                                       
+                               actual->setMinShowedX(0);
+                               actual->setMinShowedY(0);
+                               actual->setMaxShowedX(100);
+                               actual->setMaxShowedY(100);
+
+                               maxScrX=100;
+                               maxScrY=100;
+                               minScrX=0;
+                               minScrY=0;
+
+                               setActualScales();
+                       }
+                       
+               }
+               
+        else if(dlg->ShowModal()== wxID_CANCEL)
+               {
+                       DelLayer(actual);
+                       actual=NULL;
+                                       
+                       m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+                       m_popmenu.Enable(pwID_ADDNEWPOINT,false);
+                       m_popmenu.Enable(pwID_SHOWPOINTS,false);
+                       m_popmenu.Enable(pwID_DELPOINT,false);
+                       m_popmenu.Enable(pwID_MYZOOMIN,false);
+                       m_popmenu.Enable(pwID_MYZOOMOUT,false);
+                       m_popmenu.Enable(pwID_STARTDRAWING,true);
+                       m_popmenu.Enable(pwID_SPLINE,false);
+                       m_popmenu.Enable(pwID_LINE,false);
+                       m_popmenu.Enable(pwID_STOPDRAWING,false);
+                       m_popmenu.Enable(pwID_SAVE,false);
+                       m_popmenu.Enable(pwID_LOAD,true);
+                       m_popmenu.Enable(pwID_CHANGECOLOR,false);
+                       m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,false);
+                       drawing=false;
+                       //actual->SetDrawing(false);
+
+               }
+               dlg->Destroy();
+               if(drawing)
+               {
+                       //------------------------------------------
+                       //Sending the paarticular event of changed actual function
+                       //-------------------------------------------
+                       wxCommandEvent cevent( wxEVT_PPLOTTER_CHANGED_FUNCTION, GetId() );
+                       cevent.SetEventObject(this);
+                       GetEventHandler()->ProcessEvent( cevent );
+               }
+       }
+       
+}
+/**
+Stop the drawing of the actual function
+*/
+void pPlotterWindow::onStopDrawing(wxCommandEvent& aEvent)
+{
+       drawing=false;
+       actual->SetDrawing(drawing);
+       functions.Append(actual);
+       addFunctionToMove(actual);
+       m_popmenu.Enable(pwID_ADDNEWPOINT,true);
+       m_popmenu.Enable(pwID_DELPOINT,true);
+       m_popmenu.Enable(pwID_SHOWPOINTS,true);
+       m_popmenu.Enable(pwID_MYZOOMIN,true);
+       m_popmenu.Enable(pwID_MYZOOMOUT,true);
+       m_popmenu.Enable(pwID_STARTDRAWING,true);
+       m_popmenu.Enable(pwID_SPLINE,true);
+       m_popmenu.Enable(pwID_STOPDRAWING,false);
+       m_popmenu.Enable(pwID_LINE,false);
+       m_popmenu.Enable(pwID_CHANGECOLOR,true);
+       m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,true);
+
+       if(actual->getSizePoints()==0||actual->getSizePoints()==1)
+       {         
+       
+         m_popmenu.Enable(pwID_ADDNEWPOINT,false);
+         //functions.DeleteObject(actual);
+         DelLayer(actual);
+         actual=NULL;   
+        
+       }
+       
+       UpdateAll();
+}
+/**
+* The user wants to see the points(given) of the function
+*/
+void pPlotterWindow::onShowPoints(wxCommandEvent& aEvent)
+{
+       actual->SetShowPoints(true);
+       m_popmenu.Enable(pwID_NOSHOWPOINTS,true);
+       m_popmenu.Enable(pwID_SHOWPOINTS,false);        
+       UpdateAll();
+}
+/**
+* The user doesnt want see the points of the function
+*/
+void pPlotterWindow::onNoShowPoints(wxCommandEvent& aEvent)
+{      
+       actual->SetShowPoints(false);
+       m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+       m_popmenu.Enable(pwID_SHOWPOINTS,true);
+       UpdateAll();    
+}
+/**
+* if the user is going to add a point to the function
+*/
+void pPlotterWindow::onAddPoint(wxMouseEvent& aEvent)
+{
+       
+       wxPoint point=aEvent.GetPosition();
+       
+       point.y=m_scrY-point.y;
+       wxPoint realPoint=getRealPoint(point);
+
+       bool isAValidPoint=realPoint.x>=0 && realPoint.y>=0;
+
+       if(isAValidPoint && drawing)
+       {
+               if(actual->AddPoint(realPoint.x,realPoint.y))
+               {
+                       text = wxString::Format(_T("added  point ( %d, %d)\n"), realPoint.x, realPoint.y);
+                       
+                       //m_log->AppendText(text);
+
+                       //if the function is smooth
+                       if(actual->getType()==2)
+                       {
+                               actual->clearSplineVectors();
+                               actual->addSplinesPoints();
+                               actual->initializeSplineVectors();                              
+                       }
+                       
+                       UpdateAll();
+               }
+       }
+       else if(isAValidPoint && !drawing && aEvent.m_shiftDown && actual!=NULL)
+       {
+               if(actual->AddNewPoint(realPoint.x,realPoint.y))
+               {
+                       text = wxString::Format(_T("added  point ( %d, %d)\n"), realPoint.x, realPoint.y);
+                       //if the function is smooth
+                       if(actual->getType()==2)
+                       {
+                               actual->clearSplineVectors();
+                               actual->addSplinesPoints();
+                               actual->initializeSplineVectors();                              
+                       }
+                       
+                       UpdateAll();
+               }
+       }
+       //made a click for moving the points
+       else if(!movingPoints)
+       {
+               if(actual)      
+                       movingPointIndex=actual->validPointOnFunction(realPoint);
+               if(movingPointIndex>=0)
+                       movingPoints=true;
+       }
+                                       
+       //------------------------------------------
+       //Sending the  event
+       //-------------------------------------------
+       wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_ADD, GetId() );
+       cevent.SetEventObject(this);
+
+       //------------------------------------------
+       //Sending the  general event
+       //-------------------------------------------
+       wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+       pevent.SetEventObject(this);
+       //send the events
+       GetEventHandler()->ProcessEvent( cevent );
+       GetEventHandler()->ProcessEvent( pevent );
+}
+
+/**
+* Adds a point  to the function after the definition of the initial points of the function
+* know this point is  a point of the function
+*
+*/
+void pPlotterWindow::onAddNewPoint(wxCommandEvent& aEvent)
+{
+       wxPoint point;
+       point.x=m_clickedX;
+       point.y=m_scrY-m_clickedY;
+
+       wxPoint realPoint=getRealPoint(point);
+       bool isAValidPoint=realPoint.x>=0 && realPoint.y>=0;
+
+       
+       if(isAValidPoint && actual->AddNewPoint(realPoint.x,realPoint.y))
+       {
+               text = wxString::Format(_T("added  point ( %d, %d)\n"), realPoint.x, realPoint.y);
+               //if the function is smooth
+               if(actual->getType()==2)
+               {
+                       actual->clearSplineVectors();
+                       actual->addSplinesPoints();
+                       actual->initializeSplineVectors();
+                       
+               }
+               UpdateAll();
+               //------------------------------------------
+               //Sending the  event
+               //-------------------------------------------
+               wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_ADD, GetId() );
+               cevent.SetEventObject(this);
+
+               //------------------------------------------
+               //Sending the  general event
+               //-------------------------------------------
+               wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+               pevent.SetEventObject(this);
+               //send the events
+               GetEventHandler()->ProcessEvent( cevent );
+               GetEventHandler()->ProcessEvent( pevent );
+
+       }
+}
+
+/**
+* if the user is going to delete a point of the function
+*/
+void pPlotterWindow::onDeletePoint(wxCommandEvent& aEvent)
+{
+       wxPoint point;
+       point.x=m_clickedX;
+       point.y=m_scrY-m_clickedY;
+
+       //actual->setScreenX(m_scrX);
+       //actual->setScreenY(m_scrY);
+
+       wxPoint realPoint=getRealPoint(point);
+       
+       bool isAValidPoint=realPoint.x>=0 && realPoint.y>=0;
+
+       //this method verify a sensible region in every point of actual
+       int pointIndex=actual->validPointOnFunction(realPoint);
+       if(isAValidPoint && actual->deletePointAt(pointIndex))
+       {
+               setActualScales();
+               if(actual->getSizePoints()==0)
+               {
+                       //functions.DeleteObject(actual);
+                       //DelLayer(actual);
+                       //actual=NULL;
+               }
+               //if the function is smooth
+               if(actual->getType()==2)
+               {
+                       actual->clearSplineVectors();
+                       actual->addSplinesPoints();
+                       actual->initializeSplineVectors();
+                       
+               }
+               text = wxString::Format(_T("deleted  point ( %d, %d)\n"), realPoint.x, realPoint.y);
+               UpdateAll();
+               //------------------------------------------
+               //Sending the  event
+               //-------------------------------------------
+               wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_DELETE, GetId() );
+               cevent.SetEventObject(this);
+               //------------------------------------------
+               //Sending the  general event
+               //-------------------------------------------
+               wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+               pevent.SetEventObject(this);
+               //send the events
+               GetEventHandler()->ProcessEvent( cevent );
+               GetEventHandler()->ProcessEvent( pevent );
+       }  
+}
+
+
+/**
+* If the mouse is moving in the plot area
+* is because the user is moving a point of the current curve
+* the user has to call before show points, to see the points of the 
+* function
+*/
+
+void pPlotterWindow::onMouseMove(wxMouseEvent& event)
+{
+       wxPoint point=event.GetPosition();
+       bool change=false;
+       point.y=m_scrY-point.y;
+       
+       wxPoint realPoint=getRealPoint(point);
+       bool isAValidPoint=realPoint.x>=0 && realPoint.y>=0;
+
+       if(isAValidPoint && !drawing && actual!=NULL && !movingFunction && movingPoints)
+       {
+               //never is going to get in
+               if(movingPointIndex==-1)
+               {       
+                       //this method verify a sensible region in every point of _actualFunction
+                       movingPointIndex=actual->validPointOnFunction(realPoint);
+                                       
+               }
+               else if(event.LeftIsDown())
+               {                               
+                       
+                       /*if((movingPointIndex-1)>=0 && (movingPointIndex+1)<actual->getSizePoints() && actual->getEditable())
+                       {
+                               wxNode* next= actual->GetPointAt(movingPointIndex+1);
+                               wxNode* before=actual->GetPointAt(movingPointIndex-1);
+                               if(next)
+                               {       
+                                       pFunctionPoint* np=(pFunctionPoint*)(next->GetData());
+                                       if(np)
+                                               {
+                                                       int n=np->getRealX();
+                                                       if(realPoint.x>n)
+                                                       {
+                                                               wxPoint p;
+                                                               p.x=np->getRealX()-1;
+                                                               p.y=realPoint.y;
+                                                               change=actual->changePoint(p,movingPointIndex);
+                                                               if(change)
+                                                               {
+                                                                       setActualScales();
+                                                                                                                       
+                                                                       //if the function is smooth
+                                                                       if(actual->getType()==2)
+                                                                       {
+                                                                               actual->clearSplineVectors();
+                                                                               actual->addSplinesPoints();
+                                                                               actual->initializeSplineVectors();
+                                                                               
+                                                                       }
+                                                                       
+                                                                       text = wxString::Format(_T("Moved  point ( %d, %d)\n"), p.x, p.y);
+                                                                       UpdateAll();
+                                                                       //------------------------------------------
+                                                                       //Sending the particular event
+                                                                       //-------------------------------------------
+                                                                       wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_MOVE, GetId() );
+                                                                       cevent.SetEventObject(this);
+
+                                                                       //------------------------------------------
+                                                                       //Sending the  general event
+                                                                       //-------------------------------------------
+                                                                       wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+                                                                       pevent.SetEventObject(this);
+
+                                                                       //send the events
+                                                                       GetEventHandler()->ProcessEvent( cevent );
+                                                                       GetEventHandler()->ProcessEvent( pevent );
+                                                               }
+                                                       }
+                                               }
+                               }
+                               if(before)
+                               {
+                                       pFunctionPoint* bp=(pFunctionPoint*)(before->GetData());        
+                                       if(bp)
+                                        { 
+                                                int b=bp->getRealX();
+                                                if(realPoint.x<b)
+                                               {
+                                                       wxPoint p;
+                                                       p.x=bp->getRealX()+1;
+                                                       p.y=realPoint.y;
+                                                       change=actual->changePoint(p,movingPointIndex);
+                                                       if(change)
+                                                       {
+                                                               setActualScales();
+                                                               //if the function is smooth
+                                                               if(actual->getType()==2)
+                                                               {
+                                                                       actual->clearSplineVectors();
+                                                                       actual->addSplinesPoints();
+                                                                       actual->initializeSplineVectors();
+                                                                       
+                                                               }
+                                                               text = wxString::Format(_T("Moved  point ( %d, %d)\n"), p.x, p.y);
+                                                               UpdateAll();
+                                                               //------------------------------------------
+                                                               //Sending the particular event
+                                                               //-------------------------------------------
+                                                               wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_MOVE, GetId() );
+                                                               cevent.SetEventObject(this);
+
+                                                               //------------------------------------------
+                                                               //Sending the  general event
+                                                               //-------------------------------------------
+                                                               wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+                                                               pevent.SetEventObject(this);
+
+                                                               //send the events
+                                                               GetEventHandler()->ProcessEvent( cevent );
+                                                               GetEventHandler()->ProcessEvent( pevent );
+                                                       }
+
+                                               }
+                                         }
+                               }       
+                       }       */
+                       // SIL ******************************************************************* // SIL
+                       if((movingPointIndex-1)>=0 && (movingPointIndex+1)<actual->getSizePoints() && actual->getEditable())
+                       {
+                               change=actual->changePoint(realPoint,movingPointIndex);
+                       }
+                       if(change)
+                       {
+                               setActualScales();
+                               //if the function is smooth
+                               if(actual->getType()==2)
+                               {
+                                       actual->clearSplineVectors();
+                                       actual->addSplinesPoints();
+                                       actual->initializeSplineVectors();                                      
+                               }
+                               text = wxString::Format(_T("Moved  point ( %d, %d)\n"), realPoint.x, realPoint.y);
+                               UpdateAll();
+                               //------------------------------------------
+                               //Sending the particular event
+                               //-------------------------------------------
+                               wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_MOVE, GetId() );
+                               cevent.SetEventObject(this);
+
+                               //------------------------------------------
+                               //Sending the  general event
+                               //-------------------------------------------
+                               wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+                               pevent.SetEventObject(this);
+
+                               //send the events
+                               GetEventHandler()->ProcessEvent( cevent );
+                               GetEventHandler()->ProcessEvent( pevent );
+                       }
+                       // SIL ******************************************************************* // SIL
+
+                       //change the point that is in the index, returns true if could be changed.
+                       if(!change && actual->changePoint(realPoint,movingPointIndex)&& actual->getEditable())
+                       {
+                               setActualScales();
+                               //if the function is smooth
+                               if(actual->getType()==2)
+                               {
+                                       actual->clearSplineVectors();
+                                       actual->addSplinesPoints();
+                                       actual->initializeSplineVectors();
+                                       
+                               }
+                               text = wxString::Format(_T("Moved  point ( %d, %d)\n"), realPoint.x,realPoint.y);
+                               
+                               UpdateAll();
+
+                               //------------------------------------------
+                               //Sending the particular event
+                               //-------------------------------------------
+                               wxCommandEvent cevent( wxEVT_PPLOTTER_POINT_MOVE, GetId() );
+                               cevent.SetEventObject(this);
+
+                               //------------------------------------------
+                               //Sending the  general event
+                               //-------------------------------------------
+                               wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+                               pevent.SetEventObject(this);
+
+                               //send the events
+                               GetEventHandler()->ProcessEvent( cevent );
+                               GetEventHandler()->ProcessEvent( pevent );
+                       }
+               }
+               else
+               {
+                       movingPointIndex=-1;
+                       movingPoints=false;
+               }
+       }
+       //if the user is drawing
+       else if(isAValidPoint && drawing)
+       {
+
+               actual->SetMousePoint(realPoint);               
+               UpdateAll();
+       }
+       //is moving the function
+       else if(isAValidPoint && movingFunction && actual!=NULL)
+       {
+               actual->setScreenX(m_scrX);
+               actual->setScreenY(m_scrY);
+               int j=0;
+               if((initialMovingCLick==-1) && event.LeftIsDown()  )
+                {
+                       if(actual->isInFunction(realPoint.x,realPoint.y))
+                       {
+                               initialMovingCLick=event.GetPosition().x;
+                               int numPoints=actual->getSizePoints();
+                               int i=0;
+                               backUpActualVector.clear();
+                               while(i<numPoints)
+                               {
+                                       //if(i>0 && i< (numPoints-1))
+                                       //{
+                                               wxNode* pointNode=actual->GetPointAt(i);
+                                               pFunctionPoint* point= (pFunctionPoint*)pointNode->GetData();
+                                               backUpActualVector.push_back(point->getRealX());
+                                               
+                                       //}
+                                       i++;
+                               }
+                       }
+                }      
+               else if(event.LeftIsDown())
+               {
+                       wxPoint aux(initialMovingCLick,0);
+
+                       wxPoint p1r=getRealPoint(event.GetPosition());
+                       wxPoint p2r=getRealPoint(aux);
+
+                       double delta = p1r.x-p2r.x;
+                       int numPoints=actual->getSizePoints();
+                       int i=0;
+                       wxPoint p;
+                       if(type==HISTOGRAM)
+                       {
+                               while(i<numPoints)
+                               {
+                                       if(i>0 && i<(numPoints-1))
+                                       {
+                                               wxNode* pointNode=actual->GetPointAt(i);
+                                               pFunctionPoint* point= (pFunctionPoint*)pointNode->GetData();
+                                               int xNew=backUpActualVector[i]+delta;
+                                               //it has to preserve the state of functin                               
+                                               if(backUpActualVector[0]<xNew && backUpActualVector[numPoints-1]>xNew)
+                                                               point->setRealX(xNew);
+                                       }
+                                       i++;
+                               }
+                       }
+                       else
+                       {
+                               i=0;
+                               while(i<numPoints)
+                               {
+                               
+                                       wxNode* pointNode=actual->GetPointAt(i);
+                                       pFunctionPoint* point= (pFunctionPoint*)pointNode->GetData();
+                                       int xNew=backUpActualVector[i]+delta;
+                                       point->setRealX(xNew);
+                                       i++;
+                               }
+                       }
+                       //If is a spline
+                       if(actual->getType()==2)
+                       {
+                               actual->clearSplineVectors();
+                               actual->addSplinesPoints();
+                               actual->initializeSplineVectors();
+
+                       }
+                       UpdateAll();
+
+               }
+               else 
+               {       
+                       initialMovingCLick=-1;
+               }
+               
+       }
+}
+/**
+* if the user give us a double click is because he wants to change
+* the actual function to the function that has that point
+*/
+void pPlotterWindow::onChangeActual(wxMouseEvent& event)
+{
+       wxString text = _T("\n points \n");
+       
+       
+       if(!drawing)
+       {
+               //we have to call showpoints before changing the function
+               wxPoint point=event.GetPosition();
+               /*****************************/
+               point.y=m_scrY-point.y;
+               /*****************************/
+       
+       
+               
+               //real point on the function
+               wxPoint realPoint;//=getRealPoint(point);
+               bool isAValidPoint=realPoint.x>=0 && realPoint.y>=0;
+               if(isAValidPoint)
+               {
+                       wxNode * node= functions.GetFirst();
+                       while (node)
+                       {
+                               pGraphicalFunction* fnode=(pGraphicalFunction*)node->GetData();
+                               
+                               
+                               int maxX=fnode->getMaxXShowed();
+                               int maxY=fnode->getMaxYShowed();
+                               int minX=fnode->getMinXShowed();
+                               int minY=fnode->getMinYShowed();
+                               
+                               
+                               /*
+                               float sx=(((float)m_scrX-100)/(maxScrX-minScrX))*zoomFactor;
+                               float sy=(((float)m_scrY-50)/(maxScrY-minScrY))*zoomFactor;
+                               */
+                               
+                               
+                               float sx=(((float)m_scrX-100)/(maxX-minX))*zoomFactor;
+                               float sy=(((float)m_scrY-50)/(maxY-minY))*zoomFactor;
+                               
+
+                               realPoint.x=((point.x-70-fnode->getOffsetPixelsX())/sx)+ fnode->getOffsetX()+ minX;
+                               realPoint.y=((point.y-40-fnode->getOffsetPixelsY())/sy)+ fnode->getOffsetY()+ minY;
+                               /*
+                               LOG
+                               */
+                               if(fnode->getActual())
+                                       text = wxString::Format(_T("Selected point ( %d, %d)\n"), realPoint.x, realPoint.y);
+                               //m_log->AppendText(text);
+                               
+                               bool hasIt=fnode->isInFunction(realPoint.x,realPoint.y);
+                                       /*
+                                       if(fnode->getEditable())        
+                                               hasIt=fnode->isInFunction(realPoint.x,realPoint.y);
+                                       else
+                                               hasIt=false;
+                                       */
+                               if(hasIt)
+                               {
+                                       if(actual!=fnode)
+                                       {
+                                               setActualFunction(fnode);
+                                               //we change the offsets
+                                               setOffsetPixelX(fnode->getOffsetPixelsX());
+                                               setOffsetPixelY(fnode->getOffsetPixelsY());
+                                               setOffsetX(fnode->getOffsetX());
+                                               setOffsetY(fnode->getOffsetY());
+
+
+                                               setActualScales();
+                                               if(!actual->getFromWindow() && actual->getEditable()||actual->getFromWindow() && actual->getEditable())
+                                               {
+                                                       m_popmenu.Enable(pwID_ADDNEWPOINT,true);
+                                                       m_popmenu.Enable(pwID_DELPOINT,true);
+                                                       if(actual->getShowPoints())
+                                                       {
+                                                               m_popmenu.Enable(pwID_SHOWPOINTS,false);
+                                                               m_popmenu.Enable(pwID_NOSHOWPOINTS,true);
+                                                       }
+                                                       else
+                                                       {
+                                                               m_popmenu.Enable(pwID_SHOWPOINTS,true);
+                                                               m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+                                                       }
+                                                       m_popmenu.Enable(pwID_MYZOOMIN,true);
+                                                       m_popmenu.Enable(pwID_MYZOOMOUT,true);
+                                                       if(actual->getType()==2)//Smoothed function
+                                                       {
+                                                               m_popmenu.Enable(pwID_SPLINE,false);
+                                                               m_popmenu.Enable(pwID_LINE,true);
+                                                       }
+                                                       else
+                                                       {
+                                                               m_popmenu.Enable(pwID_SPLINE,true);
+                                                               m_popmenu.Enable(pwID_LINE,false);
+
+                                                       }
+                                                       if(type==2)
+                                                       {
+                                                               m_popmenu.Enable(pwID_LOAD,false);
+                                                               m_popmenu.Enable(pwID_STARTDRAWING,false);
+                                                       }       
+                                                       else
+                                                       {
+                                                           m_popmenu.Enable(pwID_LOAD,true);
+                                                               m_popmenu.Enable(pwID_STARTDRAWING,true);
+                                                       }
+
+                                                       m_popmenu.Enable(pwID_SAVE,true);
+                                                       m_popmenu.Enable(pwID_LOAD,false);
+                                                       m_popmenu.Enable(pwID_STOPDRAWING,false);
+                                                       m_popmenu.Enable(pwID_CHANGECOLOR,true);
+                                                       m_popmenu.Enable(mpID_LINE_GUIDES,true);
+                                                       m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,true);
+                                               }
+                                               //for the functions that came from data and arent editables
+                                               else if(!actual->getFromWindow() && !actual->getEditable()||actual->getFromWindow() && !actual->getEditable())
+                                               {
+                                                       if(actual->getShowPoints())
+                                                       {
+                                                               m_popmenu.Enable(pwID_SHOWPOINTS,false);
+                                                               m_popmenu.Enable(pwID_NOSHOWPOINTS,true);
+                                                       }
+                                                       else
+                                                       {
+                                                               m_popmenu.Enable(pwID_SHOWPOINTS,true);
+                                                               m_popmenu.Enable(pwID_NOSHOWPOINTS,false);
+                                                       }
+                                                       if(actual->getType()==2)//Smoothed function
+                                                       {
+                                                               m_popmenu.Enable(pwID_SPLINE,false);
+                                                               m_popmenu.Enable(pwID_LINE,true);
+                                                       }
+                                                       else
+                                                       {
+                                                               m_popmenu.Enable(pwID_SPLINE,true);
+                                                               m_popmenu.Enable(pwID_LINE,false);
+
+                                                       }
+                                                       if(type==2)
+                                                       {
+                                                               m_popmenu.Enable(pwID_LOAD,false);
+                                                               m_popmenu.Enable(pwID_STARTDRAWING,false);
+                                                       }       
+                                                       m_popmenu.Enable(pwID_SAVE,false);
+                                                       m_popmenu.Enable(pwID_LOAD,false);
+                                                       m_popmenu.Enable(pwID_STOPDRAWING,false);
+                                                       m_popmenu.Enable(pwID_MYZOOMIN,true);
+                                                       m_popmenu.Enable(pwID_MYZOOMOUT,true);
+                                                       m_popmenu.Enable(pwID_CHANGECOLOR,true);
+                                                       m_popmenu.Enable(mpID_LINE_GUIDES,true);
+                                                       m_popmenu.Enable(pwID_SAVE,true);
+                                                       m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,true);
+
+                                               }
+                                               //if the function is smooth
+                                               if(actual->getType()==2)
+                                               {
+                                                       actual->clearSplineVectors();
+                                                       actual->addSplinesPoints();
+                                                       actual->initializeSplineVectors();
+                                                       
+                                               }
+               
+                                               UpdateAll();
+                                               //------------------------------------------
+                                               //Sending the particular event
+                                               //-------------------------------------------
+                                               wxCommandEvent cevent( wxEVT_PPLOTTER_CHANGED_FUNCTION, GetId() );
+                                               cevent.SetEventObject(this);
+
+                                               //------------------------------------------
+                                               //Sending the  general event
+                                               //-------------------------------------------
+                                               wxCommandEvent pevent( wxEVT_PPLOTTER, GetId() );
+                                               pevent.SetEventObject(this);
+                                               //send the events
+                                               GetEventHandler()->ProcessEvent( cevent );
+                                               GetEventHandler()->ProcessEvent( pevent );
+                                       }
+                               }
+                               node=node->GetNext();
+                       }
+                 }
+               }
+               //the user is finishing the drawing of the function
+               else
+               {
+                       drawing=false;
+                       functions.Append(actual);
+               }
+}
+
+/**
+* The user wants to change the type of function: line, smooth
+* TODO is an extension
+*/
+void pPlotterWindow::changeFuntionType(int aTheType, bool aForAll)
+{
+
+}
+//------------------------------------------
+//If the data doesnt come from interaction
+//-------------------------------------------
+/**
+*  Add a function to the window, given its points
+*/
+int pPlotterWindow:: addFunction(pGraphicalFunction * function)
+{
+       if(function->getType()==2)
+       {
+               function->initializeSplines();
+               function->initializeSplineVectors();
+               UpdateAll();
+       }
+       bool added1=functions.Append(function)!=NULL;
+       int id=functions.IndexOf(function);
+       bool added2=AddLayer(function);
+       UpdateAll();
+       return id;//added1 && added2;
+}
+/**
+*  Delete a point of a function
+*  @param point: is the real value that the functon takes, and is gointg to be deleted  
+*/
+
+bool pPlotterWindow::DeletePointFunction(pGraphicalFunction* function,wxPoint point)
+{
+
+       wxNode* node= functions.GetFirst();
+       while(node)
+       {
+               pGraphicalFunction* f= (pGraphicalFunction*)node->GetData();
+               if(f==function)
+               {
+                       return function->DeletePoint(point.x,point.y);
+               }
+               node=node->GetNext();
+       }
+       return false;
+}
+/**
+* Delete a function of the plotter
+*/
+bool pPlotterWindow::deleteFunction(pGraphicalFunction * f)
+{
+       functions.DeleteObject(f);
+       functionsToMove.DeleteObject(f);
+       return true;
+}
+/**
+* Creates and returns a graphical funcion according to the indicated vectors.
+*/
+pGraphicalFunction * pPlotterWindow::getFunctionForVectors( std::vector<double> *vectorX, std::vector<double> *vectorY )
+{
+       double coordX = -1 ;    
+       double coordY = -1;
+
+       pGraphicalFunction * ff = new pGraphicalFunction( _T(" "), 1);
+
+       int i=0;
+       int sizeX = vectorX->size();
+       int sizeY = vectorY->size();
+       if( sizeX == sizeY )
+       {
+               while ( i < sizeX )
+               {
+                       coordX = (*vectorX)[i];                 
+                       coordY = (*vectorY)[i];
+                       ff -> AddPoint( coordX, coordY);                
+                       i++;
+               }
+       }
+
+   InitFunctionForVectors( ff );
+   return ff;
+}
+
+pGraphicalFunction * pPlotterWindow::getFunctionForVectors( double * vectorX, int sizeX, double * vectorY, int sizeY )
+{
+       double coordX = -1 ;    
+       double coordY = -1;
+
+       pGraphicalFunction * ff = new pGraphicalFunction( _T(" "), 1);
+
+       /*wxString text = "\n Including points from two vectors \n";
+       m_log->AppendText(text);*/
+
+       int i=0;
+       if(sizeX == sizeY)
+       {
+               while ( i < sizeX )
+               {
+                       coordX = *vectorX;                      
+                       coordY = *vectorY;
+                       ff -> AddPoint( coordX, coordY);                
+       /*              text = wxString::Format("Included point ( %d, %d)\n", coordX, coordY);
+                       m_log->AppendText(text);*/
+
+                       vectorX++;
+                       vectorY++;              
+                       i++;
+               }
+       }
+
+   InitFunctionForVectors( ff );
+   return ff;
+}
+
+
+
+void pPlotterWindow::InitFunctionForVectors( pGraphicalFunction *ff )
+{
+       int maxX,maxY,minX,minY;
+       /*
+       if the function is  not drawed interactively the maxX and the 
+       maxY are the from the points of the function
+       */
+       maxX=ff->getMaxX();
+       maxY=ff->getMaxY();
+       minX= ff->getMinX();
+       minY= ff->getMinY();
+
+               
+       ff->setMinShowedX(minX);
+       ff->setMinShowedY(minY);
+       ff->setMaxShowedX(maxX);
+       ff->setMaxShowedY(maxY);
+       
+       GetClientSize(&m_scrX,&m_scrY);
+       //set
+
+       if((maxX-minX)!=0 && (maxY-minY)!=0)
+       {
+               m_scaleX= ((float)m_scrX-100)/(maxX-minX);
+               m_scaleY= ((float)m_scrY-50)/(maxY-minY);
+       }
+       maxScrX=maxX;
+       maxScrY=maxY;
+       minScrX=minX;
+       minScrY=minY;
+       
+       
+       if(type==HISTOGRAM)
+       {       
+               actual=ff;
+               setActualScales();
+               m_popmenu.Enable(pwID_NOSHOWPOINTS,true);
+               m_popmenu.Enable(pwID_ADDNEWPOINT,true);
+               m_popmenu.Enable(pwID_SHOWPOINTS,false);
+               m_popmenu.Enable(pwID_DELPOINT,true);
+               //m_popmenu.Enable(pwID_SPLINE,false);
+               //m_popmenu.Enable(pwID_LINE,true);
+               m_popmenu.Enable(pwID_SAVE,true);
+               m_popmenu.Enable(pwID_LOAD,false);
+               m_popmenu.Enable(pwID_CHANGECOLOR,true);
+               //m_popmenu.Enable(pwID_STARTDRAWING,false);
+               m_popmenu.Enable(mpID_LINE_GUIDES,true);
+               m_popmenu.Enable(pwID_TRASLATEACTUALFUNCTION,true);
+               //------------------------------------------
+               //Sending the paarticular event of changed actual function
+               //-------------------------------------------
+               wxCommandEvent cevent( wxEVT_PPLOTTER_CHANGED_FUNCTION, GetId() );
+               cevent.SetEventObject(this);
+               GetEventHandler()->ProcessEvent( cevent );
+       }
+       
+       /*
+       maxScrX=100;
+       minScrX=50;
+       offsetX=50;
+       ff->setOffsetX(50);
+       */
+       //actual->setScreens(scrX,scrY);
+       //actual->setScales();
+       //setActualScales();
+}
+/*
+bool pPlotterWindow::AddFunction(wxPoint realPoints[],int numberOfPoints,wxString name,int flags)
+{
+pGraphicalFunction* function= new pGraphicalFunction(name,flags);
+
+for(int i= 0; i<numberOfPoints;i++)
+{
+int x=realPoints[i].x;
+int y=realPoints[i].y;
+bool added=function->AddPoint(x,y);
+if(!added )
+return added;
+}
+functions.Append(function);
+bool addL=mpWindow::AddLayer(function);
+if(addL)
+{
+mpWindow::UpdateAll();
+}
+return addL;
+}
+*/
+
+/*
+* Actualizes the view range of the plotter and the actual function
+* @param newMinX Is the min-value to be shown in the x-scale
+* @param newMaxX Is the max-value to be shown in the x-scale
+*/
+/*
+DEPRECATED
+*/
+void pPlotterWindow :: actualizeViewRange(int newMinX, int newMaxX)
+{
+       int minPixX,maxPixX,min,max;
+       double sx;
+       /*
+               getiing pixels
+       */
+       int dx=newMaxX-newMinX;
+       
+       if(dx!=0)
+       {
+               sx= (((float)m_scrX-100)/dx)*zoomFactor;
+       }
+       
+        minPixX=newMinX*sx;
+        maxPixX=newMaxX*sx;
+
+               //vx.at(i)-offsetX)*scaleX+offsetpx
+       if(minScrX!=newMinX)
+       {
+               setOffsetX(newMinX);
+               setMinScrX(newMinX);
+               actual->setOffsetX(newMinX);
+               actual->setMinShowedX(newMinX);                         
+               /*
+               wxNode * node= functions.GetFirst();
+               while (node)
+                       {
+                               pGraphicalFunction* fnode=(pGraphicalFunction*)node->GetData();
+                               if(fnode)
+                               {
+                                       if(!fnode->getActual())
+                                       {
+                                               fnode->setScreens(m_scrX,m_scrY);
+                                               fnode->setScales();
+                                               //max=minPixX/fnode->getScaleX();
+                                               min=minPixX/fnode->getScaleX();
+                                               fnode->setOffsetX(min);
+                                               fnode->setMinShowedX(min);
+                                               
+                                       }
+                               }
+                               node=node->GetNext();
+                       }
+               */
+           
+       }
+       if(maxScrX!=newMaxX)
+       {
+               setMaxScrX(newMaxX);
+           actual->setMaxShowedX(newMaxX);
+               /*
+               wxNode * node= functions.GetFirst();
+               while (node)
+                       {
+                               
+                               pGraphicalFunction* fnode=(pGraphicalFunction*)node->GetData();
+                               if(fnode)
+                               {
+                                       if(!fnode->getActual())
+                                       {
+                                               fnode->setScreens(m_scrX,m_scrY);
+                                               fnode->setScales();
+                                               max=maxPixX/fnode->getScaleX();
+                                               //min=maxPixX/fnode->getScaleX();
+                                               //fnode->setOffsetX(max);
+                                               //fnode->setMinShowedX(min);
+                                               fnode->setMaxShowedX(max);
+                                       }
+                               }
+
+                               node=node->GetNext();
+                       }
+               */
+       }
+       /*
+       if(actual->getMinXShowed()!=actual->getMinX() || actual->getMinYShowed()!=actual->getMinY()||
+               actual->getMaxXShowed()!=actual->getMaxX() || actual->getMaxYShowed()!=actual->getMaxY())
+       {
+               m_popmenu.Enable(pwID_MYZOOMIN,false);
+               m_popmenu.Enable(pwID_MYZOOMOUT,false);
+       }
+       else if(actual->getMinXShowed()==actual->getMinX() && actual->getMaxXShowed()==actual->getMaxX())
+       {
+               
+               m_popmenu.Enable(pwID_MYZOOMIN,true);
+               m_popmenu.Enable(pwID_MYZOOMOUT,true);
+       }
+       */
+                
+       UpdateAll();
+}
+/*
+* Guide lines menu handler method that reacts to the mpID_LINE_GUIDES cimmand event
+* event The corresponding event to handle
+*/
+void pPlotterWindow :: OnGuideLines (wxCommandEvent   &event)
+{
+       wxString nextAction_text;
+       if( drawGuides )
+       {
+               setLineGuidesCondition(false);
+//             nextAction_text << "Turn on guide lines";
+               nextAction_text = _T("Turn on guide lines");
+               UpdateAll();
+       }
+       else
+       {
+               setLineGuidesCondition(true);
+//             nextAction_text << "Turn off guide lines";
+               nextAction_text = _T("Turn off guide lines");
+               UpdateAll();
+       }
+       //------------------------------------------
+       //Sending the paarticular event of changed actual function
+       //-------------------------------------------
+       wxCommandEvent cevent( wxEVT_PPLOTTER_GUIDELINES, GetId() );
+       cevent.SetEventObject(this);
+    GetEventHandler()->ProcessEvent( cevent );
+       
+       //SETTING LABEL
+       m_popmenu.SetLabel ( mpID_LINE_GUIDES, nextAction_text ); 
+}
+/*
+       Get a function in the plotter given the index
+*/
+pGraphicalFunction* pPlotterWindow::getFunction(int index)
+{
+       wxNode* node=functions.Item(index);
+       return (pGraphicalFunction*)node->GetData();
+}
+/*
+         move the functions that the user wants to move
+         and that were setted in functionsToMove
+         @param porcentageMinX:the porcentage that the minShowed
+         of the funcntions have to be move
+               0<=porcentageMinX<=1
+         @param porcentageMaxX:the porcentage that the maxShowed
+         of the funcntions have to be move
+               0<=porcentageMaxX<=1
+
+       */
+
+void pPlotterWindow::moveFunctions( float porcentageMinX,float porcentageMaxX)
+       {
+               //Adding the actual function
+       
+               //functionsToMove.Append(actual);
+
+               //
+               //float minShowed,maxShowed,fMaxXShowed,fMinXShowed;
+               float x,y;
+                
+               
+               int minShowed,maxShowed,fMaxXShowed,fMinXShowed;
+               wxNode* fnode=functionsToMove.GetFirst();
+               while(fnode)
+               {
+                       pGraphicalFunction* fg=(pGraphicalFunction*)fnode->GetData();
+                       x=porcentageMaxX*(fg->getMaxX()-fg->getMinX());
+                       y=porcentageMinX*(fg->getMaxX()-fg->getMinX());
+                       
+                       maxShowed=fg->getMinX()+ x;
+                       minShowed=fg->getMinX()+ y;
+
+                       fMinXShowed=fg->getMinXShowed();
+                       fMaxXShowed=fg->getMaxXShowed();
+                       
+                       if(fMinXShowed!=minShowed)
+                       {
+                               if(fg->getActual())
+                               {
+                                       setOffsetX(minShowed);
+                                       setMinScrX(minShowed);
+                               }
+                               fg->setOffsetX(minShowed);
+                               fg->setMinShowedX(minShowed);                             
+                       }
+                       if(fMaxXShowed!=maxShowed)
+                       {
+                               if(fg->getActual())
+                               {
+                                       setMaxScrX(maxShowed);
+                               }
+                               fg->setMaxShowedX(maxShowed);   
+                       }
+                       if(fg->getActual()&& (fg->getMinXShowed()!=fg->getMinX() || fg->getMinYShowed()!=fg->getMinY()||
+                                                                 fg->getMaxXShowed()!=fg->getMaxX() || fg->getMaxYShowed()!=fg->getMaxY()))
+                       {
+                               if(type!=HISTOGRAM)
+                               {
+                                       m_popmenu.Enable(pwID_MYZOOMIN,false);
+                                       m_popmenu.Enable(pwID_MYZOOMOUT,false);
+                               }
+                       }
+                       else if(fg->getActual()&& fg->getMinXShowed()==fg->getMinX() && fg->getMaxXShowed()==fg->getMaxX())
+                       {
+                               if(type!=HISTOGRAM)
+                               {
+                                       m_popmenu.Enable(pwID_MYZOOMIN,true);
+                                       m_popmenu.Enable(pwID_MYZOOMOUT,true);
+                               }
+                       }
+
+
+                                       fnode=fnode->GetNext();
+               }
+}
+
+/*
+ adds a function such that when the min or max of the bar
+ changes it is going to that function
+*/
+int pPlotterWindow::addFunctionToMove(pGraphicalFunction *function)
+{
+       bool added1=functionsToMove.Append(function)!=NULL;
+       int id=functionsToMove.IndexOf(function);
+       UpdateAll();
+       return id;
+}
+//----------------------------
+//Handling Options Menu
+//----------------------------
+void pPlotterWindow::setPopUpMenu(bool startD,bool stopD,bool smooth,bool line, bool zoomIn,
+                                         bool zoomOut,bool showPoints,bool noShowPoints,bool changeColor, bool addP,
+                                         bool delPoint,bool load,bool save)
+{
+       /*
+       pwID_ADDPOINT = 2010,    //!< add a point to the function
+       pwID_DELPOINT,       //!< delete a point of the function
+       pwID_SHOWPOINTS,  //!<shows the points that the function has
+       pwID_STARTDRAWING, //!<let to the user to start drawing the curve
+       pwID_DELFUNCTION, //!<delete a function that is in the plotter
+       pwID_STOPDRAWING,//!<Stops the drawing of the function
+       pwID_ADDNEWPOINT,//!<add a new point to the function.
+       pwID_NOSHOWPOINTS, //!<No show the points of the function.
+       pwID_MYZOOMIN,//!<Zoom in the function
+       pwID_MYZOOMOUT,//!<Zoom out the points of the function.
+       pwID_SPLINE,//!<Spline the actual curve.
+       pwID_LINE,//!<Piecewise the actual curve.
+       pwID_SAVE,//!<Save the function in a .txt file.
+       pwID_LOAD, //!<Load the function from a .txt file.
+       pwID_CHANGECOLOR, //!<Change the color of the function
+       pwID_TRASLATEACTUALFUNCTION //!<move the actual function
+*/
+       if(startD)
+               m_popmenu.Remove( pwID_STARTDRAWING);
+       if(stopD)
+               m_popmenu.Remove( pwID_STOPDRAWING);
+       if(load)
+               m_popmenu.Remove( pwID_LOAD);
+       if(save)
+               m_popmenu.Remove( pwID_SAVE);
+       if(showPoints)
+               m_popmenu.Remove( pwID_SHOWPOINTS);
+       if(noShowPoints)
+               m_popmenu.Remove( pwID_NOSHOWPOINTS);
+       if(smooth)
+               m_popmenu.Remove( pwID_SPLINE);
+       if(line)
+               m_popmenu.Remove( pwID_LINE);
+       if(zoomIn)
+               m_popmenu.Remove( pwID_MYZOOMIN);
+       if(zoomOut)
+               m_popmenu.Remove( pwID_MYZOOMOUT);
+       if(changeColor)
+               m_popmenu.Remove( pwID_CHANGECOLOR);
+       if(addP)
+               m_popmenu.Remove( pwID_ADDPOINT);
+       if(delPoint)
+               m_popmenu.Remove( pwID_DELPOINT);
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/pPlotterWindow.h
new file mode 100644 (file)
index 0000000..56541f2
--- /dev/null
@@ -0,0 +1,404 @@
+
+#ifndef __pPlotterWindow_h__
+#define __pPlotterWindow_h__
+
+// ----------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//----------------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------------
+
+
+#include "pPlotterLayer.h"
+#include "pGraphicalFunction.h"
+#include "mathplot.h"
+
+
+
+/** Command IDs used by pPlotterWindow */
+enum
+{
+       pwID_ADDPOINT = 2010,    //!< add a point to the function
+       pwID_DELPOINT,       //!< delete a point of the function
+       pwID_SHOWPOINTS,  //!<shows the points that the function has
+       pwID_STARTDRAWING, //!<let to the user to start drawing the curve
+       pwID_DELFUNCTION, //!<delete a function that is in the plotter
+       pwID_STOPDRAWING,//!<Stops the drawing of the function
+       pwID_ADDNEWPOINT,//!<add a new point to the function.
+       pwID_NOSHOWPOINTS, //!<No show the points of the function.
+       pwID_MYZOOMIN,//!<Zoom in the function
+       pwID_MYZOOMOUT,//!<Zoom out the points of the function.
+       pwID_SPLINE,//!<Spline the actual curve.
+       pwID_LINE,//!<Piecewise the actual curve.
+       pwID_SAVE,//!<Save the function in a .txt file.
+       pwID_LOAD, //!<Load the function from a .txt file.
+       pwID_CHANGECOLOR, //!<Change the color of the function
+       pwID_TRASLATEACTUALFUNCTION, //!<move the actual function
+       pwID_LEFTUP//!<listening a click up
+
+};
+
+#define MAX_FUNCTIONS 7
+/**
+ this scale, scales each function with its maximum x, and maximum y
+ in its points
+*/
+#define DEFAULT_SCALE 1
+/**
+ this scale with the maximun x  and y of all the functions defined
+*/
+#define MAX_SCALE 2
+/**
+ this scales with the scale giving by the user of the widget
+*/
+#define USER_SCALE 3
+
+/*
+ Types of Plotter
+*/
+/*
+ Lets to the user to plot any number of the
+ functions
+*/
+#define DEFAULT_PLOTTER 1
+/*
+ Dont let draw on the plotter, but lets to edit
+ the functions that are editables in the plotter
+*/
+#define HISTOGRAM_PLOTTER 2
+/**
+* THE FACTOR TO ZOOM (IN,OUT)
+*/
+//#define ZOOM_FACTOR 2
+//----------------------------------------------------------------------------
+// Class definition
+//----------------------------------------------------------------------------
+
+class pPlotterWindow: public mpWindow
+{
+public:
+       /**
+       * Constructors and destructor
+       */         
+       pPlotterWindow( wxWindow *parent, wxWindowID id,
+               const wxPoint &pos = wxDefaultPosition,
+               const wxSize &size = wxDefaultSize,
+               int flags = 0);
+       ~pPlotterWindow();
+       
+       //----------------------------
+       //Handling Options Menu
+       //----------------------------
+       /*
+       if any parameter is true, is going to be remove from the popUp menu
+       */
+       void setPopUpMenu(bool startD,bool stopD,bool smooth,bool line, bool zoomIn,
+                                         bool zoomOut,bool showPoints,bool noShowPoints,bool changeColor, bool addP,
+                                         bool delPoint,bool load,bool save);
+
+
+       //-------------------------------
+       //Traslating the actual function
+       //-------------------------------
+       /*
+               Manipulating clicks on the plotter
+       */
+       void onLeftUp(wxMouseEvent& event);
+       
+       /*
+        Move the actual function  when the user
+        is moving the mouse
+       */
+       void onMoveFunction(wxCommandEvent& aEvent);
+
+
+       /**
+       * Change the color of the function
+       */
+       void onChangeColor(wxCommandEvent& aEvent);
+
+
+       /**
+       * Load the function from a .txt file
+       */
+       void onLoad(wxCommandEvent& aEvent);
+
+       /**
+       * Save the points of the function in a .txt file
+       */
+       void onSave(wxCommandEvent& aEvent);
+
+
+       /**
+       * Change the type of drawing of the actual function
+       * to a piecewise function
+       */
+       void onLine(wxCommandEvent& aEvent);
+
+
+       /**
+       * Spline the points of the actual curve
+       */
+       void onSplinePoints(wxCommandEvent& aEvent);
+       
+       
+       /**
+       * Zoom out the functions
+       */
+       void onMyZoomOut(wxCommandEvent& aEvent);
+
+       /**
+       * Zoom in the functions
+       */
+       void onMyZoomIn(wxCommandEvent& aEvent);
+
+       /**
+       * Transform the point clicked  from window
+       * to the real value,given by the scale
+       */
+       wxPoint getRealPoint(wxPoint pixelPoint);         
+
+       /**
+       * The user doesnt want see the points of the function
+       */
+       void onNoShowPoints(wxCommandEvent& aEvent);
+
+       /**
+       Stop the drawing of the actual function
+       */
+       void onStopDrawing(wxCommandEvent& aEvent);
+
+       /**
+       * Adds a point  to the function after the definition of the initial points of the function
+       * know this point is  a point of the function
+       *
+       */
+       void onAddNewPoint(wxCommandEvent& aEvent);
+
+       /**
+       * Let to the user to start drawing
+       */
+       void onStartDrawing(wxCommandEvent& aEvent);
+
+       /**
+       * Listens the event of the mouse when it is moving, this is use to know if the user is moving a pont of the function and in tha way to know when repainting.
+       */
+       void onMouseMove(wxMouseEvent& event);
+
+       /**
+       * Listens the event mouse left button double click.
+       * if the user give us a double click is because he wants to change
+       * the actual function to the function that has that point
+       */
+       void onChangeActual(wxMouseEvent& event);
+
+       /**
+       * Add a new point to the function and then repaint
+       */
+       void onAddPoint(wxMouseEvent& aEvent);
+
+       /**
+       * Deletes a point of the function and then repaint
+       */
+       void onDeletePoint(wxCommandEvent& aEvent);
+
+       /**
+       * Shows graphicly the discrete points that the function has
+       */
+       void onShowPoints(wxCommandEvent& aEvent);
+
+       /**
+       * Changes the type according to the specified number of the type. If the second parameter, the boolean one is true indicates that this action must be done in all the funtion, if not it will be applied only to the actual selected function.
+       * IS NOT IMPLEMENTED
+       */
+       void changeFuntionType(int aTheType, bool aForAll);
+
+       /**
+       * Add a function to the plotter
+       * when the function doesnt come from window
+       */
+       int addFunction(pGraphicalFunction * function);
+
+       /**
+       *  Delete a point of a function
+       *  @param point: is the real value that the functon takes, and is gointg to be deleted  
+       */
+       bool DeletePointFunction(pGraphicalFunction* function,wxPoint point);
+
+       /**
+       * Delete a function of the plotter
+       */
+       bool deleteFunction(pGraphicalFunction * f);
+       /**
+       *  Sets the actual function
+       *  @param newActual: new function
+       */
+       void  setActualFunction(pGraphicalFunction* newActual);
+       /**
+       *  Get the actual function
+       */
+       pGraphicalFunction* getActualFunction();
+
+       /**
+       * Creates and returns a graphical funcion according to the indicated vectors.
+       */
+       void InitFunctionForVectors( pGraphicalFunction *ff );
+       pGraphicalFunction * getFunctionForVectors( double* vectorX, int sizeX,double * vectorY, int sizeY );
+       pGraphicalFunction * getFunctionForVectors( std::vector<double> *vectorX, std::vector<double> *vectorY );
+
+       /*
+        Set the scales according to the size of the window
+        and the maximum given by the user
+       */
+
+       void setActualScales();
+       
+       
+
+       //erase
+
+       void setmLog(wxTextCtrl *m_log1)
+       {
+               m_log=m_log1;
+       }
+
+       /*
+       * Actualizes the view range of the plotter and the actual function
+       * @param newMinX Is the min-value to be shown in the x-scale
+       * @param newMaxX Is the max-value to be shown in the x-scale
+       */
+       void actualizeViewRange(int newMinX, int newMaxX);
+
+               /*
+       * Sets the condition for drawing or not the guide lines
+       * @param ifDrawing The new condition to assing 
+       */
+       void setLineGuidesCondition(bool ifDrawing)
+       {               
+               drawGuides = ifDrawing;         
+       }
+
+       
+       /*
+       * Gets the condition for drawing or not the guide lines
+       * @retval drawGuides The assigned condition
+       */
+       bool drawGuideLines()
+       {
+               return drawGuides;
+       }       
+       /*
+       * Guide lines menu handler method that reacts to the mpID_LINE_GUIDES cimmand event
+       * event The corresponding event to handle
+       */
+       void OnGuideLines (wxCommandEvent   &event); 
+
+       /*
+        writes in  t information
+       */
+       void writeInText(wxString &t)
+       {
+               t=text;
+       }
+       
+       /*
+        Get a function in the plotter given the index
+       */
+       pGraphicalFunction* getFunction(int index);
+       
+       /*
+         move the functions that the user wants to move
+         and that were setted in functionsToMove
+         @param porcentageMinX:the porcentage that the minShowed
+         of the funcntions have to be move
+         @param porcentageMaxX:the porcentage that the maxShowed
+         of the funcntions have to be move
+
+       */
+       void moveFunctions(float porcentageMinX,float porcentageMaxX);
+/**
+       * Add a function to the plotter
+       * when the function doesnt come from window
+       */
+       int addFunctionToMove(pGraphicalFunction * function);
+
+       
+private:
+
+       /**
+       * Actual Function
+       */
+       pGraphicalFunction* actual;
+       /**
+       * layers
+       */
+       wxList functions;
+
+       /**
+       * If is drawing the function
+       */
+       bool drawing;
+       /**
+       * Index of the movig point, if the user is moving
+       * a poit
+       */
+       int movingPointIndex;
+
+       /**
+       * the way we scale
+        DEFAULT_SCALE 1
+        MAX_SCALE 2
+        USER_SCALE 3
+       */
+       int scaleWay;
+
+       
+       /*
+               Use to Show Information
+       */
+
+       wxTextCtrl      *m_log;
+       wxString                text;
+
+       /*
+         Functions to be move at the same time
+       */
+       wxList functionsToMove;
+       /*
+        the user is moving the function
+       */
+       bool movingFunction;
+       /*
+       */
+       int initialMovingCLick;
+
+       /*
+               saving the initial function
+       */
+       std::vector<double> backUpActualVector;
+       /*
+       wants to move the points of the function
+       */
+       bool movingPoints;
+
+       DECLARE_CLASS (pPlotterWindow)
+       //----------------------------------------------------------------------------
+       // wxWidget macro use declaration for handdling events
+       //----------------------------------------------------------------------------
+       DECLARE_EVENT_TABLE()
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/area.xpm b/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/area.xpm
new file mode 100644 (file)
index 0000000..f3e6861
--- /dev/null
@@ -0,0 +1,297 @@
+/* XPM */
+static char * area_xpm[] = {
+"37 37 257 2",
+"      c None",
+".     c #000000",
+"+     c #800000",
+"@     c #008000",
+"#     c #808000",
+"$     c #000080",
+"%     c #800080",
+"&     c #008080",
+"*     c #C0C0C0",
+"=     c #C0DCC0",
+"-     c #A6CAF0",
+";     c #000000",
+">     c #00002A",
+",     c #000055",
+"'     c #00007F",
+")     c #0000AA",
+"!     c #0000D4",
+"~     c #002A00",
+"{     c #002A2A",
+"]     c #002A55",
+"^     c #002A7F",
+"/     c #002AAA",
+"(     c #002AD4",
+"_     c #005500",
+":     c #00552A",
+"<     c #005555",
+"[     c #00557F",
+"}     c #0055AA",
+"|     c #0055D4",
+"1     c #007F00",
+"2     c #007F2A",
+"3     c #007F55",
+"4     c #007F7F",
+"5     c #007FAA",
+"6     c #007FD4",
+"7     c #00AA00",
+"8     c #00AA2A",
+"9     c #00AA55",
+"0     c #00AA7F",
+"a     c #00AAAA",
+"b     c #00AAD4",
+"c     c #00D400",
+"d     c #00D42A",
+"e     c #00D455",
+"f     c #00D47F",
+"g     c #00D4AA",
+"h     c #00D4D4",
+"i     c #2A0000",
+"j     c #2A002A",
+"k     c #2A0055",
+"l     c #2A007F",
+"m     c #2A00AA",
+"n     c #2A00D4",
+"o     c #2A2A00",
+"p     c #2A2A2A",
+"q     c #2A2A55",
+"r     c #2A2A7F",
+"s     c #2A2AAA",
+"t     c #2A2AD4",
+"u     c #2A5500",
+"v     c #2A552A",
+"w     c #2A5555",
+"x     c #2A557F",
+"y     c #2A55AA",
+"z     c #2A55D4",
+"A     c #2A7F00",
+"B     c #2A7F2A",
+"C     c #2A7F55",
+"D     c #2A7F7F",
+"E     c #2A7FAA",
+"F     c #2A7FD4",
+"G     c #2AAA00",
+"H     c #2AAA2A",
+"I     c #2AAA55",
+"J     c #2AAA7F",
+"K     c #2AAAAA",
+"L     c #2AAAD4",
+"M     c #2AD400",
+"N     c #2AD42A",
+"O     c #2AD455",
+"P     c #2AD47F",
+"Q     c #2AD4AA",
+"R     c #2AD4D4",
+"S     c #550000",
+"T     c #55002A",
+"U     c #550055",
+"V     c #55007F",
+"W     c #5500AA",
+"X     c #5500D4",
+"Y     c #552A00",
+"Z     c #552A2A",
+"`     c #552A55",
+" .    c #552A7F",
+"..    c #552AAA",
+"+.    c #552AD4",
+"@.    c #555500",
+"#.    c #55552A",
+"$.    c #555555",
+"%.    c #55557F",
+"&.    c #5555AA",
+"*.    c #5555D4",
+"=.    c #557F00",
+"-.    c #557F2A",
+";.    c #557F55",
+">.    c #557F7F",
+",.    c #557FAA",
+"'.    c #557FD4",
+").    c #55AA00",
+"!.    c #55AA2A",
+"~.    c #55AA55",
+"{.    c #55AA7F",
+"].    c #55AAAA",
+"^.    c #55AAD4",
+"/.    c #55D400",
+"(.    c #55D42A",
+"_.    c #55D455",
+":.    c #55D47F",
+"<.    c #55D4AA",
+"[.    c #55D4D4",
+"}.    c #7F0000",
+"|.    c #7F002A",
+"1.    c #7F0055",
+"2.    c #7F007F",
+"3.    c #7F00AA",
+"4.    c #7F00D4",
+"5.    c #7F2A00",
+"6.    c #7F2A2A",
+"7.    c #7F2A55",
+"8.    c #7F2A7F",
+"9.    c #7F2AAA",
+"0.    c #7F2AD4",
+"a.    c #7F5500",
+"b.    c #7F552A",
+"c.    c #7F5555",
+"d.    c #7F557F",
+"e.    c #7F55AA",
+"f.    c #7F55D4",
+"g.    c #7F7F00",
+"h.    c #7F7F2A",
+"i.    c #7F7F55",
+"j.    c #7F7F7F",
+"k.    c #7F7FAA",
+"l.    c #7F7FD4",
+"m.    c #7FAA00",
+"n.    c #7FAA2A",
+"o.    c #7FAA55",
+"p.    c #7FAA7F",
+"q.    c #7FAAAA",
+"r.    c #7FAAD4",
+"s.    c #7FD400",
+"t.    c #7FD42A",
+"u.    c #7FD455",
+"v.    c #7FD47F",
+"w.    c #7FD4AA",
+"x.    c #7FD4D4",
+"y.    c #AA0000",
+"z.    c #AA002A",
+"A.    c #AA0055",
+"B.    c #AA007F",
+"C.    c #AA00AA",
+"D.    c #AA00D4",
+"E.    c #AA2A00",
+"F.    c #AA2A2A",
+"G.    c #AA2A55",
+"H.    c #AA2A7F",
+"I.    c #AA2AAA",
+"J.    c #AA2AD4",
+"K.    c #AA5500",
+"L.    c #AA552A",
+"M.    c #AA5555",
+"N.    c #AA557F",
+"O.    c #AA55AA",
+"P.    c #AA55D4",
+"Q.    c #AA7F00",
+"R.    c #AA7F2A",
+"S.    c #AA7F55",
+"T.    c #AA7F7F",
+"U.    c #AA7FAA",
+"V.    c #AA7FD4",
+"W.    c #AAAA00",
+"X.    c #AAAA2A",
+"Y.    c #AAAA55",
+"Z.    c #AAAA7F",
+"`.    c #AAAAAA",
+" +    c #AAAAD4",
+".+    c #AAD400",
+"++    c #AAD42A",
+"@+    c #AAD455",
+"#+    c #AAD47F",
+"$+    c #AAD4AA",
+"%+    c #AAD4D4",
+"&+    c #D40000",
+"*+    c #D4002A",
+"=+    c #D40055",
+"-+    c #D4007F",
+";+    c #D400AA",
+">+    c #D400D4",
+",+    c #D42A00",
+"'+    c #D42A2A",
+")+    c #D42A55",
+"!+    c #D42A7F",
+"~+    c #D42AAA",
+"{+    c #D42AD4",
+"]+    c #D45500",
+"^+    c #D4552A",
+"/+    c #D45555",
+"(+    c #D4557F",
+"_+    c #D455AA",
+":+    c #D455D4",
+"<+    c #D47F00",
+"[+    c #D47F2A",
+"}+    c #D47F55",
+"|+    c #D47F7F",
+"1+    c #D47FAA",
+"2+    c #D47FD4",
+"3+    c #D4AA00",
+"4+    c #D4AA2A",
+"5+    c #D4AA55",
+"6+    c #D4AA7F",
+"7+    c #D4AAAA",
+"8+    c #D4AAD4",
+"9+    c #D4D400",
+"0+    c #D4D42A",
+"a+    c #D4D455",
+"b+    c #D4D47F",
+"c+    c #D4D4AA",
+"d+    c #D4D4D4",
+"e+    c #000000",
+"f+    c #0C0C0C",
+"g+    c #191919",
+"h+    c #262626",
+"i+    c #333333",
+"j+    c #3F3F3F",
+"k+    c #4C4C4C",
+"l+    c #595959",
+"m+    c #666666",
+"n+    c #727272",
+"o+    c #7F7F7F",
+"p+    c #8C8C8C",
+"q+    c #999999",
+"r+    c #A5A5A5",
+"s+    c #B2B2B2",
+"t+    c #BFBFBF",
+"u+    c #CCCCCC",
+"v+    c #D8D8D8",
+"w+    c #E5E5E5",
+"x+    c #F2F2F2",
+"y+    c #FFFBF0",
+"z+    c #A0A0A4",
+"A+    c #808080",
+"B+    c #FF0000",
+"C+    c #00FF00",
+"D+    c #FFFF00",
+"E+    c #0000FF",
+"F+    c #FF00FF",
+"G+    c #00FFFF",
+"H+    c #FFFFFF",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * B+B+B+* * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * B+* * B+* * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * B+B+B+* * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * B+* * B+* * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * B+* * B+* * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * $ $ $ $ $ $ $ $ * * $ * * * * $ $ $ * * * * $ * * * * * * * * * * ",
+"* * * * * * * $ * * * * * $ * * $ $ $ * * * $ $ $ * * $ * * * * * * * * * ",
+"* * * * * * * $ * * * * $ * * $ * * * * * * * * * $ * * $ * * * * * * * * ",
+"* * * * * * * $ * * * $ * * $ * * * * * * * * * * * $ * * $ * * * * * * * ",
+"* * * * * * * $ * * $ * * $ * * * * * * * * * * * * * $ * * $ * * * * * * ",
+"* * * * * * * $ * * $ * * $ * * * * * * * * * * * * * $ * * $ * * * * * * ",
+"* * * * * * * $ * * $ * * $ * * * * * * * * * * * * * $ * * $ * * * * * * ",
+"* * * * * * * $ * * * $ * * $ * * * * * * * * * * * $ * * $ * * * * * * * ",
+"* * * * * * * $ * * * * $ * * $ * * * * * * * * * $ * * $ * * * * * * * * ",
+"* * * * $ $ $ $ $ $ $ $ * $ * $ $ $ $ * * * $ $ $ * * $ * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * $ $ $ * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+$ H+H+H+H+H+$ H+H+H+H+H+$ H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/bright.xpm b/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/bright.xpm
new file mode 100644 (file)
index 0000000..855ecdd
--- /dev/null
@@ -0,0 +1,310 @@
+/* XPM */
+static char * bright_xpm[] = {
+"36 50 257 2",
+"      c None",
+".     c #000000",
+"+     c #000033",
+"@     c #000066",
+"#     c #000099",
+"$     c #0000CC",
+"%     c #0000FF",
+"&     c #330000",
+"*     c #330033",
+"=     c #330066",
+"-     c #330099",
+";     c #3300CC",
+">     c #3300FF",
+",     c #660000",
+"'     c #660033",
+")     c #660066",
+"!     c #660099",
+"~     c #6600CC",
+"{     c #6600FF",
+"]     c #990000",
+"^     c #990033",
+"/     c #990066",
+"(     c #990099",
+"_     c #9900CC",
+":     c #9900FF",
+"<     c #CC0000",
+"[     c #CC0033",
+"}     c #CC0066",
+"|     c #CC0099",
+"1     c #CC00CC",
+"2     c #CC00FF",
+"3     c #FF0000",
+"4     c #FF0033",
+"5     c #FF0066",
+"6     c #FF0099",
+"7     c #FF00CC",
+"8     c #FF00FF",
+"9     c #003300",
+"0     c #003333",
+"a     c #003366",
+"b     c #003399",
+"c     c #0033CC",
+"d     c #0033FF",
+"e     c #333300",
+"f     c #333333",
+"g     c #333366",
+"h     c #333399",
+"i     c #3333CC",
+"j     c #3333FF",
+"k     c #663300",
+"l     c #663333",
+"m     c #663366",
+"n     c #663399",
+"o     c #6633CC",
+"p     c #6633FF",
+"q     c #993300",
+"r     c #993333",
+"s     c #993366",
+"t     c #993399",
+"u     c #9933CC",
+"v     c #9933FF",
+"w     c #CC3300",
+"x     c #CC3333",
+"y     c #CC3366",
+"z     c #CC3399",
+"A     c #CC33CC",
+"B     c #CC33FF",
+"C     c #FF3300",
+"D     c #FF3333",
+"E     c #FF3366",
+"F     c #FF3399",
+"G     c #FF33CC",
+"H     c #FF33FF",
+"I     c #006600",
+"J     c #006633",
+"K     c #006666",
+"L     c #006699",
+"M     c #0066CC",
+"N     c #0066FF",
+"O     c #336600",
+"P     c #336633",
+"Q     c #336666",
+"R     c #336699",
+"S     c #3366CC",
+"T     c #3366FF",
+"U     c #666600",
+"V     c #666633",
+"W     c #666666",
+"X     c #666699",
+"Y     c #6666CC",
+"Z     c #6666FF",
+"`     c #996600",
+" .    c #996633",
+"..    c #996666",
+"+.    c #996699",
+"@.    c #9966CC",
+"#.    c #9966FF",
+"$.    c #CC6600",
+"%.    c #CC6633",
+"&.    c #CC6666",
+"*.    c #CC6699",
+"=.    c #CC66CC",
+"-.    c #CC66FF",
+";.    c #FF6600",
+">.    c #FF6633",
+",.    c #FF6666",
+"'.    c #FF6699",
+").    c #FF66CC",
+"!.    c #FF66FF",
+"~.    c #009900",
+"{.    c #009933",
+"].    c #009966",
+"^.    c #009999",
+"/.    c #0099CC",
+"(.    c #0099FF",
+"_.    c #339900",
+":.    c #339933",
+"<.    c #339966",
+"[.    c #339999",
+"}.    c #3399CC",
+"|.    c #3399FF",
+"1.    c #669900",
+"2.    c #669933",
+"3.    c #669966",
+"4.    c #669999",
+"5.    c #6699CC",
+"6.    c #6699FF",
+"7.    c #999900",
+"8.    c #999933",
+"9.    c #999966",
+"0.    c #999999",
+"a.    c #9999CC",
+"b.    c #9999FF",
+"c.    c #CC9900",
+"d.    c #CC9933",
+"e.    c #CC9966",
+"f.    c #CC9999",
+"g.    c #CC99CC",
+"h.    c #CC99FF",
+"i.    c #FF9900",
+"j.    c #FF9933",
+"k.    c #FF9966",
+"l.    c #FF9999",
+"m.    c #FF99CC",
+"n.    c #FF99FF",
+"o.    c #00CC00",
+"p.    c #00CC33",
+"q.    c #00CC66",
+"r.    c #00CC99",
+"s.    c #00CCCC",
+"t.    c #00CCFF",
+"u.    c #33CC00",
+"v.    c #33CC33",
+"w.    c #33CC66",
+"x.    c #33CC99",
+"y.    c #33CCCC",
+"z.    c #33CCFF",
+"A.    c #66CC00",
+"B.    c #66CC33",
+"C.    c #66CC66",
+"D.    c #66CC99",
+"E.    c #66CCCC",
+"F.    c #66CCFF",
+"G.    c #99CC00",
+"H.    c #99CC33",
+"I.    c #99CC66",
+"J.    c #99CC99",
+"K.    c #99CCCC",
+"L.    c #99CCFF",
+"M.    c #CCCC00",
+"N.    c #CCCC33",
+"O.    c #CCCC66",
+"P.    c #CCCC99",
+"Q.    c #CCCCCC",
+"R.    c #CCCCFF",
+"S.    c #FFCC00",
+"T.    c #FFCC33",
+"U.    c #FFCC66",
+"V.    c #FFCC99",
+"W.    c #FFCCCC",
+"X.    c #FFCCFF",
+"Y.    c #00FF00",
+"Z.    c #00FF33",
+"`.    c #00FF66",
+" +    c #00FF99",
+".+    c #00FFCC",
+"++    c #00FFFF",
+"@+    c #33FF00",
+"#+    c #33FF33",
+"$+    c #33FF66",
+"%+    c #33FF99",
+"&+    c #33FFCC",
+"*+    c #33FFFF",
+"=+    c #66FF00",
+"-+    c #66FF33",
+";+    c #66FF66",
+">+    c #66FF99",
+",+    c #66FFCC",
+"'+    c #66FFFF",
+")+    c #99FF00",
+"!+    c #99FF33",
+"~+    c #99FF66",
+"{+    c #99FF99",
+"]+    c #99FFCC",
+"^+    c #99FFFF",
+"/+    c #CCFF00",
+"(+    c #CCFF33",
+"_+    c #CCFF66",
+":+    c #CCFF99",
+"<+    c #CCFFCC",
+"[+    c #CCFFFF",
+"}+    c #FFFF00",
+"|+    c #FFFF33",
+"1+    c #FFFF66",
+"2+    c #FFFF99",
+"3+    c #FFFFCC",
+"4+    c #FFFFFF",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"H+    c #000000",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.. . . . . Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.. . 4+4+4+4+4+. . Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4+4+4+4+4+. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4+4+4+4+4+4+4+. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4+4+4+4+4+4+4+4+4+. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4+4+4+4+4+4+4+4+4+. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+. Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+. Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.. . . . Q.. . . . . . . . . . . . . . . . . Q.. . . . Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. . . . . . . . . . . . . . . . . Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. . . . . . . . . . . . . . . . . Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. . . . . . . . . . . . . . . Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. . . . . . . . . . . . . . . Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. . . . . . . . . . . . . Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. . . . . . . . . . . Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.. . . . . . . . . Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.. . . . . Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.f f f f f f f Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f . f f . 0.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f 4+4+f #+#+. 0.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f 4+4+4+* #+#+#+f W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+f #+#+#+. 0.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f f . f . f . f f W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.* 4+4+4+4+4+4+4+9 +.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.9 4+4+4+4+4+4+4+* 3.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f 4+4+4+4+4+4+4+f W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.* 4+4+4+4+4+4+4+9 +.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.9 4+4+4+4+4+4+4+* 3.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f 4+4+4+4+4+e X Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4++ 9.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f . f . f 9.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/cine_loop.xpm b/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/cine_loop.xpm
new file mode 100644 (file)
index 0000000..9f61511
--- /dev/null
@@ -0,0 +1,310 @@
+/* XPM */
+static char * cine_loop_xpm[] = {
+"36 50 257 2",
+"      c None",
+".     c #000000",
+"+     c #000033",
+"@     c #000066",
+"#     c #000099",
+"$     c #0000CC",
+"%     c #0000FF",
+"&     c #330000",
+"*     c #330033",
+"=     c #330066",
+"-     c #330099",
+";     c #3300CC",
+">     c #3300FF",
+",     c #660000",
+"'     c #660033",
+")     c #660066",
+"!     c #660099",
+"~     c #6600CC",
+"{     c #6600FF",
+"]     c #990000",
+"^     c #990033",
+"/     c #990066",
+"(     c #990099",
+"_     c #9900CC",
+":     c #9900FF",
+"<     c #CC0000",
+"[     c #CC0033",
+"}     c #CC0066",
+"|     c #CC0099",
+"1     c #CC00CC",
+"2     c #CC00FF",
+"3     c #FF0000",
+"4     c #FF0033",
+"5     c #FF0066",
+"6     c #FF0099",
+"7     c #FF00CC",
+"8     c #FF00FF",
+"9     c #003300",
+"0     c #003333",
+"a     c #003366",
+"b     c #003399",
+"c     c #0033CC",
+"d     c #0033FF",
+"e     c #333300",
+"f     c #333333",
+"g     c #333366",
+"h     c #333399",
+"i     c #3333CC",
+"j     c #3333FF",
+"k     c #663300",
+"l     c #663333",
+"m     c #663366",
+"n     c #663399",
+"o     c #6633CC",
+"p     c #6633FF",
+"q     c #993300",
+"r     c #993333",
+"s     c #993366",
+"t     c #993399",
+"u     c #9933CC",
+"v     c #9933FF",
+"w     c #CC3300",
+"x     c #CC3333",
+"y     c #CC3366",
+"z     c #CC3399",
+"A     c #CC33CC",
+"B     c #CC33FF",
+"C     c #FF3300",
+"D     c #FF3333",
+"E     c #FF3366",
+"F     c #FF3399",
+"G     c #FF33CC",
+"H     c #FF33FF",
+"I     c #006600",
+"J     c #006633",
+"K     c #006666",
+"L     c #006699",
+"M     c #0066CC",
+"N     c #0066FF",
+"O     c #336600",
+"P     c #336633",
+"Q     c #336666",
+"R     c #336699",
+"S     c #3366CC",
+"T     c #3366FF",
+"U     c #666600",
+"V     c #666633",
+"W     c #666666",
+"X     c #666699",
+"Y     c #6666CC",
+"Z     c #6666FF",
+"`     c #996600",
+" .    c #996633",
+"..    c #996666",
+"+.    c #996699",
+"@.    c #9966CC",
+"#.    c #9966FF",
+"$.    c #CC6600",
+"%.    c #CC6633",
+"&.    c #CC6666",
+"*.    c #CC6699",
+"=.    c #CC66CC",
+"-.    c #CC66FF",
+";.    c #FF6600",
+">.    c #FF6633",
+",.    c #FF6666",
+"'.    c #FF6699",
+").    c #FF66CC",
+"!.    c #FF66FF",
+"~.    c #009900",
+"{.    c #009933",
+"].    c #009966",
+"^.    c #009999",
+"/.    c #0099CC",
+"(.    c #0099FF",
+"_.    c #339900",
+":.    c #339933",
+"<.    c #339966",
+"[.    c #339999",
+"}.    c #3399CC",
+"|.    c #3399FF",
+"1.    c #669900",
+"2.    c #669933",
+"3.    c #669966",
+"4.    c #669999",
+"5.    c #6699CC",
+"6.    c #6699FF",
+"7.    c #999900",
+"8.    c #999933",
+"9.    c #999966",
+"0.    c #999999",
+"a.    c #9999CC",
+"b.    c #9999FF",
+"c.    c #CC9900",
+"d.    c #CC9933",
+"e.    c #CC9966",
+"f.    c #CC9999",
+"g.    c #CC99CC",
+"h.    c #CC99FF",
+"i.    c #FF9900",
+"j.    c #FF9933",
+"k.    c #FF9966",
+"l.    c #FF9999",
+"m.    c #FF99CC",
+"n.    c #FF99FF",
+"o.    c #00CC00",
+"p.    c #00CC33",
+"q.    c #00CC66",
+"r.    c #00CC99",
+"s.    c #00CCCC",
+"t.    c #00CCFF",
+"u.    c #33CC00",
+"v.    c #33CC33",
+"w.    c #33CC66",
+"x.    c #33CC99",
+"y.    c #33CCCC",
+"z.    c #33CCFF",
+"A.    c #66CC00",
+"B.    c #66CC33",
+"C.    c #66CC66",
+"D.    c #66CC99",
+"E.    c #66CCCC",
+"F.    c #66CCFF",
+"G.    c #99CC00",
+"H.    c #99CC33",
+"I.    c #99CC66",
+"J.    c #99CC99",
+"K.    c #99CCCC",
+"L.    c #99CCFF",
+"M.    c #CCCC00",
+"N.    c #CCCC33",
+"O.    c #CCCC66",
+"P.    c #CCCC99",
+"Q.    c #CCCCCC",
+"R.    c #CCCCFF",
+"S.    c #FFCC00",
+"T.    c #FFCC33",
+"U.    c #FFCC66",
+"V.    c #FFCC99",
+"W.    c #FFCCCC",
+"X.    c #FFCCFF",
+"Y.    c #00FF00",
+"Z.    c #00FF33",
+"`.    c #00FF66",
+" +    c #00FF99",
+".+    c #00FFCC",
+"++    c #00FFFF",
+"@+    c #33FF00",
+"#+    c #33FF33",
+"$+    c #33FF66",
+"%+    c #33FF99",
+"&+    c #33FFCC",
+"*+    c #33FFFF",
+"=+    c #66FF00",
+"-+    c #66FF33",
+";+    c #66FF66",
+">+    c #66FF99",
+",+    c #66FFCC",
+"'+    c #66FFFF",
+")+    c #99FF00",
+"!+    c #99FF33",
+"~+    c #99FF66",
+"{+    c #99FF99",
+"]+    c #99FFCC",
+"^+    c #99FFFF",
+"/+    c #CCFF00",
+"(+    c #CCFF33",
+"_+    c #CCFF66",
+":+    c #CCFF99",
+"<+    c #CCFFCC",
+"[+    c #CCFFFF",
+"}+    c #FFFF00",
+"|+    c #FFFF33",
+"1+    c #FFFF66",
+"2+    c #FFFF99",
+"3+    c #FFFFCC",
+"4+    c #FFFFFF",
+"5+    c #000000",
+"6+    c #000000",
+"7+    c #000000",
+"8+    c #000000",
+"9+    c #000000",
+"0+    c #000000",
+"a+    c #000000",
+"b+    c #000000",
+"c+    c #000000",
+"d+    c #000000",
+"e+    c #000000",
+"f+    c #000000",
+"g+    c #000000",
+"h+    c #000000",
+"i+    c #000000",
+"j+    c #000000",
+"k+    c #000000",
+"l+    c #000000",
+"m+    c #000000",
+"n+    c #000000",
+"o+    c #000000",
+"p+    c #000000",
+"q+    c #000000",
+"r+    c #000000",
+"s+    c #000000",
+"t+    c #000000",
+"u+    c #000000",
+"v+    c #000000",
+"w+    c #000000",
+"x+    c #000000",
+"y+    c #000000",
+"z+    c #000000",
+"A+    c #000000",
+"B+    c #000000",
+"C+    c #000000",
+"D+    c #000000",
+"E+    c #000000",
+"F+    c #000000",
+"G+    c #000000",
+"H+    c #000000",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ 4+@ Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# 4+4+4+# Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ 4+4+4+4+4+@ Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# 4+4+4+4+4+4+4+# Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ # @ # 4+4+4+@ # @ @ Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ 4+4+4+# W W W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# 4+4+4+@ W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# W Q.Q.Q.Q.@ 4+4+4+# W Q.Q.Q.Q.# Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.@ # W Q.Q.Q.Q.# 4+4+4+@ W Q.Q.Q.Q.@ # Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.# 4+@ W Q.Q.Q.Q.@ 4+4+4+# W Q.Q.Q.Q.# 4+@ Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.@ 4+4+# @ # @ # @ # 4+4+4+@ # @ # @ # @ 4+4+# Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.# 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+@ Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.@ 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+# Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.# 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+@ W Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.@ 4+4+@ # @ # @ # @ 4+4+4+@ # @ # @ # @ 4+4+# W Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.# 4+# W Q.Q.Q.Q.# 4+4+4+# W Q.Q.Q.Q.# 4+@ W Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.@ @ W Q.Q.Q.Q.@ 4+4+4+@ W Q.Q.Q.Q.@ # W Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# W Q.Q.Q.Q.# 4+4+4+# W Q.Q.Q.Q.@ W Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ 4+4+4+@ W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# 4+4+4+# W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# @ # @ 4+4+4+@ # @ # Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ 4+4+4+4+4+4+4+@ W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# 4+4+4+4+4+# W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ 4+4+4+@ W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.# 4+@ W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.@ W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.f f f f f f f Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f . f f . 0.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f #+#+f 4+4+. 0.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f #+#+#+* 4+4+4+f W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. #+;+#+f 4+4+4+. 0.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f f . f . f . f f W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.* 4+4+4+4+4+4+4+9 +.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.9 4+4+4+4+4+4+4+* 3.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f 4+4+4+4+4+4+4+f W Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.* 4+4+4+4+4+4+4+9 +.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.9 4+4+4+4+4+4+4+* 3.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f 4+4+4+4+4+e X Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.. 4+4+4+4+4++ 9.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.",
+"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.f . f . f 9.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q."};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/clear.xpm b/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/clear.xpm
new file mode 100644 (file)
index 0000000..1f0a4f2
--- /dev/null
@@ -0,0 +1,297 @@
+/* XPM */
+static char * clear_xpm[] = {
+"37 37 257 2",
+"      c None",
+".     c #000000",
+"+     c #800000",
+"@     c #008000",
+"#     c #808000",
+"$     c #000080",
+"%     c #800080",
+"&     c #008080",
+"*     c #C0C0C0",
+"=     c #C0DCC0",
+"-     c #A6CAF0",
+";     c #000000",
+">     c #00002A",
+",     c #000055",
+"'     c #00007F",
+")     c #0000AA",
+"!     c #0000D4",
+"~     c #002A00",
+"{     c #002A2A",
+"]     c #002A55",
+"^     c #002A7F",
+"/     c #002AAA",
+"(     c #002AD4",
+"_     c #005500",
+":     c #00552A",
+"<     c #005555",
+"[     c #00557F",
+"}     c #0055AA",
+"|     c #0055D4",
+"1     c #007F00",
+"2     c #007F2A",
+"3     c #007F55",
+"4     c #007F7F",
+"5     c #007FAA",
+"6     c #007FD4",
+"7     c #00AA00",
+"8     c #00AA2A",
+"9     c #00AA55",
+"0     c #00AA7F",
+"a     c #00AAAA",
+"b     c #00AAD4",
+"c     c #00D400",
+"d     c #00D42A",
+"e     c #00D455",
+"f     c #00D47F",
+"g     c #00D4AA",
+"h     c #00D4D4",
+"i     c #2A0000",
+"j     c #2A002A",
+"k     c #2A0055",
+"l     c #2A007F",
+"m     c #2A00AA",
+"n     c #2A00D4",
+"o     c #2A2A00",
+"p     c #2A2A2A",
+"q     c #2A2A55",
+"r     c #2A2A7F",
+"s     c #2A2AAA",
+"t     c #2A2AD4",
+"u     c #2A5500",
+"v     c #2A552A",
+"w     c #2A5555",
+"x     c #2A557F",
+"y     c #2A55AA",
+"z     c #2A55D4",
+"A     c #2A7F00",
+"B     c #2A7F2A",
+"C     c #2A7F55",
+"D     c #2A7F7F",
+"E     c #2A7FAA",
+"F     c #2A7FD4",
+"G     c #2AAA00",
+"H     c #2AAA2A",
+"I     c #2AAA55",
+"J     c #2AAA7F",
+"K     c #2AAAAA",
+"L     c #2AAAD4",
+"M     c #2AD400",
+"N     c #2AD42A",
+"O     c #2AD455",
+"P     c #2AD47F",
+"Q     c #2AD4AA",
+"R     c #2AD4D4",
+"S     c #550000",
+"T     c #55002A",
+"U     c #550055",
+"V     c #55007F",
+"W     c #5500AA",
+"X     c #5500D4",
+"Y     c #552A00",
+"Z     c #552A2A",
+"`     c #552A55",
+" .    c #552A7F",
+"..    c #552AAA",
+"+.    c #552AD4",
+"@.    c #555500",
+"#.    c #55552A",
+"$.    c #555555",
+"%.    c #55557F",
+"&.    c #5555AA",
+"*.    c #5555D4",
+"=.    c #557F00",
+"-.    c #557F2A",
+";.    c #557F55",
+">.    c #557F7F",
+",.    c #557FAA",
+"'.    c #557FD4",
+").    c #55AA00",
+"!.    c #55AA2A",
+"~.    c #55AA55",
+"{.    c #55AA7F",
+"].    c #55AAAA",
+"^.    c #55AAD4",
+"/.    c #55D400",
+"(.    c #55D42A",
+"_.    c #55D455",
+":.    c #55D47F",
+"<.    c #55D4AA",
+"[.    c #55D4D4",
+"}.    c #7F0000",
+"|.    c #7F002A",
+"1.    c #7F0055",
+"2.    c #7F007F",
+"3.    c #7F00AA",
+"4.    c #7F00D4",
+"5.    c #7F2A00",
+"6.    c #7F2A2A",
+"7.    c #7F2A55",
+"8.    c #7F2A7F",
+"9.    c #7F2AAA",
+"0.    c #7F2AD4",
+"a.    c #7F5500",
+"b.    c #7F552A",
+"c.    c #7F5555",
+"d.    c #7F557F",
+"e.    c #7F55AA",
+"f.    c #7F55D4",
+"g.    c #7F7F00",
+"h.    c #7F7F2A",
+"i.    c #7F7F55",
+"j.    c #7F7F7F",
+"k.    c #7F7FAA",
+"l.    c #7F7FD4",
+"m.    c #7FAA00",
+"n.    c #7FAA2A",
+"o.    c #7FAA55",
+"p.    c #7FAA7F",
+"q.    c #7FAAAA",
+"r.    c #7FAAD4",
+"s.    c #7FD400",
+"t.    c #7FD42A",
+"u.    c #7FD455",
+"v.    c #7FD47F",
+"w.    c #7FD4AA",
+"x.    c #7FD4D4",
+"y.    c #AA0000",
+"z.    c #AA002A",
+"A.    c #AA0055",
+"B.    c #AA007F",
+"C.    c #AA00AA",
+"D.    c #AA00D4",
+"E.    c #AA2A00",
+"F.    c #AA2A2A",
+"G.    c #AA2A55",
+"H.    c #AA2A7F",
+"I.    c #AA2AAA",
+"J.    c #AA2AD4",
+"K.    c #AA5500",
+"L.    c #AA552A",
+"M.    c #AA5555",
+"N.    c #AA557F",
+"O.    c #AA55AA",
+"P.    c #AA55D4",
+"Q.    c #AA7F00",
+"R.    c #AA7F2A",
+"S.    c #AA7F55",
+"T.    c #AA7F7F",
+"U.    c #AA7FAA",
+"V.    c #AA7FD4",
+"W.    c #AAAA00",
+"X.    c #AAAA2A",
+"Y.    c #AAAA55",
+"Z.    c #AAAA7F",
+"`.    c #AAAAAA",
+" +    c #AAAAD4",
+".+    c #AAD400",
+"++    c #AAD42A",
+"@+    c #AAD455",
+"#+    c #AAD47F",
+"$+    c #AAD4AA",
+"%+    c #AAD4D4",
+"&+    c #D40000",
+"*+    c #D4002A",
+"=+    c #D40055",
+"-+    c #D4007F",
+";+    c #D400AA",
+">+    c #D400D4",
+",+    c #D42A00",
+"'+    c #D42A2A",
+")+    c #D42A55",
+"!+    c #D42A7F",
+"~+    c #D42AAA",
+"{+    c #D42AD4",
+"]+    c #D45500",
+"^+    c #D4552A",
+"/+    c #D45555",
+"(+    c #D4557F",
+"_+    c #D455AA",
+":+    c #D455D4",
+"<+    c #D47F00",
+"[+    c #D47F2A",
+"}+    c #D47F55",
+"|+    c #D47F7F",
+"1+    c #D47FAA",
+"2+    c #D47FD4",
+"3+    c #D4AA00",
+"4+    c #D4AA2A",
+"5+    c #D4AA55",
+"6+    c #D4AA7F",
+"7+    c #D4AAAA",
+"8+    c #D4AAD4",
+"9+    c #D4D400",
+"0+    c #D4D42A",
+"a+    c #D4D455",
+"b+    c #D4D47F",
+"c+    c #D4D4AA",
+"d+    c #D4D4D4",
+"e+    c #000000",
+"f+    c #0C0C0C",
+"g+    c #191919",
+"h+    c #262626",
+"i+    c #333333",
+"j+    c #3F3F3F",
+"k+    c #4C4C4C",
+"l+    c #595959",
+"m+    c #666666",
+"n+    c #727272",
+"o+    c #7F7F7F",
+"p+    c #8C8C8C",
+"q+    c #999999",
+"r+    c #A5A5A5",
+"s+    c #B2B2B2",
+"t+    c #BFBFBF",
+"u+    c #CCCCCC",
+"v+    c #D8D8D8",
+"w+    c #E5E5E5",
+"x+    c #F2F2F2",
+"y+    c #FFFBF0",
+"z+    c #A0A0A4",
+"A+    c #808080",
+"B+    c #FF0000",
+"C+    c #00FF00",
+"D+    c #FFFF00",
+"E+    c #0000FF",
+"F+    c #FF00FF",
+"G+    c #00FFFF",
+"H+    c #FFFFFF",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * B+B+B+* * * * * * * * * * * B+B+B+* * * * * * * * * * ",
+"* * * * * * * * * * * B+B+B+* * * * * * * * * B+B+B+* * * * * * * * * * * ",
+"* * * * * * * * * * * * B+B+B+* * * * * * * B+B+B+* * * * * * * * * * * * ",
+"* * * * * * * * * * * * * B+B+B+* * * * * B+B+B+* * * * * * * * * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ B+B+B+$ $ $ B+B+B+$ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+B+B+B+$ B+B+B+H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ B+B+B+B+B+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+$ H+H+H+H+B+B+B+H+H+H+H+$ H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+B+B+B+B+B+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+B+B+B+H+B+B+B+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ B+B+B+$ $ $ B+B+B+$ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * * * * * * * * * B+B+B+* * * * * B+B+B+* * * * * * * * * * * * * ",
+"* * * * * * * * * * * * B+B+B+* * * * * * * B+B+B+* * * * * * * * * * * * ",
+"* * * * * * * * * * * B+B+B+* * * * * * * * * B+B+B+* * * * * * * * * * * ",
+"* * * * * * * * * * B+B+B+* * * * * * * * * * * B+B+B+* * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/intensity.xpm b/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/intensity.xpm
new file mode 100644 (file)
index 0000000..9545546
--- /dev/null
@@ -0,0 +1,297 @@
+/* XPM */
+static char * intensity_xpm[] = {
+"37 37 257 2",
+"      c None",
+".     c #000000",
+"+     c #800000",
+"@     c #008000",
+"#     c #808000",
+"$     c #000080",
+"%     c #800080",
+"&     c #008080",
+"*     c #C0C0C0",
+"=     c #C0DCC0",
+"-     c #A6CAF0",
+";     c #000000",
+">     c #00002A",
+",     c #000055",
+"'     c #00007F",
+")     c #0000AA",
+"!     c #0000D4",
+"~     c #002A00",
+"{     c #002A2A",
+"]     c #002A55",
+"^     c #002A7F",
+"/     c #002AAA",
+"(     c #002AD4",
+"_     c #005500",
+":     c #00552A",
+"<     c #005555",
+"[     c #00557F",
+"}     c #0055AA",
+"|     c #0055D4",
+"1     c #007F00",
+"2     c #007F2A",
+"3     c #007F55",
+"4     c #007F7F",
+"5     c #007FAA",
+"6     c #007FD4",
+"7     c #00AA00",
+"8     c #00AA2A",
+"9     c #00AA55",
+"0     c #00AA7F",
+"a     c #00AAAA",
+"b     c #00AAD4",
+"c     c #00D400",
+"d     c #00D42A",
+"e     c #00D455",
+"f     c #00D47F",
+"g     c #00D4AA",
+"h     c #00D4D4",
+"i     c #2A0000",
+"j     c #2A002A",
+"k     c #2A0055",
+"l     c #2A007F",
+"m     c #2A00AA",
+"n     c #2A00D4",
+"o     c #2A2A00",
+"p     c #2A2A2A",
+"q     c #2A2A55",
+"r     c #2A2A7F",
+"s     c #2A2AAA",
+"t     c #2A2AD4",
+"u     c #2A5500",
+"v     c #2A552A",
+"w     c #2A5555",
+"x     c #2A557F",
+"y     c #2A55AA",
+"z     c #2A55D4",
+"A     c #2A7F00",
+"B     c #2A7F2A",
+"C     c #2A7F55",
+"D     c #2A7F7F",
+"E     c #2A7FAA",
+"F     c #2A7FD4",
+"G     c #2AAA00",
+"H     c #2AAA2A",
+"I     c #2AAA55",
+"J     c #2AAA7F",
+"K     c #2AAAAA",
+"L     c #2AAAD4",
+"M     c #2AD400",
+"N     c #2AD42A",
+"O     c #2AD455",
+"P     c #2AD47F",
+"Q     c #2AD4AA",
+"R     c #2AD4D4",
+"S     c #550000",
+"T     c #55002A",
+"U     c #550055",
+"V     c #55007F",
+"W     c #5500AA",
+"X     c #5500D4",
+"Y     c #552A00",
+"Z     c #552A2A",
+"`     c #552A55",
+" .    c #552A7F",
+"..    c #552AAA",
+"+.    c #552AD4",
+"@.    c #555500",
+"#.    c #55552A",
+"$.    c #555555",
+"%.    c #55557F",
+"&.    c #5555AA",
+"*.    c #5555D4",
+"=.    c #557F00",
+"-.    c #557F2A",
+";.    c #557F55",
+">.    c #557F7F",
+",.    c #557FAA",
+"'.    c #557FD4",
+").    c #55AA00",
+"!.    c #55AA2A",
+"~.    c #55AA55",
+"{.    c #55AA7F",
+"].    c #55AAAA",
+"^.    c #55AAD4",
+"/.    c #55D400",
+"(.    c #55D42A",
+"_.    c #55D455",
+":.    c #55D47F",
+"<.    c #55D4AA",
+"[.    c #55D4D4",
+"}.    c #7F0000",
+"|.    c #7F002A",
+"1.    c #7F0055",
+"2.    c #7F007F",
+"3.    c #7F00AA",
+"4.    c #7F00D4",
+"5.    c #7F2A00",
+"6.    c #7F2A2A",
+"7.    c #7F2A55",
+"8.    c #7F2A7F",
+"9.    c #7F2AAA",
+"0.    c #7F2AD4",
+"a.    c #7F5500",
+"b.    c #7F552A",
+"c.    c #7F5555",
+"d.    c #7F557F",
+"e.    c #7F55AA",
+"f.    c #7F55D4",
+"g.    c #7F7F00",
+"h.    c #7F7F2A",
+"i.    c #7F7F55",
+"j.    c #7F7F7F",
+"k.    c #7F7FAA",
+"l.    c #7F7FD4",
+"m.    c #7FAA00",
+"n.    c #7FAA2A",
+"o.    c #7FAA55",
+"p.    c #7FAA7F",
+"q.    c #7FAAAA",
+"r.    c #7FAAD4",
+"s.    c #7FD400",
+"t.    c #7FD42A",
+"u.    c #7FD455",
+"v.    c #7FD47F",
+"w.    c #7FD4AA",
+"x.    c #7FD4D4",
+"y.    c #AA0000",
+"z.    c #AA002A",
+"A.    c #AA0055",
+"B.    c #AA007F",
+"C.    c #AA00AA",
+"D.    c #AA00D4",
+"E.    c #AA2A00",
+"F.    c #AA2A2A",
+"G.    c #AA2A55",
+"H.    c #AA2A7F",
+"I.    c #AA2AAA",
+"J.    c #AA2AD4",
+"K.    c #AA5500",
+"L.    c #AA552A",
+"M.    c #AA5555",
+"N.    c #AA557F",
+"O.    c #AA55AA",
+"P.    c #AA55D4",
+"Q.    c #AA7F00",
+"R.    c #AA7F2A",
+"S.    c #AA7F55",
+"T.    c #AA7F7F",
+"U.    c #AA7FAA",
+"V.    c #AA7FD4",
+"W.    c #AAAA00",
+"X.    c #AAAA2A",
+"Y.    c #AAAA55",
+"Z.    c #AAAA7F",
+"`.    c #AAAAAA",
+" +    c #AAAAD4",
+".+    c #AAD400",
+"++    c #AAD42A",
+"@+    c #AAD455",
+"#+    c #AAD47F",
+"$+    c #AAD4AA",
+"%+    c #AAD4D4",
+"&+    c #D40000",
+"*+    c #D4002A",
+"=+    c #D40055",
+"-+    c #D4007F",
+";+    c #D400AA",
+">+    c #D400D4",
+",+    c #D42A00",
+"'+    c #D42A2A",
+")+    c #D42A55",
+"!+    c #D42A7F",
+"~+    c #D42AAA",
+"{+    c #D42AD4",
+"]+    c #D45500",
+"^+    c #D4552A",
+"/+    c #D45555",
+"(+    c #D4557F",
+"_+    c #D455AA",
+":+    c #D455D4",
+"<+    c #D47F00",
+"[+    c #D47F2A",
+"}+    c #D47F55",
+"|+    c #D47F7F",
+"1+    c #D47FAA",
+"2+    c #D47FD4",
+"3+    c #D4AA00",
+"4+    c #D4AA2A",
+"5+    c #D4AA55",
+"6+    c #D4AA7F",
+"7+    c #D4AAAA",
+"8+    c #D4AAD4",
+"9+    c #D4D400",
+"0+    c #D4D42A",
+"a+    c #D4D455",
+"b+    c #D4D47F",
+"c+    c #D4D4AA",
+"d+    c #D4D4D4",
+"e+    c #000000",
+"f+    c #0C0C0C",
+"g+    c #191919",
+"h+    c #262626",
+"i+    c #333333",
+"j+    c #3F3F3F",
+"k+    c #4C4C4C",
+"l+    c #595959",
+"m+    c #666666",
+"n+    c #727272",
+"o+    c #7F7F7F",
+"p+    c #8C8C8C",
+"q+    c #999999",
+"r+    c #A5A5A5",
+"s+    c #B2B2B2",
+"t+    c #BFBFBF",
+"u+    c #CCCCCC",
+"v+    c #D8D8D8",
+"w+    c #E5E5E5",
+"x+    c #F2F2F2",
+"y+    c #FFFBF0",
+"z+    c #A0A0A4",
+"A+    c #808080",
+"B+    c #FF0000",
+"C+    c #00FF00",
+"D+    c #FFFF00",
+"E+    c #0000FF",
+"F+    c #FF00FF",
+"G+    c #00FFFF",
+"H+    c #FFFFFF",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * B+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * B+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * B+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * B+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * B+B+B+B+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * $ $ $ $ $ $ $ $ * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * $ * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * $ * * * * * * * $ * * * * * * * * * * * * * * $ * * * * ",
+"* * * * * * * * * $ * * * * * * $ * $ * * $ * $ * * $ * $ $ $ $ * $ * * * ",
+"* * * * * * * * * $ * * * * * $ * * * $ $ * * * $ $ * * * * $ * * * $ * * ",
+"* * * * * * * * * $ * * * * * $ * * * $ $ * * * $ * * * * $ * * * * $ * * ",
+"* * * * * * * * * $ * * * * * $ * * $ * * $ * $ * * * * $ $ $ $ * * $ * * ",
+"* * * * * * * * * $ * * * * * * $ * * * * * * * * * * * * * * * * $ * * * ",
+"* * * * * * * * * $ * * * * * * * $ * * * * * * * * * * * * * * $ * * * * ",
+"* * * * * * $ $ $ $ $ $ $ $ * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+$ H+H+H+H+H+$ H+H+H+H+H+$ H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/linear.xpm b/lib/maracasVisuLib/src/interface/wxWindows/widgets/res/linear.xpm
new file mode 100644 (file)
index 0000000..c173565
--- /dev/null
@@ -0,0 +1,297 @@
+/* XPM */
+static char * linear_xpm[] = {
+"37 37 257 2",
+"      c None",
+".     c #000000",
+"+     c #800000",
+"@     c #008000",
+"#     c #808000",
+"$     c #000080",
+"%     c #800080",
+"&     c #008080",
+"*     c #C0C0C0",
+"=     c #C0DCC0",
+"-     c #A6CAF0",
+";     c #000000",
+">     c #00002A",
+",     c #000055",
+"'     c #00007F",
+")     c #0000AA",
+"!     c #0000D4",
+"~     c #002A00",
+"{     c #002A2A",
+"]     c #002A55",
+"^     c #002A7F",
+"/     c #002AAA",
+"(     c #002AD4",
+"_     c #005500",
+":     c #00552A",
+"<     c #005555",
+"[     c #00557F",
+"}     c #0055AA",
+"|     c #0055D4",
+"1     c #007F00",
+"2     c #007F2A",
+"3     c #007F55",
+"4     c #007F7F",
+"5     c #007FAA",
+"6     c #007FD4",
+"7     c #00AA00",
+"8     c #00AA2A",
+"9     c #00AA55",
+"0     c #00AA7F",
+"a     c #00AAAA",
+"b     c #00AAD4",
+"c     c #00D400",
+"d     c #00D42A",
+"e     c #00D455",
+"f     c #00D47F",
+"g     c #00D4AA",
+"h     c #00D4D4",
+"i     c #2A0000",
+"j     c #2A002A",
+"k     c #2A0055",
+"l     c #2A007F",
+"m     c #2A00AA",
+"n     c #2A00D4",
+"o     c #2A2A00",
+"p     c #2A2A2A",
+"q     c #2A2A55",
+"r     c #2A2A7F",
+"s     c #2A2AAA",
+"t     c #2A2AD4",
+"u     c #2A5500",
+"v     c #2A552A",
+"w     c #2A5555",
+"x     c #2A557F",
+"y     c #2A55AA",
+"z     c #2A55D4",
+"A     c #2A7F00",
+"B     c #2A7F2A",
+"C     c #2A7F55",
+"D     c #2A7F7F",
+"E     c #2A7FAA",
+"F     c #2A7FD4",
+"G     c #2AAA00",
+"H     c #2AAA2A",
+"I     c #2AAA55",
+"J     c #2AAA7F",
+"K     c #2AAAAA",
+"L     c #2AAAD4",
+"M     c #2AD400",
+"N     c #2AD42A",
+"O     c #2AD455",
+"P     c #2AD47F",
+"Q     c #2AD4AA",
+"R     c #2AD4D4",
+"S     c #550000",
+"T     c #55002A",
+"U     c #550055",
+"V     c #55007F",
+"W     c #5500AA",
+"X     c #5500D4",
+"Y     c #552A00",
+"Z     c #552A2A",
+"`     c #552A55",
+" .    c #552A7F",
+"..    c #552AAA",
+"+.    c #552AD4",
+"@.    c #555500",
+"#.    c #55552A",
+"$.    c #555555",
+"%.    c #55557F",
+"&.    c #5555AA",
+"*.    c #5555D4",
+"=.    c #557F00",
+"-.    c #557F2A",
+";.    c #557F55",
+">.    c #557F7F",
+",.    c #557FAA",
+"'.    c #557FD4",
+").    c #55AA00",
+"!.    c #55AA2A",
+"~.    c #55AA55",
+"{.    c #55AA7F",
+"].    c #55AAAA",
+"^.    c #55AAD4",
+"/.    c #55D400",
+"(.    c #55D42A",
+"_.    c #55D455",
+":.    c #55D47F",
+"<.    c #55D4AA",
+"[.    c #55D4D4",
+"}.    c #7F0000",
+"|.    c #7F002A",
+"1.    c #7F0055",
+"2.    c #7F007F",
+"3.    c #7F00AA",
+"4.    c #7F00D4",
+"5.    c #7F2A00",
+"6.    c #7F2A2A",
+"7.    c #7F2A55",
+"8.    c #7F2A7F",
+"9.    c #7F2AAA",
+"0.    c #7F2AD4",
+"a.    c #7F5500",
+"b.    c #7F552A",
+"c.    c #7F5555",
+"d.    c #7F557F",
+"e.    c #7F55AA",
+"f.    c #7F55D4",
+"g.    c #7F7F00",
+"h.    c #7F7F2A",
+"i.    c #7F7F55",
+"j.    c #7F7F7F",
+"k.    c #7F7FAA",
+"l.    c #7F7FD4",
+"m.    c #7FAA00",
+"n.    c #7FAA2A",
+"o.    c #7FAA55",
+"p.    c #7FAA7F",
+"q.    c #7FAAAA",
+"r.    c #7FAAD4",
+"s.    c #7FD400",
+"t.    c #7FD42A",
+"u.    c #7FD455",
+"v.    c #7FD47F",
+"w.    c #7FD4AA",
+"x.    c #7FD4D4",
+"y.    c #AA0000",
+"z.    c #AA002A",
+"A.    c #AA0055",
+"B.    c #AA007F",
+"C.    c #AA00AA",
+"D.    c #AA00D4",
+"E.    c #AA2A00",
+"F.    c #AA2A2A",
+"G.    c #AA2A55",
+"H.    c #AA2A7F",
+"I.    c #AA2AAA",
+"J.    c #AA2AD4",
+"K.    c #AA5500",
+"L.    c #AA552A",
+"M.    c #AA5555",
+"N.    c #AA557F",
+"O.    c #AA55AA",
+"P.    c #AA55D4",
+"Q.    c #AA7F00",
+"R.    c #AA7F2A",
+"S.    c #AA7F55",
+"T.    c #AA7F7F",
+"U.    c #AA7FAA",
+"V.    c #AA7FD4",
+"W.    c #AAAA00",
+"X.    c #AAAA2A",
+"Y.    c #AAAA55",
+"Z.    c #AAAA7F",
+"`.    c #AAAAAA",
+" +    c #AAAAD4",
+".+    c #AAD400",
+"++    c #AAD42A",
+"@+    c #AAD455",
+"#+    c #AAD47F",
+"$+    c #AAD4AA",
+"%+    c #AAD4D4",
+"&+    c #D40000",
+"*+    c #D4002A",
+"=+    c #D40055",
+"-+    c #D4007F",
+";+    c #D400AA",
+">+    c #D400D4",
+",+    c #D42A00",
+"'+    c #D42A2A",
+")+    c #D42A55",
+"!+    c #D42A7F",
+"~+    c #D42AAA",
+"{+    c #D42AD4",
+"]+    c #D45500",
+"^+    c #D4552A",
+"/+    c #D45555",
+"(+    c #D4557F",
+"_+    c #D455AA",
+":+    c #D455D4",
+"<+    c #D47F00",
+"[+    c #D47F2A",
+"}+    c #D47F55",
+"|+    c #D47F7F",
+"1+    c #D47FAA",
+"2+    c #D47FD4",
+"3+    c #D4AA00",
+"4+    c #D4AA2A",
+"5+    c #D4AA55",
+"6+    c #D4AA7F",
+"7+    c #D4AAAA",
+"8+    c #D4AAD4",
+"9+    c #D4D400",
+"0+    c #D4D42A",
+"a+    c #D4D455",
+"b+    c #D4D47F",
+"c+    c #D4D4AA",
+"d+    c #D4D4D4",
+"e+    c #000000",
+"f+    c #0C0C0C",
+"g+    c #191919",
+"h+    c #262626",
+"i+    c #333333",
+"j+    c #3F3F3F",
+"k+    c #4C4C4C",
+"l+    c #595959",
+"m+    c #666666",
+"n+    c #727272",
+"o+    c #7F7F7F",
+"p+    c #8C8C8C",
+"q+    c #999999",
+"r+    c #A5A5A5",
+"s+    c #B2B2B2",
+"t+    c #BFBFBF",
+"u+    c #CCCCCC",
+"v+    c #D8D8D8",
+"w+    c #E5E5E5",
+"x+    c #F2F2F2",
+"y+    c #FFFBF0",
+"z+    c #A0A0A4",
+"A+    c #808080",
+"B+    c #FF0000",
+"C+    c #00FF00",
+"D+    c #FFFF00",
+"E+    c #0000FF",
+"F+    c #FF00FF",
+"G+    c #00FFFF",
+"H+    c #FFFFFF",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * . . . * * * * * * * * * * * * * * * * * * * * * * * B+B+B+* * * * ",
+"* * * . * . * . * * * * * * * * * * * * * * * * * * * * * * B+* * B+* * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * B+B+B+* * * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * B+* * B+* * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * B+* * B+* * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * . * * * * * * * * * * $ * * * * $ * * * * * * * * * * * * * * * ",
+"* * * * * . * * * * * * * * * $ $ * * * * $ $ * * * * * * * * * * * * * * ",
+"* * * * * . * * * * $ * * * $ * * $ * * $ * $ * * * * * * * * * * * * * * ",
+"* * * * * . * * * $ $ * * * $ * * $ $ $ * * * $ $ * * * * * * * * * * * * ",
+"* * * * * . * * * $ * $ * $ $ * * * * * * * * * $ * * $ $ * * * * * * * * ",
+"* * * * * . * * $ $ * * $ * * * * * * * * * * * $ $ $ * * $ * * * * * * * ",
+"* * * * * . * * $ * * * * * * * * * * * * * * * * * * * * $ * * * * * * * ",
+"* * * * * . * $ $ * * * * * * * * * * * * * * * * * * * * $ . * * * * * * ",
+"* * * * * . * $ * * * * * * * * * * * * * * * * * * * * * * $ . * * * * * ",
+"* * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * * ",
+"* * * * * . * * * * * * * * * * * * * * * * * * * * * * * * * . * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * . * * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+$ H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+$ H+H+H+H+H+$ H+H+H+H+H+$ H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+$ * * * * * ",
+"* * * * * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "};
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk2DQuantSliceWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk2DQuantSliceWidget.cxx
new file mode 100644 (file)
index 0000000..3189621
--- /dev/null
@@ -0,0 +1,189 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk2DQuantSliceWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtk2DQuantSliceWidget.h"
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+
+/**
+ * Again wxVTK is an hybrid class, double click was done using wxWindows, simply
+ * because VTK doesn't provide such facility (as opposed to wheel support that is
+ * supposed to be merged in VTK trunk sooner or later:
+ *
+ * http://public.kitware.com/pipermail/vtkusers/2003-August/019548.html
+ * http://www.creatis.insa-lyon.fr/~malaterre/vtk/wheel.patch
+ */
+
+vtk2DQuantSliceWidget::vtk2DQuantSliceWidget( wxWindow* parent, wxWindowID id,
+                                             const wxPoint& pos, const wxSize& size,
+                                             long style, const wxString& name)
+                                             : wxImageViewerWidget( parent, id, pos, size, style, name)
+{
+       // Contour
+       _cntActor                                               = NULL;
+       _cntMapper                                              = NULL;
+
+       // Diameter Min
+       _diameterMinvtkActor                    = NULL;
+       _diameterMinvtkPolyLine                 = NULL;
+       _diameterMinvtkDataSetMapper    = NULL;
+       _diameterMinvtkUnstructuredGrid = NULL;
+
+       // Diameter Max
+       _diameterMaxvtkActor                    = NULL;
+       _diameterMaxvtkPolyLine                 = NULL;
+       _diameterMaxvtkDataSetMapper    = NULL;
+       _diameterMaxvtkUnstructuredGrid = NULL;
+}
+
+
+vtk2DQuantSliceWidget::~vtk2DQuantSliceWidget( )
+{
+       // Contour
+       if( _cntActor )                                                 _cntActor->Delete();
+       if( _cntMapper )                                                _cntMapper->Delete();
+
+       // Diameter Min
+       if( _diameterMinvtkActor )                              _diameterMinvtkActor->Delete();
+       if( _diameterMinvtkPolyLine )                   _diameterMinvtkPolyLine->Delete();
+       if( _diameterMinvtkDataSetMapper )              _diameterMinvtkDataSetMapper->Delete();
+       if( _diameterMinvtkUnstructuredGrid )   _diameterMinvtkUnstructuredGrid->Delete();
+
+       // Diameter Max
+       if( _diameterMaxvtkActor )                              _diameterMaxvtkActor->Delete();
+       if( _diameterMaxvtkPolyLine )                   _diameterMaxvtkPolyLine->Delete();
+       if( _diameterMaxvtkDataSetMapper )              _diameterMaxvtkDataSetMapper->Delete();
+       if( _diameterMaxvtkUnstructuredGrid )   _diameterMaxvtkUnstructuredGrid->Delete();
+}
+
+//----------------------------------------------------------------------------
+
+//void vtk2DQuantSliceWidget::SetContour( vtkUnstructuredGrid *cnt )
+void vtk2DQuantSliceWidget::SetContour( vtkPolyData *cnt )
+{
+//  _cntMapper = vtkDataSetMapper::New( ); 
+//  _cntMapper = vtkDataSetMapper::New( );
+  
+  _cnt = cnt;
+
+  if( !_cntMapper ) {
+    _cntMapper = vtkPolyDataMapper::New( );
+    _cntMapper->ScalarVisibilityOff( );
+    _cntMapper->ImmediateModeRenderingOn();
+  }
+  _cntMapper->SetInput( _cnt );
+//  _cntMapper->SetInput( _cnt->GetOutput( ) );
+
+  if( !_cntActor ) {
+    _cntActor = vtkActor::New( );
+    _cntActor->SetMapper( _cntMapper );
+    (_cntActor->GetProperty( ))->SetColor( 0 , 1 , 0 );
+    (_cntActor->GetProperty( ))->SetLineWidth( 2 );
+    (_cntActor->GetProperty( ))->BackfaceCullingOff( );
+  }
+  else{
+    _imageViewer->GetRenderer()->RemoveActor( _cntActor );
+  }
+
+  _cntActor->SetPosition(0,0,100);
+  _imageViewer->GetRenderer()->AddActor( _cntActor );
+  _imageViewer->Render( );
+
+}
+
+
+//----------------------------------------------------------------------------
+void vtk2DQuantSliceWidget::SetDiameterMin(vtkPoints *diameterMin, bool showActor){
+       if (_diameterMinvtkActor!=NULL)                         _imageViewer->GetRenderer()->RemoveActor( _diameterMinvtkActor );
+       if (_diameterMinvtkActor!=NULL)                         _diameterMinvtkActor->Delete();
+       if (_diameterMinvtkPolyLine!=NULL)                      _diameterMinvtkPolyLine->Delete();
+       if (_diameterMinvtkDataSetMapper!=NULL)         _diameterMinvtkDataSetMapper->Delete();
+       if (_diameterMinvtkUnstructuredGrid!=NULL)      _diameterMinvtkUnstructuredGrid->Delete();
+
+       _diameterMinvtkActor                    =       vtkActor::New();
+       _diameterMinvtkPolyLine                 =       vtkPolyLine::New();
+       _diameterMinvtkDataSetMapper    =       vtkDataSetMapper::New();
+       _diameterMinvtkUnstructuredGrid =       vtkUnstructuredGrid::New();
+
+       // generate new actor
+       (_diameterMinvtkPolyLine->GetPointIds() )->SetNumberOfIds(2);
+       ( _diameterMinvtkPolyLine->GetPointIds() )->SetId(0,0);
+       ( _diameterMinvtkPolyLine->GetPointIds() )->SetId(1,1);
+       _diameterMinvtkUnstructuredGrid->Allocate(1,1);
+       _diameterMinvtkUnstructuredGrid->InsertNextCell(_diameterMinvtkPolyLine->GetCellType() , 
+                                                        _diameterMinvtkPolyLine->GetPointIds() );
+       _diameterMinvtkUnstructuredGrid->SetPoints( diameterMin );
+       _diameterMinvtkDataSetMapper->SetInput(_diameterMinvtkUnstructuredGrid);
+       _diameterMinvtkDataSetMapper->ImmediateModeRenderingOn();
+       _diameterMinvtkActor->SetMapper(_diameterMinvtkDataSetMapper);
+       _diameterMinvtkActor->GetProperty()->BackfaceCullingOn();
+       _diameterMinvtkActor->GetProperty()->SetDiffuseColor(1,0,0);
+       // add new actor
+       if (showActor==true) _imageViewer->GetRenderer()->AddActor( _diameterMinvtkActor );
+       // Refresh Widget
+       _imageViewer->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk2DQuantSliceWidget::SetDiameterMax(vtkPoints *diameterMax, bool showActor){
+       if (_diameterMaxvtkActor!=NULL)                         _imageViewer->GetRenderer()->RemoveActor( _diameterMaxvtkActor );
+       if (_diameterMaxvtkActor!=NULL)                         _diameterMaxvtkActor->Delete();
+       if (_diameterMaxvtkPolyLine!=NULL)                      _diameterMaxvtkPolyLine->Delete();
+       if (_diameterMaxvtkDataSetMapper!=NULL)         _diameterMaxvtkDataSetMapper->Delete();
+       if (_diameterMaxvtkUnstructuredGrid!=NULL)      _diameterMaxvtkUnstructuredGrid->Delete();
+
+       _diameterMaxvtkActor                    =       vtkActor::New();
+       _diameterMaxvtkPolyLine                 =       vtkPolyLine::New();
+       _diameterMaxvtkDataSetMapper    =       vtkDataSetMapper::New();
+       _diameterMaxvtkUnstructuredGrid =       vtkUnstructuredGrid::New();
+
+       // generate new actor
+       (_diameterMaxvtkPolyLine->GetPointIds() )->SetNumberOfIds(2);
+       ( _diameterMaxvtkPolyLine->GetPointIds() )->SetId(0,0);
+       ( _diameterMaxvtkPolyLine->GetPointIds() )->SetId(1,1);
+       _diameterMaxvtkUnstructuredGrid->Allocate(1,1);
+       _diameterMaxvtkUnstructuredGrid->InsertNextCell(_diameterMaxvtkPolyLine->GetCellType() , 
+                                                                                                                        _diameterMaxvtkPolyLine->GetPointIds() );
+       _diameterMaxvtkUnstructuredGrid->SetPoints( diameterMax );
+       _diameterMaxvtkDataSetMapper->SetInput(_diameterMaxvtkUnstructuredGrid);
+       _diameterMaxvtkDataSetMapper->ImmediateModeRenderingOn();
+       _diameterMaxvtkActor->SetMapper(_diameterMaxvtkDataSetMapper);
+       _diameterMaxvtkActor->GetProperty()->BackfaceCullingOn();
+       _diameterMaxvtkActor->GetProperty()->SetDiffuseColor(0,0,1);
+       // add new actor
+       if (showActor==true) _imageViewer->GetRenderer()->AddActor( _diameterMaxvtkActor );
+       // Refresh Widget
+       _imageViewer->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk2DQuantSliceWidget::Show2DContourDiameters( ){
+  if (_cntActor!=NULL)                         _imageViewer->GetRenderer()->AddActor( _cntActor );
+  if (_diameterMinvtkActor!=NULL)      _imageViewer->GetRenderer()->AddActor( _diameterMinvtkActor );
+  if (_diameterMaxvtkActor!=NULL)      _imageViewer->GetRenderer()->AddActor( _diameterMaxvtkActor );
+  _imageViewer->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk2DQuantSliceWidget::Hide2DContourDiameters( ){
+       if ( _cntActor                          != NULL ) { _imageViewer->GetRenderer()->RemoveActor( _cntActor );            }
+       if ( _diameterMinvtkActor       != NULL ) { _imageViewer->GetRenderer()->RemoveActor( _diameterMinvtkActor ); }
+       if ( _diameterMaxvtkActor       != NULL ) { _imageViewer->GetRenderer()->RemoveActor( _diameterMaxvtkActor ); }
+  _imageViewer->Render( );
+}
+
+//----------------------------------------------------------------------------
+/*BEGIN_EVENT_TABLE( vtk2DQuantSliceWidget, wxVTKRenderWindowInteractor )
+    EVT_LEFT_DCLICK( vtk2DQuantSliceWidget::OnLeftDClick )
+END_EVENT_TABLE( );
+*/
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk2DQuantSliceWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk2DQuantSliceWidget.h
new file mode 100644 (file)
index 0000000..1ea8024
--- /dev/null
@@ -0,0 +1,78 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk2DQuantSliceWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __VTK2DQUANTSLICEWIDGET__
+#define __VTK2DQUANTSLICEWIDGET__
+
+#include "wxImageViewerWidget.h"
+
+#include <vtkActor.h>
+#include <vtkPolyLine.h>
+#include <vtkDataSetMapper.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkUnstructuredGrid.h>
+
+
+/**
+ * \brief Class that brigde to VTK, override double click...
+ */
+class vtk2DQuantSliceWidget : public wxImageViewerWidget
+{
+public:
+
+    vtk2DQuantSliceWidget( wxWindow* parent,
+        wxWindowID id,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = wxSUNKEN_BORDER, //wxTAB_TRAVERSAL,
+        const wxString& name = wxPanelNameStr
+        );
+    ~vtk2DQuantSliceWidget( );
+
+    //void SetContour( vtkUnstructuredGrid *cnt );
+    void SetContour( vtkPolyData *cnt );
+       void SetDiameterMin(vtkPoints *diameterMin, bool showActor);
+       void SetDiameterMax(vtkPoints *diameterMax, bool showActor);
+       void Show2DContourDiameters();
+       void Hide2DContourDiameters();
+
+protected:
+
+private:
+
+       // Contour
+       vtkPolyData                     *_cnt; 
+       vtkPolyDataMapper       *_cntMapper;
+       vtkActor                        *_cntActor;
+
+       // Diameter Min
+       vtkActor                        *_diameterMinvtkActor;
+       vtkPolyLine                     *_diameterMinvtkPolyLine;
+       vtkDataSetMapper        *_diameterMinvtkDataSetMapper;
+       vtkUnstructuredGrid *_diameterMinvtkUnstructuredGrid;
+
+       // Diameter Max
+       vtkActor                        *_diameterMaxvtkActor;
+       vtkPolyLine                     *_diameterMaxvtkPolyLine;
+       vtkDataSetMapper        *_diameterMaxvtkDataSetMapper;
+       vtkUnstructuredGrid *_diameterMaxvtkUnstructuredGrid;
+
+
+//  DECLARE_EVENT_TABLE( );
+
+};
+
+#endif //__VTK2DQUANTSLICEWIDGET__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DQuantSurfaceWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DQuantSurfaceWidget.cxx
new file mode 100644 (file)
index 0000000..03278f4
--- /dev/null
@@ -0,0 +1,610 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk3DQuantSurfaceWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtk3DQuantSurfaceWidget.h"
+#include <vtkPointPicker.h>
+#include <vtkCamera.h>
+#include <vtkWindowLevelLookupTable.h>
+// EED
+#include <vtkPolyLine.h> 
+#include <vtkPlaneSource.h> 
+
+
+
+//----------------------------------------------------------------------------
+RectangleGuideVtk::RectangleGuideVtk(){
+  _showActor   = false;
+  _grid                        = NULL; 
+  _actor               = NULL;
+  _points              = NULL;
+  _mapper              = NULL;
+  _poly_line   = NULL;
+  _iSlice              = -1;
+}
+//----------------------------------------------------------------------------
+RectangleGuideVtk::~RectangleGuideVtk(){
+  if( _grid             )      _grid->Delete();
+  if( _actor    )      _actor->Delete();
+  if( _points   )      _points->Delete();
+  if( _mapper   )      _mapper->Delete();
+  if( _poly_line )     _poly_line->Delete();
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+listContourVTK::listContourVTK(vtk3DQuantSurfaceWidget *quantSurfaceWidget){
+       _r=1;
+       _g=1;
+       _b=1;
+       _vtk3DQuantSurfaceWidget=quantSurfaceWidget;
+}
+//----------------------------------------------------------------------------
+listContourVTK::~listContourVTK(){
+       EraseListContourActor();
+}
+//----------------------------------------------------------------------------
+void listContourVTK::SetColour(int r,int g,int b){
+       _r=r;
+       _g=g;
+       _b=b;
+}
+//----------------------------------------------------------------------------
+void listContourVTK::InitListContourActor(int nos){
+  EraseListContourActor();
+  int i;
+  for (i=0;i<nos;i++){
+    _lst3DContoursVtkActor.push_back( NULL );
+    _lst3DContoursVtkUnstructuredGrid.push_back( NULL );
+    _lst3DContoursVtkDataSetMapper.push_back( NULL );
+    _lst3DContoursVtkPolyLine.push_back( NULL );
+  }
+
+  // Refresh 3DWidget
+// EED 31 mai 2007 
+//  vtkRenderWindow* pRenderWindow = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderWindow();
+//  pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void listContourVTK::EraseListContourActor(){
+       int i;
+       for (i=0;i<_lst3DContoursVtkActor.size();i++){
+               EraseSliceContourActor(i,false);
+        }
+       _lst3DContoursVtkActor.clear();
+       _lst3DContoursVtkUnstructuredGrid.clear();
+       _lst3DContoursVtkDataSetMapper.clear();
+       _lst3DContoursVtkPolyLine.clear();
+}
+//----------------------------------------------------------------------------
+void listContourVTK::EraseSliceContourActor(int slice, bool refresh){
+       if (_lst3DContoursVtkActor[slice]!=NULL){
+               vtkRenderer *pRenderer = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderer();
+               if (_lst3DContoursVtkActor[slice])                                      pRenderer->RemoveActor(_lst3DContoursVtkActor[slice]);
+               if (_lst3DContoursVtkUnstructuredGrid[slice])           _lst3DContoursVtkUnstructuredGrid[slice]->Delete();
+               if (_lst3DContoursVtkDataSetMapper[slice])                      _lst3DContoursVtkDataSetMapper[slice]->Delete();
+               if (_lst3DContoursVtkPolyLine[slice])                           _lst3DContoursVtkPolyLine[slice]->Delete();
+               if (_lst3DContoursVtkActor[slice])                                      _lst3DContoursVtkActor[slice]->Delete();
+               _lst3DContoursVtkUnstructuredGrid[slice]=NULL;
+               _lst3DContoursVtkDataSetMapper[slice]=NULL;
+               _lst3DContoursVtkPolyLine[slice]=NULL;
+               _lst3DContoursVtkActor[slice]=NULL;
+       }
+       if (refresh==true){
+               // Refresh 3DWidget
+               vtkRenderWindow* pRenderWindow = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderWindow();
+               pRenderWindow->Render( );
+       }
+}
+//----------------------------------------------------------------------------
+void listContourVTK::Set3DContourActor( int slice, vtkPoints* contour3D, bool showActor){
+       // Erase old actor
+       EraseSliceContourActor(slice);
+       // generate new actor
+       int id,numberOfPoints;
+       numberOfPoints=contour3D->GetNumberOfPoints ();
+       _lst3DContoursVtkPolyLine[slice]        = vtkPolyLine::New();
+
+       ( _lst3DContoursVtkPolyLine[slice]->GetPointIds() )->SetNumberOfIds(numberOfPoints);
+       for (id=0;id<numberOfPoints;id++){
+               ( _lst3DContoursVtkPolyLine[slice]->GetPointIds() )->SetId(id,id);
+       }
+       _lst3DContoursVtkUnstructuredGrid[slice]=vtkUnstructuredGrid::New();
+       _lst3DContoursVtkUnstructuredGrid[slice]->Allocate(1,1);
+       _lst3DContoursVtkUnstructuredGrid[slice]->InsertNextCell(   _lst3DContoursVtkPolyLine[slice]->GetCellType() , 
+                                                                                                                               _lst3DContoursVtkPolyLine[slice]->GetPointIds() );
+       _lst3DContoursVtkUnstructuredGrid[slice]->SetPoints( contour3D );
+       _lst3DContoursVtkDataSetMapper[slice] = vtkDataSetMapper::New();
+       _lst3DContoursVtkDataSetMapper[slice]->SetInput(_lst3DContoursVtkUnstructuredGrid[slice]);
+       _lst3DContoursVtkDataSetMapper[slice]->ImmediateModeRenderingOn();
+       _lst3DContoursVtkActor[slice]=vtkActor::New();
+       _lst3DContoursVtkActor[slice]->SetMapper(_lst3DContoursVtkDataSetMapper[slice]);
+       _lst3DContoursVtkActor[slice]->GetProperty()->BackfaceCullingOn();
+       _lst3DContoursVtkActor[slice]->GetProperty()->SetDiffuseColor(_r,_g,_b);
+       _lst3DContoursVtkActor[slice]->PickableOff( );
+       // add new actor
+       vtkRenderer *pRenderer                  = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderer();
+       vtkRenderWindow* pRenderWindow  = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderWindow();
+
+       if (showActor==true){ 
+               pRenderer->AddActor( _lst3DContoursVtkActor[slice] );
+       }
+       // Refresh 3DWidget
+       pRenderWindow->Render( );
+
+
+}
+//----------------------------------------------------------------------------
+void listContourVTK::Show3DContourActor( ){
+       vtkRenderer *pRenderer                  = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderer();
+       vtkRenderWindow* pRenderWindow  = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderWindow();
+       int i;
+       for (i=0;i<_lst3DContoursVtkActor.size();i++){
+               if (_lst3DContoursVtkActor[i]!=NULL) pRenderer->AddActor( _lst3DContoursVtkActor[i] );  
+        }
+       // Refresh 3DWidget
+       pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void listContourVTK::Hide3DContourActor( ){
+       vtkRenderer *pRenderer                  = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderer();
+       vtkRenderWindow* pRenderWindow  = _vtk3DQuantSurfaceWidget->QuantSurfaceWidget_GetRenderWindow();
+       int i;
+       for (i=0;i<_lst3DContoursVtkActor.size();i++){
+               if (_lst3DContoursVtkActor[i]!=NULL) pRenderer->RemoveActor( _lst3DContoursVtkActor[i] );       
+        }
+       // Refresh 3DWidget
+       pRenderWindow->Render( );
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+
+
+
+/**
+ * Again wxVTK is an hybrid class, double click was done using wxWindows, simply
+ * because VTK doesn't provide such facility (as opposed to wheel support that is
+ * supposed to be merged in VTK trunk sooner or later:
+ *
+ * http://public.kitware.com/pipermail/vtkusers/2003-August/019548.html
+ * http://www.creatis.insa-lyon.fr/~malaterre/vtk/wheel.patch
+ */
+
+//----------------------------------------------------------------------------
+/*
+BEGIN_EVENT_TABLE( vtk3DQuantSurfaceWidget, vtk3DSurfaceWidget )
+  //  EVT_LEFT_DCLICK( vtk3DQuantSurfaceWidget::OnLeftDClick )
+  // EVT_MOUSEWHEEL( vtk3DQuantSurfaceWidget::OnMouseWheel )
+END_EVENT_TABLE( );
+*/
+//----------------------------------------------------------------------------
+vtk3DQuantSurfaceWidget::vtk3DQuantSurfaceWidget(
+        wxWindow* parent,
+        wxWindowID id,
+        const wxPoint& pos,
+        const wxSize& size,
+        long style,
+        const wxString& name)
+        : vtk3DSurfaceWidget( parent, id, pos, size, style, name ){
+  _3DSliceMapper               = NULL;
+  _3DSliceActor                        = NULL;
+  _bwlookup                            = NULL;
+  _collookup                   = NULL;
+  _hs_rectGuide                        = new RectangleGuideVtk();
+  _s1_rectGuide                        = new RectangleGuideVtk();
+  _s2_rectGuide                        = new RectangleGuideVtk();
+  _sA_rectGuide                        = new RectangleGuideVtk();
+  _sB_rectGuide                        = new RectangleGuideVtk();
+
+  _lstContVtk                  = new listContourVTK(this);
+  _lstContHealtyVtk            = new listContourVTK(this);
+  _lstContVtk->SetColour(1,1,0);
+  _lstContHealtyVtk->SetColour(0,0,1);
+
+}
+
+vtk3DQuantSurfaceWidget::~vtk3DQuantSurfaceWidget()
+{
+  if( _3DSliceActor )  _3DSliceActor   ->Delete();
+  if( _3DSliceMapper)  _3DSliceMapper  ->Delete();
+  if( _bwlookup                )       _bwlookup               ->Delete();
+  if( _collookup       )       _collookup              ->Delete();
+
+  delete _hs_rectGuide;
+  delete _s1_rectGuide;
+  delete _s2_rectGuide;
+  delete _sA_rectGuide;
+  delete _sB_rectGuide;
+
+  delete _lstContVtk;
+  delete _lstContHealtyVtk;
+}
+
+
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::ShowMARACASDataAndAxe( marInterface* mar )
+{
+  marAxis                      *temp;
+  vtkPolyData          *allData;
+  int nos;
+  vtkProbeFilter       *pFilter;
+
+  this->ShowMARACASData( mar );
+  this->ConfigureVTK();
+
+  _pRenderer->SetBackground( 0.35, 0.35, 0.35 );
+
+  // Axis
+  _mar->_experiment->setAxis( 0 );
+  temp         = _mar->_experiment->getAxis( );  // ??? getActualAxis ??
+  allData      = temp->Draw( );
+
+  nos          = _mar->_experiment->getNumberOfSlices( );
+  pFilter      = _mar->_experiment->get3DSlice( (int) (nos-1)/2 );
+
+  _bwlookup = vtkWindowLevelLookupTable::New( );
+  _bwlookup->SetHueRange( 0 , 1 );
+  _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
+  _bwlookup->SetTableRange( _range[0] , _range[1] );
+  _bwlookup->SetSaturationRange( 0 , 0 );
+  _bwlookup->SetValueRange( 0 , 1 );
+  _bwlookup->SetAlphaRange( 1 , 1 );
+  _bwlookup->Build( );
+
+  _collookup = vtkLookupTable::New( );
+  _collookup->SetNumberOfColors( 256 );
+  _collookup->SetTableRange( 0 , 255 );
+  _collookup->Build( );
+  _collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
+  _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
+  _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
+
+  _3DSliceMapper = vtkDataSetMapper::New( );
+  _3DSliceMapper->SetInput(pFilter->GetOutput( ) );
+  _3DSliceMapper->SetLookupTable( _bwlookup );
+  _3DSliceMapper->SetScalarRange( _range );
+  _3DSliceMapper->ImmediateModeRenderingOn( );
+
+  _3DSliceActor = vtkActor::New( );
+  _3DSliceActor->SetMapper( _3DSliceMapper );
+  _pRenderer->AddActor( _3DSliceActor);
+
+  _lstContVtk->InitListContourActor(nos);
+  _lstContHealtyVtk->InitListContourActor(nos);
+  
+  this->SetAxis( allData );
+}
+
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::ShowMARACASDataAndAxeCT( marInterfaceCT* mar )
+{
+  marAxis                      *temp;
+  vtkPolyData          *allData;
+  int nos;
+  vtkProbeFilter       *pFilter;
+
+  this->ShowMARACASDataCT( mar );
+  this->ConfigureVTK();
+
+  _pRenderer->SetBackground( 0.75, 0.75, 0.75 );
+
+  // Axis
+  _marCT->setAxis( 0 );
+  temp         = _marCT->getAxis( );  // ??? getActualAxis ??
+  allData      = temp->Draw( );
+
+  nos          = _marCT->getNumberOfSlices( );
+  pFilter      = _marCT->get3DSlice( (int) (nos-1)/2 );
+
+  _bwlookup = vtkWindowLevelLookupTable::New( );
+  _bwlookup->SetHueRange( 0 , 1 );
+  _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
+  _bwlookup->SetTableRange( _range[0] , _range[1] );
+  _bwlookup->SetSaturationRange( 0 , 0 );
+  _bwlookup->SetValueRange( 0 , 1 );
+  _bwlookup->SetAlphaRange( 1 , 1 );
+  _bwlookup->Build( );
+
+  _collookup = vtkLookupTable::New( );
+  _collookup->SetNumberOfColors( 256 );
+  _collookup->SetTableRange( 0 , 255 );
+  _collookup->Build( );
+  _collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
+  _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
+  _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
+
+  _3DSliceMapper = vtkDataSetMapper::New( );
+  _3DSliceMapper->SetInput(pFilter->GetOutput( ) );
+  _3DSliceMapper->SetLookupTable( _bwlookup );
+  _3DSliceMapper->SetScalarRange( _range );
+  _3DSliceMapper->ImmediateModeRenderingOn( );
+
+  _3DSliceActor = vtkActor::New( );
+  _3DSliceActor->SetMapper( _3DSliceMapper );
+  _pRenderer->AddActor( _3DSliceActor);
+
+  _lstContVtk->InitListContourActor(nos);
+  _lstContHealtyVtk->InitListContourActor(nos);
+  
+  this->SetAxis( allData );
+}
+
+//----------------------------------------------------------------------------
+
+void vtk3DQuantSurfaceWidget::SetBWLookUp(){
+  _3DSliceMapper->SetLookupTable( _bwlookup );
+  _pRenderWindow->Render( );
+}    
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::SetColorLookUp(){
+  _3DSliceMapper->SetLookupTable( _collookup );
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::SetImage( vtkProbeFilter* pFilter )
+{
+  _3DSliceMapper->SetInput(pFilter->GetOutput( ) );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Show3DSliceActor( )
+{
+  _pRenderer->AddActor( _3DSliceActor );
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Hide3DSliceActor( )
+{
+  _pRenderer->RemoveActor( _3DSliceActor );
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::InitListContourActor(int type, int nos){
+       if ((type==0) || (type==-1)){ _lstContVtk->InitListContourActor(nos); }
+       if ((type==1) || (type==-1)){ _lstContHealtyVtk->InitListContourActor(nos); }
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Show3DContourActor( int type ){
+       if (type==0){ _lstContVtk->Show3DContourActor(); }
+       if (type==1){ _lstContHealtyVtk->Show3DContourActor(); }
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Hide3DContourActor( int type ){
+       if (type==0){ _lstContVtk->Hide3DContourActor(); }
+       if (type==1){ _lstContHealtyVtk->Hide3DContourActor(); }
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Set3DContourActor( int slice, vtkPoints* contour3D, bool showActor , int type){
+       if (type==0) { _lstContVtk->Set3DContourActor(slice,contour3D,showActor);       }
+       if (type==1) { _lstContHealtyVtk->Set3DContourActor(slice,contour3D,showActor); }
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Erase3DContourActor( int slice){
+       _lstContVtk->EraseSliceContourActor(slice);
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Show3DHealthySliceActor( )
+{
+  _pRenderer->AddActor( _hs_rectGuide->_actor );
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Hide3DHealthySliceActor( )
+{
+  _pRenderer->RemoveActor( _hs_rectGuide->_actor );
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Set3DSliceActor( RectangleGuideVtk *_rectGuide ,float scale, int k,int r,int g,int b){
+       int             sizeIma;
+       double  dimIma;
+       double  *o;  // Origen
+       double  *c;  // Center
+       double  *n;  // Normal
+
+       double  ori[3];
+       double  p1[3];
+       double  p2[3];
+
+       sizeIma = _mar->_experiment->getAxis( )->getParameters( )->getSizeIma( );
+       dimIma  = _mar->_experiment->getAxis( )->getParameters( )->getDimIma( );
+    o          = _mar->_experiment->getAxis( )->getSplinePoint(k);  
+    c          = _mar->_experiment->getAxis( )->getSplinePoint(k);  
+    n          = _mar->_experiment->getAxis( )->getNormal(k);  
+
+    vtkPlaneSource* pSource = vtkPlaneSource::New( );
+    pSource->SetOrigin( o[0]                           , o[1], o[2]                            );
+    pSource->SetPoint1( o[0]+dimIma*scale - 1.0        , o[1], o[2]                            );
+    pSource->SetPoint2( o[0]                           , o[1], o[2]+dimIma*scale - 1.0 );
+    pSource->SetResolution( sizeIma - 1        , sizeIma - 1   );
+    pSource->Update( );
+    pSource->SetCenter( c[ 0 ], c[ 1 ], c[ 2 ] );
+    pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
+    pSource->Update( );
+       pSource->GetOrigin( ori );
+    pSource->GetPoint1( p1     );
+    pSource->GetPoint2( p2     );
+
+       if (_rectGuide->_actor)         _pRenderer->RemoveActor(_rectGuide->_actor);
+       if (_rectGuide->_grid)          _rectGuide->_grid->Delete();
+       if (_rectGuide->_actor)         _rectGuide->_actor->Delete();
+       if (_rectGuide->_points)        _rectGuide->_points->Delete();
+       if (_rectGuide->_mapper)        _rectGuide->_mapper->Delete();
+       if (_rectGuide->_poly_line)     _rectGuide->_poly_line->Delete();
+
+       _rectGuide->_poly_line = vtkPolyLine::New();
+       ( _rectGuide->_poly_line->GetPointIds() )->SetNumberOfIds(8);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(0,0);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(1,1);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(2,2);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(3,3);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(4,4);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(5,5);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(6,6);
+       ( _rectGuide->_poly_line->GetPointIds() )->SetId(7,7);
+
+       _rectGuide->_points=vtkPoints::New();
+       _rectGuide->_points->InsertNextPoint( ori[0]                    , ori[1]                                        , ori[2]                        );
+       _rectGuide->_points->InsertNextPoint( p1[0]                             , p1[1]                                         , p1[2]                         );
+       _rectGuide->_points->InsertNextPoint( p2[0]+p1[0]-ori[0], p2[1]+p1[1]-ori[1]            , p2[2]+p1[2]-ori[2]);
+       _rectGuide->_points->InsertNextPoint( p2[0]                             , p2[1]                                         , p2[2]                         );
+       _rectGuide->_points->InsertNextPoint( ori[0]                    , ori[1]                                        , ori[2]                        );
+       _rectGuide->_points->InsertNextPoint( p2[0]+p1[0]-ori[0], p2[1]+p1[1]-ori[1]            , p2[2]+p1[2]-ori[2]);
+       _rectGuide->_points->InsertNextPoint( p1[0]                             , p1[1]                                         , p1[2]                         );
+       _rectGuide->_points->InsertNextPoint( p2[0]                             , p2[1]                                         , p2[2]                         );
+
+       _rectGuide->_grid=vtkUnstructuredGrid::New();
+       _rectGuide->_grid->Allocate(1,1);
+       _rectGuide->_grid->InsertNextCell( _rectGuide->_poly_line->GetCellType() , _rectGuide->_poly_line->GetPointIds() );
+       _rectGuide->_grid->SetPoints( _rectGuide->_points );
+
+       _rectGuide->_mapper = vtkDataSetMapper::New();
+       _rectGuide->_mapper->SetInput(_rectGuide->_grid);
+       _rectGuide->_mapper->ImmediateModeRenderingOn();
+
+       _rectGuide->_actor=vtkActor::New();
+       _rectGuide->_actor->SetMapper(_rectGuide->_mapper);
+       _rectGuide->_actor->GetProperty()->BackfaceCullingOn();
+       _rectGuide->_actor->GetProperty()->SetDiffuseColor(r,g,b);
+       _rectGuide->_actor->PickableOff( );
+       _rectGuide->_iSlice = k;
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Set3DHealthySliceActor(  ){
+       int k = _mar->_experiment->getAxis( )->getHealthySlice();
+       Set3DSliceActor( _hs_rectGuide , 1.0 , k ,0,0,1);
+}
+
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Set3DRegionSliceActor( int type , int k1, int k2 ){
+       Set3DStartRegionSliceActor(type, k1);
+       Set3DEndRegionSliceActor(type, k2);
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Set3DStartRegionSliceActor( int type , int k ){
+       if (type==0){
+               Set3DSliceActor( _s1_rectGuide , 0.3 , k ,1,0,0);
+               _mar->_experiment->getAxis()->setStartQuant(k);
+       }
+       if (type==1){
+               Set3DSliceActor( _sA_rectGuide , 0.3 , k ,1,1,0);
+       }
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Set3DEndRegionSliceActor( int type , int k ){
+       if (type==0){
+               Set3DSliceActor( _s2_rectGuide , 0.3 , k ,1,0,0);
+               _mar->_experiment->getAxis()->setFinishQuant(k);
+       }
+       if (type==1){
+               Set3DSliceActor( _sB_rectGuide , 0.3 , k ,1,1,0);
+       }
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Show3DRegionSliceActor( int type ){
+       Show3DStartRegionSliceActor(type);
+       Show3DEndRegionSliceActor(type);
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Show3DStartRegionSliceActor( int type ){
+       if ((type==0) && (_s1_rectGuide->_iSlice!=-1)){
+               _pRenderer->AddActor( _s1_rectGuide->_actor );
+               _s1_rectGuide->_showActor=true;
+       }
+       if ((type==1) && (_sA_rectGuide->_iSlice!=-1)){
+               _pRenderer->AddActor( _sA_rectGuide->_actor );
+               _sA_rectGuide->_showActor=true;
+       }
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Show3DEndRegionSliceActor( int type ){
+       if ((type==0) && (_s2_rectGuide->_iSlice!=-1)){
+               _pRenderer->AddActor( _s2_rectGuide->_actor );
+               _s2_rectGuide->_showActor=true;
+       }
+       if ((type==1) && (_sB_rectGuide->_iSlice!=-1)){
+               _pRenderer->AddActor( _sB_rectGuide->_actor );
+               _sB_rectGuide->_showActor=true;
+       }
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Hide3DRegionSliceActor( int type ){
+       Hide3DStartRegionSliceActor(type );
+       Hide3DEndRegionSliceActor(type );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Hide3DStartRegionSliceActor( int type ){
+       if (type==0){
+               if (_s1_rectGuide->_showActor==true){
+                       _pRenderer->RemoveActor( _s1_rectGuide->_actor );
+                       _s1_rectGuide->_showActor=false;
+               }
+       }
+       if (type==1){
+               if (_sA_rectGuide->_showActor==true){
+                       _pRenderer->RemoveActor( _sA_rectGuide->_actor );
+                       _sA_rectGuide->_showActor=false;
+               }
+       }
+       _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::Hide3DEndRegionSliceActor( int type ){
+       if (type==0){
+               if (_s2_rectGuide->_showActor==true){
+                       _pRenderer->RemoveActor( _s2_rectGuide->_actor );
+                       _s2_rectGuide->_showActor=false;
+               }
+       }
+       if (type==1){
+               if (_sB_rectGuide->_showActor==true){
+                       _pRenderer->RemoveActor( _sB_rectGuide->_actor );
+                       _sB_rectGuide->_showActor=false;
+               }
+       }
+       _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::GetSliceLimites(int type, int &sliceStart,int &sliceEnd){
+       if (type==0){
+               sliceStart      = _s1_rectGuide->_iSlice;
+               sliceEnd        = _s2_rectGuide->_iSlice;
+       }
+       if (type==1){
+               sliceStart      = _sA_rectGuide->_iSlice;
+               sliceEnd        = _sB_rectGuide->_iSlice;
+       }
+}
+//--------------------------------------------------------------------
+int vtk3DQuantSurfaceWidget::GetAnalysisTypeStenosis(){
+       return _analysisTypeStenosis;
+}
+//--------------------------------------------------------------------
+void vtk3DQuantSurfaceWidget::SetAnalysisTypeStenosis(int analysisTypeStenosis){
+       _analysisTypeStenosis=analysisTypeStenosis;
+}
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DQuantSurfaceWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DQuantSurfaceWidget.h
new file mode 100644 (file)
index 0000000..c871c1d
--- /dev/null
@@ -0,0 +1,161 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk3DQuantSurfaceWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __VTK3DQUANTSURFACEWIDGET__
+#define __VTK3DQUANTSURFACEWIDGET__
+
+
+
+
+
+#include "vtk3DSurfaceWidget.h"
+#include "kernel/marInterface.h"
+#include "kernel/marInterfaceCT.h"
+#include <vtkDataSetMapper.h>
+#include <vtkActor.h>
+#include <vtkProbeFilter.h>
+#include <vtkWindowLevelLookupTable.h>
+#include <vtkLookupTable.h>
+
+#include <vtkPolyLine.h>
+
+//----------------------------------------------------------------------------
+
+class RectangleGuideVtk{
+public:
+       RectangleGuideVtk();
+       ~RectangleGuideVtk();
+       bool                                    _showActor;
+       vtkActor*                               _actor;
+       vtkPoints*                              _points;
+       vtkPolyLine*                    _poly_line;
+    vtkDataSetMapper*          _mapper;
+       vtkUnstructuredGrid*    _grid; 
+       int                                             _iSlice;
+};
+
+//----------------------------------------------------------------------------
+
+class vtk3DQuantSurfaceWidget;
+
+class listContourVTK {
+public:
+       listContourVTK(vtk3DQuantSurfaceWidget *quantSurfaceWidget);
+       ~listContourVTK();
+       void EraseListContourActor();
+       void EraseSliceContourActor(int slice, bool refresh=true);
+       void InitListContourActor(int nos);
+       void Set3DContourActor( int slice, vtkPoints* contour3D, bool showActor);
+       void Show3DContourActor();
+       void Hide3DContourActor();
+       void SetColour(int r,int g,int b);
+
+private:
+       int _r,_g,_b;
+       vtk3DQuantSurfaceWidget *_vtk3DQuantSurfaceWidget;
+       std::vector< vtkActor* >                        _lst3DContoursVtkActor;
+       std::vector< vtkUnstructuredGrid* >     _lst3DContoursVtkUnstructuredGrid;
+       std::vector< vtkDataSetMapper* >        _lst3DContoursVtkDataSetMapper;
+       std::vector< vtkPolyLine* >                     _lst3DContoursVtkPolyLine;
+};
+//----------------------------------------------------------------------------
+
+
+/**
+ * \brief Class that brigde to VTK, override double click...
+ */
+class vtk3DQuantSurfaceWidget : public vtk3DSurfaceWidget
+{
+public:
+
+    vtk3DQuantSurfaceWidget(
+        wxWindow* parent,
+        wxWindowID id,
+        const  wxPoint& pos    = wxDefaultPosition,
+        const  wxSize& size    = wxDefaultSize,
+        long   style                   = 0,
+        const  wxString& name  = wxPanelNameStr
+        );
+    ~vtk3DQuantSurfaceWidget();
+    void ShowMARACASDataAndAxe( marInterface* mar );
+       void ShowMARACASDataAndAxeCT( marInterfaceCT* mar);
+
+    void SetImage( vtkProbeFilter* pFilter );
+
+
+       void InitListContourActor( int type, int nos);
+    void Show3DContourActor( int type=0 );
+    void Hide3DContourActor( int type=0 );
+       void Set3DContourActor( int slice, vtkPoints* contour3D, bool showActor, int type=0 );
+       void Erase3DContourActor( int slice);
+
+    void Show3DSliceActor( );
+    void Hide3DSliceActor( );
+
+    void SetColorLookUp( );
+    void SetBWLookUp( );
+
+       void Show3DHealthySliceActor();
+       void Hide3DHealthySliceActor();
+       void Set3DHealthySliceActor( );
+
+       void Set3DRegionSliceActor( int type, int k1,int k2 );
+       void Set3DStartRegionSliceActor( int type, int k );
+       void Set3DEndRegionSliceActor( int type, int k );
+
+       void Show3DRegionSliceActor(int type );
+       void Show3DStartRegionSliceActor(int type );
+       void Show3DEndRegionSliceActor(int type );
+
+       void Hide3DRegionSliceActor(int type );
+       void Hide3DStartRegionSliceActor(int type );
+       void Hide3DEndRegionSliceActor(int type );
+   
+       void GetSliceLimites(int type, int &sliceStart,int &sliceEnd);
+
+       int  GetAnalysisTypeStenosis();
+       void SetAnalysisTypeStenosis(int analysisTypeStenosis);
+
+
+       vtkRenderer*            QuantSurfaceWidget_GetRenderer() {return _pRenderer; };
+       vtkRenderWindow*        QuantSurfaceWidget_GetRenderWindow() {return _pRenderWindow; };
+
+protected:
+
+    vtkDataSetMapper                                   *_3DSliceMapper;
+    vtkActor                                                   *_3DSliceActor;
+
+       RectangleGuideVtk                                       *_hs_rectGuide;
+       RectangleGuideVtk                                       *_s1_rectGuide;
+       RectangleGuideVtk                                       *_s2_rectGuide;
+       RectangleGuideVtk                                       *_sA_rectGuide;
+       RectangleGuideVtk                                       *_sB_rectGuide;
+
+    vtkWindowLevelLookupTable*                 _bwlookup;
+    vtkLookupTable*                                            _collookup;
+
+
+private:
+
+       int                             _analysisTypeStenosis;
+       listContourVTK  *_lstContVtk;
+       listContourVTK  *_lstContHealtyVtk;
+
+//    DECLARE_EVENT_TABLE( );
+       void Set3DSliceActor( RectangleGuideVtk *_rectGuide ,float scale, int k,int r,int g,int b);
+};
+
+#endif //__VTK3DQUANTSURFACEWIDGET__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceSTLWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceSTLWidget.cxx
new file mode 100644 (file)
index 0000000..0acfb7d
--- /dev/null
@@ -0,0 +1,817 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk3DSurfaceSTLWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "vtkClosePolyData.h"
+
+#include <vtkTriangleFilter.h>
+#include <vtkSTLWriter.h>
+#include <vtkInteractorStyleSwitch.h>
+#include <vtkPointPicker.h>
+#include <vtkCamera.h>
+#include <vtkPointData.h>
+#include <vtkFloatArray.h>
+//For STL
+#include <vtkCellLocator.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkCellArray.h>
+#include <vtkStripper.h>
+//For rubber stuff:
+#include <vtkImplicitSelectionLoop.h>
+#include <vtkExtractPolyDataGeometry.h>
+#include <vtkPolyDataConnectivityFilter.h>
+#include <vtkPolyDataNormals.h>
+
+#include "vtk3DSurfaceSTLWidget.h"
+
+#include "volume.hxx"
+#include "marInterface.h"
+#include "matrix.h"
+
+
+
+/**
+ * Again wxVTK is an hybrid class, double click was done using wxWindows, simply
+ * because VTK doesn't provide such facility (as opposed to wheel support that is
+ * supposed to be merged in VTK trunk sooner or later:
+ *
+ * http://public.kitware.com/pipermail/vtkusers/2003-August/019548.html
+ * http://www.creatis.insa-lyon.fr/~malaterre/vtk/wheel.patch
+ */
+
+//----------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( vtk3DSurfaceSTLWidget, wxVTKRenderWindowInteractor )
+//EED    EVT_LEFT_DCLICK( vtk3DSurfaceSTLWidget::OnLeftDClick )
+END_EVENT_TABLE( );
+
+//----------------------------------------------------------------------------
+vtk3DSurfaceSTLWidget::vtk3DSurfaceSTLWidget(
+        wxWindow* parent,
+        wxWindowID id,
+        const wxPoint& pos,
+        const wxSize& size,
+        long style,
+        const wxString& name)
+        : wxVTKRenderWindowInteractor( parent, id, pos, size, style, name ){
+
+
+       //make current interactor style be trackbal camera, asked by radiologists.
+//     vtkInteractorStyleSwitch *iss = dynamic_cast<vtkInteractorStyleSwitch*>(this->GetInteractorStyle());
+//     iss->SetCurrentStyleToTrackballCamera();
+  
+
+  vtkInteractorStyle3DMaracas *interactorStyle3DMaracas = vtkInteractorStyle3DMaracas::New(); 
+  interactorStyle3DMaracas->SetInteractor (this);
+  this->SetInteractorStyle(interactorStyle3DMaracas);
+
+
+       _pRenderer  = vtkRenderer::New( );
+       InitialSphere = 0;
+    _centralLine       = NULL;
+    _centralLineMapper = NULL;
+    _centralLineActor  = NULL;
+    _axesMapper = NULL;
+    _axesActor = NULL;
+    for(int i=0; i<4; i++)
+    {
+        _spheres[ i ]          = NULL;
+        _spheresMapper[ i ] = NULL;
+        _spheresActor[ i ]     = NULL;
+    }
+       _axesActor                      = NULL;
+       _axesMapper                     = NULL;
+       _psc                            = NULL;
+       _stlExternalVessel      = _stlInternalVessel    = NULL;
+       _surfMapper                     = NULL;
+       _actorExternalVessel= _actorVessel                      = NULL;
+       _iasc                           = NULL;
+}
+//----------------------------------------------------------------------------
+vtk3DSurfaceSTLWidget::~vtk3DSurfaceSTLWidget()
+{
+  //good luck:
+  if( _outActor )           _outActor          ->Delete( );
+  if( _outMapper )          _outMapper         ->Delete( );
+  if( _outLine )            _outLine           ->Delete( );
+  if( _surfActor )          _surfActor         ->Delete( );
+  if( _surfMapper )         _surfMapper                ->Delete( );
+  if( _mCubes )             _mCubes                    ->Delete( );
+  if( _centralLine )        _centralLine       ->Delete( );
+  if( _centralLineMapper )  _centralLineMapper->Delete( );
+  if( _centralLineActor )   _centralLineActor ->Delete( );
+  if( _axesActor )          _axesActor         ->Delete();
+  if( _axesMapper )         _axesMapper                ->Delete();
+  if( _actorVessel )        _actorVessel       ->Delete();
+  if( _actorExternalVessel )_actorExternalVessel->Delete();
+//  if( _stlExternalVessel )  _stlExternalVessel->Delete();
+//  if( _stlInternalVessel )  _stlInternalVessel->Delete();
+  if( _psc )                _psc                       ->Delete();
+  if(_iasc)                 _iasc                      ->Delete();
+  for(int i=0; i<4; i++)
+  {
+    if( _spheres[ i ] )       _spheres[ i ]                    ->Delete( );
+    if( _spheresMapper[ i ] ) _spheresMapper[ i ]      ->Delete( );
+    if( _spheresActor[ i ] )  _spheresActor[ i ]       ->Delete( );
+  }
+  if( _pRenderer )          _pRenderer         ->Delete( );
+}
+
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetSurfaceColor( float red, float green, float blue )
+{
+  _surfActor->GetProperty()->SetColor(red, green, blue );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetSurfaceVisibility( bool visible )
+{
+  _surfActor->SetVisibility( visible );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetSTLSurfaceVisibility( bool intvisible , bool extvisible)
+{
+  ///\todo : STL visibility: both internal and external mold:
+  _actorVessel->SetVisibility( intvisible );
+  _actorExternalVessel->SetVisibility( extvisible );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetSurfaceIsoValue( int isoval )
+{
+  _mCubes->SetValue(0, isoval);
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetSurfaceOpacity( int opaval )
+{
+  //There is no way in Win32 to specify a slider different than 0->100
+  _surfActor->GetProperty()->SetOpacity( (float)opaval/100 );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::GetSphereCenter( double center[3] )
+{
+       _spheres[ 3 ]->GetCenter( center );
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetAxis( vtkPolyData *axis )
+{
+       _axesMapper = vtkPolyDataMapper::New( );
+       _axesMapper->SetInput( axis );
+       axis->Delete();
+
+       _axesActor = vtkActor::New( );
+       _axesActor->SetMapper( _axesMapper );
+       _axesActor->GetProperty()->SetColor( 1, 0, 0 );
+       _pRenderer->AddActor( _axesActor );
+
+       _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::RemoveAxis( )
+{
+  if (_axesActor)
+  {
+      _pRenderer->RemoveActor(_axesActor);
+      _axesActor->Delete();
+      _axesActor = NULL;
+      _pRenderWindow->Render( );
+       }
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetCuttingMode( bool mode )
+{
+  if( mode )
+    {
+      //start rubber/cutter mode
+      if(!_iasc) 
+        {
+        _iasc = vtkInteractorStyleCutter::New();
+        }
+      this->SetInteractorStyle( _iasc );
+    }
+  else
+    {
+   /**
+    * Copy / paste from vtkPolyDataCutter
+    */
+      if( _iasc )
+      {
+        _iasc->VisibilityOff(); //turn off the vtkInteractorStyleCutter
+        vtkImplicitSelectionLoop *loop = vtkImplicitSelectionLoop::New();
+        loop->SetLoop( _iasc->GetLoopPoints() );
+        loop->SetNormal( _iasc->GetDirection() );
+
+        vtkTriangleFilter *tf = vtkTriangleFilter::New();
+        tf->SetInput( _stlInternalVessel );
+
+        vtkExtractPolyDataGeometry *extract = vtkExtractPolyDataGeometry::New ();
+        extract->SetInput ( tf->GetOutput());
+        extract->SetImplicitFunction ( loop );
+        extract->ExtractInsideOff ();
+        extract->ExtractBoundaryCellsOff ();
+        tf->Delete();
+        loop->Delete();
+
+        //#connectivity filter to keep only the largest part
+        vtkPolyDataConnectivityFilter *connect = vtkPolyDataConnectivityFilter::New();
+        connect->SetInput( extract->GetOutput() );
+        connect->SetExtractionModeToLargestRegion ();
+        extract->Delete();
+
+        vtkClosePolyData *close = vtkClosePolyData::New();
+        close->SetInput( connect->GetOutput() );
+        connect->Delete();
+
+        vtkStripper *strip = vtkStripper::New();
+        strip->SetInput( close->GetOutput() );
+        close->Delete();
+
+        //If vtkClosePolyData was well written we wouldn't had to recompute the normals
+        vtkPolyDataNormals *normals = vtkPolyDataNormals::New();
+        normals->SetInput( strip->GetOutput() );
+        strip->Delete();
+
+        /*vtkPolyDataWriter *polywriter = vtkPolyDataWriter::New();
+        polywriter->SetInput( normals->GetOutput() );
+        polywriter->SetFileName( "cutter.vtk" );
+        polywriter->SetFileTypeToBinary();
+        polywriter->Write();
+        polywriter->Delete();*/
+
+        normals->Update(); //important before a ShallowCopy Or DeepCopy
+        _stlInternalVessel->DeepCopy( normals->GetOutput() ); //Use DeepCopy when using ShallowCopy afterwards
+
+        tf->SetInput( _stlExternalVessel );
+        normals->Update();  //important before a ShallowCopy
+        _stlExternalVessel->ShallowCopy( normals->GetOutput() );
+        _pRenderWindow->Render( );
+      }
+      //make current interactor style be trackbal camera, asked by radiologists.
+      vtkInteractorStyleTrackballCamera *istc = vtkInteractorStyleTrackballCamera::New();
+      this->SetInteractorStyle( istc );
+      istc->Delete();
+    }
+
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::ExportSurfaceAsSTL( const char* fileprefix )
+{
+   std::string prefix;
+
+   //Now save for real in STL format
+   //Don't forget to go through a triangle filter
+   vtkTriangleFilter *triangle = vtkTriangleFilter::New();
+   triangle->SetInput( _stlInternalVessel );
+   //In difficult case (such as BESSON) mesh can be more than one piece:
+   vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
+   pdcf->SetInput( triangle->GetOutput() );
+   //In difficult case (such as BESSON) mesh can still be open...close it !
+   vtkClosePolyData *close = vtkClosePolyData::New();
+   close->SetInput( pdcf->GetOutput() );
+   
+   vtkSTLWriter *internal_mold_stl = vtkSTLWriter::New();
+   internal_mold_stl->SetInput( close->GetOutput() );
+   prefix = fileprefix;
+   prefix += "-internal.stl";
+   internal_mold_stl->SetFileName( prefix.c_str() );
+   internal_mold_stl->SetFileTypeToBinary();
+   internal_mold_stl->Write();
+   internal_mold_stl->Delete();
+   
+   //convert to triangles first:
+   triangle->SetInput( _stlExternalVessel );
+   
+   vtkSTLWriter *external_mold_stl = vtkSTLWriter::New();
+   external_mold_stl->SetInput( close->GetOutput() );
+   prefix = fileprefix;
+   prefix += "-external.stl";
+   external_mold_stl->SetFileName( prefix.c_str() );
+   external_mold_stl->SetFileTypeToBinary();
+   external_mold_stl->Write();
+   external_mold_stl->Delete();
+   
+   triangle->Delete();
+   close->Delete();
+   pdcf->Delete();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::ShowMARACASData( marInterface* mar ){
+    int whd[3];
+    double minmax[2];
+
+    _mar = mar;
+    _marImageData = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+    _marImageData->GetDimensions( whd );
+    _width  = whd[0];
+    _height = whd[1];
+    _depth  = whd[2];
+
+    _marImageData->GetScalarRange( minmax );
+    
+    //Outline v2:
+    // An outline provides context around the data.
+    _outLine   = vtkOutlineFilter::New( );
+    _outLine->SetInput( _marImageData );
+    _outMapper = vtkPolyDataMapper::New( );
+    _outMapper->SetInput( _outLine->GetOutput( ) );
+    _outActor  = vtkActor::New( );
+    _outActor->SetMapper( _outMapper );
+    _outActor->GetProperty( )->SetColor( 0.7, 0.0, 0.9 );
+    //_outActor->PickableOff( );
+    _pRenderer->AddActor( _outActor );
+
+    // Surface
+    _mCubes = vtkMarchingCubes::New( );
+    _surfMapper = vtkPolyDataMapper::New( );
+    _surfActor = vtkActor::New( );
+
+    _mCubes->SetInput( _marImageData );
+    _mCubes->SetValue( 0, minmax[1] / 4 );
+
+    vtkStripper *stripper = vtkStripper::New();
+    stripper->SetInput( _mCubes->GetOutput( ) );
+
+       _surfMapper->SetInput( stripper->GetOutput() );
+    _surfMapper->ScalarVisibilityOff( );
+    stripper->Delete();
+
+    _surfActor->SetMapper( _surfMapper );
+    _surfActor->PickableOff( );
+    _surfActor->GetProperty( )->SetColor( 0.9803, 0.9215, 0.8392 );
+    _surfActor->GetProperty( )->SetOpacity( 0.5 );
+    _pRenderer->AddActor( _surfActor );
+
+    // 1. ParallelProjectionOn should be set after AddActor (otherwise call vtkRenderer::ResetCameraClippingRange
+    // 2. ParallelProjectionOn is *necessary* for the vtkImplicitSelectionLoop
+    // otherwise this give a cone instead of a cylinder cutting.
+    _pRenderer->GetActiveCamera()->ParallelProjectionOn();
+
+    this->ConfigureVTK( );
+}
+
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::ShowMARACASDataAndAxe( marInterface* mar ){
+  marAxis* temp;
+  vtkPolyData* allData;
+
+
+  this->ShowMARACASData( mar );
+
+  _pRenderer->SetBackground( 0.75, 0.75, 0.75 );
+
+  // Axis
+  _mar->_experiment->setAxis( 0 );
+  temp = _mar->_experiment->getAxis( );  // ??? getActualAxis ??
+  allData = temp->Draw( );
+  this->SetAxis( allData );
+}
+
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetInitialPoint( double* pickPoint, double* cameraPos )
+{
+    gtm::TVector< double > pO( 3 ), pF( 3 ), pp( 3 ), cp( 3 );
+    gtm::TVector< double > xc( 3 );
+    gtm::TVector< double > x1( 3 ), n1( 3 );
+    gtm::TVector< double > x2( 3 ), n2( 3 );
+    gtm::TVector< double > tmp( 3 );
+    double fac;
+    bool success = true;
+
+    if( _centralLineActor )
+    {
+        _pRenderer->RemoveActor( _centralLineActor );
+        _centralLineActor->Delete( );
+    } // fi
+    if( _centralLineMapper ) _centralLineMapper->Delete( );
+    if( _centralLine )       _centralLine->Delete( );
+
+    _centralLine       = NULL;
+    _centralLineMapper = NULL;
+    _centralLineActor  = NULL;
+
+    for(int i=0; i<4; i++)
+    {
+      if( _spheresActor[ i ] )
+      {
+        _pRenderer->RemoveActor( _spheresActor[ i ] );
+        _spheresActor[ i ]->Delete( );
+      } // fi
+      if( _spheresMapper[ i ] ) _spheresMapper[ i ]->Delete( );
+      if( _spheres[ i ] )       _spheres[ i ]->Delete( );
+      _spheres[ i ] = NULL;
+      _spheresMapper[ i ] = NULL;
+      _spheresActor[ i ] = NULL;
+    } //rof
+
+    fac = GTM_MAX( _width, _height );
+    fac = 2 * GTM_MAX( fac, _depth );
+    pp( 0 ) = pickPoint[ 0 ]; pp( 1 ) = pickPoint[ 1 ]; pp( 2 ) = pickPoint[ 2 ];
+    cp( 0 ) = cameraPos[ 0 ]; cp( 1 ) = cameraPos[ 1 ]; cp( 2 ) = cameraPos[ 2 ];
+
+    if( this->FindCubePointsFromPoints(
+      pO.GetAnsiRef( ), pF.GetAnsiRef( ),
+      pp.GetAnsiRef( ), cp.GetAnsiRef( )
+    ) ) {
+
+       if( this->GetPointAndNormalIntersection(
+           x1.GetAnsiRef( ), n1.GetAnsiRef( ),
+           pO.GetAnsiRef( ), pF.GetAnsiRef( )
+    ) ) {
+
+           if( this->GetPointAndNormalIntersection(
+          x2.GetAnsiRef( ), n2.GetAnsiRef( ),
+          ( x1 - n1 ).GetAnsiRef( ), ( x1 - ( n1 * fac ) ).GetAnsiRef( )
+        ) ) {
+
+               xc = ( x2 + x1 ) * 0.5;
+               _mar->_experiment->setStartPoint( (int)xc( 0 ), (int)xc( 1 ), (int)xc( 2 ) );
+      
+      for(int i=0; i<4; i++)
+      {
+        _spheres[ i ] = vtkSphereSource::New( );
+        _spheresMapper[ i ] = vtkPolyDataMapper::New( );
+        _spheresMapper[ i ]->SetInput( _spheres[ i ]->GetOutput( ) );
+        _spheresActor[ i ] = vtkActor::New( );
+        _spheresActor[ i ]->SetMapper( _spheresMapper[ i ] );
+        _spheresActor[ i ]->PickableOff( );
+        _pRenderer->AddActor( _spheresActor[ i ] );
+      }
+
+               _spheres[ 0 ]->SetCenter( x1( 0 ), x1( 1 ), x1( 2 ) );
+               _spheres[ 1 ]->SetCenter( x2( 0 ), x2( 1 ), x2( 2 ) );
+               _spheres[ 2 ]->SetCenter( xc( 0 ), xc( 1 ), xc( 2 ) );
+               _spheres[ 3 ]->SetCenter( xc( 0 ), xc( 1 ), xc( 2 ) );
+
+               _spheres[ 0 ]->SetRadius( 0.5 );
+               _spheres[ 1 ]->SetRadius( 0.5 );
+               _spheres[ 2 ]->SetRadius( 0.5 );
+               _spheres[ 3 ]->SetRadius( ( xc - x1 ).GetNorm( ) );
+
+               _spheresActor[ 0 ]->GetProperty( )->SetColor( 1.0, 0.0, 0.0 );
+               _spheresActor[ 1 ]->GetProperty( )->SetColor( 0.0, 1.0, 0.0 );
+               _spheresActor[ 2 ]->GetProperty( )->SetColor( 0.0, 0.0, 1.0 );
+               _spheresActor[ 3 ]->GetProperty( )->SetColor( 1.0, 0.0, 0.0 );
+               _spheresActor[ 3 ]->GetProperty( )->SetOpacity( 0.3 );
+
+               vtkPoints* points = vtkPoints::New( );
+               points->InsertNextPoint( x1.GetAnsiRef( ) );
+               points->InsertNextPoint( x2.GetAnsiRef( ) );
+
+               vtkCellArray* array = vtkCellArray::New( );
+               array->InsertNextCell( 2 );
+               array->InsertCellPoint( 0 );
+               array->InsertCellPoint( 1 );
+
+               _centralLine = vtkPolyData::New( );
+               _centralLine->SetPoints( points );
+               _centralLine->SetLines( array );
+      points->Delete();
+      array->Delete();
+
+               _centralLineMapper = vtkPolyDataMapper::New( );
+               _centralLineMapper->SetInput( _centralLine );
+
+               _centralLineActor = vtkActor::New( );
+               _centralLineActor->SetMapper( _centralLineMapper );
+               _centralLineActor->GetProperty( )->SetColor( 1.0, 1.0, 1.0 );
+               _centralLineActor->PickableOff( );
+               _pRenderer->AddActor( _centralLineActor );
+
+           } // fi
+
+       } else success = false;
+
+    } else success = false;
+
+    // Show a message, if any.
+    if( !success )
+       wxMessageBox(
+       _T("Error: Initial point can't be set.\nPlease choose another point."),
+       _T("Error"), wxOK | wxCENTRE | wxICON_HAND, this
+       );
+
+    // Finish
+    _pRenderWindow->Render( );
+    InitialSphere = success;
+}
+
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetInitialPoint( double* point )
+{
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::ConfigureVTK( )
+{
+  // get render window
+  _pRenderWindow =  this->GetRenderWindow(  );
+
+  // connect renderer and render window and configure render window
+  _pRenderWindow->AddRenderer( _pRenderer );
+
+  // configure renderer
+  _pRenderer->SetBackground( 0.0, 0.0, 0.0 );
+  //_pRenderer->SetBackground( 1, 1, 0);  //FIXME
+  _pRenderer->GetActiveCamera( )->Zoom( 1.0 );
+  _pRenderer->GetActiveCamera( )->SetClippingRange( 1, 1000 );
+}
+
+
+//----------------------------------------------------------------------------
+bool vtk3DSurfaceSTLWidget::IntersectPlaneWithLine( double* p, double* x1, double* x2, double* x3, double* x4, double* x5 )
+{
+    gtm::TVector< double > vx1( 3 ), vx2( 3 ), vx3( 3 );
+    gtm::TVector< double > vx4( 3 ), vx5( 3 ), vx6( p, 3, false );
+    gtm::TMatrix< double > mU( 4, 4 ), mD( 4, 4 );
+    double t;
+    bool ret;
+
+    vx1 = x1;
+    vx2 = x2;
+    vx3 = x3;
+    vx4 = x4;
+    vx5 = x5;
+    vx6 = vx5 - vx4;
+
+    mD( 0, 0 ) = mU( 0, 0 ) = 1;
+    mD( 0, 1 ) = mU( 0, 1 ) = vx1( 0 );
+    mD( 0, 2 ) = mU( 0, 2 ) = vx1( 1 );
+    mD( 0, 3 ) = mU( 0, 3 ) = vx1( 2 );
+    mD( 1, 0 ) = mU( 1, 0 ) = 1;
+    mD( 1, 1 ) = mU( 1, 1 ) = vx2( 0 );
+    mD( 1, 2 ) = mU( 1, 2 ) = vx2( 1 );
+    mD( 1, 3 ) = mU( 1, 3 ) = vx2( 2 );
+    mD( 2, 0 ) = mU( 2, 0 ) = 1;
+    mD( 2, 1 ) = mU( 2, 1 ) = vx3( 0 );
+    mD( 2, 2 ) = mU( 2, 2 ) = vx3( 1 );
+    mD( 2, 3 ) = mU( 2, 3 ) = vx3( 2 );
+    mU( 3, 0 ) = 1;
+    mU( 3, 1 ) = vx4( 0 );
+    mU( 3, 2 ) = vx4( 1 );
+    mU( 3, 3 ) = vx4( 2 );
+    mD( 3, 0 ) = 0;
+    mD( 3, 1 ) = vx6( 0 );
+    mD( 3, 2 ) = vx6( 1 );
+    mD( 3, 3 ) = vx6( 2 );
+
+    ret = ( mD.Det( ) != 0 );
+    if( ret ) {
+
+       t = mU.Det( ) / mD.Det( );
+       vx6 = ( ( vx4 - vx5 ) * t ) + vx4;
+
+    } // fi
+    return( ret );
+
+}
+
+//----------------------------------------------------------------------------
+bool vtk3DSurfaceSTLWidget::FindCubePointsFromPoints( double* pO, double* pF, double* pickPoint, double* cameraPos )
+{
+    gtm::TVector< double > p1( 3 ), p2( 3 ), p3( 3 ), p4( 3 ), p5( 3 ), p6( 3 );
+    gtm::TVector< double > c( 3 );
+    gtm::TVector< double >* swp;
+    gtm::TVector< double > tpO( pO, 3, false ), tpF( pF, 3, false );
+    std::vector< gtm::TVector< double >* > points;
+    double x1[ 3 ], x2[ 3 ], x3[ 3 ], d1, d2;
+    int i, j;
+
+    // 1st plane intersection
+    x1[ 0 ] = 0; x1[ 1 ] = _height; x1[ 2 ] =      0;
+    x2[ 0 ] = 0; x2[ 1 ] =       0; x2[ 2 ] =      0;
+    x3[ 0 ] = 0; x3[ 1 ] =       0; x3[ 2 ] = _depth;
+    if( this->IntersectPlaneWithLine( p1.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p1 );
+
+    // 2nd plane intersection
+    x1[ 0 ] =      0; x1[ 1 ] = _height; x1[ 2 ] = _depth;
+    x2[ 0 ] =      0; x2[ 1 ] =       0; x2[ 2 ] = _depth;
+    x3[ 0 ] = _width; x3[ 1 ] =       0; x3[ 2 ] = _depth;
+    if( this->IntersectPlaneWithLine( p2.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p2 );
+
+    // 3rd plane intersection
+    x1[ 0 ] =      0; x1[ 1 ] = 0; x1[ 2 ] = _depth;
+    x2[ 0 ] =      0; x2[ 1 ] = 0; x2[ 2 ] =      0;
+    x3[ 0 ] = _width; x3[ 1 ] = 0; x3[ 2 ] =      0;
+    if( this->IntersectPlaneWithLine( p3.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p3 );
+
+    // 4th plane intersection
+    x1[ 0 ] = _width; x1[ 1 ] = _height; x1[ 2 ] = _depth;
+    x2[ 0 ] = _width; x2[ 1 ] =       0; x2[ 2 ] = _depth;
+    x3[ 0 ] = _width; x3[ 1 ] =       0; x3[ 2 ] =      0;
+    if( this->IntersectPlaneWithLine( p4.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p4 );
+
+    // 5th plane intersection
+    x1[ 0 ] = _width; x1[ 1 ] =       0; x1[ 2 ] = 0;
+    x2[ 0 ] =      0; x2[ 1 ] =       0; x2[ 2 ] = 0;
+    x3[ 0 ] =      0; x3[ 1 ] = _height; x3[ 2 ] = 0;
+    if( this->IntersectPlaneWithLine( p5.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p5 );
+
+    // 6th plane intersection
+    x1[ 0 ] =      0; x1[ 1 ] = _height; x1[ 2 ] =      0;
+    x2[ 0 ] =      0; x2[ 1 ] = _height; x2[ 2 ] = _depth;
+    x3[ 0 ] = _width; x3[ 1 ] = _height; x3[ 2 ] = _depth;
+    if( this->IntersectPlaneWithLine( p6.GetAnsiRef( ), x1, x2, x3, cameraPos, pickPoint ) )
+       points.push_back( &p6 );
+
+    if( points.size( ) >= 2 ) { // Did I find at least 2 points?
+
+       c( 0 ) = ( double )_width  / 2.0;
+       c( 1 ) = ( double )_height / 2.0;
+       c( 2 ) = ( double )_depth  / 2.0;
+
+       // Sort with bubble sort. Only 30 iterations!
+       for( i = 0; i < points.size( ); i++ ) {
+           for( j = 0; j < points.size( ) - 1; j++ ) {
+
+               d1 = ( c - *points[ j ] ).GetNorm( );
+               d2 = ( c - *points[ j + 1 ] ).GetNorm( );
+               if( d2 < d1 ) {
+
+                   swp = points[ j ];
+                   points[ j ] = points[ j + 1 ];
+                   points[ j + 1 ] = swp;
+
+               } // fi
+
+    } // rof
+
+       } // rof
+
+       // Order the two points according to distance to camera.
+       c = cameraPos;
+       d1 = ( c - *points[ 0 ] ).GetNorm( );
+       d2 = ( c - *points[ 1 ] ).GetNorm( );
+       tpO = ( d1 < d2 )? *points[ 0 ]: *points[ 1 ];
+       tpF = ( d1 > d2 )? *points[ 0 ]: *points[ 1 ];
+       return( true );
+
+    } else return( false );
+
+}
+
+//----------------------------------------------------------------------------
+bool vtk3DSurfaceSTLWidget::GetPointAndNormalIntersection( double* p, double* n, double* pO, double* pF )
+{
+    gtm::TVector< double > n1( 3 ), n2( 3 ), n3( 3 );
+    int subId, cellId, returnVal;
+    double t, pcoords[ 3 ], x[ 3 ];
+    double fpO[ 3 ], fpF[ 3 ];
+    double p1[ 3 ], p2[ 3 ], p3[ 3 ];
+    vtkPolyData* data = _mCubes->GetOutput( );
+    vtkCellLocator* locator = vtkCellLocator::New( );
+
+    locator->SetDataSet( data );
+    locator->Initialize( );
+    locator->Update( );
+
+    fpO[ 0 ] = pO[ 0 ]; fpO[ 1 ] = pO[ 1 ]; fpO[ 2 ] = pO[ 2 ];
+    fpF[ 0 ] = pF[ 0 ]; fpF[ 1 ] = pF[ 1 ]; fpF[ 2 ] = pF[ 2 ];
+    returnVal = locator->IntersectWithLine( fpO, fpF, 0.1, t, x, pcoords, subId, cellId );
+    locator->Delete( );
+
+    if( returnVal )
+    {
+        vtkCell* cell = data->GetCell( cellId );
+        vtkPoints* points = cell->GetPoints( );
+
+        data->GetPointData( )->GetNormals( )->GetTuple( cell->GetPointIds( )->GetId( 0 ), n1.GetAnsiRef( ) );
+        data->GetPointData( )->GetNormals( )->GetTuple( cell->GetPointIds( )->GetId( 1 ), n2.GetAnsiRef( ) );
+        data->GetPointData( )->GetNormals( )->GetTuple( cell->GetPointIds( )->GetId( 2 ), n3.GetAnsiRef( ) );
+   
+        n1 += n2 + n3;
+        n1 *= ( 1.0 / 3.0 );
+        n1.Normalize( );
+        n[ 0 ] = n1( 0 ); n[ 1 ] = n1( 1 ); n[ 2 ] = n1( 2 );
+
+        points->GetPoint( 0, p1 );
+        points->GetPoint( 1, p2 );
+        points->GetPoint( 2, p3 );
+        this->IntersectPlaneWithLine( p, p1, p2, p3, pO, pF );
+        return( true );
+    } else return( false );
+
+}
+//----------------------------------------------------------------------------
+ /**
+  * What we are doing here is from a LFV marAxis to turn it into a vtkPolyData
+  * Therefore it should be a lot more easier to integrate in a real vtk class
+  * for filtering : vtkMaracasImageToSTL
+  */
+vtkPolyData* vtk3DSurfaceSTLWidget::ConvertMarAxisToPolyData()
+{
+  double p1[marAxis::INDX_count];
+  //retrieve the actual axis
+  marAxis* ax = _mar->_experiment->getAxis();
+  //Number of axis points
+  int numPoints = ax->getNumberOfControlPoints();
+
+  vtkPolyData *axis = vtkPolyData::New();
+  vtkPoints *points = vtkPoints::New();
+  vtkFloatArray *scalars = vtkFloatArray::New();
+  scalars->SetNumberOfComponents (2);
+  //Field are : 1. radius (=INDX_RAYON) , 2. average (=INDX_SIGNALVALUE)
+
+  double tmp1,tmp2;
+  for(int i=0; i<numPoints; i++){
+    ax->getControlPoint(i, p1, p1+3);
+    points->InsertPoint(i, p1);
+       tmp1 = p1[marAxis::INDX_RAYON];
+//     tmp2 = p1[marAxis::INDX_SIGNALVALUE];
+       tmp2 = (double)ax->getSignal(i);
+    scalars->InsertTuple2(i,tmp1, tmp2);
+
+  }
+
+  // We now assign the pieces to the vtkPolyData.
+  axis->SetPoints(points);
+  points->Delete();
+  axis->GetPointData()->SetScalars(scalars);
+  scalars->Delete();
+  return axis;
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::ConstructVessel( )
+{
+  vtkPolyData *axis = this->ConvertMarAxisToPolyData( );
+
+  //retrieve the vtk image data
+
+  if( !_psc) this->_psc = vtkImagePolyDataSeedConnectivity::New();
+  this->_psc->SetInput( _marImageData );
+  this->_psc->SetAxis( axis );
+  this->_psc->Update();
+  axis->Delete();
+
+/*  vtkStripper *strip = vtkStripper::New();
+  strip->SetInput( this->_psc->GetOutput() );  //GetOutput() -> inner mold
+  strip->Update(); //Important before a ShallowCopy !!!
+  
+  if( !_stlInternalVessel) _stlInternalVessel = vtkPolyData::New();
+  _stlInternalVessel->ShallowCopy( strip->GetOutput() );
+  strip->Delete();*/
+  _stlInternalVessel = this->_psc->GetOutput();
+
+/*  if( !_stlExternalVessel) _stlExternalVessel = vtkPolyData::New();
+  _stlExternalVessel->ShallowCopy( this->_psc->GetOuterMold() );
+  //this->_psc->GetOuterMold()->Delete();*/
+  _stlExternalVessel = this->_psc->GetOuterMold();
+
+  vtkPolyDataMapper *dsm1 = vtkPolyDataMapper ::New();
+  dsm1->SetInput ( _stlInternalVessel ); //fasten stuff
+  dsm1->ScalarVisibilityOff();
+
+  _actorVessel = vtkActor::New();
+  _actorVessel->SetMapper (dsm1);
+
+  //improve visibility:
+  _actorVessel->GetProperty()->SetColor (1,0,0);
+
+  vtkPolyDataMapper *dsm2 = vtkPolyDataMapper ::New();
+  dsm2->SetInput ( _stlExternalVessel );
+  dsm2->ScalarVisibilityOff();
+
+  _actorExternalVessel = vtkActor::New();
+  _actorExternalVessel->SetMapper (dsm2);
+
+  //improve visibility:
+  _actorExternalVessel->GetProperty()->SetRepresentationToWireframe();
+
+  _pRenderer->AddActor( _actorVessel );
+  _pRenderer->AddActor( _actorExternalVessel );
+  _pRenderWindow->Render( );
+
+  dsm1->Delete();
+  dsm2->Delete();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceSTLWidget::SetSTLThresholdRatio(double ratio)
+{
+  this->_psc->SetThresholdRatio( (double)(ratio/100) );
+  _pRenderWindow->Render( );
+}
+//----------------------------------------------------------------------------
+float vtk3DSurfaceSTLWidget::GetSTLThreshold()
+{
+  return  100*this->_psc->GetThresholdRatio( );
+}
+//----------------------------------------------------------------------------
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceSTLWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceSTLWidget.h
new file mode 100644 (file)
index 0000000..1b5eb98
--- /dev/null
@@ -0,0 +1,136 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk3DSurfaceSTLWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __VTK3DSURFACESTLWIDGET__
+#define __VTK3DSURFACESTLWIDGET__
+
+#include "wxVTKRenderWindowInteractorEditContour.h"
+
+#include "vtkImagePolyDataSeedConnectivity.h"
+#include "vtkInteractorStyleCutter.h"
+#include "kernel/marInterface.h"
+
+#include <vtkImageData.h>
+#include <vtkProperty2D.h>
+#include <vtkPolyData.h>
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkSphereSource.h>
+#include <vtkOutlineFilter.h>
+#include <vtkProperty.h>
+
+/**
+ * \brief Class that brigde to VTK, override double click...
+ */
+class vtk3DSurfaceSTLWidget : public wxVTKRenderWindowInteractor
+{
+public:
+
+    vtk3DSurfaceSTLWidget(
+        wxWindow* parent,
+        wxWindowID id,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = 0,
+        const wxString& name = wxPanelNameStr
+        );
+    ~vtk3DSurfaceSTLWidget();
+
+//EED Borrame
+//    void OnLeftDClick( wxMouseEvent& event );
+
+    void ConfigureVTK( );
+
+    bool IntersectPlaneWithLine( double* p, double* x1, double* x2, double* x3, double* x4, double* x5 );
+    bool FindCubePointsFromPoints( double* pO, double* pF, double* pickPoint, double* cameraPos );
+    bool GetPointAndNormalIntersection( double* p, double* n, double* pO, double* pF );
+    
+    void ShowMARACASData( marInterface* mar );
+       void ShowMARACASDataAndAxe( marInterface* mar );
+    void SetSurfaceColor(float red, float green, float blue );
+    void SetSurfaceVisibility( bool visible );
+    void SetSTLSurfaceVisibility( bool intvisible , bool extvisible);
+    void SetSurfaceIsoValue( int isoval );
+    void SetSurfaceOpacity( int opaval );
+
+    void GetSphereCenter( double center[3] );
+    void SetAxis( vtkPolyData *axis );
+    void RemoveAxis( );
+
+    void ConstructVessel();
+    void SetCuttingMode( bool mode );
+    void ExportSurfaceAsSTL( const char* fileprefix );
+
+    ///\todo remove
+    vtkImageData       *_marImageData;
+    vtkPolyData                *_marPolyData;
+
+    void SetSTLThresholdRatio(double ratio);
+    float GetSTLThreshold();
+    vtkGetMacro(InitialSphere, int);
+    
+protected:
+
+    void SetInitialPoint( double* pickPoint, double* cameraPos );
+    void SetInitialPoint( double* point );
+    vtkPolyData* ConvertMarAxisToPolyData();
+    
+    vtkImagePolyDataSeedConnectivity *_psc;
+
+    marInterface               *_mar;
+    vtkRenderer                        *_pRenderer;
+    vtkRenderWindow            *_pRenderWindow;
+    vtkOutlineFilter   *_outLine;
+    vtkPolyDataMapper  *_outMapper;
+    vtkActor                   *_outActor;
+    vtkMarchingCubes   *_mCubes;
+    vtkPolyDataMapper  *_surfMapper;
+    vtkActor                   *_surfActor;
+
+    vtkPolyData                        *_centralLine;
+    vtkPolyDataMapper  *_centralLineMapper;
+    vtkActor                   *_centralLineActor;
+
+    vtkSphereSource            *_spheres[ 4 ];
+    vtkPolyDataMapper  *_spheresMapper[ 4 ];
+    vtkActor                   *_spheresActor[ 4 ];
+
+    vtkPolyDataMapper  *_axesMapper;
+    vtkActor                   *_axesActor;
+
+    vtkActor                   *_actorVessel;
+    vtkActor                   *_actorExternalVessel;
+    //We should keep internal and external as different mesh to be able
+    //to save them in difference files at the end of process:
+    vtkPolyData                        *_stlInternalVessel;
+    vtkPolyData                        *_stlExternalVessel;
+    vtkInteractorStyleCutter *_iasc;
+
+private:
+
+    int _width;
+    int _height;
+    int _depth;
+    int InitialSphere;
+
+    DECLARE_EVENT_TABLE( );
+
+};
+
+#endif //__VTK3DSURFACESTLWIDGET__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceWidget.cxx
new file mode 100644 (file)
index 0000000..103aaa7
--- /dev/null
@@ -0,0 +1,515 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk3DSurfaceWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtk3DSurfaceWidget.h"
+#include "../marDictionary.h"
+#include <vtkInteractorStyleSwitch.h>
+#include <vtkPointPicker.h>
+#include <vtkPointData.h>
+#include <vtkCellLocator.h>
+#include <vtkCellArray.h>
+#include <vtkStripper.h>
+#include <vtkCamera.h>
+#include "matrix.h"
+
+
+#include "UtilVtk3DGeometriSelection.h"
+
+
+
+/**
+ * Again wxVTK is an hybrid class, double click was done using wxWindows, simply
+ * because VTK doesn't provide such facility (as opposed to wheel support that is
+ * supposed to be merged in VTK trunk sooner or later:
+ *
+ * http://public.kitware.com/pipermail/vtkusers/2003-August/019548.html
+ * http://www.creatis.insa-lyon.fr/~malaterre/vtk/wheel.patch
+ */
+
+//----------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( vtk3DSurfaceWidget, wxVTKRenderWindowInteractor )
+    EVT_LEFT_DCLICK( vtk3DSurfaceWidget::OnLeftDClick )
+       EVT_MOUSEWHEEL( vtk3DSurfaceWidget::OnMouseWheel )
+END_EVENT_TABLE( );
+
+//----------------------------------------------------------------------------
+vtk3DSurfaceWidget::vtk3DSurfaceWidget( wxWindow* parent, wxWindowID id,
+                                       const wxPoint& pos, const wxSize& size,
+                                       long style, const wxString& name) 
+                                       : wxVTKRenderWindowInteractor( parent, id, pos, size, style, name )
+{
+  //make current interactor style be trackbal camera, asked by radiologists.
+
+       /*
+  vtkInteractorStyleSwitch *iss = dynamic_cast<vtkInteractorStyleSwitch*>(this->GetInteractorStyle());
+  iss->SetCurrentStyleToTrackballCamera();
+  */
+
+
+  vtkInteractorStyle3DMaracas *interactorStyle3DMaracas = vtkInteractorStyle3DMaracas::New(); 
+//  interactorStyle3DMaracas->SetInteractor (this);
+  this->SetInteractorStyle(interactorStyle3DMaracas);
+
+
+  _pRenderer                   = vtkRenderer::New( );
+  InitialSphere                        = 0;
+  _centralLine                 = NULL;
+  _centralLineMapper   = NULL;
+  _centralLineActor            = NULL;
+  _axesMapper                  = NULL;
+  _axesActor                   = NULL;
+  for(int i=0; i<4; i++) {
+    _spheres[ i ]              = NULL;
+    _spheresMapper[ i ] = NULL;
+    _spheresActor[ i ] = NULL;
+  }
+  _axesActor                   = NULL;
+  _axesMapper                  = NULL;
+  _surfActor                   = NULL;
+  _surfMapper                  = NULL;
+  _intVtkPanWid                        = NULL;
+  _outActor                            = NULL;
+  _outMapper                   = NULL;
+  _outLine                             = NULL;
+  _mCubes                              = NULL;
+}
+//----------------------------------------------------------------------------
+vtk3DSurfaceWidget::~vtk3DSurfaceWidget(){
+
+  //good luck:
+  if( _outActor )           _outActor                  ->      Delete( );
+  if( _outMapper )          _outMapper                 ->      Delete( );
+  if( _outLine )            _outLine                   ->      Delete( );
+  if( _surfActor )          _surfActor                 ->      Delete( );
+  if( _surfMapper )         _surfMapper                        ->      Delete( );
+  if( _mCubes )             _mCubes                            ->      Delete( );
+  if( _centralLine )        _centralLine               ->      Delete( );
+  if( _centralLineMapper )  _centralLineMapper ->      Delete( );
+  if( _centralLineActor )   _centralLineActor  ->      Delete( );
+  if( _axesActor )          _axesActor                 ->      Delete();
+  if( _axesMapper )         _axesMapper                        ->      Delete();
+  for(int i=0; i<4; i++)
+  {
+    if( _spheres[ i ] )       _spheres[ i ]                    ->Delete( );
+    if( _spheresMapper[ i ] ) _spheresMapper[ i ]      ->Delete( );
+    if( _spheresActor[ i ] )  _spheresActor[ i ]       ->Delete( );
+  }
+  if( _pRenderer )          _pRenderer                 ->  Delete( );
+}
+
+
+
+//----------------------------------------------------------------------------
+// virtual
+void vtk3DSurfaceWidget::OnMouseWheel( wxMouseEvent& event ){ 
+       if (_intVtkPanWid!=NULL) { _intVtkPanWid->CallBackOnMouseWheel(event);}
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::OnLeftDClick( wxMouseEvent& event ){
+       double pp[ 3 ], cp[ 3 ];
+       int eventrwi[2];
+       vtkPointPicker* picker = vtkPointPicker::New( );        
+       this->GetEventPosition( eventrwi );
+       picker->Pick( eventrwi[0], eventrwi[1], 0.0, _pRenderer );
+       _pRenderer->GetActiveCamera( )->GetPosition( cp );
+       picker->GetPickPosition( pp );
+
+       picker->Delete( );
+       this->SetLast3DClickPoint( pp, cp );
+       if (_intVtkPanWid!=NULL) { _intVtkPanWid->CallBackOnLeftDClick(event); }
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::GetLast3DClickPoint( double *pp, double *cp ){
+       pp[0]=_lastPickPoint[0];
+       pp[1]=_lastPickPoint[1];
+       pp[2]=_lastPickPoint[2];
+       cp[0]=_lastCameraPos[0];
+       cp[1]=_lastCameraPos[1];
+       cp[2]=_lastCameraPos[2];
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetLast3DClickPoint( double *pp, double *cp ){
+       _lastPickPoint[0]=pp[0];
+       _lastPickPoint[1]=pp[1];
+       _lastPickPoint[2]=pp[2];
+       _lastCameraPos[0]=cp[0];
+       _lastCameraPos[1]=cp[1];
+       _lastCameraPos[2]=cp[2];
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::Render( ){
+       _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::InitCameraReset( ){
+       _pRenderer->ResetCameraClippingRange();
+       vtkCamera *cam=_pRenderer->GetActiveCamera();
+       cam->Zoom(1.8);
+// EED 31 Mai 2007
+//     Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetSurfaceColor( float red, float green, float blue )
+{
+  _surfActor->GetProperty()->SetColor(red, green, blue );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetSurfaceVisibility( bool visible )
+{
+  _surfActor->SetVisibility( visible );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetSurfaceIsoValue( int isoval )
+{
+  _mCubes->SetValue(0, isoval);
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetSurfaceOpacity( int opaval )
+{
+  //There is no way in Win32 to specify a slider different than 0->100
+  _surfActor->GetProperty()->SetOpacity( (double)opaval/100.0 );
+  _pRenderWindow->Render();
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::GetSphereCenter( double center[3] )
+{
+       _spheres[ 3 ]->GetCenter( center );
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetAxis( vtkPolyData *axis )
+{
+       _axesMapper = vtkPolyDataMapper::New( );
+       _axesMapper->SetInput( axis );
+       _axesMapper->Update();
+    //axis->Delete();
+
+       _axesActor = vtkActor::New( );
+       _axesActor->SetMapper( _axesMapper );
+       _axesActor->GetProperty()->SetColor( 1, 0, 0 );
+       _axesActor->GetProperty()->SetLineWidth( 2.0 );
+       _pRenderer->AddActor( _axesActor );
+
+       //Generate a new vtkwindow ???
+//EED 31 Mai 2007
+//     _pRenderWindow->Render( );
+ }
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::RemoveAxis( )
+{
+  if (_axesActor)
+  {
+      _pRenderer->RemoveActor(_axesActor);
+      _axesActor->Delete();
+      _axesActor = NULL;
+      _pRenderWindow->Render( );
+       }
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::ShowMARACASData( marInterface* mar ){
+    int whd[3];
+
+    _mar = mar;
+    _marImageData = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+    _marImageData->GetDimensions( whd );
+    _width  = whd[0];
+    _height = whd[1];
+    _depth  = whd[2];
+
+    _marImageData->GetScalarRange( _range );
+    
+    //Outline v2:
+    // An outline provides context around the data.
+    _outLine    = vtkOutlineFilter::New( );
+    _outLine->SetInput( _marImageData );
+    _outMapper  = vtkPolyDataMapper::New( );
+    _outMapper->SetInput( _outLine->GetOutput( ) );
+    _outActor   = vtkActor::New( );
+    _outActor->SetMapper( _outMapper );
+    _outActor->GetProperty( )->SetColor( 0.7, 0.0, 0.9 );
+    //_outActor->PickableOff( );
+    _pRenderer->AddActor( _outActor );
+
+    // Surface
+    _mCubes = vtkMarchingCubes::New( );
+    _surfMapper = vtkPolyDataMapper::New( );
+    _surfActor = vtkActor::New( );
+
+    _mCubes->SetInput( _marImageData );
+    _mCubes->SetValue( 0, _range[1] / 4 );
+
+    vtkStripper *stripper = vtkStripper::New();
+    stripper->SetInput( _mCubes->GetOutput( ) );
+
+        _surfMapper->SetInput( stripper->GetOutput() );
+    _surfMapper->ScalarVisibilityOff( );
+    stripper->Delete();
+
+    _surfActor->SetMapper( _surfMapper );
+    _surfActor->PickableOff( );
+    _surfActor->GetProperty( )->SetColor( 0.9803, 0.9215, 0.8392 );
+    _surfActor->GetProperty( )->SetOpacity( 0.5 );
+    _pRenderer->AddActor( _surfActor );
+
+    // 1. ParallelProjectionOn should be set after AddActor (otherwise call vtkRenderer::ResetCameraClippingRange
+    // 2. ParallelProjectionOn is *necessary* for the vtkImplicitSelectionLoop
+    // otherwise this give a cone instead of a cylinder cutting.
+    _pRenderer->GetActiveCamera()->ParallelProjectionOn();
+
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::ShowMARACASDataCT( marInterfaceCT* mar ){
+    int whd[3];
+
+
+    _marCT = mar;
+    _marImageData = _marCT->getDynData()->getVolume()->castVtk();
+    _marImageData->GetDimensions( whd );
+    _width  = whd[0];
+    _height = whd[1];
+    _depth  = whd[2];
+
+    _marImageData->GetScalarRange( _range );
+    
+       int a = (_marCT->GetExperiment())->getQuantStart();
+    //Outline v2:
+    // An outline provides context around the data.
+    _outLine    = vtkOutlineFilter::New( );
+    _outLine->SetInput( _marImageData );
+    _outMapper  = vtkPolyDataMapper::New( );
+    _outMapper->SetInput( _outLine->GetOutput( ) );
+    _outActor   = vtkActor::New( );
+    _outActor->SetMapper( _outMapper );
+    _outActor->GetProperty( )->SetColor( 0.7, 0.0, 0.9 );
+    //_outActor->PickableOff( );
+    _pRenderer->AddActor( _outActor );
+
+    // Surface
+    _mCubes = vtkMarchingCubes::New( );
+    _surfMapper = vtkPolyDataMapper::New( );
+    _surfActor = vtkActor::New( );
+
+    _mCubes->SetInput( _marImageData );
+    _mCubes->SetValue( 0, _range[1] / 4 );
+
+    vtkStripper *stripper = vtkStripper::New();
+    stripper->SetInput( _mCubes->GetOutput( ) );
+
+        _surfMapper->SetInput( stripper->GetOutput() );
+    _surfMapper->ScalarVisibilityOff( );
+    stripper->Delete();
+
+    _surfActor->SetMapper( _surfMapper );
+    _surfActor->PickableOff( );
+    _surfActor->GetProperty( )->SetColor( 0.9803, 0.9215, 0.8392 );
+    _surfActor->GetProperty( )->SetOpacity( 0.5 );
+    _pRenderer->AddActor( _surfActor );
+
+    // 1. ParallelProjectionOn should be set after AddActor (otherwise call vtkRenderer::ResetCameraClippingRange
+    // 2. ParallelProjectionOn is *necessary* for the vtkImplicitSelectionLoop
+    // otherwise this give a cone instead of a cylinder cutting.
+    _pRenderer->GetActiveCamera()->ParallelProjectionOn();
+
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetInitialPoint(){
+       this->SetInitialPoint( _lastPickPoint, _lastCameraPos );
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::SetInitialPoint( float* pickPoint, float* cameraPos ){
+       marDictionary marDict;
+       char ttmp[256];
+
+    gtm::TVector< double > pO( 3 ), pF( 3 ), pp( 3 ), cp( 3 );
+    gtm::TVector< double > xc( 3 );
+    gtm::TVector< double > x1( 3 ), n1( 3 );
+    gtm::TVector< double > x2( 3 ), n2( 3 );
+    gtm::TVector< double > tmp( 3 );
+    double fac;
+    bool success               = true;
+    int notSuccessType = 0;
+
+    if( _centralLineActor )
+    {
+        _pRenderer->RemoveActor( _centralLineActor );
+        _centralLineActor->Delete( );
+    } // fi
+    if( _centralLineMapper ) _centralLineMapper->Delete( );
+    if( _centralLine )       _centralLine->Delete( );
+
+    _centralLine       = NULL;
+    _centralLineMapper = NULL;
+    _centralLineActor  = NULL;
+
+    for(int i=0; i<4; i++)
+    {
+      if( _spheresActor[ i ] )
+      {
+        _pRenderer->RemoveActor( _spheresActor[ i ] );
+        _spheresActor[ i ]->Delete( );
+      } // fi
+      if( _spheresMapper[ i ] ) _spheresMapper[ i ]->Delete( );
+      if( _spheres[ i ] )       _spheres[ i ]->Delete( );
+      _spheres[ i ] = NULL;
+      _spheresMapper[ i ] = NULL;
+      _spheresActor[ i ] = NULL;
+    } //rof
+
+    fac = GTM_MAX( _width, _height );
+    fac = 2 * GTM_MAX( fac, _depth );
+    pp( 0 ) = pickPoint[ 0 ]; pp( 1 ) = pickPoint[ 1 ]; pp( 2 ) = pickPoint[ 2 ];
+    cp( 0 ) = cameraPos[ 0 ]; cp( 1 ) = cameraPos[ 1 ]; cp( 2 ) = cameraPos[ 2 ];
+
+
+       UtilVtk3DGeometriSelection utilVtk3DGeometriSelection;
+       utilVtk3DGeometriSelection.SetDimentions(_width,_height,_depth);
+       utilVtk3DGeometriSelection.SetMarchingCube(_mCubes);
+
+    if( utilVtk3DGeometriSelection.FindCubePointsFromPoints(
+      pO.GetAnsiRef( ), pF.GetAnsiRef( ),
+      pp.GetAnsiRef( ), cp.GetAnsiRef( )
+    ) ) {
+
+       if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
+           x1.GetAnsiRef( ), n1.GetAnsiRef( ),
+           pO.GetAnsiRef( ), pF.GetAnsiRef( )
+    ) ) {
+
+           if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
+          x2.GetAnsiRef( ), n2.GetAnsiRef( ),
+          ( x1 - n1 ).GetAnsiRef( ), ( x1 - ( n1 * fac ) ).GetAnsiRef( )
+        ) ) {
+
+               xc = ( x2 + x1 ) * 0.5;
+
+
+               double dd=12; // EED   ****** ATENTION ****************
+
+               if (!(
+                       (xc(0)<dd) || (xc(1)<dd) || (xc(2)<dd) || 
+                       (fabs(xc(0)-_width)<dd) || (fabs(xc(1)-_height)<dd) || (fabs(xc(2)-_depth)<dd) 
+                       )){
+
+               _mar->_experiment->setStartPoint( (int)xc( 0 ), (int)xc( 1 ), (int)xc( 2 ) );
+        _mar->_experiment->getParameters( )->setROIStep( 2*( xc - x1 ).GetNorm( ) );
+
+      for(int i=0; i<4; i++)
+      {
+        _spheres[ i ] = vtkSphereSource::New( );
+        _spheresMapper[ i ] = vtkPolyDataMapper::New( );
+        _spheresMapper[ i ]->SetInput( _spheres[ i ]->GetOutput( ) );
+        _spheresActor[ i ] = vtkActor::New( );
+        _spheresActor[ i ]->SetMapper( _spheresMapper[ i ] );
+        _spheresActor[ i ]->PickableOff( );
+        _pRenderer->AddActor( _spheresActor[ i ] );
+      }
+
+               _spheres[ 0 ]->SetCenter( x1( 0 ), x1( 1 ), x1( 2 ) );
+               _spheres[ 1 ]->SetCenter( x2( 0 ), x2( 1 ), x2( 2 ) );
+               _spheres[ 2 ]->SetCenter( xc( 0 ), xc( 1 ), xc( 2 ) );
+               _spheres[ 3 ]->SetCenter( xc( 0 ), xc( 1 ), xc( 2 ) );
+
+               _spheres[ 0 ]->SetRadius( 0.5 );
+               _spheres[ 1 ]->SetRadius( 0.5 );
+               _spheres[ 2 ]->SetRadius( 0.5 );
+               _spheres[ 3 ]->SetRadius( ( xc - x1 ).GetNorm( ) );
+
+               _spheresActor[ 0 ]->GetProperty( )->SetColor( 1.0, 0.0, 0.0 );
+               _spheresActor[ 1 ]->GetProperty( )->SetColor( 0.0, 1.0, 0.0 );
+               _spheresActor[ 2 ]->GetProperty( )->SetColor( 0.0, 0.0, 1.0 );
+               _spheresActor[ 3 ]->GetProperty( )->SetColor( 1.0, 0.0, 0.0 );
+               _spheresActor[ 3 ]->GetProperty( )->SetOpacity( 0.3 );
+
+               vtkPoints* points = vtkPoints::New( );
+               points->InsertNextPoint( x1.GetAnsiRef( ) );
+               points->InsertNextPoint( x2.GetAnsiRef( ) );
+
+               vtkCellArray* array = vtkCellArray::New( );
+               array->InsertNextCell( 2 );
+               array->InsertCellPoint( 0 );
+               array->InsertCellPoint( 1 );
+
+               _centralLine = vtkPolyData::New( );
+               _centralLine->SetPoints( points );
+               _centralLine->SetLines( array );
+      points->Delete();
+      array->Delete();
+
+               _centralLineMapper = vtkPolyDataMapper::New( );
+               _centralLineMapper->SetInput( _centralLine );
+
+               _centralLineActor = vtkActor::New( );
+               _centralLineActor->SetMapper( _centralLineMapper );
+               _centralLineActor->GetProperty( )->SetColor( 1.0, 1.0, 1.0 );
+               _centralLineActor->PickableOff( );
+               _pRenderer->AddActor( _centralLineActor );
+
+
+          } else  {success = false; notSuccessType=1; }
+
+       } // fi
+
+       } else success = false;
+
+    } else success = false;
+
+    // Show a message, if any.
+    if (( !success ) && (notSuccessType==0)) {
+               strcpy( ttmp , marDict.GetString(905) ); strcat( ttmp , "\n \n" ); strcat( ttmp , marDict.GetString(910) );
+       wxMessageBox( wxString(ttmp, wxConvUTF8) , // "Set an initial point.\n \n (Double click over the interest artery.)"
+                                         _T("DxMM : MARACAS"), wxOK | wxCENTRE | wxICON_INFORMATION, this);
+       }
+    if ((!success ) && (notSuccessType==1)) {
+               strcpy( ttmp , marDict.GetString(915) ); strcat( ttmp , "\n \n" ); strcat( ttmp , marDict.GetString(920) );
+       wxMessageBox( wxString(ttmp, wxConvUTF8), //"The initial point should be far \n of the limits of the volume."
+                                         _T("DxMM : MARACAS"), wxOK | wxCENTRE | wxICON_INFORMATION, this);
+       }
+    // Finish
+    _pRenderWindow->Render( );
+    InitialSphere = success;
+
+}
+//----------------------------------------------------------------------------
+void vtk3DSurfaceWidget::ConfigureVTK( )
+{
+  // get render window
+  _pRenderWindow =  this->GetRenderWindow(  );
+
+  // connect renderer and render window and configure render window
+  _pRenderWindow->AddRenderer( _pRenderer );
+
+  // configure renderer
+  _pRenderer->SetBackground( 0.0, 0.0, 0.0 );
+  //_pRenderer->SetBackground( 1, 1, 0);  //FIXME
+  _pRenderer->GetActiveCamera( )->Zoom( 1.0 );
+  _pRenderer->GetActiveCamera( )->SetClippingRange( 1, 1000 );
+  _pRenderer->ResetCamera( );
+
+//EED 22Mai2007 
+//  AttachRenderWindow();
+
+}
+
+
+//----------------------------------------------------------------------------
+vtkRenderer* vtk3DSurfaceWidget::GetRenderer(){
+       return _pRenderer;
+}
+//----------------------------------------------------------------------------
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtk3DSurfaceWidget.h
new file mode 100644 (file)
index 0000000..0b43218
--- /dev/null
@@ -0,0 +1,134 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtk3DSurfaceWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __VTK3DSURFACEWIDGET__
+#define __VTK3DSURFACEWIDGET__
+
+#include "wxVTKRenderWindowInteractorEditContour.h"
+
+#include "vtkImagePolyDataSeedConnectivity.h"
+#include "vtkInteractorStyleCutter.h"
+#include "kernel/marInterface.h"
+#include "kernel/marInterfaceCT.h"
+#include "InterfaceVtkPanelWidgets.h"
+
+#include <vtkImageData.h>
+#include <vtkProperty2D.h>
+#include <vtkPolyData.h>
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkSphereSource.h>
+#include <vtkOutlineFilter.h>
+#include <vtkProperty.h>
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+/**
+ * \brief Class that brigde to VTK, override double click...
+ */
+class vtk3DSurfaceWidget : public wxVTKRenderWindowInteractor
+{
+public:
+
+    vtk3DSurfaceWidget(
+        wxWindow* parent,
+        wxWindowID id,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = 0,
+        const wxString& name = wxPanelNameStr
+        );
+    ~vtk3DSurfaceWidget();
+    void OnLeftDClick( wxMouseEvent& event );  
+       virtual void OnMouseWheel( wxMouseEvent& event );
+    void Render( );
+
+    void ConfigureVTK( );
+
+    void ShowMARACASData( marInterface* mar );
+       void ShowMARACASDataCT( marInterfaceCT* mar );
+    void SetSurfaceColor(float red, float green, float blue );
+    void SetSurfaceVisibility( bool visible );
+    void SetSurfaceIsoValue( int isoval );
+    void SetSurfaceOpacity( int opaval );
+
+    void GetSphereCenter( double center[3] );
+    void SetAxis( vtkPolyData *axis );
+    void RemoveAxis( );
+
+    ///\todo remove
+    vtkImageData* _marImageData;
+    vtkPolyData* _marPolyData;
+
+    vtkGetMacro(InitialSphere, int);
+
+    void SetInterfaceVtkPanelWidgets(InterfaceVtkPanelWidgets * intVtkPanWid) {_intVtkPanWid=intVtkPanWid;};
+    void SetInitialPoint();
+       void GetLast3DClickPoint( double *pp, double *cp );
+       void InitCameraReset( );
+       vtkRenderer *GetRenderer();
+
+protected:
+
+    void SetInitialPoint( float* pickPoint, float* cameraPos );
+       void SetLast3DClickPoint( double *pp, double *cp );
+
+    marInterface                               *_mar;
+       marInterfaceCT                          *_marCT;
+    vtkRenderer                                        *_pRenderer;
+    vtkRenderWindow                            *_pRenderWindow;
+    vtkOutlineFilter                   *_outLine;
+    vtkPolyDataMapper                  *_outMapper;
+    vtkActor                                   *_outActor;
+    vtkMarchingCubes                   *_mCubes;
+    vtkPolyDataMapper                  *_surfMapper;
+    vtkActor                                   *_surfActor;
+
+    vtkPolyData                                        *_centralLine;
+    vtkPolyDataMapper                  *_centralLineMapper;
+    vtkActor                                   *_centralLineActor;
+
+    vtkSphereSource                            *_spheres[ 4 ];
+    vtkPolyDataMapper                  *_spheresMapper[ 4 ];
+    vtkActor                                   *_spheresActor[ 4 ];
+
+    vtkPolyDataMapper                  *_axesMapper;
+    vtkActor                                   *_axesActor;
+
+    double                                             _range[2];
+
+       InterfaceVtkPanelWidgets        *_intVtkPanWid;
+
+private:
+
+    int                _width;
+    int                _height;
+    int                _depth;
+    int                InitialSphere;
+       float   _lastPickPoint[3];
+       float   _lastCameraPos[3];
+
+    DECLARE_EVENT_TABLE( );
+
+};
+
+#endif //__VTK3DSURFACEWIDGET__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkClosePolyData.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkClosePolyData.cxx
new file mode 100644 (file)
index 0000000..82f6591
--- /dev/null
@@ -0,0 +1,94 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: vtkClosePolyData.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkClosePolyData.h"
+
+#include "vtkObjectFactory.h"
+#include "vtkPolyData.h"
+#include "vtkFeatureEdges.h"
+#include "vtkStripper.h"
+#include "vtkTriangleFilter.h"
+//#include "vtkGLUTesselatorTriangleFilter.h"
+#include "vtkAppendPolyData.h"
+#include "vtkCleanPolyData.h"
+
+vtkCxxRevisionMacro(vtkClosePolyData, "$Revision: 1.1 $");
+vtkStandardNewMacro(vtkClosePolyData);
+
+//----------------------------------------------------------------------------
+vtkClosePolyData::vtkClosePolyData()
+{
+}
+
+//----------------------------------------------------------------------------
+vtkClosePolyData::~vtkClosePolyData()
+{
+}
+
+//----------------------------------------------------------------------------
+// This method is much too long, and has to be broken up!
+// Furthermore we are loosing the normals !!!
+void vtkClosePolyData::Execute()
+{
+  vtkPolyData *input = this->GetInput();
+  vtkPolyData *output = this->GetOutput();
+  
+   //#closing the polydata see : close.py for details
+  vtkFeatureEdges *boundary = vtkFeatureEdges::New();
+  boundary->SetInput( input );
+  boundary->BoundaryEdgesOn ();
+  boundary->FeatureEdgesOff ();
+  boundary->NonManifoldEdgesOff ();
+  boundary->ManifoldEdgesOff ();
+  //boundary->ColoringOff ();
+
+  vtkStripper *stripper = vtkStripper::New();
+  stripper->SetInput( boundary->GetOutput() );
+  stripper->Update(); //important
+  boundary->Delete();
+
+  vtkPolyData *pd = vtkPolyData::New();
+  pd->SetPoints ( stripper->GetOutput()->GetPoints() );
+  pd->SetPolys  ( stripper->GetOutput()->GetLines() );
+  stripper->Delete();
+    
+  //vtkGLUTesselatorTriangleFilter *triangle = vtkGLUTesselatorTriangleFilter::New();
+  vtkTriangleFilter *triangle = vtkTriangleFilter::New();
+  triangle->SetInput( pd );
+  pd->Delete();
+    
+  vtkAppendPolyData *append = vtkAppendPolyData::New();
+  append->AddInput( input );
+  append->AddInput( triangle->GetOutput());
+  triangle->Delete();
+      
+  vtkCleanPolyData *clean = vtkCleanPolyData::New();
+  clean->SetInput( append->GetOutput());
+  append->Delete();
+    
+  // When all optimizations are complete, this squeeze will be unecessary.
+  // (But it does not seem to cost much.)
+  clean->Update();  //important before ShallowCopy
+  output->ShallowCopy( clean->GetOutput() );
+  clean->Delete();
+}
+
+//----------------------------------------------------------------------------
+void vtkClosePolyData::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os,indent);
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkClosePolyData.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkClosePolyData.h
new file mode 100644 (file)
index 0000000..d7ca0fe
--- /dev/null
@@ -0,0 +1,57 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: vtkClosePolyData.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME vtkClosePolyData - close a polygonal dataset
+// .SECTION Description
+// 
+// vtkClosePolyData is a filter that blabla
+
+// .SECTION Thanks
+// Thanks to Goodwin Lawlor for http://public.kitware.com/pipermail/vtkusers/2003-March/016420.html
+// and Mathieu Malaterre for this class.
+
+// .SECTION See Also
+// vtkAppendFilter
+
+#ifndef __vtkClosePolyData_h
+#define __vtkClosePolyData_h
+
+#include "vtkPolyDataToPolyDataFilter.h"
+
+class vtkClosePolyData : public vtkPolyDataToPolyDataFilter
+{
+public:
+  static vtkClosePolyData *New();
+
+  vtkTypeRevisionMacro(vtkClosePolyData,vtkPolyDataToPolyDataFilter);
+  void PrintSelf(ostream& os, vtkIndent indent);
+
+protected:
+  vtkClosePolyData();
+  ~vtkClosePolyData();
+
+  // Usual data generation method
+  void Execute();
+
+private:
+  vtkClosePolyData(const vtkClosePolyData&);  // Not implemented.
+  void operator=(const vtkClosePolyData&);  // Not implemented.
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkImagePolyDataSeedConnectivity.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkImagePolyDataSeedConnectivity.cxx
new file mode 100644 (file)
index 0000000..9efc451
--- /dev/null
@@ -0,0 +1,423 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtkImagePolyDataSeedConnectivity.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkImagePolyDataSeedConnectivity.h"
+
+#include <vtkPolyData.h>
+#include <vtkImageData.h>
+#include <vtkMath.h>
+#include <vtkPlane.h>
+#include <vtkSphere.h>
+#include <vtkImplicitBoolean.h>
+#include <vtkImplicitFunctionToImageStencil.h>
+#include <vtkImageStencil.h>
+#include <vtkObjectFactory.h>
+#include <vtkImageSeedConnectivity.h>
+#include <vtkImageIterator.h>
+#include <vtkImageGaussianSmooth.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataConnectivityFilter.h>
+#include <vtkCleanPolyData.h>
+#include <vtkTriangleFilter.h>
+#include <vtkPointData.h>
+#include <vtkImageContinuousDilate3D.h>
+
+vtkCxxRevisionMacro(vtkImagePolyDataSeedConnectivity, "$Revision: 1.1 $");
+vtkStandardNewMacro(vtkImagePolyDataSeedConnectivity);
+vtkCxxSetObjectMacro(vtkImagePolyDataSeedConnectivity, Axis,vtkPolyData);
+
+//----------------------------------------------------------------------------
+vtkImagePolyDataSeedConnectivity::vtkImagePolyDataSeedConnectivity()
+{
+  this->Axis = NULL;
+  this->ClipImageData = vtkImageData::New();
+  this->OuterMold = vtkPolyData::New();
+  this->ThresholdRatio = 0.45;
+}
+//----------------------------------------------------------------------------
+vtkImagePolyDataSeedConnectivity::~vtkImagePolyDataSeedConnectivity()
+{
+  if(this->Axis)
+  {
+    this->Axis->Delete();
+  }
+  this->ClipImageData->Delete();
+  this->ClipImageData = NULL;
+  this->OuterMold->Delete();
+  this->OuterMold = NULL;
+}
+ /**
+  * Utilisation de static pour accelérer l'execution ?
+  * cf: vtkDividingCubes.cxx
+  */
+
+//Macros definitions
+#define PSC_MIN(x,y)      ((x)<(y) ? (x) : (y))
+#define PSC_MAX(x,y)      ((x)>(y) ? (x) : (y))
+//----------------------------------------------------------------------------
+void vtkImagePolyDataSeedConnectivity::Execute()
+{
+  vtkImageData *input = this->GetInput();
+  vtkPolyData *output = this->GetOutput();
+  int intervalle = 2;
+  int dim[3];
+
+  vtkDebugMacro(<< "Executing polydata seed connectivity...");
+
+  if (input == NULL)
+    {
+    vtkErrorMacro(<<"Input is NULL");
+    return;
+    }
+
+  // just deal with volumes
+  if ( input->GetDataDimension() != 3 )
+    {
+    vtkErrorMacro("Bad input: only treats 3D structured point datasets");
+    return;
+    }
+
+  input->GetDimensions(dim);
+
+  //Allocate a temporary image that will be filled in b&w
+  //this is the base of the algothm, from a graysccale input + an axis
+  //we produce a b&w image the the marching cubes can contour:
+
+  vtkImageData *imagedata = vtkImageData::New();
+  imagedata->SetOrigin( input->GetOrigin() );
+  imagedata->SetSpacing( input->GetSpacing() );
+  imagedata->SetExtent( input->GetExtent() );
+  imagedata->SetScalarTypeToUnsignedChar (); //for connectityseed + reduce mem usage
+  imagedata->AllocateScalars();
+
+  /*
+  Result: piece of crap !!
+  There was some leakage from another vessel that was near enough from the heart.
+  */
+
+  vtkImageSeedConnectivity *seed = vtkImageSeedConnectivity::New();
+  seed->SetInput( imagedata );
+  seed->SetInputConnectValue( 255 ); //If 0 -> inverse video, 255 -> rien !
+
+  // Before starting the loop we should make sure the image has been clipped
+  // with the polydata:
+  this->ClipImageWithAxis();
+
+  vtkPoints *points = this->Axis->GetPoints();
+  vtkDataArray* scalars = this->Axis->GetPointData()->GetScalars();
+  
+  int numPts = points->GetNumberOfPoints();
+  double p1[3], p2[3], p3[3], tuple[2];
+  double radius, signalvalue;
+  int region[6];
+  int i_p2; //allow saving of p2 index
+  unsigned short* inSI, *inSIEnd;
+  unsigned char*  outSI,*outSIEnd;
+    
+  for(int i=0; i<numPts; i+=intervalle)
+  {
+    i_p2 = i+intervalle/2;
+    points->GetPoint(i, p1);
+    if(numPts <= i+2*intervalle)
+    {
+      i_p2 = i+intervalle;
+      points->GetPoint(numPts - 1, p3);
+      i = numPts;      //no more iteration
+    }
+    else
+    {
+      points->GetPoint(i+intervalle, p3);
+    }
+    points->GetPoint(i_p2, p2);
+    
+    //Now we can add p2 point to the see list:
+    //seed->AddSeed( 3, p2); //too bad :(
+    seed->AddSeed( (int)p2[0], (int)p2[1], (int)p2[2] );
+
+    //this parameter seems to be ok for most image
+    //furthermore it doesn't make any change to make it bigger.
+    scalars->GetTuple(i_p2, tuple);
+    radius             = tuple[0]; 
+       signalvalue = tuple[1];
+    radius *= 4;               //multiply for a factor 4 for aneurism case
+
+    region[0] = (int)PSC_MAX(p2[0] - radius, 0);
+    region[2] = (int)PSC_MAX(p2[1] - radius, 0);
+    region[4] = (int)PSC_MAX(p2[2] - radius, 0);
+
+    region[1] = (int)PSC_MIN(p2[0] + radius, dim[0] - 1);
+    region[3] = (int)PSC_MIN(p2[1] + radius, dim[1] - 1);
+    region[5] = (int)PSC_MIN(p2[2] + radius, dim[2] - 1);
+
+    // multiply signal by a factor this allow user to accuratley find the best
+    // range
+    signalvalue *= ThresholdRatio;  
+
+      /**
+       * Instead of working on the real image, we might take advantage of
+       * class Stencil made by dgobbi
+       *
+       * Steps:
+       *  - Create a fake disk (black) of radius ~ Optimale sphere and normal
+       *    orientation = last point first eigen vector
+       * See: Disk-Stencil.py for more info
+       */
+      //Solution: this is too much a trouble: rather do it once on the entry (=first  axis point)
+
+      vtkImageIterator<unsigned short> inIt(this->ClipImageData, region);//image_woheart
+      vtkImageIterator<unsigned char> outIt(imagedata, region);
+      // vtkImageProgressIterator should be nicer in conjonction with a wxGauge
+
+      // Loop through ouput pixels
+      while (!inIt.IsAtEnd())
+      {
+        inSI = inIt.BeginSpan(); inSIEnd = inIt.EndSpan();
+        outSI = outIt.BeginSpan(); outSIEnd = outIt.EndSpan();
+
+        // Pixel operation
+        while (inSI != inSIEnd)
+          *outSI++ = (signalvalue <= *inSI++) ? 255 : 0;
+
+        inIt.NextSpan(); outIt.NextSpan();
+      }
+   }
+   
+  //NEW: introduced by Maciek/Marcela: use a vtkImageGaussian to get rid 
+  //of the crenelage/steps introduced by MarchingCubes
+  
+  vtkImageGaussianSmooth *gauss = vtkImageGaussianSmooth::New();
+  gauss->SetInput( seed->GetOutput() );
+  gauss->SetDimensionality(3);
+  //gauss->SetStandardDeviation(1.0);
+  //gauss->SetRadiusFactor(3.);
+
+  vtkMarchingCubes *contour = vtkMarchingCubes::New();
+  contour->SetInput ( gauss->GetOutput() );
+  contour->SetNumberOfContours( 1 );
+  contour->SetValue(0, 128);
+  contour->ComputeGradientsOn ();
+  contour->ComputeScalarsOn ();
+
+  vtkCleanPolyData *clean = vtkCleanPolyData::New();
+  clean->SetInput ( contour->GetOutput() );
+
+  vtkTriangleFilter *tf = vtkTriangleFilter::New();
+  tf->SetInput( clean->GetOutput() );
+  tf->Update();
+
+  //Need to do a deep copy as we'll do a ShallowCopy afterwards
+  output->DeepCopy( tf->GetOutput() );
+
+  //output->Squeeze();  //usefull ?
+
+  // Now we do a dilatation of seed->GetOutput() in order to have inner (=output)
+  // and outer mold (=OuterMold):
+ /**
+  * Internal function that take an input of a b&w or grayscale image (should be 
+  * unsigned short/ unsigned char and apply a dilatation (see math morpho for
+  * info).
+  * NB: dilation o gaussian = gaussian o dilatation 
+  */
+
+  //First apply a morpho math: dilatation of 2mm:
+  vtkImageContinuousDilate3D *dilate = vtkImageContinuousDilate3D ::New();
+  dilate->SetInput ( seed->GetOutput() );
+  //TODO: determine real kernel based on scale = cm/pixel
+  //See: http://public.kitware.com/pipermail/vtkusers/2000-September/004210.html
+  //[Spacing is x and y is the distance between the samples. The units of measure
+  //are your choice. Often medical images use millimeters. Let's say your medical
+  //data resolution is 512 x 512 and your study has a 250 mm field of view. Then
+  //the spacing in x and y would be 250/512 or .488 mm.]
+  //therefore we have here:
+
+  int kernelsize[3];   
+  double spacing[3];
+  seed->GetOutput()->GetSpacing( spacing );  //beware input should be Update()
+  for(int j=0; j<3; j++)
+  {
+    //2mm thickness, we assume spacing units is in mm !!
+    kernelsize[j] = 3; //(int) (2. / spacing[i]);
+    //std::cout << "kernel=" << kernelsize[i] << ",et:" << (int)(2./0.3334) << ",";
+    //beware if spacing=0.3334 -> 2/0.3334 = 5 !!!! bad bad +/-0.5 to see
+  }
+  dilate->SetKernelSize (kernelsize[0], kernelsize[1], kernelsize[2]);
+
+  //VTK filters rules !!!
+  gauss->SetInput( dilate->GetOutput());
+  tf->Update();
+  // shallow copy result into output.
+  // Could be re-written, as we know there is no vert neither strips...
+  OuterMold->ShallowCopy( tf->GetOutput() );
+  
+  //OuterMold->Squeeze();  //usefull ?
+
+  //Delete temp stuff:
+  imagedata            -> Delete();
+  seed                 -> Delete();
+  gauss                        -> Delete();
+  contour              -> Delete();
+  clean                        -> Delete();
+  tf                   -> Delete();
+  dilate               -> Delete();
+  
+  //TODO: if this filter is used many times when working on different image size
+  //I guess we need to find something brighter for this->ClipImageData
+}
+//end of macros use
+#undef PSC_MAX
+#undef PSC_MIN
+//----------------------------------------------------------------------------
+//We need to add a function that from the raw data is able to clip with
+//the begining and ending of polydata to produce sharp edge.
+void vtkImagePolyDataSeedConnectivity::ClipImageWithAxis()
+{
+  //no input need we'll work with member data:
+  //Now we only need the region growing part:
+ /**
+  * Instead of working directly on leo we might remove the heart by a  trick:
+  * If we could cut with a disk at place where the last(first) axis point is
+  * we could avoid the flood fill algo to spread in the heart...smart  !
+  */
+
+ /**
+  * First we construct a virtual disk (=half sphere for now)
+  * See: Disk-Stencil.py
+  */
+  double normal[3];
+
+ /**
+  * What we do here:
+  * Get first point (p2) and second point (p1) : assume it exists !
+  * Then calculate vector p2->p1
+  * normalize it
+  * use it to define intersection plane between sphere and plane
+  */
+  this->Axis->Update();
+  vtkPoints *points = this->Axis->GetPoints();
+  int numPts = points->GetNumberOfPoints();
+  double p1[3];
+  double p2[3];
+  
+  points->GetPoint( 0, p2 );
+  points->GetPoint( 1, p1 );
+  
+  normal[0] = p1[0] - p2[0];
+  normal[1] = p1[1] - p2[1];
+  normal[2] = p1[2] - p2[2];
+  vtkMath::Normalize( normal );
+
+  vtkPlane *plane1 = vtkPlane::New();
+  plane1->SetOrigin( p2[ 0 ], p2[ 1 ], p2[ 2 ] );
+  plane1->SetNormal( normal[0], normal[1], normal[2]);
+
+  vtkDataArray* scalars = this->Axis->GetPointData()->GetScalars();
+  double tuple[2];
+  scalars->GetTuple(0, tuple);
+  double radius = tuple[0];
+
+   vtkSphere *sphere1 = vtkSphere::New();
+   sphere1->SetCenter( p2[ 0 ], p2[ 1 ], p2[ 2 ] );
+   sphere1->SetRadius( radius + 1);
+
+   vtkImplicitBoolean *disk1 = vtkImplicitBoolean::New();
+   disk1->SetOperationTypeToIntersection();
+   disk1->AddFunction(sphere1);
+   disk1->AddFunction(plane1);
+
+ /**
+  * What we do here:
+  * Get last point (p2) and before last point (p1) : assume it exists !
+  * Then calculate vector p2->p1
+  * normalize it
+  * use it to define intersection plane between sphere and plane
+  */
+
+  //ax->getControlPoint(numPts - 1, p2, p2+3);
+  points->GetPoint( numPts - 1, p2);
+  //ax->getControlPoint(numPts - 2, p1, p1+3); //assume it exists
+  points->GetPoint( numPts - 2, p1);
+  normal[0] = p1[0] - p2[0];
+  normal[1] = p1[1] - p2[1];
+  normal[2] = p1[2] - p2[2];
+  vtkMath::Normalize( normal );
+
+  vtkPlane *plane2 = vtkPlane::New();
+  plane2->SetOrigin( p2[ 0 ], p2[ 1 ], p2[ 2 ] );
+  plane2->SetNormal( normal[0], normal[1], normal[2]);
+
+  vtkSphere *sphere2 = vtkSphere::New();
+  sphere2->SetCenter( p2[ 0 ], p2[ 1 ], p2[ 2 ] );
+  sphere2->SetRadius( radius + 1 );
+
+  vtkImplicitBoolean *disk2 = vtkImplicitBoolean::New();
+  disk2->SetOperationTypeToIntersection();
+  disk2->AddFunction(sphere2);
+  disk2->AddFunction(plane2);
+
+  vtkImplicitBoolean *disk = vtkImplicitBoolean::New();
+  disk->SetOperationTypeToUnion();
+  disk->AddFunction(disk1);
+  disk->AddFunction(disk2);
+
+ /**
+  * Now use dgobbi class: Stencil stuff to remove the 'bad' heart part
+  */
+
+  vtkImplicitFunctionToImageStencil *functionToStencil = vtkImplicitFunctionToImageStencil::New ();
+  functionToStencil->SetInput ( disk );
+
+  vtkImageStencil *stencil = vtkImageStencil::New();
+  stencil->SetInput( this->GetInput() );
+  stencil->SetStencil( functionToStencil->GetOutput() );
+  stencil->ReverseStencilOn();
+  stencil->SetBackgroundValue (0);
+  //don't forget to call ->Update before using an iterator !!!
+  stencil->Update();
+  
+  this->ClipImageData->ShallowCopy( stencil->GetOutput() );
+  
+ /**
+  * Should I do my own vtkCappedCylinder ??
+  * solution: no , cause ... I can't remember why... :p
+  */
+  
+  //Delete stuff:
+  plane1                       -> Delete();
+  sphere1                      -> Delete();
+  disk1                                -> Delete();
+  plane2                       -> Delete();
+  sphere2                      -> Delete();
+  disk2                                -> Delete();
+  disk                         -> Delete();
+  functionToStencil    -> Delete();
+  stencil                      -> Delete();
+}
+//----------------------------------------------------------------------------
+void vtkImagePolyDataSeedConnectivity::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os,indent);
+  if ( this->Axis )
+    {
+    os << indent << "Axis of " << this->Axis->GetNumberOfPoints()
+       << "points defined\n";
+    }
+  else
+    {
+    os << indent << "Axis not defined\n";
+    }
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkImagePolyDataSeedConnectivity.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkImagePolyDataSeedConnectivity.h
new file mode 100644 (file)
index 0000000..a200c24
--- /dev/null
@@ -0,0 +1,69 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vtkImagePolyDataSeedConnectivity.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME vtkImagePolyDataSeedConnectivity - create 
+// .SECTION Description
+//
+
+#ifndef __vtkImagePolyDataSeedConnectivity_h
+#define __vtkImagePolyDataSeedConnectivity_h
+
+#include <vtkStructuredPointsToPolyDataFilter.h>
+
+class vtkPolyData;
+
+class vtkImagePolyDataSeedConnectivity : public vtkStructuredPointsToPolyDataFilter
+{
+public:
+  static vtkImagePolyDataSeedConnectivity *New();
+  vtkTypeRevisionMacro(vtkImagePolyDataSeedConnectivity,vtkStructuredPointsToPolyDataFilter);
+  void PrintSelf(ostream& os, vtkIndent indent);
+
+  // Description:
+  // Set axis
+  virtual void SetAxis(vtkPolyData*);
+  vtkGetObjectMacro(Axis,vtkPolyData);
+
+  // Description:
+  // Set threshold ratio, by default .45
+  vtkSetMacro(ThresholdRatio,double);
+  vtkGetMacro(ThresholdRatio,double);
+
+  // Description:
+  // Get outer mold
+  vtkGetObjectMacro(OuterMold,vtkPolyData);
+
+protected:
+  vtkImagePolyDataSeedConnectivity();
+  ~vtkImagePolyDataSeedConnectivity();
+
+  void Execute();
+  void ClipImageWithAxis();
+
+  double ThresholdRatio;
+
+  vtkPolyData *Axis;
+  //image data that has been clip with polydata
+  vtkImageData *ClipImageData;
+  vtkPolyData *OuterMold;
+private:
+  vtkImagePolyDataSeedConnectivity(const vtkImagePolyDataSeedConnectivity&);  // Not implemented.
+  void operator=(const vtkImagePolyDataSeedConnectivity&);  // Not implemented.
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkInteractorStyleCutter.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkInteractorStyleCutter.cxx
new file mode 100644 (file)
index 0000000..a5698ab
--- /dev/null
@@ -0,0 +1,192 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: vtkInteractorStyleCutter.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkInteractorStyleCutter.h"
+
+#include <vtkPoints.h>
+#include <vtkActor2D.h>
+#include <vtkObjectFactory.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkCellArray.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper2D.h>
+#include <vtkProperty2D.h>
+#include <vtkCamera.h>
+
+vtkCxxRevisionMacro(vtkInteractorStyleCutter, "$Revision: 1.1 $");
+vtkStandardNewMacro(vtkInteractorStyleCutter);
+
+//----------------------------------------------------------------------------
+vtkInteractorStyleCutter::vtkInteractorStyleCutter()
+{
+  this->CurrentPosition[0] = this->CurrentPosition[1] = 0;
+  this->Direction[0] = this->Direction[1] = this->Direction[2] = 0.;
+  this->Moving = 0;
+
+  this->Points = vtkPoints::New();
+  this->Lines = vtkCellArray::New();
+  this->LoopPoints = vtkPoints::New();
+
+  vtkPolyData *pd = vtkPolyData::New();
+  pd->SetPoints( Points );
+  pd->SetLines( Lines );
+   
+  vtkPolyDataMapper2D *bboxMapper = vtkPolyDataMapper2D::New();
+  bboxMapper->SetInput( pd );
+   
+  this->BboxActor = vtkActor2D::New();
+  this->BboxActor->SetMapper( bboxMapper );
+  this->BboxActor->GetProperty()->SetColor(1, 0, 0);
+  this->BboxActor->VisibilityOff();
+
+  //thanks
+  pd->Delete();
+  bboxMapper->Delete();
+}
+
+//----------------------------------------------------------------------------
+vtkInteractorStyleCutter::~vtkInteractorStyleCutter()
+{
+  this->Points->Delete();
+  this->BboxActor->Delete();
+  this->Lines->Delete();
+  this->LoopPoints->Delete();
+}
+
+//----------------------------------------------------------------------------
+void vtkInteractorStyleCutter::OnMouseMove()
+{
+  if (!this->Interactor || !this->Moving)
+    {
+    return;
+    }
+  
+  this->CurrentPosition[0] = this->Interactor->GetEventPosition()[0];
+  this->CurrentPosition[1] = this->Interactor->GetEventPosition()[1];  
+  
+  //mouse move event
+  this->Points->SetPoint(this->PointID, this->CurrentPosition[0], 
+    this->CurrentPosition[1], 0);
+
+  this->Interactor->Render();
+}
+
+//----------------------------------------------------------------------------
+void vtkInteractorStyleCutter::OnLeftButtonDown()
+{
+  if (!this->Interactor)
+    {
+    return;
+    }
+  
+  this->CurrentPosition[0] = this->Interactor->GetEventPosition()[0];
+  this->CurrentPosition[1] = this->Interactor->GetEventPosition()[1];  
+
+  if(!this->Moving)
+    {
+    this->Initialize();
+
+    //Call this before accessing CurrentRenderer
+    this->FindPokedRenderer(this->CurrentPosition[0], this->CurrentPosition[1]);
+    this->CurrentRenderer->AddProp( BboxActor );
+    }
+
+  this->Moving = 1;
+
+  this->Points->SetPoint(this->PointID, this->CurrentPosition[0],
+    this->CurrentPosition[1], 0);
+  this->PointID = this->Points->InsertNextPoint( this->CurrentPosition[0], 
+    this->CurrentPosition[1], 0);
+
+  this->Lines->InsertCellPoint( this->PointID );
+  this->Lines->UpdateCellCount( this->PointID + 1 );
+  this->BboxActor->VisibilityOn();
+
+  this->Interactor->Render();
+}
+
+//----------------------------------------------------------------------------
+void vtkInteractorStyleCutter::OnRightButtonDown()
+{
+  if (!this->Interactor || !this->Moving)
+    {
+    return;
+    }
+  
+  double xyz[3];
+  this->Points->GetPoint( 0, xyz );
+  this->Points->SetPoint(this->PointID, xyz);
+
+  //Save current state
+  this->EndLoop();
+
+  this->Interactor->Render();
+  this->Moving = 0;
+}
+
+//----------------------------------------------------------------------------
+void vtkInteractorStyleCutter::Initialize()
+{
+  this->Points->Reset();
+  this->Lines->Reset();
+
+  this->PointID = this->Points->InsertNextPoint( 0, 0, 0);
+  this->Lines->InsertNextCell( 1 );
+  this->Lines->InsertCellPoint( 0 );
+}
+//----------------------------------------------------------------------------
+void vtkInteractorStyleCutter::EndLoop()
+{
+  double pi[3],fpi[4];
+  int numPts = this->Points->GetNumberOfPoints()-1;
+  this->LoopPoints->SetNumberOfPoints( numPts );
+  vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+  int state = camera->GetParallelProjection ();
+  camera->ParallelProjectionOn();
+
+  for (int i=0; i < numPts; i++)
+  {
+    this->Points->GetPoint(i, pi);
+    this->CurrentRenderer->SetDisplayPoint(pi[0], pi[1], 0);
+    this->CurrentRenderer->DisplayToWorld();
+
+    this->CurrentRenderer->GetWorldPoint( fpi );
+    if ( fpi[3] )
+    {
+      fpi[0] /= fpi[3];
+      fpi[1] /= fpi[3];
+      fpi[2] /= fpi[3];
+    }
+    this->LoopPoints->SetPoint( i, fpi[0], fpi[1], fpi[2] );
+  }
+
+  //Set direction of extrusion, should save this state before camera moves
+  camera->GetDirectionOfProjection( this->Direction );
+  //camera->SetParallelProjection( state );
+}
+//----------------------------------------------------------------------------
+//Just a quick hack:
+void vtkInteractorStyleCutter::VisibilityOff()
+{
+  this->BboxActor->VisibilityOff();
+}
+//----------------------------------------------------------------------------
+void vtkInteractorStyleCutter::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os, indent);
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkInteractorStyleCutter.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkInteractorStyleCutter.h
new file mode 100644 (file)
index 0000000..cc6d92a
--- /dev/null
@@ -0,0 +1,82 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: vtkInteractorStyleCutter.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME vtkInteractorStyleCutter - 
+// .SECTION Description
+// This interactor style allows the user to draw a rectangle in the render
+// window using the left mouse button.  
+
+#ifndef __vtkInteractorStyleCutter_h
+#define __vtkInteractorStyleCutter_h
+
+#include <vtkInteractorStyle.h>
+
+class vtkPoints;
+class vtkActor2D;
+class vtkCellArray;
+
+class vtkInteractorStyleCutter : public vtkInteractorStyle
+{
+public:
+  // Description:
+  // Instantiate the object.
+  static vtkInteractorStyleCutter *New();
+  vtkTypeRevisionMacro(vtkInteractorStyleCutter, vtkInteractorStyle);
+  void PrintSelf(ostream& os, vtkIndent indent);
+  
+  // Description:
+  // Event bindings controlling the effects of pressing mouse buttons
+  // or moving the mouse.
+  virtual void OnMouseMove();
+  virtual void OnLeftButtonDown();
+  virtual void OnRightButtonDown();
+  void VisibilityOff();
+  
+  vtkGetObjectMacro(LoopPoints,vtkPoints);
+  vtkGetVector3Macro(Direction,double);
+  
+protected:
+  vtkInteractorStyleCutter();
+  ~vtkInteractorStyleCutter();
+
+  //This method is designed for vtkImplicitSelectionLoop where the loop
+  //should not be closed, the function is virtual to override this behavior
+  virtual void EndLoop();
+  void Initialize();
+
+  int CurrentPosition[2];
+  double Direction[3];
+
+  //Points selected by the user
+  vtkPoints *Points;
+
+  //Current point id:
+  vtkIdType PointID;
+
+  //bool which determine if user has press the left button first
+  int Moving;
+  
+  vtkActor2D   *BboxActor;
+  vtkCellArray *Lines;
+  vtkPoints            *LoopPoints;
+  
+private:
+  vtkInteractorStyleCutter(const vtkInteractorStyleCutter&);  // Not implemented
+  void operator=(const vtkInteractorStyleCutter&);  // Not implemented
+};
+
+#endif
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxChart.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxChart.cxx
new file mode 100644 (file)
index 0000000..39ce6e6
--- /dev/null
@@ -0,0 +1,954 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxChart.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxChart.h"
+
+#include <math.h>
+
+//----------------------------------------------------------------
+// DataSet : Constructor & Destructor
+//-------------------------------------------------------------------
+wxDataSet::wxDataSet(wxPen *lStyle, wxBrush *dStyle, int dWidth,
+                     int lWidth, int dGap, int pMark, int disValues)
+{
+   m_lineStyle = lStyle;
+   m_dataStyle = dStyle;
+   m_dataWidth = dWidth;
+   m_lineWidth = lWidth;
+   m_pointMark = pMark;
+   m_displayValues = disValues;
+   m_display = false;
+   m_rowsList = NULL;
+   m_text = NULL;
+}
+
+wxDataSet::wxDataSet(wxPen *lStyle, wxBrush *dStyle,
+             wxString *lText, bool lDisplay)
+{
+   m_lineStyle = lStyle;
+   m_dataStyle = dStyle;
+   m_display = lDisplay;
+   m_text = lText;
+   m_rowsList = NULL;
+   m_dataWidth = 0;
+   m_lineWidth = 0;
+   m_pointMark = 0;
+   m_displayValues = 0;
+}
+
+
+
+wxDataSet::wxDataSet()
+{
+   m_lineStyle = NULL;
+   m_dataStyle = NULL;
+   m_dataWidth = 0;
+   m_lineWidth = 0;
+   m_pointMark = 0;
+   m_displayValues = 0;
+   m_display = false;
+   m_rowsList = NULL;
+   m_text = NULL;
+}
+
+
+wxDataSet::~wxDataSet()
+{
+  // Nothing
+}
+
+
+
+
+//-----------------------------------------------------------------
+// Chart
+//-------------------------------------------------------------------
+BEGIN_EVENT_TABLE(wxChart, wxPanel)
+  EVT_PAINT(wxChart::OnPaint)
+END_EVENT_TABLE()
+
+//---------------------------------------------------------------------
+// Constructor & Destructor
+wxChart::wxChart(wxWindow *parent, wxWindowID id,
+                 const wxPoint& pos, const wxSize& size,
+                 long  style, const wxString& name)
+                 : wxPanel(parent, id, pos, size, style, name)
+{
+  SetMaxWidthHeight(size.GetWidth(), size.GetHeight());
+  SetCenterChart(pos.x + (GetLargeur()/2), pos.y + (GetHauteur()/2));
+  InitDataSet();
+  InitChart();
+}
+
+
+
+wxChart::~wxChart()
+{
+  for(int i=0; i<m_NumDataSet ; i++)
+    delete(m_dataSetArray[i]);
+}
+
+
+
+void  wxChart::InitChart()
+{
+  SetShowPer(false); //not display line % per default
+  for(int i=0; i<m_NumDataSet ; i++)
+    ShowDataSet(false, i);
+  InitData();
+}
+
+// Static Function
+//--------------------------------------------------------------
+static double st_difference(double val, int multi, bool sens=true)
+{
+  double retour=0;
+  div_t result;
+  result = div(int(val), multi);
+
+  // multiple sup
+  if ( sens ) {
+    if ( val > 1) {
+      if ( result.rem == 0 ) {
+        if (val - (int)val > 0 )
+          retour =  (multi - result.rem) - (val - int(val));
+      }
+      else {
+        retour =  (multi - result.rem) - (val - int(val));
+      }
+    }
+  }
+  // multiple inf
+  else
+    retour = result.rem + (val - (int)val);
+  return retour;
+}
+
+static double st_decalage(double IncX, double MinX)
+{
+  double retour = 0.00;
+  div_t result;
+
+  if (IncX >= 1) {
+    result = div((int)MinX, (int)IncX);
+    if ( result.rem == 0 ) {
+      if (MinX - (int)MinX > 0 )
+        retour = ((result.quot + 1) * IncX) - MinX;
+    }
+    else {
+      retour = ((result.quot+1) * IncX) - MinX;
+    }
+  }
+  return retour;
+}
+
+static double st_origine(double IncX, double MinX)
+{
+  double retour = MinX;
+  div_t result;
+
+  if (IncX >=1) {
+    result = div((int)MinX, (int)IncX);
+    if (result.rem == 0) {
+      if (MinX - (int)MinX > 0 )
+        retour = (result.quot + 1) * IncX;
+    }
+    else {
+      retour = (result.quot + 1) * IncX;
+    }
+  }
+  return retour;
+}
+
+
+static void st_Inverse(double *l_MinCol, double  *l_MaxCol)
+{
+  if  (*l_MinCol > *l_MaxCol) {
+    int tempo = (int)(*l_MaxCol);
+    *l_MaxCol = *l_MinCol;
+    *l_MinCol = tempo;
+  }
+}
+
+
+//--------------------------------------------------------------
+void wxChart::SetInfX(double inf)
+{
+  m_InfX = inf;
+}
+
+void wxChart::SetSupX(double sup)
+{
+  m_SupX = sup;
+}
+
+
+void wxChart::SetSupY(double sup)
+{
+  m_SupY = sup;
+}
+
+
+void wxChart::SetIncAxisX(double minor, double major)
+{
+  m_MinorIncX = minor;
+  m_MajorIncX = major;
+}
+
+void wxChart::SetIncAxisY(double minor, double major)
+{
+  m_MinorIncY = minor;
+  m_MajorIncY = major;
+}
+
+
+void wxChart::SetInitEdge()
+{
+
+  SetEdgeTop(15);
+  SetEdgeBottom(35);
+  SetEdgeLeft(37);
+  SetEdgeRight(15);
+}
+
+
+
+void wxChart::SetChartBounds()
+{
+  m_Top = m_CenterY - (m_MaxHauteur/2) + m_EdgeTop;
+  m_Bottom = m_CenterY + (m_MaxHauteur/2) - m_EdgeBottom;
+  m_Left = m_CenterX - (m_MaxLargeur/2) + m_EdgeLeft;
+  m_Right = m_CenterX + (m_MaxLargeur/2) - m_EdgeRight;
+}
+
+void wxChart::SetChartBoundsLegend()
+{
+  m_TopLegend = m_CenterY - (m_MaxHauteur/2) + m_EdgeTopLegend;
+  m_BottomLegend = m_CenterY + (m_MaxHauteur/2) - m_EdgeBottomLegend;
+  m_LeftLegend = m_CenterX - (m_MaxLargeur/2) + m_EdgeLeftLegend;
+  m_RightLegend = m_CenterX + (m_MaxLargeur/2) - m_EdgeRightLegend;
+}
+
+
+void wxChart::SetCadreLegend(int nbr, int *bottom)
+{
+  int val=GetEdgeBottom();
+  div_t result = div(nbr, 2);
+  if (result.rem == 0)
+    val+= (nbr * 10) + 5;
+  else
+    val+= (( nbr + 1 ) * 10) + 5;
+
+  *bottom = val;
+  SetEdgeTopLegend(m_CenterY + (m_MaxHauteur/2) - val + 33);
+  SetEdgeBottomLegend(8);
+
+  int l_left = GetEdgeLeft();
+  int l_right = GetEdgeRight();
+
+  // more small for only 1 line
+  if (nbr == 1) {
+    l_left+=m_CenterX - (m_MaxLargeur/3);
+    l_right+=m_CenterX - (m_MaxLargeur/3);
+  }
+
+  SetEdgeLeftLegend(l_left);
+  SetEdgeRightLegend(l_right);
+}
+
+
+void wxChart::SetShowPer(bool per)
+{
+  m_ShowPer = per;
+}
+
+
+void  wxChart::SetMaxValue(double max)
+{
+  // Axe Y
+  m_MaxValue = max;
+}
+
+double wxChart::MaxValue()
+{
+  double data, val = 1.00;
+  int maxdata = GetNumDataSet()-1;
+  int maxitem = GetNumItem();
+
+  // Exclure Stenosis for calcul MaxValue
+  for(int a=0; a < maxdata; a++) {
+    if (GetShowDataSet(a)) {
+      for(int j=0; j<=maxitem; j++) {
+        if ( IsEmpty(a,j) == false ) {
+          data = GetDataY(a,j);
+          if (data > val)
+            val = data;
+        }
+      }
+    }
+  }
+
+  return val;
+}
+
+
+double wxChart::MinCol(double min)
+{
+  double retour = 0.00;
+  int maxdata = GetNumDataSet()-1;
+
+  // Exclure Stenosis for calcul MaxValue
+  for(int a=0; a < maxdata; a++) {
+    if (GetShowDataSet(a)) {
+      if (min > retour)
+        retour = min;
+      a = maxdata - 1;
+    }
+  }
+
+  return retour;
+}
+
+
+double wxChart::MaxCol(double max)
+{
+  double retour = 1.00;
+  int maxdata = GetNumDataSet()-1;
+
+  // Exclure Stenosis for calcul MaxValue
+  for(int a=0; a < maxdata; a++) {
+    if (GetShowDataSet(a)) {
+      if (max > retour)
+        retour = max;
+      a = maxdata - 1;
+    }
+  }
+
+  return retour;
+}
+
+void  wxChart::SetStepSizeX(double stepX)
+{
+  m_StepSizeX = stepX;
+}
+
+void  wxChart::SetStepSizeY(double stepY)
+{
+  m_StepSizeY = stepY;
+}
+
+
+void  wxChart::SetStepSizePer(double stepPer)
+{
+  m_StepSizePer = stepPer;
+}
+
+
+void   wxChart::SetCenterChart(int x, int y)
+{
+  m_CenterX = x;
+  m_CenterY = y;
+}
+
+void wxChart::SetMaxWidthHeight(int x,int y)
+{
+  m_MaxLargeur = x;
+  m_MaxHauteur = y;
+}
+
+
+void wxChart::SetMinX(double MinX)
+{
+  m_MinX = MinX;
+}
+
+
+void wxChart::SetMaxX(double MaxX)
+{
+  m_MaxX = MaxX;
+}
+
+
+
+void wxChart::SetEdgeTop(int top)
+{
+  m_EdgeTop = top;
+}
+
+void wxChart::SetEdgeBottom(int bottom)
+{
+  m_EdgeBottom = bottom;
+}
+
+void wxChart::SetEdgeLeft(int left)
+{
+  m_EdgeLeft = left;
+}
+
+void wxChart::SetEdgeRight(int right)
+{
+  m_EdgeRight = right;
+}
+
+
+void  wxChart::SetEdgeTopLegend(int top)
+{
+  m_EdgeTopLegend = top;
+}
+
+void  wxChart::SetEdgeBottomLegend(int bottom)
+{
+  m_EdgeBottomLegend = bottom;
+}
+
+void  wxChart::SetEdgeLeftLegend(int left)
+{
+  m_EdgeLeftLegend = left;
+}
+
+
+void  wxChart::SetEdgeRightLegend(int right)
+{
+  m_EdgeRightLegend = right;
+}
+
+
+
+void   wxChart::SetNumDataSet(int num)
+{
+  m_NumDataSet = num;
+}
+
+void   wxChart::SetNumItem(int num)
+{
+  m_NumItem = num;
+}
+
+
+int  wxChart::GetShow()
+{
+  int retour = 0;
+
+  for(int i=0; i < m_NumDataSet ; i++) {
+    if (GetShowDataSet(i))
+      retour++;
+  }
+  return retour;
+}
+
+
+void wxChart::InitDataSet()
+{
+
+  // Initialization
+  SetNumDataSet(8);
+  for(int i=0; i<MAX_DATASET ; i++)
+    m_dataSetArray[i]=NULL;
+
+  // Colour
+  wxColour *BlueColour       = new wxColour(0,0,255);
+  wxColour *GreyColour       = new wxColour(192,192,192);
+  wxColour *YellowColour     = new wxColour(255,255,0);
+  wxColour *VioletColour     = new wxColour(255,0,255);
+  wxColour *CyanColour       = new wxColour(0,255,255);
+
+  // Create All DataSet
+  // Per default : Show(false)
+  m_dataSetArray[wxArea] = new wxDataSet(wxRED_PEN, wxRED_BRUSH, (wxString*)"Area");
+  m_dataSetArray[wxPerimeter] = new wxDataSet(new wxPen(*BlueColour, 1, wxSOLID),
+                                              new wxBrush(*BlueColour, wxSOLID),
+                                              (wxString*)"Perimeter");
+
+  m_dataSetArray[wxDiameterArea] =  new wxDataSet(new wxPen(*GreyColour, 1, wxSOLID),
+                                                  new wxBrush(*GreyColour, wxSOLID),
+                                                  (wxString*)"Diameter from area");
+
+  m_dataSetArray[wxDiameterPerimeter] = new wxDataSet(new wxPen(*YellowColour, 1, wxSOLID),
+                                                      new wxBrush(*YellowColour, wxSOLID),
+                                                      (wxString*)"Diameter from perimeter");
+
+  m_dataSetArray[wxMinimumDiameter] = new wxDataSet(new wxPen(*VioletColour, 1, wxSOLID),
+                                                    new wxBrush(*VioletColour, wxSOLID),
+                                                    (wxString*)"Minimum diameter");
+
+  m_dataSetArray[wxMaximumDiameter] = new wxDataSet(new wxPen(*CyanColour, 1, wxSOLID),
+                                                    new wxBrush(*CyanColour, wxSOLID),
+                                                    (wxString*)"Maximum diameter");
+
+  m_dataSetArray[wxAverageDiameter] = new wxDataSet(wxBLACK_PEN, wxBLACK_BRUSH, (wxString*)"Average diameter");
+
+  m_dataSetArray[wxStenosis] =           new wxDataSet(wxGREEN_PEN, wxGREEN_BRUSH, (wxString*)"Stenosis");
+
+}
+
+
+// Paint
+//---------------------------------------------------------------------
+void wxChart::OnPaint(wxPaintEvent& event)
+{
+  wxPaintDC dc(this);
+  Draw(dc);
+}
+
+
+void wxChart::Draw(wxDC& dc)
+{
+  wxBrush *dataBrush;
+  wxPen *dataPen;
+
+  //----------------------------------------------------------------------------
+  // Begin
+  dc.BeginDrawing();
+  dc.Clear();
+
+  //----------------------------------------------------------------------------
+  // Font : one for all chart
+  dc.SetFont(*(new wxFont(1, wxDEFAULT, wxNORMAL, wxLIGHT)));
+
+  //----------------------------------------------------------------------------
+  // Dimension
+  wxSize size = GetClientSize();
+  SetMaxWidthHeight(size.GetWidth(), size.GetHeight());
+  SetCenterChart((GetLargeur()/2), (GetHauteur()/2));
+  SetInitEdge();
+
+  //-----------------------------------------------------------------------------
+  // Show Line
+  ShowDataSet(true,wxArea);
+  ShowDataSet(true,wxPerimeter);
+  ShowDataSet(true,wxDiameterArea);
+  ShowDataSet(true,wxDiameterPerimeter);
+  ShowDataSet(true,wxMinimumDiameter);
+  ShowDataSet(true,wxMaximumDiameter);
+  ShowDataSet(true,wxAverageDiameter);
+  ShowDataSet(true,wxStenosis);
+
+  m_ShowPer = true;
+
+  // Show Axe %
+  if (m_ShowPer) {
+    SetEdgeRight(45);
+    ShowDataSet(true,wxStenosis);
+  }
+
+  //--------------------------------------------------------------------
+  // Legend
+  int nbr = GetShow();
+  if (nbr > 0) {
+    SetCadreLegend(nbr, &m_EdgeBottom);
+    SetChartBoundsLegend();
+    DrawLegend(dc, nbr);
+  }
+
+  //-------------------------------------------------------------------
+  // Valeur Min et Max des abscisses
+  SetMinX(MinCol(0));
+  SetMaxX(MaxCol(1));
+  SetInfX(st_difference(m_MinX,10,false));
+  SetSupX(st_difference(m_MaxX,10,true));
+
+  //------------------------------------------------------------------
+  // Data
+  // Stenosis
+  SetNumItem(6);
+  SetData(wxStenosis, 0,   0,  -45);
+  SetData(wxStenosis, 1, 0.4,    0);
+  SetData(wxStenosis, 2, 0.6,  -15);
+  SetData(wxStenosis, 3, 0.8,    0);
+  SetData(wxStenosis, 4, 0.9,  100);
+  SetData(wxStenosis, 5,   1,    0);
+
+  // Area
+  SetData(wxArea,0,   0, 0.8);
+  SetData(wxArea,1, 0.2, 0.6);
+  SetData(wxArea,2, 0.3, 0.8);
+  SetData(wxArea,3, 0.4,   1);
+  SetData(wxArea,4, 0.8, 0.4);
+  SetData(wxArea,5,   1, 0.2);
+
+  //-----------------------------------------------------------------
+  // Valeur Max du chart
+  SetMaxValue(MaxValue());
+  SetSupY(st_difference(m_MaxValue, 10, true));
+
+  //-------------------------------------------------------------------------------
+  // Scale
+  SetIncAxisX((m_MaxX + m_SupX  -  (m_MinX - m_InfX)) / (double)MINOR_STEP,
+              (m_MaxX + m_SupX  -  (m_MinX - m_InfX)) / (double)MAJOR_STEP);
+  SetIncAxisY((m_MaxValue + m_SupY) / (double)MINOR_STEP,
+              (m_MaxValue + m_SupY) / (double)MAJOR_STEP);
+  SetStepSizeX(( m_MaxLargeur - (m_EdgeLeft + m_EdgeRight + m_SupX + m_InfX)) /
+               (m_MaxX - m_MinX));
+  SetStepSizeY(( m_MaxHauteur - (m_EdgeBottom + m_EdgeTop + m_SupY )) /
+                (m_MaxValue));
+  SetStepSizePer(( m_MaxHauteur - (m_EdgeBottom + m_EdgeTop)) /
+                 (double)MAX_PER);
+
+  //-----------------------------------------------------------------------------
+  // Empty Chart
+  //---------------------------------------------------------------------------
+  SetChartBounds();
+  DrawGrille(dc);
+  DrawAxe(dc);
+  if (m_ShowPer)
+    DrawAxePer(dc);
+
+  //-----------------------------------------------------------------------------
+  // Clipping
+  //---------------------------------------------------------------------------
+  dc.DestroyClippingRegion();
+  dc.SetClippingRegion(m_Left , m_Top ,
+                       GetLargeur() - (m_EdgeRight + m_EdgeLeft   ),
+                       GetHauteur() - (m_EdgeTop   + m_EdgeBottom ));
+
+   //---------------------------------------------------------------------------
+   // Draw line
+   //---------------------------------------------------------------------------
+  int maxdataset = GetNumDataSet();
+  for(int a=0; a < maxdataset; a++) {
+    if(m_dataSetArray[a] && m_dataSetArray[a]->GetShow()) {
+      dataBrush = m_dataSetArray[a]->GetDataStyle();
+      dataPen = m_dataSetArray[a]->GetLineStyle();
+      dc.SetBrush(*dataBrush);
+      dc.SetPen(*dataPen);
+      DrawLine(dc, a);
+    }
+  }
+
+  //---------------------------------------
+  // end
+  dc.DestroyClippingRegion();
+  dc.EndDrawing();
+}
+
+
+void wxChart::DrawAxe(wxDC& dc)
+{
+  double x,y;
+  double val, supx;
+  char text[20];
+  int widthx,heighty;
+
+  double minorIncStepY= m_MinorIncY * m_StepSizeY;
+  double majorIncStepY= m_MajorIncY * m_StepSizeY;
+  double minorIncStepX= m_MinorIncX * m_StepSizeX;
+  double majorIncStepX= m_MajorIncX * m_StepSizeX;
+
+  dc.SetPen(*wxBLACK_PEN);
+  dc.SetBrush(*wxBLACK_BRUSH);
+
+  // Axe X
+  dc.DrawLine(m_Left, m_Bottom+(7*MARGE/4), m_Right, m_Bottom+(7*MARGE/4));
+  // Axe Y
+  dc.DrawLine(m_Left-(7*MARGE/4), m_Bottom, m_Left-(7*MARGE/4), m_Top);
+
+  // AXE Y
+  // Major Tick Marks with values
+  val=0.00;
+  for(x=m_Left,y=m_Bottom; y >= m_Top; y-=majorIncStepY, val+=m_MajorIncY) {
+    dc.DrawLine( (int)(m_Left-7-(7*MARGE/4)) , (int)(y) , (int)(m_Left-(7*MARGE/4)) , (int)(y) );
+    sprintf(text,"%g", val);
+    dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+    dc.DrawText(wxString(text, wxConvUTF8), (int)(m_Left-10-widthx-(7*MARGE/4)) , (int)(y-(heighty/2)) );
+  }
+  // Ne pas Depasser
+  if (m_SupY == 0 ) {
+    dc.DrawLine(m_Left-7-(7*MARGE/4),m_Top,m_Left-(7*MARGE/4),m_Top);
+    sprintf(text,"%g", val);
+    dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+    dc.DrawText( wxString(text, wxConvUTF8),m_Left-10-widthx-(7*MARGE/4),m_Top-(heighty/2));
+  }
+
+  // Minor Tick Marks
+  for(x=m_Left,y=m_Bottom; y >= m_Top; y-=minorIncStepY) {
+    dc.DrawLine((int)(m_Left-3-(7*MARGE/4)) , (int)(y) , (int)(m_Left-(7*MARGE/4)) , (int)(y) );
+  }
+
+  // AXE X
+  // Major Tick Marks with values
+  supx = st_decalage(m_MajorIncX, m_MinX) * m_StepSizeX;
+  val = st_origine(m_MajorIncX, m_MinX);
+  for(y=m_Bottom,x=m_Left + supx; x <= m_Right; x+=majorIncStepX, val+=m_MajorIncX) {
+    dc.DrawLine((int)x,(int)(m_Bottom+7+(7*MARGE/4)),(int)(x),(int)(m_Bottom+(7*MARGE/4)));
+    sprintf(text,"%g", val);
+    dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+    dc.DrawText(wxString(text, wxConvUTF8), (int)(x-(widthx/2)) , (int)(y+3+heighty) );
+  }
+
+  // Ne pas Depasser
+  if ( m_SupX == 0 ) {
+    dc.DrawLine(m_Right,m_Bottom+7+(7*MARGE/4),m_Right,m_Bottom+(7*MARGE/4));
+    sprintf(text,"%g", val);
+    dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+    dc.DrawText(wxString(text, wxConvUTF8), (int)(m_Right-(widthx/2)), (int)(m_Right+3+heighty));
+  }
+
+  supx = st_decalage(m_MinorIncX, m_MinX) * m_StepSizeX;
+  //Minor Tick Marks
+  for(y=m_Bottom,x=m_Left + supx; x <= m_Right; x+=minorIncStepX) {
+    dc.DrawLine((int)(x),(int)(m_Bottom+3+(7*MARGE/4)),(int)(x),(int)(m_Bottom+(7*MARGE/4)));
+  }
+}
+
+
+void wxChart::DrawAxePer(wxDC& dc)
+{
+  double x,y;
+  double val;
+  char text[20];
+  int widthx,heighty;
+
+  double minorIncStepPer= MINOR_PER * m_StepSizePer;
+  double majorIncStepPer= MAJOR_PER * m_StepSizePer;
+
+  dc.SetPen(*wxBLACK_PEN);
+  dc.SetBrush(*wxBLACK_BRUSH);
+
+  // AXE Per
+  dc.DrawLine((int)(m_Right+(7*MARGE/4))  , m_Bottom, (int)(m_Right+(7*MARGE/4)), m_Top);
+
+  // Major Tick Marks with values
+  val=0.00;
+  for(x=m_Right,y=m_Bottom; y >= m_Top; y-=majorIncStepPer, val+=MAJOR_PER) {
+    dc.DrawLine( (int)(m_Right+(7*MARGE/4)) , (int)y , (int)(m_Right+7+(7*MARGE/4)) , (int)(y) );
+    sprintf(text,"%g",(val-(MAX_PER/2)));
+    dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+    dc.DrawText(wxString(text, wxConvUTF8) , (int)(m_Right+10+(7*MARGE/4)) , (int)(y-(heighty/2)) );
+  }
+  dc.DrawLine(m_Right+(7*MARGE/4),m_Top,m_Right+7+(7*MARGE/4),m_Top);
+  sprintf(text,"%g",(val-(MAX_PER/2)));
+  dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+  dc.DrawText(wxString(text, wxConvUTF8),(int) (m_Right+10+(7*MARGE/4) ), (int) (m_Top-(heighty/2) ));
+
+  // Minor Tick Marks
+  for(x=m_Right,y=m_Bottom; y >= m_Top; y-=minorIncStepPer) {
+    dc.DrawLine((int)(m_Right+(7*MARGE/4)),(int)y,(int)(m_Right+3+(7*MARGE/4)),(int)(y) );
+  }
+}
+
+
+void wxChart::DrawGrille(wxDC& dc)
+{
+  double x,y;
+  double val;
+  double minorIncStepY = m_MinorIncY * m_StepSizeY;
+  double minorIncStepX = m_MinorIncX * m_StepSizeX;
+
+  dc.SetBrush(*wxLIGHT_GREY_BRUSH);
+
+  // Tracer DOT
+  wxPen *Pen = new wxPen(*wxLIGHT_GREY, 1, wxDOT);
+  dc.SetPen(*Pen);
+
+  // quadrillage en point
+  // axe Y
+  for(x=m_Left,y=m_Bottom; y >= m_Top; y-=minorIncStepY)
+    dc.DrawLine((int)(m_Left-MARGE),(int)y,(int)(m_Right+MARGE),(int)y);
+  if (m_SupY == 0)
+    dc.DrawLine(m_Left-MARGE,m_Top,m_Right+MARGE,m_Top);
+
+  // axe X
+  val = st_decalage(m_MinorIncX, m_MinX) * m_StepSizeX;
+  for(y=m_Bottom, x=m_Left + val ; x <= m_Right; x+=minorIncStepX)
+    dc.DrawLine((int)x,(int)(m_Bottom+MARGE),(int)x,(int)(m_Top-MARGE));
+  if (m_SupX == 0)
+    dc.DrawLine(m_Right,m_Bottom+MARGE,m_Right,m_Top-MARGE);
+
+  // Contour
+  Pen->SetStyle(wxSOLID);
+  dc.SetPen(*Pen);
+  dc.DrawLine(m_Left-MARGE, m_Top-MARGE, m_Right+MARGE, m_Top-MARGE);
+  dc.DrawLine(m_Right+MARGE, m_Top-MARGE, m_Right+MARGE, m_Bottom+MARGE);
+  dc.DrawLine(m_Right+MARGE, m_Bottom+MARGE, m_Left-MARGE, m_Bottom+MARGE);
+  dc.DrawLine(m_Left-MARGE, m_Bottom+MARGE, m_Left-MARGE, m_Top-MARGE);
+}
+
+
+void wxChart::DrawLegend(wxDC& dc, int nbre)
+{
+  // Init
+  wxString  *string;
+  wxPen     *dataPen;
+  wxBrush   *dataBrush;
+  int widthx, heighty, l_posx, l_posy;
+  char text[30];
+  int haut_ligne, compt = 0;
+  int l_haut = m_BottomLegend - m_TopLegend;
+  int l_larg = m_RightLegend - m_LeftLegend;
+
+  div_t result = div(nbre,2);
+  div_t resulta;
+  int l_debut = 30, l_trait = 15, l_space = 10;
+
+  if (result.rem == 0)
+    haut_ligne = l_haut / result.quot;
+  else
+    haut_ligne = l_haut / (result.quot+1);
+
+  // Contour
+  dc.SetPen(*wxBLACK_PEN);
+  dc.SetBrush(*wxBLACK_BRUSH);
+  dc.DrawLine(m_LeftLegend, m_TopLegend, m_RightLegend, m_TopLegend);
+  dc.DrawLine(m_RightLegend, m_TopLegend, m_RightLegend, m_BottomLegend);
+  dc.DrawLine(m_RightLegend, m_BottomLegend, m_LeftLegend, m_BottomLegend);
+  dc.DrawLine(m_LeftLegend, m_BottomLegend, m_LeftLegend, m_TopLegend);
+
+  // For each dataset
+  int maxdataset = GetNumDataSet();
+  for (int a=0; a < maxdataset; a++) {
+    if (m_dataSetArray[a] && m_dataSetArray[a]->GetShow()) {
+      compt++;
+      // Text
+      string = m_dataSetArray[a]->GetText();
+      sprintf(text,"%s",string);
+      dc.GetTextExtent(wxString(text, wxConvUTF8),&widthx,&heighty);
+      resulta = div(compt, 2);
+      l_posx = m_LeftLegend;
+      l_posy =  m_TopLegend;
+      if (resulta.rem == 0) {
+        l_posx+= l_larg/2;
+        l_posy+= (haut_ligne * resulta.quot);
+      }
+      else
+        l_posy+= (haut_ligne * (resulta.quot+1));
+      l_posy-= (haut_ligne/2);
+
+      // proportion
+      if (nbre==1)
+        l_posx = m_LeftLegend + ((l_larg - l_trait - l_space - widthx)/2) - l_debut;
+
+      // ligne
+      dataBrush = m_dataSetArray[a]->GetDataStyle();
+      dataPen = m_dataSetArray[a]->GetLineStyle();
+      dataPen->SetWidth(2);
+      dc.SetBrush(*dataBrush);
+      dc.SetPen(*dataPen);
+      dc.DrawLine(l_posx + l_debut, l_posy, l_posx + l_debut + 15, l_posy);
+      dataPen->SetWidth(1);
+
+      // text
+      dc.SetFont(*(new wxFont(1, wxDEFAULT, wxNORMAL, wxBOLD)));
+      dc.SetPen(*wxBLACK_PEN);
+      dc.SetBrush(*wxBLACK_BRUSH);
+      dc.DrawText(wxString(text, wxConvUTF8),l_posx + l_debut + l_trait + l_space ,l_posy - (heighty/2));
+      dc.SetFont(*(new wxFont(1, wxDEFAULT, wxNORMAL, wxLIGHT)));
+    }
+  }
+}
+
+
+void wxChart::DrawLine(wxDC &dc, int a)
+{
+  int compt=0;
+  double val;
+  double mid = m_Bottom - ((m_Bottom-m_Top)/2);
+  int maxitem = GetNumItem();
+
+  float yprec, xprec;
+  float xsuiv, ysuiv;
+
+  for(int j=0; j < maxitem; j++) {
+    if ( IsEmpty(a,j) == false ) {
+      compt++;
+      xsuiv = m_Left + ((GetDataX(a,j) - m_MinX ) * m_StepSizeX);
+      val = GetDataY(a,j);
+      if ( a == wxStenosis)
+        // Axe Per for Stenosis
+        ysuiv = mid - (val * m_StepSizePer);
+      else
+        // Axe X
+        ysuiv = m_Bottom - (val * m_StepSizeY);
+
+      // Draw line
+      if (compt > 1)
+        dc.DrawLine((int)xprec, (int)yprec, (int)xsuiv, (int)ysuiv);
+
+      // save point prec
+      xprec = xsuiv;
+      yprec = ysuiv;
+    }
+  }
+}
+
+
+// Click Mouse
+//-----------------------------------------------------------------
+void wxChart::OnLeftClick(wxDC &dc, double x, double y, int keys)
+{
+  // TO IMPLEMENT
+}
+
+void wxChart::OnRightClick(wxDC &dc, double x, double y, int keys)
+{
+  // TO IMPLEMENT
+}
+
+
+// Data
+//--------------------------------------------------------------------
+void wxChart::InitData()
+{
+  SetNumItem(0);
+  for(int a=0; a<MAX_DATASET; a++) {
+    for(int j=0; j<MAX_ITEM; j++) {
+      m_table[a][j].x=0.00;
+      m_table[a][j].y=0.00;
+      m_table[a][j].empty = true;
+    }
+  }
+}
+
+bool  wxChart::IsEmpty(int a, int j)
+{
+  return m_table[a][j].empty;
+}
+
+
+double wxChart::GetDataX(int a, int j)
+{
+  return  m_table[a][j].x;
+}
+
+double wxChart::GetDataY(int a, int j)
+{
+  return  m_table[a][j].y;
+}
+
+
+void wxChart::SetData(int a, int j, double x, double y)
+{
+  m_table[a][j].x = x;
+  m_table[a][j].y = y;
+  m_table[a][j].empty = false;
+}
+
+
+void wxChart::ShowDataSet(bool show,int dataset)
+{
+  if(m_dataSetArray[dataset])
+    m_dataSetArray[dataset]->Show(show);
+}
+
+bool wxChart::GetShowDataSet(int dataset)
+{
+  if(m_dataSetArray[dataset])
+    return m_dataSetArray[dataset]->GetShow();
+  else
+    return 1;
+}
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxChart.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxChart.h
new file mode 100644 (file)
index 0000000..1d0317a
--- /dev/null
@@ -0,0 +1,219 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxChart.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__CHART__HXX__
+#define __WX__MARACAS__CHART__HXX__
+
+#include <wx/wx.h>
+
+//---------------------------------------------------------------------
+#define MAX_DATASET   10
+#define MAX_ITEM      50 
+#define MARGE             5
+#define MINOR_STEP    10
+#define MAJOR_STEP     5
+#define MAX_PER      200 
+#define MINOR_PER     25
+#define MAJOR_PER     50
+       
+enum 
+{
+  wxArea              = 0,
+  wxPerimeter         = 1,
+  wxDiameterArea      = 2, 
+  wxDiameterPerimeter = 3,
+  wxMinimumDiameter   = 4,
+  wxMaximumDiameter   = 5,
+  wxAverageDiameter   = 6,
+  wxStenosis          = 7
+};
+
+
+//-------------------------------------------------------------------
+class wxDataSet: public wxObject
+{
+ protected:
+   wxBrush  *m_dataStyle;
+   wxPen    *m_lineStyle;
+   wxString *m_text;
+   int       m_dataWidth;     // Scaled|Fixed
+   int       m_lineWidth;
+   int       m_pointMark;
+   int       m_displayValues; // def=NONE |IN | OUT 
+   bool      m_display;
+
+ public:
+   wxList *m_rowsList;
+ public :
+   // Constructor & Destructor
+   wxDataSet(wxPen *lStype, wxBrush *dStyle,
+             int dWidth, int lWidth, int dGap, int pMark,
+             int disValues);
+   wxDataSet(wxPen *lStype, wxBrush *dStyle,
+             wxString *lText, bool lDisplay=false);
+   wxDataSet();
+   ~wxDataSet();
+    // Set
+   void SetDataStyle(wxBrush* brush)  { m_dataStyle = brush; }
+   void SetDataWidth(int width)       { m_dataWidth = width; }
+   void SetLineStyle(wxPen* style)    { m_lineStyle = style; }
+   void SetPointMark(int mark)        { m_pointMark = mark;  }
+   void SetText(wxString* string)     { m_text      = string;}
+   void Show(bool show)               { m_display   = show;  }
+   
+   // Get
+   bool      GetShow()                { return m_display;    }
+   wxBrush*  GetDataStyle()           { return m_dataStyle;  }
+   int       GetDataWidth()           { return m_dataWidth;  }
+   wxPen*    GetLineStyle()           { return m_lineStyle;  }
+   int       GetPointMark()           { return m_pointMark;  }
+   wxString* GetText()                { return m_text;       }
+   
+};
+//---------------------------------------------------------------
+
+
+class Table
+{
+  public :
+    double x,y;
+       bool   empty;
+};
+
+//----------------------------------------------------------------------
+class wxChart: public wxPanel
+{
+private:
+       
+    int         m_NumDataSet;
+       int         m_NumItem;
+       Table       m_table[MAX_DATASET][MAX_ITEM];
+    wxDataSet  *m_dataSetArray[MAX_DATASET]; 
+    double      m_MinX, m_MaxX;
+    double      m_InfX, m_SupX, m_SupY;
+       
+       double      m_StepSizeX, m_StepSizeY, m_StepSizePer;
+    double      m_MaxValue; 
+    
+       double      m_MinorIncX, m_MajorIncX;
+    double      m_MinorIncY, m_MajorIncY;
+
+    bool        m_ShowPer;
+
+       int         m_ValueCol;  
+
+       int         m_MaxHauteur, m_MaxLargeur;
+    int         m_CenterX, m_CenterY;
+       int         m_EdgeTop, m_EdgeBottom, m_EdgeLeft, m_EdgeRight;
+    int         m_Top,m_Bottom, m_Left, m_Right;
+           
+    int         m_EdgeTopLegend, m_EdgeBottomLegend, m_EdgeLeftLegend, m_EdgeRightLegend;
+    int         m_TopLegend, m_BottomLegend, m_LeftLegend, m_RightLegend;
+       
+       void        DrawLine(wxDC &dc, int a);
+       void        DrawFond(wxDC& dc);
+    void        DrawAxe(wxDC& dc);
+    void        DrawAxePer(wxDC& dc);
+       void        DrawLegend(wxDC& dc, int nbr);
+       void        DrawGrille(wxDC& dc);
+       void        SetInitEdge();
+    void        SetChartBounds();
+       void        SetChartBoundsLegend();
+       void        SetCadreLegend(int nbr, int* bottom);
+    void        InitDataSet();
+    void        InitData();
+       double      MaxValue();
+       double      MinCol(double inf);
+    double      MaxCol(double sup);
+    void        SetInfX(double sup);
+       void        SetSupX(double sup);
+       void        SetSupY(double sup);
+    void        InitChart();
+    int         GetShow();
+
+public:
+       // Constructor et Destructor
+       wxChart(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition,
+               const wxSize& size = wxDefaultSize, long  style = wxDEFAULT_FRAME_STYLE,
+               const wxString& name = wxPanelNameStr);
+    ~wxChart();
+       
+       void    OnPaint(wxPaintEvent& event);
+       void    OnLeftClick(wxDC &dc, double x, double y, int keys);
+       void    OnRightClick(wxDC &dc, double x, double y, int keys);
+       
+       void    Draw(wxDC& dc);
+       bool    IsEmpty(int a, int item);
+       double  GetDataX(int a, int item);
+       double  GetDataY(int a, int item);
+    void    SetData(int a, int item, double x, double y);
+    
+    void    SetMinX(double MinX);
+       void    SetMaxX(double MaxX);
+       void    SetMaxWidthHeight(int x,int y); 
+       void    SetCenterChart(int x, int y);
+       void    SetShowPer(bool per);
+       void    SetMaxValue(double max);
+       void    SetStepSizeX(double sizeX);
+    void    SetStepSizeY(double sizeY);
+    void    SetStepSizePer(double sizePer);
+    void    SetNumDataSet(int NumDataSet);
+       void    SetNumItem(int NumItem);
+       void    SetIncAxisX(double minor, double major);
+    void    SetIncAxisY(double minor, double major);
+    void    SetEdgeTop(int top);
+       void    SetEdgeBottom(int bottom);
+       void    SetEdgeLeft(int left);
+       void    SetEdgeRight(int right);
+    void    SetEdgeTopLegend(int top);
+       void    SetEdgeBottomLegend(int bottom);
+       void    SetEdgeLeftLegend(int left);
+       void    SetEdgeRightLegend(int right);
+       void    ShowDataSet(bool show,int dataset);
+       
+       bool    GetShowDataSet(int dataset);
+    double  GetMinX()             { return m_MinX;             }
+    double  GetMaxX()             { return m_MaxX;             }
+       int     GetMaxValue()         { return (int)m_MaxValue;         }
+       double  GetStepSizeX()        { return m_StepSizeX;        }
+    double  GetStepSizeY()        { return m_StepSizeY;        }
+    double  GetStepSizePer()      { return m_StepSizePer;      }
+    int     GetValueCol()         { return m_ValueCol;         }
+    int     GetNumDataSet()       { return m_NumDataSet;       }
+       int     GetNumItem()          { return m_NumItem;          }
+       bool    GetShowPer()          { return m_ShowPer;          }
+       int     GetLargeur()          { return m_MaxLargeur;       }
+    int     GetHauteur()          { return m_MaxHauteur;       }
+       int     GetEdgeTop()          { return m_EdgeTop;          }
+    int     GetEdgeBottom()       { return m_EdgeBottom;       }
+    int     GetEdgeLeft()         { return m_EdgeLeft;         }
+    int     GetEdgeRight()        { return m_EdgeRight;        }
+       int     GetEdgeTopLegend()    { return m_EdgeTopLegend;    }
+    int     GetEdgeBottomLegend() { return m_EdgeBottomLegend; }
+    int     GetEdgeLeftLegend()   { return m_EdgeLeftLegend;   }
+    int     GetEdgeRightLegend()  { return m_EdgeRightLegend;  }
+       
+   DECLARE_EVENT_TABLE()
+};
+
+
+
+#endif 
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget.cxx
new file mode 100644 (file)
index 0000000..7814c78
--- /dev/null
@@ -0,0 +1,282 @@
+
+#include "vtkActor.h"
+#include "vtkCylinderSource.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkProperty.h"
+#include "vtkCamera.h"
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+#include "vtkPolyData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataWriter.h"
+#include "vtkPolyDataReader.h"
+#include "vtkImageReader.h"
+#include "vtkImageViewer.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageToStructuredPoints.h"
+
+
+#include "vtkExtractVOI.h"
+#include "vtkImageClip.h"
+#include "vtkImageResample.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkImageReslice.h"
+#include "vtkTransform.h"
+#include "vtkSphereSource.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkCommand.h"
+#include "vtkCallbackCommand.h"
+#include "vtkImageResample.h"
+#include "vtkMath.h"
+#include "vtkStripper.h"
+
+
+#include "wxEmptyPanelWidget.h"
+
+#include <wx/splitter.h>
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxEmptyPanelWidget::wxEmptyPanelWidget(wxWindow *parent)
+: wxPanel( parent, -1) 
+{
+       wxBoxSizer                      *sizer                  = new wxBoxSizer(wxVERTICAL  );
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       wxPanel                         *viewPanel              = CreateViewPanel(pnlSplitter);
+       wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
+
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 150 );
+    pnlSplitter        -> SplitVertically( viewPanel, controlPanel, 600 );
+       this            -> SetSizer(sizer);
+
+       // Original Volule
+       _mCubes                 = NULL;
+       _surfMapper             = NULL;
+       _surfActor              = NULL;
+
+       // Result: Volume + Axis
+       _prgov                  = NULL;
+       _mapfinal               = NULL;
+       _stripfinal             = NULL;
+       _isoMapperMC6   = NULL;
+       _isoActorMC6    = NULL;
+       _isoMC6                 = NULL;
+}
+//-------------------------------------------------------------------
+wxEmptyPanelWidget::~wxEmptyPanelWidget(){
+
+       // Original Volule
+       _mCubes                 -> Delete();
+       _surfMapper             -> Delete();
+       _surfActor              -> Delete();
+
+       // Result: Volume + Axis
+       _prgov                  -> Delete();
+       _mapfinal               -> Delete();
+       _stripfinal             -> Delete();
+       _isoMapperMC6   -> Delete();
+       _isoActorMC6    -> Delete();
+       _isoMC6                 -> Delete();
+}
+//-------------------------------------------------------------------
+wxPanel* wxEmptyPanelWidget::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+
+       _imageviewer3D = new wxVtk3DBaseView(panel);
+       wxVTKRenderWindowInteractor *iren = _imageviewer3D->GetWxVTKRenderWindowInteractor();   
+       sizer->Add(iren , 1, wxEXPAND, 0);
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxEmptyPanelWidget::CreateControlPanel(wxWindow *parent)
+{
+       wxPanel *panel  = new wxPanel(parent,-1);
+       _opacity1               = new wxSlider( panel, -1, 50, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _isoValue               = new wxSlider( panel, -1, 0 , 0, 3000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _opacity2               = new wxSlider( panel, -1, 50, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _opacity1->SetSize(250,20);  // Original Volume
+       _isoValue->SetSize(250,20);
+       _opacity2->SetSize(250,20);  // Result Volume
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Isovalue - Original Volume")));        
+       sizer->Add(_isoValue);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Original Volume")));
+       sizer->Add(_opacity1);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Result Volume")));
+       sizer->Add(_opacity2);
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       Connect(_opacity1->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget::OnOpacity1 ); 
+       Connect(_isoValue->GetId()  , wxEVT_SCROLL_THUMBRELEASE         , (wxObjectEventFunction) &wxEmptyPanelWidget::OnIsoValue ); 
+       Connect(_opacity2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget::OnOpacity2 ); 
+       return panel;
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget::Refresh()
+{
+       _imageviewer3D->Refresh();
+}
+//------------------------------------------------------------------------
+
+void wxEmptyPanelWidget::ConfigureVTK(vtkImageData *imagedata, int x, int y, int z)
+{
+    wxBusyCursor wait;
+       _imageviewer3D->Configure();
+       
+       double puntoactualprov[3];
+       puntoactualprov[0]=x;
+       puntoactualprov[1]=y;
+       puntoactualprov[2]=z;
+
+       double espprin[3];
+       int extprin[6];                         
+       
+       imagedata->GetSpacing(espprin);
+       imagedata->GetExtent(extprin);
+
+       puntoactualprov[0]=puntoactualprov[0]*espprin[0];
+       puntoactualprov[1]=puntoactualprov[1]*espprin[1];
+       puntoactualprov[2]=puntoactualprov[2]*espprin[2];
+       
+       /* Old
+       // Juan Francisco Carrillo Filter 
+       _prgov= axisExtractor::New();
+       _prgov->SetHumbral(0.45);
+       _prgov->SetInput(imagedata);
+       _prgov->SetPoint(puntoactualprov);
+       _prgov->Update();
+       */
+
+       // Juan Francisco Carrillo Filter 
+       _prgov= axisExtractor02::New();
+       _prgov->SetParam(1);
+       _prgov->SetParam2(1);
+       _prgov->SetParam3(0.5);
+       _prgov->SetMaxant(20);
+       _prgov->SetMinant(5);
+       _prgov->SetInput(imagedata);
+       _prgov->SetPoint(puntoactualprov);
+       _prgov->Update();
+
+
+       vtkPolyDataWriter *writer = vtkPolyDataWriter::New();
+       writer->SetInput(_prgov->GetOutput());
+    writer->SetFileName("c:/temp/salida_JF.vtk");
+    writer->SetFileTypeToASCII();
+    writer->Write();
+
+
+       // Visualisation - result vascular tree
+       _mapfinal = vtkPolyDataMapper::New();
+       _mapfinal->SetInput(_prgov->GetOutput());
+
+       _stripfinal = vtkActor::New();
+       _stripfinal->SetMapper(_mapfinal);
+       _stripfinal->GetProperty()->SetColor(1, 1, 1);
+       _stripfinal->GetProperty()->SetLineWidth(2);
+
+       _stripfinal->GetProperty()->BackfaceCullingOff();
+
+       // Visualisation - result volume
+       vtkImageData *imageOut = _prgov->GetVolumen();
+       imageOut->Update();
+
+    _isoMC6 = vtkMarchingCubes::New();
+    _isoMC6->SetInput(imageOut);
+    _isoMC6->SetValue(0, 1);
+       _isoMC6->Update();
+
+       _isoMapperMC6 = vtkPolyDataMapper::New();
+    _isoMapperMC6->SetInput(_isoMC6->GetOutput());
+    _isoMapperMC6->ScalarVisibilityOff();
+    _isoMapperMC6->ImmediateModeRenderingOn();
+
+       _isoActorMC6 = vtkActor::New();
+    _isoActorMC6->SetMapper(_isoMapperMC6);
+    _isoActorMC6->GetProperty()->SetColor( 0, 1, 0);
+    _isoActorMC6->GetProperty()->SetOpacity(0.25);
+       // Visualisation - original volume
+    double range[2];
+    imagedata->GetScalarRange( range );
+
+    _mCubes = vtkMarchingCubes::New( );
+    _mCubes->SetInput( imagedata );
+    _mCubes->SetValue( 0, range[1] / 4 );
+
+    vtkStripper *stripper = vtkStripper::New();
+    stripper->SetInput( _mCubes->GetOutput( ) );
+
+    _surfMapper = vtkPolyDataMapper::New( );
+       _surfMapper->SetInput( stripper->GetOutput() );
+    _surfMapper->ScalarVisibilityOff( );
+    stripper->Delete();
+
+    _surfActor = vtkActor::New( );
+    _surfActor->SetMapper( _surfMapper );
+    _surfActor->PickableOff( );
+    _surfActor->GetProperty( )->SetColor( 0.9803, 0.9215, 0.8392 );
+    _surfActor->GetProperty( )->SetOpacity( 0.3 );
+               
+
+       // Update Controls
+       _isoValue->SetRange( (int)(range[0]), (int)(range[1]) );
+       _isoValue->SetValue( (int)(range[1]/4) );
+       _opacity1->SetValue( (int)(_surfActor->GetProperty( )->GetOpacity( )*100) );
+       _opacity2->SetValue( (int)(_isoActorMC6->GetProperty( )->GetOpacity( )*100));
+    
+       // Interface Update
+       vtkRenderer *ren = _imageviewer3D->GetRenderer();
+       ren->AddActor(_surfActor);
+       ren->AddActor(_isoActorMC6);
+       ren->AddActor(_stripfinal);
+
+}
+
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget::OnOpacity1(wxScrollEvent& event){
+       double value = ((double)_opacity1->GetValue())/100;
+    _surfActor->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget::OnOpacity2(wxScrollEvent& event){
+       double value = ((double)_opacity2->GetValue())/100;
+    _isoActorMC6->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget::OnIsoValue(wxScrollEvent& event){
+    wxBusyCursor wait;
+       _mCubes->SetValue(0, _isoValue->GetValue());
+       Refresh();
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget.h
new file mode 100644 (file)
index 0000000..eb23ad6
--- /dev/null
@@ -0,0 +1,63 @@
+
+
+#ifndef EMPTY_PANEL_WIDGET_H
+#define EMPTY_PANEL_WIDGET_H
+
+
+
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkImageData.h>
+
+
+
+#include "wxVtkBaseView.h"
+#include "wxVTKRenderWindowInteractor.h"
+#include <kernel/axisExtractor02.h>
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxEmptyPanelWidget: public wxPanel{
+public:
+       wxEmptyPanelWidget(wxWindow *parent);
+       ~wxEmptyPanelWidget();
+       void ConfigureVTK(vtkImageData *imagedata, int x, int y, int z);
+       void Refresh();
+       void OnOpacity1(wxScrollEvent& event); // Original Volume
+       void OnOpacity2(wxScrollEvent& event); // Result Volume
+       void OnIsoValue(wxScrollEvent& event);
+private:
+
+       // Original Volume
+       vtkMarchingCubes        *_mCubes;
+       vtkPolyDataMapper       *_surfMapper;
+       vtkActor                        *_surfActor;
+
+       // Result volume + Axis
+       axisExtractor02         *_prgov;
+       vtkPolyDataMapper       *_mapfinal;
+       vtkActor                        *_stripfinal;
+       vtkPolyDataMapper       *_isoMapperMC6;
+       vtkActor                        *_isoActorMC6;
+       vtkMarchingCubes        *_isoMC6;
+
+
+       wxSlider                        *_opacity1;
+       wxSlider                        *_opacity2;
+       wxSlider                        *_isoValue;
+       wxVtk3DBaseView         *_imageviewer3D;
+       wxPanel                         *CreateControlPanel(wxWindow *parent);
+       wxPanel                         *CreateViewPanel(wxWindow *parent);
+};
+
+#endif // EMPTY_PANEL_WIDGET_H
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget_2.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget_2.cxx
new file mode 100644 (file)
index 0000000..2ac2d4e
--- /dev/null
@@ -0,0 +1,1075 @@
+
+#include "vtkObjectFactory.h"
+
+#include "vtkActor.h"
+#include "vtkCylinderSource.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkProperty.h"
+#include "vtkCamera.h"
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+#include "vtkPolyData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataWriter.h"
+#include "vtkPolyDataReader.h"
+#include "vtkImageReader.h"
+#include "vtkImageViewer.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageToStructuredPoints.h"
+#include <vtkImageThreshold.h> 
+
+#include "vtkExtractVOI.h"
+#include "vtkImageClip.h"
+#include "vtkImageResample.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkImageReslice.h"
+#include "vtkTransform.h"
+#include "vtkSphereSource.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkCommand.h"
+#include "vtkCallbackCommand.h"
+#include "vtkImageResample.h"
+#include "vtkMath.h"
+#include "vtkStripper.h"
+
+#include "wxEmptyPanelWidget_2.h"
+
+#include <wx/splitter.h>
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+vtkStandardNewMacro(TreeExtraction_MH_JFC);
+//-------------------------------------------------------------------
+
+TreeExtraction_MH_JFC::TreeExtraction_MH_JFC(){
+       _branchLevel            = 2;
+       _imagedataResult        = NULL;
+       _cleanLevel                     = 400;
+}
+//-------------------------------------------------------------------
+TreeExtraction_MH_JFC::~TreeExtraction_MH_JFC(){
+       Reset();
+}
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::Reset(){
+       if (_imagedataResult!=NULL){
+               _imagedataResult->Delete();
+       }
+}
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::SetInput(marExperiment *input){
+       _marExperiment = input;
+}
+
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::BruleVolume(vtkImageData *imagedata, int x,int y,int z,int r , int value)
+{
+       int ext[6];
+       int i, j, k, ii,jj,kk;  
+       imagedata->GetExtent(ext);
+       unsigned short *ptr;
+       int x1=x-r;
+       int x2=x+r;
+       int y1=y-r;
+       int y2=y+r;
+       int z1=z-r;
+       int z2=z+r;
+       double tmpsqrt;
+       for(i=x1;i<=x2;i++){
+               for(j=y1;j<=y2;j++){
+                       for(k=z1;k<=z2;k++){
+                               ptr=(unsigned short *)  imagedata->GetScalarPointer(i,j,k);
+                               ii=i-x;
+                               jj=j-y;
+                               kk=k-z;
+                               tmpsqrt=ii*ii + jj*jj + kk*kk;
+                               if ((ptr!=NULL) && ( sqrt(tmpsqrt)<=r))
+                               {
+                                       if (value==0){
+                                               *ptr=value;
+                                       } else {
+                                               if (*ptr==0)  {
+                                                       *ptr=value;
+                                               }
+                                       }
+                               } 
+                       } // for z
+               }  // for y
+       } // fox x
+}
+
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::BruleVolume(vtkImageData *imagedata,vtkPolyData *inputAxisRadio, int value)
+{
+       int x,y,z,r;
+       double point[3],radio;
+       double fractpart, intpart;
+       int i,maxPoints=inputAxisRadio->GetPoints()->GetNumberOfPoints();
+       vtkDoubleArray *allRadios = (vtkDoubleArray*)(inputAxisRadio->GetPointData()->GetScalars("radio"));
+       for (i=0; i<maxPoints; i++){    
+               inputAxisRadio->GetPoints()->GetPoint(i,point);
+               radio=allRadios->GetValue(i);
+               x = (int)(point[0]);
+               y = (int)(point[1]);    
+               z = (int)(point[2]);
+               fractpart = modf (radio , &intpart);
+               if (fractpart>=0.5){
+                intpart++;
+               }
+               r = (int)( intpart );
+               BruleVolume(imagedata,x,y,z,r,value);
+       }
+}
+
+
+//-------------------------------------------------------------------
+
+void TreeExtraction_MH_JFC::FindVit( marExperiment *newExperiment , int actualAxis , double *pointBif , double *vit )
+{
+       double dist,min=-1;
+       double point[3];
+       double dx,dy,dz;
+       int jPoint,maxPoints;
+       int iAxis,maxAxis;
+
+       maxAxis=newExperiment->getNumberOfAxes();
+       for (iAxis=0;iAxis<maxAxis;iAxis++){
+               if (iAxis!=actualAxis){
+                       newExperiment->setAxis(iAxis);
+                       marAxis *maraxis = newExperiment->getAxis( );
+                       if (maraxis!=NULL) {
+                               vtkPolyData  *axisVtk   = maraxis->GetAxisData();
+                               maxPoints=axisVtk->GetPoints()->GetNumberOfPoints();
+                               for (jPoint=0; jPoint<maxPoints; jPoint++){     
+                                       axisVtk->GetPoints()->GetPoint(jPoint,point);
+                                       dx = pointBif[0]-point[0];
+                                       dy = pointBif[1]-point[1];
+                                       dz = pointBif[2]-point[2];
+                                       dist = sqrt( dx*dx + dy*dy + dz*dz );
+                                       if ((min==-1) || (dist<min)) {
+                                               min=dist;
+                                               vit[0] = dx;
+                                               vit[1] = dy;
+                                               vit[2] = dz;
+                                       } //if 
+                               } // for
+                       } // if maraxis!=NULL
+               } // i!=actualAxis
+       } //for
+}
+
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::Execute(int count, int sens, double *vit, int cleanLevel)
+{
+       //------------Arbre Extraction --------------
+       // Call Maracas axis extraction
+       count--;
+/*
+time_t start,end;
+double dif;
+time (&start);
+*/
+               int idActualAxis_Before = _marExperiment->getNumberOfAxes();
+               _marExperiment->extractVascularTree( sens , vit, cleanLevel );
+/*
+time (&end);
+dif = difftime (end,start);
+FILE *ff;
+ff=fopen("c:/temp/MaracasTIME.txt","a+");
+fprintf(ff,"\n TreeExtraction_MH_JFC::Execute %d \n",count);
+fprintf(ff,"evt %.2lf \n",dif);
+fclose(ff);
+*/
+               int idActualAxis = _marExperiment->getNumberOfAxes();
+               // Bifurcation Detection JFC
+               marAxis *maraxis = _marExperiment->getAxis( );
+               if ((maraxis!=NULL) && (idActualAxis_Before!=idActualAxis)) {
+                       vtkImageData *imagedata                 = _marExperiment->getDynData( )->getVolume( )->castVtk();
+                       vtkPolyData  *inputAxisRadio    = maraxis->GetAxisData();
+
+                       if (count>0){
+/*
+time (&start);
+*/
+                               _prgov = carotidaBifurcacion::New();
+                               _prgov->SetMaxPropRadio(5);
+                               _prgov->SetHumbral(0.45);
+                               _prgov->SetMaxPropMasa(10);
+                               _prgov->SetMinPropMasa(0.01);
+                               _prgov->SetInput( inputAxisRadio );
+                               _prgov->SetInput2( imagedata );
+                               _prgov->Update();
+/*
+time (&end);
+dif = difftime (end,start);
+ff=fopen("c:/temp/MaracasTIME.txt","a+");
+fprintf(ff,"\tcB  %.2lf \n",dif);
+fclose(ff);
+*/
+                       }
+
+                       // Brule Volume
+                       BruleVolume(imagedata            , inputAxisRadio , 0                    );
+                       BruleVolume(_imagedataResult , inputAxisRadio , idActualAxis );
+                       inputAxisRadio->Delete();
+
+
+                       if (count>0){
+                               // LOOP for branch extraction
+                               vtkPolyData *bifurcations =  _prgov->GetOutput();
+                               int i,maxPoints = bifurcations->GetPoints()->GetNumberOfPoints();
+                               int x,y,z;
+                               double point[3], vit[3];
+                               for (i=0; i<maxPoints; i++){
+                                       bifurcations->GetPoints()->GetPoint(i,point);
+                                       x = (int)(point[0]);
+                                       y = (int)(point[1]);
+                                       z = (int)(point[2]);
+                                       FindVit( _marExperiment , idActualAxis , point , vit );
+                                       _marExperiment->setStartPoint( x , y , z );
+                                       //Branch extraction;
+                                       Execute(count, 0 , vit , (int)_cleanLevel );
+                               }
+                               bifurcations->Delete();
+//                             _prgov->Delete();
+//                             _prgov = NULL;
+                       } // of count>0
+
+               } // maraxi=NULL
+}
+
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::InitImagaDataResult(){
+       Reset();
+       vtkImageData *imagedata = _marExperiment->getDynData( )->getVolume( )->castVtk();
+       imagedata->Update();
+       _imagedataResult = vtkImageData::New();
+       int dim[3];
+       imagedata->GetDimensions(dim);
+       _imagedataResult->SetScalarType(imagedata->GetScalarType());
+
+       _imagedataResult->SetDimensions(dim[0],dim[1],dim[2]); 
+       _imagedataResult->SetExtent( 0 , dim[0]-1 , 0 , dim[1]-1 , 0 , dim[2]-1 ); 
+       _imagedataResult->SetWholeExtent(0 , dim[0]-1 , 0 , dim[1]-1 , 0 , dim[2]-1 );
+       _imagedataResult->SetSpacing( imagedata->GetSpacing()  ); 
+       _imagedataResult->SetOrigin( 0,0,0  ); 
+       _imagedataResult->Update();
+       _imagedataResult->UpdateData();
+       unsigned short *ptr;
+       int i,j,k;
+       for ( i=0 ; i<dim[0] ; i++ ){
+               for ( j=0 ; j<dim[1] ; j++ ){
+                       for ( k=0 ; k<dim[2] ; k++ ){
+                               ptr = (unsigned short *)        _imagedataResult->GetScalarPointer(i,j,k);
+                               *ptr = 0;
+                       }
+               }
+       }
+}
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::Update(){
+/*
+FILE *ff;
+ff=fopen("c:/temp/MaracasTIME.txt","w");
+fclose(ff);
+*/
+       InitImagaDataResult();
+       Execute(_branchLevel);
+}
+//-------------------------------------------------------------------
+marExperiment* TreeExtraction_MH_JFC::GetInput(){
+       return _marExperiment;
+}
+//-------------------------------------------------------------------
+vtkImageData* TreeExtraction_MH_JFC::GetVolume(){
+       return _imagedataResult;
+}
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::SetBranchLevel(int branchLevel){
+       _branchLevel = branchLevel;
+}
+//-------------------------------------------------------------------
+void TreeExtraction_MH_JFC::SetCleanTreeLevel( int cleanLevel ){
+       _cleanLevel = (double)cleanLevel;
+}
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxEmptyPanelWidget_2::wxEmptyPanelWidget_2(wxWindow *parent, marInterface* mar)
+: wxPanel( parent, -1) 
+{
+
+       _sensibility_JF         = 0.5;
+
+       _mar                                                            = mar;
+       wxBoxSizer                      *sizer                  = new wxBoxSizer(wxVERTICAL  );
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       wxPanel                         *viewPanel              = CreateViewPanel(pnlSplitter);
+       wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
+
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 150 );
+    pnlSplitter        -> SplitVertically( viewPanel, controlPanel, 600 );
+       this            -> SetSizer(sizer);
+
+       // Original Volume
+       _mCubes                         = NULL;
+       _surfMapper                     = NULL;
+       _surfActor                      = NULL;
+
+       // Result 1: Volume + Axis
+       _1_prgov                        = NULL;
+       _1_mapfinal                     = NULL;
+       _1_stripfinal           = NULL;
+       _1_isoMapperMC6         = NULL;
+       _1_isoActorMC6          = NULL;
+       _1_isoMC6                       = NULL;
+
+       // Result 2: Volume + Axis
+       _2_prgov                        = NULL;
+       _2_mapfinal                     = NULL;
+       _2_stripfinal           = NULL;
+       _2_isoMapperMC6         = NULL;
+       _2_isoActorMC6          = NULL;
+       _2_isoMC6                       = NULL;
+
+       //
+       _isoMapperMC1           = NULL;
+       _isoActorMC1            = NULL;
+       _isoMC1                         = NULL;
+       _imageThresholdMC1      = NULL;
+
+       //
+       _treeExtraction         = NULL; 
+
+}
+//-------------------------------------------------------------------
+wxEmptyPanelWidget_2::~wxEmptyPanelWidget_2(){
+       // Erase Original Volule
+       if (_mCubes                     ) { _mCubes                     -> Delete(); }
+       if (_surfMapper         ) {     _surfMapper             -> Delete(); }
+       if (_surfActor          ) {     _surfActor              -> Delete(); }
+
+       // Erase result: Volume + Axis
+       ResetTree1_JF();
+       ResetTree2_JF();
+       ResetTree_MH_JFC();
+}
+//-------------------------------------------------------------------
+wxPanel* wxEmptyPanelWidget_2::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+       _maracasSurfaceWidget = new wxSurfaceWidget(panel);
+       sizer->Add(_maracasSurfaceWidget        , 1, wxEXPAND, 0);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxEmptyPanelWidget_2::CreateControlPanel(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+       _opacity_OrigVol        = new wxSlider( panel, -1, 30, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _isoValue                       = new wxSlider( panel, -1, 0 , 0, 3000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _opacity_Res1VolJF      = new wxSlider( panel, -1, 25, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _opacity_Res2VolJF      = new wxSlider( panel, -1, 25, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_sensibility_JF      = new wxSlider( panel, -1, 0 , 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _branchLevel            = new wxSlider( panel, -1, 2 , 1, 10  , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _opacity_ResVolMHJF     = new wxSlider( panel, -1, 25, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _isoValue_MH_JFC        = new wxSlider( panel, -1, 0 , 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _cleanTree_MH_JFC       = new wxSlider( panel, -1, 400 , 0, 1000 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+
+       int tmp_sensibility= (int)(_sensibility_JF*100.0);
+       _sl_sensibility_JF->SetValue( tmp_sensibility );
+
+
+       _opacity_OrigVol        ->SetSize(250,20);   // Original Volume
+       _isoValue                       ->SetSize(250,20);
+       _opacity_Res1VolJF      ->SetSize(250,20);  // Result 1 Volume JF
+       _opacity_Res2VolJF      ->SetSize(250,20);  // Result 2 Volume JF
+       _branchLevel            ->SetSize(250,20);
+       _opacity_ResVolMHJF     ->SetSize(250,20);  // Result Volume MH+JFC
+
+       //Extract Tree 1 JF
+       wxButton *btnExtractTree1_JF    = new wxButton(panel,-1,_T("Extract Tree 1 JF"));
+       wxButton *btnEraseTree1_JF              = new wxButton(panel,-1,_T("Erase Tree 1 JF"));
+
+       //Extract Tree 2 JF
+       wxButton *btnExtractTree2_JF    = new wxButton(panel,-1,_T("Extract Tree 2 JF"));
+       wxButton *btnEraseTree2_JF              = new wxButton(panel,-1,_T("Erase Tree 2 JF"));
+
+       //Extract Tree MH + JF
+       wxButton *btnExtractTree_MH_JFC = new wxButton(panel,-1,_T("Extract Tree MH + JFC"));
+       wxButton *btnEraseTree_MH_JFC   = new wxButton(panel,-1,_T("Erase Tree MH + JFC"));
+
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Isovalue - Original Volume")));        
+       sizer->Add(_isoValue);
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Original Volume")));
+       sizer->Add(_opacity_OrigVol);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  - - -  Juan Francisco Module 1 - - - ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(btnExtractTree1_JF);
+       sizer->Add(btnEraseTree1_JF);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Result Volume")));
+       sizer->Add(_opacity_Res1VolJF);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  - - -  Juan Francisco Module 2 - - - ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T(" % Sensibility")));
+       sizer->Add(_sl_sensibility_JF);
+       sizer->Add(btnExtractTree2_JF);
+       sizer->Add(btnEraseTree2_JF);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Result Volume")));
+       sizer->Add(_opacity_Res2VolJF);
+
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  - - -  MH + JFC  - - - ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(btnExtractTree_MH_JFC);
+       sizer->Add(btnEraseTree_MH_JFC);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Branch Level MH+JFC")));
+       sizer->Add(_branchLevel);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Result Volume MH+JFC")));
+       sizer->Add(_opacity_ResVolMHJF);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("IsoValue - Result Volume MH+JFC")));
+       sizer->Add(_isoValue_MH_JFC);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("signal level (Clean Tree)")));
+       sizer->Add(_cleanTree_MH_JFC);
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       Connect(_opacity_OrigVol->GetId()               , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnOpacity_OrigVol              ); 
+       Connect(_isoValue->GetId()                              , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnIsoValue                             ); 
+       Connect(_opacity_Res1VolJF->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnOpacity_Res1VolJF    ); 
+       Connect(_opacity_Res2VolJF->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnOpacity_Res2VolJF    ); 
+       Connect(_sl_sensibility_JF->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnSensibility                  ); 
+
+       Connect(btnExtractTree1_JF->GetId()             , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBtnExtractTree1_JF   ); 
+       Connect(btnEraseTree1_JF->GetId()               , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBtnEraseTree1_JF     ); 
+       Connect(btnExtractTree2_JF->GetId()             , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBtnExtractTree2_JF   ); 
+       Connect(btnEraseTree2_JF->GetId()               , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBtnEraseTree2_JF     ); 
+
+       Connect(btnExtractTree_MH_JFC->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBtnExtractTree_MH_JFC);      
+       Connect(btnEraseTree_MH_JFC->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBtnEraseTree_MH_JFC  );      
+       Connect(_branchLevel->GetId()                   , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnBranchLevel                  ); 
+       Connect(_opacity_ResVolMHJF->GetId()    , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnOpacity_ResVolMHJF   ); 
+       Connect(_isoValue_MH_JFC->GetId()               , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnIsoValue_MH_JFC              ); 
+       Connect(_cleanTree_MH_JFC->GetId()              , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxEmptyPanelWidget_2::OnCleanTree_MH_JFC             ); 
+
+       return panel;
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::Refresh()
+{
+       _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->Render();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::ConfigureVTK()
+{
+    wxBusyCursor wait;
+//     _imageviewer3D->Configure();
+       vtkImageData    *imagedata              = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       double                  opacity_OrigVol = ((double)(_opacity_OrigVol->GetValue()))/100;
+       double                  isoValue; 
+
+       // Visualisation - original volume
+    double range[2];
+    imagedata->GetScalarRange( range );
+       isoValue=range[1] / 8;
+
+    _mCubes = vtkMarchingCubes::New( );
+    _mCubes->SetInput( imagedata );
+    _mCubes->SetValue( 0, isoValue );
+
+    vtkStripper *stripper = vtkStripper::New();
+    stripper->SetInput( _mCubes->GetOutput( ) );
+
+    _surfMapper = vtkPolyDataMapper::New( );
+       _surfMapper->SetInput( stripper->GetOutput() );
+    _surfMapper->ScalarVisibilityOff( );
+    stripper->Delete();
+
+    _surfActor = vtkActor::New( );
+    _surfActor->SetMapper( _surfMapper );
+    _surfActor->PickableOff( );
+    _surfActor->GetProperty( )->SetColor( 0, 0, 0.8 );
+    _surfActor->GetProperty( )->SetOpacity( opacity_OrigVol );
+
+       // Update Controls
+       _isoValue->SetRange( (int)(range[0]), (int)(range[1]) );
+       _isoValue->SetValue( (int)isoValue );
+       
+       // Interface Update
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       ren->AddActor(_surfActor);
+
+       //-Maracas-
+       _maracasSurfaceWidget->ShowMARACASData( _mar );
+}
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::ResetTree1_JF()
+{
+       // Remove 
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+    if (_1_isoActorMC6){
+               ren->RemoveActor(_1_isoActorMC6);
+       }
+    if (_1_stripfinal){
+               ren->RemoveActor(_1_stripfinal);
+       }
+
+       // Delete 
+       if (_1_prgov            ) {     _1_prgov                -> Delete(); }
+       if (_1_mapfinal         ) {     _1_mapfinal             -> Delete(); }
+       if (_1_stripfinal       ) {     _1_stripfinal   -> Delete(); }
+       if (_1_isoMapperMC6     ) {     _1_isoMapperMC6 -> Delete(); }
+       if (_1_isoActorMC6      ) {     _1_isoActorMC6  -> Delete(); }
+       if (_1_isoMC6           ) {     _1_isoMC6               -> Delete(); }
+
+       // Init
+       _1_prgov                = NULL;
+       _1_mapfinal             = NULL;
+       _1_stripfinal   = NULL;
+       _1_isoMapperMC6 = NULL;
+       _1_isoActorMC6  = NULL;
+       _1_isoMC6               = NULL;
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::ResetTree2_JF()
+{
+       // Remove 
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+    if (_2_isoActorMC6){
+               ren->RemoveActor(_2_isoActorMC6);
+       }
+    if (_2_stripfinal){
+               ren->RemoveActor(_2_stripfinal);
+       }
+
+       // Delete 
+       if (_2_prgov            ) {     _2_prgov                -> Delete(); }
+       if (_2_mapfinal         ) {     _2_mapfinal             -> Delete(); }
+       if (_2_stripfinal       ) {     _2_stripfinal   -> Delete(); }
+       if (_2_isoMapperMC6     ) {     _2_isoMapperMC6 -> Delete(); }
+       if (_2_isoActorMC6      ) {     _2_isoActorMC6  -> Delete(); }
+       if (_2_isoMC6           ) {     _2_isoMC6               -> Delete(); }
+
+       // Init
+       _2_prgov                = NULL;
+       _2_mapfinal             = NULL;
+       _2_stripfinal   = NULL;
+       _2_isoMapperMC6 = NULL;
+       _2_isoActorMC6  = NULL;
+       _2_isoMC6               = NULL;
+}
+
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::ExtractTree1_JF(int x, int y, int z)
+{
+       double opacity_Res1VolJF = ((double)_opacity_Res1VolJF->GetValue())/100;
+       vtkImageData *imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+
+       double  puntoactualprov[3];
+       double  espprin[3];
+       int             extprin[6];                             
+
+       puntoactualprov[0]=x;
+       puntoactualprov[1]=y;
+       puntoactualprov[2]=z;
+       
+       imagedata->GetSpacing(espprin);
+       imagedata->GetExtent(extprin);
+
+       puntoactualprov[0]=puntoactualprov[0]*espprin[0];
+       puntoactualprov[1]=puntoactualprov[1]*espprin[1];
+       puntoactualprov[2]=puntoactualprov[2]*espprin[2];
+       
+       // Juan Francisco Carrillo Filter 
+       _1_prgov= axisExtractor::New();
+       _1_prgov->SetHumbral(0.45);
+       _1_prgov->SetInput(imagedata);
+       _1_prgov->SetPoint(puntoactualprov);
+       _1_prgov->Update();
+
+       // Visualisation - result vascular tree
+       _1_mapfinal = vtkPolyDataMapper::New();
+       _1_mapfinal->SetInput(_1_prgov->GetOutput());
+
+       _1_stripfinal = vtkActor::New();
+       _1_stripfinal->SetMapper(_1_mapfinal);
+       _1_stripfinal->GetProperty()->SetColor(1, 1, 1);
+       _1_stripfinal->GetProperty()->SetLineWidth(2);
+       _1_stripfinal->GetProperty()->BackfaceCullingOff();
+
+       // Visualisation - result volume
+       vtkImageData *imageOut = _1_prgov->GetVolumen();
+       imageOut->Update();
+
+    _1_isoMC6 = vtkMarchingCubes::New();
+    _1_isoMC6->SetInput(imageOut);
+    _1_isoMC6->SetValue(0, 1);
+       _1_isoMC6->Update();
+
+       _1_isoMapperMC6 = vtkPolyDataMapper::New();
+    _1_isoMapperMC6->SetInput(_1_isoMC6->GetOutput());
+    _1_isoMapperMC6->ScalarVisibilityOff();
+    _1_isoMapperMC6->ImmediateModeRenderingOn();
+
+       _1_isoActorMC6 = vtkActor::New();
+    _1_isoActorMC6->SetMapper(_1_isoMapperMC6);
+    _1_isoActorMC6->GetProperty()->SetColor( 0, 1, 0);
+    _1_isoActorMC6->GetProperty()->SetOpacity( opacity_Res1VolJF );
+   
+       // Interface Update
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       ren->AddActor(_1_isoActorMC6);
+       ren->AddActor(_1_stripfinal);
+}
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::ExtractTree2_JF(int x, int y, int z)
+{
+       double opacity_Res2VolJF = ((double)_opacity_Res2VolJF->GetValue())/100;
+       vtkImageData *imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+
+       double  puntoactualprov[3];
+       double  espprin[3];
+       int             extprin[6];                             
+
+       puntoactualprov[0]=x;
+       puntoactualprov[1]=y;
+       puntoactualprov[2]=z;
+       
+       imagedata->GetSpacing(espprin);
+       imagedata->GetExtent(extprin);
+
+       puntoactualprov[0]=puntoactualprov[0]*espprin[0];
+       puntoactualprov[1]=puntoactualprov[1]*espprin[1];
+       puntoactualprov[2]=puntoactualprov[2]*espprin[2];
+       
+       _2_prgov= axisExtractor02::New();
+       _2_prgov->SetParam(1);
+       _2_prgov->SetParam2(1);
+       _2_prgov->SetParam3(_sensibility_JF);
+       _2_prgov->SetMaxant(20);
+       _2_prgov->SetMinant(5);
+       _2_prgov->SetInput(imagedata);
+       _2_prgov->SetPoint(puntoactualprov);
+       _2_prgov->Update();
+
+       // Visualisation - result vascular tree
+       _2_mapfinal = vtkPolyDataMapper::New();
+       _2_mapfinal->SetInput(_2_prgov->GetOutput());
+
+       _2_stripfinal = vtkActor::New();
+       _2_stripfinal->SetMapper(_2_mapfinal);
+       _2_stripfinal->GetProperty()->SetColor(0.3, 0.3, 0.3);
+       _2_stripfinal->GetProperty()->SetLineWidth(2);
+       _2_stripfinal->GetProperty()->BackfaceCullingOff();
+
+       // Visualisation - result volume
+       vtkImageData *imageOut = _2_prgov->GetVolumen();
+       imageOut->Update();
+
+    _2_isoMC6 = vtkMarchingCubes::New();
+    _2_isoMC6->SetInput(imageOut);
+    _2_isoMC6->SetValue(0, 1);
+       _2_isoMC6->Update();
+
+       _2_isoMapperMC6 = vtkPolyDataMapper::New();
+    _2_isoMapperMC6->SetInput(_2_isoMC6->GetOutput());
+    _2_isoMapperMC6->ScalarVisibilityOff();
+    _2_isoMapperMC6->ImmediateModeRenderingOn();
+
+       _2_isoActorMC6 = vtkActor::New();
+    _2_isoActorMC6->SetMapper(_2_isoMapperMC6);
+    _2_isoActorMC6->GetProperty()->SetColor( 1, 1, 0);
+    _2_isoActorMC6->GetProperty()->SetOpacity( opacity_Res2VolJF );
+    
+       // Interface Update
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       ren->AddActor(_2_isoActorMC6);
+       ren->AddActor(_2_stripfinal);
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnOpacity_OrigVol(wxScrollEvent& event)
+{
+       double value = ((double)_opacity_OrigVol->GetValue())/100;
+    _surfActor->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnOpacity_Res1VolJF(wxScrollEvent& event)
+{
+       if (_1_isoActorMC6!=NULL){
+               double value = ((double)_opacity_Res1VolJF->GetValue())/100;
+               _1_isoActorMC6->GetProperty( )->SetOpacity( value );
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnOpacity_Res2VolJF(wxScrollEvent& event)
+{
+       if (_2_isoActorMC6!=NULL){
+               double value = ((double)_opacity_Res2VolJF->GetValue())/100;
+               _2_isoActorMC6->GetProperty( )->SetOpacity( value );
+               Refresh();
+       }
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnIsoValue(wxScrollEvent& event)
+{
+    wxBusyCursor wait;
+       _mCubes->SetValue(0, _isoValue->GetValue());
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBtnExtractTree1_JF(wxCommandEvent& event)
+{
+       if (_1_prgov==NULL){
+               wxBusyCursor wait;
+               vtk3DSurfaceWidget *world3D = _maracasSurfaceWidget->GetVtk3DSurfaceWidget();
+               if( world3D->GetInitialSphere() ){
+                       double point[3];
+                       world3D->GetSphereCenter( point );
+                       ExtractTree1_JF((int)point[0],(int)point[1],(int)point[2]);
+               }
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBtnExtractTree2_JF(wxCommandEvent& event)
+{
+       if (_2_prgov==NULL){
+               wxBusyCursor wait;
+               vtk3DSurfaceWidget *world3D = _maracasSurfaceWidget->GetVtk3DSurfaceWidget();
+               if( world3D->GetInitialSphere() ){
+                       double point[3];
+                       world3D->GetSphereCenter( point );
+                       ExtractTree2_JF((int)point[0],(int)point[1],(int)point[2]);
+               }
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBtnEraseTree1_JF(wxCommandEvent& event)
+{
+       ResetTree1_JF();
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBtnEraseTree2_JF(wxCommandEvent& event)
+{
+       ResetTree2_JF();
+       Refresh();
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::PaintVascularTree_MH_JFC(marExperiment * newExperiment)
+{
+       vtkActor                        *branchActor;
+       vtkPolyData                     *axisVtk;
+       vtkPolyDataMapper       *branchMapper;
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+
+       int i,maxAxis=newExperiment->getNumberOfAxes();
+       for (i=0;i<maxAxis;i++){
+               newExperiment->setAxis(i);
+               marAxis *maraxis =newExperiment->getAxis( );
+               if (maraxis!=NULL) {
+                       axisVtk = maraxis->Draw();
+                       branchMapper = vtkPolyDataMapper::New( );
+                       branchMapper->SetInput( axisVtk );
+                       branchMapper->Update();
+                       branchActor = vtkActor::New( );
+                       branchActor->SetMapper( branchMapper );
+                       branchActor->GetProperty()->SetColor( 1, 1, 1 );
+                       if (i== 0) { branchActor->GetProperty()->SetColor( 0  , 0       , 0.3 ); }
+                       if (i== 1) { branchActor->GetProperty()->SetColor( 0  , 0.3     , 0.3 ); }
+                       if (i== 2) { branchActor->GetProperty()->SetColor( 0.3, 0.3     , 0.3 ); }
+                       if (i== 3) { branchActor->GetProperty()->SetColor( 0.0, 0.0     , 0.6 ); }
+                       if (i== 4) { branchActor->GetProperty()->SetColor( 0.0, 0.6     , 0.6 ); }
+                       if (i== 5) { branchActor->GetProperty()->SetColor( 0.6, 0.6     , 0.6 ); }
+                       if (i== 7) { branchActor->GetProperty()->SetColor( 0.0, 0.0     , 0.9 ); }
+                       if (i== 8) { branchActor->GetProperty()->SetColor( 0.0, 0.9     , 0.9 ); }
+                       if (i== 9) { branchActor->GetProperty()->SetColor( 0.9, 0.9     , 0.9 ); }
+                       if (i==10) { branchActor->GetProperty()->SetColor( 0.9, 0.0     , 0.0 ); }
+                       if (i==11) { branchActor->GetProperty()->SetColor( 0.6, 0.0     , 0.0 ); }
+                       if (i==12) { branchActor->GetProperty()->SetColor( 0.3, 0.0     , 0.0 ); }
+                       if (i==13) { branchActor->GetProperty()->SetColor( 0.6, 0.6     , 0.0 ); }
+                       if (i==14) { branchActor->GetProperty()->SetColor( 0.3, 0.3     , 0.0 ); }
+                       if (i==15) { branchActor->GetProperty()->SetColor( 0.9, 0.9     , 0.0 ); }
+                       branchActor->GetProperty()->SetLineWidth( 2.0 );
+                       ren->AddActor( branchActor );
+
+                       _lstAxisVtk.push_back( axisVtk );
+                       _lstBranchActor.push_back( branchActor );
+                       _lstBranchMapper.push_back( branchMapper );
+               }
+       }
+}
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::PaintVascularVolume_MH_JFC(vtkImageData * image)
+{
+
+       // Visualisation - result volume
+       image->Update();
+
+       _imageThresholdMC1=vtkImageThreshold::New();
+       _imageThresholdMC1->SetInput(image);
+       _imageThresholdMC1->ThresholdBetween(0,100);
+       _imageThresholdMC1->SetOutValue  (  0   ); 
+       _imageThresholdMC1->Update();
+
+    _isoMC1 = vtkMarchingCubes::New();
+    _isoMC1->SetInput(_imageThresholdMC1->GetOutput()  );
+    _isoMC1->SetValue(0, 1);
+       _isoMC1->Update();
+
+       _isoMapperMC1 = vtkPolyDataMapper::New();
+    _isoMapperMC1->SetInput(_isoMC1->GetOutput());
+    _isoMapperMC1->ScalarVisibilityOff();
+    _isoMapperMC1->ImmediateModeRenderingOn();
+       _isoMapperMC1->Update();
+
+       _isoActorMC1 = vtkActor::New();
+    _isoActorMC1->SetMapper(_isoMapperMC1);
+    _isoActorMC1->GetProperty()->SetColor( 1, 0, 0);
+    _isoActorMC1->GetProperty()->SetOpacity( 0.4 );
+
+       // Interface Update
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       ren->AddActor(_isoActorMC1);
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::WriteSignals(marExperiment *newExperiment){
+       int             i               =       0;
+       int             j               =       0;
+       bool    ok              =       true;
+       int             value   =       0;
+       int             maxAxis =       newExperiment->getNumberOfAxes();
+
+       FILE *ff;
+       ff=fopen("c:/Temp/MaracasTEMP.TXT", "w");
+
+       while (ok==true){
+               ok=false;
+               for (i=0;i<maxAxis;i++){
+                       newExperiment->setAxis(i);
+                       marAxis *maraxis =newExperiment->getAxis( );
+                       if (maraxis!=NULL) {
+                               if ( j < maraxis->getNumberOfControlPoints()  ){
+                                       ok=true;
+                                       value= (int) (maraxis->getSignal((uint)j) );
+                                       fprintf(ff,"%d\t", value );
+                               } else {
+                                       fprintf(ff,"\t");
+                               }
+                       }
+               }
+               fprintf(ff,"\n" );
+               j++;
+       }
+       fclose(ff);
+
+}
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBtnExtractTree_MH_JFC(wxCommandEvent& event)
+{
+  if ((_lstBranchActor.size()==0) 
+         && 
+         (_maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetInitialSphere() ) )
+  {
+   wxBusyCursor wait;
+
+       // Copie Volume
+       int voiA[6];
+       int voiB[6];
+       _mar->_experiment->getVOI(voiA);
+       voiB[0]=0;
+       voiB[1]=voiA[1]-voiA[0];
+       voiB[2]=0;
+       voiB[3]=voiA[3]-voiA[2];
+       voiB[4]=0;
+       voiB[5]=voiA[5]-voiA[4];
+       marExperiment *newExperiment = new marExperiment( _mar->_experiment->getParameters() );
+       newExperiment->setVOI( voiB );
+       newExperiment->initExperiment( _mar->_experiment->getDynData( )->getVolume() );
+       
+       double  point[3];
+       int             extent[ 6 ];
+    _mar->_experiment->getDynData( )->getVolume( )->castVtk()->GetExtent( extent );
+    _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetSphereCenter( point );
+       int x = (int)point[0] - extent[0];
+       int y = (int)point[1] - extent[2];
+       int z = (int)point[2] - extent[4];
+       newExperiment->setStartPoint( x, y, z);
+
+       // Vascular tree extraction
+       _treeExtraction = TreeExtraction_MH_JFC::New();
+       _treeExtraction->SetInput(newExperiment);
+       _treeExtraction->SetCleanTreeLevel( _cleanTree_MH_JFC->GetValue() );
+       _treeExtraction->SetBranchLevel( _branchLevel->GetValue() );
+       _treeExtraction->Update();
+
+       //Paint Vascular Tree
+       PaintVascularTree_MH_JFC(newExperiment);
+       //Paint Vascular Volume
+       PaintVascularVolume_MH_JFC( _treeExtraction->GetVolume() );
+       Refresh( );
+
+       WriteSignals(newExperiment);
+
+       // Clening memory
+       delete newExperiment;
+  }
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBtnEraseTree_MH_JFC(wxCommandEvent& event)
+{
+       ResetTree_MH_JFC();
+       Refresh();
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::ResetTree_MH_JFC()
+{      
+       // Remove
+       vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       int i,size;
+       size=_lstAxisVtk.size();
+       size=_lstBranchMapper.size();
+       size=_lstBranchActor.size();
+       for (i=0;i<size;i++){
+               if (_lstBranchActor[i]!=NULL){
+                       ren->RemoveActor( _lstBranchActor[i] );
+               }
+       }
+       for (i=0;i<size;i++){
+       // Delete
+               if (_lstAxisVtk[i]              != NULL ) {     _lstAxisVtk[i]          -> Delete();    }
+//             if (_lstBranchMapper[i] != NULL ) {     _lstBranchMapper[i] -> Delete();        }
+               if (_lstBranchActor[i]  != NULL ) {     _lstBranchActor[i]      -> Delete();    }
+       // Init
+               _lstAxisVtk[i]          = NULL;
+               _lstBranchActor[i]      = NULL;
+               _lstBranchMapper[i]     = NULL;
+       }
+       _lstAxisVtk.clear();
+       _lstBranchActor.clear();
+       _lstBranchMapper.clear();
+
+       // Remove 
+    if (_isoActorMC1){
+               ren->RemoveActor(_isoActorMC1);
+       }
+
+       // Delete 
+       if (_isoMapperMC1               ) {     _isoMapperMC1           -> Delete(); }
+       if (_isoActorMC1                ) {     _isoActorMC1            -> Delete(); }
+       if (_isoMC1                             ) {     _isoMC1                         -> Delete(); }
+       if (_imageThresholdMC1  ) {     _imageThresholdMC1      -> Delete(); }
+
+
+       // Init
+       _isoMapperMC1           = NULL;
+       _isoActorMC1            = NULL;
+       _isoMC1                         = NULL;
+       _imageThresholdMC1      = NULL;
+
+       //
+//     if (_treeExtraction     ) {     _treeExtraction -> Delete(); }     // EED
+//     _treeExtraction=NULL; 
+
+}
+
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnOpacity_ResVolMHJF(wxScrollEvent& event)
+{
+       if (_isoActorMC1!=NULL){
+               double value = ((double)_opacity_ResVolMHJF->GetValue())/100;
+               _isoActorMC1->GetProperty( )->SetOpacity( value );
+       }
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnBranchLevel(wxScrollEvent& event)
+{
+       //
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnIsoValue_MH_JFC(wxScrollEvent& event)
+{
+       if (_imageThresholdMC1!=NULL){
+               wxBusyCursor wait;
+               double threshold = _isoValue_MH_JFC->GetValue();
+               if (threshold!=0){
+                       _imageThresholdMC1->ThresholdBetween(threshold, threshold );
+               } else {
+                       _imageThresholdMC1->ThresholdBetween(0, 1000 );
+               }
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnCleanTree_MH_JFC(wxScrollEvent& event)
+{
+//
+}
+//------------------------------------------------------------------------
+void wxEmptyPanelWidget_2::OnSensibility(wxScrollEvent& event)
+{
+       _sensibility_JF = (double)(_sl_sensibility_JF->GetValue())/100;
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget_2.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanelWidget_2.h
new file mode 100644 (file)
index 0000000..831a951
--- /dev/null
@@ -0,0 +1,149 @@
+
+#ifndef EMPTY_PANEL_WIDGET_2_H
+#define EMPTY_PANEL_WIDGET_2_H
+
+#include <vector>
+
+#include <vtkImageData.h>
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataMapper.h>
+
+#include "wxVTKRenderWindowInteractor.h"
+#include "wxSurfaceWidget.h"
+#include "wxVtkBaseView.h"
+#include <kernel/marInterface.h>
+#include <kernel/axisExtractor.h>
+#include <kernel/axisExtractor02.h>
+#include <kernel/carotidaBifurcacion.h>
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class  TreeExtraction_MH_JFC : public vtkObject
+{
+public:
+       static TreeExtraction_MH_JFC *New();
+       virtual void SetInput(marExperiment *input);
+       void SetBranchLevel(int branchLevel);
+       marExperiment *GetInput();
+       vtkImageData  *GetVolume();
+       void Update();
+       void SetCleanTreeLevel( int cleanLevel );
+  
+protected:  
+       TreeExtraction_MH_JFC();        
+       ~TreeExtraction_MH_JFC();
+       void Execute( int count , int sens=1 , double *vit=NULL , int cleanLevel=0);
+
+private:
+       double                                  _cleanLevel;
+       int                                             _branchLevel;
+       carotidaBifurcacion             *_prgov;
+       vtkImageData                    *_imagedataResult;
+       marExperiment                   *_marExperiment;
+       void Reset();
+       void InitImagaDataResult();
+       void BruleVolume( vtkImageData *imagedata, int x,int y,int z,int r,int value );
+       void BruleVolume( vtkImageData *imagedata, vtkPolyData *inputAxisRadio,int value );
+       void FindVit( marExperiment *newExperiment , int actualAxis , double *pointBif , double *vit );
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxEmptyPanelWidget_2: public wxPanel{
+public:
+       wxEmptyPanelWidget_2(wxWindow *parentmar,marInterface *mar);
+       ~wxEmptyPanelWidget_2();
+       void ConfigureVTK();
+       void Refresh();
+       void OnOpacity_OrigVol(wxScrollEvent& event);           // Original Volume
+       void OnOpacity_Res1VolJF(wxScrollEvent& event);         // Result 1 Volume JF
+       void OnOpacity_Res2VolJF(wxScrollEvent& event);         // Result 2 Volume JF
+       void OnIsoValue(wxScrollEvent& event);
+       void OnBtnExtractTree1_JF(wxCommandEvent& event);
+       void OnBtnExtractTree2_JF(wxCommandEvent& event);
+       void OnBtnEraseTree1_JF(wxCommandEvent& event);
+       void OnBtnEraseTree2_JF(wxCommandEvent& event);
+       void OnBtnExtractTree_MH_JFC(wxCommandEvent& event);
+       void OnBtnEraseTree_MH_JFC(wxCommandEvent& event);
+       void OnOpacity_ResVolMHJF(wxScrollEvent& event);        // Result Volume MH+JFC
+       void OnBranchLevel(wxScrollEvent& event);                       // MH+JFC
+       void OnIsoValue_MH_JFC(wxScrollEvent& event);
+       void OnCleanTree_MH_JFC(wxScrollEvent& event);
+       void OnSensibility(wxScrollEvent& event);
+
+private:
+
+       TreeExtraction_MH_JFC *_treeExtraction;
+
+       // Original Volume
+       vtkMarchingCubes        *_mCubes;
+       vtkPolyDataMapper       *_surfMapper;
+       vtkActor                        *_surfActor;
+
+       // Result 1 volume + Axis   
+       axisExtractor           *_1_prgov;
+       vtkPolyDataMapper       *_1_mapfinal;
+       vtkActor                        *_1_stripfinal;
+       vtkPolyDataMapper       *_1_isoMapperMC6;
+       vtkActor                        *_1_isoActorMC6;
+       vtkMarchingCubes        *_1_isoMC6;
+
+       // Result 2 volume + Axis   
+       axisExtractor02         *_2_prgov;
+       vtkPolyDataMapper       *_2_mapfinal;
+       vtkActor                        *_2_stripfinal;
+       vtkPolyDataMapper       *_2_isoMapperMC6;
+       vtkActor                        *_2_isoActorMC6;
+       vtkMarchingCubes        *_2_isoMC6;
+       double                          _sensibility_JF;
+
+
+       //      Result tree MH_JFC
+       vtkPolyDataMapper       *_isoMapperMC1;
+       vtkActor                        *_isoActorMC1;
+       vtkMarchingCubes        *_isoMC1;
+       vtkImageThreshold       *_imageThresholdMC1;
+
+       std::vector< vtkActor* >                        _lstBranchActor;
+       std::vector< vtkPolyData* >                     _lstAxisVtk;
+       std::vector< vtkPolyDataMapper* >       _lstBranchMapper;
+
+       wxSlider                        *_opacity_OrigVol;
+       wxSlider                        *_opacity_Res1VolJF;
+       wxSlider                        *_opacity_Res2VolJF;
+       wxSlider                        *_sl_sensibility_JF;
+       wxSlider                        *_isoValue;
+       wxSlider                        *_branchLevel;
+       wxSlider                        *_opacity_ResVolMHJF;
+       wxSlider                        *_isoValue_MH_JFC;
+       wxSlider                        *_cleanTree_MH_JFC;
+       
+       wxVtk3DBaseView         *_imageviewer3D;
+       wxPanel                         *CreateControlPanel(wxWindow *parent);
+       wxPanel                         *CreateViewPanel(wxWindow *parent);
+
+       //Maracas
+       marInterface            *_mar;
+       wxSurfaceWidget         *_maracasSurfaceWidget;
+
+       void ResetTree1_JF();
+       void ResetTree2_JF();
+       void ExtractTree1_JF(int x, int y, int z);
+       void ExtractTree2_JF(int x, int y, int z);
+
+       void ResetTree_MH_JFC();
+       void PaintVascularTree_MH_JFC(marExperiment * newExperiment);
+       void PaintVascularVolume_MH_JFC(vtkImageData * image);
+       void WriteSignals(marExperiment *newExperiment);
+};
+
+#endif // EMPTY_PANEL_WIDGET_2_H
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanel_3_Widget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanel_3_Widget.cxx
new file mode 100644 (file)
index 0000000..3c03db8
--- /dev/null
@@ -0,0 +1,283 @@
+
+
+
+//EED 29Dic2006 Borrame prueba mara Michael
+
+#include <vtkMetaImageReader.h>
+#include <vtkMetaImageWriter.h>
+#include <vtkPlaneSource.h>
+#include <vtkProbeFilter.h>
+#include <vtkDataSet.h>
+#include <vtkStructuredPoints.h>
+#include <vtkPointData.h>
+#include <vtkImageResample.h>
+#include <vtkJPEGWriter.h>
+#include <vtkBMPWriter.h>
+
+
+#include "vtkActor.h"
+#include "vtkSphereSource.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkImageData.h"
+#include "vtkImageCast.h"
+
+#include "wxEmptyPanel_3_Widget.h"
+
+
+
+#include <wx/splitter.h>
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+BEGIN_EVENT_TABLE( wxEmptyPanel_3_Widget, wxPanel )
+       EVT_MENU( 12121, wxEmptyPanel_3_Widget::OnRefreshView )
+END_EVENT_TABLE( );
+//-------------------------------------------------------------------
+wxEmptyPanel_3_Widget::wxEmptyPanel_3_Widget(wxWindow *parent)
+: wxPanel( parent, -1) 
+{
+       wxBoxSizer                      *sizer                  = new wxBoxSizer(wxVERTICAL  );
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       wxPanel                         *viewPanel              = CreateViewPanel(pnlSplitter);
+       wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
+
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 50 );
+    pnlSplitter        -> SplitVertically( viewPanel, controlPanel );
+       this            -> SetSizer(sizer);
+//EEDxx2.4
+//     FitInside();
+}
+//-------------------------------------------------------------------
+wxEmptyPanel_3_Widget::~wxEmptyPanel_3_Widget(){
+       delete _imageviewer2D_1;
+}
+//-------------------------------------------------------------------
+wxPanel* wxEmptyPanel_3_Widget::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+
+       _imageviewer2D_1        = new wxVtk2DBaseView(panel);
+       wxVTKRenderWindowInteractor *iren   = _imageviewer2D_1->GetWxVTKRenderWindowInteractor();
+       sizer->Add(iren , 1, wxEXPAND, 0);
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxEmptyPanel_3_Widget::CreateControlPanel(wxWindow *parent)
+{
+       _parent=parent;
+       wxPanel *panel  = new wxPanel(parent,-1);
+
+       wxButton *btnContourA   = new wxButton( panel, -1, _T("Active Contour A"));
+       wxButton *btnContourB   = new wxButton( panel, -1, _T("Active Contour B"));
+       wxButton *btnContourAB  = new wxButton( panel, -1, _T("Active Contour AB"));
+
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(btnContourA);
+       sizer->Add(btnContourB);
+       sizer->Add(btnContourAB);
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       Connect(btnContourA->GetId()            , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanel_3_Widget::OnContourA  );
+       Connect(btnContourB->GetId()            , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanel_3_Widget::OnContourB  );
+       Connect(btnContourAB->GetId()           , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxEmptyPanel_3_Widget::OnContourAB );
+       return panel;
+}
+//------------------------------------------------------------------------
+void wxEmptyPanel_3_Widget::Refresh()
+{
+       _imageviewer2D_1->Refresh();
+}
+//----------------------------------------------------------------------------
+void wxEmptyPanel_3_Widget::OnRefreshView(wxCommandEvent & event)
+{
+       Refresh();
+}
+
+
+//------------------------------------------------------------------------
+
+void wxEmptyPanel_3_Widget::ConfigureVTK(marImageData *marimagedata)
+{
+    wxBusyCursor wait;
+       double spc[3];
+       
+       vtkImageData *vtkimagedata = marimagedata->GetImageData(); // image t=0
+       vtkimagedata->UpdateInformation();
+       vtkimagedata->SetUpdateExtent(vtkimagedata->GetWholeExtent());
+       vtkimagedata->Update();
+       _data = vtkimagedata;
+       _data->GetSpacing(spc);
+       _vtkbasedata_1 = new vtkBaseData();
+       _vtkbasedata_1->SetMarImageData(marimagedata);  
+       _imageviewer2D_1->SetVtkBaseData( _vtkbasedata_1 );
+       _imageviewer2D_1->Configure();
+
+//     vtkImageViewer2 *_imageViewer=_imageviewer2D_1->_imageViewer2XYZ->GetVtkImageViewer2();
+
+       // Contorno 1
+       _manContourControl_1    = new manualContourControler();
+       _mContourModel_1                = new manualContourModel();
+       _mViewContour_1                 = new manualViewContour();
+       _mViewContour_1->SetModel( _mContourModel_1 );
+       _mViewContour_1->SetWxVtkBaseView( _imageviewer2D_1 );
+       _mViewContour_1->SetRange( 2 );
+       _mViewContour_1->SetZ( 1000 );
+
+
+//EED 3 oct 2006
+       _mViewContour_1->SetSpacing(spc);
+
+
+//EED 3 oct 2006
+       _mViewContour_1->SetColorNormalContour(0, 0, 1);
+       _mViewContour_1->SetColorEditContour(0, 0.5, 0.5);
+
+
+       _manContourControl_1->SetModelView( _mContourModel_1 , _mViewContour_1 );
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
+       _manContourControl_1->CreateNewManualContour();
+       _manContourControl_1->SetActive(false);
+       _mViewContour_1->RefreshContour();
+
+       // Rectangulo
+       _manRoiControl  = new manualRoiControler();
+       _mContourModel  = new manualContourModel();
+       _mViewRoi               = new manualViewRoi();
+       _mViewRoi->SetModel( _mContourModel );
+       _mViewRoi->SetWxVtkBaseView( _imageviewer2D_1 );
+       _mViewRoi->SetRange( 2 );
+       _mViewRoi->SetZ( 1000 );
+
+//EED 3 oct 2006
+       _mViewRoi->SetSpacing(spc);
+
+       _manRoiControl->SetModelView( _mContourModel , _mViewRoi );
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manRoiControl );
+       _manRoiControl->CreateNewManualContour();
+       _manRoiControl->SetActive(true);
+       _mViewRoi->RefreshContour();
+
+       // Contorno 2
+       _manContourControl_2    = new manualContourControler();
+       _mContourModel_2                = new manualContourModel();
+       _mViewContour_2                 = new manualViewContour();
+       _mViewContour_2->SetModel( _mContourModel_2 );
+       _mViewContour_2->SetWxVtkBaseView( _imageviewer2D_1 );
+       _mViewContour_2->SetRange( 2 );
+       _mViewContour_2->SetZ( 1000 );
+
+//EED 3 oct 2006
+       _mViewContour_2->SetSpacing(spc);
+
+//EED 3 oct 2006
+       _mViewContour_2->SetColorNormalContour(1, 1, 1);
+       _mViewContour_2->SetColorEditContour(0.5, 0.5, 0.5);
+
+
+       _manContourControl_2->SetModelView( _mContourModel_2 , _mViewContour_2 );
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_2 );
+       _manContourControl_2->CreateNewManualContour();
+       _manContourControl_2->SetActive(false);
+       _mViewContour_2->RefreshContour();
+
+CreateNewPoint( 0,0);
+
+       Refresh();      
+}
+
+
+//----------------------------------------------------------------------------
+//eedx21
+void wxEmptyPanel_3_Widget::CreateNewPoint(double x, double y)
+{
+/*
+
+               vtkSphereSource* aSphere =vtkSphereSource::New();
+        aSphere->SetRadius(0.2);
+        aSphere->SetCenter(x,y,0.5);
+
+        point_mapped.push_back(vtkPolyDataMapper::New());
+        point_mapped.back()->ImmediateModeRenderingOn();
+        //point_mapped.back()->ScalarVisibilityOff( );
+        point_mapped.back()->SetInput(aSphere->GetOutput());
+
+        point_actor.push_back(vtkActor::New());
+        point_actor.back()->SetMapper(point_mapped.back());
+        point_actor.back()->GetProperty()->BackfaceCullingOff();
+        point_actor.back()->GetProperty()->SetColor(0, 1, 0);
+
+        point_actor.back()->ApplyProperties();
+
+        _wxvtkbaseview->GetRenderer()->AddActor(point_actor.back());
+        _wxvtkbaseview->GetRenWin()->Render();
+*/
+
+/*
+               vtkActor                        *spheresActor   = vtkActor::New( );
+        vtkSphereSource                *spheres                = vtkSphereSource::New( );
+        vtkPolyDataMapper      *spheresMapper  = vtkPolyDataMapper::New( );
+        spheresMapper  -> SetInput( spheres->GetOutput( ) );
+        spheresActor   -> SetMapper( spheresMapper );
+               _imageviewer2D_1 -> GetRenderer() -> AddActor( spheresActor );
+               spheres->SetCenter( x,y,0 );
+               spheres->SetRadius( 10 );
+*/
+
+        vtkSphereSource                *spheres                = vtkSphereSource::New( );
+               spheres->SetCenter( x,y,0 );
+               spheres->SetRadius( 5 );
+        vtkPolyDataMapper      *spheresMapper  = vtkPolyDataMapper::New( );
+               spheresMapper   ->ImmediateModeRenderingOn();
+        spheresMapper  -> SetInput( spheres->GetOutput( ) );
+        vtkActor                       *spheresActor   = vtkActor::New( );
+        spheresActor   -> SetMapper( spheresMapper );
+        spheresActor   ->GetProperty()->BackfaceCullingOff();
+        spheresActor   ->GetProperty()->SetColor(0, 1, 0);
+        spheresActor   ->ApplyProperties();
+               _imageviewer2D_1 -> GetRenderer() -> AddActor( spheresActor );
+
+
+}
+
+
+
+
+//------------------------------------------------------------------------
+void wxEmptyPanel_3_Widget::OnContourA(wxCommandEvent& event)
+{
+       _manRoiControl           -> SetActive(false);
+       _manContourControl_1 -> SetActive(true);
+       _manContourControl_2 -> SetActive(false);
+}
+//------------------------------------------------------------------------
+void wxEmptyPanel_3_Widget::OnContourB(wxCommandEvent& event)
+{
+       _manRoiControl           -> SetActive(false);
+       _manContourControl_1 -> SetActive(false);
+       _manContourControl_2 -> SetActive(true);
+}
+//------------------------------------------------------------------------
+void wxEmptyPanel_3_Widget::OnContourAB(wxCommandEvent& event)
+{
+       _manRoiControl           -> SetActive(false);
+       _manContourControl_1 -> SetActive(true);
+       _manContourControl_2 -> SetActive(true);
+}
+//------------------------------------------------------------------------
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanel_3_Widget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxEmptyPanel_3_Widget.h
new file mode 100644 (file)
index 0000000..e305fa2
--- /dev/null
@@ -0,0 +1,59 @@
+
+
+#ifndef __WX__EMPTY__PANEL__3__WIDGET
+#define __WX__EMPTY__PANEL__3__WIDGET
+
+
+
+#include <vtkImageData.h>
+#include "../manualContour.h"
+#include "wxMPRWidget.h"
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxEmptyPanel_3_Widget: public wxPanel{
+public:
+       wxEmptyPanel_3_Widget(wxWindow *parent);
+       ~wxEmptyPanel_3_Widget();
+       void ConfigureVTK(marImageData *marimagedata);
+       void OnContourA(wxCommandEvent& event);
+       void OnContourB(wxCommandEvent& event);
+       void OnContourAB(wxCommandEvent& event);
+       void Refresh();
+       void OnRefreshView(wxCommandEvent & event);
+void CreateNewPoint(double x, double y);
+
+private:
+       wxWindow                                *_parent;
+       vtkImageData                    *_data;
+       wxVtk2DBaseView                 *_imageviewer2D_1;
+       vtkBaseData                             *_vtkbasedata_1;
+       wxPanel                                 *CreateControlPanel(wxWindow *parent);
+       wxPanel                                 *CreateViewPanel(wxWindow *parent);
+
+       manualRoiControler              *_manRoiControl;
+       manualContourModel              *_mContourModel;
+       manualViewRoi                   *_mViewRoi;
+
+       manualContourControler  *_manContourControl_1;
+       manualContourModel              *_mContourModel_1;
+       manualViewContour               *_mViewContour_1;
+
+       manualContourControler  *_manContourControl_2;
+       manualContourModel              *_mContourModel_2;
+       manualViewContour               *_mViewContour_2;
+
+       DECLARE_EVENT_TABLE( );
+};
+
+#endif // __WX__EMPTY__PANEL__3__WIDGET
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.cxx
new file mode 100644 (file)
index 0000000..55048ce
--- /dev/null
@@ -0,0 +1,257 @@
+
+#include "wxImageBrowserWdg.h"
+
+#include <math.h>
+//#include <gtmlib/math/mathdefs.h>
+#include <mathdefs.h>
+
+BEGIN_EVENT_TABLE( wxImageBrowserWdg, wxScrolledWindow )
+    EVT_LEFT_UP( wxImageBrowserWdg::OnMouseLeftClick )
+    EVT_RIGHT_UP( wxImageBrowserWdg::OnMouseRightClick )
+    EVT_SIZE( wxImageBrowserWdg::OnSize )
+    END_EVENT_TABLE( );
+
+wxImageBrowserWdg::wxImageBrowserWdg(
+    wxWindow* parent,
+    wxWindowID id,
+    int sx,
+    int sy,
+    int gap,
+    const wxPoint& pos,
+    const wxSize& size,
+    long style,
+    const wxString& name
+    )
+    : wxScrolledWindow( parent, id, pos, size, style, name )
+{
+    _sx = sx;
+    _sy = sy;
+    _gap = gap;
+    _first_selected = -1;
+    _last_selected = -1;
+    _ima_list.RemoveAll( );
+    _ima_list.Create( _sx, _sy );
+    _nrs_list.Clear( );
+
+}
+
+void wxImageBrowserWdg::SetVolume(
+                                   unsigned short*** volume,
+                                   wxArrayString& names,
+                                   int width,
+                                   int height,
+                                   int depth,
+                                   int min,
+                                   int max
+                                   )
+{
+    wxImage tmpI;
+    unsigned char value;
+    unsigned char* data;  //pointeur sur mon image
+//    int i, j, k;
+
+    tmpI.Create( width, height );
+    _nrs_list = names;
+
+    // Canvas creation
+    _ima_list.RemoveAll( );
+    _ima_list.Create( _sx, _sy );
+
+    for( int k = 0; k < depth; k++ )
+    {
+
+      data = tmpI.GetData();
+      data += 3*width*height;
+//      unsigned short** voltemp = volume[k];
+      for ( int i = 0; i < width; i++ )
+      {
+        for ( int j = 0; j < height; j++ )
+        {
+          value = ( unsigned char )( 0x00ff*( volume[ k ][ i ][ height - j - 1] - min) / (max - min));
+          data -= 3;
+          data[0] = value;
+          data[1] = value;
+          data[2] = value;
+          //memset( data, value, 3);
+        } //rof
+      } //rof
+
+      //image is set, add it to the list
+      //another image is created so allocation is not a problem
+      _ima_list.Add( wxBitmap( tmpI.Scale( _sx, _sy ) ) );
+    } // rof
+
+//FIXME:
+#ifdef __WXMSW__
+    this->OnSize( wxSizeEvent( ) );
+#else
+  wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+  this->OnSize(myevent);
+  this->Show(true);
+#endif
+}
+
+
+
+void wxImageBrowserWdg::SetScaleX( int sx )
+{
+    _sx = sx;
+
+}
+
+void wxImageBrowserWdg::SetScaleY( int sy )
+{
+    _sy = sy;
+
+}
+
+void wxImageBrowserWdg::SetGap( int gap )
+{
+    _gap = gap;
+
+}
+
+int wxImageBrowserWdg::GetScaleX( )
+{
+    return( _sx );
+
+}
+
+int wxImageBrowserWdg::GetScaleY( )
+{
+    return( _sy );
+
+}
+
+int wxImageBrowserWdg::GetGap( )
+{
+    return( _gap );
+
+}
+
+int wxImageBrowserWdg::GetFirst( )
+{
+    return( GTM_MIN( _first_selected, _last_selected ) );
+
+}
+
+int wxImageBrowserWdg::GetLast( )
+{
+    return( GTM_MAX( _first_selected, _last_selected ) );
+
+}
+
+void wxImageBrowserWdg::GetSizeParameters( int* n, int* c, int* r )
+{
+    wxSize sz = this->GetClientSize( );
+
+    *n = _ima_list.GetImageCount( );
+    *c = ( int )floor( ( double )( sz.GetWidth( ) ) / ( double )( _gap + _sx ) );
+    *c = ( *c <= 0 )? 1: *c;
+    *r = ( int )ceil( ( double )( *n ) / ( double )( *c ) );
+
+}
+
+void wxImageBrowserWdg::OnDraw( wxDC& dc )
+{
+    int r, c, i, x, y, n, rt;
+    wxSize sz = this->GetClientSize( );
+
+    dc.SetTextForeground( wxColour( 255, 255, 0 ) );
+    dc.SetBrush( *wxTRANSPARENT_BRUSH );
+
+    this->GetSizeParameters( &n, &c, &r );
+    for( i = 0; i < n; i++ )
+    {
+        rt = ( int )floor( ( double )i / ( double )c );
+        x = ( _sx * ( i % c ) ) + ( ( ( i % c ) + 1 ) * _gap );
+        y = ( _sy * ( rt % r ) ) + ( ( ( rt % r ) + 1 ) * _gap );
+        _ima_list.Draw( i, dc, x, y, wxIMAGELIST_DRAW_NORMAL, true );
+        dc.DrawText( _nrs_list[ i ], x, y );
+        if( _first_selected == i && _last_selected != i )
+        {
+            dc.SetPen( *wxRED_PEN );
+            dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
+
+        }
+        else if( _first_selected != i && _last_selected == i )
+        {
+            dc.SetPen( *wxGREEN_PEN );
+            dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
+
+        }
+        else if( _first_selected == i && _last_selected == i )
+        {
+            dc.SetPen( *wxCYAN_PEN );
+            dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
+
+        } // fi
+
+    } // rof
+
+}
+
+void wxImageBrowserWdg::OnSize( wxSizeEvent& event )
+{
+    int r, c, n;
+    wxSize sz = this->GetClientSize( );
+
+    this->GetSizeParameters( &n, &c, &r );
+
+    // Scroll bars
+    this->SetScrollbars( _sx + _gap, _sy + ( _gap * 2 ), c, r );
+
+}
+
+int wxImageBrowserWdg::GetIndexClicked( wxMouseEvent& event )
+{
+    double re;
+    int x, y, n, c, r, i;
+    wxClientDC dc( this );
+    this->PrepareDC( dc );
+    wxPoint pos = event.GetLogicalPosition( dc );
+
+    this->GetSizeParameters( &n, &c, &r );
+
+    // Image index calculation (Help!!, Mr. wizard!)
+    x = -1;
+    re = ( double )( pos.x ) / ( double )( _gap + _sx );
+    if( ( re - floor( re ) ) >= ( ( double )( _gap ) / ( double )( _gap + _sx ) ) ) x = ( int )floor( re );
+    x = ( x >= 0 && x < c )? x: -1;
+    y = -1;
+    re = ( double )( pos.y ) / ( double )( _gap + _sy );
+    if( ( re - floor( re ) ) >= ( ( double )( _gap ) / ( double )( _gap + _sy ) ) ) y = ( int )floor( re );
+    y = ( y >= 0 && y < r )? y: -1;
+    i = ( x != -1 && y != -1 )? x + ( y * c ): -1;
+    return( ( i < n )? i: -1 );
+
+}
+
+void wxImageBrowserWdg::OnMouseLeftClick( wxMouseEvent& event )
+{
+    // Select!
+    _first_selected = this->GetIndexClicked( event );
+
+    // Drawing
+    this->Refresh( );
+
+}
+
+void wxImageBrowserWdg::OnMouseRightClick( wxMouseEvent& event )
+{
+    // Select!
+    _last_selected = this->GetIndexClicked( event );
+
+    // Drawing
+    this->Refresh( );
+
+}
+
+/*
+void wxImageBrowserWdg::Add( const wxImage& ima, const wxString& nrs )
+{
+_ima_list.Add( wxBitmap( ima.Scale( _sx, _sy ) ) );
+_nrs_list.Add( nrs );
+this->OnSize( wxSizeEvent( ) );
+}
+*/
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.h
new file mode 100644 (file)
index 0000000..31378d2
--- /dev/null
@@ -0,0 +1,74 @@
+#ifndef __WX__IMAGE__BROWSER__WDG__
+#define __WX__IMAGE__BROWSER__WDG__
+
+#include <wx/wx.h>
+#include <wx/image.h>
+#include <wx/imaglist.h>
+#include <wx/list.h>
+#include <wx/scrolwin.h>
+
+/**
+ * \brief Widget class that shows thumbnails images
+ */
+class wxImageBrowserWdg : public wxScrolledWindow
+{
+public:
+    wxImageBrowserWdg(
+       wxWindow* parent,
+       wxWindowID id = -1,
+       int sx = 100,
+       int sy = 100,
+       int gap = 10,
+       const wxPoint& pos = wxDefaultPosition,
+       const wxSize& size = wxDefaultSize,
+       long style = wxScrolledWindowStyle,
+       const wxString& name = wxPanelNameStr
+       );
+
+    void SetVolume(
+        unsigned short*** volume,
+        wxArrayString& names,
+        int width,
+        int height,
+        int depth,
+        int min,
+        int max
+        );
+
+    void SetScaleX( int sx );
+    void SetScaleY( int sy );
+    void SetGap( int gap );
+    int GetScaleX( );
+    int GetScaleY( );
+    int GetGap( );
+
+    int GetFirst( );
+    int GetLast( );
+
+    void GetSizeParameters( int* n, int* c, int* r );
+
+    void OnDraw( wxDC& dc );
+    void OnSize( wxSizeEvent& event );
+
+    void OnMouseLeftClick( wxMouseEvent& event );
+    void OnMouseRightClick( wxMouseEvent& event );
+
+//    void Add( const wxImage& ima, const wxString& nrs );
+
+private:
+
+    int GetIndexClicked( wxMouseEvent& event );
+
+    wxImageList _ima_list;
+    wxArrayString _nrs_list;
+    int _sx;
+    int _sy;
+    int _gap;
+    int _first_selected;
+    int _last_selected;
+
+    DECLARE_EVENT_TABLE( );
+
+};
+
+#endif // __WX__IMAGE__BROWSER__WDG__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageViewerWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageViewerWidget.cxx
new file mode 100644 (file)
index 0000000..fa75fac
--- /dev/null
@@ -0,0 +1,630 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxImageViewerWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxImageViewerWidget.h"
+
+#include "vtkRenderer.h"
+#include "vtkRenderWindowInteractor.h" //extremely important with VC++ don't remove !
+#include "vtkCommand.h"
+#include "vtkPolyData.h"
+#include "vtkCellArray.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkInteractorObserver.h"
+#include "vtkInteractorStyleImage.h"
+
+#include <vtkCamera.h> 
+#include <vtkPolyLine.h>
+#include <vtkDataSetMapper.h>
+#include <vtkUnstructuredGrid.h>
+
+#include <wx/tglbtn.h>
+//----------------------------------------------------------------------------
+// Callback for the interaction
+class marZoomROIObserver : public vtkCommand{
+       public:
+       virtual char const *GetClassName() const { return "marZoomROIObserver";}
+       static marZoomROIObserver *New(){
+         marZoomROIObserver * result;
+      result = new marZoomROIObserver;
+      return result;
+       }
+// PS ->   { return new marZoomROIObserver; }
+
+       marZoomROIObserver() { this->ImageViewerWdg = NULL;  }
+       virtual void Execute(vtkObject *wdg, unsigned long event, void* calldata) {
+      if ( this->ImageViewerWdg ) {
+        this->ImageViewerWdg->ExecuteEvent(wdg, event, calldata);
+      }
+       }
+       wxImageViewerWidget *ImageViewerWdg;
+};
+/**
+Most of the class was done thanks to this mail, thank you James !!
+http://public.kitware.com/pipermail/vtkusers/2003-April/017063.html
+*/
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+wxVtk2DView_TMP::wxVtk2DView_TMP(vtkImageViewer2 *imageviewer2)
+{
+       _imageviewer2 = imageviewer2;
+}
+//----------------------------------------------------------------------------
+wxVtk2DView_TMP::~wxVtk2DView_TMP()
+{
+}
+//----------------------------------------------------------------------------
+vtkRenderer* wxVtk2DView_TMP::GetRenderer()
+{
+        return  _imageviewer2->GetRenderer();
+}
+//----------------------------------------------------------------------------
+vtkRenderWindow* wxVtk2DView_TMP::GetRenWin()
+{
+        return  _imageviewer2->GetRenderWindow();
+}
+//----------------------------------------------------------------------------
+void wxVtk2DView_TMP::Configure() // virtual
+{
+       vtkInteractorStyleBaseView *interactorstylebaseview;
+       interactorstylebaseview = vtkInteractorStyleBaseView2D::New();
+
+    SetInteractorStyleBaseView(interactorstylebaseview);
+       wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
+       interactorstylebaseview->SetInteractor ( iren );
+       iren->SetInteractorStyle(interactorstylebaseview);
+       interactorstylebaseview->SetwxVtkBaseView(this);  
+}
+//----------------------------------------------------------------------------
+void wxVtk2DView_TMP::SetWxVTKRenderWindowInteractor( wxVTKRenderWindowInteractor *wxVTKiren)
+{
+       _wxVTKiren = wxVTKiren;
+}
+//----------------------------------------------------------------------------
+wxVTKRenderWindowInteractor *wxVtk2DView_TMP::GetWxVTKRenderWindowInteractor() // virtual
+{
+       return _wxVTKiren;
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+wxImageViewerWidget::wxImageViewerWidget(wxWindow* parent,
+                                     wxWindowID id,
+                                     const wxPoint& pos,
+                                     const wxSize& size,
+                                     long style,
+                                     const wxString& name) :
+                   wxPanel( parent, id, pos, size, style, name )
+{
+       _manContControl = NULL;
+       _mContourModel  = NULL;
+       _mViewContour   = NULL;
+       _Observer               = NULL;
+
+       _state=1;
+       //vtkOutputWindow::GetInstance()->PromptUserOff();
+       _wxVTKiren              = new wxVTKRenderWindowInteractorEditContour( this, -1 );
+       _imageViewer    = vtkImageViewer2::New();
+
+       wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL);
+       sizer_1->Add(_wxVTKiren, 1, wxGROW, 0);
+       SetAutoLayout(true);
+       SetSizer(sizer_1);
+       Layout();
+
+  _intVtkPanWid        = NULL;
+
+
+}
+
+//----------------------------------------------------------------------------
+wxImageViewerWidget::~wxImageViewerWidget(){
+
+       //imageViewer->GetInput()->Delete();
+       if ( _Observer !=NULL )  { _Observer->Delete(); }
+
+       ///\todo I can't find a way to delete a renderWindow on Win32
+       ///\todo The following two lines shouldn't be commented
+
+       if ( _imageViewer !=NULL )  { _imageViewer->Delete(); }
+       //wxVTKiren->SetRenderWhenDisabled( false );
+
+       if ( _wxVTKiren !=NULL )  { _wxVTKiren->Delete(); }
+
+
+       if ( _manContControl !=NULL )  { delete _manContControl;  }
+       if ( _mContourModel  !=NULL )  { delete _mContourModel; }
+       if ( _mViewContour   !=NULL )  { delete _mViewContour;    }
+}
+
+
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::ConstructVTK(vtkImageData *imageData)
+{
+  _imageViewer->SetInput ( imageData );
+  _imageViewer->SetupInteractor ( _wxVTKiren );
+  vtkCamera *camera =_imageViewer->GetRenderer()->GetActiveCamera();
+  camera->Zoom(2.5);
+  _imageViewer->GetRenderer()->ResetCamera ();
+
+//  int ww=2000;
+//  _imageViewer->GetRenderer()->ResetCameraClippingRange(-ww,ww,-ww,ww,-ww,ww);  
+
+  //imageViewer->Render();  //NEVER call it explicitely !!!
+
+  //Some images have a bad range, rescale it by default:
+  imageData->UpdateInformation();
+  imageData->SetUpdateExtent( imageData->GetWholeExtent());
+  imageData->Update();
+  double *range = imageData->GetScalarRange();
+//  _imageViewer->SetColorWindow( range[1] - range[0] );
+//  _imageViewer->SetColorLevel( 0.5*(range[1] + range[0]) );
+
+  _Observer = marZoomROIObserver::New();
+  _Observer->ImageViewerWdg = this;
+  SetState(1);   // observer 1
+  AddObserver_1();
+       _wxVTKiren->SetObserver(_Observer);
+
+  /**
+    This doesn't seems to be straight forward to overload left button mouse evtn
+      as vtkImageViewer2 overload window Level event / which is bind to left
+      mouse click -> as a hack use Middle mouse, (doesn't seems to usefull)
+  */
+
+//  wxVTKiren->GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonPressEvent, _Observer);
+
+
+       _manContControl  = new manualContourControler();
+       _mContourModel   = new manualContourModel();
+       _mViewContour    = new manualViewContour();
+
+       _manContControl->SetZ(100);
+       _mViewContour->SetModel(_mContourModel);
+       wxVtk2DView_TMP *wxvtkbaseview_tmp =new wxVtk2DView_TMP(_imageViewer);
+       _mViewContour->SetWxVtkBaseView( wxvtkbaseview_tmp );
+       _mViewContour->SetRange( 2 );
+       _manContControl->SetActive(false);
+       _manContControl->SetModelView(_mContourModel,_mViewContour);
+       wxvtkbaseview_tmp->SetWxVTKRenderWindowInteractor(_wxVTKiren);
+       wxvtkbaseview_tmp->Configure();
+       wxvtkbaseview_tmp->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContControl );
+
+    _interactorStyle2DMaracas = vtkInteractorStyle2DMaracas::New(); 
+    _interactorStyle2DMaracas->SetInteractor ( _wxVTKiren );
+    _wxVTKiren->SetInteractorStyle(_interactorStyle2DMaracas);
+    vtkMaracasImageViewer2Callback *cbk = vtkMaracasImageViewer2Callback::New();
+    cbk->IV = _imageViewer;
+    _interactorStyle2DMaracas->AddObserver( vtkCommand::WindowLevelEvent, cbk);
+    _interactorStyle2DMaracas->AddObserver( vtkCommand::StartWindowLevelEvent, cbk);
+    _interactorStyle2DMaracas->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk);
+    cbk->Delete();
+
+}
+
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::SetState(int state){
+       _state=state;
+       _wxVTKiren->SetState(state);
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::SetStateManualContour(int state){
+       _manContControl->SetState(state);
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::CreateNewManualContour(){
+       _manContControl->CreateNewManualContour();
+       _manContControl->SetActive(true);
+       _mViewContour->Refresh();
+       Refresh();
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::EraseManualContour(){
+       _manContControl->DeleteContour();
+}
+//----------------------------------------------------------------------------
+
+void wxImageViewerWidget::AddObserver_1(){
+
+  //wxVTKiren->AddObserver(vtkCommand::MiddleButtonPressEvent, _Observer);
+  //use interactor style to override -for real- the default behavior
+  _wxVTKiren->GetInteractorStyle()->AddObserver( vtkCommand::MiddleButtonPressEvent , _Observer);
+  _wxVTKiren->AddObserver(vtkCommand::MouseMoveEvent, _Observer);
+  //wxVTKiren->AddObserver(vtkCommand::MiddleButtonReleaseEvent, _Observer);
+   _wxVTKiren->GetInteractorStyle()->AddObserver( vtkCommand::MiddleButtonReleaseEvent , _Observer);
+
+  //EED  _wxVTKiren->AddObserver(vtkCommand::MouseWheelForwardEvent, _Observer);
+  _wxVTKiren->AddObserver( wxEVT_MOUSEWHEEL+10000 , _Observer);
+
+  //EED  _wxVTKiren->AddObserver(vtkCommand::MouseWheelBackwardEvent, _Observer);
+  _wxVTKiren->AddObserver( wxEVT_MOUSEWHEEL+10001 , _Observer);
+
+}
+
+
+//----------------------------------------------------------------------------
+
+void wxImageViewerWidget::AddObserver_2(){
+/*
+//  _wxVTKiren->AddObserver(vtkCommand::LeftButtonPressEvent   , _Observer);
+//  _wxVTKiren->AddObserver(vtkCommand::LeftButtonReleaseEvent, _Observer);
+
+  _wxVTKiren->AddObserver(vtkCommand::MiddleButtonPressEvent   , _Observer);
+  _wxVTKiren->AddObserver(vtkCommand::MiddleButtonReleaseEvent, _Observer);
+
+//     _wxVTKiren->AddObserver(vtkCommand::RightButtonPressEvent       , _Observer);
+  _wxVTKiren->AddObserver(vtkCommand::MouseMoveEvent           , _Observer);
+*/
+}
+
+//----------------------------------------------------------------------------
+
+void wxImageViewerWidget::ExecuteEvent(vtkObject *wdg, unsigned long event, void* calldata){
+       if (_state==1) {        ExecuteEvent1(wdg,event,calldata);      }
+       if (_state==2) {        ExecuteEvent2(wdg,event,calldata);      }
+}
+
+//----------------------------------------------------------------------------
+
+void wxImageViewerWidget::ExecuteEvent1(vtkObject *wdg, unsigned long event, void* calldata){
+
+       if ( event == vtkCommand::MiddleButtonPressEvent ){
+       }else if ( event == vtkCommand::MouseMoveEvent ){
+       }
+
+       if ( event == vtkCommand::MiddleButtonReleaseEvent ){
+               //EED } else if ( event == vtkCommand::MouseWheelForwardEvent ){
+       } else if ( event == wxEVT_MOUSEWHEEL+10000 ){
+                       wxMouseEvent mouseEvent;
+                       mouseEvent.m_wheelRotation=130;
+                       if (_intVtkPanWid!=NULL) { _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);}
+               //EED }else if ( event == vtkCommand::MouseWheelBackwardEvent ){
+       }else if ( event == wxEVT_MOUSEWHEEL+10001 ){
+                       wxMouseEvent mouseEvent;
+                       mouseEvent.m_wheelRotation=-130;
+                       if (_intVtkPanWid!=NULL) { _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);}
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxImageViewerWidget::ExecuteEvent2(vtkObject *wdg, unsigned long event, void* calldata){
+       int X,Y;
+       _wxVTKiren->GetEventPosition(X, Y);
+       if (event==wxEVT_LEFT_DOWN ){
+               _manContControl->MouseClickLeft(X,Y);
+       }
+
+       if (event==wxEVT_RIGHT_DOWN ){
+               _manContControl->MouseClickRight(X,Y);
+       }
+
+       if (event==wxEVT_LEFT_UP){
+               _manContControl->MouseReleaseLeft(X,Y);
+       }
+
+       if (event==wxEVT_LEFT_DCLICK){
+               _manContControl->MouseDLeft(X,Y);
+       }
+
+       if (event==wxEVT_MOTION){
+               _manContControl->MouseMove(X,Y);
+       }
+
+       if (event==WXK_CLEAR){
+               _manContControl->DeleteActualMousePoint(X,Y);
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxImageViewerWidget::SetImage(vtkImageData* imagedata){
+  _imageViewer->SetInput(imagedata);
+  _imageViewer->Render( );
+}
+
+//----------------------------------------------------------------------------
+int wxImageViewerWidget::GetNumberOfPointsSplineManualContour(){
+       return _manContControl->GetNumberOfPointsSplineManualContour();
+}
+//----------------------------------------------------------------------------
+double* wxImageViewerWidget::GetVectorPointsXManualContour(){
+       return _manContControl->GetVectorPointsXManualContour();
+}
+//----------------------------------------------------------------------------
+double* wxImageViewerWidget::GetVectorPointsYManualContour(){
+       return _manContControl->GetVectorPointsYManualContour();
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::SetZSlice(int z){
+#if (VTK_MAJOR_VERSION >= 5)
+               _imageViewer->SetSlice( z );
+#else
+               _imageViewer->SetZSlice( z );
+#endif
+
+}
+//----------------------------------------------------------------------------
+int wxImageViewerWidget::GetZSlice(){
+       return _imageViewer->GetZSlice();
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidget::Render(){
+       _imageViewer->Render();
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+wxImageViewerWidgetRoi::wxImageViewerWidgetRoi(wxWindow* parent,
+                                     wxWindowID id,
+                                     const wxPoint& pos,
+                                     const wxSize& size,
+                                     long style,
+                                     const wxString& name) :
+                   wxImageViewerWidget( parent, id, pos, size, style, name )
+{
+  _bboxEnabled = false;
+  _sliceEnabled = false;
+  _RoiSelected = false;
+}
+//----------------------------------------------------------------------------
+wxImageViewerWidgetRoi::~wxImageViewerWidgetRoi()
+{
+    _pts               ->Delete();
+    _bboxActor ->Delete();
+       _bboxMapper     ->Delete();
+       _pd                     ->Delete();
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidgetRoi::GetROI( int extent[6] )
+{
+  //retrieve a point
+  double P[3];
+  double Q[3];
+  _pts->GetPoint(0, P);
+  _pts->GetPoint(2, Q);
+  if (P[0]<Q[0]) { extent[0]=(int)(P[0]); extent[1]=(int)(Q[0]); } else { extent[0]=(int)(Q[0]); extent[1]=(int)(P[0]); }
+  if (P[1]<Q[1]) { extent[2]=(int)(P[1]); extent[3]=(int)(Q[1]); } else { extent[2]=(int)(Q[1]); extent[3]=(int)(P[1]); }
+  //In case the user selects outside of the image but still in the render window
+  int border[6];
+  _imageViewer->GetInput()->GetExtent( border );
+
+  if (extent[0] < border[0]) extent[0]=border[0];
+  if (extent[1] > border[1]) extent[1]=border[1];
+  if (extent[2] < border[2]) extent[2]=border[2];
+  if (extent[3] > border[3]) extent[3]=border[3];
+  extent[4] = border[4];
+  extent[5] = border[5];
+
+  //grrrrr do not forget about image with spacing <> 1 !!
+  double spacing[3];
+  _imageViewer->GetInput()->GetSpacing( spacing );
+  extent[0] = (int)( extent[0]/spacing[0] );
+  extent[1] = (int)( extent[1]/spacing[0] );
+  extent[2] = (int)( extent[2]/spacing[1] );
+  extent[3] = (int)( extent[3]/spacing[1] );
+//  extent[4] /= spacing[2];
+//  extent[5] /= spacing[2];
+
+  //Now we should take care of the difficult cases:
+  //1. The user forgot to select a region, or want the whole region
+  //2. The user only click one point (-> extent ~ x,x,y,y !!)
+
+  if(extent[1]<=extent[0] || extent[3]<=extent[2]){
+    extent[0] = border[0];
+    extent[1] = border[1];
+    extent[2] = border[2];
+    extent[3] = border[3];
+  }
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidgetRoi::TransfromeCoordViewWorld(int &X, int &Y, int &Z)
+{
+       _imageViewer->GetRenderer()->SetDisplayPoint(X, Y, Z);
+       _imageViewer->GetRenderer()->DisplayToWorld();
+       double fP[4];
+       _imageViewer->GetRenderer()->GetWorldPoint( fP );
+       if ( fP[3] ){
+               fP[0] /= fP[3];
+               fP[1] /= fP[3];
+               fP[2] /= fP[3];
+       }
+       X=(int)(fP[0]);
+       Y=(int)(fP[1]);
+       Z=(int)(fP[2]);
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidgetRoi::ExecuteEvent(vtkObject *wdg, unsigned long event, void* calldata)
+{
+  int X, Y, Z=0;
+  int XX,YY,ZZ;
+  int slice = _imageViewer->GetZSlice();
+  int min,max; 
+  min = _imageViewer->GetWholeZMin();
+  max = _imageViewer->GetWholeZMax();
+
+// EED Borrame  if ( event == vtkCommand::MiddleButtonPressEvent ) {
+  if ( event == vtkCommand::LeftButtonPressEvent ) {
+//       Dans l'absolu il faudrait 2 modes, un par defaut celui de imageViewer2 qui semble pas mal
+//        et un deuxieme pour la manipulation exclusive du polydata 2D...
+
+//      if( wxVTKiren->GetShiftKey () )
+      {
+        //def StartZoom(obj, event):
+        _wxVTKiren->GetEventPosition( X, Y );
+               XX=X; YY=Y; ZZ=Z;
+               TransfromeCoordViewWorld(XX,YY,ZZ);
+        _pts->SetPoint(0, XX, YY, ZZ);
+        _pts->SetPoint(1, XX, YY, ZZ);
+        _pts->SetPoint(2, XX, YY, ZZ);
+        _pts->SetPoint(3, XX, YY, ZZ);
+
+         _bboxEnabled = true;
+         _bboxActor->VisibilityOn();
+
+         _imageViewer->Render();
+      }
+  } else if ( event == vtkCommand::MouseMoveEvent ){
+      if ( _bboxEnabled ){
+               _RoiSelected=true;
+        double p0[3];
+        _pts->GetPoint(0, p0);
+        _wxVTKiren->GetEventPosition(X, Y);
+               XX=X; YY=Y; ZZ=Z;
+               TransfromeCoordViewWorld(XX,YY,ZZ);
+        _pts->SetPoint(1, XX   , p0[1] , p0[2]);
+        _pts->SetPoint(2, XX   , YY    , p0[2]);
+        _pts->SetPoint(3, p0[0]        , YY    , p0[2]);
+        _imageViewer->Render();
+      }
+    }
+  if ( event == vtkCommand::LeftButtonReleaseEvent ){
+       _bboxEnabled = false;
+    //EED} else if ( event == vtkCommand::MouseWheelForwardEvent ){
+    } else if ( event == wxEVT_MOUSEWHEEL+10000 ){
+      
+//        mouse wheel:
+//          * if no ctrl or shift is press then 5 slices are done
+//          * if ctrl is press ->               10 slices are done
+//          * if shirt id press ->              1 slice is done
+
+           if( _wxVTKiren->GetControlKey () ){
+          slice += 10;
+        } else if( _wxVTKiren->GetShiftKey () ) {
+          slice++;
+        } else {
+          //neither ctrl nor shift has been pressed:
+          slice += 5;
+        }
+
+        slice = slice > min ? slice : min;
+        slice = slice < max ? slice : max;
+
+#if (VTK_MAJOR_VERSION >= 5)
+               _imageViewer->SetSlice( slice );
+#else
+               _imageViewer->SetZSlice( slice );
+#endif
+
+
+        //This is not nedeed any more since vtkImageViewer2.cxx -r1.9
+        //imageViewer->GetRenderer()->ResetCameraClippingRange();
+
+               wxMouseEvent mouseEvent;
+               mouseEvent.m_wheelRotation=130;
+               if (_intVtkPanWid!=NULL) { 
+                       _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);
+               }
+        _imageViewer->Render();
+
+    //EED } else if ( event == vtkCommand::MouseWheelBackwardEvent ){
+    } else if ( event == wxEVT_MOUSEWHEEL+10001 ){
+
+//      _sliceEnabled = false;
+        if( _wxVTKiren->GetControlKey () ){
+          slice -= 10;
+        } else if( _wxVTKiren->GetShiftKey () ) {
+          slice--;
+        } else {
+          //neither ctrl nor shift has been pressed:
+          slice -= 5;
+                 slice = (slice /5) * 5;
+        }
+
+        slice = slice > min ? slice : min;
+        slice = slice < max ? slice : max;
+
+
+#if (VTK_MAJOR_VERSION >= 5)
+               _imageViewer->SetSlice( slice );
+#else
+               _imageViewer->SetZSlice( slice );
+#endif
+
+
+        //This is not nedeed any more since vtkImageViewer2.cxx -r1.9
+        //imageViewer->GetRenderer()->ResetCameraClippingRange();
+
+               wxMouseEvent mouseEvent;
+               mouseEvent.m_wheelRotation=-130;
+               if (_intVtkPanWid!=NULL) { 
+                       _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);
+               }
+        _imageViewer->Render();
+
+    }
+
+}
+//----------------------------------------------------------------------------
+void wxImageViewerWidgetRoi::ConstructVTK(vtkImageData *imageData){
+
+  wxImageViewerWidget::ConstructVTK(imageData);
+  _interactorStyle2DMaracas->SetObserver(_Observer);
+
+  //Supporting data for callbacks
+  _pts = vtkPoints::New();
+  _pts->SetNumberOfPoints(4);
+  _pts->SetPoint(0, -1000      , -1000 , -1000 );
+  _pts->SetPoint(1,  1000      , -1000 ,     0 );
+  _pts->SetPoint(2,  1000      ,  1000 ,  1000 );
+  _pts->SetPoint(3, -1000      ,  1000 ,     0 );
+
+
+  vtkCellArray *lines = vtkCellArray::New();
+  lines->InsertNextCell(5);
+  lines->InsertCellPoint(0);
+  lines->InsertCellPoint(1);
+  lines->InsertCellPoint(2);
+  lines->InsertCellPoint(3);
+  lines->InsertCellPoint(0);
+
+  _pd = vtkPolyData::New();
+  _pd->SetPoints( _pts );
+  _pd->SetLines( lines );
+  lines->Delete();  //do not delete lines ??
+
+
+       _bboxActor                                              =       vtkActor::New();
+    _bboxMapper                                                =       vtkPolyDataMapper::New();
+
+       _bboxMapper->SetInput(_pd);
+       _bboxMapper->ImmediateModeRenderingOn();
+       _bboxActor->SetMapper(_bboxMapper);
+       _bboxActor->GetProperty()->BackfaceCullingOn();
+       _bboxActor->GetProperty()->SetDiffuseColor(1,0,0);
+       _bboxActor->GetProperty()->SetLineWidth(2);
+
+    _imageViewer->GetRenderer()->AddActor( _bboxActor );
+//     _imageViewer->Render( );
+
+}
+
+//----------------------------------------------------------------------------
+bool wxImageViewerWidgetRoi::GetRoiSelected(){
+       return _RoiSelected;
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageViewerWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageViewerWidget.h
new file mode 100644 (file)
index 0000000..c01f915
--- /dev/null
@@ -0,0 +1,138 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxImageViewerWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__IMAGE__VIEWER__WIDGET__
+#define __WX__IMAGE__VIEWER__WIDGET__
+
+//As it is extremely easy to use vtkImageViewer/ vtkImageViewer2, I gave up with
+//vtkImagePlaneWidget
+#include <wx/wx.h>
+
+#include "InterfaceVtkPanelWidgets.h"
+//  #include "vtk3DSurfaceWidget.h"  //EED pour avoir access a la classe "InterfaceVtkPanelWidgets"
+
+#include "../manualContour.h"
+#include "wxVTKRenderWindowInteractorEditContour.h"
+
+#include "wxVTKRenderWindowInteractor.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageData.h"
+#include "vtkActor.h"
+#include "vtkPoints.h"
+
+class marZoomROIObserver;
+
+
+class wxVtk2DView_TMP : public wxVtkBaseView{
+public:
+       wxVtk2DView_TMP(vtkImageViewer2 *imageviewer2);
+       ~wxVtk2DView_TMP();
+       virtual vtkRenderer             *GetRenderer(); 
+       virtual vtkRenderWindow *GetRenWin();
+       virtual void                    Configure();
+       void                                    SetWxVTKRenderWindowInteractor( wxVTKRenderWindowInteractor *wxVTKiren);
+       virtual wxVTKRenderWindowInteractor *GetWxVTKRenderWindowInteractor();
+
+private:
+       wxVTKRenderWindowInteractor *_wxVTKiren;
+       vtkImageViewer2                         *_imageviewer2;
+};
+
+
+/**
+ * \brief Panel class composed of a vtk renderwindow with double click available 
+ * and add some buttons
+ */
+class wxImageViewerWidget : public wxPanel{
+public:
+
+    wxImageViewerWidget(
+        wxWindow               *parent,
+        wxWindowID             id              = -1,
+        const wxPoint  &pos    = wxDefaultPosition,
+        const wxSize&  size    = wxDefaultSize,
+        long                   style   = wxSUNKEN_BORDER, //wxTAB_TRAVERSAL,
+        const wxString& name   = wxPanelNameStr
+        );
+    ~wxImageViewerWidget( );
+    
+        virtual void ConstructVTK(vtkImageData *imageData);
+     virtual void ExecuteEvent(vtkObject *wdg, unsigned long event, void* calldata);
+                        void ExecuteEvent1(vtkObject *wdg, unsigned long event, void* calldata);
+                        void ExecuteEvent2(vtkObject *wdg, unsigned long event, void* calldata);
+                        void SetImage(vtkImageData* imagedata);
+                        void SetInterfaceVtkPanelWidgets(InterfaceVtkPanelWidgets * intVtkPanWid) { _intVtkPanWid = intVtkPanWid; };
+
+                        void    SetState(int state);
+                        void    SetStateManualContour(int state);
+                        void    CreateNewManualContour();
+                        int     GetNumberOfPointsSplineManualContour();
+                        double* GetVectorPointsXManualContour();
+                        double* GetVectorPointsYManualContour();
+                        void    EraseManualContour();
+                        void    SetZSlice(int z);
+                        int     GetZSlice();
+                        void    Render();
+
+
+       void AddObserver_1();
+       void AddObserver_2();
+
+protected:
+       int                                                                              _state;
+       marZoomROIObserver                                              *_Observer;
+       vtkInteractorStyle2DMaracas                             *_interactorStyle2DMaracas;
+       vtkImageViewer2                                                 *_imageViewer;
+       InterfaceVtkPanelWidgets                                *_intVtkPanWid;
+       wxVTKRenderWindowInteractorEditContour  *_wxVTKiren;
+
+private:
+    manualContourControler                                     *_manContControl;
+       manualContourModel                                              *_mContourModel;
+       manualViewContour                                               *_mViewContour;
+
+};
+
+//----------------------------------------------------------------------------
+
+class wxImageViewerWidgetRoi : public wxImageViewerWidget{
+public :
+       wxImageViewerWidgetRoi(
+        wxWindow* parent,
+        wxWindowID             id              = -1,
+        const wxPoint  &pos    = wxDefaultPosition,
+        const wxSize&  size    = wxDefaultSize,
+                         long          style   = wxSUNKEN_BORDER, //wxTAB_TRAVERSAL,
+        const wxString& name   = wxPanelNameStr
+        );
+    ~wxImageViewerWidgetRoi( );
+       void GetROI( int extent[6] );
+       virtual void ConstructVTK(vtkImageData *imageData);
+       void TransfromeCoordViewWorld(int &X, int &Y, int &Z);
+       bool GetRoiSelected();
+
+private :
+    virtual void ExecuteEvent(vtkObject *wdg, unsigned long event, void* calldata);
+       bool                                            _bboxEnabled;
+       bool                                            _sliceEnabled;
+       bool                                            _RoiSelected;
+       vtkPoints                                       *_pts;
+       vtkActor                                        *_bboxActor;
+       vtkPolyDataMapper                       *_bboxMapper;
+    vtkPolyData                                        *_pd;
+};
+#endif // __WX__IMAGE__VIEWER__WIDGET__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRBaseData.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRBaseData.cxx
new file mode 100644 (file)
index 0000000..67dfe61
--- /dev/null
@@ -0,0 +1,1112 @@
+
+
+#include <vtkPlanes.h>
+#include <vtkProperty.h> 
+#include <vtkPolyData.h> 
+#include <vtkDataSet.h> 
+#include <vtkCellArray.h>
+#include <vtkTransform.h>
+#include <vtkTransformFilter.h>
+#include <vtkDataSetReader.h>
+
+#include "wxMPRBaseData.h"
+#include "pPlotter/HistogramDialog.h"
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+vtkBaseData::vtkBaseData()
+{
+
+       _z                                       = 0;
+       _t                                       = 0;
+       _marImageData            = NULL;
+}
+
+//-------------------------------------------------------------------
+vtkBaseData::~vtkBaseData()
+{
+}
+
+//-------------------------------------------------------------------
+void vtkBaseData::SetMarImageData(marImageData *marimagedata)
+{
+       _marImageData = marimagedata;
+       Configure();
+}
+
+//-------------------------------------------------------------------
+vtkImageData* vtkBaseData::GetImageData()
+{
+       return _marImageData->GetImageDataT(_t);
+}
+//-------------------------------------------------------------------
+marImageData* vtkBaseData::GetMarImageData()
+{
+       return _marImageData;
+}
+
+//-------------------------------------------------------------------
+
+void vtkBaseData::Configure()  // virtual
+{
+}
+
+//-------------------------------------------------------------------
+void vtkBaseData::SetZ(double z){
+       int maxZ;
+
+//     int dim[3];
+//     _marImageData->GetDimensions(dim);
+//     maxZ=dim[2];
+
+       int ext[6];
+       _marImageData->GetImageData()->GetWholeExtent(ext);
+       maxZ=ext[5]-ext[4]+1;
+
+       if (z>=maxZ)
+       {
+               z=maxZ-1;
+       }
+       if (z<=0)
+       {
+               z=0;
+       }
+
+       _z=z;
+}
+//-------------------------------------------------------------------
+double vtkBaseData::GetZ()
+{
+       return _z;
+}
+//-------------------------------------------------------------------
+int vtkBaseData::GetT()
+{
+       return _t;
+}
+//-------------------------------------------------------------------
+void vtkBaseData::SetT(double t)
+{
+       int maxT = _marImageData->GetMaxT();
+       if (t>=maxT)
+       {
+               t=maxT-1;
+       }
+       if (t<=0)
+       {
+               t=0;
+       }
+       _t=t;
+}
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+vtkMPRBaseData::vtkMPRBaseData()
+{
+  _x=0;
+  _y=0;
+  _z=0;
+  _transformOrientation = NULL;
+}
+//-------------------------------------------------------------------
+vtkMPRBaseData::~vtkMPRBaseData()
+{
+       if (_marImageData)                      delete _marImageData;
+       if (_transformOrientation)      _transformOrientation ->Delete();
+}
+//-------------------------------------------------------------------
+void vtkMPRBaseData::Configure()
+{
+       _marImageData->GetImageData()->GetExtent (_x1,_x2,_y1,_y2,_z1,_z2);
+       _transformOrientation=vtkTransform::New();
+       _transformOrientation->Identity();
+}
+//-------------------------------------------------------------------
+void vtkMPRBaseData::GetDimensionExtention(int *x1,int *x2,int *y1,int *y2,int *z1,int *z2)
+{
+       *x1=_x1;
+       *x2=_x2;
+       *y1=_y1;
+       *y2=_y2;
+       *z1=_z1;
+       *z2=_z2;
+}
+
+
+//------------------------------------------------------------------------
+int vtkMPRBaseData::GetMaxPositionX( )
+{
+       return _x2;
+}
+//------------------------------------------------------------------------
+int vtkMPRBaseData::GetMaxPositionY( )
+{
+       return _y2;
+}
+//------------------------------------------------------------------------
+int vtkMPRBaseData::GetMaxPositionZ( )
+{
+       return _z2;
+}
+//-------------------------------------------------------------------
+double vtkMPRBaseData::GetX()
+{
+       return _x;
+}
+//-------------------------------------------------------------------
+double vtkMPRBaseData::GetY()
+{
+       return _y;
+}
+//-------------------------------------------------------------------
+void vtkMPRBaseData::SetX(double x)
+{
+       int dim[3];
+       _marImageData->GetImageData()->GetDimensions(dim);
+       if (x<0)
+       {
+               x=0;
+       }
+       if (x>=dim[0])
+       {
+               x=dim[0]-1;
+       };
+       _x=x;
+}
+//-------------------------------------------------------------------
+void vtkMPRBaseData::SetY(double y)
+{
+       int dim[3];
+       _marImageData->GetImageData()->GetDimensions(dim);
+       if (y<0)
+       {
+               y=0;
+       }
+       if (y>=dim[1])
+       {
+               y=dim[1]-1;
+       };
+       _y=y;
+}
+//-------------------------------------------------------------------
+vtkTransform *vtkMPRBaseData::GetTransformOrientation()
+{
+       return _transformOrientation; 
+}
+//-------------------------------------------------------------------
+void vtkMPRBaseData::SetNormal(double nx, double ny, double nz)
+{
+       double alfa = atan2(ny,nx) * 180.0 / 3.1416;
+       double beta = atan2( nz, sqrt( nx*nx + ny*ny )  ) * 180.0 / 3.1416;
+       _transformOrientation->Identity();              
+       _transformOrientation->RotateWXYZ(alfa,0,0,1);
+       _transformOrientation->RotateWXYZ(-beta,0,1,0);
+}
+//-------------------------------------------------------------------
+void vtkMPRBaseData::InitTransformOrientation(vtkTransform *trans)
+{
+       _transformOrientation->SetMatrix( trans->GetMatrix() );
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+vtkMPR3DDataViewer::vtkMPR3DDataViewer()
+{
+       _visiblePosition[0]=false;
+       _visiblePosition[1]=false;
+       _visiblePosition[2]=false;
+       _ctfun = NULL;
+}
+//-------------------------------------------------------------------
+vtkMPR3DDataViewer::~vtkMPR3DDataViewer()
+{
+       _outlineData            -> Delete();
+       _mapOutline                     -> Delete();
+       _outline                        -> Delete();
+
+//     if (_bwLut)                             _bwLut                          -> Delete();
+//     if (_hueLut)                    _hueLut                         -> Delete();
+//     if (_satLut)                    _satLut                         -> Delete();
+       if (_ctfun)                             _ctfun                          -> Delete();
+       if (_saggitalColors)    _saggitalColors         -> Delete();
+       if (_saggital)                  _saggital                       -> Delete();
+       if (_axialColors)               _axialColors            -> Delete();
+       if (_axial)                             _axial                          -> Delete();
+       if (_coronalColors)             _coronalColors          -> Delete();
+       if (_coronal)                   _coronal                        -> Delete();
+
+}
+//-------------------------------------------------------------------
+vtkActor* vtkMPR3DDataViewer::GetOutlineActor()
+{
+       return _outline;
+}
+//-------------------------------------------------------------------
+vtkImageActor* vtkMPR3DDataViewer::GetImageActor(int id)
+{
+       vtkImageActor *tmpVtkActor=NULL;
+       if (id==0){
+               tmpVtkActor = GetvtkActor_saggital();
+       }
+       if (id==1){
+               tmpVtkActor = GetvtkActor_coronal();
+       }
+       if (id==2){
+               tmpVtkActor = GetvtkActor_axial();
+       }
+       return tmpVtkActor;
+}
+//-------------------------------------------------------------------
+void vtkMPR3DDataViewer::Refresh()
+{
+       int x = (int)(_vtkmprbasedata->GetX());
+       int y = (int)(_vtkmprbasedata->GetY());
+       int z = (int)(_vtkmprbasedata->GetZ());
+
+       SetPositionX( x );
+       SetPositionY( y );
+       SetPositionZ( z );
+}
+//-------------------------------------------------------------------
+void vtkMPR3DDataViewer::SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata)
+{
+       _vtkmprbasedata=vtkmprbasedata;
+}
+//-------------------------------------------------------------------
+vtkMPRBaseData* vtkMPR3DDataViewer::GetVtkMPRBaseData()
+{
+       return _vtkmprbasedata;
+}
+//-------------------------------------------------------------------
+
+vtkColorTransferFunction *vtkMPR3DDataViewer::GetvtkColorTransferFunction()
+{
+       return _ctfun;
+}
+//-------------------------------------------------------------------
+
+std::vector<double>* vtkMPR3DDataViewer::GetctFunVectorPoint()
+{
+       return &_ctFunVectorPoint;
+}
+//-------------------------------------------------------------------
+std::vector<double>*     vtkMPR3DDataViewer::GetctFunVectorRed()
+{
+       return &_ctFunVectorRed;
+}
+
+//-------------------------------------------------------------------
+std::vector<double>*     vtkMPR3DDataViewer::GetctFunVectorGreen()
+{
+       return &_ctFunVectorGreen;
+}
+
+//-------------------------------------------------------------------
+std::vector<double>*     vtkMPR3DDataViewer::GetctFunVectorBlue()
+{
+       return &_ctFunVectorBlue;
+}
+
+//-------------------------------------------------------------------
+void vtkMPR3DDataViewer::Configure()
+{
+/*
+  // Start by creatin a black/white lookup table.
+       _bwLut = vtkLookupTable::New();
+    _bwLut->SetTableRange (0, 2000);
+    _bwLut->SetSaturationRange (0, 0);
+    _bwLut->SetHueRange (0, 0);
+    _bwLut->SetValueRange (0, 1);
+
+  // Now create a lookup table that consists of the full hue circle
+  // (from HSV).
+       _hueLut = vtkLookupTable::New();
+    _hueLut->SetTableRange (0, 2000);
+    _hueLut->SetHueRange (0, 1);
+    _hueLut->SetSaturationRange (1, 1);
+    _hueLut->SetValueRange (1, 1);
+
+  // Finally, create a lookup table with a single hue but having a range
+  // in the saturation of the hue.
+       _satLut = vtkLookupTable::New();
+    _satLut->SetTableRange (0, 2000);
+    _satLut->SetHueRange (.6, .6);
+    _satLut->SetSaturationRange (0, 1);
+    _satLut->SetValueRange (1, 1);
+*/
+
+
+       double range[2];
+       _vtkmprbasedata->GetImageData()->GetScalarRange(range);
+       double max = range[1];
+
+       
+       _ctFunVectorPoint.push_back(max*0/4);
+       _ctFunVectorPoint.push_back(max*1/4);
+       _ctFunVectorPoint.push_back(max*2/4);
+       _ctFunVectorPoint.push_back(max*3/4);
+       _ctFunVectorPoint.push_back(max*4/4);
+
+       _ctFunVectorRed.push_back(0.0);
+       _ctFunVectorRed.push_back(1.0);
+       _ctFunVectorRed.push_back(0.0);
+       _ctFunVectorRed.push_back(0.0);
+       _ctFunVectorRed.push_back(0.0);
+
+       _ctFunVectorGreen.push_back(0.0);
+       _ctFunVectorGreen.push_back(0.0);
+       _ctFunVectorGreen.push_back(0.0);
+       _ctFunVectorGreen.push_back(1.0);
+       _ctFunVectorGreen.push_back(0.2);
+
+       _ctFunVectorBlue.push_back(0.0);
+       _ctFunVectorBlue.push_back(0.0);
+       _ctFunVectorBlue.push_back(1.0);
+       _ctFunVectorBlue.push_back(0.0);
+       _ctFunVectorBlue.push_back(0.0);
+
+
+       _ctfun = vtkColorTransferFunction::New();
+
+       int i,size=_ctFunVectorPoint.size();
+       for (i=0;i<size;i++)
+       {
+               _ctfun->AddRGBPoint( _ctFunVectorPoint[i] , _ctFunVectorRed[i],_ctFunVectorGreen[i],_ctFunVectorBlue[i]);
+               
+       }
+/*
+       _ctfun->AddRGBPoint( 100 ,0 ,0,0);
+       _ctfun->AddRGBPoint( 200 ,1 ,0,0);
+       _ctfun->AddRGBPoint( 300 ,0 ,1,0);
+       _ctfun->AddRGBPoint( 400 ,0 ,0,1);
+*/
+       void *p=this;
+
+  // Create the first of the three planes. The filter vtkImageMapToColors
+  // maps the data through the corresponding lookup table created above.  The
+  // vtkImageActor is a type of vtkProp and conveniently displays an image on
+  // a single quadrilateral plane. It does this using texture mapping and as
+  // a result is quite fast. (Note: the input image has to be unsigned char
+  // values, which the vtkImageMapToColors produces.) Note also that by
+  // specifying the DisplayExtent, the pipeline requests data of this extent
+  // and the vtkImageMapToColors only processes a slice of data.
+       _saggitalColors = vtkImageMapToColors::New();
+    _saggitalColors->SetInput( _vtkmprbasedata->GetImageData() );
+//    _saggitalColors->SetLookupTable(_bwLut);
+    _saggitalColors->SetLookupTable(_ctfun);
+       _saggital = vtkImageActor::New();
+    _saggital->SetInput(_saggitalColors->GetOutput());
+
+
+  // Create the second (axial) plane of the three planes. We use the
+  // same approach as before except that the extent differs.
+       _axialColors = vtkImageMapToColors::New();
+    _axialColors->SetInput( _vtkmprbasedata->GetImageData() );
+//    _axialColors->SetLookupTable(_hueLut);
+    _axialColors->SetLookupTable(_ctfun);
+       _axial = vtkImageActor::New();
+    _axial->SetInput(_axialColors->GetOutput());
+
+       // Create the third (coronal) plane of the three planes. We use 
+  // the same approach as before except that the extent differs.
+       _coronalColors = vtkImageMapToColors::New();
+    _coronalColors->SetInput( _vtkmprbasedata->GetImageData() );
+//    _coronalColors->SetLookupTable(_satLut);
+    _coronalColors->SetLookupTable(_ctfun);
+       _coronal = vtkImageActor::New();
+    _coronal->SetInput(_coronalColors->GetOutput());
+
+  // An outline provides context around the data.
+  //
+       _outlineData = vtkOutlineFilter::New();
+    _outlineData->SetInput((vtkDataSet *) _vtkmprbasedata->GetImageData() );
+       _mapOutline = vtkPolyDataMapper::New();
+    _mapOutline->SetInput(_outlineData->GetOutput());
+       _outline = vtkActor::New();
+    _outline->SetMapper(_mapOutline);
+    _outline->GetProperty()->SetColor(0,0,0);
+
+       int ext[6];
+       _vtkmprbasedata->GetImageData()->GetExtent(ext);
+
+
+
+}
+
+//-------------------------------------------------------------------
+vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_saggital()
+{
+       return _saggital;
+}
+//-------------------------------------------------------------------
+vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_coronal()
+{
+       return _coronal;
+}
+//-------------------------------------------------------------------
+vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_axial()
+{
+       return _axial;
+}
+
+//------------------------------------------------------------------------
+void vtkMPR3DDataViewer::SetPositionX(int pos){
+       int x1,x2,y1,y2,z1,z2;
+       _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
+       _saggital->SetDisplayExtent( pos , pos , y1 ,y2 , z1 , z2 );
+}
+//------------------------------------------------------------------------
+void vtkMPR3DDataViewer::SetPositionY(int pos){
+       int x1,x2,y1,y2,z1,z2;
+       _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
+       _coronal->SetDisplayExtent(x1,x2, pos,pos, z1,z2);
+}
+//------------------------------------------------------------------------
+void vtkMPR3DDataViewer::SetPositionZ(int pos){
+       int x1,x2,y1,y2,z1,z2;
+       _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
+       _axial->SetDisplayExtent(x1,x2, y1,y2, pos,pos);
+}
+//-------------------------------------------------------------------
+void vtkMPR3DDataViewer::SetVisiblePosition(int idPosition, bool visible)
+{
+       _visiblePosition[idPosition]=visible;
+}
+//-------------------------------------------------------------------
+bool vtkMPR3DDataViewer::GetVisiblePosition(int idPosition)
+{
+       return _visiblePosition[idPosition];
+}
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+vtkClipping3DDataViewer::vtkClipping3DDataViewer()
+{
+       int i;
+       for (i=0; i<VTKMPRDATA_MAXTISSUE; i++){
+               _visibleTissue[i]               = false;
+               _representationType[i]  = true;
+       }
+       _visibleVolume=false;
+}
+//-------------------------------------------------------------------
+vtkClipping3DDataViewer::~vtkClipping3DDataViewer()
+{
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               _mCubes[i]                              ->Delete();
+               _tissueStripper[i]              ->Delete();
+               _tissueMapper[i]                ->Delete();
+               _tissuePlanes[i]                ->Delete();
+               _tissueClipper[i]               ->Delete();
+       }
+       _outlineData            ->Delete();
+       _mapOutline                     ->Delete();
+       _outline                        ->Delete();
+       // Volume
+       _tfun                           ->Delete();
+       _ctfun                          ->Delete();
+       _compositeFunction      ->Delete();
+       _volumeMapper           ->Delete();
+       _volumeProperty         ->Delete();
+       _newvol                         ->Delete();
+       _volumePlanes           ->Delete();
+
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               _tissue[i]              -> Delete();
+               _observerS[i]   -> Delete();
+       }
+       _observerV              -> Delete();
+}
+//-------------------------------------------------------------------
+vtkActor* vtkClipping3DDataViewer::GetOutlineActor()
+{
+       return _outline;
+}
+//-------------------------------------------------------------------
+vtkClipPolyData* vtkClipping3DDataViewer::GetTissueClipper(int id)
+{
+       return this->_tissueClipper[id];
+}
+//-------------------------------------------------------------------
+vtkPolyDataMapper* vtkClipping3DDataViewer::GetTissueMapper(int id)
+{
+       return _tissueMapper[id];
+}
+//-------------------------------------------------------------------
+vtkPlanes* vtkClipping3DDataViewer::GetTissuePlanes(int id)
+{
+       return _tissuePlanes[id];
+}
+//-------------------------------------------------------------------
+vtkStripper* vtkClipping3DDataViewer::GetTissueStripper(int id)
+{
+       return _tissueStripper[id];
+}
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::Refresh()
+{
+//     _volumeMapper->SetClippingPlanes(_volumePlanes);
+
+//     this->_volumeMapper->Update();
+//     this->_newvol->Update();
+
+//     _newvol->VisibilityOn();
+
+       
+// _volumeMapper = vtkVolumeRayCastMapper::New();
+//     _volumeMapper->SetInput( this->GetVtkMPRBaseData()->GetImageData() );
+//     _volumeMapper->SetVolumeRayCastFunction(_compositeFunction);
+//     _volumeMapper->SetClippingPlanes( _volumePlanes );
+//     _newvol->SetMapper(_volumeMapper );
+
+
+}
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::RefreshSurface()
+{
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
+       {
+               SetIsovalue(i, (int) (GetIsovalue(i)+1) );
+//             this->GetMCubes(i)->Update();
+       }
+}
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata)
+{
+       _vtkmprbasedata=vtkmprbasedata;
+}
+//-------------------------------------------------------------------
+vtkMPRBaseData* vtkClipping3DDataViewer::GetVtkMPRBaseData()
+{
+       return _vtkmprbasedata;
+}
+
+
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::SetVisibleTissue(int idTissue, bool visible)
+{
+       _visibleTissue[idTissue]=visible;
+}
+//-------------------------------------------------------------------
+bool vtkClipping3DDataViewer::GetVisibleTissue(int idTissue){
+       return _visibleTissue[idTissue];
+}
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::SetRepresentationType(int idTissue, bool representationType)
+{
+       _representationType[idTissue]=representationType;
+}
+//-------------------------------------------------------------------
+bool vtkClipping3DDataViewer::GetRepresentationType(int idTissue)
+{
+       return _representationType[idTissue];
+}
+
+//-------------------------------------------------------------------
+vtkActor* vtkClipping3DDataViewer::GetTissueActor(int id){
+       return _tissue[id];
+}
+
+//-------------------------------------------------------------------
+boxSurfaceObserver *vtkClipping3DDataViewer::GetObserverS(int idObserverS)
+{
+       return _observerS[idObserverS];
+}
+//-------------------------------------------------------------------
+boxSurfaceObserver *vtkClipping3DDataViewer::GetObserverV()
+{
+       return _observerV;
+}
+
+//-------------------------------------------------------------------
+bool vtkClipping3DDataViewer::GetVisibleVolume()
+{
+       return _visibleVolume;
+}
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::SetVisibleVolume(bool visiblevolume)
+{
+       _visibleVolume = visiblevolume;
+}
+
+
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::Configure_Tissue()
+{
+
+       double range[2];
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               // Visualisation - original volume
+               vtkImageData *imagedata=_vtkmprbasedata->GetImageData();
+               imagedata->GetScalarRange( range );
+               _mCubes[i] = vtkMarchingCubes::New( );
+               _mCubes[i]->SetInput( imagedata );
+
+               _mCubes[i]->SetValue( 0, range[1]*(4+i) / 8 );
+//             _mCubes[i]->SetValue( 0, 1500 );
+
+           _tissueStripper[i] = vtkStripper::New();
+           _tissueStripper[i]->SetInput( _mCubes[i]->GetOutput( ) );
+
+
+
+               _tissuePlanes[i]  = vtkPlanes::New();
+   
+               int x1,x2,y1,y2,z1,z2;
+               imagedata->GetExtent(x1,x2,y1,y2,z1,z2);
+               _tissuePlanes[i]->SetBounds  (x1,x2,y1,y2,z1,z2);
+               
+               _tissueClipper[i] = vtkClipPolyData::New();
+               _tissueClipper[i]->SetInput( _tissueStripper[i]->GetOutput() );
+               _tissueClipper[i]->SetClipFunction( _tissuePlanes[i] );
+               _tissueClipper[i]->InsideOutOn( );
+
+               _tissueMapper[i] = vtkPolyDataMapper::New( );
+               _tissueMapper[i]->SetInput( _tissueClipper[i]->GetOutput() );
+               _tissueMapper[i]->ScalarVisibilityOff( );
+//             _tissueMapper[i]->Update();
+
+       }
+               
+
+
+       // vtkActor tissue
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               // tissue
+               _tissue[i] = vtkActor::New();
+               _tissue[i]->SetMapper( GetTissueMapper(i) );
+               float cr=1,cg=0.5,cb=0.5;
+               _tissue[i]->GetProperty()->SetDiffuseColor(cr/255, cg/255   , cb/255   );
+               _tissue[i]->GetProperty()->SetSpecular(.3);
+               _tissue[i]->GetProperty()->SetSpecularPower(20);
+               _tissue[i]->GetProperty()->SetOpacity(0.5);
+               if (i==0) _tissue[i]->GetProperty()->SetColor(0.85, 0.85   , 0.85   );
+               if (i==1) _tissue[i]->GetProperty()->SetColor(0, 0  ,  1  );
+               if (i==2) _tissue[i]->GetProperty()->SetColor(0.85, 0.20   , 0.20   );
+               if (i==3) _tissue[i]->GetProperty()->SetColor(0, 1   , 0   );
+       }
+
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
+       {
+               _observerS[i] = boxSurfaceObserver::New();
+               _observerS[i]->SetPlanes( GetTissuePlanes(i) );
+               _observerS[i]->SetActor( _tissue[i] );
+       }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void vtkClipping3DDataViewer::Configure_Volume()
+{
+  // Volume
+
+  _tfun = vtkPiecewiseFunction::New();
+  _ctfun = vtkColorTransferFunction::New();
+
+       double range[2];
+       this->_vtkmprbasedata->GetImageData()->GetScalarRange(range);
+       double max = range[1];
+
+       /*
+       adding the poinst of the transference function
+       */
+       //X
+       greyValuesTransferenceFVector.push_back(max * 0/2);
+       greyValuesTransferenceFVector.push_back(max * 1/2);
+       greyValuesTransferenceFVector.push_back(max * 2/2);
+       //Y
+       intensityValuesTransferenceFVector.push_back(0.0);
+       intensityValuesTransferenceFVector.push_back(1.0);
+       intensityValuesTransferenceFVector.push_back(1.0);
+
+       _tfun->AddPoint(max * 0/2 , 0.0);
+       _tfun->AddPoint(max * 1/2 , 1.0);
+       _tfun->AddPoint(max * 2/2 , 1.0);
+
+       /*
+               Adding the colors to the vectors        
+       */
+       //RED
+       redColorsOfColorTransferenceFVector.push_back(0.0);
+       redColorsOfColorTransferenceFVector.push_back(1.0);
+       redColorsOfColorTransferenceFVector.push_back(0.0);
+       redColorsOfColorTransferenceFVector.push_back(0.0);
+       redColorsOfColorTransferenceFVector.push_back(0.0);
+
+       //GREEN
+       greenColorsOfColorTransferenceFVector.push_back(0.0);
+       greenColorsOfColorTransferenceFVector.push_back(0.0);
+       greenColorsOfColorTransferenceFVector.push_back(0.0);
+       greenColorsOfColorTransferenceFVector.push_back(1.0);
+       greenColorsOfColorTransferenceFVector.push_back(0.2);
+       
+       //BLUE
+       blueColorsOfColorTransferenceFVector.push_back(0.0);
+       blueColorsOfColorTransferenceFVector.push_back(0.0);
+       blueColorsOfColorTransferenceFVector.push_back(1.0);
+       blueColorsOfColorTransferenceFVector.push_back(0.0);
+       blueColorsOfColorTransferenceFVector.push_back(0.0);
+       //GREY VALUE    
+       greyValueColorsOfColorTransferenceFVector.push_back(max*0/4);
+       greyValueColorsOfColorTransferenceFVector.push_back(max*1/4);
+       greyValueColorsOfColorTransferenceFVector.push_back(max*2/4);
+       greyValueColorsOfColorTransferenceFVector.push_back(max*3/4);
+       greyValueColorsOfColorTransferenceFVector.push_back(max*4/4);
+
+       _ctfun->AddRGBPoint( max*0/4 , 0.0, 0.0, 0.0);
+       _ctfun->AddRGBPoint( max*1/4 , 1.0, 0.0, 0.0);
+       _ctfun->AddRGBPoint( max*2/4 , 0.0, 0.0, 1.0);
+       _ctfun->AddRGBPoint( max*3/4 , 0.0, 1.0, 0.0);
+       _ctfun->AddRGBPoint( max*4/4 , 0.0, 0.2, 0.0);
+
+  _volumePlanes  = vtkPlanes::New();
+//     int x1,x2,y1,y2,z1,z2;
+//     vtkImageData *imagedata=_vtkmprbasedata->GetImageData();
+//     imagedata->GetExtent(x1,x2,y1,y2,z1,z2);
+//     _volumePlanes->SetBounds(x1,x2,y1,y2,z1,z2);
+
+  _compositeFunction = vtkVolumeRayCastCompositeFunction::New();
+
+  _volumeMapper = vtkVolumeRayCastMapper::New();
+       _volumeMapper->SetInput( this->GetVtkMPRBaseData()->GetImageData() );
+       _volumeMapper->SetVolumeRayCastFunction(_compositeFunction);
+       _volumeMapper->SetClippingPlanes( _volumePlanes );
+       _volumeMapper->AutoAdjustSampleDistancesOn();
+
+  _volumeProperty = vtkVolumeProperty::New();
+       _volumeProperty->SetColor(_ctfun);
+       _volumeProperty->SetScalarOpacity( _tfun );
+// EED 31/03/2008
+       _volumeProperty->SetInterpolationTypeToLinear();
+       _volumeProperty->ShadeOn();
+       _volumeProperty->DisableGradientOpacityOn();
+
+//     _volumeProperty->SetInterpolationTypeToNearest();
+//     _volumeProperty->ShadeOff();
+//     _volumeProperty->SetAmbient(0.3);
+//     _volumeProperty->SetDiffuse(0.1);
+//     _volumeProperty->SetSpecular(0.8);
+//     _volumeProperty->DisableGradientOpacityOn();
+
+  _newvol = vtkVolume::New();
+       _newvol->SetMapper(_volumeMapper );
+       _newvol->SetProperty(_volumeProperty );
+
+  _observerV = boxSurfaceObserver::New();
+       _observerV->SetPlanes( _volumePlanes );
+       _observerV->SetActor( _newvol );
+       _observerV->SetvtkVolumeRayCastMapper( _volumeMapper );
+}
+
+
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::Configure()
+{
+       Configure_Tissue();
+       Configure_Volume();
+
+  // An outline provides context around the data.
+  //
+       _outlineData = vtkOutlineFilter::New();
+    _outlineData->SetInput((vtkDataSet *) _vtkmprbasedata->GetImageData() );
+       _mapOutline = vtkPolyDataMapper::New();
+    _mapOutline->SetInput(_outlineData->GetOutput());
+       _outline = vtkActor::New();
+    _outline->SetMapper(_mapOutline);
+    _outline->GetProperty()->SetColor(0,0,0);
+}
+
+
+//-------------------------------------------------------------------
+void vtkClipping3DDataViewer::SetIsovalue(int idTissue, int isoValue)
+{
+       _mCubes[idTissue]->SetValue(0, isoValue);
+}
+//-------------------------------------------------------------------
+double vtkClipping3DDataViewer::GetIsovalue(int idTissue)
+{
+       return _mCubes[idTissue]->GetValue(0);
+}
+//-------------------------------------------------------------------
+vtkVolume* vtkClipping3DDataViewer::GetVolumeActor()
+{
+   return _newvol;
+}
+//-------------------------------------------------------------------
+vtkVolumeRayCastMapper* vtkClipping3DDataViewer::GetVolumeMapper(){
+       return _volumeMapper;
+}
+//-------------------------------------------------------------------
+vtkPlanes* vtkClipping3DDataViewer::GetVolumePlanes()
+{
+       return _volumePlanes;
+}
+
+//-------------------------------------------------------------------
+vtkMarchingCubes *vtkClipping3DDataViewer::GetMCubes(int idTissue)
+{
+       return _mCubes[idTissue];
+}
+//--------------------------------------------------------------------
+//-------------------
+//Getters Vectors
+//-------------------
+
+std::vector<double>*   vtkClipping3DDataViewer::GetGreyValuesTransferenceFVector()
+{
+       return &greyValuesTransferenceFVector;
+}
+//--------------------------------------------------------------------
+std::vector<double>*   vtkClipping3DDataViewer::GetIntensityValuesTransferenceFVector()
+{
+       return &intensityValuesTransferenceFVector;
+}
+//--------------------------------------------------------------------
+std::vector<double>*   vtkClipping3DDataViewer::GetRedColorsOfColorTransferenceFVector()
+{
+       return &redColorsOfColorTransferenceFVector;
+}
+//--------------------------------------------------------------------
+std::vector<double>*   vtkClipping3DDataViewer::GetGreenColorsOfColorTransferenceFVector()
+{
+       return &greenColorsOfColorTransferenceFVector;
+}
+//--------------------------------------------------------------------
+std::vector<double>*   vtkClipping3DDataViewer::GetBlueColorsOfColorTransferenceFVector()
+{      
+       return &blueColorsOfColorTransferenceFVector;
+}
+//--------------------------------------------------------------------
+std::vector<double>*   vtkClipping3DDataViewer::GetGreyValueColorsOfColorTransferenceFVector()
+{
+       return &greyValueColorsOfColorTransferenceFVector;
+}
+//--------------------------------------------------------------------
+//--------------------------------------
+//Getters transference function
+//and color of the transference function
+//---------------------------------------
+vtkPiecewiseFunction* vtkClipping3DDataViewer::GetTransferencefunction()
+{
+       return this->_tfun;
+}
+//--------------------------------------------------------------------
+vtkColorTransferFunction* vtkClipping3DDataViewer::GetColorTransferenceFunction()
+{
+       return this->_ctfun;
+}
+
+//-------------------------------------------------------------------
+
+void vtkClipping3DDataViewer::ReadVolumeFunctions()
+{
+/*
+       int i=0,xi,yi,r,g,b,gValue;
+       vtkImageData *imagedata = this->_vtkmprbasedata->GetImageData();
+       
+       HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Histogram Dialog"),imagedata);
+       // 
+       // put in a method
+       //
+       int tfSize=this->greyValuesTransferenceFVector.size();
+               if(tfSize>0)
+               {
+                       int i=0,y;
+                       hDlg->erasePointsTransferenceFunction();
+                       while(i<tfSize)
+                       {
+                               double g=greyValuesTransferenceFVector[i];
+                               double in=intensityValuesTransferenceFVector[i];
+                               hDlg->addPointToTransferenceFunction(g,in*100);
+                               i++;
+                       }
+                       
+               }
+
+       int ctfSize=this->redColorsOfColorTransferenceFVector.size();
+       if(ctfSize>0)
+       {
+               int i=0,y;
+                       while(i<ctfSize)
+                       {
+                               double gr=greyValueColorsOfColorTransferenceFVector[i];
+                               double r=redColorsOfColorTransferenceFVector[i];
+                               double g=greenColorsOfColorTransferenceFVector[i];
+                               double b=blueColorsOfColorTransferenceFVector[i];
+                               hDlg->addColorPoint(gr,r*255,g*255,b*255);
+                               i++;
+                       }
+       }
+       //If it is smooth activate next line
+       //hDlg->updatePlotter();
+       //setting variables if the user wants to do refresh
+       hDlg->setCTF(_ctfun);
+       hDlg->setTF(_tfun);
+       
+       //
+       // when the user had changed the transference Function
+       //
+       if(hDlg->ShowModal()== wxID_OK )
+       {       
+                       // -- vtkPiecewiseFunction --
+                       this->_tfun->RemoveAllPoints();
+                       greyValuesTransferenceFVector.clear();
+                       intensityValuesTransferenceFVector.clear();
+               
+                       int nTFPoints=hDlg->getSizeTransferenceFunction();
+                       i=0;
+                       while(i<nTFPoints)
+                       {
+                               hDlg->getTransferenceFunctionPoint(i,xi,yi);
+                               this->_tfun->AddPoint( xi , yi/100.0 );
+                               greyValuesTransferenceFVector.push_back(xi);
+                               intensityValuesTransferenceFVector.push_back(yi/100.0);
+                               i++;
+                       }       
+                       // -- vtkColorTransferFunction  --
+                       this->_ctfun->RemoveAllPoints ();
+                       //clean colors
+                       redColorsOfColorTransferenceFVector.clear();
+                       greenColorsOfColorTransferenceFVector.clear();
+                       blueColorsOfColorTransferenceFVector.clear();
+                       greyValueColorsOfColorTransferenceFVector.clear();
+
+                       int nCTFpoints=hDlg->getSizeBarColor();
+                       i=0;    
+                       while(i<nCTFpoints)
+                       {
+                               hDlg->getDataBarColorPoint(i,xi,r,g,b);
+                               this->_ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
+                               redColorsOfColorTransferenceFVector.push_back(r/255.0);
+                               greenColorsOfColorTransferenceFVector.push_back(g/255.0);
+                               blueColorsOfColorTransferenceFVector.push_back(b/255.0);
+                               greyValueColorsOfColorTransferenceFVector.push_back(xi);
+                               i++;
+                       }
+                       
+                       this->_volumeMapper->Update();
+                       this->_newvol->Update();
+       }
+       
+       else
+       {
+               
+               if(hDlg->getRefreshed())
+               {
+                       int i=0,size;
+                       //--Transference Function----
+                       this->_tfun->RemoveAllPoints();
+                       i=0;
+                       size=greyValuesTransferenceFVector.size();
+                       for(i=0;i<size;i++)
+                       {
+                               double grey1=greyValuesTransferenceFVector[i];
+                               double  in2=intensityValuesTransferenceFVector[i];
+                               this->_tfun->AddPoint( grey1 , in2 );
+                       }
+                       
+                       // -- vtkColorTransferFunction  --
+                       _ctfun->RemoveAllPoints ();
+                       
+                       i=0;
+                       size=greyValueColorsOfColorTransferenceFVector.size();          
+                       for(i=0;i<size;i++)
+                       {
+                               double grey2=(greyValueColorsOfColorTransferenceFVector)[i];
+                               double red =(redColorsOfColorTransferenceFVector)[i];
+                               double green =(greenColorsOfColorTransferenceFVector)[i];
+                               double blue = (blueColorsOfColorTransferenceFVector)[i];
+                               _ctfun->AddRGBPoint(grey2,red,green,blue);
+                       }
+                       this->_volumeMapper->Update();
+                       this->_newvol->Update();
+                }
+                
+       }
+       hDlg->Destroy();
+*/
+}
+/*
+void vtkClipping3DDataViewer::ReadVolumeFunctions(char *namefile)
+{
+       char tmp[256];
+       short int       max;
+       double          range[2];
+       double          x,val,r,g,b;
+
+       FILE *ff = fopen ( namefile ,"r");
+
+       // --  MAX  --
+       fscanf(ff,"%s",tmp);
+       if (strcmp(tmp,"MAX")==0)
+       {
+               vtkImageData *vtkimagedata              = this->_vtkmprbasedata->GetImageData();
+               vtkimagedata->GetScalarRange(range);
+               max = (int) (range[1]);
+       } else {
+               max = atoi(tmp);
+       }
+
+       fscanf(ff,"%s",tmp);   // --
+
+       // -- vtkPiecewiseFunction --
+       this->_tfun->RemoveAllPoints();
+       fscanf(ff,"%s",tmp);   
+       while ( strcmp(tmp,"--")!=0 )
+       {
+               x=atof(tmp);
+               fscanf(ff,"%s",tmp);   
+               val=atof(tmp);
+               this->_tfun->AddPoint( x*max , val );
+               fscanf(ff,"%s",tmp);   
+       }
+
+       this->_ctfun->RemoveAllPoints ();
+       // -- vtkColorTransferFunction  --
+       while ( !feof(ff))
+       {
+               fscanf(ff,"%s",tmp);   
+               x=atof(tmp);
+               fscanf(ff,"%s",tmp);   
+               r=atof(tmp);
+               fscanf(ff,"%s",tmp);   
+               g=atof(tmp);
+               fscanf(ff,"%s",tmp);   
+               b=atof(tmp);
+               this->_ctfun->AddRGBPoint( x*max , r,g,b );                     
+       }
+
+
+       this->_volumeMapper->Update();
+       this->_newvol->Update();
+
+
+       fclose(ff);
+}
+*/
+
+//-------------------------------------------------------------------
+// EED 23 Mai 2007
+void vtkClipping3DDataViewer::ReadMeshVTK(char *namefile)
+{
+       vtkDataSetReader *reader = vtkDataSetReader::New();
+       reader->SetFileName(namefile);
+       reader->Update();
+       _tissueStripper[3]->SetInput( reader->GetPolyDataOutput()  );
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRBaseData.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRBaseData.h
new file mode 100644 (file)
index 0000000..37a4ff8
--- /dev/null
@@ -0,0 +1,344 @@
+
+#ifndef __WX__MPR__BASE__DATA__H
+#define __WX__MPR__BASE__DATA__H
+
+#include <vtkCommand.h>
+#include "vtkRenderWindow.h"
+#include <vtkVolumeRayCastMapper.h>
+#include "vtkImageActor.h"
+#include "vtkProp.h"
+#include "vtkActor.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkStripper.h"
+#include <vtkGlyph3D.h>
+#include "vtkLODActor.h"
+
+//#include "vtkContourFilter.h"
+//#include "vtkPolyDataNormals.h"
+#include <vtkMarchingCubes.h> 
+
+#include <vtkClipPolyData.h>
+#include "vtkOutlineFilter.h"
+#include <vtkPiecewiseFunction.h>
+#include <vtkColorTransferFunction.h>
+#include <vtkVolume.h>
+#include <vtkVolumeProperty.h>
+#include <vtkVolumeRayCastMapper.h>
+#include <vtkVolumeRayCastCompositeFunction.h>
+#include <vtkBoxWidget.h>
+
+#include "vtkImageData.h"
+#include "vtkLookupTable.h"
+//#include "vtkImageActor.h"
+#include <vtkImageMapToColors.h> 
+#include <vtkPointWidget.h> 
+
+#include "marImageData.h"
+//#include "./pPlotter/HistogramDialog.h"
+
+#include "marTypes.h"
+//------------------------------------------------------------------
+
+
+#define VTKMPRDATA_MAXTISSUE 4
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS vtkBaseData {
+public:
+       vtkBaseData();
+       ~vtkBaseData();
+       vtkImageData*   GetImageData();
+       marImageData*   GetMarImageData();
+                       void    SetMarImageData(marImageData *marimagedata);
+       virtual void    Configure();
+       double                  GetZ();
+       void                    SetZ(double z);
+
+       int                             GetT();
+       void                    SetT(double t);
+
+protected:
+       marImageData    *_marImageData;
+       double                  _z;
+       int                             _t;
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS vtkMPRBaseData: public vtkBaseData{
+public:
+       vtkMPRBaseData();
+       ~vtkMPRBaseData();
+       virtual void                    Configure();
+       int                                             GetMaxPositionX( );
+       int                                             GetMaxPositionY( );
+       int                                             GetMaxPositionZ( );
+       double                                  GetX();
+       double                                  GetY();
+       void                                    SetX(double x);
+       void                                    SetY(double y);
+       void                                    GetDimensionExtention(int *x1,int *x2,int *y1,int *y2,int *z1,int *z2);
+       vtkTransform                    *GetTransformOrientation();
+       void                                    SetNormal(double nx, double ny, double nz);
+       void                                    InitTransformOrientation(vtkTransform *trans);
+
+protected:
+       int                                             _x1,_x2,_y1,_y2,_z1,_z2;
+
+private:
+       double                                  _x,_y;
+       vtkTransform                    *_transformOrientation;
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS vtkMPR3DDataViewer {
+public:
+       vtkMPR3DDataViewer();
+       ~vtkMPR3DDataViewer();
+       vtkImageActor*                  GetImageActor(int id);
+       vtkActor*                               GetOutlineActor();
+       virtual void                    Refresh();
+       virtual void                    Configure();
+       void                                    SetVisiblePosition(int idPosition, bool visible);
+       bool                                    GetVisiblePosition(int idPosition);
+       vtkImageActor*                  GetvtkActor_saggital();
+       vtkImageActor*                  GetvtkActor_axial();
+       vtkImageActor*                  GetvtkActor_coronal();
+       void                                    SetPositionX(int pos);
+       void                                    SetPositionY(int pos);
+       void                                    SetPositionZ(int pos);
+       void                                    SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata);
+       vtkMPRBaseData*                 GetVtkMPRBaseData();
+       
+       vtkColorTransferFunction   *GetvtkColorTransferFunction();
+       std::vector<double >       *GetctFunVectorPoint();
+       std::vector<double >       *GetctFunVectorRed();
+       std::vector<double >       *GetctFunVectorGreen();
+       std::vector<double >       *GetctFunVectorBlue();
+
+private:
+       
+       bool                                                            _visiblePosition[3];
+
+       // outline
+       vtkOutlineFilter                                        *_outlineData;
+       vtkPolyDataMapper                                       *_mapOutline;
+       vtkActor                                                        *_outline;
+
+       //
+       vtkColorTransferFunction                        *_ctfun;
+       std::vector<double>                                     _ctFunVectorPoint;
+       std::vector<double>                                     _ctFunVectorRed;
+       std::vector<double>                                     _ctFunVectorGreen;
+       std::vector<double>                                     _ctFunVectorBlue;
+
+//     vtkLookupTable                                          *_bwLut;
+//     vtkLookupTable                                          *_hueLut;
+//     vtkLookupTable                                          *_satLut;
+
+       vtkImageMapToColors                                     *_saggitalColors;
+       vtkImageActor                                           *_saggital;
+       vtkImageMapToColors                                     *_axialColors;
+       vtkImageActor                                           *_axial;
+       vtkImageMapToColors                                     *_coronalColors;
+       vtkImageActor                                           *_coronal;
+       vtkMPRBaseData                                          *_vtkmprbasedata;
+
+
+};
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+// Callback for the interaction
+//class boxVolumeObserver : public vtkCommand
+//{
+//     public:
+//             vtkRenderWindow                 *_renWin;
+//             vtkVolumeRayCastMapper  *_volumeMapper;
+//
+//
+//             boxVolumeObserver() {  }
+//
+//             virtual char const *GetClassName() const { return "boxVolumeObserver";}
+//
+//             static boxVolumeObserver *New(){
+//                             boxVolumeObserver * result;
+//                             result = new boxVolumeObserver();
+//                     return result;
+//             }
+//
+//             virtual void Execute(vtkObject *wdg, unsigned long eventId, void* calldata) ;
+//             void SetRenWin( vtkRenderWindow *renWin );
+//             void SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper);
+//};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+// Callback for the interaction
+class boxSurfaceObserver : public vtkCommand
+{
+       public:
+               vtkPlanes                                       *_planes;
+               vtkProp                                         *_actor;
+               vtkVolumeRayCastMapper          *_vtkVolumeRayCastMapper;
+
+               boxSurfaceObserver() 
+               {  
+                       _vtkVolumeRayCastMapper = NULL;
+               }
+
+               virtual char const *GetClassName() const { return "boxSurfaceObserver";}
+
+               static boxSurfaceObserver *New(){
+                               boxSurfaceObserver * result;
+                               result = new boxSurfaceObserver();
+                       return result;
+               }
+
+               virtual void Execute(vtkObject *wdg, unsigned long eventId, void* calldata) ;
+               void SetPlanes(vtkPlanes *planes);
+               void SetActor(vtkProp *actor);
+               void SetvtkVolumeRayCastMapper(vtkVolumeRayCastMapper *vtkvolumeraycastmapper);
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkClipping3DDataViewer {
+public:
+       //----------------------
+       //Constructo-Destructor
+       //----------------------
+       vtkClipping3DDataViewer();
+       ~vtkClipping3DDataViewer();
+
+//     vtkImageActor*                  GetImageActor(int id);
+       vtkActor*                               GetOutlineActor();
+       vtkClipPolyData*                GetTissueClipper(int id);
+       vtkPolyDataMapper*              GetTissueMapper(int id);
+       vtkPlanes*                              GetTissuePlanes(int id);
+       vtkStripper*                    GetTissueStripper(int id);
+//     vtkGlyph3D*                             GetGlyph(int id);
+       vtkLODActor*                    GetMaceActor(int id);
+
+       vtkMarchingCubes                *GetMCubes(int idTissue);
+
+       virtual void                    Refresh();
+                       void                    RefreshSurface();
+
+       virtual void                    Configure();
+       void                                    Configure_Tissue();
+       void                                    Configure_Volume();
+
+       void                                    SetIsovalue(int idTissue, int isoValue);
+       double                                  GetIsovalue(int idTissue);
+
+       vtkVolume                               *GetVolumeActor();
+       vtkVolumeRayCastMapper  *GetVolumeMapper();
+       vtkPlanes                               *GetVolumePlanes();
+
+       void                                    SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata);
+       vtkMPRBaseData*                 GetVtkMPRBaseData();
+
+       vtkActor                                *GetTissueActor(int id);
+       void                                    SetVisibleTissue(int idTissue, bool visible);
+       bool                                    GetVisibleTissue(int idTissue);
+       bool                                    GetVisibleVolume();
+       void                                    SetVisibleVolume(bool visibleVolume);
+
+       void                                    SetRepresentationType(int idTissue, bool representationType);
+       bool                                    GetRepresentationType(int idTissue);
+
+       boxSurfaceObserver              *GetObserverS(int idObserverS);
+       boxSurfaceObserver              *GetObserverV();
+
+       //void                                  ReadVolumeFunctions(char *namefile); 
+       void                                    ReadVolumeFunctions(); 
+       void                                    ReadMeshVTK(char *namefile); 
+
+
+       //-------------------
+       //Getters Vectors
+       //-------------------
+
+       std::vector<double>*                                    GetGreyValuesTransferenceFVector();
+       std::vector<double>*                                    GetIntensityValuesTransferenceFVector();
+       std::vector<double>*                                    GetRedColorsOfColorTransferenceFVector();
+       std::vector<double>*                                    GetGreenColorsOfColorTransferenceFVector();
+       std::vector<double>*                                    GetBlueColorsOfColorTransferenceFVector();
+       std::vector<double>*                                    GetGreyValueColorsOfColorTransferenceFVector();
+
+       //--------------------------------------
+       //Getters transference function
+       //and color of the transference function
+       //---------------------------------------
+       vtkPiecewiseFunction                            *GetTransferencefunction();
+       vtkColorTransferFunction                        *GetColorTransferenceFunction();
+
+
+
+private:
+       
+       vtkMarchingCubes                                        *_mCubes[ VTKMPRDATA_MAXTISSUE ];
+       vtkStripper                                                     *_tissueStripper[ VTKMPRDATA_MAXTISSUE ];
+       vtkPolyDataMapper                                       *_tissueMapper[ VTKMPRDATA_MAXTISSUE ];
+       vtkPlanes                                                       *_tissuePlanes[ VTKMPRDATA_MAXTISSUE ];
+       vtkClipPolyData                                         *_tissueClipper[ VTKMPRDATA_MAXTISSUE ];
+
+       // outline
+       vtkOutlineFilter                                        *_outlineData;
+       vtkPolyDataMapper                                       *_mapOutline;
+       vtkActor                                                        *_outline;
+
+       /// Volume
+       vtkPiecewiseFunction                            *_tfun;
+       vtkColorTransferFunction                        *_ctfun;
+       vtkVolumeRayCastCompositeFunction       *_compositeFunction;
+       vtkPlanes                                                       *_volumePlanes;
+       vtkVolumeRayCastMapper                          *_volumeMapper;
+       vtkVolumeProperty                                       *_volumeProperty;
+       vtkVolume                                                       *_newvol;
+
+       vtkMPRBaseData                                          *_vtkmprbasedata;
+
+       bool                                                            _visibleVolume;
+       bool                                                            _representationType[VTKMPRDATA_MAXTISSUE];
+       bool                                                            _visibleTissue[VTKMPRDATA_MAXTISSUE];
+       vtkActor                                                        *_tissue[VTKMPRDATA_MAXTISSUE];
+       boxSurfaceObserver                                      *_observerV;
+       boxSurfaceObserver                                      *_observerS[VTKMPRDATA_MAXTISSUE];
+
+       std::vector<double>                                     greyValuesTransferenceFVector;
+       std::vector<double>                                     intensityValuesTransferenceFVector;
+       std::vector<double>                                     redColorsOfColorTransferenceFVector;
+       std::vector<double>                                     greenColorsOfColorTransferenceFVector;
+       std::vector<double>                                     blueColorsOfColorTransferenceFVector;
+       std::vector<double>                                     greyValueColorsOfColorTransferenceFVector;
+};
+
+
+#endif // __WX__MPR__BASE__DATA__H
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.cxx
new file mode 100644 (file)
index 0000000..92b188c
--- /dev/null
@@ -0,0 +1,6365 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMPRWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include <vtkObjectFactory.h>
+#include <vtkInteractorStyleSwitch.h>
+#include <vtkCamera.h>
+#include <vtkImageActor.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderWindow.h>
+
+#include <vtkRenderer.h>
+#include <vtkImageViewer2.h> 
+#include <vtkInteractorStyleImage.h> 
+
+#include <vtkProperty.h> 
+#include <vtkPolyData.h> 
+#include <vtkDataSet.h> 
+#include <vtkStripper.h>
+#include <vtkCellArray.h> 
+#include <vtkPointData.h> 
+#include <vtkInteractorStyleTrackballCamera.h>
+
+#include <vtkPlanes.h>
+#include <vtkProbeFilter.h>
+#include <vtkPlane.h>
+#include <vtkPointPicker.h>
+
+
+#include "vtkClosePolyData.h"
+#include <vtkTriangleFilter.h>
+#include <vtkSTLWriter.h>
+#include <vtkPolyDataConnectivityFilter.h>
+
+// EED 25 Janvier 2007  -  TestLoic
+#include <vtkCutter.h>
+#include <vtkWindowLevelLookupTable.h>
+#include <vtkLookupTable.h>
+#include <vtkMetaImageWriter.h>
+
+
+
+#include "wxMPRWidget.h"
+#include "wxVTKRenderWindowInteractor.h"
+#include "UtilVtk3DGeometriSelection.h"
+#include "../kernel/marDicomBase.h"
+
+
+#include <wx/wx.h>
+#include <wx/notebook.h>
+#include <wx/colordlg.h>
+
+#include "matrix.h"
+#include <string>
+
+
+#include "pPlotter/HistogramDialog.h"
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+idAlBeRa::idAlBeRa(int id, double radio,int deltavoxel)
+{
+       _id                     = id;
+       _radio          = radio;
+       _deltavoxel = deltavoxel;
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+vtkInteractorStyleSphere::vtkInteractorStyleSphere()
+{
+       _stateRadio  = false;
+       _stateRotate = false;
+}
+
+//---------------------------------------------------------------------------
+
+vtkInteractorStyleSphere::~vtkInteractorStyleSphere()
+{
+}
+
+
+//---------------------------------------------------------------------------
+
+bool  vtkInteractorStyleSphere::OnRightButtonDown()
+{
+       if ((_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==0) && (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==0) )
+       {
+               _stateRadio     = true;
+               //_fordwareX    = this->Interactor->GetEventPosition()[0];
+               _fordwareY      = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+
+               wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+
+               _radio = wxsphereview->GetRadio();
+       }
+
+       return true;
+}
+
+//---------------------------------------------------------------------------
+
+bool  vtkInteractorStyleSphere::OnRightButtonUp() 
+{
+       if (_stateRadio==true)
+       {
+               wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+               wxsphereview->SetDeltaVoxel(1);
+               double radio=wxsphereview->GetRadio();
+               wxsphereview->GetIdOfImage(radio+0.1);
+               wxsphereview->GetIdOfImage(radio+0.2);
+               wxsphereview->GetIdOfImage(radio-0.1);
+               wxsphereview->GetIdOfImage(radio-0.2);
+
+               wxsphereview->RefreshView();
+               _stateRadio = false;
+       }
+
+       return true;
+}
+//---------------------------------------------------------------------------
+
+bool vtkInteractorStyleSphere::OnLeftButtonDown()
+{
+       _stateRotate    = true;
+       _fordwareX              = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       _fordwareY              = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+       return true;
+}
+
+
+//---------------------------------------------------------------------------
+
+bool  vtkInteractorStyleSphere::OnLeftButtonUp() 
+{
+       wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+       if (_stateRotate==true){
+               int fx  = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+               int fy  = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+
+               if ((_fordwareX==fx)&&(_fordwareY==fy)){
+                       double x=fx,y=fy,z=1;
+                       _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
+                       wxsphereview->SetXYZtoParent(x,y);
+                       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,12121);
+                       wxsphereview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent);
+               } else {
+                       wxsphereview->RotationEnd();
+               }
+               wxsphereview->RefreshView();
+               _stateRotate = false;
+       }
+
+       return true;
+}
+
+
+//---------------------------------------------------------------------------
+
+bool  vtkInteractorStyleSphere::OnMouseMove () 
+{
+       wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+       if (_stateRotate==true)
+       {
+               bool ok_v, ok_ang;
+               ok_v=false;
+               ok_ang=false;
+               if (_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==1)
+               {
+                       ok_v = true;
+               }
+               if (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==1)
+               {
+                       ok_ang = true;
+               }
+           int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+        int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+               wxsphereview->RotationStart( fx - _fordwareX , -(fy - _fordwareY) , ok_v, ok_ang);
+               wxsphereview->RefreshView();
+       } 
+       if (_stateRadio==true)
+       {           
+               //int fx = this->Interactor->GetEventPosition()[0];
+        int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+               double dif=(fy-_fordwareY) / 10.0;
+               wxsphereview->SetRadio( _radio + dif );
+               wxsphereview->SetDeltaVoxel(3);
+               wxsphereview->RefreshView();
+       }
+
+       return true;
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxSphereView::wxSphereView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata, vtkImageData *imageData )
+: wxVtk2DBaseView(parent)
+{
+       _delta                          =       1;
+       _vtkmprbasedata         =       vtkmprbasedata;
+       _imageDataOriginal      =       imageData;
+
+       _imageSphere            =       vtkImageData::New();
+       _imageSphere->SetDimensions (150,150,500);
+       _imageSphere->SetScalarTypeToUnsignedShort();
+       _imageSphere->AllocateScalars();   
+       _imageSphere->Update();   
+
+
+       vtkBaseData *vtkbasedata = new vtkBaseData();
+       vtkbasedata->SetMarImageData( new marImageData(_imageSphere) );
+       this->SetVtkBaseData(vtkbasedata);
+
+    _transform                 =       vtkTransform::New();
+    _transform1                        =       vtkTransform::New();
+    _transform2                        =       vtkTransform::New();
+       _transform ->Identity();
+       _transform1->Identity();
+       _transform2->Identity();
+
+       _radio=25;
+}
+
+//-------------------------------------------------------------------
+
+wxSphereView::~wxSphereView()
+{
+       _transform  -> Delete();
+       _transform1 -> Delete();
+       _transform2 -> Delete();
+       ResetlstId();
+}
+
+//----------------------------------------------------------------------------
+
+double wxSphereView::GetRadio()
+{
+       return _radio;
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::SetRadio(double radio)
+{
+       if (radio<0)
+       {
+               radio=0;
+       }
+       _radio=radio;
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::Configure()
+{
+       wxVtk2DBaseView::Configure();
+
+       _vtkinteractorstylesphere = new vtkInteractorStyleSphere();
+       GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _vtkinteractorstylesphere );
+       double points[4][3];
+
+// EED purify 12/sep/2006
+       int i,j;
+       for (i=0;i<4;i++)
+       {
+               for (j=0;j<3;j++)
+               {
+                       points[i][j]=0;
+               }
+       }
+
+       InitSphere(points);
+       DefineImageSphere();
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::RefreshPoint()
+{
+       double x        = _vtkmprbasedata->GetX() - _centerX;
+       double y        = _vtkmprbasedata->GetY() - _centerY;
+       double z        = _vtkmprbasedata->GetZ() - _centerZ;
+       double alpha= atan2(x,z);
+       double beta = atan2( y , sqrt(z*z+x*x) );
+
+       alpha           = alpha*180/3.1416;
+       beta            = beta*180/3.1416;
+
+       _transform1->Identity();
+       _transform1->RotateY(alpha);
+       _transform1->RotateX(-beta);
+
+       _radio= sqrt(x*x + y*y +z*z);
+
+       RefreshView();
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::RefreshView()
+{
+       DefineImageSphere();
+       wxVtk2DBaseView::Refresh();
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::RotationEnd()
+{
+       _transform1->RotateWXYZ(_ang,_vxb,_vyb,0);
+       _transform2->Identity();
+       SetDeltaVoxel(1);
+       ResetlstId();
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::RotationStart(double vx, double vy, bool ok_v, bool ok_ang)
+{
+       if (ok_ang==false)
+       {
+               _ang = -sqrt( vx*vx + vy*vy ) / 1.0;
+       }
+
+       if (ok_v==false){
+               _vxb=-vy;
+               _vyb=vx;
+       }
+
+       _transform2->Identity();
+       _transform2->RotateWXYZ(_ang,_vxb,_vyb,0);
+       SetDeltaVoxel(3);
+       ResetlstId();
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::GetPointSphere(double p[3],double r1,double angA,double angB)
+{
+       double in[3],out[3];
+       in[0]=0;   
+       in[1]=r1;   
+       in[2]=0;
+       vtkTransform *transform = vtkTransform::New();
+       transform->Identity();
+       transform->RotateX(angB);
+       transform->RotateZ(angA);
+       transform->TransformPoint(in,out);
+       p[0]=out[0];
+       p[1]=out[1];
+       p[2]=out[2];
+       transform->Delete(); 
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::RotatePointOverTheSphere( double pp[3], double p[3],double cc[3])
+{
+
+       double out[3];
+       _transform->TransformPoint(p,out);
+       pp[0] = out[0] + cc[0];
+       pp[1] = out[1] + cc[1];
+       pp[2] = out[2] + cc[2];
+
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::TransferePoints(double pp1[3],double pp2[3],double AngX,double AngY,vtkImageData *image)
+{
+       double t;
+       double difX = pp2[0]-pp1[0];
+       double difY = pp2[1]-pp1[1];
+       double difZ = pp2[2]-pp1[2];
+
+       double  max             = 200;
+
+       int dimOrg[3];
+       int dimRes[3];
+       int z;
+       _imageDataOriginal->GetDimensions(dimOrg);              
+       image->GetDimensions(dimRes);           
+
+       int i;
+       double x1=pp1[0];
+       double y1=pp1[1];
+       double z1=pp1[2];
+       int xx=-1,yy=-1,zz=-1;
+
+       for (i=0;i<max;i++)
+       {
+               t  = i/max;
+               xx = (int) (x1+t*difX);
+               yy = (int) (y1+t*difY);
+               zz = (int) (z1+t*difZ);
+
+               z=i;
+               if ((xx>=0) && (xx<dimOrg[0]) && (yy>=0) && (yy<dimOrg[1]) && (zz>=0) && (zz<dimOrg[2]) &&
+                       (AngX>=0) && (AngX<dimRes[0]) && (AngY>=0) && (AngY<dimRes[1]) && (z>=0) && (z<dimRes[2]) )
+               {
+                       unsigned short *pOrg=(unsigned short*)_imageDataOriginal->GetScalarPointer (xx,yy,zz); 
+                       unsigned short *pRes=(unsigned short*)image->GetScalarPointer( (int)AngX , (int)AngY , z ); 
+                       *pRes=*pOrg;
+               }
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::ResetlstId()
+{
+       int i,size=_lstId.size();
+       for (i=size-1;i>=0;i--)
+       {
+               delete _lstId[i];
+       }
+       _lstId.clear();
+}
+
+//----------------------------------------------------------------------------
+
+int wxSphereView::GetIdOfImage(double radio)
+{
+       int id=0;
+       int dim[3];
+       _imageSphere->GetDimensions(dim);
+       int sizeMaxList = dim[2];
+       // Search in list >> alpha beta radio
+       int i,size=_lstId.size();
+       for (i=0; i<size;i++)
+       {
+               idAlBeRa *tmp=_lstId[i];
+               if ((_lstId[i]->_radio==radio) && (_lstId[i]->_deltavoxel==_delta)) 
+               {
+                       return _lstId[i]->_id;
+               }
+       }
+       if (size>sizeMaxList)
+       {
+               delete _lstId[size-1];
+               _lstId.pop_back(); 
+       }
+       if (size!=0){
+               id=_lstId[0]->_id+1;
+               id = id % sizeMaxList;
+       } else {
+               id = 0;
+       }
+
+       FiltreImage(id,radio);
+       _lstId.insert(_lstId.begin(),1,new idAlBeRa(id,radio,_delta) ); 
+
+       return id;
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::DefineImageSphere()
+{
+       int id;
+       id=GetIdOfImage( _radio );
+       GetVtkBaseData()->SetZ( id );
+}
+
+
+//----------------------------------------------------------------------------
+void wxSphereView::SetDeltaVoxel(int delta)
+{
+       _delta=delta;
+}
+
+//----------------------------------------------------------------------------
+void wxSphereView::SetVoxel(double i, double j, int delta,double id,  unsigned short gris)
+{
+       int ii,jj,delta2;
+       unsigned short *pRes;
+       int dimRes[3];
+       _imageSphere->GetDimensions(dimRes);
+
+       delta2=delta-1;
+       for ( ii=(int)(i-delta2) ; ii<=(int)(i+delta2) ; ii++ )
+       {
+               for ( jj=(int)(j-delta2) ; jj<=(int)(j+delta2) ; jj++ )
+               {
+                       if ( (ii>=0)&&(ii<dimRes[0]) &&  
+                                (jj>=0)&&(jj<dimRes[1]) )
+                       {
+                               pRes = (unsigned short*)_imageSphere->GetScalarPointer( ii , jj , (int)id );
+                               *pRes=gris;
+                       }
+               }
+       }
+
+}
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::SetXYZtoParent(double i, double j)
+{
+
+       double factor = 0.75;
+       double radio2   = _radio*_radio;
+       double pxx,pyy,d2x,d2y;
+       double cc[3],p[3],pp[3];
+       cc[0]=_centerX;
+       cc[1]=_centerY;
+       cc[2]=_centerZ;
+       double aa;
+       int dimRes[3],dimOrig[3];
+       _imageSphere->GetDimensions(dimRes);
+       d2x=dimRes[0]/2;
+       d2y=dimRes[1]/2;
+       _imageDataOriginal->GetDimensions(dimOrig);
+
+       p[0]  = (i - d2x)*factor;
+       pxx=p[0]*p[0];
+       p[1]  = (j - d2y)*factor;
+       pyy=p[1]*p[1];
+       aa = pxx + pyy;
+       if (radio2>aa){
+               aa=radio2-aa;
+               p[2]  = sqrt(aa);
+               RotatePointOverTheSphere( pp, p,cc);
+               if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
+                        (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
+                        (pp[2]>=0) && (pp[2]<dimOrig[2]) )
+               {
+                       if (_vtkmprbasedata){
+                               _vtkmprbasedata->SetX(pp[0]);
+                               _vtkmprbasedata->SetY(pp[1]);
+                               _vtkmprbasedata->SetZ(pp[2]);
+                       }
+               }
+       }
+}
+
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::FiltreImageB(int id, double radio, bool ok,int deltaTMP)
+{      
+       double factor = 0.75;
+       double radioB   = radio/3;
+       double radio2   = radio*radio;
+       double pxx,pyy,d2x,d2y;
+       double cc[3],p[3],pp[3];
+       cc[0]=_centerX;
+       cc[1]=_centerY;
+       cc[2]=_centerZ;
+       double aa;
+       unsigned short *pOrig;
+       int dimRes[3],dimOrig[3];
+       double i,j;
+       _imageSphere->GetDimensions(dimRes);
+       _imageSphere->SetExtent(0,dimRes[0]-1,0,dimRes[1]-1,0,dimRes[2]-1);
+       d2x=dimRes[0]/2;
+       d2y=dimRes[1]/2;
+//     double deltaTMP=_delta;
+       _imageDataOriginal->GetDimensions(dimOrig);
+
+       int start,end;
+       int limitA,limitB;
+       limitA  = (int) ( (-radioB/factor)+d2x );
+       limitB  = (int) ( (radioB/factor)+d2x );
+       if (ok==true){
+               start   = limitA;
+               end             = limitB;
+       } else {
+               start=0;
+               end=dimRes[0];
+       }
+
+       for ( i=start ; i<end ; i=i+deltaTMP )
+       {
+               p[0]  = (i - d2x)*factor;
+               pxx=p[0]*p[0];
+               for (j=start;j<end;j=j+deltaTMP)
+               {
+                       p[1]  = (j - d2y)*factor;
+                       pyy=p[1]*p[1];
+                       aa = pxx + pyy;
+
+                       if  (( ((ok==false) && (!((i>limitA) && (i<limitB) && (j>limitA) && (j<limitB)))) )
+                                   ||
+                                       (ok==true))
+                       {
+                               if (radio2>aa){
+                                       aa=radio2-aa;
+                                       p[2]  = sqrt(aa);
+                                       RotatePointOverTheSphere( pp, p,cc);
+                                       if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
+                                                (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
+                                                (pp[2]>=0) && (pp[2]<dimOrig[2]) )
+                                       {
+                                               pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( (int)(pp[0]) , (int)(pp[1]) , (int)(pp[2]) ); 
+                                               SetVoxel(i,j,deltaTMP,id,*pOrig);
+                                       } else {
+                                               SetVoxel(i,j,deltaTMP,id,2000);
+                                       }
+                               } else {
+                                       SetVoxel(i,j,deltaTMP,id,0);
+                               }
+                       }
+               }
+       }
+
+       _imageSphere->Modified();  
+       _imageSphere->Update();
+}
+
+
+
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::FiltreImage(int id, double radio)
+{
+
+       _transform -> Identity();
+       _transform -> Concatenate(_transform1);
+       _transform -> Concatenate(_transform2);
+
+       FiltreImageB(id,radio,false, _delta);
+       FiltreImageB(id,radio,true, 1);
+}
+
+
+//----------------------------------------------------------------------------
+
+/*
+void wxSphereView::FiltreImage(int id, double radio)
+{
+       double radio2   = radio*radio;
+       double radio2TMP= (radio/2)*(radio/2);
+       double pxx,pyy,d2x,d2y;
+       double cc[3],p[3],pp[3];
+       cc[0]=_centerX;
+       cc[1]=_centerY;
+       cc[2]=_centerZ;
+       double aa;
+       unsigned short *pOrig;
+       int dimRes[3],dimOrig[3];
+       double i,j;
+       _imageSphere->GetDimensions(dimRes);
+       _imageSphere->SetExtent(0,dimRes[0]-1,0,dimRes[1]-1,0,dimRes[2]-1);
+       d2x=dimRes[0]/2;
+       d2y=dimRes[1]/2;
+       double deltaTMP=_delta;
+       _imageDataOriginal->GetDimensions(dimOrig);
+
+       for ( i=0 ; i<dimRes[0] ; i=i+deltaTMP )
+       {
+               p[0]  = (i - d2x)*0.75;
+               pxx=p[0]*p[0];
+               for (j=0;j<dimRes[1];j=j+deltaTMP)
+               {
+                       p[1]  = (j - d2y)*0.75;
+                       pyy=p[1]*p[1];
+                       aa = pxx + pyy;
+
+                       if (aa>radio2TMP)
+                       {
+                               if (radio2>aa){
+                                       aa=radio2-aa;
+                                       p[2]  = sqrt(aa);
+                                       RotatePointOverTheSphere( pp, p,cc);
+                                       if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
+                                                (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
+                                                (pp[2]>=0) && (pp[2]<dimOrig[2]) )
+                                       {
+                                               pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( pp[0] , pp[1] , pp[2] ); 
+                                               SetVoxel(i,j,deltaTMP,id,*pOrig);
+                                       } else {
+                                               SetVoxel(i,j,deltaTMP,id,2000);
+                                       }
+                               } else {
+                                       SetVoxel(i,j,deltaTMP,id,0);
+                               }
+                       }
+               }
+       }
+
+
+       deltaTMP=1;
+       for ( i=0 ; i<dimRes[0] ; i=i+deltaTMP )
+       {
+               p[0]  = (i - d2x)*0.75;
+               pxx=p[0]*p[0];
+               for (j=0;j<dimRes[1];j=j+deltaTMP)
+               {
+                       p[1]  = (j - d2y)*0.75;
+                       pyy=p[1]*p[1];
+                       aa = pxx + pyy;
+                       if (aa<=radio2TMP)
+                       {
+                               if (radio2>aa){
+                                       aa=radio2-aa;
+                                       p[2]  = sqrt(aa);
+                                       RotatePointOverTheSphere( pp, p,cc);
+                                       if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
+                                                (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
+                                                (pp[2]>=0) && (pp[2]<dimOrig[2]) )
+                                       {
+                                               pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( pp[0] , pp[1] , pp[2] ); 
+                                               SetVoxel(i,j,deltaTMP,id,*pOrig);
+                                       } else {
+                                               SetVoxel(i,j,deltaTMP,id,2000);
+                                       }
+                               } else {
+                                       SetVoxel(i,j,deltaTMP,id,0);
+                               }
+                       }
+               }
+       }
+
+       _imageSphere->Modified();  
+       _imageSphere->Update();
+}
+*/
+/*
+void wxSphereView::FiltreImage(vtkImageData *imageSphere)
+{
+       int dim[3],i,j,k;
+       imageSphere->GetDimensions(dim);
+       for (i=0;i<dim[0];i++)
+       {
+               for (j=0;j<dim[1];j++)
+               {
+                       for (k=0;k<dim[2];k++)
+                       {
+                               unsigned short *pRes=(unsigned short*)imageSphere->GetScalarPointer (i,j,k); 
+                               *pRes=0;
+                       }
+               }
+       }
+
+       double deltaA=90;
+       double cc[3],p1[3],p2[3],pp1[3],pp2[3];
+       cc[0]=_centerX;
+       cc[1]=_centerY;
+       cc[2]=_centerZ;
+       double r1       = _sl_radio->GetValue() - _sl_thickness->GetValue()/2;
+       double r2       = _sl_radio->GetValue() + _sl_thickness->GetValue()/2;
+       if (r1<10)
+       {
+               r1=10;
+       }
+       double alpha= _sl_alpha->GetValue();
+       double beta     = _sl_beta->GetValue();
+
+       double angA,angB;
+       for (angA=-deltaA;angA<deltaA;angA++)
+       {
+               for (angB=-deltaA;angB<deltaA;angB++)
+               {
+                       GetPointSphere(p1,r1,angA,angB);
+                       GetPointSphere(p2,r2,angA,angB);
+                       RotatePointOverTheSphere( pp1, alpha, beta, p1 ,cc );
+                       RotatePointOverTheSphere( pp2, alpha, beta, p2 ,cc );
+                       TransferePoints(pp1,pp2,angA+alpha+180,angB+beta+90,imageSphere);
+               }
+       }
+}
+*/
+
+
+//----------------------------------------------------------------------------
+
+void wxSphereView::InitSphere(double points[4][3])
+{
+       double cc[3];
+    double r = SphereFindCenter(points,cc); // 4-points , center
+    if (r > 0)
+    {
+        _centerX       = (int)(cc[0]);
+        _centerY       = (int)(cc[1]);
+        _centerZ       = (int)(cc[2]);
+    } else {
+               int dim[3];
+               _imageDataOriginal->GetDimensions(dim);
+        _centerX       = (int)(dim[0]/2);
+        _centerY       = (int)(dim[1]/2);
+        _centerZ       = (int)(dim[2]/2);
+       }
+}
+
+//----------------------------------------------------------------------------
+
+// Calculate center and radius of sphere given four points
+// http://home.att.net/~srschmitt/script_sphere_solver.html
+// source code HTML <script language=JavaScript>
+double wxSphereView::SphereFindCenter(double P[4][3], double cc[3])
+{
+    int i;
+    double r, m11, m12, m13, m14, m15;
+       double a[4][4];
+
+    for (i = 0; i < 4; i++)                    // find minor 11
+    {
+        a[i][0] = P[i][0];
+        a[i][1] = P[i][1];
+        a[i][2] = P[i][2];
+        a[i][3] = 1;
+    }
+    m11 = determinant( a, 4 );
+
+    for (i = 0; i < 4; i++)                    // find minor 12 
+    {
+        a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
+        a[i][1] = P[i][1];
+        a[i][2] = P[i][2];
+        a[i][3] = 1;
+    }
+    m12 = determinant( a, 4 );
+
+    for (i = 0; i < 4; i++)                    // find minor 13
+    {
+        a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
+        a[i][1] = P[i][0];
+        a[i][2] = P[i][2];
+        a[i][3] = 1;
+    }
+    m13 = determinant( a, 4 );
+
+    for (i = 0; i < 4; i++)                    // find minor 14
+    {
+        a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
+        a[i][1] = P[i][0];
+        a[i][2] = P[i][1];
+        a[i][3] = 1;
+    }
+    m14 = determinant( a, 4 );
+
+
+    for (i = 0; i < 4; i++)                    // find minor 15
+    {
+        a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
+        a[i][1] = P[i][0];
+        a[i][2] = P[i][1];
+        a[i][3] = P[i][2];
+    }
+    m15 = determinant( a, 4 );
+
+    if (m11 == 0)
+    {
+        r = 0;
+    }
+    else
+    {
+               // center of sphere
+        cc[0] =  0.5*m12/m11;  //cx                  
+        cc[1] = -0.5*m13/m11;  //cy
+        cc[2] =  0.5*m14/m11;  //cz
+               // Sphere radio 
+        r  = sqrt( cc[0]*cc[0] + cc[1]*cc[1] + cc[2]*cc[2] - m15/m11 );
+    }
+
+    return r;                                  // the radius
+}
+//----------------------------------------------------------------------------
+
+//  Recursive definition of determinate using expansion by minors.
+double wxSphereView::determinant(double a[4][4], int n)
+{
+    int i, j, j1, j2;
+    double d;
+       double m[4][4];
+
+       for (i=0;i<4;i++)
+       {
+               for (j=0;j<4;j++)
+               {
+                       m[i][j]=0;
+               }
+       }
+
+    if (n == 2)                                // terminate recursion
+    {
+        d = a[0][0]*a[1][1] - a[1][0]*a[0][1];
+    }
+    else 
+    {
+        d = 0;
+        for (j1 = 0; j1 < n; j1++ )            // do each column
+        {
+            for (i = 1; i < n; i++)            // create minor
+            {
+                j2 = 0;
+                for (j = 0; j < n; j++)
+                {
+                    if (j == j1) continue;
+                    m[i-1][j2] = a[i][j];
+                    j2++;
+                }
+            }
+            
+            // sum (+/-)cofactor * minor  
+            d = d + pow(-1.0, j1)*a[0][j1]*determinant( m, n-1 );
+        }
+    }
+
+    return d;
+}
+
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+vtkInteractorStylePlane2D::vtkInteractorStylePlane2D()
+{
+       _stateRotate=false;
+}
+//---------------------------------------------------------------------------
+vtkInteractorStylePlane2D::~vtkInteractorStylePlane2D()
+{
+}
+
+//---------------------------------------------------------------------------
+bool vtkInteractorStylePlane2D::GetStateRotate()
+{
+       return _stateRotate;
+}
+
+//---------------------------------------------------------------------------
+bool  vtkInteractorStylePlane2D::OnLeftButtonDown()  // vitual
+{
+       _stateRotate = true;
+       _fordwareX = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       _fordwareY = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+       vtkplane2Dview->RotationStart();
+
+       return true;
+}
+
+//---------------------------------------------------------------------------
+bool vtkInteractorStylePlane2D::OnLeftButtonUp() // virtual
+{
+       if (_stateRotate==true)
+       {
+               _stateRotate = false;
+               vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+               vtkplane2Dview->ResetBack();
+//             this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+
+       return true;
+}
+
+//---------------------------------------------------------------------------
+bool  vtkInteractorStylePlane2D::OnRightButtonUp()  // virtual
+{
+       if (_stateRotate==true){
+               vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+
+// EED Borrame
+//             vtkplane2Dview->RotationEnd();
+
+               _stateRotate = false;
+       }
+
+       return true;
+}
+//---------------------------------------------------------------------------
+bool  vtkInteractorStylePlane2D::OnMouseMove () // virtual 
+{
+       bool ok_v, ok_ang;
+       if (_stateRotate==true){
+               ok_v=false;
+               ok_ang=false;
+               if (_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==1)
+               {
+                       ok_v=true;
+               }
+               if (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==1)
+               {
+                       ok_ang=true;
+               }
+           int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+        int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+               vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+               vtkplane2Dview->RotationDrag( fx - _fordwareX , fy - _fordwareY , ok_v , ok_ang);
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       } 
+       return true;
+}
+//-------------------------------------------------------------------
+bool vtkInteractorStylePlane2D::OnLeftDClick() // virtual
+{
+       int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+       double xx=fx;
+       double yy=fy;
+       double zz=0;
+
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+       vtkMPRBaseData *vtkmprbasedata = vtkplane2Dview->GetVtkmprbasedata();
+
+       vtkplane2Dview->TransfromeCoordViewWorld2(xx,yy,zz);
+
+       vtkmprbasedata->SetX( xx );
+       vtkmprbasedata->SetY( yy );
+       vtkmprbasedata->SetZ( zz );
+       this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+
+       return true;
+}
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+vtkPlane2DView::vtkPlane2DView( wxWindow *parent)
+: wxVtk2DBaseView(parent)
+{
+
+       _backX                                  =       -99999;
+       _backY                                  =       -99999;
+       _backZ                                  =       -99999;
+
+       _backOrient[0]                  =       -99999;
+       _backOrient[1]                  =       -99999;
+       _backOrient[2]                  =       -99999;
+       _backOrient[3]                  =       -99999;
+
+       _active                                 =   true;
+       _mip_visualization              =       true;
+       _mip_width                              =       2;
+
+    _transform1                                =       vtkTransform::New();
+    _transform2                                =       vtkTransform::New();
+       _transform1->Identity();
+       _transform2->Identity();
+
+       _sizeIma                                =       200;
+
+       _pSource                                =       NULL;
+       _3Dslices                               =       NULL;
+       _stPoints                               =       NULL;
+       _change                                 =       NULL;
+       _imageResult                    =       NULL;
+
+       // line horizontal
+    _pts                       = NULL;
+    _lineActor         = NULL;
+       _lineMapper             = NULL;
+       _pd                             = NULL;
+
+       _interactorstyleplane2D =       false;
+}
+//-------------------------------------------------------------------
+vtkPlane2DView::~vtkPlane2DView()
+{
+       ResetPlane();
+
+       // Horizontal Line
+    if (_pts           != NULL)        {       _pts                    -> Delete(); }
+    if (_lineActor     != NULL)        {       _lineActor              -> Delete(); }
+    if (_lineMapper    != NULL)        {       _lineMapper             -> Delete(); }
+    if (_pd                    != NULL)        {       _pd                             -> Delete(); }
+
+       _transform1             -> Delete();
+       _transform2             -> Delete();
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::ResetBack()
+{
+               _backX=-1;
+               _backY=-1;
+               _backZ=-1;
+               _backOrient[0]=-1;
+               _backOrient[1]=-1;
+               _backOrient[2]=-1;
+               _backOrient[3]=-1;
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::ResetPlane(){
+       if (_pSource    !=NULL) { _pSource      -> Delete();    }
+       if (_3Dslices   !=NULL) { _3Dslices     -> Delete();    }
+       if (_stPoints   !=NULL) { _stPoints     -> Delete();    }
+       if (_change             !=NULL) { _change       -> Delete();    }
+}
+//-------------------------------------------------------------------
+vtkMPRBaseData *vtkPlane2DView::GetVtkmprbasedata()
+{
+       return (vtkMPRBaseData*)GetVtkBaseData();
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::SetPSource(int sizeIma){
+       int dimIma      = sizeIma; 
+
+       double x = GetVtkmprbasedata()->GetX();
+       double y = GetVtkmprbasedata()->GetY();
+       double z = GetVtkmprbasedata()->GetZ();
+
+       double spc[3];
+       vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
+       imagedata->GetSpacing(spc);
+       x=x*spc[0];
+       y=y*spc[1];
+       z=z*spc[2];
+
+
+       vtkMPRBaseData  *mprbasedata = (vtkMPRBaseData*)this->GetVtkBaseData();
+       vtkTransform    *transform       = mprbasedata->GetTransformOrientation();
+
+       double in[3];  // temp
+       double pA[3];
+       double pB[3];
+       in[0]=1;                in[1]=0;                        in[2]=0;
+       transform->TransformPoint(in,_n);
+
+       in[0]=0;        in[1]=dimIma-1;         in[2] = 0;
+       transform->TransformPoint(in,pA);
+
+       in[0]=0;        in[1]=0;                in[2]=dimIma-1;
+       transform->TransformPoint(in,pB);
+
+    _pSource -> SetPoint1( pA  );
+    _pSource -> SetPoint2( pB  );
+
+       _pSource -> SetOrigin( 0        , 0             , 0             );
+    _pSource -> SetResolution( sizeIma-1 , sizeIma -1 );
+       _pSource -> Update();
+       _pSource -> SetCenter( x, y, z );
+    _pSource -> SetNormal( _n );
+    _pSource -> Update( );
+
+// EED Borrame
+//     transform->Delete();
+
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::ExtractPlane() 
+{
+
+       double x = GetVtkmprbasedata()->GetX();
+       double y = GetVtkmprbasedata()->GetY();
+       double z = GetVtkmprbasedata()->GetZ();
+
+       double spc[3];
+       vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
+       imagedata->GetSpacing(spc);
+       x=x*spc[0];
+       y=y*spc[1];
+       z=z*spc[2];
+
+       vtkTransform *transform = GetVtkmprbasedata()->GetTransformOrientation();
+       double orientation[4];
+       transform->GetOrientationWXYZ(orientation);
+
+       bool okOrientation=true;
+       if ((orientation[0]!=_backOrient[0]) || (orientation[1]!=_backOrient[1]) ||
+               (orientation[2]!=_backOrient[2]) || (orientation[3]!=_backOrient[3]))
+       {
+               okOrientation=false;
+       }
+
+       bool okPosicion=true;
+       if ( (x!=_backX) || (y!=_backY) || (z!=_backZ) )
+       {
+               okPosicion=false;
+       }
+
+       if ((okPosicion==false) || (okOrientation==false) ) {
+               if (_active==true){
+
+                       bool ok = false;
+
+                       if ( _mip_visualization==true )
+                       {
+                               if (_interactorstyleplane2D!=NULL)
+                               {
+                                       if (_interactorstyleplane2D->GetStateRotate()==false )
+                                       {
+                                               ok=true;
+                                       }
+                               }
+                       }
+//                     ok=true;
+
+                       if (ok==true)
+                       {
+                               Extract_MIP_PlaneVTK();
+                       } else {
+                               Extract_One_PlaneVTK();
+                       } // ok
+
+               } // active
+               _backX=x;
+               _backY=y;
+               _backZ=z;
+               _backOrient[0]=orientation[0];
+               _backOrient[1]=orientation[1];
+               _backOrient[2]=orientation[2];
+               _backOrient[3]=orientation[3];
+       } //okPosition okOrientation
+}
+
+//-------------------------------------------------------------------
+
+void vtkPlane2DView::Extract_One_PlaneVTK()
+{
+       vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
+       SetPSource(_sizeIma);
+       _3Dslices -> SetInput( ( vtkDataSet* )_pSource->GetOutput( ) );
+       _3Dslices -> SetSource( imagedata );
+       _3Dslices -> Update( );
+       _stPoints -> GetPointData( )->SetScalars(  _3Dslices->GetOutput()->GetPointData()->GetScalars()  );
+       _stPoints -> SetDimensions( _sizeIma, _sizeIma, 1 );
+       _stPoints -> SetScalarType( imagedata->GetScalarType() );
+       _stPoints -> SetScalarTypeToShort();
+       _stPoints -> Update();
+//     _change   -> SetInput( _stPoints );  
+//     _change   -> Update();    //important
+       _imageViewer2XYZ->GetVtkImageViewer2()->SetInput ( _stPoints );
+//     _imageViewer2XYZ->GetVtkImageViewer2()->SetInput ( _change->GetOutput() );
+       //      vtkImageActor *imageActor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor();
+}
+
+//-------------------------------------------------------------------
+
+void vtkPlane2DView::Extract_MIP_PlaneVTK( /*double heightDefinition*/ )
+{
+
+       int mipWidth;
+       double sp;
+       int sizeWidth = (_mip_width*2)+1 ;
+       int deltaPixel;
+       int iWidth,itmp,tmpSizeWith;
+
+       double spc[3];
+       vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
+       SetPSource(_sizeIma);
+       imagedata->GetSpacing(spc);
+
+       bool heightDefinition=false;
+       if (_mip_width<3)
+       {
+               heightDefinition=true;
+       }
+
+       if (heightDefinition==true)
+       {
+               mipWidth        =       _mip_width;
+               sp                      =       spc[0];
+               deltaPixel      =       1;
+       } else {
+               mipWidth        =       2;
+               tmpSizeWith =   (mipWidth*2) + 1;
+               sp                      =       (spc[0]*sizeWidth)/tmpSizeWith;
+               sizeWidth       =       tmpSizeWith;
+               deltaPixel      =       4;
+       }
+
+
+
+       std::vector< vtkProbeFilter* > slicesLST;
+
+       _pSource->Push( -mipWidth * sp );
+       _pSource->Update();
+
+       for ( iWidth=0 ; iWidth<sizeWidth ; iWidth++ )
+       {       
+               vtkProbeFilter *slice = vtkProbeFilter::New();
+               slice -> SetInput( ( vtkDataSet* )_pSource->GetOutput( ) );
+               slice -> SetSource( imagedata );
+               slice -> Update( );
+               slicesLST.push_back( slice );
+               _pSource->Push( sp );
+       }
+       
+       if (_imageResult ==NULL)
+       {
+               _imageResult = vtkImageData::New();
+               _imageResult -> SetDimensions(_sizeIma,_sizeIma,1);
+               _imageResult -> SetSpacing(1,1,1);
+               _imageResult -> SetScalarType( imagedata->GetScalarType() );
+               _imageResult -> SetExtent(0,_sizeIma-1,0,_sizeIma-1,0,0);
+               _imageResult -> SetWholeExtent(0,_sizeIma-1,0,_sizeIma-1,0,0);
+               _imageResult -> AllocateScalars();
+               _imageResult -> Update();
+       }
+
+       unsigned short *pTemp;
+       unsigned short *pResult;
+       pResult = (unsigned short*)_imageResult->GetScalarPointer( 0 , 0 , 0 ); 
+
+       int iPixels , sizePixels = _sizeIma*_sizeIma;
+       for(iPixels=0 ; iPixels<sizePixels ; iPixels=iPixels+deltaPixel)
+       {
+
+               pTemp = (unsigned short*)slicesLST[0]->GetOutput()->GetPointData()->GetScalars()->GetVoidPointer(0);
+
+               pResult = (unsigned short*)_imageResult->GetScalarPointer( 0 , 0 , 0 ); 
+               pResult[iPixels] = pTemp[iPixels];
+
+               for (iWidth=1;iWidth<sizeWidth;iWidth++)
+               {
+                       pTemp = (unsigned short*)slicesLST[iWidth]->GetOutput()->GetPointData()->GetScalars()->GetVoidPointer(0);
+
+                       if (pResult[iPixels]< pTemp[iPixels])
+                       {
+                               pResult[iPixels] = pTemp[iPixels];
+                       }
+               }
+
+               if (deltaPixel!=1)
+               {
+                       for (itmp=1;itmp<deltaPixel;itmp++)
+                       {
+                               pResult[iPixels+itmp] = pResult[iPixels];
+                       }
+               }
+
+       }
+
+       for (iWidth=0;iWidth<sizeWidth;iWidth++)
+       {       
+               slicesLST[iWidth]->Delete();
+       }
+
+       _imageResult->Modified();
+       _imageViewer2XYZ->GetVtkImageViewer2()->SetInput ( _imageResult );
+
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::Configure( )
+{
+       wxVtk2DBaseView::Configure(false);
+
+       HorizontalLine();
+// Borrame
+//     CircleLine();
+
+       _pSource         = vtkPlaneSource::New( );
+    _3Dslices   = vtkProbeFilter::New( ) ;
+       _stPoints        = vtkStructuredPoints::New( );
+       _change          = vtkImageChangeInformation::New();
+
+       wxVTKRenderWindowInteractor *iren               = GetWxVTKRenderWindowInteractor();
+       ExtractPlane();
+//     SetActive(false);
+       _imageViewer2XYZ -> GetVtkImageViewer2()        -> SetupInteractor ( iren );
+
+       SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
+
+       _interactorstyleplane2D = new vtkInteractorStylePlane2D();
+       GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _interactorstyleplane2D );
+
+       vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
+       camera->SetViewUp               (       0                       ,       1                               ,       0       );
+       camera->SetFocalPoint   ((0+_sizeIma)/2 , (0+_sizeIma)/2        ,       0       ); 
+       camera->SetPosition             ((0+_sizeIma)/2 , (0+_sizeIma)/2        , 10000 ); 
+       camera->SetClippingRange(0.01, 100000);
+       camera->ComputeViewPlaneNormal();
+       camera->SetParallelScale( _sizeIma/3.0 );
+
+       // text information over the graphic window
+       _vtkInfoTextImage                                               = new vtkInfoTextImage();
+       _vtkInfoTextImageInteractorPlane2D              = new vtkInfoTextImageInteractorPlane2D();
+       _vtkInfoTextImage->SetWxVtk2DBaseView(this);
+       _vtkInfoTextImage->SetMarImageData(  GetVtkmprbasedata()->GetMarImageData() );
+       _vtkInfoTextImageInteractorPlane2D->SetModelVtkInfoTextImage(_vtkInfoTextImage);        
+       _vtkInfoTextImage->Configure();
+       this->GetInteractorStyleBaseView()->AddInteractorStyleMaracas(_vtkInfoTextImageInteractorPlane2D);
+
+
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::HorizontalLine()
+{
+// Axe Horizontal
+       _pts = vtkPoints::New();
+       _pts->SetNumberOfPoints(2);
+       _pts->SetPoint(0, -1000 , -1000 , -1000 );
+       _pts->SetPoint(1,  1000 ,  1000 ,  1000 );
+       vtkCellArray *lines = vtkCellArray::New();
+       lines->InsertNextCell(2);
+       lines->InsertCellPoint(0);
+       lines->InsertCellPoint(1);
+       _pd = vtkPolyData::New();
+    _pd->SetPoints( _pts );
+    _pd->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _lineActor                                      =       vtkActor::New();
+    _lineMapper                                        =       vtkPolyDataMapper::New();
+       _lineMapper->SetInput(_pd);
+       _lineMapper->ImmediateModeRenderingOn();
+       _lineActor->SetMapper(_lineMapper);
+       _lineActor->GetProperty()->BackfaceCullingOn();
+       _lineActor->GetProperty()->SetDiffuseColor(0,0,1);
+       _lineActor->GetProperty()->SetLineWidth(2);
+       _lineActor->GetProperty()->SetOpacity(0);
+    _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineActor );
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::RotationStart()
+{
+       vtkMPRBaseData  *mprbasedata = (vtkMPRBaseData*)this->GetVtkBaseData();
+       vtkTransform    *transform       = mprbasedata->GetTransformOrientation();
+       _transform1->SetMatrix( transform->GetMatrix() );
+}
+//-------------------------------------------------------------------
+void vtkPlane2DView::RotationDrag(double vx, double vy, bool ok_v, bool ok_ang)
+{ 
+       if (ok_ang==false)
+       {
+               _ang =sqrt( vx*vx + vy*vy ) / 1.5;
+       }
+
+       if (ok_v==false){
+               _vxb=-vy;
+               _vyb=vx;
+       }
+       _transform2->Identity();
+       _transform2->RotateWXYZ(_ang,0,_vxb,_vyb);
+
+       vtkMPRBaseData  *mprbasedata = (vtkMPRBaseData*)this->GetVtkBaseData();
+       vtkTransform *transform          =      vtkTransform::New();
+       transform->Identity();
+       transform->Concatenate(_transform1);
+       transform->Concatenate(_transform2);
+       mprbasedata->InitTransformOrientation(transform);
+       transform->Delete();
+
+       // Refresh Horizontal Line
+       _pts->SetPoint( 0 , (_sizeIma/2) - _vxb*2       , (_sizeIma/2) - _vyb*2 , 1 );
+       _pts->SetPoint( 1 , (_sizeIma/2) + _vxb*2       , (_sizeIma/2) + _vyb*2 , 1 );
+//     RefreshCircleLine();
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::Refresh(  )
+{
+       ExtractPlane();
+       wxVtkBaseView::Refresh();
+}
+//-------------------------------------------------------------------
+void vtkPlane2DView::SetImgSize( int imgSize )
+{
+       _sizeIma = imgSize;
+}
+//-------------------------------------------------------------------
+int vtkPlane2DView::GetImgSize()
+{
+       return _sizeIma;
+}
+//-------------------------------------------------------------------
+int    vtkPlane2DView::GetActualSlice()  // virtual 
+{
+       _cx = GetVtkmprbasedata()->GetX();
+       _cy = GetVtkmprbasedata()->GetY();
+       _cz = GetVtkmprbasedata()->GetZ();
+       return 0;
+}
+
+//-------------------------------------------------------------------
+
+bool vtkPlane2DView::GetMipVisualization()
+{
+       return _mip_visualization;
+}
+
+//-------------------------------------------------------------------
+int vtkPlane2DView::GetMipWidth()
+{
+       return _mip_width;
+}
+
+//-------------------------------------------------------------------
+void vtkPlane2DView::SetActualSlice(int slice)  // Virtual
+{
+       double dir=(double)slice/3.0;
+       GetVtkmprbasedata()->SetX( _cx + (_n[0]*dir) );
+       GetVtkmprbasedata()->SetY( _cy + (_n[1]*dir) );
+       GetVtkmprbasedata()->SetZ( _cz + (_n[2]*dir) );
+}
+//---------------------------------------------------------------------------
+vtkInteractorStylePlane2D      *vtkPlane2DView::GetInteractorstyleplane2D()
+{
+       return this->_interactorstyleplane2D;
+}
+//---------------------------------------------------------------------------
+void vtkPlane2DView::SetActive(bool active)
+{
+       _active = active;
+}
+
+//---------------------------------------------------------------------------
+
+void vtkPlane2DView::SetMipVisualization(bool ok)
+{
+       _mip_visualization=ok;
+}
+
+//---------------------------------------------------------------------------
+
+void vtkPlane2DView::SetMipWidth(int value)
+{
+       _mip_width=value;
+}
+
+//---------------------------------------------------------------------------
+void vtkPlane2DView::SetVisibleLine(bool ok)
+{
+       double opacity;
+       if (ok==true)
+       {
+               opacity=1;
+       } else {
+               opacity=0;
+       }
+       _lineActor->GetProperty()->SetOpacity(opacity);
+}
+// ----------------------------------------------------------------------------
+void vtkPlane2DView::TransfromeCoordViewWorld2(double &X, double &Y, double &Z)
+{
+       double spc[3];
+       GetVtkmprbasedata()->GetImageData()->GetSpacing(spc);
+
+       double xx = X;
+       double yy = Y;
+       double zz = 0;
+
+       TransfromeCoordScreenToWorld(xx,yy,zz);
+
+
+       vtkTransform *transf1 = vtkTransform::New();
+       transf1->Identity();
+       vtkTransform *transf2 = GetVtkmprbasedata()->GetTransformOrientation();
+       transf1->Concatenate(transf2->GetMatrix());
+       double in[4], out[4];
+       double center = GetImgSize() / 2;
+       in[0] = 0;
+       in[1] = xx - center;
+       in[2] = yy - center;
+       in[3] = 0;
+
+       transf1->MultiplyPoint(in,out);
+       transf1->Delete();
+
+       X = out[0] + GetVtkmprbasedata()->GetX() ;
+       Y = out[1] + GetVtkmprbasedata()->GetY() ;
+       Z = out[2] + GetVtkmprbasedata()->GetZ() ;
+
+}
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+vtkInfoTextImageInteractorPlane2D::vtkInfoTextImageInteractorPlane2D()
+{
+}
+//-------------------------------------------------------------------
+vtkInfoTextImageInteractorPlane2D::~vtkInfoTextImageInteractorPlane2D()
+{
+}
+//-------------------------------------------------------------------
+bool vtkInfoTextImageInteractorPlane2D::OnMouseMove()
+{
+       int X,Y;
+       wxVTKRenderWindowInteractor *wxVTKiren;
+       wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+       wxVTKiren->GetEventPosition(X,Y);
+
+       int z = (int) (_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetVtkBaseData()->GetZ());
+       double xx=X,yy=Y,zz=z;
+
+// --> dif
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_vtkInteractorStyleBaseView->GetWxVtk2DBaseView();
+       vtkplane2Dview->TransfromeCoordViewWorld2(xx,yy,zz);
+
+       GetVtkInfoTextImage()->PutWindowLevel();
+       GetVtkInfoTextImage()->PutColorLevel();
+       GetVtkInfoTextImage()->PutPosition( (int)xx , (int)yy , (int)zz );
+       GetVtkInfoTextImage()->PutPixelIntensity( (int)xx , (int)yy , (int)zz );
+
+       this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+       return true;
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+manualViewPerpPlaneContour::manualViewPerpPlaneContour()
+{
+}
+// ----------------------------------------------------------------------------
+manualViewPerpPlaneContour::~manualViewPerpPlaneContour()
+{
+}
+
+
+// ----------------------------------------------------------------------------
+manualViewPerpPlaneContour * manualViewPerpPlaneContour :: Clone()
+{
+       manualViewPerpPlaneContour * clone = new manualViewPerpPlaneContour();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void manualViewPerpPlaneContour::CopyAttributesTo( manualViewPerpPlaneContour * cloneObject)
+{
+       // Fathers object
+       manualViewContour::CopyAttributesTo(cloneObject);
+}
+
+
+
+
+// ----------------------------------------------------------------------------
+void manualViewPerpPlaneContour::UpdateViewPoint(int id)
+{  // virtual
+       double x,y,z;
+       manualPoint *mp = _manContModel->GetManualPoint(id);
+       x = mp->GetX();
+       y = mp->GetY();
+       z = mp->GetZ();
+       FilterCordinateXYZ(x,y,z);
+
+       _lstViewPoints[id]->SetPositionXY( x , y ,GetRange(), z );
+       if ((z>=-1) && (z<=1))
+       {
+               _lstViewPoints[id]->GetVtkActor()->VisibilityOn();
+       } else {
+               _lstViewPoints[id]->GetVtkActor()->VisibilityOff();
+       }
+}
+// ----------------------------------------------------------------------------
+void manualViewPerpPlaneContour::FilterCordinateXYZ (double &x, double &y, double &z)
+{
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
+       vtkMPRBaseData *vtkmprbasedata = vtkplane2Dview->GetVtkmprbasedata();
+       vtkTransform *transf1 = vtkTransform::New();
+       vtkTransform *transf2 = vtkmprbasedata->GetTransformOrientation();
+       transf1->SetMatrix( transf2->GetMatrix() ); 
+       transf1->Inverse();
+
+       double in[4], out[4];
+       double center = vtkplane2Dview->GetImgSize() / 2;
+
+       in[0] = x - vtkmprbasedata->GetX();
+       in[1] = y - vtkmprbasedata->GetY();
+       in[2] = z - vtkmprbasedata->GetZ();
+       in[3] = 0;
+
+       transf1->MultiplyPoint(in,out);
+       z = out[0];
+       x = out[1]+center;
+       y = out[2]+center;
+
+       double spc[3];
+       this->GetWxVtkBaseView()->GetSpacing(spc);
+       x = x / spc[0];
+       y = y / spc[1];
+       z = z / spc[2];
+
+       transf1->Delete();
+}
+
+// ----------------------------------------------------------------------------
+void manualViewPerpPlaneContour::TransfromeCoordViewWorld( double &X,double &Y,double &Z,int type )
+{
+       Z = 0;
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
+       vtkplane2Dview->TransfromeCoordViewWorld2(X,Y,Z);
+}
+
+
+// ----------------------------------------------------------------------------
+void manualViewPerpPlaneContour::RefreshContour() // virtual
+{
+//     manualViewContour::RefreshContour();
+
+       double pp1[3];
+       double pp2[3];
+       double u;
+               
+// JSTG 25-02-08 ----------------------------------------------------------
+//             tt;
+//--------------------------------------------------------
+
+       double pp[3];
+       double ppB[3];
+       double ppC[3];
+       ppB[0] = 999999;
+       double dist,distMin = 99999999;
+
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
+       double center = vtkplane2Dview->GetImgSize() / 2;
+
+       int i,np,nps;
+       np              = GetNumberOfPoints( );
+
+//JSTG 25-02-08 ------------------------------------------
+       //double t,delta;
+    //nps              = GetNumberOfPointsSpline(); 
+       nps = _manContModel->GetNumberOfPointsSpline();
+       //delta = ( double ) ( np  ) / ( double ) ( nps-1  );
+       _manContModel->UpdateSpline();
+//--------------------------------------------------------
+
+       if ( np >= 2 )
+       {
+               for( i = 0; i < nps; i++ ) 
+               {
+// JSTG 25-02-08 ----------------------------------------------------------
+                       //t     = delta * (double)i ;
+                       //tt    = delta * (double)(i+1) ;
+                       //_manContModel->GetSplinePoint(t ,pp1[0],pp1[1],pp1[2]);
+                       //_manContModel->GetSplinePoint(tt,pp2[0],pp2[1],pp2[2]);
+                       _manContModel->GetSpline_i_Point(i ,&pp1[0],&pp1[1],&pp1[2]);
+                       _manContModel->GetSpline_i_Point(i+1,&pp2[0],&pp2[1],&pp2[2]);
+//--------------------------------------------------------------------------
+                       FilterCordinateXYZ(pp1[0],pp1[1],pp1[2]);
+                       FilterCordinateXYZ(pp2[0],pp2[1],pp2[2]);
+                       if (pp2[2]*pp1[2]<=0)
+                       {
+                               if (pp1[2]-pp2[2]!=0) { 
+                                       u = -pp2[2] / (pp1[2]-pp2[2]);
+                               } else  {
+                                       u=9999999;
+                               }
+                               pp[0]    = ( pp1[0]-pp2[0] )*u + pp2[0];
+                               pp[1]    = ( pp1[1]-pp2[1] )*u + pp2[1];
+                               pp[2]    = ( pp1[2]-pp2[2] )*u + pp2[2];
+                               ppC[0] = pp[0] - center;
+                               ppC[1] = pp[1] - center;
+                               ppC[2] = pp[2] ;
+                               dist = sqrt( ppC[0]*ppC[0] + ppC[1]*ppC[1] + ppC[2]*ppC[2] );
+                               if (dist<distMin)
+                               {
+                                       distMin=dist;
+                                       ppB[0] = pp[0];
+                                       ppB[1] = pp[1];
+                                       ppB[2] = pp[2];
+                               }
+                       }
+
+               }// for 
+       } else {
+                       _pts->SetPoint(0, 0 , 0 , 0);   
+                       _pts->SetPoint(1, 0 , 0 , 0);   
+       } // if
+
+//EED 27 sep 2006
+       ppB[0]=ppB[0]*_spc[0];
+       ppB[1]=ppB[1]*_spc[1];
+
+       _pts->SetPoint( 0, ppB[0]   , ppB[1]+1 , 1 );   
+       _pts->SetPoint( 1, ppB[0]   , ppB[1]-1 , 1 );   
+       _pts->SetPoint( 2, ppB[0]   , ppB[1]   , 1 );   
+       _pts->SetPoint( 3, ppB[0]-1 , ppB[1]   , 1 );   
+       _pts->SetPoint( 4, ppB[0]+1 , ppB[1]   , 1 );   
+
+
+       for( i = 5; i < nps; i++ ) 
+       {
+               _pts->SetPoint( i, ppB[0] , ppB[1] , 1 );       
+       }
+
+}
+
+//---------------------------------------------------------------------------
+bool manualViewPerpPlaneContour::ifTouchContour( int x, int y, int z)
+{
+       bool ok=false;
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
+       double X=x;
+       double Y=y;
+       double Z=z;
+       vtkplane2Dview->TransfromeCoordScreenToWorld(X,Y,Z);
+       double ppA[3];
+       _pts->GetPoint(0, ppA);
+       if (sqrt( (ppA[0]-X)*(ppA[0]-X) + (ppA[1]-Y)*(ppA[1]-Y) ) <=2)
+       {
+               ok = true;
+       }
+       return ok;
+}
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+vtkInteractorStyleMPRView::vtkInteractorStyleMPRView()
+{
+       _stateMoveAxisX = false;
+       _stateMoveAxisY = false;
+       _stateMoveAxisZ = false;
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyleMPRView::~vtkInteractorStyleMPRView()
+{
+}
+
+
+//---------------------------------------------------------------------------
+bool  vtkInteractorStyleMPRView::OnLeftDClick () // virtual
+{
+       wxVtkMPR2DView *wxvtkmpr2Dview = (wxVtkMPR2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+       double x = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       double y = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+       double z = 1;
+       _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
+       wxvtkmpr2Dview->MoveX(x,y,z);
+       wxvtkmpr2Dview->MoveY(x,y,z);
+       wxvtkmpr2Dview->MoveZ(x,y,z);
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+       wxCommandEvent newevent2(wxEVT_COMMAND_MENU_SELECTED,12122);  // Doble click
+       wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent2);
+
+       return true;
+}
+//---------------------------------------------------------------------------
+bool  vtkInteractorStyleMPRView::OnLeftButtonDown () 
+{
+       wxVtkMPR2DView *wxvtkmpr2Dview = (wxVtkMPR2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+       double x        = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       double y        = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+       double z        = 1;
+       double xx       = x;
+       double yy       = y;
+       _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
+
+/*EED Borrame
+       if ((_xBack==xx) && (_yBack==yy))
+       {
+               wxvtkmpr2Dview->MoveX(x,y,z);
+               wxvtkmpr2Dview->MoveY(x,y,z);
+               wxvtkmpr2Dview->MoveZ(x,y,z);
+               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+               wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+               wxCommandEvent newevent2(wxEVT_COMMAND_MENU_SELECTED,12122);  // Doble click
+               wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent2);
+       }
+
+       _xBack=xx;      
+       _yBack=yy;
+*/
+
+       _stateMoveAxisX = wxvtkmpr2Dview->IfMouseTouchX(x,y,z);
+       _stateMoveAxisY = wxvtkmpr2Dview->IfMouseTouchY(x,y,z);
+       _stateMoveAxisZ = wxvtkmpr2Dview->IfMouseTouchZ(x,y,z);
+
+       return true;
+}
+//---------------------------------------------------------------------------
+bool  vtkInteractorStyleMPRView::OnLeftButtonUp () 
+{
+       if (_stateMoveAxisX==true) 
+       {
+               _stateMoveAxisX=false;
+       }
+       if (_stateMoveAxisY==true) 
+       {
+               _stateMoveAxisY=false;
+       }
+       if (_stateMoveAxisZ==true) 
+       {
+               _stateMoveAxisZ=false;
+       }
+       return true;
+}
+//---------------------------------------------------------------------------
+bool  vtkInteractorStyleMPRView::OnMouseMove () 
+{
+       double x = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       double y = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+
+       double z=1;
+       _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
+       wxVtkMPR2DView *wxvtkmpr2Dview = (wxVtkMPR2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
+//     wxvtkmpr2Dview->TransfromeCoordViewWorld(x,y,z);            
+
+       wxvtkmpr2Dview->ChangeAxisColor(x,y,z);
+
+       if ((_stateMoveAxisX==true) || (_stateMoveAxisY==true)  || (_stateMoveAxisZ==true) )
+       {
+               if (_stateMoveAxisX==true) 
+               {
+                       wxvtkmpr2Dview-> MoveX(x,y,z);
+               }
+               if (_stateMoveAxisY==true) 
+               {
+                       wxvtkmpr2Dview->MoveY(x,y,z);
+               }
+               if (_stateMoveAxisZ==true) 
+               {
+                       wxvtkmpr2Dview->MoveZ(x,y,z);
+               }
+
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+       }
+       return true;
+}
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxVtkMPR2DView::wxVtkMPR2DView( wxWindow *parent, int direction)
+ :wxVtk2DBaseView(parent)
+{
+       _backX                  = -99999;
+       _backY                  = -99999;
+       _backZ                  = -99999;
+       _direction              = direction;
+       _ptsA                   = NULL;
+       _lineAActor             = NULL;
+       _lineAMapper    = NULL;
+       _pdA                    = NULL;
+       _ptsB                   = NULL;
+       _lineBActor             = NULL;
+       _lineBMapper    = NULL;
+       _pdB                    = NULL;
+}
+
+//-------------------------------------------------------------------
+wxVtkMPR2DView::~wxVtkMPR2DView()
+{
+       if (_ptsA!=NULL)        { _ptsA         -> Delete(); }
+       if (_lineAActor!=NULL)  { _lineAActor   -> Delete(); }
+       if (_lineAMapper!=NULL) { _lineAMapper  -> Delete(); }
+       if (_pdA!=NULL)         { _pdA          -> Delete(); }
+       if (_ptsB!=NULL)        { _ptsB         -> Delete(); }
+       if (_lineBActor!=NULL)  { _lineBActor   -> Delete(); }
+       if (_lineBMapper!=NULL) { _lineBMapper  -> Delete(); }
+       if (_pdB!=NULL)         { _pdB          -> Delete(); }
+}
+//-------------------------------------------------------------------
+vtkMPRBaseData *wxVtkMPR2DView::GetVtkmprbasedata()
+{
+       return (vtkMPRBaseData*)GetVtkBaseData();
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::Configure(){
+       wxVtk2DBaseView::Configure();
+
+
+       _interactorstylemprview = new vtkInteractorStyleMPRView();
+       GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _interactorstylemprview );
+
+       int x1,x2,y1,y2,z1,z2;
+       GetVtkmprbasedata()     -> GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
+
+       double spc[3];
+       GetVtkmprbasedata()->GetImageData()->GetSpacing(spc);
+       x1 = (int)(x1*spc[0]);
+       y1 = (int)(y1*spc[1]);
+       z1 = (int)(z1*spc[2]);
+
+       x2 = (int)(x2*spc[0]);
+       y2 = (int)(y2*spc[1]);
+       z2 = (int)(z2*spc[2]);
+
+       _visibleAxis = true;
+
+// Axe A
+       _ptsA = vtkPoints::New();
+       _ptsA->SetNumberOfPoints(2);
+       _ptsA->SetPoint(0, -1000        , -1000 , -1000 );
+       _ptsA->SetPoint(1,  1000        ,  1000 ,  1000 );
+       vtkCellArray *linesA;
+       linesA = vtkCellArray::New();
+       linesA->InsertNextCell(2);
+       linesA->InsertCellPoint(0);
+       linesA->InsertCellPoint(1);
+       _pdA = vtkPolyData::New();
+    _pdA->SetPoints( _ptsA );
+    _pdA->SetLines( linesA );
+       linesA->Delete();  //do not delete lines ??
+       _lineAActor                                             =       vtkActor::New();
+    _lineAMapper                                       =       vtkPolyDataMapper::New();
+       _lineAMapper->SetInput(_pdA);
+       _lineAMapper->ImmediateModeRenderingOn();
+       _lineAActor->SetMapper(_lineAMapper);
+       _lineAActor->GetProperty()->BackfaceCullingOn();
+       _lineAActor->GetProperty()->SetDiffuseColor(1,0,0);
+       _lineAActor->GetProperty()->SetLineWidth(2);
+    _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
+
+// Axe B
+       _ptsB = vtkPoints::New();
+       _ptsB->SetNumberOfPoints(2);
+       _ptsB->SetPoint(0, -1000        , -1000 , -1000 );
+       _ptsB->SetPoint(1,  1000        ,  1000 ,  1000 );
+       vtkCellArray *linesB;
+       linesB = vtkCellArray::New();
+       linesB->InsertNextCell(2);
+       linesB->InsertCellPoint(0);
+       linesB->InsertCellPoint(1);
+       _pdB = vtkPolyData::New();
+    _pdB->SetPoints( _ptsB );
+    _pdB->SetLines( linesB );
+       linesB->Delete();  //do not delete lines ??
+       _lineBActor                                             =       vtkActor::New();
+    _lineBMapper                                       =       vtkPolyDataMapper::New();
+       _lineBMapper->SetInput(_pdB);
+       _lineBMapper->ImmediateModeRenderingOn();
+       _lineBActor->SetMapper(_lineBMapper);
+       _lineBActor->GetProperty()->BackfaceCullingOn();
+       _lineBActor->GetProperty()->SetDiffuseColor(1,0,0);
+       _lineBActor->GetProperty()->SetLineWidth(2);
+    _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
+
+       vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
+       if (_direction==0) {
+           camera->SetViewUp           (   0   ,    -1         ,     0         );
+               camera->SetPosition             ( -10000,(y1+y2)/2      , (z1+z2)/2     ); 
+               camera->SetFocalPoint   (   0   , (y1+y2)/2     , (z1+z2)/2     );
+               camera->SetParallelScale( (z2-z1)/3.0 );
+       }
+
+       if (_direction==1) { 
+           camera->SetViewUp           (       0               ,       0       ,       -1              );
+               camera->SetPosition             ((x1+x2)/2      , 10000 , (z1+z2)/2     ); 
+               camera->SetFocalPoint   ((x1+x2)/2      ,   0   , (z1+z2)/2     );
+               camera->SetParallelScale( (x2-x1)/3.0 );
+       }
+
+       if (_direction==2) { 
+           camera->SetViewUp           (       0               ,       -1              ,       0       );
+               camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     , -10000); 
+               camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       ); 
+               camera->SetParallelScale( (x2-x1)/3.0 );
+       }
+
+
+
+//     _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow (160);
+//     _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel (800);
+
+}
+
+void wxVtkMPR2DView::SetVisibleAxis(bool ok)
+{
+       if (ok!=_visibleAxis)
+       {
+               _visibleAxis=ok;
+               if (_visibleAxis==true)
+               {
+                       _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
+                       _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
+               }
+               if (_visibleAxis==false)
+               {
+                       _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineAActor );
+                       _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineBActor );
+               }
+
+       }
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::Refresh() 
+{
+       //wxVtk2DBaseView::Refresh();
+
+
+       vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2();
+       vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera();
+
+
+
+       int x1,x2,y1,y2,z1,z2;
+       GetVtkmprbasedata()->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
+       double spc[3];
+       GetVtkmprbasedata()->GetImageData()->GetSpacing(spc);
+       x1 =  (int)(x1*spc[0]);
+       y1 =  (int)(y1*spc[1]);
+       z1 =  (int)(z1*spc[2]);
+
+       x2 =  (int)(x2*spc[0]);
+       y2 =  (int)(y2*spc[1]);
+       z2 =  (int)(z2*spc[2]);
+
+       int x = (int)(GetVtkmprbasedata()->GetX());
+       int y = (int)(GetVtkmprbasedata()->GetY());
+       int z = (int)(GetVtkmprbasedata()->GetZ());
+
+       x =  (int)(x*spc[0]);
+       y =  (int)(y*spc[1]);
+       z =  (int)(z*spc[2]);
+
+
+
+       if ((x!=_backX) || (y!=_backY) || (z!=_backZ)) {
+
+               if (_direction==0) { 
+                       _imageViewer2XYZ->SetXSlice( (int)(GetVtkmprbasedata()->GetX()) ); 
+                       _ptsA->SetPoint(0, -x2, y1  , z );
+                       _ptsA->SetPoint(1, -x2, y2  , z );
+                       _ptsB->SetPoint(0, -x2, y   , z1);
+                       _ptsB->SetPoint(1, -x2, y   , z2);
+               }
+               if (_direction==1) { 
+                       _imageViewer2XYZ->SetYSlice( (int)(GetVtkmprbasedata()->GetY()) ); 
+                       _ptsA->SetPoint(0, x1 , y2 , z );
+                       _ptsA->SetPoint(1, x2 , y2 , z );
+                       _ptsB->SetPoint(0, x  , y2 , z1);
+                       _ptsB->SetPoint(1, x  , y2 , z2);
+               }
+               if (_direction==2) { 
+                       _imageViewer2XYZ->SetZSlice( (int)(GetVtkmprbasedata()->GetZ()) ); 
+                       _ptsA->SetPoint(0, x1 , y , -z2 );
+                       _ptsA->SetPoint(1, x2 , y , -z2 );
+                       _ptsB->SetPoint(0, x  , y1, -z2 );
+                       _ptsB->SetPoint(1, x  , y2, -z2 );
+               }
+               _backX=x;
+               _backY=y;
+               _backZ=z;
+       }
+       wxVtkBaseView::Refresh();
+}
+//-------------------------------------------------------------------
+int wxVtkMPR2DView::GetActualSlice()   // virtual
+{
+       int result;
+       if (_direction==0) 
+       { 
+               result = (int)(GetVtkmprbasedata()->GetX());
+       }
+       if (_direction==1) 
+       { 
+               result = (int)(GetVtkmprbasedata()->GetY());
+       }
+       if (_direction==2) 
+       { 
+               result = (int)(GetVtkmprbasedata()->GetZ());
+       }
+       return result;
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::SetActualSlice(int slice)   // virtual
+{
+       if (_direction==0) 
+       { 
+               GetVtkmprbasedata()->SetX(slice);
+       }
+       if (_direction==1) 
+       { 
+               GetVtkmprbasedata()->SetY(slice);
+       }
+       if (_direction==2) 
+       { 
+               GetVtkmprbasedata()->SetZ(slice);
+       }
+}
+//-------------------------------------------------------------------
+bool wxVtkMPR2DView::IfMouseTouchX(double x, double y, double z)
+{
+       double delta=5;
+       bool result=false;
+       if (_direction==0) 
+       { 
+       }
+       if (_direction==1) 
+       { 
+               if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
+               {
+                       result = true;
+               }
+       }
+       if (_direction==2) 
+       { 
+               if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
+               {
+                       result = true;
+               }
+       }
+       return result;
+}
+//-------------------------------------------------------------------
+bool wxVtkMPR2DView::IfMouseTouchY(double x, double y, double z)
+{
+       double delta=5;
+       bool result=false;
+       if (_direction==0) 
+       { 
+               if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
+               {
+                       result = true;
+               }
+       }
+       if (_direction==1) 
+       { 
+       }
+       if (_direction==2) 
+       { 
+               if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
+               {
+                       result = true;
+               }
+       }
+       return result;
+}
+//-------------------------------------------------------------------
+bool wxVtkMPR2DView::IfMouseTouchZ(double x, double y, double z)
+{
+       double delta=5;
+       bool result=false;
+       if (_direction==0) 
+       { 
+               if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
+               {
+                       result = true;
+               }
+       }
+       if (_direction==1) 
+       { 
+               if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
+               {
+                       result = true;
+               }
+       }
+       if (_direction==2) 
+       { 
+       }
+       return result;
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::MoveX(double x, double y, double z)
+{
+       if (_direction==0) 
+       { 
+       }
+       if (_direction==1) 
+       { 
+               GetVtkmprbasedata()->SetX(x);
+       }
+       if (_direction==2) 
+       { 
+               GetVtkmprbasedata()->SetX(x);
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::MoveY(double x, double y, double z)
+{
+       if (_direction==0) 
+       { 
+               GetVtkmprbasedata()->SetY(y);
+       }
+       if (_direction==1) 
+       { 
+       }
+       if (_direction==2) 
+       { 
+               GetVtkmprbasedata()->SetY(y);
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::MoveZ(double x, double y, double z)
+{
+       if (_direction==0) 
+       { 
+               GetVtkmprbasedata()->SetZ(z);
+       }
+       if (_direction==1) 
+       { 
+               GetVtkmprbasedata()->SetZ(z);
+       }
+       if (_direction==2) 
+       { 
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::ChangeAxisColor(double x, double y, double z)
+{
+       double c1r=1,c1g=1,c1b=0;
+       double c2r=1,c2g=0,c2b=0;
+
+       if (_direction==0) 
+       { 
+               if (IfMouseTouchY(x,y,z)==true)
+               {
+                       _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
+               } else {
+                       _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
+               }
+               if (IfMouseTouchZ(x,y,z)==true)
+               {
+                       _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
+               } else {
+                       _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
+               }
+       }
+
+       if (_direction==1) 
+       { 
+               if (IfMouseTouchX(x,y,z)==true)
+               {
+                       _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
+               } else {
+                       _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
+               }
+               if (IfMouseTouchZ(x,y,z)==true)
+               {
+                       _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
+               } else {
+                       _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
+               }
+       }
+
+       if (_direction==2) 
+       { 
+               if (IfMouseTouchX(x,y,z)==true)
+               {
+                       _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
+               } else {
+                       _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
+               }
+               if (IfMouseTouchY(x,y,z)==true)
+               {
+                       _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
+               } else {
+                       _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
+               }
+       }
+       Refresh();
+}
+//-------------------------------------------------------------------
+void wxVtkMPR2DView::TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type) // virtual 
+{
+       wxVtkBaseView::TransfromeCoordScreenToWorld(X,Y,Z,_direction);
+
+       if (_direction==0)
+       {
+               X = ((vtkMPRBaseData*)GetVtkBaseData())->GetX();
+       }
+       if (_direction==1)
+       {
+               Y = ((vtkMPRBaseData*)GetVtkBaseData())->GetY();
+       }
+       if (_direction==2)
+       {
+               Z = ((vtkMPRBaseData*)GetVtkBaseData())->GetZ();
+       }
+}
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//void boxVolumeObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
+//     if (eventId==vtkCommand::StartInteractionEvent){
+//             _renWin->SetDesiredUpdateRate(10);
+//     }
+//     if (eventId==vtkCommand::InteractionEvent){
+//             _renWin->SetDesiredUpdateRate(0.001);
+//     }
+//     if (eventId==vtkCommand::EndInteractionEvent){
+//             vtkPlanes *planes = vtkPlanes::New();
+//             vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
+//             boxwidget->GetPlanes(planes);
+//             _volumeMapper->SetClippingPlanes(planes);
+//             planes -> Delete();
+//     }
+//}
+
+//-------------------------------------------------------------------
+//void boxVolumeObserver::SetRenWin( vtkRenderWindow *renWin ){
+//     _renWin = renWin;
+//}
+//-------------------------------------------------------------------
+//void boxVolumeObserver::SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper){
+//     _volumeMapper = volumeMapper;
+//}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+// EED 9 fev 2007
+void boxSurfaceObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
+       vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
+       boxwidget->GetPlanes(_planes);
+
+       if ( _vtkVolumeRayCastMapper != NULL )
+       {
+               _vtkVolumeRayCastMapper->RemoveAllClippingPlanes();
+//             vtkPlanes *planes = vtkPlanes::New();
+//             boxwidget->GetPlanes(planes);
+//             _vtkVolumeRayCastMapper->SetClippingPlanes(planes);
+               _vtkVolumeRayCastMapper->SetClippingPlanes(_planes);
+       }
+
+//     _actor->VisibilityOn();
+
+}
+//-------------------------------------------------------------------
+void boxSurfaceObserver::SetPlanes(vtkPlanes *planes){
+       _planes = planes;
+}
+//-------------------------------------------------------------------
+void boxSurfaceObserver::SetActor(vtkProp *actor){
+       _actor = actor;
+}
+
+//-------------------------------------------------------------------
+void boxSurfaceObserver::SetvtkVolumeRayCastMapper(vtkVolumeRayCastMapper *vtkvolumeraycastmapper)
+{
+       _vtkVolumeRayCastMapper = vtkvolumeraycastmapper;
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxVtkMPR3DViewCntrlPanel::wxVtkMPR3DViewCntrlPanel(wxWindow *parent, wxVtkMPR3DView *wxvtkmpr3Dview )
+: wxPanel(parent, -1)
+{
+
+       wxPanel *panel  = this;
+       _wxvtkmpr3Dview = wxvtkmpr3Dview;
+
+       int maxX = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionX();
+       int maxY = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionY();
+       int maxZ = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionZ();
+       wxCheckBox              *ckBoxX                 = new wxCheckBox(panel,-1,_T("X           "));
+                                       _positionX              = new wxSlider(panel,-1,maxX/2,0,maxX, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
+       wxCheckBox              *ckBoxY                 = new wxCheckBox(panel,-1,_T("Y           "));
+                                       _positionY              = new wxSlider(panel,-1,maxY/2,0,maxY, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
+       wxCheckBox              *ckBoxZ                 = new wxCheckBox(panel,-1,_T("Z           "));
+                                       _positionZ              = new wxSlider(panel,-1,maxZ/2,0,maxZ, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
+       wxButton                *btnColorTable  = new wxButton (panel, -1, _T("Edit Color Table") );
+
+       _ckBoxXYZ                       = new wxCheckBox(panel,-1,_T("XYZ                  "));
+       _ckBoxPlane                     = new wxCheckBox(panel,-1,_T("Plane"));
+
+       ckBoxX->SetValue(false);
+       ckBoxY->SetValue(false);
+       ckBoxZ->SetValue(false);
+       _ckBoxXYZ->SetValue(true);
+       _ckBoxPlane->SetValue(false);
+
+       _positionX->SetSize(400,20);
+       _positionY->SetSize(400,20);
+       _positionZ->SetSize(400,20);
+
+       Connect(ckBoxX->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX   );
+       Connect(_positionX->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionX              );
+       Connect(ckBoxY->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY   );
+       Connect(_positionY->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionY              );
+       Connect(ckBoxZ->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ   );
+       Connect(_positionZ->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionZ              );
+       Connect(btnColorTable->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnEditColorTable );
+
+       Connect(_ckBoxXYZ->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisXYZ );
+       Connect(_ckBoxPlane->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisiblePlane   );
+
+
+       wxFlexGridSizer *sizer   = new wxFlexGridSizer(1);
+//     wxBoxSizer *sizer        = new wxBoxSizer(wxVERTICAL);
+
+//     wxBoxSizer *sizerH4 = new wxBoxSizer(wxHORIZONTAL);
+       wxFlexGridSizer *sizerH4 = new wxFlexGridSizer(10);
+       wxFlexGridSizer *sizerH5 = new wxFlexGridSizer(10);
+
+
+
+//EED 28 sep 2006
+//     wxFlexGridSizer *sizerH6 = new wxFlexGridSizer(10);
+//     wxFlexGridSizer *sizerH7 = new wxFlexGridSizer(10);
+
+//     sizerH4->Add( ckBoxX            , 1, wxALL|wxEXPAND, 0);
+//     sizerH4->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
+//     sizerH4->Add( _positionX        , 1, wxALL|wxEXPAND, 0);
+
+//     sizerH5->Add( ckBoxY            , 1, wxALL|wxEXPAND, 0);
+//     sizerH5->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
+//     sizerH5->Add( _positionY        , 1, wxALL|wxEXPAND, 0);
+
+//     sizerH6->Add( ckBoxZ            , 1, wxALL|wxEXPAND, 0);
+//     sizerH6->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
+//     sizerH6->Add( _positionZ        , 1, wxALL|wxEXPAND, 0);
+
+//     sizerH7->Add( _ckBoxXYZ         , 1, wxALL|wxEXPAND, 0);
+//     sizerH7->Add( _ckBoxPlane       , 1, wxALL|wxEXPAND, 0);
+
+//     sizer->Add( sizerH4                     , 1, wxALL|wxEXPAND, 2);
+//     sizer->Add( sizerH5                     , 1, wxALL|wxEXPAND, 2);
+//     sizer->Add( sizerH6                     , 1, wxALL|wxEXPAND, 2);
+//     sizer->Add( sizerH7                     , 1, wxALL|wxEXPAND, 2);
+
+       sizerH4->Add( _positionX                                                                ,1,wxGROW                                       , 0 );
+       sizerH4->Add( ckBoxX                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
+       sizerH4->Add( _positionY                                                                ,1,wxGROW                                       , 0 );
+       sizerH4->Add( ckBoxY                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
+       sizerH4->Add( _positionZ                                                                ,1,wxGROW                                       , 0 );
+       sizerH4->Add( ckBoxZ                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
+       sizerH4->Add( btnColorTable                                                             ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
+
+       sizerH5->Add( _ckBoxXYZ                         ,  1, wxALL|wxEXPAND, 0);
+       sizerH5->Add( _ckBoxPlane                       ,  1, wxALL|wxEXPAND, 0);
+       sizerH5->Add( new wxStaticText(panel, -1,_T("      "))                  , 1, wxALL|wxEXPAND, 0);
+//     sizerH5->Add( ckBoxX                            ,  1, wxALL|wxEXPAND, 0);
+//     sizerH5->Add( ckBoxY                            ,  1, wxALL|wxEXPAND, 0);
+//     sizerH5->Add( ckBoxZ                            ,  1, wxALL|wxEXPAND, 0);
+
+       sizer->Add( sizerH4                                     ,  1, wxALL|wxGROW, 2);
+       sizer->Add( sizerH5                                     ,  1, wxALL|wxEXPAND, 2);
+
+
+       panel->SetSize(400,50);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->Layout();
+
+       panel->SetEventHandler((wxEvtHandler*)this);
+
+}
+//-------------------------------------------------------------------
+wxVtkMPR3DViewCntrlPanel::~wxVtkMPR3DViewCntrlPanel()
+{
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::Refresh()
+{
+//     wxPanel::Refresh();
+       _positionX->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX( )) );
+       _positionY->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY( )) );
+       _positionZ->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ( )) );
+}
+/*
+//-------------------------------------------------------------------
+int wxVtkMPR3DViewCntrlPanel::GetIdTissue()
+{
+       int idTissue=-1;
+       if (_surfA->GetValue()==true)
+       {
+               idTissue=0;
+       }
+       if (_surfB->GetValue()==true)
+       {
+               idTissue=1;
+       }
+       if (_surfC->GetValue()==true)
+       {
+               idTissue=2;
+       }
+       if (_surfD->GetValue()==true)
+       {
+               idTissue=3;
+       }
+
+       return idTissue;
+}
+*/
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnEditColorTable(wxCommandEvent& event)
+{
+
+       vtkColorTransferFunction *ctfun                 = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetvtkColorTransferFunction(); 
+       std::vector<double> *ctfunVectorPoint   = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorPoint();
+       std::vector<double> *ctfunVectorRed             = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorRed();
+       std::vector<double> *ctfunVectorGreen   = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorGreen();
+       std::vector<double> *ctfunVectorBlue    =   this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorBlue();
+
+       void *p=this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer();
+
+
+       int i=0,xi,r,g,b;
+       
+       vtkImageData *imagedata = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+
+       HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Color table"),imagedata,2);
+       
+               
+       hDlg->erasePointsTransferenceFunction();        
+       int ctfSize=ctfunVectorRed->size();
+       if(ctfSize>0)
+       {
+// MACHETE  OJO Eduardo
+               int i=0;
+                       while(i<ctfSize)
+                       {
+                               double gr       = (*ctfunVectorPoint)[i];
+                               double r        = (*ctfunVectorRed)[i];
+                               double g        = (*ctfunVectorGreen)[i];
+                               double b        = (*ctfunVectorBlue)[i];
+                               hDlg->addColorPoint(gr,r*255,g*255,b*255);
+                               i++;
+                       }
+       }
+
+       //
+       // when the user had changed the transference Function
+       //
+       
+       //setting variables if the user wants to do refresh
+       
+       hDlg->setCTF(ctfun);
+       hDlg->setMPR3Dview(_wxvtkmpr3Dview);
+       
+       if(hDlg->ShowModal()== wxID_OK )
+       {       
+               
+               // -- vtkColorTransferFunction  --
+                       ctfun->RemoveAllPoints ();
+                       //clean colors
+                       ctfunVectorPoint->clear();
+                       ctfunVectorRed->clear();
+                       ctfunVectorGreen->clear();
+                       ctfunVectorBlue->clear();
+
+                       int nCTFpoints=hDlg->getSizeBarColor();
+// Machete .. Ojo Eduardo
+                       i=0;    
+                       while(i<nCTFpoints)
+                       {
+                               hDlg->getDataBarColorPoint(i,xi,r,g,b);
+                               /*
+                               if (i==0)
+                               {
+                                       hDlg->getDataBarColorPoint(1,xi,r,g,b);
+                               } 
+                               if (i==nCTFpoints)
+                               {
+                                       hDlg->getDataBarColorPoint(i-1,xi,r,g,b);
+                               } 
+                               */
+                               ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
+                               ctfunVectorPoint->push_back(xi);
+                               ctfunVectorRed->push_back(r/255.0);
+                               ctfunVectorGreen->push_back(g/255.0);
+                               ctfunVectorBlue->push_back(b/255.0);
+                               i++;
+                               
+                       }
+                       
+       }
+       
+       else
+       {
+               
+               if(hDlg->getRefreshed())
+               {
+                       // -- vtkColorTransferFunction  --
+                       ctfun->RemoveAllPoints ();
+                       
+                       int i=0;
+                       int size=ctfunVectorPoint->size();
+                       
+                       for(i=0;i<size;i++)
+                       {
+                               double grey2=(*ctfunVectorPoint)[i];
+                               double red =(*ctfunVectorRed)[i];
+                               double green =(*ctfunVectorGreen)[i];
+                               double blue = (*ctfunVectorBlue)[i];
+                               ctfun->AddRGBPoint(grey2,red,green,blue);
+                       }
+                }      
+                
+       }
+
+ hDlg->Destroy();
+}
+
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX(wxCommandEvent& event)
+{
+       _wxvtkmpr3Dview->VisibleImageActor(0, event.IsChecked() );
+       _wxvtkmpr3Dview->Refresh();
+
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY(wxCommandEvent& event)
+{
+       _wxvtkmpr3Dview->VisibleImageActor(1, event.IsChecked() );
+       _wxvtkmpr3Dview->Refresh();
+
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ(wxCommandEvent& event)
+{
+       _wxvtkmpr3Dview->VisibleImageActor(2, event.IsChecked() );
+       _wxvtkmpr3Dview->Refresh();
+
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisXYZ(wxCommandEvent& event)
+{
+       _wxvtkmpr3Dview->VisiblePointWidget(event.IsChecked());
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnVisiblePlane(wxCommandEvent& event)
+{
+       _wxvtkmpr3Dview->VisiblePlaneWidget(event.IsChecked());
+}
+
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnPositionX(wxScrollEvent& event)
+{
+       _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( _positionX->GetValue() );
+       _wxvtkmpr3Dview->RefreshView();
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnPositionY(wxScrollEvent& event)
+{
+       _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( _positionY->GetValue() );
+       _wxvtkmpr3Dview->RefreshView();
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DViewCntrlPanel::OnPositionZ(wxScrollEvent& event)
+{
+       _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( _positionZ->GetValue() );
+       _wxvtkmpr3Dview->RefreshView();
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxVtkClipping3DViewCntrlPanel::wxVtkClipping3DViewCntrlPanel(wxWindow *parent, wxVtkClipping3DView *wxvtkclipping3Dview )
+: wxPanel(parent, -1)
+{
+       wxPanel *panel  = this;
+       _wxvtkclipping3Dview    = wxvtkclipping3Dview;
+
+//EEDx2.6
+//     wxStaticText    *text1                  = new wxStaticText(panel, -1,_T("          "));
+//     wxStaticText    *text2                  = new wxStaticText(panel, -1,_T("  "));
+
+                                       _surfA                  = new wxRadioButton(panel,-1,_T("A"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
+                                       _surfB                  = new wxRadioButton(panel,-1,_T("B"));
+                                       _surfC                  = new wxRadioButton(panel,-1,_T("C"));
+                                       _surfD                  = new wxRadioButton(panel,-1,_T("D"));
+
+       wxCheckBox              *ckVolum                = new wxCheckBox(panel,-1,_T("Vol"));
+       wxCheckBox              *ckBoxSurface   = new wxCheckBox(panel,-1,_T("Surface Box"));
+       wxCheckBox              *ckBoxVolume    = new wxCheckBox(panel,-1,_T("Volume Box"));
+
+                                       _color                  = new wxButton(panel,-1,_T(""));
+                                       _visible                = new wxCheckBox(panel,-1,_T("Vis"));
+                                       _opacity                = new wxSlider(panel,-1,50,0,100, wxDefaultPosition, wxSize(800,40), wxSL_HORIZONTAL | wxSL_LABELS);
+
+       wxStaticText    *isoValueTitle  = new wxStaticText(panel,-1,_T("isoValue"));
+                                       _isoValue               = new wxSlider(panel,-1,2000,110,2000, wxDefaultPosition, wxSize(800,40), wxSL_HORIZONTAL  |  wxSL_AUTOTICKS | wxSL_LABELS);
+
+
+                                       _wireFrameRep   = new wxRadioButton(panel,-1,_T("WireFrame"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
+                                       _surfaceRep             = new wxRadioButton(panel,-1,_T("Surface"));
+
+
+       double range[2];
+       vtkImageData *vtkimagedata = wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+       vtkimagedata->GetScalarRange( range );
+       _isoValue->SetRange( (int)(range[1]*0.1) , (int)(range[1]) );
+       _isoValue->SetValue( (int)(wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIsovalue(0)) );
+
+
+       _isoValue->SetTickFreq(25,0);
+
+       _isoValueSpin   = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
+       _isoValueSpin->SetRange(1,8);
+       _isoValueSpin->SetValue(5);
+       Connect(_isoValueSpin->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValueSpin ); 
+
+       wxButton *btnSTL                                = new wxButton(panel,-1,_T("Create STL File"));
+       wxButton *btnSaveRaw                    = new wxButton(panel,-1,_T("Save Raw Volume"));
+
+       wxButton *btnVolumeFunctions    = new wxButton(panel,-1,_T("Read Volume Functions"));
+
+
+       Connect(btnSTL->GetId()                         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnCreateFileSTL    ); 
+       Connect(btnSaveRaw->GetId()                     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnSaveRawVolume    ); 
+       Connect(btnVolumeFunctions->GetId()     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnVolumeFunctions  ); 
+
+
+       wxButton *btnMeshVTKLoad        = new wxButton(panel,-1,_T("Load Mesh"));
+       Connect(btnMeshVTKLoad->GetId() , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnMeshVTKLoad      ); 
+
+
+/*
+       int maxX = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionX();
+       int maxY = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionY();
+       int maxZ = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionZ();
+       wxCheckBox              *ckBoxX                 = new wxCheckBox(panel,-1,"X");
+                                       _positionX              = new wxSlider(panel,-1,maxX/2,0,maxX, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       wxCheckBox              *ckBoxY                 = new wxCheckBox(panel,-1,"Y");
+                                       _positionY              = new wxSlider(panel,-1,maxY/2,0,maxY, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       wxCheckBox              *ckBoxZ                 = new wxCheckBox(panel,-1,"Z");
+                                       _positionZ              = new wxSlider(panel,-1,maxZ/2,0,maxZ, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+*/
+
+//     ckVolum->Enable(false);
+       ckBoxSurface->SetValue(false);
+       ckBoxVolume->SetValue(false);
+       _color->SetSize(40,20);
+       _opacity->SetSize(370,20);
+//     ckBoxX->SetValue(true);
+//     ckBoxY->SetValue(true);
+//     ckBoxZ->SetValue(true);
+       _surfA->SetValue(true);
+       _wireFrameRep->SetValue(false);
+       _surfaceRep->SetValue(true);
+       _visible->SetValue(false);
+//     _positionX->SetSize(400,20);
+//     _positionY->SetSize(400,20);
+//     _positionZ->SetSize(400,20);
+
+       Connect(ckVolum->GetId()                , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleVolume                             );
+       Connect(ckBoxVolume->GetId()    , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleBoxVolume                  );
+
+       Connect(_surfA->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
+       Connect(_surfB->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
+       Connect(_surfC->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
+       Connect(_surfD->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
+       Connect(ckBoxSurface->GetId()   , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleBoxSurface                 );
+
+       Connect(_wireFrameRep->GetId()  , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame        );
+       Connect(_surfaceRep->GetId()    , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame        );
+
+       Connect(_color->GetId()                 , wxEVT_COMMAND_BUTTON_CLICKED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnColor                                             );
+       Connect(_visible->GetId()               , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleSurface                    );
+       Connect(_opacity->GetId()               , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnOpacity                                   );
+
+//EED 27Dic2007
+//     Connect(_isoValue->GetId()              , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValue                                  );
+       Connect(_isoValue->GetId()              , wxEVT_SCROLL_THUMBRELEASE               , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValue                                          );
+
+/*
+       Connect(ckBoxX->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX   );
+       Connect(_positionX->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionX              );
+       Connect(ckBoxY->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY   );
+       Connect(_positionY->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionY              );
+       Connect(ckBoxZ->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ   );
+       Connect(_positionZ->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionZ              );
+*/
+
+       wxFlexGridSizer *sizer   = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizerH0 = new wxFlexGridSizer(20);
+       wxFlexGridSizer *sizerH1 = new wxFlexGridSizer(20);
+       wxFlexGridSizer *sizerH2 = new wxFlexGridSizer(10);
+       wxFlexGridSizer *sizerH3 = new wxFlexGridSizer(10);
+       wxFlexGridSizer *sizerH4 = new wxFlexGridSizer(10);
+       wxFlexGridSizer *sizerH5 = new wxFlexGridSizer(10);
+       wxFlexGridSizer *sizerH6 = new wxFlexGridSizer(10);
+
+       sizerH0->Add( ckVolum                                                                   , 1, wxALL|wxEXPAND, 0);
+       sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
+       sizerH0->Add( ckBoxVolume                                                               , 1, wxALL|wxEXPAND, 0);
+       sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
+       sizerH0->Add( btnVolumeFunctions                                                , 1, wxALL|wxEXPAND, 0);
+       sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
+       sizerH0->Add( btnMeshVTKLoad                                                    , 1, wxALL|wxEXPAND, 0);
+
+
+       sizerH1->Add( _surfA                                                                    , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( _surfB                                                                    , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( _surfC                                                                    , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( _surfD                                                                    , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( ckBoxSurface                                                              , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( btnSTL                                                                    , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add( btnSaveRaw                                                                , 1, wxALL|wxEXPAND, 0);
+
+
+//     sizerH2->Add( new wxStaticText(panel, -1,_T("          ")                       , 1, wxALL|wxEXPAND, 0);
+       sizerH2->Add( _color                            , 1, wxALL|wxEXPAND, 0);
+       sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
+       sizerH2->Add( _visible                          , 1, wxALL|wxEXPAND, 0);
+       sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
+
+       
+       sizerH2->Add( _wireFrameRep                             , 1,wxSHAPED | wxALIGN_CENTER_VERTICAL , 0);
+       sizerH2->Add( new wxStaticText(panel, -1,_T("   "))                                     , 1, wxALL|wxEXPAND, 0);
+       sizerH2->Add( _surfaceRep                               , 1,wxSHAPED | wxALIGN_CENTER_VERTICAL , 0);
+       sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
+       
+       sizerH2->Add( _opacity                          , 1, wxALL|wxEXPAND, 0);
+
+
+       sizerH3->Add( isoValueTitle                     , 1, wxALL|wxEXPAND, 0);
+       sizerH3->Add( _isoValueSpin                     , 1, wxALL|wxEXPAND, 0);
+       sizerH3->Add( _isoValue                         , 1, wxALL|wxEXPAND, 0);
+
+/*
+       sizerH4->Add( ckBoxX            , 1, wxALL|wxEXPAND, 0);
+       sizerH4->Add( text2                     , 1, wxALL|wxEXPAND, 0);
+       sizerH4->Add( _positionX                , 1, wxALL|wxEXPAND, 0);
+
+       sizerH5->Add( ckBoxY            , 1, wxALL|wxEXPAND, 0);
+       sizerH5->Add( text2                     , 1, wxALL|wxEXPAND, 0);
+       sizerH5->Add( _positionY                , 1, wxALL|wxEXPAND, 0);
+
+       sizerH6->Add( ckBoxZ            , 1, wxALL|wxEXPAND, 0);
+       sizerH6->Add( text2                     , 1, wxALL|wxEXPAND, 0);
+       sizerH6->Add( _positionZ                , 1, wxALL|wxEXPAND, 0);
+*/
+       sizer->Add( sizerH0 , 1, wxALL|wxEXPAND, 2);
+       sizer->Add( sizerH1 , 1, wxALL|wxEXPAND, 2);
+       sizer->Add( sizerH2 , 1, wxALL|wxEXPAND, 2);
+       sizer->Add( sizerH3 , 1, wxALL|wxEXPAND, 2);
+//     sizer->Add( sizerH4 , 1, wxALL|wxEXPAND, 2);
+//     sizer->Add( sizerH5 , 1, wxALL|wxEXPAND, 2);
+//     sizer->Add( sizerH6 , 1, wxALL|wxEXPAND, 2);
+
+       panel->SetSize(300,60);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->Layout();
+
+       panel->SetEventHandler((wxEvtHandler*)this);
+
+}
+//-------------------------------------------------------------------
+wxVtkClipping3DViewCntrlPanel::~wxVtkClipping3DViewCntrlPanel()
+{
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::Refresh()
+{
+//     wxPanel::Refresh();
+/*
+       _positionX->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetX( ) );
+       _positionY->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetY( ) );
+       _positionZ->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetZ( ) );
+*/
+}
+//-------------------------------------------------------------------
+int wxVtkClipping3DViewCntrlPanel::GetIdTissue()
+{
+       int idTissue=-1;
+       if (_surfA->GetValue()==true)
+       {
+               idTissue=0;
+       }
+       if (_surfB->GetValue()==true)
+       {
+               idTissue=1;
+       }
+       if (_surfC->GetValue()==true)
+       {
+               idTissue=2;
+       }
+       if (_surfD->GetValue()==true)
+       {
+               idTissue=3;
+       }
+
+       return idTissue;
+}
+/*
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisX(wxCommandEvent& event)
+{
+       _wxvtkclipping3Dview->VisibleImageActor(0, event.IsChecked() );
+       _wxvtkclipping3Dview->Refresh();
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisY(wxCommandEvent& event)
+{
+       _wxvtkclipping3Dview->VisibleImageActor(1, event.IsChecked() );
+       _wxvtkclipping3Dview->Refresh();
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisZ(wxCommandEvent& event)
+{
+       _wxvtkclipping3Dview->VisibleImageActor(2, event.IsChecked() );
+       _wxvtkclipping3Dview->Refresh();
+}
+*/
+
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnSurface(wxCommandEvent& event)
+{
+       int idTissue=GetIdTissue();
+       if (idTissue!=-1)
+       {
+               // Color
+               vtkActor *tmpActor;
+               tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
+               double rgb[3];
+               tmpActor->GetProperty()->GetColor( rgb );
+               wxColour colour( (int)(rgb[0]*255) , (int)(rgb[1]*255) , (int)(rgb[2]*255) );
+               _color->SetBackgroundColour(colour);
+
+               // Visible
+               _visible->SetValue(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVisibleTissue(idTissue));
+
+               // Opacity
+               _opacity->SetValue( (int)(tmpActor->GetProperty()->GetOpacity()*100) );
+
+               // Representation Type  WireFrame / Surface
+               _surfaceRep->SetValue(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRepresentationType(idTissue)); 
+               _wireFrameRep->SetValue(!_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRepresentationType(idTissue)); 
+
+               // isoValue
+               int isoValue= (int)(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIsovalue(idTissue));
+               _isoValue->SetValue(isoValue);
+       }
+}
+
+
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame(wxCommandEvent& event)
+{
+       int idTissue=GetIdTissue();
+       if (idTissue!=-1)
+       {
+               _wxvtkclipping3Dview->SetRepSurfaceWireFrame(idTissue , _surfaceRep->GetValue() );
+
+               _wxvtkclipping3Dview->Refresh();
+
+               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+               _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+
+       }
+}
+
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleVolume(wxCommandEvent& event)
+{
+       _wxvtkclipping3Dview->VisibleVolumeActor( event.IsChecked()  );
+       _wxvtkclipping3Dview->Refresh();
+
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleBoxSurface(wxCommandEvent& event)
+{
+       _wxvtkclipping3Dview->SetVisibleBoxSurface(event.IsChecked() );
+       _wxvtkclipping3Dview->Refresh();
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleBoxVolume(wxCommandEvent& event)
+{
+       _wxvtkclipping3Dview->SetVisibleBoxVolume(event.IsChecked() );
+       _wxvtkclipping3Dview->Refresh();
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnColor(wxCommandEvent& event)
+{
+       int idTissue=GetIdTissue();
+       if (idTissue!=-1)
+       {
+// EED 17 Janvier 2007
+               wxColourDialog dlgColour(this);
+//             dlgColour.ShowModal();
+               if( dlgColour.ShowModal( ) == wxID_OK ) 
+               {
+                       vtkActor *tmpActor;
+                       tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
+                       float r=dlgColour.GetColourData().GetColour().Red()/255;
+                       float g=dlgColour.GetColourData().GetColour().Green()/255;
+                       float b=dlgColour.GetColourData().GetColour().Blue()/255;
+                       tmpActor->GetProperty()->SetColor( r , g , b );
+                       _color->SetBackgroundColour(dlgColour.GetColourData().GetColour());
+
+                       _wxvtkclipping3Dview->Refresh();
+
+                       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+                       _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+               }
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnVisibleSurface(wxCommandEvent& event)
+{
+       int idTissue=GetIdTissue();
+       if (idTissue!=-1)
+       {
+               _wxvtkclipping3Dview->VisibleActor(idTissue, _visible->GetValue());
+
+               _wxvtkclipping3Dview->Refresh();
+
+               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+               _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnOpacity(wxScrollEvent& event)
+{
+       int idTissue=GetIdTissue();
+       if (idTissue!=-1)
+       {
+               vtkActor *tmpActor;
+               tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
+               float opacity=_opacity->GetValue();
+               tmpActor->GetProperty()->SetOpacity( opacity/100 );
+
+               _wxvtkclipping3Dview->Refresh();
+
+               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+               _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+       }
+}
+
+//----------------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnIsoValueSpin(wxScrollEvent& event)
+{
+       int value = _isoValue->GetValue();
+       int delta= (int)pow( 4 , _isoValueSpin->GetValue() );
+       int min=value - delta/2;
+       int max=value + delta/2;
+       if (min<0)
+       {
+               min=0;
+               max=delta;
+       }
+       _isoValue->SetRange(min,max);
+}
+
+
+//------------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnIsoValue(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+
+       int idTissue=GetIdTissue();
+       if (idTissue!=-1)
+       {
+               int isoValue=_isoValue->GetValue();
+               _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->SetIsovalue(idTissue,isoValue);
+//             wxString tmpStr;
+//             tmpStr.Printf("%d",isoValue);
+       
+               _wxvtkclipping3Dview->Refresh();
+
+               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+               _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+       }
+
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnBtnCreateFileSTL(wxCommandEvent& event)
+{
+
+       int idTissue=GetIdTissue();
+       if (idTissue==-1)
+       {
+               idTissue=0;
+       }
+
+
+       wxString dirSTL = wxGetHomeDir( ) ;
+       wxFileDialog dialog( this, _T("Choose a directory..."), dirSTL , _T(""), _T("*.*"), wxSAVE );
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+          
+       
+               // ------------------------------------------------------------------------
+               //  1.  GENERATE STL FILES
+               // ------------------------------------------------------------------------
+//             const char* fileprefix = "c:\\Creatis\\";
+               std::string prefix = (const char*) (dialog.GetPath().mb_str() );
+               std::string filename;
+
+               // 1.1. Se hace un filtro triangular puesto que el stl writer solo recibe poligonos triangulares.
+
+        vtkTriangleFilter *filtro = vtkTriangleFilter::New();
+
+
+               filtro->SetInput( this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueClipper(idTissue)->GetOutput() );
+               vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
+        pdcf->SetInput( filtro->GetOutput() );
+        vtkClosePolyData *cpd = vtkClosePolyData::New();
+        cpd->SetInput( pdcf->GetOutput() );
+
+               // 1.2 se escribe a disco el archivo stl de la superficie interna
+        cpd->Update();
+        vtkSTLWriter *writer = vtkSTLWriter::New();
+        writer->SetInput( cpd->GetOutput() );
+               filename =prefix;
+        writer->SetFileName(filename.c_str());
+        writer->SetFileTypeToASCII();
+        writer->Write();
+        writer->Delete();
+
+   
+        filtro->Delete();
+        cpd->Delete();
+        pdcf->Delete();
+       }
+
+}
+
+//EED 30 Janvier 2007
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnBtnSaveRawVolume(wxCommandEvent& event)
+{
+       wxFileDialog dialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.maracas"), wxSAVE );
+       if (dialog.ShowModal() == wxID_OK)
+       {
+               std::string directory = (const char*) (dialog.GetDirectory().mb_str() );
+               std::string filename  = (const char*) (dialog.GetFilename().mb_str() );
+               float rescalaSlope           =  1;
+               float rescalaIntercept       =  0;
+               vtkMPRBaseData *vtkmprbasedata = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData();
+               vtkImageData *vtkimagedata       = vtkmprbasedata->GetImageData();
+               int dim[3];
+               vtkimagedata->GetDimensions(dim);
+               int voi[6];
+               voi[0]=0;
+               voi[1]=dim[0];
+               voi[2]=0;
+               voi[3]=dim[1];
+               voi[4]=0;
+               voi[5]=dim[2];
+//EED 10 oct 2007 MaracasVisu pour bbMaracasvisu
+               marRAW2Files marraw2;
+               marraw2.saveVolume(directory,filename,vtkimagedata,voi,rescalaSlope,rescalaIntercept);
+       }
+}
+
+//EED 22 Fevrier 2007
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnBtnVolumeFunctions(wxCommandEvent& event)
+{
+       
+       int i=0,xi,yi,r,g,b;
+       vtkColorTransferFunction* ctfun = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetColorTransferenceFunction();
+       vtkPiecewiseFunction* tfun      = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTransferencefunction();
+       std::vector<double>* gtf                = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreyValuesTransferenceFVector();
+       std::vector<double>* itf                = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIntensityValuesTransferenceFVector();
+       std::vector<double>* greyctf    = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreyValueColorsOfColorTransferenceFVector();
+       std::vector<double>* rctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRedColorsOfColorTransferenceFVector();
+       std::vector<double>* gctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreenColorsOfColorTransferenceFVector();
+       std::vector<double>* bctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetBlueColorsOfColorTransferenceFVector();
+       vtkImageData *imagedata = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+
+       //use for update in the refresh
+       /*
+       vtkVolumeRayCastMapper* volumeMapper = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVolumeMapper();
+       vtkVolume* newvol       =this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVolumeActor();
+       */
+
+       /*
+       MMLR BORRAME 
+       wxFileDialog dialog(this, _T("Choose a file"), _T("c:/Maracas_configuration"),_T(""), _T("*.MarVolConf"), wxOPEN);
+       if (dialog.ShowModal() == wxID_OK)
+       {
+               _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions( (char *)dialog.GetPath().c_str() );
+               
+       
+       }
+       */
+
+       HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Histogram Dialog"),imagedata,1);
+       // 
+       // put in a method
+       //
+       int tfSize=gtf->size();
+               if(tfSize>0)
+               {
+                       int i=0;
+                       hDlg->erasePointsTransferenceFunction();
+                       while(i<tfSize)
+                       {
+                               double g=(*gtf)[i];
+                               double in=(*itf)[i];
+                               hDlg->addPointToTransferenceFunction(g,in*100);
+                               i++;
+                       }
+                       
+               }
+
+       int ctfSize=rctf->size();
+       if(ctfSize>0)
+       {
+               int i=0;
+                       while(i<ctfSize)
+                       {
+                               double gr=(*greyctf)[i];
+                               double r=(*rctf)[i];
+                               double g=(*gctf)[i];
+                               double b=(*bctf)[i];
+                               hDlg->addColorPoint(gr,r*255,g*255,b*255);
+                               i++;
+                       }
+       }
+       //setting variables if the user wants to do refresh
+       hDlg->setCTF(ctfun);
+       hDlg->setTF(tfun);
+       hDlg->setClipping3DView(_wxvtkclipping3Dview);
+       /*
+       hDlg->setVolume(newvol);
+       hDlg->setVolumeMapper(volumeMapper);
+       */
+       //
+       // when the user had changed the transference Function
+       //
+       if(hDlg->ShowModal()== wxID_OK )
+       {       
+                       // -- vtkPiecewiseFunction --
+                       tfun->RemoveAllPoints();
+                       gtf->clear();
+                       itf->clear();
+               
+                       int nTFPoints=hDlg->getSizeTransferenceFunction();
+                       int i=0;
+                       while(i<nTFPoints)
+                       {
+                               hDlg->getTransferenceFunctionPoint(i,xi,yi);
+                               tfun->AddPoint( xi , yi/100.0 );
+                               gtf->push_back(xi);
+                               itf->push_back(yi/100.0);
+                               i++;
+                       }       
+                       // -- vtkColorTransferFunction  --
+                       ctfun->RemoveAllPoints ();
+                       //clean colors
+                       rctf->clear();
+                       gctf->clear();
+                       bctf->clear();
+                       greyctf->clear();
+
+                       int nCTFpoints=hDlg->getSizeBarColor();
+                       i=0;    
+                       while(i<nCTFpoints)
+                       {
+                               hDlg->getDataBarColorPoint(i,xi,r,g,b);
+                               ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
+                               rctf->push_back(r/255.0);
+                               gctf->push_back(g/255.0);
+                               bctf->push_back(b/255.0);
+                               greyctf->push_back(xi);
+                               i++;
+                       }
+                       //---------------------------------
+                       // Refreshing and sending the event
+                       //---------------------------------
+                       //_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions();
+                       _wxvtkclipping3Dview->Refresh();
+                       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+                       _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+                       
+                       /*
+                       volumeMapper->Update();
+                       newvol->Update();
+                       */
+       }
+       
+       else
+       {
+               
+               if(hDlg->getRefreshed())
+               {
+                       int i=0,size;
+                       //--Transference Function----
+                       tfun->RemoveAllPoints();
+                       i=0;
+                       size=gtf->size();
+                       for(i=0;i<size;i++)
+                       {
+                               double grey1=(*gtf)[i];
+                               double  in2=(*itf)[i];
+                               tfun->AddPoint( grey1 , in2 );
+                       }
+                       
+                       // -- vtkColorTransferFunction  --
+                       ctfun->RemoveAllPoints ();
+                       
+                       i=0;
+                       size=greyctf->size();           
+                       for(i=0;i<size;i++)
+                       {
+                               double grey2=(*greyctf)[i];
+                               double red =(*rctf)[i];
+                               double green =(*gctf)[i];
+                               double blue = (*bctf)[i];
+                               ctfun->AddRGBPoint(grey2,red,green,blue);
+                       }
+               
+                       //---------------------------------
+                       // Refreshing and sending the event
+                       //---------------------------------
+                       //_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions();
+                       _wxvtkclipping3Dview->Refresh();
+                       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+                       _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+                       
+                       /*
+                       volumeMapper->Update();
+                       newvol->Update();
+                       */
+                }
+                
+       }
+       //destroy the dialog
+       hDlg->Destroy();
+}
+
+//EED 23 Mai 2007
+//-------------------------------------------------------------------
+void wxVtkClipping3DViewCntrlPanel::OnBtnMeshVTKLoad(wxCommandEvent& event)
+{
+       wxFileDialog dialog(this, _T("Choose a file"), _T("c:/Maracas_configuration"),_T(""), _T("*.vtk"), wxOPEN);
+       if (dialog.ShowModal() == wxID_OK)
+       {
+               _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadMeshVTK( (char *)dialog.GetPath().c_str() );
+               _wxvtkclipping3Dview->Refresh();
+               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+               _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+       }
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+wxVtkMPR3DView::wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview )
+{
+       _wxvtk3Dbaseview                        =       wxvtk3Dbaseview;
+       _vtkmpr3Ddataviewer                     =       NULL;
+       _wxvtkmpr3DviewCntrlPanel       =       NULL;
+}
+
+//-------------------------------------------------------------------
+wxVtkMPR3DView::~wxVtkMPR3DView()
+{
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::Refresh()   // virtual
+{
+       _vtkmpr3Ddataviewer     ->      Refresh();
+       if (_wxvtkmpr3DviewCntrlPanel!=NULL)
+       {
+               _wxvtkmpr3DviewCntrlPanel->Refresh();
+       }
+
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::RefreshView()   // virtual
+{
+       double spc[3];
+       this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
+
+       double nx=1,ny=0,nz=0;
+       Refresh();
+       double x=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetX();
+       double y=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetY();
+       double z=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetZ();
+
+       x=x*spc[0];
+       y=y*spc[1];
+       z=z*spc[2];
+
+       _pointWidget->SetPosition( x,y,z ); 
+
+
+       double in[3]; 
+       double normal[3];
+       vtkTransform *transform = GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetTransformOrientation();
+       in[0]=1;                in[1]=0;                        in[2]=0;
+       transform->TransformPoint(in,normal);
+       _planeWidget->SetNormal( normal[0],normal[1],normal[2] );
+
+
+       _planeWidget->SetCenter( x,y,z );
+       _planeWidget->UpdatePlacement();
+       _planeWidget->GetPolyData(_vtkplane);
+}
+//-------------------------------------------------------------------
+wxPanel* wxVtkMPR3DView::CreateControlPanel(wxWindow *parent)
+{
+       _wxvtkmpr3DviewCntrlPanel = new wxVtkMPR3DViewCntrlPanel(parent,this);
+       return _wxvtkmpr3DviewCntrlPanel;
+}
+//-------------------------------------------------------------------
+vtkMPR3DDataViewer* wxVtkMPR3DView::GetVtkMPR3DDataViewer()
+{
+       return _vtkmpr3Ddataviewer; 
+}
+//-------------------------------------------------------------------
+wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview()
+{
+       return _wxvtk3Dbaseview;
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::Configure(){
+       _wxvtk3Dbaseview->Configure();
+       
+       // Actors are added to the renderer. 
+       _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetOutlineActor() );                    
+//     _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(0)  );    // _saggital
+//     _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(1)  );    // _axial
+//     _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(2)  );    // _coronal
+
+
+       // An initial camera view is created.  The Dolly() method moves 
+       // the camera towards the FocalPoint, thereby enlarging the image.
+       _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
+       _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
+       _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
+
+       // Set a background color for the renderer and set the size of the
+       // render window (expressed in pixels).
+       _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
+       _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
+
+       // Note that when camera movement occurs (as it does in the Dolly()
+       // method), the clipping planes often need adjusting. Clipping planes
+       // consist of two planes: near and far along the view direction. The 
+       // near plane clips out objects in front of the plane; the far plane
+       // clips out objects behind the plane. This way only what is drawn
+       // between the planes is actually rendered.
+       _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
+
+
+
+       // vtkPointWidget
+       _myCallback = vtkmyPWCallback_3DPointWidget::New();
+       _myCallback->SetWxVtkMPR3DView(this);
+       _pointWidget = vtkPointWidget::New();
+       _myCallback->SetVtkPointWidget(_pointWidget);
+       _pointWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() ); 
+       _pointWidget->SetInput( GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
+       _pointWidget->AllOff();
+       _pointWidget->PlaceWidget();
+//     _pointWidget->SetPosition( x,y,z ); 
+       _pointWidget->On();
+       _pointWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
+
+
+// PlaneWidget
+       _planeWidget = vtkPlaneWidget::New();
+       _myCallback->SetVtkPlaneWidget(_planeWidget);
+       _planeWidget->SetInput( GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
+       _planeWidget->NormalToXAxisOn();
+       _planeWidget->SetResolution(50);
+       _planeWidget->SetRepresentationToOutline();
+       int dim[3];
+       GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetDimensions(dim);
+       int px=(dim[0]/2);
+       int py=(dim[1]/2);
+       int pz=(dim[2]/2);
+       int dd=20;
+       _planeWidget->PlaceWidget( px-dd , px+dd , py-dd , py+dd , pz-dd , pz+dd );
+       _vtkplane = vtkPolyData::New();
+       _planeWidget->GetPolyData(_vtkplane);
+
+       vtkProbeFilter *probe = vtkProbeFilter::New();
+       probe->SetInput(_vtkplane);
+       vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+       probe->SetSource( imageData );
+
+       vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
+
+       contourMapper->SetInput( probe->GetPolyDataOutput() );
+
+    contourMapper->SetScalarRange( imageData->GetScalarRange() );
+       _contourPlaneActor = vtkActor::New();
+       _contourPlaneActor->SetMapper(contourMapper);
+       _contourPlaneActor->VisibilityOff();
+
+       _planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
+       _planeWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
+       _planeWidget->Off();
+       _wxvtk3Dbaseview->GetRenderer()->AddActor( _contourPlaneActor );                        
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible){
+       if (visible!=_vtkmpr3Ddataviewer->GetVisiblePosition(idPosition)){
+               if (visible==false){
+                       _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );        
+               } else {
+                       _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );   
+               }
+               _vtkmpr3Ddataviewer->SetVisiblePosition(idPosition,visible);
+       }
+}
+
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::VisiblePointWidget( bool visible )
+{
+       if (visible==true)
+       {
+               _pointWidget->On();
+       } else {
+               _pointWidget->Off();
+       }
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::VisiblePlaneWidget( bool visible )
+{
+       if (visible==true)
+       {
+               _planeWidget->On();
+               _contourPlaneActor->VisibilityOn();
+
+       } else {
+               _planeWidget->Off();
+               _contourPlaneActor->VisibilityOff();
+       }
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::SetVtkMPR3DDataViewer(vtkMPR3DDataViewer *vtkmpr3Ddataviewer)
+{
+       _vtkmpr3Ddataviewer = vtkmpr3Ddataviewer;
+}
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::InitOrientationPointWidget()
+{
+       this->_planeWidget->SetNormal(1,0,0);           
+}
+
+
+
+
+//-------------------------------------------------------------------
+// EED 25 Janvier 2007 testLoic
+void wxVtkMPR3DView::TestLoic1()
+{
+
+       int sizeIma     = 128;
+  double dimIma = sizeIma*2;
+
+       vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+
+       double spc[3];
+       vtkimagedata->GetSpacing(spc);
+
+       vtkimagedata->Update();
+
+
+        double p[3], n[3];
+     this->_planeWidget->GetOrigin(p);
+     this->_planeWidget->GetNormal(n);
+
+
+
+    vtkPlaneSource* pSource = vtkPlaneSource::New( );
+    pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
+    pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
+    pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
+    pSource->SetPoint2( p[ 0 ], p[ 1 ]+ dimIma - 1.0 , p[ 2 ] );
+    pSource->Update( );
+    pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
+    pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
+    pSource->Update( );
+
+    vtkProbeFilter* slices = vtkProbeFilter::New();
+    slices->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
+    slices->SetSource( vtkimagedata );
+    slices->Update( );
+    pSource->Delete( );
+
+       vtkStructuredPoints   *stPoints = vtkStructuredPoints::New();
+       stPoints -> GetPointData( )->SetScalars(  slices->GetOutput()->GetPointData()->GetScalars()  );
+       stPoints -> SetDimensions( sizeIma, sizeIma, 1 );
+       stPoints -> SetScalarType( vtkimagedata->GetScalarType() );
+       stPoints -> SetScalarTypeToShort();
+       stPoints -> Update();
+
+       vtkImageChangeInformation  *change = vtkImageChangeInformation ::New();
+       change    -> SetInput( stPoints );  
+       change    -> Update();    //important
+
+       double _range[2];
+       vtkimagedata->GetScalarRange(_range);
+   vtkWindowLevelLookupTable *_bwlookup = vtkWindowLevelLookupTable::New( );
+   _bwlookup->SetHueRange( 0 , 1 );
+   _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
+   _bwlookup->SetTableRange( _range[0] , _range[1] );
+   _bwlookup->SetSaturationRange( 0 , 0 );
+   _bwlookup->SetValueRange( 0 , 1 );
+   _bwlookup->SetAlphaRange( 1 , 1 );
+   _bwlookup->Build( );
+   vtkLookupTable * _collookup = vtkLookupTable::New( );
+   _collookup->SetNumberOfColors( 256 );
+   _collookup->SetTableRange( 0 , 255 );
+   _collookup->Build( );
+   _collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
+   _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
+   _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
+
+
+       vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
+       writer->SetInput( stPoints );
+       writer->SetFileName( "C:/Users/Images/temp_EED/image.mhd" );
+       writer->SetFileDimensionality( 2 );
+       writer->Write( );
+
+
+
+       vtkDataSetMapper *_3DSliceMapper = vtkDataSetMapper::New( );
+       _3DSliceMapper->SetInput(change->GetOutput( ) );
+       _3DSliceMapper->SetLookupTable( _bwlookup );
+       _3DSliceMapper->SetScalarRange( _range );
+       _3DSliceMapper->ImmediateModeRenderingOn( );
+
+       vtkActor *_3DSliceActor = vtkActor::New( );
+       _3DSliceActor->SetMapper( _3DSliceMapper );
+
+ // The usual rendering stuff.
+  vtkCamera *camera = vtkCamera::New();
+      camera->SetPosition(1,1,1);
+      camera->SetFocalPoint(0,0,0);
+
+  vtkRenderer *renderer = vtkRenderer::New();
+  vtkRenderWindow *renWin = vtkRenderWindow::New();
+    renWin->AddRenderer(renderer);
+
+  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
+    iren->SetRenderWindow(renWin);
+
+  renderer->AddActor( _3DSliceActor );
+      renderer->SetActiveCamera(camera);
+      renderer->ResetCamera();
+      renderer->SetBackground(1,1,1);
+  
+  renWin->SetSize(300,300);
+
+  // interact with data
+  renWin->Render();
+  iren->Start();
+
+
+
+
+
+}
+
+//-------------------------------------------------------------------
+// EED 25 Janvier 2007 testLoic
+void wxVtkMPR3DView::TestLoic2()
+{
+/*
+ vtkVectorNorm *vecMagnitude = vtkVectorNorm::New();
+                vecMagnitude->SetInput(VtkMainGrid);
+                vecMagnitude->NormalizeOff();
+                vecMagnitude->Update();
+*/
+
+        vtkPlane *slicePlane = vtkPlane::New();
+                               this->_planeWidget->GetPlane( slicePlane );
+
+                
+        vtkCutter* sliceCutter = vtkCutter::New();
+               vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+                sliceCutter->SetInput( vtkimagedata );
+                sliceCutter->SetCutFunction( slicePlane );
+
+//EED
+//        vtkLookupTable *lut = BuildHueWeightBaseMap();
+
+
+        vtkPolyDataMapper *slice = vtkPolyDataMapper::New();
+                slice->SetInput( sliceCutter->GetOutput() );
+        double range[2];
+// EED
+//                slice->Update();
+                                 vtkimagedata->GetScalarRange(range);
+//                vecMagnitude->GetOutput()->GetScalarRange( range );
+//                range[1] *= 0.7; // reduce the upper range by 30%
+//                slice->SetScalarRange( range );
+//                slice->SetLookupTable( lut );
+
+//       vtkActor *sliceActor = vtkActor::New();
+//                sliceActor->SetMapper( slice );
+
+        vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
+                contourMapper->SetInput( sliceCutter->GetOutput() );
+                contourMapper->SetScalarRange( range );
+  //              contourMapper->SetLookupTable( lut );
+
+                
+        vtkActor *contourActor = vtkActor::New();
+                contourActor->SetMapper( contourMapper );
+
+
+
+ // The usual rendering stuff.
+  vtkCamera *camera = vtkCamera::New();
+      camera->SetPosition(1,1,1);
+      camera->SetFocalPoint(0,0,0);
+
+  vtkRenderer *renderer = vtkRenderer::New();
+  vtkRenderWindow *renWin = vtkRenderWindow::New();
+    renWin->AddRenderer(renderer);
+
+  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
+    iren->SetRenderWindow(renWin);
+
+  renderer->AddActor( contourActor );
+//  renderer->AddActor(cubeActor);
+      renderer->SetActiveCamera(camera);
+      renderer->ResetCamera();
+      renderer->SetBackground(1,1,1);
+  
+  renWin->SetSize(300,300);
+
+  // interact with data
+  renWin->Render();
+  iren->Start();
+
+
+}
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxVtkClipping3DView::wxVtkClipping3DView(wxVtk3DBaseView* wxvtk3Dbaseview)
+{
+       _wxvtk3Dbaseview                                =       wxvtk3Dbaseview;
+       _vtkclipping3Ddataviewer                =       NULL;
+       _wxvtkclipping3DviewCntrlPanel  =       NULL;
+
+       _boxWidgetVolume                                =       NULL;
+       _boxWidgetS1                                    =       NULL;
+}
+
+//-------------------------------------------------------------------
+wxVtkClipping3DView::~wxVtkClipping3DView(){
+       if (_boxWidgetVolume!=NULL)                              { _boxWidgetVolume     -> Delete();                                    }
+       if (_boxWidgetS1!=NULL)                                  { _boxWidgetS1         -> Delete();                                    }
+       if (_vtkclipping3Ddataviewer!=NULL)              { delete _vtkclipping3Ddataviewer;                     }
+       if (_wxvtkclipping3DviewCntrlPanel!=NULL){ delete _wxvtkclipping3DviewCntrlPanel;       }
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::SetVisibleBoxSurface(bool visible)
+{
+       if (visible==true){
+               _boxWidgetS1->On();
+       } else {
+               _boxWidgetS1->Off();
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::SetVisibleBoxVolume(bool visible)
+{
+       if (_boxWidgetVolume!=NULL){
+               if (visible==true){
+                       _boxWidgetVolume->On();
+               } else {
+                       _boxWidgetVolume->Off();
+               }
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::Refresh()
+{
+       _vtkclipping3Ddataviewer->Refresh();
+       if (_wxvtkclipping3DviewCntrlPanel!=NULL)
+       {
+               _wxvtkclipping3DviewCntrlPanel->Refresh();
+       }
+}
+//-------------------------------------------------------------------
+wxPanel* wxVtkClipping3DView::CreateControlPanel(wxWindow *parent)
+{
+       _wxvtkclipping3DviewCntrlPanel = new wxVtkClipping3DViewCntrlPanel(parent,this);
+       return _wxvtkclipping3DviewCntrlPanel;
+}
+//-------------------------------------------------------------------
+vtkClipping3DDataViewer* wxVtkClipping3DView::GetVtkClipping3DDataViewer()
+{
+       return _vtkclipping3Ddataviewer; 
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::VisibleActor(int idTissue, bool visTissue){
+       if (visTissue!=_vtkclipping3Ddataviewer->GetVisibleTissue(idTissue)){
+               if (visTissue==false){
+                       _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkclipping3Ddataviewer->GetTissueActor(idTissue)  );    
+               } else {
+                       _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(idTissue)  );       
+//                     _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(idTissue) );
+//                     _actor->VisibilityOn();
+               }
+               _vtkclipping3Ddataviewer->SetVisibleTissue(idTissue,visTissue);
+       }
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::SetRepSurfaceWireFrame(int idTissue , bool representationType )
+{
+       vtkActor *tmpActor;
+       tmpActor = GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
+
+       if (representationType==false){
+               tmpActor->GetProperty()->SetRepresentationToWireframe();
+       } else {
+               tmpActor->GetProperty()->SetRepresentationToSurface();
+       }
+
+       _vtkclipping3Ddataviewer->SetRepresentationType(idTissue,representationType);
+}
+
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::VisibleVolumeActor( bool visVolume){
+       if (visVolume!=_vtkclipping3Ddataviewer->GetVisibleVolume() ){
+               if (visVolume==false){
+//EED 31/03/2008                       
+//                     _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkclipping3Ddataviewer->GetVolumeActor()  );    
+                       _wxvtk3Dbaseview->GetRenderer()->RemoveVolume( _vtkclipping3Ddataviewer->GetVolumeActor()  );   
+               } else {
+//EED 31/03/2008                       
+//                     _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetVolumeActor() );        
+                       _wxvtk3Dbaseview->GetRenderer()->AddVolume( _vtkclipping3Ddataviewer->GetVolumeActor() );       
+               }
+               _vtkclipping3Ddataviewer->SetVisibleVolume(visVolume);
+       }
+}
+//-------------------------------------------------------------------
+wxVtk3DBaseView* wxVtkClipping3DView::GetWxvtk3Dbaseview()
+{
+       return _wxvtk3Dbaseview;
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::Configure(){
+       _wxvtk3Dbaseview->Configure();
+
+       // Actors are added to the renderer. 
+       _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetOutlineActor() );                       
+
+       _boxWidgetS1 = vtkBoxWidget::New();
+       _boxWidgetS1->SetInteractor( _wxvtk3Dbaseview->GetWxVTKRenderWindowInteractor() );
+       _boxWidgetS1->SetPlaceFactor(1.25);
+
+
+
+       vtkStripper *stripper=_vtkclipping3Ddataviewer->GetTissueStripper(0);
+       vtkPolyData *polydata= stripper->GetOutput();
+
+       _boxWidgetS1->SetInput( polydata );
+       _boxWidgetS1->PlaceWidget();
+
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
+       {
+               _boxWidgetS1->AddObserver( vtkCommand::InteractionEvent          , _vtkclipping3Ddataviewer->GetObserverS(i) );
+       }
+
+
+
+
+//     _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(0) );                       
+//     _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(3));                        
+
+       VisibleActor(0, false );
+       VisibleActor(1, false );
+       VisibleActor(2, false );
+       VisibleActor(3, false );
+
+       _boxWidgetS1->HandlesOn ();
+       _boxWidgetS1->On();
+       _boxWidgetS1->Off();
+
+       _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(0) );
+       _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(1) );
+       _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(2) );
+       _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(3) );
+       
+// EED 9 fev 2007
+// box Volume
+       _boxWidgetVolume = vtkBoxWidget::New();
+       _boxWidgetVolume->SetInteractor( _wxvtk3Dbaseview->GetWxVTKRenderWindowInteractor() );
+       _boxWidgetVolume->SetPlaceFactor(1.25);
+
+       _boxWidgetVolume->SetInput( this->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
+       _boxWidgetVolume->PlaceWidget();
+
+       _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , _vtkclipping3Ddataviewer->GetObserverV() );
+
+       _boxWidgetVolume->HandlesOn ();
+       _boxWidgetVolume->On();
+       _boxWidgetVolume->Off();
+
+
+//     vtkPlanes *vtkplanes=this->GetVtkClipping3DDataViewer()->GetVolumePlanes();
+//     _boxWidgetVolume->GetPlanes( vtkplanes );
+
+
+  // An initial camera view is created.  The Dolly() method moves 
+  // the camera towards the FocalPoint, thereby enlarging the image.
+  _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
+  _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
+  _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
+
+  // Set a background color for the renderer and set the size of the
+  // render window (expressed in pixels).
+  _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
+  _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
+
+  // Note that when camera movement occurs (as it does in the Dolly()
+  // method), the clipping planes often need adjusting. Clipping planes
+  // consist of two planes: near and far along the view direction. The 
+  // near plane clips out objects in front of the plane; the far plane
+  // clips out objects behind the plane. This way only what is drawn
+  // between the planes is actually rendered.
+  _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
+}
+//-------------------------------------------------------------------
+void wxVtkClipping3DView::SetVtkClipping3DDataViewer(vtkClipping3DDataViewer *vtkclipping3Ddataviewer)
+{
+       _vtkclipping3Ddataviewer = vtkclipping3Ddataviewer;
+}
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+vtkInteractorStyle3DView::vtkInteractorStyle3DView()
+{
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyle3DView::~vtkInteractorStyle3DView()
+{
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorStyle3DView::OnLeftDClick()
+{
+       SelectMarchibCubePoint();
+       return true;
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorStyle3DView::SelectMarchibCubePoint()
+{
+       bool ok=false;
+    gtm::TVector< double > pO( 3 ), pF( 3 ), pp( 3 ), cp( 3 );
+    gtm::TVector< double > xc( 3 );
+    gtm::TVector< double > x1( 3 ), n1( 3 );
+    gtm::TVector< double > x2( 3 ), n2( 3 );
+
+       double pickPoint[ 3 ], cameraPos[ 3 ];
+       int eventrwi[2];
+       vtkPointPicker* picker = vtkPointPicker::New( );        
+       eventrwi[0]= _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+       eventrwi[1]= _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+       vtkRenderer *pRenderer = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetRenderer();
+       picker->Pick( eventrwi[0], eventrwi[1], 0.0, pRenderer );
+       pRenderer->GetActiveCamera( )->GetPosition( cameraPos );
+       picker->GetPickPosition( pickPoint );
+       picker->Delete( );
+
+       pp( 0 ) = pickPoint[ 0 ]; pp( 1 ) = pickPoint[ 1 ]; pp( 2 ) = pickPoint[ 2 ];
+    cp( 0 ) = cameraPos[ 0 ]; cp( 1 ) = cameraPos[ 1 ]; cp( 2 ) = cameraPos[ 2 ];
+
+
+//EED 27 sep 2006  (1/2)
+//     wxVtkMPR3DView *wxvtkmpr3Dview = (wxVtkMPR3DView *)_vtkInteractorStyleBaseView->GetWxVtk3DBaseView();
+//     double spc[3];
+//     wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetSpacing(spc);
+
+
+       vtkImageData *imageData = GetWxVtkMPR3DView()->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
+       int dim[3];
+       double spc[3];
+       imageData->GetDimensions(dim);
+       imageData->GetSpacing(spc);
+
+
+       vtkMarchingCubes *mcubes = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetMCubes(0);
+       
+
+       UtilVtk3DGeometriSelection utilVtk3DGeometriSelection;
+       utilVtk3DGeometriSelection.SetDimentions(dim[0],dim[1],dim[2]);
+
+       utilVtk3DGeometriSelection.SetMarchingCube(mcubes);
+
+    double fac;
+    fac = GTM_MAX( dim[0], dim[2] );
+
+
+    if( utilVtk3DGeometriSelection.FindCubePointsFromPoints(
+      pO.GetAnsiRef( ), pF.GetAnsiRef( ),
+      pp.GetAnsiRef( ), cp.GetAnsiRef( ) )  ) 
+       {
+
+               if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
+                           x1.GetAnsiRef( ), n1.GetAnsiRef( ),
+                               pO.GetAnsiRef( ), pF.GetAnsiRef( ) ) ) 
+               {
+                   if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
+                             x2.GetAnsiRef( ), n2.GetAnsiRef( ),
+                                ( x1 - n1 ).GetAnsiRef( ), ( x1 - ( n1 * fac ) ).GetAnsiRef( )   ) ) 
+                       {
+                               xc = ( x2 + x1 ) * 0.5;
+//EED 27 sep 2006  (2/2)
+                               this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX(xc(0)/spc[0]);
+                               this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY(xc(1)/spc[1]);
+                               this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ(xc(2)/spc[2]);
+                               wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+                               this->_wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+                               ok=true;
+                       }
+               }
+       }
+
+
+       return ok;
+}
+//-------------------------------------------------------------------
+void vtkInteractorStyle3DView::SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview )
+{
+       _wxvtkmpr3Dview = wxvtkmpr3Dview;
+}
+//-------------------------------------------------------------------
+wxVtkMPR3DView *vtkInteractorStyle3DView::GetWxVtkMPR3DView()
+{
+       return _wxvtkmpr3Dview;
+}
+//-------------------------------------------------------------------
+wxVtkClipping3DView *vtkInteractorStyle3DView::GetWxVtkClipping3DView()
+{
+       return _wxvtkclipping3Dview;
+}
+//-------------------------------------------------------------------
+void vtkInteractorStyle3DView::SetWxVtkClipping3DView( wxVtkClipping3DView *wxvtkclipping3Dview)
+{
+       _wxvtkclipping3Dview = wxvtkclipping3Dview;
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+void vtkmyPWCallback_3DPointWidget::Execute(vtkObject *caller, unsigned long, void*)
+{
+       double n[3];
+       double p[3];
+       double delta = 0.000000001;
+
+       vtkInteractorStyleBaseView *isbv = _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
+
+       if (caller==_pointWidget)
+       {
+               _pointWidget->GetPosition(p);
+       }
+       if (caller==_planeWidget)
+       {
+               _planeWidget->GetCenter(p);
+               _planeWidget->GetNormal(n);
+               _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetNormal(n[0],n[1],n[2]);
+       }
+
+       double spc[3];
+       _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
+       p[0]=p[0]/spc[0];
+       p[1]=p[1]/spc[1];
+       p[2]=p[2]/spc[2];
+
+       // Orientation change
+       if ( (fabs(n[0]-_backNormal[0])>delta) || (fabs(n[1]-_backNormal[1])>delta) || (fabs(n[2]-_backNormal[2])>delta) )
+       {
+               _backNormal[0] = n[0];
+               _backNormal[1] = n[1];
+               _backNormal[2] = n[2];
+               isbv->SetParent_refresh_waiting();
+       }
+
+       // ----------
+
+       double tx = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
+       double ty = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
+       double tz = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
+
+       // Position Change
+       if ( (fabs(tx-p[0])>delta) || (fabs(ty-p[1])>delta) || (fabs(tz-p[2])>delta) )
+       {
+               _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( p[0] );
+               _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( p[1] );
+               _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( p[2] );
+               vtkInteractorStyleBaseView *isbv = _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
+               isbv->BlockRefresh();
+               isbv->vtkInteractorStyleBaseView::OnLeftButtonDown();
+               isbv->SetParent_refresh_waiting();
+               isbv->vtkInteractorStyleBaseView::OnMouseMove();
+               isbv->UnBlockRefresh();
+       } 
+       isbv->EvaluateToRefresh();
+}
+//-------------------------------------------------------------------
+void vtkmyPWCallback_3DPointWidget::SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview )
+{
+       _wxvtkmpr3Dview=wxvtkmpr3Dview;
+}
+//-------------------------------------------------------------------
+void vtkmyPWCallback_3DPointWidget::SetVtkPointWidget( vtkPointWidget *pointWidget )
+{
+       _pointWidget=pointWidget;
+}
+//-------------------------------------------------------------------
+void vtkmyPWCallback_3DPointWidget::SetVtkPlaneWidget( vtkPlaneWidget *planeWidget )
+{
+       _planeWidget=planeWidget;
+}
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxPanelCuttingImageData::wxPanelCuttingImageData (wxWindow *parent)
+: wxPanel( parent, -1)
+{
+       _imageData=NULL;
+       _histogrammeVector=NULL;
+       CreateInterface();
+       CreateModel();
+       Create3DViewObjects();
+}
+
+//-------------------------------------------------------------------
+wxPanelCuttingImageData::~wxPanelCuttingImageData()
+{
+
+       delete _modelCube;
+       delete _modelSphere;
+       delete _modelCylinder;
+
+       _vtkcube                -> Delete();
+       _vtksphere              -> Delete();
+       _vtkcylinder    -> Delete();
+       _cubeMapper             -> Delete();
+       _sphereMapper   -> Delete();
+       _cylinderMapper -> Delete();
+       _cubeActor              -> Delete();
+       _sphereActor    -> Delete();
+       _cylinderActor  -> Delete();
+//     _xyplot->RemoveAllInputs();
+       _xyplot                 -> Delete();
+       _histogrammeVector->Delete();
+
+       delete _wxvtkbaseView;
+
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::RemoveActors()
+{
+       _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _actualActor );
+}
+
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::SetWxVtk3DBaseView( wxVtk3DBaseView * wxvtk3Dbaseview )
+{
+       _wxvtk3Dbaseview=wxvtk3Dbaseview;
+}
+
+//-------------------------------------------------------------------
+
+void wxPanelCuttingImageData::SetVtkClipping3DDataViewer( vtkClipping3DDataViewer *vtkclipping3Ddataviewer )
+{
+       this->_vtkclipping3Ddataviewer = vtkclipping3Ddataviewer;
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::Create3DViewObjects()
+{
+       // Sphere
+       _vtksphere              = vtkSphereSource::New();
+       _vtksphere->SetThetaResolution (20);
+       _vtksphere->SetPhiResolution (20);
+       _sphereMapper   = vtkPolyDataMapper::New();
+       _sphereMapper->SetInput( _vtksphere->GetOutput() );
+       _sphereActor    = vtkActor::New();
+       _sphereActor->SetMapper(_sphereMapper);
+       _sphereActor->SetOrigin(0, 0, 0);
+       _sphereActor->SetPosition(0, 0, 0);
+       _sphereActor->GetProperty()->SetColor(1, 0, 0);
+       _sphereActor->SetUserTransform( _modelSphere->GetVtkTransform() );      
+
+       // cube
+       _vtkcube                = vtkCubeSource::New();
+       _vtkcube->SetXLength (1);
+       _vtkcube->SetYLength (1);
+       _vtkcube->SetZLength (1);
+       _cubeMapper             = vtkPolyDataMapper::New();
+       _cubeMapper->SetInput( _vtkcube->GetOutput() );
+       _cubeActor              = vtkActor::New();
+       _cubeActor->SetMapper(_cubeMapper);
+       _cubeActor->SetOrigin(0, 0, 0);
+       _cubeActor->SetPosition(0, 0, 0);
+       _cubeActor->GetProperty()->SetColor(1, 0, 0);
+       _cubeActor->SetUserTransform( _modelCube->GetVtkTransform() );          
+
+       // cylinder
+       _vtkcylinder    = vtkCylinderSource::New();
+       _vtkcylinder->SetResolution(20);
+       _cylinderMapper = vtkPolyDataMapper::New();
+       _cylinderMapper->SetInput( _vtkcylinder->GetOutput() );
+       _cylinderActor  = vtkActor::New();
+       _cylinderActor->SetMapper(_cylinderMapper);
+       _cylinderActor->SetOrigin(0, 0, 0);
+       _cylinderActor->SetPosition(0, 0, 0);
+       _cylinderActor->GetProperty()->SetColor(1, 0, 0);
+       _cylinderActor->SetUserTransform( _modelCylinder->GetVtkTransform() );          
+
+
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::CreateModel()
+{
+       _modelCube              = new figureCuttingCubeModel();
+       _modelSphere    = new figureCuttingSphereModel();
+       _modelCylinder  = new figureCuttingCylinderModel();
+
+//     _modelCube->SetVtkTransform( _modelCube->GetVtkTransform()                      );
+//     _modelSphere->SetVtkTransform( _modelSphere->GetVtkTransform()          );
+//     _modelCylinder->SetVtkTransform( _modelCylinder->GetVtkTransform()      );
+}
+
+//-------------------------------------------------------------------
+
+void wxPanelCuttingImageData::InitHistogramme()
+{
+       double rangeA[2];
+       if (_imageData==NULL)
+       {
+               rangeA[1]=1;
+       } else {
+               _imageData->GetScalarRange(rangeA);
+       }
+       _xyplot->RemoveAllInputs();
+/*
+       if ( _histogrammeVector!=NULL )
+       {
+               _histogrammeVector -> Delete();
+       }
+*/
+       _histogrammeVector =  vtkImageData::New();
+    _histogrammeVector -> SetDimensions ( (int)(rangeA[1]),1,1 );
+    _histogrammeVector -> SetScalarTypeToUnsignedShort();
+    _histogrammeVector -> AllocateScalars();    
+    _histogrammeVector -> Update(); 
+       
+       unsigned short *p_vol = (unsigned short*)_histogrammeVector->GetScalarPointer(0,0,0);
+       int i,size = (int) (rangeA[1]);
+       for (i=0; i < size; i++)
+       {
+               *p_vol=0;
+               p_vol++;
+       }
+       _xyplot->SetXRange(0, rangeA[1]);
+       _xyplot->SetYRange(0, 10);
+       _xyplot->AddInput( _histogrammeVector );
+}
+
+//-------------------------------------------------------------------
+wxWindow *wxPanelCuttingImageData::CreatePlotHistogrammeInterface()
+{
+       _xyplot = vtkXYPlotActor::New();
+       InitHistogramme();
+       _xyplot->GetPositionCoordinate()->SetValue(0.00, 0.00, 0);
+       _xyplot->GetPosition2Coordinate()->SetValue(1.0, 1.00, 0); //relative to Position
+       _xyplot->SetXValuesToArcLength();
+       _xyplot->SetNumberOfXLabels(6);
+
+       _xyplot->SetTitle("Histogramme");
+       _xyplot->SetXTitle("Gray level");
+       _xyplot->SetYTitle("Occurrences ");
+       _xyplot->GetProperty()->SetColor(1, 0, 0);
+       _xyplot->GetProperty()->SetPointSize(2);
+       vtkTextProperty *tprop = _xyplot->GetTitleTextProperty();
+       tprop->SetColor( 1,0,1 );
+       tprop->BoldOff ();
+       _xyplot->SetAxisTitleTextProperty(tprop);
+       _xyplot->SetAxisLabelTextProperty(tprop);
+       _xyplot->PlotPointsOn();
+       _xyplot->GetProperty()->SetPointSize(3);
+
+       _wxvtkbaseView = new wxVtkBaseView(this);
+       _wxvtkbaseView->Configure();
+
+       vtkRenderer *ren = vtkRenderer::New();
+       vtkRenderWindow *renWin = _wxvtkbaseView->GetRenWin();
+       renWin->AddRenderer( ren );
+       ren->AddActor2D( _xyplot );
+
+       return _wxvtkbaseView->GetWxVTKRenderWindowInteractor();
+}
+
+//-------------------------------------------------------------------
+
+void wxPanelCuttingImageData::CreateInterface()
+{
+       SetSize(300,500);
+       wxBoxSizer      *topsizer               = new wxBoxSizer(wxVERTICAL);   // Principal sizer
+
+       wxBoxSizer              *sizerH0        = new wxBoxSizer(wxHORIZONTAL   );  // type of segmentation figure
+       wxBoxSizer          *sizerH2    = new wxBoxSizer(wxHORIZONTAL   );      // scale
+       wxBoxSizer              *sizerH3        = new wxBoxSizer(wxHORIZONTAL   );      // rotation
+       wxBoxSizer              *sizerH4        = new wxBoxSizer(wxHORIZONTAL   );  // intern extern
+       wxBoxSizer              *sizerH5        = new wxBoxSizer(wxHORIZONTAL   );  // Isovalue
+       wxBoxSizer              *sizerH6        = new wxBoxSizer(wxHORIZONTAL   );  // Buttons
+       wxFlexGridSizer *sizerH7        = new wxFlexGridSizer(2                 );  // Volumic information 
+
+       
+       _typeFig        = new wxChoice(this,-1);
+       _opacityFig     = new wxSlider(this,-1,100,0,100, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+
+       _scaleX         = new wxSlider(this,-1,6,0,500  , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+       _scaleY         = new wxSlider(this,-1,20,0,500 , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+       _scaleZ         = new wxSlider(this,-1,7,0,500  , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+
+       _rotationX      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+       _rotationY      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+       _rotationZ      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+
+       _volIntern              = new wxRadioButton(this,-1, _T("Volume intern " ));
+       _volExtern              = new wxRadioButton(this,-1, _T("Volume extern " ));
+
+       _histogrammeAccumulated = new wxCheckBox(this,-1,_T("Histogramme accumulated"));
+
+       _isoValue                               = new wxSlider(this,-1, 200, 0,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+       _valueBeforeIsoValue    = new wxSlider(this,-1,-1,-1,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+       _valueAfterIsoValue             = new wxSlider(this,-1,-1,-1,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
+
+       wxButton *btnExtract    = new wxButton(this, -1,_T("Extract"));
+
+       _infoToVo       = new wxStaticText(this,-1,_T("########################"));
+       _infoSuVoA      = new wxStaticText(this,-1,_T("############"));
+       _infoSuVo       = new wxStaticText(this,-1,_T("############"));
+       _infoPixLe      = new wxStaticText(this,-1,_T("############"));
+       _infoPixHi      = new wxStaticText(this,-1,_T("############"));
+
+
+       wxWindow *panelPlotHistogramme = CreatePlotHistogrammeInterface();
+
+       _typeFig->Append(_T("Cylindre"));
+       _typeFig->Append(_T("Cube"));
+       _typeFig->Append(_T("Sphere"));
+       _typeFig->SetSelection(0);
+       _volIntern->SetValue(true);
+
+       Connect(_typeFig->GetId()                               , wxEVT_COMMAND_CHOICE_SELECTED         , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTypeFig ); 
+
+       Connect(_opacityFig->GetId()                    , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnOpacityFig ); 
+       Connect(_rotationX->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
+       Connect(_rotationY->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
+       Connect(_rotationZ->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
+       Connect(_scaleX->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
+       Connect(_scaleY->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
+       Connect(_scaleZ->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
+       Connect(btnExtract->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnExtract   ); 
+        
+
+//     wxStaticText *text=new wxStaticText(this,-1, " ");
+
+       sizerH0 -> Add( new wxStaticText(this,-1, _T("Fig. Type:   "),wxDefaultPosition, wxSize(50,20)) ,1,wxALL  ,0);
+       sizerH0 -> Add( _typeFig                ,1,wxALL  ,0);
+       sizerH0 -> Add( _opacityFig             ,1,wxALL|wxEXPAND  ,0);
+
+       sizerH2 -> Add( new wxStaticText(this,-1,_T("Scale :   "))              ,1,wxALL  ,0);
+       sizerH2 -> Add( _scaleX         ,1,wxALL | wxEXPAND ,0 );
+       sizerH2 -> Add( _scaleY         ,1,wxALL | wxEXPAND ,0 );
+       sizerH2 -> Add( _scaleZ         ,1,wxALL | wxEXPAND ,0 );
+
+       sizerH3 -> Add( new wxStaticText(this,-1,_T("Rotation :   "))   ,1,wxALL  ,0);
+       sizerH3 -> Add( _rotationX      ,1,wxALL | wxEXPAND ,0 );
+       sizerH3 -> Add( _rotationY      ,1,wxALL | wxEXPAND ,0 );
+       sizerH3 -> Add( _rotationZ      ,1,wxALL | wxEXPAND ,0 );
+
+
+       sizerH4 -> Add( new wxStaticText(this,-1,_T("Intern / Extern :   "))    ,1,wxALL  ,0);
+       sizerH4 -> Add( _volIntern                                              ,1,wxALL  ,0);
+       sizerH4 -> Add( new wxStaticText(this,-1, _T(" "))      ,1,wxALL  ,0);
+       sizerH4 -> Add( _volExtern                                              ,1,wxALL  ,0);
+
+       sizerH5 -> Add( new wxStaticText(this,-1,_T("Isovalue   "))     ,1,wxALL  ,0);
+       sizerH5 -> Add( _isoValue                                               ,1,wxALL | wxEXPAND ,0 );
+       sizerH5 -> Add( _valueBeforeIsoValue                    ,1,wxALL | wxEXPAND ,0 );
+       sizerH5 -> Add( _valueAfterIsoValue                             ,1,wxALL | wxEXPAND ,0 );
+
+       sizerH6 -> Add( new wxStaticText(this,-1, _T(" "))              ,1,wxALL  ,0);
+       sizerH6 -> Add( btnExtract      ,1,wxALL  ,0);
+
+       sizerH7 -> Add( new wxStaticText(this,-1,_T("Total Volume: "), wxDefaultPosition, wxSize(200,12))                       , 1 , wxALL  ,0);
+       sizerH7 -> Add( _infoToVo                                                                               , 1 , wxALL  ,0);
+       sizerH7 -> Add( new wxStaticText(this,-1,_T("SubVolume:   "), wxDefaultPosition, wxSize(200,12) )               , 1 , wxALL  ,0);
+       sizerH7 -> Add( _infoSuVo                                                                               , 1 , wxALL  ,0);
+       sizerH7 -> Add( new wxStaticText(this,-1,_T("SubVolume (ana.): "), wxDefaultPosition, wxSize(200,12))   , 1 , wxALL  ,0);
+       sizerH7 -> Add( _infoSuVoA                                                                              , 1 , wxALL  ,0);
+       sizerH7 -> Add( new wxStaticText(this,-1,_T("Pix < isovalue:   ") , wxDefaultPosition, wxSize(200,12))  , 1 , wxALL  ,0);
+       sizerH7 -> Add( _infoPixLe                                                                              , 1 , wxALL  ,0);
+       sizerH7 -> Add( new wxStaticText(this,-1,_T("Pix > isovalue: "), wxDefaultPosition, wxSize(200,12))     , 1 , wxALL  ,0);
+       sizerH7 -> Add( _infoPixHi                                                                              , 1 , wxALL  ,0);
+//     sizerH7 -> SetMinSize(300, 120);
+
+       // Figure type
+       topsizer -> Add( sizerH0 ,1,wxALL|wxEXPAND  ,0);
+
+       // Scale
+       topsizer -> Add( sizerH2 ,1,wxALL|wxEXPAND  ,0);
+
+       // Rotation
+       topsizer -> Add( sizerH3 ,1,wxALL|wxEXPAND  ,0);
+
+       // Intern / Extern
+       topsizer -> Add( sizerH4 ,1,wxALL  ,0);
+
+
+       // Isovalue limite
+       topsizer -> Add( sizerH5 ,1,wxALL |wxEXPAND ,0);
+
+       // btn Extraction
+       topsizer -> Add( sizerH6        , 1 , wxALL  ,0);
+
+       // Histograme
+       topsizer -> Add( _histogrammeAccumulated ,1,  wxALL  ,0);
+
+       // Volumic information
+       topsizer -> Add( sizerH7                                , 1 , wxALL|wxEXPAND   ,0);
+
+
+
+//    wxBoxSizer *sizerHor = new wxBoxSizer(wxHORIZONTAL);
+    wxBoxSizer *sizerHor = new wxBoxSizer(wxVERTICAL);
+       sizerHor -> Add( topsizer                               , 1 , wxALL | wxEXPAND  ,0);
+       sizerHor -> Add( panelPlotHistogramme   , 1 , wxGROW  ,0);
+
+
+       this->SetAutoLayout(true);
+       this->SetSizer( sizerHor );      
+       this->Layout(); 
+//EEDxx2.4
+//     this->FitInside();
+}
+
+//-------------------------------------------------------------------
+
+void wxPanelCuttingImageData::OnExtract(wxCommandEvent& event)
+{
+       wxBusyCursor wait;
+
+       bool                    inside;
+       bool                    volInt, volExt;
+       int                             xx,yy,zz;
+       unsigned short  *pOrg;
+       unsigned short  *p_histogramme;
+       int                             dim[3];
+       double                  spc[3];
+       long int                contAfter = 0;
+       long int                contBefor = 0;
+
+       double min=999999999;
+       double max=-999999999;
+
+       volExt=_volExtern->GetValue();
+       volInt=_volIntern->GetValue();
+       int isoValue                = _isoValue->GetValue();
+       int valueBeforeIsoValue = _valueBeforeIsoValue->GetValue(); 
+       int valueAfterIsoValue  = _valueAfterIsoValue ->GetValue(); 
+
+       InitHistogramme();
+       p_histogramme = (unsigned short*)_histogrammeVector->GetScalarPointer(0,0,0);
+
+       _imageData->GetDimensions(dim);    
+       _imageData->GetSpacing(spc);    
+       _actualCuttingModel->CalculeInversMatrix();
+
+       for (xx=0;xx<dim[0]; xx++)
+       {
+               for (yy=0;yy<dim[1]; yy++)
+               {
+                       for (zz=0;zz<dim[2];zz++)
+                       {
+                               inside=_actualCuttingModel->IfPointInside(xx,yy,zz);
+                               if (  ((inside==true)&&(volInt==true)) || ((!inside==true)&&(volExt==true)) )
+                               {
+                                       pOrg=(unsigned short*)_imageData->GetScalarPointer (xx,yy,zz); 
+
+                                       if ((*pOrg)<isoValue)
+                                       {
+                                               contBefor++;
+                                               if (valueBeforeIsoValue!=-1)
+                                               {
+                                                       *pOrg=valueBeforeIsoValue;
+                                               }
+                                       } else {
+                                               contAfter++;
+                                               if (valueAfterIsoValue!=-1)
+                                               {
+                                                       *pOrg=valueAfterIsoValue;
+                                               } // if
+                                       } // if isovalue
+
+                                       p_histogramme[*pOrg]++;
+                                       if (*pOrg<min) min=*pOrg; 
+                                       if (*pOrg>max) max=*pOrg; 
+                               } // if inside
+                       } // for zz
+               } // for yy
+       } // for xx
+
+
+       // Information
+       wxString infoToVo;
+       wxString infoSuVo;
+       wxString infoSuVoA;
+       wxString infoPixLe;
+       wxString infoPixHi;
+
+       double volumeUnit = spc[0]*spc[1]*spc[2];
+       long int totalSubVolume = contBefor + contAfter;
+       double contBeforPorc    = 100*(double)contBefor/(double)totalSubVolume;
+       double contAfterPorc    = 100*(double)contAfter/(double)totalSubVolume;
+       infoToVo.Printf(_T("%dx%dx%d = %d"),dim[0],dim[1],dim[2], dim[0]*dim[1]*dim[2] );
+       infoSuVo.Printf(_T("%d") , totalSubVolume);
+       infoSuVoA.Printf(_T("%.2f"), _actualCuttingModel->GetTheoricVolume() );
+       infoPixLe.Printf(_T("%d pix.   (%.2f %s)  -  %.2f mm^3"),contBefor, contBeforPorc ,_T("%"),contBefor*volumeUnit);
+       infoPixHi.Printf(_T("%d pix.   (%.2f %s)  -  %.2f mm^3"),contAfter, contAfterPorc ,_T("%"),contAfter*volumeUnit);
+
+       _infoToVo->SetLabel(infoToVo);
+       _infoSuVo->SetLabel(infoSuVo);
+       _infoSuVoA->SetLabel(infoSuVoA);
+       _infoPixLe->SetLabel(infoPixLe);
+       _infoPixHi->SetLabel(infoPixHi);
+
+       // Histogram
+       if ( _histogrammeAccumulated->GetValue()==true )
+       {
+               int dimHist[3];
+               _histogrammeVector -> GetDimensions ( dimHist );
+
+               int i,size=dimHist[0];
+               for (i=1; i<=size; i++)
+               {
+                       p_histogramme[i] = p_histogramme[i] + p_histogramme[i-1];
+               }
+       }
+       double range[2];
+       _histogrammeVector->Update();
+       _histogrammeVector->GetScalarRange(range);
+       _xyplot->SetYRange( 0   , range[1]      );
+       _xyplot->SetXRange( min , max           );
+
+       _vtkclipping3Ddataviewer->RefreshSurface();
+       _wxvtkbaseView->Refresh();
+
+//     _wxvtkbaseView->RefreshView();
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+       _wxvtkbaseView->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+}
+
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::OnTypeFig(wxCommandEvent& event)
+{
+       _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _actualActor );
+
+       if (_typeFig->GetSelection()==0){
+               _actualCuttingModel=_modelCylinder;
+               _actualActor=_cylinderActor;
+       }
+       if (_typeFig->GetSelection()==1){
+               _actualCuttingModel=_modelCube;
+               _actualActor=_cubeActor;
+       }
+       if (_typeFig->GetSelection()==2){
+               _actualCuttingModel=_modelSphere;
+               _actualActor=_sphereActor;
+       }
+       _wxvtk3Dbaseview->GetRenderer()->AddActor( _actualActor );
+       RefreshOpacity();
+       RefreshView();
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::RefreshOpacity()
+{
+       double op= _opacityFig->GetValue()/100.0;
+       _actualActor->GetProperty()->SetOpacity( op );
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::OnOpacityFig(wxScrollEvent& event)
+{
+       RefreshOpacity();
+       Refresh();
+}
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::RefreshView()
+{
+       SetParamsOfTransformation( );
+       Refresh();
+}
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::Refresh()
+{
+       _wxvtk3Dbaseview->Refresh();
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::SetParamsOfTransformation( )
+{
+       double spc[3];
+       vtkImageData *vtkimagedata = _vtkmprbasedata->GetImageData();
+       vtkimagedata->GetSpacing(spc);
+       int px = (int) (_vtkmprbasedata->GetX() );
+       int py = (int) (_vtkmprbasedata->GetY() );
+       int pz = (int) (_vtkmprbasedata->GetZ() );
+       int sx = (int) (_scaleX->GetValue() * spc[0] );
+       int sy = (int) (_scaleY->GetValue() * spc[1] );
+       int sz = (int) (_scaleZ->GetValue() * spc[2] );
+       _actualCuttingModel     -> SetScale             ( sx    , sy    , sz );
+       _actualCuttingModel     -> SetPosition  ( px    , py , pz       );
+       _actualCuttingModel     -> SetRotation  ( _rotationX->GetValue()        , _rotationY->GetValue() , _rotationZ->GetValue()       );
+       _actualCuttingModel     -> SetSpacing   ( spc[0]        , spc[1]    , spc[2] );
+       _actualCuttingModel     -> CalculeMatrix();
+}
+
+//-------------------------------------------------------------------
+
+void wxPanelCuttingImageData::OnTransform(wxScrollEvent& event)
+{
+       RefreshView();
+}
+
+//-------------------------------------------------------------------
+void wxPanelCuttingImageData::SetVtkMPRBaseData( vtkMPRBaseData *vtkmprbasedata )
+{
+       _vtkmprbasedata = vtkmprbasedata;
+       _imageData              = _vtkmprbasedata->GetImageData();
+}
+
+//-------------------------------------------------------------------
+
+void wxPanelCuttingImageData::Configure()
+{
+       _actualCuttingModel=_modelCylinder;
+       _actualActor=_cylinderActor;
+       _wxvtk3Dbaseview->GetRenderer()->AddActor( _actualActor );
+       SetParamsOfTransformation();
+       RefreshView();
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+/*
+BEGIN_EVENT_TABLE( wxWidgetMesure2D , wxSplitterWindow )
+       EVT_MENU( 12121, wxWidgetMesure2D::OnRefreshView )
+END_EVENT_TABLE( );
+*/
+//-------------------------------------------------------------------
+
+wxWidgetMesure2D::wxWidgetMesure2D( wxWindow *parent )
+: wxSplitterWindow( parent , -1)
+{
+// EED 27 oct 2007
+       this->SplitHorizontally( new wxPanel(this,-1) ,  new wxPanel(this,-1), 2 );
+       this->SetMinimumPaneSize(50);
+}
+//-------------------------------------------------------------------
+wxWidgetMesure2D::~wxWidgetMesure2D()
+{
+}
+//-------------------------------------------------------------------
+wxWindow *wxWidgetMesure2D::CreateWin1a(wxWindow *parent) // virtual
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       _cb_messuretool  = new wxCheckBox(panel,-1,_T("Active messure tool     ")); 
+       _cb_mt_visible   = new wxCheckBox(panel,-1,_T("Visibles    ")); 
+       _cb_closeContour = new wxCheckBox(panel,-1,_T("Close/Open    ")); 
+       _cb_visibleText  = new wxCheckBox(panel,-1,_T("Information    ")); 
+
+       _cb_mt_visible->SetValue(true);
+       _cb_closeContour->SetValue(true);
+       _cb_visibleText->SetValue(true);
+
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(4);
+
+       sizer->Add(_cb_messuretool);
+       sizer->Add(_cb_mt_visible);
+       sizer->Add(_cb_closeContour);
+       sizer->Add(_cb_visibleText);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->SetSize(400,30);
+       panel->Layout();
+//EEDxx2.4
+//     panel->FitInside();
+
+       Connect(_cb_messuretool->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnActiveMessureTool      );
+       Connect(_cb_mt_visible->GetId()   , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnVisibleMessureTool     );
+       Connect(_cb_closeContour->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnCloseContour           );
+       Connect(_cb_visibleText->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnVisibleInformation     );
+
+       return panel;
+}
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview) // virtual
+{
+       _wxvtk2Dbaseview = wxvtk2Dbaseview;
+
+       // Contorno 1
+       _manContourControl_1    = new manualContourControler();
+       _mContourModel_1                = new manualContourModel();
+       _mViewContour_1                 = new manualViewContour();
+       _mViewContour_1->SetModel( _mContourModel_1 );
+       _mViewContour_1->SetWxVtkBaseView( _wxvtk2Dbaseview );
+       _mViewContour_1->SetRange( 1 );
+
+// EED 3 oct 2006
+//     double spc[3];
+//     _wxvtk2Dbaseview->GetSpacing( spc );
+//     _mViewContour_1->SetSpacing( spc );
+
+
+
+       _manContourControl_1->SetZ( 1000 );
+       _manContourControl_1->SetModelView( _mContourModel_1 , _mViewContour_1 );
+       _wxvtk2Dbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
+       _manContourControl_1->CreateNewManualContour();
+       _manContourControl_1->SetActive( false );
+       _mViewContour_1->RefreshContour();
+
+//EED 27 Oct 2007
+       
+//     this->ReplaceWindow( this->GetWindow1() ,  CreateWin1a(this) );
+//     this->ReplaceWindow( this->GetWindow2() ,  _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor() );
+//     CreateWin1a(this->GetWindow1() );
+
+       wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);      
+       sizerA->Add(  CreateWin1a( this->GetWindow1()) ,1, wxGROW );
+       this->GetWindow1()->SetSizer(sizerA);
+       this->SetAutoLayout(true);
+       this->Layout();
+
+       wxBoxSizer *sizerB = new wxBoxSizer(wxHORIZONTAL);      
+       sizerB->Add(  _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor()  ,1, wxGROW );
+       this->GetWindow2()->SetSizer(sizerB);
+       this->SetAutoLayout(true);
+       this->Layout();
+
+
+//     this->SplitHorizontally( CreateWin1a(this) , _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor() , 2 );
+
+
+//EEDxx2.4 
+//     this->FitInside();
+}
+
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::ActiveMessureTool(bool ok)
+{
+       _wxvtk2Dbaseview->GetInteractorStyleBaseView()->SetActiveAllInteractors(!ok);
+       _manContourControl_1->SetActive( ok );
+}
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::OnActiveMessureTool(wxCommandEvent& event)
+{
+       ActiveMessureTool( _cb_messuretool->GetValue() );
+       if ( _cb_messuretool->GetValue() == true )
+       {
+               _cb_mt_visible->SetValue(true);
+               _mViewContour_1->SetVisible( _cb_mt_visible->GetValue() );
+               _cb_closeContour->Enable(true);
+               _cb_visibleText->Enable(true);
+       } else{
+               _cb_closeContour->Enable(false);
+               _cb_visibleText->Enable(false);
+       }
+       _wxvtk2Dbaseview->Refresh();
+       _wxvtk2Dbaseview->RefreshView();
+}
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::OnVisibleMessureTool(wxCommandEvent& event)
+{
+       _cb_messuretool->SetValue( _cb_mt_visible->GetValue() );
+       if (_cb_messuretool->GetValue()==true)
+       {
+               _cb_closeContour->Enable(true);
+               _cb_visibleText->Enable(true);
+       }
+       ActiveMessureTool( _cb_messuretool->GetValue() );       
+       _mViewContour_1->SetVisible( _cb_mt_visible->GetValue() );
+       _mViewContour_1->Refresh();
+       _wxvtk2Dbaseview->Refresh();
+       _wxvtk2Dbaseview->RefreshView();
+}
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::OnCloseContour(wxCommandEvent& event)
+{
+       _mContourModel_1->SetCloseContour( _cb_closeContour->GetValue() );
+       _mViewContour_1->Refresh();
+       _wxvtk2Dbaseview->Refresh();
+       _wxvtk2Dbaseview->RefreshView();
+
+}
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::OnVisibleInformation(wxCommandEvent& event)
+{
+       _mViewContour_1->SetShowText( _cb_visibleText->GetValue() );
+       _mViewContour_1->Refresh();
+       _wxvtk2Dbaseview->Refresh();
+       _wxvtk2Dbaseview->RefreshView();
+}
+//-------------------------------------------------------------------
+void wxWidgetMesure2D::SetMesureScale(double mesureScale)
+{
+       _mViewContour_1->SetMesureScale(mesureScale);
+}
+//-------------------------------------------------------------------
+manualContourModel*    wxWidgetMesure2D::GetManualContourModel()
+{
+       return _mContourModel_1;
+}
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxWidgetMesure2D_Plane::wxWidgetMesure2D_Plane(wxWindow *parent)
+: wxWidgetMesure2D(parent)
+{
+       // Circle 1
+       _ptsCircle1             = NULL;
+       _circle1Actor   = NULL;
+       _circle1Mapper  = NULL;
+    _pdCircle1         = NULL;
+       // Circle 2
+       _ptsCircle2             = NULL;
+       _circle2Actor   = NULL;
+       _circle2Mapper  = NULL;
+    _pdCircle2         = NULL;
+       // line reference 1
+       _ptsLineRef1    = NULL;
+       _lineRef1Actor  = NULL;
+       _lineRef1Mapper = NULL;
+    _pdLineRef1                = NULL;
+       // line reference 2
+       _ptsLineRef2    = NULL;
+       _lineRef2Actor  = NULL;
+       _lineRef2Mapper = NULL;
+    _pdLineRef2                = NULL;
+
+}
+
+//-------------------------------------------------------------------
+
+wxWidgetMesure2D_Plane::~wxWidgetMesure2D_Plane()
+{
+       // Circle 1
+    if (       _ptsCircle1             != NULL){       _ptsCircle1                     -> Delete(); }
+    if (       _circle1Actor   != NULL){       _circle1Actor           -> Delete(); }
+    if (       _circle1Mapper  != NULL){       _circle1Mapper          -> Delete(); }
+    if (    _pdCircle1         != NULL){       _pdCircle1                      -> Delete(); }
+       // Circle 2
+    if (       _ptsCircle2             != NULL){       _ptsCircle2                     -> Delete(); }
+    if (       _circle2Actor   != NULL){       _circle2Actor           -> Delete(); }
+    if (       _circle2Mapper  != NULL){       _circle2Mapper          -> Delete(); }
+    if (    _pdCircle2         != NULL){       _pdCircle2                      -> Delete(); }
+       // line reference 1
+    if (       _ptsLineRef1    != NULL){       _ptsLineRef1            -> Delete(); }
+    if (       _lineRef1Actor  != NULL){       _lineRef1Actor          -> Delete(); }
+    if (       _lineRef1Mapper != NULL){       _lineRef1Mapper         -> Delete(); }
+     if (   _pdLineRef1                != NULL){       _pdLineRef1                     -> Delete(); }
+       // line reference 2
+    if (       _ptsLineRef2    != NULL){       _ptsLineRef2            -> Delete(); }
+    if (       _lineRef2Actor  != NULL){       _lineRef2Actor          -> Delete(); }
+    if (       _lineRef2Mapper != NULL){       _lineRef2Mapper         -> Delete(); }
+    if (    _pdLineRef2                != NULL){       _pdLineRef2                     -> Delete(); }
+}
+
+//-------------------------------------------------------------------
+
+wxWindow *wxWidgetMesure2D_Plane::CreateWin1a(wxWindow *parent) // virtual
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       _cb_circle              = new wxCheckBox(panel,-1,_T("Circle        ")); 
+       _cb_line                = new wxCheckBox(panel,-1,_T("Rotation Axe ")); 
+
+
+       wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);
+       sizerA->Add(_cb_circle);
+       sizerA->Add(_cb_line);
+
+
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+       sizer->Add( sizerA );
+       sizer->Add( wxWidgetMesure2D::CreateWin1a(panel) );
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->SetSize(400,30);
+       panel->Layout();
+//EEDxx2.4
+//     panel->FitInside();
+
+       Connect(_cb_line->GetId()        , wxEVT_COMMAND_CHECKBOX_CLICKED         , (wxObjectEventFunction) &wxWidgetMesure2D_Plane::OnActiveLine                       );
+       Connect(_cb_circle->GetId()      , wxEVT_COMMAND_CHECKBOX_CLICKED         , (wxObjectEventFunction) &wxWidgetMesure2D_Plane::OnActiveCirlcle            );
+
+       return panel;
+}
+
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane::OnActiveCirlcle(wxCommandEvent& event)
+{
+       SetVisibleCircle( _cb_circle->GetValue() );
+       _wxvtk2Dbaseview->RefreshView();
+}
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane::SetVisibleCircle( bool ok )
+{
+       double opacity;
+       if (ok==true)
+       {
+               opacity=1;
+       } else {
+               opacity=0;
+       } 
+       _lineRef1Actor->GetProperty()->SetOpacity( opacity );
+       _lineRef2Actor->GetProperty()->SetOpacity( opacity );
+       _circle1Actor->GetProperty()->SetOpacity( opacity );
+       _circle2Actor->GetProperty()->SetOpacity( opacity );
+}
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane::OnActiveLine(wxCommandEvent& event)
+{
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_wxvtk2Dbaseview;
+       vtkplane2Dview->SetVisibleLine( _cb_line->GetValue() );
+       _wxvtk2Dbaseview->RefreshView();
+}
+
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane::ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview) // virtual
+{
+       wxWidgetMesure2D::ConfigureA(wxvtk2Dbaseview);
+       CircleLine();
+       ConfigureCircleLine();
+       SetVisibleCircle(false);        
+}
+
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane::ConfigureCircleLine()
+{
+       double ang;
+
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_wxvtk2Dbaseview;
+       int sizeIma = vtkplane2Dview->GetImgSize();
+
+       double i,maxPts=20;
+       double k=(360/(maxPts-1)) * (3.1416/180);
+       double x,y,r1=5,r2=10,r3=15;
+       for (i=0;i<maxPts;i++)
+       {
+               x=cos( k*i ) ;
+               y=sin( k*i ) ;
+               _ptsCircle1->SetPoint( (int)i , (sizeIma/2) + x*r1      , (sizeIma/2) + y*r1    , 1 );
+               _ptsCircle2->SetPoint( (int)i , (sizeIma/2) + x*r2      , (sizeIma/2) + y*r2    , 1 );
+       }
+
+       //
+       ang=(45) * (3.1416/180);
+       x=cos( ang ) ;
+       y=sin( ang ) ;
+       _ptsLineRef1->SetPoint( 0 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
+       
+       ang=(45+180) * (3.1416/180);
+       x=cos( ang ) ;
+       y=sin( ang ) ;
+       _ptsLineRef1->SetPoint( 1 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
+
+       //
+       ang=(135) * (3.1416/180);
+       x=cos( ang ) ;
+       y=sin( ang ) ;
+       _ptsLineRef2->SetPoint( 0 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
+       
+       ang=(135+180) * (3.1416/180);
+       x=cos( ang ) ;
+       y=sin( ang ) ;
+       _ptsLineRef2->SetPoint( 1 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
+}
+
+
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane::CircleLine()
+{
+       int i,maxPts=20;
+       vtkCellArray *lines;
+
+       vtkImageViewer2_XYZ *imageViewer2XYZ = _wxvtk2Dbaseview->_imageViewer2XYZ;
+       
+
+// Circle 1 Horizontal
+       _ptsCircle1 = vtkPoints::New();
+       _ptsCircle1->SetNumberOfPoints(maxPts);
+       lines = vtkCellArray::New();
+       lines->InsertNextCell(maxPts);
+       for (i=0;i<maxPts;i++)
+       {
+               lines->InsertCellPoint(i);
+               _ptsCircle1->SetPoint(i, 0      , 0     , 0 );
+       }
+       lines->InsertCellPoint(0);
+       _ptsCircle1->SetPoint(0, -1000  , -1000 , -1000 );
+       _ptsCircle1->SetPoint(1,  1000  ,  1000 ,  1000 );
+
+       _pdCircle1 = vtkPolyData::New();
+    _pdCircle1->SetPoints( _ptsCircle1 );
+    _pdCircle1->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _circle1Actor                                   =       vtkActor::New();
+    _circle1Mapper                                     =       vtkPolyDataMapper::New();
+       _circle1Mapper->SetInput(_pdCircle1);
+       _circle1Mapper->ImmediateModeRenderingOn();
+       _circle1Actor->SetMapper(_circle1Mapper);
+       _circle1Actor->GetProperty()->BackfaceCullingOn();
+       _circle1Actor->GetProperty()->SetDiffuseColor(0,0,1);
+       _circle1Actor->GetProperty()->SetLineWidth(2);
+    imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _circle1Actor );
+
+// Circle 2 Horizontal
+       _ptsCircle2 = vtkPoints::New();
+       _ptsCircle2->SetNumberOfPoints(maxPts);
+       lines = vtkCellArray::New();
+       lines->InsertNextCell(maxPts);
+       for (i=0;i<maxPts;i++)
+       {
+               lines->InsertCellPoint(i);
+               _ptsCircle2->SetPoint(i, 0      , 0     , 0 );
+       }
+       _ptsCircle2->SetPoint(0, -1000  , -1000 , -1000 );
+       _ptsCircle2->SetPoint(1,  1000  ,  1000 ,  1000 );
+
+       _pdCircle2 = vtkPolyData::New();
+    _pdCircle2->SetPoints( _ptsCircle2 );
+    _pdCircle2->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _circle2Actor                                   =       vtkActor::New();
+    _circle2Mapper                                     =       vtkPolyDataMapper::New();
+       _circle2Mapper->SetInput(_pdCircle2);
+       _circle2Mapper->ImmediateModeRenderingOn();
+       _circle2Actor->SetMapper(_circle2Mapper);
+       _circle2Actor->GetProperty()->BackfaceCullingOn();
+       _circle2Actor->GetProperty()->SetDiffuseColor(0,0,1);
+       _circle2Actor->GetProperty()->SetLineWidth(2);
+    imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _circle2Actor );
+
+// Line Referance 1
+       _ptsLineRef1 = vtkPoints::New();
+       _ptsLineRef1->SetNumberOfPoints(2);
+       _ptsLineRef1->SetPoint(0, -1000 , -1000 , -1000 );
+       _ptsLineRef1->SetPoint(1,  1000 ,  1000 ,  1000 );
+       lines = vtkCellArray::New();
+       lines->InsertNextCell(2);
+       lines->InsertCellPoint(0);
+       lines->InsertCellPoint(1);
+
+       _pdLineRef1 = vtkPolyData::New();
+    _pdLineRef1->SetPoints( _ptsLineRef1 );
+    _pdLineRef1->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _lineRef1Actor                                  =       vtkActor::New();
+    _lineRef1Mapper                                    =       vtkPolyDataMapper::New();
+       _lineRef1Mapper->SetInput(_pdLineRef1);
+       _lineRef1Mapper->ImmediateModeRenderingOn();
+       _lineRef1Actor->SetMapper(_lineRef1Mapper);
+       _lineRef1Actor->GetProperty()->BackfaceCullingOn();
+       _lineRef1Actor->GetProperty()->SetDiffuseColor(0,0,1);
+       _lineRef1Actor->GetProperty()->SetLineWidth(2);
+    imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineRef1Actor );
+
+// Line Referance 2
+       _ptsLineRef2 = vtkPoints::New();
+       _ptsLineRef2->SetNumberOfPoints(2);
+       _ptsLineRef2->SetPoint(0, -1000 , -1000 , -1000 );
+       _ptsLineRef2->SetPoint(1,  1000 ,  1000 ,  1000 );
+       lines = vtkCellArray::New();
+       lines->InsertNextCell(2);
+       lines->InsertCellPoint(0);
+       lines->InsertCellPoint(1);
+
+       _pdLineRef2 = vtkPolyData::New();
+    _pdLineRef2->SetPoints( _ptsLineRef2 );
+    _pdLineRef2->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _lineRef2Actor                                  =       vtkActor::New();
+    _lineRef2Mapper                                    =       vtkPolyDataMapper::New();
+       _lineRef2Mapper->SetInput(_pdLineRef2);
+       _lineRef2Mapper->ImmediateModeRenderingOn();
+       _lineRef2Actor->SetMapper(_lineRef2Mapper);
+       _lineRef2Actor->GetProperty()->BackfaceCullingOn();
+       _lineRef2Actor->GetProperty()->SetDiffuseColor(0,0,1);
+       _lineRef2Actor->GetProperty()->SetLineWidth(2);
+    imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineRef2Actor );
+
+
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+wxWidgetMesure2D_Plane_in_MPR::wxWidgetMesure2D_Plane_in_MPR(wxWindow *parent)
+:wxWidgetMesure2D_Plane(parent)
+{
+       _vtkplane2Dview=NULL;
+}
+
+//-------------------------------------------------------------------
+
+wxWidgetMesure2D_Plane_in_MPR::~wxWidgetMesure2D_Plane_in_MPR()
+{
+}
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane_in_MPR::OnActiveLink(wxCommandEvent& event)
+{
+       if (_vtkplane2Dview!=NULL)
+       {
+               _vtkplane2Dview->SetActive( _cb_link->GetValue() );
+               _vtkplane2Dview->Refresh();
+               _vtkplane2Dview->RefreshView();
+       }
+}
+
+
+//-------------------------------------------------------------------
+void wxWidgetMesure2D_Plane_in_MPR::SetActiveLink(bool ok)
+{
+       _cb_link->SetValue(ok);
+       if (_vtkplane2Dview!=NULL)
+       {
+               _vtkplane2Dview->SetActive( _cb_link->GetValue() );
+       }
+}
+//-------------------------------------------------------------------
+
+void wxWidgetMesure2D_Plane_in_MPR::SetVtkPlane2DView(vtkPlane2DView *vtkplane2Dview)
+{
+       _vtkplane2Dview = vtkplane2Dview;
+}
+
+//-------------------------------------------------------------------
+
+wxWindow *wxWidgetMesure2D_Plane_in_MPR::CreateWin1a(wxWindow *parent) // virtual
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       _cb_link                = new wxCheckBox(panel,-1,_T("LINK                    ")); 
+       _cb_link->SetValue(true);
+
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+
+       sizer->Add(_cb_link);
+
+       sizer->Add( wxWidgetMesure2D_Plane::CreateWin1a(panel) );
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->SetSize(400,30);
+       panel->Layout();
+
+//EEDxx2.4
+//     panel->FitInside();
+
+       Connect(_cb_link->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxWidgetMesure2D_Plane_in_MPR::OnActiveLink );
+
+       return panel;
+}
+
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE( wxMPRWidget, wxPanel )
+       EVT_MENU( 12121, wxMPRWidget::OnRefreshView )
+       EVT_MENU( 12122, wxMPRWidget::OnDClickLeft  )
+END_EVENT_TABLE( );
+
+
+
+wxMPRWidget::wxMPRWidget( wxWindow* parent,
+                          marImageData *marimageData , double voxelSize)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+       _vtkmpr2Dview[0]                                = NULL;
+       _vtkmpr2Dview[1]                                = NULL;
+       _vtkmpr2Dview[2]                                = NULL;
+       _vtkplane2Dview                                 = NULL;
+       _widgetMesure                                   = NULL;
+       _wxsphereview                                   = NULL;
+       _wxvtk3Dbaseview_MPRClipping3D  = NULL;
+       _wxvtkmpr3Dview                                 = NULL;
+       _wxvtkclipping3Dview                    = NULL;
+       _vtkplane2Dview_B                               = NULL;
+       _widgetMesure_B                                 = NULL;
+
+       _vtkmpr2Dview_B[0]                              = NULL;
+       _vtkmpr2Dview_B[1]                              = NULL;
+       _vtkmpr2Dview_B[2]                              = NULL;
+       _vtkplane2Dview_B                               = NULL;
+       _widgetMesure_B                                 = NULL;
+       _wxsphereview_B                                 = NULL;
+       _wxvtk3Dbaseview_MPR3D_B                = NULL;
+       _wxvtkmpr3Dview_B                               = NULL;
+       _wxvtk3Dbaseview_Clipping3D_BB  = NULL;
+       _wxvtkmpr3Dview_BB                              = NULL;
+       _wxvtkclipping3Dview_BB                 = NULL;
+
+       _vtkmprbasedata                                 = NULL;
+
+
+       _voxelSize                                              = voxelSize;
+       _framePanelCutting                              = NULL;
+       _panelCutting                                   = NULL;
+       _marImageData                                   = marimageData;
+
+       _vtkmprbasedata                                 = new vtkMPRBaseData(); 
+       _vtkmprbasedata->SetMarImageData(_marImageData);
+
+       wxSplitterWindow        *pnlSplitter            = new wxSplitterWindow( this , -1);
+
+       wxPanel                         *MPRPanel       = CreateMPRPanel(pnlSplitter,_vtkmprbasedata);
+       wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
+       wxBoxSizer                      *sizer          = new wxBoxSizer(wxVERTICAL  );
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+       pnlSplitter     -> SetMinimumPaneSize( 2 );
+
+       pnlSplitter     -> SplitVertically( MPRPanel, controlPanel, 550 );
+       this            -> SetAutoLayout( true );
+       this            -> SetSizer(sizer);
+//     sizer           ->      Fit( this );
+
+       _refreshAPage=0;
+       _refreshBPage=0;
+
+}
+
+//----------------------------------------------------------------------------
+
+wxMPRWidget::~wxMPRWidget( )
+{
+//EEDxx2.4 DELETE
+       if (_framePanelCutting!=NULL)
+       {
+               _framePanelCutting->Close();
+       }
+
+       if (_vtkmpr2Dview[0]!=NULL)                                     { delete _vtkmpr2Dview[0]; }
+       if (_vtkmpr2Dview[1]!=NULL)                                     { delete _vtkmpr2Dview[1]; }
+       if (_vtkmpr2Dview[2]!=NULL)                                     { delete _vtkmpr2Dview[2]; }
+
+       if (_vtkmpr2Dview_B[0]!=NULL)                           { delete _vtkmpr2Dview_B[0]; }
+
+       if (_vtkmpr2Dview_B[1]!=NULL)                           { delete _vtkmpr2Dview_B[1]; }
+       if (_vtkmpr2Dview_B[2]!=NULL)                           { delete _vtkmpr2Dview_B[2]; }
+
+       if (_vtkmprbasedata!=NULL)                                      { delete _vtkmprbasedata; }
+       if (_vtkplane2Dview!=NULL)                                      { delete _vtkplane2Dview; }
+       if (_wxsphereview!=NULL)                                        { delete _wxsphereview; }
+       if (_wxvtk3Dbaseview_MPRClipping3D!=NULL)       { delete _wxvtk3Dbaseview_MPRClipping3D; }
+       if (_wxvtkmpr3Dview!=NULL)                                      { delete _wxvtkmpr3Dview; }
+       if (_wxvtkclipping3Dview!=NULL)                         { delete _wxvtkclipping3Dview; }
+
+       if (_vtkplane2Dview_B!=NULL)                            { delete _vtkplane2Dview_B; }
+       if (_wxsphereview_B!=NULL)                                      { delete _wxsphereview_B; }
+
+       if (_wxvtk3Dbaseview_MPR3D_B!=NULL)                     { delete _wxvtk3Dbaseview_MPR3D_B; }
+       if (_wxvtkmpr3Dview_B!=NULL)                            { delete _wxvtkmpr3Dview_B; }
+
+       if (_wxvtk3Dbaseview_Clipping3D_BB!=NULL)       { delete _wxvtk3Dbaseview_Clipping3D_BB; }
+       if (_wxvtkmpr3Dview_BB!=NULL)                           { delete _wxvtkmpr3Dview_BB; }
+       if (_wxvtkclipping3Dview_BB!=NULL)                      { delete _wxvtkclipping3Dview_BB; }
+}
+
+//----------------------------------------------------------------------------
+
+wxPanel* wxMPRWidget::CreateControlPanel(wxWindow *parent)
+{
+
+       wxPanel *panel=new wxPanel(parent,-1);
+
+//EEDxx2.4
+//     wxStaticText *tmpText = new wxStaticText(panel,-1,""); 
+
+       wxStaticText *help0Text = new wxStaticText(panel,-1,_T("General: \n  middle click : contrast\n  ctrl + middle click : rotate image\n  shift + middle click: translate image\n  ctrl + right click: zoom")); 
+
+       wxStaticText *help1Text = new wxStaticText(panel,-1,_T("mpr2D: \n  double click : choose a point\n  mouse right : change perpendicular slice\n  drag axis: change slice")); 
+       
+       wxStaticText *help2Text = new wxStaticText(panel,-1,_T("Plane: \n  drag mouse: rotate\n  ctrl + drag mouse : fix axis rotation\n  \n mouse right: change perpendicular slice \n  see split control \n     - Active/Desactivet plane tool\n     - Center market\n     - Rotation axis market\n     - 2D messure tool (open/close contour)")); 
+
+       wxStaticText *help3Text = new wxStaticText(panel,-1,
+_T("Sphere: \n  drag mouse: rotation\n  mouse right: change radio \n  click: 3D point selection in MPR 2D \n  double clicks in MPR: show surface sphere")); 
+       
+       wxStaticText *help4Text = new wxStaticText(panel,-1,_T("MPR3D:\n  see split control")); 
+
+       wxString text=_T("");
+       text=text+_T("Clipping: \n");
+       text=text+_T(" see split control \n");
+       text=text+_T(" 4 MarchingCubes:  \n");
+       text=text+_T("    color, isovalue, opacity \n");
+       text=text+_T(" Box:\n");
+       text=text+_T("    mouse left drag (box): rotation\n");
+       text=text+_T("    mouse left drag (sphere): size,position\n");
+       text=text+_T("    mouse right drag (box): box size");
+       text=text+_T(" Axis: 3D\n");
+       text=text+_T("    mouse drag: translate\n");
+       text=text+_T("    shift + mouse drag: translate 2 axis\n");
+       text=text+_T("    mouse right: scale\n");
+       text=text+_T(" Plane 3D:\n");
+       text=text+_T("    mouse drag perpendicular axis: rotate plane\n");
+       text=text+_T("    mouse drag spheres: size plane\n");
+       text=text+_T("    ctrl +mouse right over the plane: size plane\n");
+       text=text+_T("    mouse drag plane: translate\n");
+       text=text+_T("    middle click perpendicular axis: translate\n");
+       wxStaticText *help5Text = new wxStaticText(panel,-1, text );
+
+
+    wxFlexGridSizer *sizer  = new wxFlexGridSizer(1);
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( help0Text   );
+
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( help1Text   );
+
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( help2Text   );
+
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( help3Text   );
+
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( help4Text   );
+
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( new wxStaticText(panel,-1,_T(""))   );
+       sizer->Add( help5Text   );
+       
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(350,500);
+
+    return panel;
+}
+
+//----------------------------------------------------------------------------
+
+void wxMPRWidget::OnPageAChanged(wxNotebookEvent & event)
+{
+       _refreshAPage=event.GetSelection();
+       Refresh();
+       RefreshView(true);
+}
+
+//----------------------------------------------------------------------------
+
+void wxMPRWidget::OnPageBChanged(wxNotebookEvent & event)
+{
+       _refreshBPage=event.GetSelection();
+//     Refresh(false);
+//     RefreshView();
+}
+
+
+//----------------------------------------------------------------------------
+
+wxPanel* wxMPRWidget::CreateView(int type,wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxWindow *wxwindow;
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       if (type==0)
+       {
+               _vtkmpr2Dview_B[0] = new wxVtkMPR2DView(panel,0);
+               _vtkmpr2Dview_B[0]->SetVtkBaseData(vtkmprbasedata);
+               wxwindow=_vtkmpr2Dview_B[0]->GetWxVTKRenderWindowInteractor();
+       }
+       if (type==1)
+       {
+               _vtkmpr2Dview_B[1] = new wxVtkMPR2DView(panel,1);
+               _vtkmpr2Dview_B[1]->SetVtkBaseData(vtkmprbasedata);
+               wxwindow=_vtkmpr2Dview_B[1]->GetWxVTKRenderWindowInteractor();
+       }
+       if (type==2)
+       {
+               _vtkmpr2Dview_B[2] = new wxVtkMPR2DView(panel,2);
+               _vtkmpr2Dview_B[2]->SetVtkBaseData(vtkmprbasedata);
+               wxwindow=_vtkmpr2Dview_B[2]->GetWxVTKRenderWindowInteractor();
+       }
+       if (type==3)
+       {
+               _widgetMesure_B         = new wxWidgetMesure2D_Plane_in_MPR(panel);
+               _vtkplane2Dview_B       = new vtkPlane2DView( _widgetMesure_B->GetWindow2());
+               _widgetMesure_B->SetVtkPlane2DView( _vtkplane2Dview_B );
+               _vtkplane2Dview_B->SetImgSize( 200 );
+               _vtkplane2Dview_B->SetVtkBaseData(vtkmprbasedata);
+               wxwindow                        = _widgetMesure_B;
+       }
+       if (type==4)
+       {
+               _wxsphereview_B         = new wxSphereView( panel , vtkmprbasedata, vtkmprbasedata->GetImageData() );
+               wxwindow=_wxsphereview_B->GetWxVTKRenderWindowInteractor();
+       }
+
+       if (type==5)
+       {
+               wxSplitterWindow *panelMPR3D    = new wxSplitterWindow( panel , -1);
+               _wxvtk3Dbaseview_MPR3D_B                = new wxVtk3DBaseView( panelMPR3D );
+
+               _wxvtkmpr3Dview_B                               = new wxVtkMPR3DView(_wxvtk3Dbaseview_MPR3D_B);
+               vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
+               vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+               vtkmpr3Ddataviewer->Configure();
+               _wxvtkmpr3Dview_B->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+               wxWindow        *window3D                       = _wxvtk3Dbaseview_MPR3D_B->GetWxVTKRenderWindowInteractor();
+               wxPanel         *controlPanel3D         = _wxvtkmpr3Dview_B->CreateControlPanel(panelMPR3D);
+
+//EEDxx2.4
+               panelMPR3D      -> SetMinimumPaneSize( 5 );
+               panelMPR3D      -> SplitHorizontally( controlPanel3D,window3D,600  );
+
+               wxwindow=panelMPR3D;
+       }
+
+       if (type==6)
+       {
+               wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
+               _wxvtk3Dbaseview_Clipping3D_BB                  = new wxVtk3DBaseView( panelClipping3D );
+
+               _wxvtkclipping3Dview_BB                                 = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_BB);
+               vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
+               vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+               vtkclipping3Ddataviewer->Configure();
+               _wxvtkclipping3Dview_BB->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
+
+               _wxvtkmpr3Dview_BB                                              = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_BB );
+               vtkMPR3DDataViewer *vtkmpr3Ddataviewer  = new vtkMPR3DDataViewer(); 
+               vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+               vtkmpr3Ddataviewer->Configure();
+               _wxvtkmpr3Dview_BB->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+               wxWindow        *window3D                                       = _wxvtk3Dbaseview_Clipping3D_BB->GetWxVTKRenderWindowInteractor();
+
+               wxPanel                 *panelControl                   = new wxPanel(panelClipping3D,-1);      
+               wxPanel                 *controlPanelMPR3D              = _wxvtkmpr3Dview_BB->CreateControlPanel(panelControl);
+               wxPanel                 *controlPanelClipping3D = _wxvtkclipping3Dview_BB->CreateControlPanel(panelControl);
+                                _btnCutImageData               = new wxCheckBox(panelControl,-1,_T("Cut Module"));
+               Connect(_btnCutImageData->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED  , (wxObjectEventFunction) &wxMPRWidget::OnCutImagaData );
+
+               wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
+               sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
+               sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
+               sizerCtrol->Add( _btnCutImageData               , 1, wxALL, 2);
+
+               panelControl->SetAutoLayout(true);
+               panelControl->SetSizer(sizerCtrol);
+               panelControl->SetSize(400,350);
+               panelControl->Layout();
+//EEDxx2.4
+//             panelControl->FitInside();
+
+//EEDxx2.4
+               panelClipping3D -> SetMinimumPaneSize( 5 );
+               panelClipping3D -> SplitHorizontally( panelControl , window3D , 10  );
+               wxwindow=panelClipping3D;
+       }
+
+    wxBoxSizer *sizerH1                                                        = new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(wxwindow , 1, wxALL|wxGROW, 0);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerH1);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+
+wxPanel* wxMPRWidget::CreateMPRPanel(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       wxNotebook *notebook = new wxNotebook( panel, -1 );
+
+       notebook->AddPage( CreateMPRPanel4View( notebook ,vtkmprbasedata), _T("4-View") );
+       notebook->AddPage( CreateView(0,notebook,vtkmprbasedata) , _T("Axial")          );
+       notebook->AddPage( CreateView(1,notebook,vtkmprbasedata) , _T("Sagital")        );
+       notebook->AddPage( CreateView(2,notebook,vtkmprbasedata) , _T("Coronal")        );
+       notebook->AddPage( CreateView(3,notebook,vtkmprbasedata) , _T("Plane")          );
+       notebook->AddPage( CreateView(4,notebook,vtkmprbasedata) , _T("Sphere")         );
+       notebook->AddPage( CreateView(5,notebook,vtkmprbasedata) , _T("MPR 3D")         );
+       notebook->AddPage( CreateView(6,notebook,vtkmprbasedata) , _T("Clipping")       );
+       Connect(notebook->GetId()       , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED  , (wxObjectEventFunction) &wxMPRWidget::OnPageAChanged   );
+
+       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add(notebook , 1, wxALL|wxGROW, 2);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+//EEDxx2.4
+//     panel->FitInside();
+
+       panel->Refresh();
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+
+wxPanel* wxMPRWidget::CreateMPRPanel4View(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       // view 0
+       _vtkmpr2Dview[0] = new wxVtkMPR2DView(panel,0);
+       _vtkmpr2Dview[0]->SetVtkBaseData(vtkmprbasedata);
+       wxVTKRenderWindowInteractor *iren0 = _vtkmpr2Dview[0]->GetWxVTKRenderWindowInteractor();        
+
+       // view 1
+       _vtkmpr2Dview[1] = new wxVtkMPR2DView(panel,1);
+       _vtkmpr2Dview[1]->SetVtkBaseData(vtkmprbasedata);
+       wxVTKRenderWindowInteractor *iren1 = _vtkmpr2Dview[1]->GetWxVTKRenderWindowInteractor();        
+
+       // view 2
+       _vtkmpr2Dview[2] = new wxVtkMPR2DView(panel,2);
+       _vtkmpr2Dview[2]->SetVtkBaseData(vtkmprbasedata);
+       wxVTKRenderWindowInteractor *iren2 = _vtkmpr2Dview[2]->GetWxVTKRenderWindowInteractor();        
+
+       // view 3
+       wxNotebook *notebook = new wxNotebook( panel, -1 );
+       notebook->SetSize(400,400);
+
+// EED 27 Oct 2007
+        // view 3.0
+       _widgetMesure   = new wxWidgetMesure2D_Plane_in_MPR(notebook);
+       _vtkplane2Dview = new vtkPlane2DView( _widgetMesure->GetWindow2() );
+       _widgetMesure->SetVtkPlane2DView( _vtkplane2Dview );
+       _vtkplane2Dview->SetImgSize( 200 );
+       _vtkplane2Dview->SetVtkBaseData(vtkmprbasedata);
+       notebook->AddPage( _widgetMesure, _T("Plane") );
+
+        // view 3.1
+       _wxsphereview = new wxSphereView( notebook , vtkmprbasedata, vtkmprbasedata->GetImageData());
+       wxVTKRenderWindowInteractor *iren3B = _wxsphereview->GetWxVTKRenderWindowInteractor();  
+       notebook->AddPage( iren3B, _T("Sphere") );
+
+
+        // view 3.2
+       wxSplitterWindow *panelMPR3D    = new wxSplitterWindow( notebook , -1);
+       _wxvtk3Dbaseview_MPRClipping3D  = new wxVtk3DBaseView( panelMPR3D );
+
+       _wxvtkmpr3Dview = new wxVtkMPR3DView( _wxvtk3Dbaseview_MPRClipping3D );
+       vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
+       vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkmpr3Ddataviewer->Configure();
+       _wxvtkmpr3Dview->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+
+       _wxvtkclipping3Dview = new wxVtkClipping3DView( _wxvtk3Dbaseview_MPRClipping3D );
+       vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
+       vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkclipping3Ddataviewer->Configure();
+       _wxvtkclipping3Dview->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
+
+
+       wxWindow        *window3D                               = _wxvtk3Dbaseview_MPRClipping3D->GetWxVTKRenderWindowInteractor();
+
+       wxPanel         *panelControl                   = new wxPanel(panelMPR3D,-1);
+       wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview->CreateControlPanel(panelControl);
+       wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview->CreateControlPanel(panelControl);
+
+
+
+
+//    wxBoxSizer        *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
+       wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
+       sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
+
+
+       panelControl->SetAutoLayout(true);
+       panelControl->SetSizer(sizerCtrol);
+       panelControl->SetSize(400,150);
+       panelControl->Layout();
+
+//EEDxx2.4
+       panelMPR3D      -> SetMinimumPaneSize( 5 );
+
+       panelMPR3D      -> SplitHorizontally( panelControl,window3D,200  );
+
+       notebook->AddPage( panelMPR3D, _T("MPR 3D - Clipping") );
+
+
+       Connect(notebook->GetId()       , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED  , (wxObjectEventFunction) &wxMPRWidget::OnPageBChanged   );
+
+       wxBoxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer *sizerH1= new wxBoxSizer(wxHORIZONTAL);
+       wxBoxSizer *sizerH2= new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(iren2 , 1, wxALL|wxEXPAND, 2);
+       sizerH1->Add(iren0 , 1, wxALL|wxEXPAND, 2);
+       sizerH2->Add(iren1 , 1, wxALL|wxEXPAND, 2);
+//     sizerH2->Add(iren3 , 1, wxALL|wxEXPAND, 2);
+       sizerH2->Add(notebook , 1, wxALL|wxEXPAND, 2);
+
+       sizerV->Add(sizerH1, 1, wxALL|wxEXPAND, 0);
+       sizerV->Add(sizerH2, 1, wxALL|wxEXPAND, 0);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerV);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+void wxMPRWidget::OnCutImagaData(wxCommandEvent &event) 
+{
+       if (_btnCutImageData->GetValue()==true){
+               _framePanelCutting = new wxFrame(this,-1,_T("Cutting Module"),wxDefaultPosition,wxDefaultSize,wxCAPTION|wxSTAY_ON_TOP| wxRESIZE_BORDER );
+               _framePanelCutting->SetSize(550,400);
+               _panelCutting   = new wxPanelCuttingImageData(_framePanelCutting);
+               _panelCutting->SetWxVtk3DBaseView( _wxvtk3Dbaseview_Clipping3D_BB  );
+               _panelCutting->SetVtkMPRBaseData( GetVtkMPRBaseData() );
+               _panelCutting->SetVtkClipping3DDataViewer( this->_wxvtkclipping3Dview_BB->GetVtkClipping3DDataViewer() );
+               _panelCutting->Configure( );
+/*
+               wxBoxSizer *topsizer            = new wxBoxSizer(wxHORIZONTAL  );
+               topsizer -> Add( _panelCutting ,1,wxALL  ,0);
+               _framePanelCutting->SetAutoLayout(true);
+               _framePanelCutting->SetSizer( topsizer );      // use the sizer for layout
+               _framePanelCutting->Layout(); 
+//EEDxx2.4
+//             _framePanelCutting->FitInside();
+*/
+               _framePanelCutting->Show();
+       } else {
+               if (_framePanelCutting!=NULL){
+                       _panelCutting->RemoveActors();
+                       _framePanelCutting->Close();
+                       _framePanelCutting      = NULL;
+                       _panelCutting           = NULL;
+               }
+       }
+}
+
+//----------------------------------------------------------------------------
+void wxMPRWidget::ConfigureVTK(){
+       int x=0,y=0,z=0;
+
+       if (_vtkmprbasedata!=NULL)
+       {
+               x=_vtkmprbasedata                       ->      GetMaxPositionX()/2;
+               y=_vtkmprbasedata                       ->      GetMaxPositionY()/2;
+               z=_vtkmprbasedata                       ->      GetMaxPositionZ()/2;
+       }
+
+       if(_vtkmpr2Dview[0]!=NULL) {_vtkmpr2Dview[0]                            ->      Configure();}
+       if(_vtkmpr2Dview[1]!=NULL) {_vtkmpr2Dview[1]                            ->      Configure();}
+       if(_vtkmpr2Dview[2]!=NULL) {_vtkmpr2Dview[2]                            ->      Configure();}
+
+
+       if (_vtkmpr2Dview_B[0]!=NULL) { _vtkmpr2Dview_B[0]                              ->      Configure(); }
+       if (_vtkmpr2Dview_B[1]!=NULL) { _vtkmpr2Dview_B[1]                              ->      Configure(); }
+       if (_vtkmpr2Dview_B[2]!=NULL) { _vtkmpr2Dview_B[2]                              ->      Configure(); }
+
+
+       if (_vtkmprbasedata!=NULL)
+       {
+               _vtkmprbasedata->SetX( x );
+               _vtkmprbasedata->SetY( y );
+               _vtkmprbasedata->SetZ( z );
+       }
+
+       if (_vtkplane2Dview!=NULL){_vtkplane2Dview                              ->      Configure();}
+       if (_widgetMesure!=NULL){_widgetMesure                                  ->      ConfigureA(_vtkplane2Dview);}
+       if (_widgetMesure!=NULL){_widgetMesure                                  ->      SetActiveLink(true);}
+       if (_widgetMesure!=NULL){_widgetMesure                                  ->      SetMesureScale( _voxelSize );}
+       if (_wxsphereview!=NULL){_wxsphereview                                  ->      Configure();}
+
+       if (_wxvtk3Dbaseview_MPRClipping3D!=NULL){_wxvtk3Dbaseview_MPRClipping3D        ->  Configure();}
+       if (_wxvtkmpr3Dview!=NULL){
+               _wxvtkmpr3Dview                                 ->      Configure();
+       }
+       if (_wxvtkclipping3Dview!=NULL){_wxvtkclipping3Dview            ->      Configure();}
+
+       if (_vtkplane2Dview_B!=NULL){   _vtkplane2Dview_B                       ->      Configure(); }
+       if (_widgetMesure_B!=NULL){             _widgetMesure_B                         ->      ConfigureA( _vtkplane2Dview_B ); }
+       if (_widgetMesure_B!=NULL){             _widgetMesure_B                         ->      SetActiveLink(true); }
+
+//EEDx3
+//     double spc[3];
+//     vtkImageData *imageData = _vtkmprbasedata->GetImageData();
+//     imageData->Update();
+//     imageData->GetSpacing(spc);
+//     _widgetMesure_B->SetMesureScale(spc[0]);
+
+       if (_widgetMesure_B!=NULL)                                      {_widgetMesure_B->SetMesureScale( _voxelSize );}
+
+
+       if (_wxsphereview_B!=NULL)                                      {_wxsphereview_B                                ->      Configure();}
+
+       if (_wxvtk3Dbaseview_MPR3D_B!=NULL)                     {_wxvtk3Dbaseview_MPR3D_B               ->  Configure();}
+       if (_wxvtkmpr3Dview_B!=NULL)                            {_wxvtkmpr3Dview_B                              ->      Configure();}
+
+       if ( _wxvtk3Dbaseview_Clipping3D_BB!=NULL)      {_wxvtk3Dbaseview_Clipping3D_BB ->  Configure(); }
+       if ( _wxvtkmpr3Dview_BB!=NULL)                          {_wxvtkmpr3Dview_BB                             ->      Configure(); }
+       if ( _wxvtkclipping3Dview_BB!=NULL)                     {_wxvtkclipping3Dview_BB                ->      Configure(); }
+
+
+       vtkInteractorStyle3DView *vtkinteractorstyle3Dview;
+       if (_wxvtkmpr3Dview_BB!=NULL)
+       {
+               vtkinteractorstyle3Dview        = new vtkInteractorStyle3DView();
+               vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_BB);
+               vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_BB);
+       }
+
+       if (_wxvtk3Dbaseview_Clipping3D_BB!=NULL)
+       {
+               _wxvtk3Dbaseview_Clipping3D_BB->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
+       }
+
+       RefreshView(true);
+}
+
+//----------------------------------------------------------------------------
+
+void wxMPRWidget::OnRefreshView(wxCommandEvent & event)
+{
+       RefreshView();
+}
+//----------------------------------------------------------------------------
+void wxMPRWidget::OnDClickLeft(wxCommandEvent & event)
+{
+       if (_wxsphereview!=NULL) {
+               _wxsphereview   -> RefreshPoint();
+       }
+       if (_wxsphereview_B!=NULL) {
+               _wxsphereview_B -> RefreshPoint();
+       }
+}
+//----------------------------------------------------------------------------
+void wxMPRWidget::RefreshView(bool firsttime){
+
+       if (_refreshAPage == 0 )
+       {
+
+               if ((_vtkmpr2Dview[0]!=NULL) && (_vtkmpr2Dview[1]!=NULL) && (_vtkmpr2Dview[2]!=NULL) )
+               {
+                       _vtkmpr2Dview[2] -> Refresh();
+                       _vtkmpr2Dview[1] -> Refresh();
+                       _vtkmpr2Dview[0] -> Refresh();
+
+                       if (firsttime==false)
+                       {
+                               _vtkmpr2Dview[2] -> RefreshView();
+                               _vtkmpr2Dview[1] -> RefreshView();
+                               _vtkmpr2Dview[0] -> RefreshView();
+                       }
+
+                       if (_refreshBPage == 0 )
+                       {
+                               if (_vtkplane2Dview!=NULL)
+                               {
+                                       _vtkplane2Dview -> Refresh();           
+                                       if (firsttime==false)
+                                       {
+                                               _vtkplane2Dview -> RefreshView();
+                                       }
+//                                     _wxvtk3Dbaseview_MPR3D_B -> Refresh();
+                               }
+                       }
+                       if (_refreshBPage == 1 )
+                       {
+                               //sphere
+                       }
+                       if (_refreshBPage == 2 )
+                       {
+                               if ((_wxvtkmpr3Dview!=NULL)  && (_wxvtk3Dbaseview_MPRClipping3D!=NULL) && (_wxvtkclipping3Dview!=NULL) )
+                               {
+                                       _wxvtkmpr3Dview                 -> RefreshView();
+                                       _wxvtk3Dbaseview_MPRClipping3D  -> Refresh();
+                                       _wxvtkclipping3Dview            -> Refresh();
+                               }
+                       }
+               }
+       }
+
+       if (_refreshAPage == 1 )
+       {
+               if (_vtkmpr2Dview_B[0] !=NULL){
+                       _vtkmpr2Dview_B[0] -> Refresh();
+               }
+       }
+       if (_refreshAPage == 2 )
+       {
+               if (_vtkmpr2Dview_B[1] !=NULL){
+                       _vtkmpr2Dview_B[1] -> Refresh();
+               }
+       }
+       if (_refreshAPage == 3 )
+       {
+               if (_vtkmpr2Dview_B[2] !=NULL){
+                       _vtkmpr2Dview_B[2] -> Refresh();
+               }
+       }
+       if (_refreshAPage == 4 )
+       {
+               if (_vtkplane2Dview_B!=NULL){
+                       _vtkplane2Dview_B -> Refresh();
+                       if (firsttime==false)
+                       {
+                               _vtkplane2Dview_B -> RefreshView();
+                       }
+               }
+       }
+
+       if (_refreshAPage == 5 )
+       {
+               // sphere
+       }
+       if (_refreshAPage == 6 )
+       {
+               if (_wxvtkmpr3Dview_B!=NULL){
+                       _wxvtkmpr3Dview_B               -> Refresh();
+                       _wxvtk3Dbaseview_MPR3D_B        -> Refresh();
+               }
+       }
+       if (_refreshAPage == 7 )
+       {
+               if (_wxvtkmpr3Dview_BB!=NULL){
+                       _wxvtkmpr3Dview_BB              -> RefreshView();
+                       _wxvtkclipping3Dview_BB         -> Refresh();
+                       _wxvtk3Dbaseview_Clipping3D_BB  -> Refresh();
+                       if (_panelCutting!=NULL)
+                       {
+                               _panelCutting->RefreshView();
+                       }
+               }
+       }
+
+}
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxMPRWidget::GetVtkMPRBaseData(){
+       return _vtkmprbasedata;
+}
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxMPRWidget::GetVtkPlane2DView()
+{
+       return _vtkplane2Dview;
+}
+//----------------------------------------------------------------------------
+wxVtkMPR3DView  *wxMPRWidget::GetWxvtkmpr3Dview_BB()
+{
+       return _wxvtkmpr3Dview_BB;
+}
+//----------------------------------------------------------------------------
+wxVtkBaseView *wxMPRWidget::GetWxVtkBaseView(int page, int id)
+{
+       wxVtkBaseView *result=NULL;
+       if (page==0)
+       {       
+               if ((id>=0) &&(id<=3)){
+                       result=_vtkmpr2Dview[id];
+               }
+               if (id==3)
+               {
+                       result=_vtkplane2Dview;
+               }
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+wxVtkMPR2DView *wxMPRWidget::GetWxvtkMPR2Dview(int direction)
+{
+       return _vtkmpr2Dview[direction];
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+wxMPRWidget2::wxMPRWidget2(wxWindow* parent,marImageData *marimagedata,double voxelSize)
+: wxMPRWidget(parent,marimagedata,voxelSize)
+{
+}
+//----------------------------------------------------------------------------
+wxMPRWidget2::~wxMPRWidget2()
+{
+}
+//----------------------------------------------------------------------------
+void wxMPRWidget2::OnRefreshView(wxCommandEvent & event) // Virtual
+{      
+       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+    this->GetParent()->ProcessEvent(newevent1);
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+figureCuttingModel::figureCuttingModel()
+{
+       _inversModel    = vtkTransform::New();
+       _matrixModel    = vtkTransform::New();
+       _matrixVisual   = vtkTransform::New();
+
+       _spcX=1;
+       _spcY=1;
+       _spcZ=1;
+}
+//----------------------------------------------------------------------------
+figureCuttingModel::~figureCuttingModel() // virtual
+{
+       _inversModel->Delete();
+}
+//----------------------------------------------------------------------------
+void figureCuttingModel::SetPosition(double x,double y, double z)
+{
+       _px=x;
+       _py=y;
+       _pz=z;
+}
+//----------------------------------------------------------------------------
+void figureCuttingModel::SetScale(double sx,double sy, double sz)
+{
+       _sx=sx;
+       _sy=sy;
+       _sz=sz;
+}
+//----------------------------------------------------------------------------
+void figureCuttingModel::SetRotation(double alfa,double beta, double teta)
+{
+       _alfa=alfa;
+       _beta=beta;
+       _teta=teta;
+}
+
+//----------------------------------------------------------------------------
+void figureCuttingModel::CalculeMatrix()
+{
+       _matrixModel->Identity();
+       _matrixModel->Translate(_px,_py,_pz);
+       _matrixModel->RotateY(_beta);
+       _matrixModel->RotateX(_alfa);
+       _matrixModel->RotateY(_teta);
+       _matrixModel->Scale(_sx,_sy,_sz);
+
+       _matrixVisual->Identity();
+       _matrixVisual->Translate( _px*_spcX  ,  _py*_spcY  ,  _pz*_spcZ  );
+       _matrixVisual->RotateY(_beta);
+       _matrixVisual->RotateX(_alfa);
+       _matrixVisual->RotateY(_teta);
+       _matrixVisual->Scale( _sx*_spcX  ,  _sy*_spcY  ,  _sz*_spcZ  );
+
+}
+
+
+//----------------------------------------------------------------------------
+void figureCuttingModel::CalculeInversMatrix()
+{
+       _inversModel->Identity ();
+       _inversModel->Concatenate ( _matrixModel );
+       _inversModel->Inverse();
+}
+//----------------------------------------------------------------------------
+bool figureCuttingModel::IfPointInside(double x, double y, double z) // virtual
+{
+       return true;
+}
+
+//----------------------------------------------------------------------------
+vtkTransform *figureCuttingModel::GetVtkTransform()
+{
+       return _matrixVisual;
+}
+
+//----------------------------------------------------------------------------
+//void figureCuttingModel::SetVtkTransform(vtkTransform *matrix)
+//{
+//     _matrixModel = matrix;
+//}
+
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetTheoricVolume() // virtual
+{
+       return 0;
+}
+
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetPositionX()
+{
+       return _px;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetPositionY()
+{
+       return _py;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetPositionZ()
+{
+       return _pz;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetScaleX()
+{
+       return _sx;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetScaleY()
+{
+       return _sy;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetScaleZ()
+{
+       return _sz;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetAngleAlfa()
+{
+       return _alfa;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetAngleBeta()
+{
+       return _beta;
+}
+//----------------------------------------------------------------------------
+double figureCuttingModel::GetAngleTeta()
+{
+       return _teta;
+}
+//----------------------------------------------------------------------------
+char *figureCuttingModel::GetName() // virtual
+{
+       return "--";
+}
+
+//----------------------------------------------------------------------------
+void figureCuttingModel::SetSpacing(double spcX,double spcY, double spcZ)
+{
+       _spcX = spcX;
+       _spcY = spcY;
+       _spcZ = spcZ;
+}
+
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+figureCuttingSphereModel::figureCuttingSphereModel()
+{
+}
+//----------------------------------------------------------------------------
+figureCuttingSphereModel::~figureCuttingSphereModel() // virtual
+{
+}
+//----------------------------------------------------------------------------
+bool figureCuttingSphereModel::IfPointInside(double x, double y, double z) // virtual
+{
+       double in[4],out[4];
+       in[0]=x;
+       in[1]=y;
+       in[2]=z;
+       in[3]=1;
+       _inversModel->MultiplyPoint (in, out);
+
+       bool result=false;
+       if (sqrt( out[0]*out[0] + out[1]*out[1] + out[2]*out[2] )<0.5 )
+       {
+               result=true;
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+double figureCuttingSphereModel::GetTheoricVolume() // virtual
+{
+       double piTMP=3.14159265;
+       return (4.0/3.0) * piTMP * (_sx/2)*(_sy/2)*(_sz/2);
+}
+//----------------------------------------------------------------------------
+char *figureCuttingSphereModel::GetName() // virtual
+{
+       return "Sphere";
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+figureCuttingCubeModel::figureCuttingCubeModel()
+{
+}
+//----------------------------------------------------------------------------
+figureCuttingCubeModel::~figureCuttingCubeModel()  // virtual
+{
+}
+//----------------------------------------------------------------------------
+bool figureCuttingCubeModel::IfPointInside(double x, double y, double z) // virtual
+{
+       double in[4],out[4];
+       in[0]=x;
+       in[1]=y;
+       in[2]=z;
+       in[3]=1;
+       _inversModel->MultiplyPoint (in, out);
+
+       bool result=false;
+       if ((out[0]>-0.5) && (out[0]<0.5) && (out[1]>-0.5) && (out[1]<0.5)  && (out[2]>-0.5) && (out[2]<0.5)  )
+       {
+               result=true;
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+double figureCuttingCubeModel::GetTheoricVolume() // virtual
+{
+       return _sx * _sy * _sz;
+}
+
+//----------------------------------------------------------------------------
+char *figureCuttingCubeModel::GetName() // virtual
+{
+       return "Cube";
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+figureCuttingCylinderModel::figureCuttingCylinderModel()
+{
+}
+//----------------------------------------------------------------------------
+figureCuttingCylinderModel::~figureCuttingCylinderModel()  // virtual
+{
+}
+//----------------------------------------------------------------------------
+bool figureCuttingCylinderModel::IfPointInside(double x, double y, double z) // virtual
+{
+       double in[4],out[4];
+       in[0]=x;
+       in[1]=y;
+       in[2]=z;
+       in[3]=1;
+       _inversModel->MultiplyPoint (in, out);
+
+       bool result=false;
+       if ((sqrt( out[0]*out[0] + out[2]*out[2] )<0.5 )  && (out[1]>-0.5) && (out[1]<0.5)  )
+       {
+               result=true;
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+double figureCuttingCylinderModel::GetTheoricVolume() // virtual
+{
+       double piTMP=3.14159265;
+       return piTMP*(_sx/2)*(_sz/2)*_sy;
+}
+//----------------------------------------------------------------------------
+char *figureCuttingCylinderModel::GetName() // virtual
+{
+       return "Cylinder";
+}
+//----------------------------------------------------------------------------
+
+
+
+// EOF - wxMPRWidget.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.h
new file mode 100644 (file)
index 0000000..7440a6f
--- /dev/null
@@ -0,0 +1,1029 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMPRWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MPR__WIDGET__HXX__
+#define __WX__MPR__WIDGET__HXX__
+
+
+#include <vector>
+
+#include <vtkObjectBase.h>
+#include <vtkCommand.h>
+#include <vtkActor.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProbeFilter.h>
+#include <vtkPlaneSource.h> 
+#include <vtkImageChangeInformation.h>
+#include <vtkStructuredPoints.h> 
+#include <vtkTransform.h> 
+#include <vtkImageViewer2.h> 
+#include <vtkBoxWidget.h>
+#include <vtkPointWidget.h>
+#include <vtkPlaneWidget.h>
+
+#include <vtkCubeSource.h>
+#include <vtkCylinderSource.h>
+#include <vtkSphereSource.h>
+#include <vtkProperty2D.h>
+#include <vtkTextProperty.h>
+#include <vtkXYPlotActor.h>
+
+
+//#include "kernel/marInterface.h"
+#include "../manualContour.h"
+
+#include "wxMPRBaseData.h"
+#include "wxVtkBaseView.h"
+
+#include <wx/notebook.h>
+#include <wx/listbox.h>
+#include <wx/tglbtn.h>
+#include <wx/splitter.h>
+
+
+class wxMPRWidget;
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInteractorStyleSphere : public InteractorStyleMaracas
+{
+public:
+       vtkInteractorStyleSphere();
+       ~vtkInteractorStyleSphere();
+       virtual bool  OnLeftButtonUp(); 
+       virtual bool  OnLeftButtonDown(); 
+       virtual bool  OnMouseMove(); 
+       virtual bool  OnRightButtonUp();
+       virtual bool  OnRightButtonDown();
+
+private:
+       bool    _stateRotate;
+       bool    _stateRadio;
+       int     _fordwareX;
+       int     _fordwareY;
+
+       double  _radio;
+};
+
+
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+class idAlBeRa
+{
+public:
+       int             _id;
+       double  _radio;
+       int             _deltavoxel;
+       idAlBeRa(int id, double radio,int deltavoxel);
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxSphereView : public wxVtk2DBaseView
+{
+public:
+       wxSphereView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata, vtkImageData *imageData);
+       ~wxSphereView();
+       virtual void Configure();
+       void RotationEnd();
+       void RotationStart(double vx, double vy, bool ok_v, bool ok_ang);
+       virtual void    RefreshView();
+       virtual void    SetVoxel(double i, double j, int delta, double id, unsigned short gris);
+                       void    SetDeltaVoxel(int delta);
+                       double  GetRadio();
+                       void    SetRadio(double radio);
+                       int             GetIdOfImage(double radio);
+                       void    SetXYZtoParent(double i, double j);
+                       void    RefreshPoint();
+
+private:       
+       std::vector<idAlBeRa*> _lstId;
+
+       int                                                     _centerX;
+       int                                                     _centerY;
+       int                                                     _centerZ;
+       double                                          _radio;
+
+       double                                          _ang;
+       double                                          _vxb;
+       double                                          _vyb;
+
+       int                                                     _delta;
+
+       vtkImageData                            *_imageDataOriginal;
+       vtkImageData                            *_imageSphere;
+
+       vtkMPRBaseData                          *_vtkmprbasedata;
+       vtkInteractorStyleSphere        *_vtkinteractorstylesphere;
+
+       vtkTransform                            *_transform; 
+       vtkTransform                            *_transform1; 
+       vtkTransform                            *_transform2; 
+
+       void    FiltreImage(int id, double radio);
+       void    FiltreImageB(int id, double radio, bool ok,int deltaTMP);
+       void    DefineImageSphere();
+       void    ResetlstId();
+
+       void    InitSphere(double points[4][3]);
+       double  SphereFindCenter(double P[4][3], double cc[3]);
+       double  determinant(double a[4][4], int n);
+
+       void    GetPointSphere(double p[3],double r1,double angA,double angB);
+       void    RotatePointOverTheSphere( double pp[3], double p[3],double cc[3]);
+       void    TransferePoints(double pp1[3],double pp2[3],double AngX,double AngY,vtkImageData *image);
+};
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+class vtkInteractorStylePlane2D;
+class vtkInfoTextImageInteractorPlane2D;
+
+class vtkPlane2DView : public wxVtk2DBaseView
+{
+public:
+       vtkPlane2DView(wxWindow *parent);
+       ~vtkPlane2DView();
+       void                    Configure();
+       void                    ExtractPlane();
+       int                             GetImgSize();
+       void                    SetImgSize( int imgSize );
+
+       void                    RotationStart();
+       void                    RotationDrag(double vx, double vy,  bool ok_v, bool ok_ang);
+
+       virtual int             GetActualSlice(); 
+       virtual void    SetActualSlice(int slice);
+
+       virtual void    Refresh( );
+
+       vtkMPRBaseData                          *GetVtkmprbasedata();
+       vtkInteractorStylePlane2D       *GetInteractorstyleplane2D();
+
+       void                    SetActive(bool active);
+       void                    SetVisibleLine(bool ok);
+
+       void                    TransfromeCoordViewWorld2(double &X, double &Y, double &Z);
+
+       int                             GetMipWidth();
+       void                    SetMipWidth(int value);
+       bool                    GetMipVisualization();
+       void                    SetMipVisualization(bool ok);
+
+       void                    ResetBack();
+
+private:
+       bool                    _active;
+       int                             _mip_width;
+       bool                    _mip_visualization;
+
+       double                  _backX;
+       double                  _backY;
+       double                  _backZ;
+       double                  _backOrient[4];
+
+       double                  _ang;
+       double                  _vxb;
+       double                  _vyb;
+       double                  _n[3];   // Normal
+
+       double                  _cx;
+       double                  _cy;
+       double                  _cz;
+
+       int                             _sizeIma;
+
+       vtkImageData *  _imageResult;
+
+       // Horizontal line
+       vtkPoints                                                       *_pts;
+       vtkActor                                                        *_lineActor;
+       vtkPolyDataMapper                                       *_lineMapper;
+    vtkPolyData                                                        *_pd;
+
+    vtkProbeFilter                                             *_3Dslices;
+       vtkPlaneSource                                          *_pSource;
+       vtkStructuredPoints                                     *_stPoints;
+    vtkImageChangeInformation                  *_change;
+       vtkTransform                                            *_transform1; 
+       vtkTransform                                            *_transform2; 
+
+       vtkInteractorStylePlane2D                       *_interactorstyleplane2D;
+
+       vtkInfoTextImage                                        *_vtkInfoTextImage;
+       vtkInfoTextImageInteractorPlane2D       *_vtkInfoTextImageInteractorPlane2D;
+
+
+       void SetPSource(int sizeIma);
+       void HorizontalLine();
+       void ResetPlane();
+       void Extract_One_PlaneVTK();
+       void Extract_MIP_PlaneVTK();
+
+protected:
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInfoTextImageInteractorPlane2D : public vtkInfoTextImageInteractor{
+public:
+       vtkInfoTextImageInteractorPlane2D();
+       ~vtkInfoTextImageInteractorPlane2D();
+
+protected:
+
+       virtual bool  OnMouseMove();
+
+private:
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInteractorStylePlane2D : public InteractorStyleMaracas 
+{
+public:
+       vtkInteractorStylePlane2D();
+       ~vtkInteractorStylePlane2D();
+       virtual bool  OnLeftButtonDown(); 
+       virtual bool  OnLeftButtonUp();
+       virtual bool  OnMouseMove(); 
+       virtual bool  OnRightButtonUp();
+       virtual bool  OnLeftDClick();
+                       bool  GetStateRotate();
+
+private:
+       bool    _stateRotate;
+
+       int     _fordwareX;
+       int     _fordwareY;
+};
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class manualViewPerpPlaneContour : public manualViewContour
+{
+public:
+       manualViewPerpPlaneContour();
+       ~manualViewPerpPlaneContour();
+       virtual manualViewPerpPlaneContour * Clone();
+       void CopyAttributesTo( manualViewPerpPlaneContour *cloneObject );
+
+       virtual void UpdateViewPoint(int id);
+       virtual void RefreshContour();
+       virtual void TransfromeCoordViewWorld( double &X,double &Y,double &Z,int type );
+       virtual bool ifTouchContour( int x, int y, int z);
+
+protected:
+private:
+       void FilterCordinateXYZ (double &x, double &y, double &z);
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+                               
+class vtkInteractorStyleMPRView;
+       
+class wxVtkMPR2DView :  public wxVtk2DBaseView
+{
+public:
+       wxVtkMPR2DView( wxWindow *parent, int direction );
+       ~wxVtkMPR2DView();
+       void Configure();
+       virtual void                    Refresh();
+                       vtkMPRBaseData  *GetVtkmprbasedata();
+       virtual int                             GetActualSlice();
+       virtual void                    SetActualSlice(int slice);
+
+                       bool                    IfMouseTouchX(double x, double y, double z);
+                       bool                    IfMouseTouchY(double x, double y, double z);
+                       bool                    IfMouseTouchZ(double x, double y, double z);
+                       void                    MoveX(double x, double y, double z);
+                       void                    MoveY(double x, double y, double z);
+                       void                    MoveZ(double x, double y, double z);
+                       void                    ChangeAxisColor(double x, double y, double z);
+       virtual void                    TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type);
+                       void                    SetVisibleAxis(bool ok);
+
+
+private:
+
+       int                                                     _backX;
+       int                                                     _backY;
+       int                                                     _backZ;
+
+       bool                                            _visibleAxis;
+
+       int                                                     _direction;
+       vtkPoints                                       *_ptsA;
+       vtkActor                                        *_lineAActor;
+       vtkPolyDataMapper                       *_lineAMapper;
+    vtkPolyData                                        *_pdA;
+       vtkPoints                                       *_ptsB;
+       vtkActor                                        *_lineBActor;
+       vtkPolyDataMapper                       *_lineBMapper;
+    vtkPolyData                                        *_pdB;
+//     vtkInteractorStyle2DMaracas     *_interactorStyle2DMaracas; 
+       vtkInteractorStyleMPRView       *_interactorstylemprview;
+};
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInteractorStyleMPRView : public InteractorStyleMaracas
+{
+public:
+       vtkInteractorStyleMPRView();
+       ~vtkInteractorStyleMPRView();
+
+       virtual bool  OnMouseMove();
+       virtual bool  OnLeftButtonDown(); 
+       virtual bool  OnLeftButtonUp();
+       virtual bool  OnLeftDClick();
+
+protected:
+/*EED Borrame
+               double  _xBack;
+               double  _yBack;
+*/
+               bool    _stateMoveAxisX;
+               bool    _stateMoveAxisY;
+               bool    _stateMoveAxisZ;
+};
+
+
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+class wxVtkMPR3DView;
+
+class wxVtkMPR3DViewCntrlPanel: public wxPanel
+{
+public:
+       wxVtkMPR3DViewCntrlPanel(wxWindow *parent, wxVtkMPR3DView *wxvtkmpr3Dview);
+       ~wxVtkMPR3DViewCntrlPanel();
+       void            OnVisibleAxisX(wxCommandEvent& event);
+       void            OnVisibleAxisY(wxCommandEvent& event);
+       void            OnVisibleAxisZ(wxCommandEvent& event);
+       void            OnPositionX(wxScrollEvent& event);
+       void            OnPositionY(wxScrollEvent& event);
+       void            OnPositionZ(wxScrollEvent& event);
+       void            OnVisibleAxisXYZ(wxCommandEvent& event);
+       void            OnVisiblePlane(wxCommandEvent& event);
+       void            OnEditColorTable(wxCommandEvent& event);
+       virtual void Refresh();
+
+private:
+       wxVtkMPR3DView  *_wxvtkmpr3Dview;
+
+       wxSlider                *_opacity;
+       wxSlider                *_isoValue;
+       wxSlider                *_isoValueSpin;
+       wxStaticText    *_isoValueText;
+       wxRadioButton   *_surfA;
+       wxRadioButton   *_surfB;
+       wxRadioButton   *_surfC;
+       wxRadioButton   *_surfD;
+       wxCheckBox              *_visible;
+       wxButton                *_color;
+       wxSlider                *_positionX;
+       wxSlider                *_positionY;    
+       wxSlider                *_positionZ;
+
+       wxCheckBox              *_ckBoxXYZ;
+       wxCheckBox              *_ckBoxPlane;
+
+
+protected:
+
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+class wxVtkClipping3DView;
+
+
+
+class wxVtkClipping3DViewCntrlPanel: public wxPanel
+{
+public:
+       wxVtkClipping3DViewCntrlPanel(wxWindow *parent, wxVtkClipping3DView *_wxvtkclipping3Dview);
+       ~wxVtkClipping3DViewCntrlPanel();
+                       void    OnSurface(wxCommandEvent& event);
+                       void    OnRepresentationSurfaceWireFrame(wxCommandEvent& event);
+                       void    OnVisibleVolume(wxCommandEvent& event);
+                       void    OnVisibleBoxSurface(wxCommandEvent& event);
+                       void    OnVisibleBoxVolume(wxCommandEvent& event);
+                       void    OnColor(wxCommandEvent& event);
+                       void    OnVisibleSurface(wxCommandEvent& event);
+                       void    OnOpacity(wxScrollEvent& event);
+                       void    OnIsoValue(wxScrollEvent& event);
+                       void    OnIsoValueSpin(wxScrollEvent& event);
+       virtual void    Refresh();
+                       void    OnBtnCreateFileSTL(wxCommandEvent& event);
+                       void    OnBtnSaveRawVolume(wxCommandEvent& event);
+                       void    OnBtnVolumeFunctions(wxCommandEvent& event);
+                       void    OnBtnMeshVTKLoad(wxCommandEvent& event);
+
+
+private:
+       wxVtkClipping3DView     *_wxvtkclipping3Dview;
+       wxSlider                        *_opacity;
+       wxSlider                        *_isoValue;
+       wxSlider                        *_isoValueSpin;
+       wxRadioButton           *_surfA;
+       wxRadioButton           *_surfB;
+       wxRadioButton           *_surfC;
+       wxRadioButton           *_surfD;
+       wxCheckBox                      *_visible;
+       wxButton                        *_color;
+
+       wxRadioButton           *_wireFrameRep;
+       wxRadioButton           *_surfaceRep;
+
+       int                             GetIdTissue();
+protected:
+
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class vtkmyPWCallback_3DPointWidget : public vtkCommand
+{
+public:
+  static vtkmyPWCallback_3DPointWidget *New() 
+    { return new vtkmyPWCallback_3DPointWidget; }
+  virtual void Execute(vtkObject *caller, unsigned long, void*);
+  vtkmyPWCallback_3DPointWidget(){}
+  void SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview );
+  void SetVtkPointWidget( vtkPointWidget *pointWidget );
+  void SetVtkPlaneWidget( vtkPlaneWidget *planeWidget );
+private:
+
+       double                                                  _backNormal[3];
+       vtkPlaneWidget                                  *_planeWidget;
+       vtkPointWidget                                  *_pointWidget;
+       wxVtkMPR3DView *_wxvtkmpr3Dview;
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxVtkMPR3DView
+{
+public:
+       wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview );
+       ~wxVtkMPR3DView();
+       void                            VisibleImageActor(int idPosition, bool visible);
+       void                            VisiblePointWidget( bool visible );
+       void                            VisiblePlaneWidget( bool visible );
+
+       void                            SetVisibleTissue(int idTissue, bool visible);
+       bool                            GetVisibleTissue(int idTissue);
+       virtual void            Refresh();
+       virtual void            RefreshView();
+       virtual void            Configure();
+       void                            SetVtkMPR3DDataViewer( vtkMPR3DDataViewer *vtkmpr3Ddataviewer );
+       wxPanel*                        CreateControlPanel(wxWindow *parent);
+
+       vtkMPR3DDataViewer* GetVtkMPR3DDataViewer();
+       wxVtk3DBaseView*        GetWxvtk3Dbaseview();
+
+       void                            InitOrientationPointWidget(); 
+
+       // EED 25 Janvier 2007 testLoic
+       void                            TestLoic1();
+       void                            TestLoic2();
+
+
+private:
+       wxVtk3DBaseView                                 *_wxvtk3Dbaseview;
+       vtkMPR3DDataViewer                              *_vtkmpr3Ddataviewer;
+       wxVtkMPR3DViewCntrlPanel                *_wxvtkmpr3DviewCntrlPanel;
+
+       // Plane Widget (3D)
+       vtkPolyData                                             *_vtkplane;
+       vtkActor                                                *_contourPlaneActor;
+       vtkPlaneWidget                                  *_planeWidget;
+
+       // Point Widget (3D)
+       vtkPointWidget                                  *_pointWidget;
+       vtkmyPWCallback_3DPointWidget   *_myCallback;
+
+protected:
+};
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxVtkClipping3DView
+{
+public:
+       wxVtkClipping3DView( wxVtk3DBaseView* wxvtk3Dbaseview );
+       ~wxVtkClipping3DView();
+       virtual void                            Refresh();
+       virtual void                            Configure();
+       void                                            SetVtkClipping3DDataViewer( vtkClipping3DDataViewer *vtkclipping3Ddataviewer );
+       wxPanel*                                        CreateControlPanel(wxWindow *parent);
+       vtkClipping3DDataViewer*        GetVtkClipping3DDataViewer();
+
+       void                                            VisibleActor(int idTissue, bool visTissue);
+       void                                            VisibleVolumeActor( bool visVolume );
+       void                                            SetVisibleBoxSurface(bool visible);
+       void                                            SetVisibleBoxVolume(bool visible);
+       void                                            SetRepSurfaceWireFrame(int idTissue , bool typeRepresentation );
+
+       wxVtk3DBaseView*                        GetWxvtk3Dbaseview();
+
+private:
+       wxVtk3DBaseView                                 *_wxvtk3Dbaseview;
+       vtkClipping3DDataViewer                 *_vtkclipping3Ddataviewer;
+       vtkBoxWidget                                    *_boxWidgetS1;
+       vtkBoxWidget                                    *_boxWidgetVolume;
+       wxVtkClipping3DViewCntrlPanel   *_wxvtkclipping3DviewCntrlPanel;
+protected:
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInteractorStyle3DView : public InteractorStyleMaracas
+{
+public:
+       vtkInteractorStyle3DView();
+       ~vtkInteractorStyle3DView();
+
+       virtual bool                    OnLeftDClick();
+       bool                                    SelectMarchibCubePoint();
+
+
+       wxVtkMPR3DView                  *GetWxVtkMPR3DView();
+       void                                    SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview );
+
+       wxVtkClipping3DView             *GetWxVtkClipping3DView();
+       void                                    SetWxVtkClipping3DView( wxVtkClipping3DView *wxvtkclipping3Dview);
+
+protected:
+private:
+       wxVtkMPR3DView                  *_wxvtkmpr3Dview;
+       wxVtkClipping3DView             *_wxvtkclipping3Dview;
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class figureCuttingModel
+{
+public:
+       figureCuttingModel();
+       virtual ~figureCuttingModel();
+
+       void                    SetPosition(double x,double y, double z);
+       double                  GetPositionX();
+       double                  GetPositionY();
+       double                  GetPositionZ();
+
+       void                    SetScale(double sx,double sy, double sz);
+       double                  GetScaleX();
+       double                  GetScaleY();
+       double                  GetScaleZ();
+
+       void                    SetRotation(double alfa,double beta, double teta);
+       double                  GetAngleAlfa();
+       double                  GetAngleBeta();
+       double                  GetAngleTeta();
+
+       void                    SetSpacing(double spcX,double spcY, double spcZ);
+
+       void                    CalculeMatrix();
+       void                    CalculeInversMatrix();
+       virtual bool    IfPointInside(double x, double y, double z);
+       vtkTransform    *GetVtkTransform();
+//     void                    SetVtkTransform(vtkTransform *matrix);
+       virtual double  GetTheoricVolume();
+       virtual                 char *GetName();
+
+private:
+       double                  _px;
+       double                  _py;
+       double                  _pz;
+       double                  _alfa;
+       double                  _beta;
+       double                  _teta;
+       double                  _spcX;
+       double                  _spcY;
+       double                  _spcZ;
+protected:
+       double                  _sx;
+       double                  _sy;
+       double                  _sz;
+       vtkTransform    *_inversModel;
+       vtkTransform    *_matrixModel;
+       vtkTransform    *_matrixVisual;
+
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class figureCuttingSphereModel : public figureCuttingModel
+{
+public:
+       figureCuttingSphereModel();
+       virtual ~figureCuttingSphereModel();
+       virtual bool IfPointInside(double x, double y, double z);
+       virtual double  GetTheoricVolume();
+       virtual char *GetName();
+private:
+protected:
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class figureCuttingCubeModel : public figureCuttingModel
+{
+public:
+       figureCuttingCubeModel();
+       virtual ~figureCuttingCubeModel();
+       virtual bool    IfPointInside(double x, double y, double z);
+       virtual double  GetTheoricVolume();
+       virtual char *GetName();
+private:
+protected:
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class figureCuttingCylinderModel : public figureCuttingModel
+{
+public:
+       figureCuttingCylinderModel();
+       virtual ~figureCuttingCylinderModel();
+       virtual bool    IfPointInside(double x, double y, double z);
+       virtual double  GetTheoricVolume();
+       virtual char *GetName();
+private:
+protected:
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxPanelCuttingImageData : public wxPanel
+{
+public:
+       wxPanelCuttingImageData (wxWindow *parent);
+       ~wxPanelCuttingImageData ();
+       void OnTransform(wxScrollEvent& event);
+       void OnOpacityFig(wxScrollEvent& event);
+       void OnTypeFig(wxCommandEvent& event);
+       void OnExtract(wxCommandEvent& event);
+       void SetVtkMPRBaseData( vtkMPRBaseData *vtkmprbasedata );
+       void SetVtkClipping3DDataViewer( vtkClipping3DDataViewer *vtkclipping3Ddataviewer );
+       void SetWxVtk3DBaseView( wxVtk3DBaseView * wxvtk3Dbaseview );
+
+       void SetParamsOfTransformation( );
+       void Configure();
+       void Refresh();
+       void RefreshView();
+       void RemoveActors();
+
+
+private:
+       wxSlider                                                *_opacityFig;
+       wxSlider                                                *_scaleX;
+       wxSlider                                                *_scaleY;
+       wxSlider                                                *_scaleZ;
+       wxSlider                                                *_rotationX;
+       wxSlider                                                *_rotationY;
+       wxSlider                                                *_rotationZ;
+       
+       wxRadioButton                                   *_volIntern;
+       wxRadioButton                                   *_volExtern;
+       wxCheckBox                                              *_histogrammeAccumulated;
+       wxSlider                                                *_isoValue;
+       wxSlider                                                *_valueBeforeIsoValue;
+       wxSlider                                                *_valueAfterIsoValue;
+       wxChoice                                                *_typeFig;
+
+       wxStaticText                                    *_infoToVo;
+       wxStaticText                                    *_infoSuVo;
+       wxStaticText                                    *_infoSuVoA;
+       wxStaticText                                    *_infoPixLe;
+       wxStaticText                                    *_infoPixHi;
+
+       // Model
+       figureCuttingCylinderModel              *_modelCylinder;
+       figureCuttingCubeModel                  *_modelCube;
+       figureCuttingSphereModel                *_modelSphere;
+       figureCuttingModel                              *_actualCuttingModel;
+
+       // view
+       vtkCubeSource                                   *_vtkcube;
+       vtkSphereSource                                 *_vtksphere;
+       vtkCylinderSource                               *_vtkcylinder;
+       vtkPolyDataMapper                               *_cubeMapper;
+       vtkPolyDataMapper                               *_sphereMapper;
+       vtkPolyDataMapper                               *_cylinderMapper;
+       vtkActor                                                *_cubeActor;
+       vtkActor                                                *_sphereActor;
+       vtkActor                                                *_cylinderActor;
+       vtkActor                                                *_actualActor;
+
+
+       vtkMPRBaseData                                  *_vtkmprbasedata;
+       wxVtk3DBaseView                                 *_wxvtk3Dbaseview;
+       vtkImageData                                    *_imageData;
+       vtkClipping3DDataViewer                 *_vtkclipping3Ddataviewer;
+
+       vtkImageData                                    *_histogrammeVector;
+       vtkXYPlotActor                                  *_xyplot;
+       wxVtkBaseView                                   *_wxvtkbaseView;
+
+       void    CreateModel();
+       void    CreateInterface();
+       void    Create3DViewObjects();
+       void    RefreshOpacity();
+       wxWindow *CreatePlotHistogrammeInterface();
+       void    InitHistogramme();
+
+
+protected:
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxWidgetMesure2D : public wxSplitterWindow
+{
+public: 
+       wxWidgetMesure2D( wxWindow *parent );
+       ~wxWidgetMesure2D();
+
+       void OnActiveMessureTool(wxCommandEvent& event);
+       void OnVisibleMessureTool(wxCommandEvent& event);
+       void OnCloseContour(wxCommandEvent& event);
+       void OnVisibleInformation(wxCommandEvent& event);
+
+       void SetMesureScale(double mesureScale);
+
+       manualContourModel*     GetManualContourModel();
+       virtual void ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview);
+
+protected:
+       wxVtk2DBaseView                 *_wxvtk2Dbaseview;
+       virtual wxWindow                *CreateWin1a(wxWindow *parent);
+private:
+       wxCheckBox                              *_cb_messuretool; 
+       wxCheckBox                              *_cb_mt_visible; 
+       wxCheckBox                              *_cb_closeContour; 
+       wxCheckBox                              *_cb_visibleText; 
+
+       manualContourControler  *_manContourControl_1;
+       manualContourModel              *_mContourModel_1;
+       manualViewContour               *_mViewContour_1;
+
+       void    ActiveMessureTool(bool ok);
+
+//     DECLARE_EVENT_TABLE();
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxWidgetMesure2D_Plane : public wxWidgetMesure2D
+{
+public:
+        wxWidgetMesure2D_Plane(wxWindow *parent);
+        ~wxWidgetMesure2D_Plane();
+       void                    OnActiveLine(wxCommandEvent& event);
+       void                    OnActiveCirlcle(wxCommandEvent& event);
+       virtual void    ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview);
+       void                    ConfigureCircleLine();
+       void                    CircleLine();
+
+protected:
+       virtual wxWindow                *CreateWin1a(wxWindow *parent);
+private:
+       wxCheckBox                              *_cb_line; 
+       wxCheckBox                              *_cb_circle; 
+
+       // Circle 1
+       vtkPoints                                       *_ptsCircle1;
+       vtkActor                                        *_circle1Actor;
+       vtkPolyDataMapper                       *_circle1Mapper;
+    vtkPolyData                                        *_pdCircle1;
+       // Circle 2
+       vtkPoints                                       *_ptsCircle2;
+       vtkActor                                        *_circle2Actor;
+       vtkPolyDataMapper                       *_circle2Mapper;
+    vtkPolyData                                        *_pdCircle2;
+       // line reference 1
+       vtkPoints                                       *_ptsLineRef1;
+       vtkActor                                        *_lineRef1Actor;
+       vtkPolyDataMapper                       *_lineRef1Mapper;
+    vtkPolyData                                        *_pdLineRef1;
+       // line reference 2
+       vtkPoints                                       *_ptsLineRef2;
+       vtkActor                                        *_lineRef2Actor;
+       vtkPolyDataMapper                       *_lineRef2Mapper;
+    vtkPolyData                                        *_pdLineRef2;
+
+       void SetVisibleCircle( bool ok );
+
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class wxWidgetMesure2D_Plane_in_MPR : public wxWidgetMesure2D_Plane
+{
+public:
+        wxWidgetMesure2D_Plane_in_MPR(wxWindow *parent);
+        ~wxWidgetMesure2D_Plane_in_MPR();
+       void OnActiveLink(wxCommandEvent& event);
+       void SetVtkPlane2DView(vtkPlane2DView *vtkplane2Dview);
+       void SetActiveLink(bool ok);
+
+protected:
+       virtual wxWindow                *CreateWin1a(wxWindow *parent);
+private:
+       wxCheckBox                              *_cb_link; 
+       vtkPlane2DView                  *_vtkplane2Dview;
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+
+class wxMPRWidget : public wxPanel
+{
+public:
+    wxMPRWidget(wxWindow* parent,marImageData *marimageData,double voxelSize);
+       ~wxMPRWidget( );
+       void ConfigureVTK();
+
+       virtual void OnRefreshView(wxCommandEvent & event);
+       void OnDClickLeft(wxCommandEvent & event);
+
+       void OnPageAChanged(wxNotebookEvent & event);
+       void OnPageBChanged(wxNotebookEvent & event);
+
+       vtkMPRBaseData  *GetVtkMPRBaseData();
+       vtkPlane2DView  *GetVtkPlane2DView();
+       
+       //returns the 3d view of the widget
+       wxVtkMPR3DView  *GetWxvtkmpr3Dview_BB();
+
+       void    RefreshView(bool firsttime=false);
+
+       wxVtkBaseView *GetWxVtkBaseView(int page, int id);
+
+       //returns the 2d view of the specific direction (0|1|2)
+       wxVtkMPR2DView *GetWxvtkMPR2Dview(int direction);
+
+private:
+       double                                  _voxelSize;
+       marImageData                    *_marImageData; 
+       vtkMPRBaseData                  *_vtkmprbasedata; 
+       wxVtkMPR2DView                  *_vtkmpr2Dview[3]; 
+       vtkPlane2DView                  *_vtkplane2Dview;
+       wxSphereView                    *_wxsphereview;
+       wxVtkMPR2DView                  *_vtkmpr2Dview_B[3]; 
+       vtkPlane2DView                  *_vtkplane2Dview_B;
+       wxSphereView                    *_wxsphereview_B;
+
+       wxVtk3DBaseView                 *_wxvtk3Dbaseview_MPRClipping3D;
+       wxVtkMPR3DView                  *_wxvtkmpr3Dview;
+       wxVtkClipping3DView             *_wxvtkclipping3Dview;
+
+       wxVtk3DBaseView                 *_wxvtk3Dbaseview_MPR3D_B;
+       wxVtkMPR3DView                  *_wxvtkmpr3Dview_B;
+
+       wxVtk3DBaseView                 *_wxvtk3Dbaseview_Clipping3D_BB;
+       wxVtkMPR3DView                  *_wxvtkmpr3Dview_BB;
+       wxVtkClipping3DView             *_wxvtkclipping3Dview_BB;
+
+       int                                             _refreshAPage;
+       int                                             _refreshBPage;
+
+
+       wxFrame                                 *_framePanelCutting;
+       wxCheckBox                              *_btnCutImageData;
+       wxPanelCuttingImageData *_panelCutting;
+
+       wxWidgetMesure2D_Plane_in_MPR   *_widgetMesure;
+       wxWidgetMesure2D_Plane_in_MPR   *_widgetMesure_B;
+
+       wxPanel *CreateControlPanel(wxWindow *parent);
+       wxPanel *CreateMPRPanel(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+       wxPanel *CreateMPRPanel4View(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+       wxPanel *CreateView(int type,wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+
+       void    OnCutImagaData( wxCommandEvent &event);
+
+       DECLARE_EVENT_TABLE( );
+};
+
+
+class wxMPRWidget2 : public wxMPRWidget
+{
+public:
+       wxMPRWidget2(wxWindow* parent,marImageData *marimagedata,double voxelSize);
+       ~wxMPRWidget2();
+       virtual void OnRefreshView(wxCommandEvent & event);
+private:
+protected:
+};
+
+
+
+
+#endif // __WX__MPR__WIDGET__HXX__
+
+
+
+// EOF - wxMPRWidget.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualRegistration3D.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualRegistration3D.cxx
new file mode 100644 (file)
index 0000000..78ad74f
--- /dev/null
@@ -0,0 +1,504 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxManualRegistration3D.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+
+#include <wx/wx.h>
+#include <wx/splitter.h>
+#include <wx/notebook.h>
+#include <wx/colordlg.h>
+
+#include "wxManualRegistration3D.h"
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE( wxManualRegistration3D, wxPanel )
+       EVT_MENU( 12121, wxManualRegistration3D::OnRefreshView )
+//     EVT_MENU( 12122, wxManualTree_MPRWidget::OnDClickLeft  )
+END_EVENT_TABLE( );
+
+
+wxManualRegistration3D::wxManualRegistration3D( wxWindow* parent,
+                          marImageData *marimageData )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+       _marimageData                                                   = marimageData;
+
+    _vtkmprbasedata_A = new vtkMPRBaseData();
+       _vtkmprbasedata_A->SetMarImageData(_marimageData);
+
+       _wxvtk3Dbaseview_Clipping3D                     = NULL;
+       _wxvtkmpr3Dview_A                                       = NULL;
+       _wxvtkclipping3Dview_A                          = NULL;
+
+       _wxvtkmpr3Dview_B                                       = NULL;
+       _wxvtkclipping3Dview_B                          = NULL;
+
+       _panelCutting                                           = NULL;
+
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+
+// EED borrame 
+//     int ww,hh;
+
+       wxPanel *       view3Dpanel                             = Create3DView( pnlSplitter , _vtkmprbasedata_A );
+       wxPanel *   registrationControl         = CreateRegistration3DControl( pnlSplitter ,_vtkmprbasedata_A);
+
+//     this->GetSize(&ww,&hh);
+
+    pnlSplitter        -> SplitVertically( view3Dpanel, registrationControl , 700);
+       wxBoxSizer      *sizer  = new wxBoxSizer(wxVERTICAL  );
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 25 );
+       this            -> SetSizer(sizer);
+
+
+       _transform              = vtkTransform::New();
+       _transformBak   = vtkTransform::New();
+       _transformBak->Identity();
+       xBak=0;
+       yBak=0;
+       zBak=0;
+}
+
+//----------------------------------------------------------------------------
+
+wxManualRegistration3D::~wxManualRegistration3D( )
+{
+       if (_wxvtk3Dbaseview_Clipping3D         != NULL) { delete       _wxvtk3Dbaseview_Clipping3D;    }
+       if (_wxvtkmpr3Dview_A                           != NULL) { delete       _wxvtkmpr3Dview_A;                              }
+       if (_wxvtkclipping3Dview_A                      != NULL) { delete       _wxvtkclipping3Dview_A;                 }
+
+       if (_wxvtkmpr3Dview_B                           != NULL) { delete       _wxvtkmpr3Dview_B;                              }
+       if (_wxvtkclipping3Dview_B                      != NULL) { delete       _wxvtkclipping3Dview_B;                 }
+}
+
+
+
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::ConfigureVTK()
+{
+       _wxvtk3Dbaseview_Clipping3D             ->  Configure();
+//
+       _wxvtkmpr3Dview_A                               ->      Configure();
+       _wxvtkclipping3Dview_A                  ->      Configure();
+       vtkInteractorStyle3DView *vtkinteractorstyle3Dview_A = new vtkInteractorStyle3DView();
+       vtkinteractorstyle3Dview_A->SetWxVtkMPR3DView(_wxvtkmpr3Dview_A);
+       vtkinteractorstyle3Dview_A->SetWxVtkClipping3DView(_wxvtkclipping3Dview_A);
+       _wxvtk3Dbaseview_Clipping3D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview_A );
+//
+}
+
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::ConfigureVTK_B()
+{
+       _wxvtkmpr3Dview_B                               ->      Configure();
+       _wxvtkclipping3Dview_B                  ->      Configure();
+       vtkInteractorStyle3DView *vtkinteractorstyle3Dview_B = new vtkInteractorStyle3DView();
+       vtkinteractorstyle3Dview_B->SetWxVtkMPR3DView(_wxvtkmpr3Dview_B);
+       vtkinteractorstyle3Dview_B->SetWxVtkClipping3DView(_wxvtkclipping3Dview_B);
+       _wxvtk3Dbaseview_Clipping3D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview_B );
+}
+
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::OnRefreshView(wxCommandEvent & event)
+{
+       RefreshView();
+}
+
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::OnTracking(wxCommandEvent& event)
+{
+       if (_wxvtkmpr3Dview_B!=NULL){
+               _wxvtkmpr3Dview_B->InitOrientationPointWidget();
+
+               double spc[3];
+
+               this->_marimageData->GetImageData()->GetSpacing(spc);  //image t=0
+
+
+               xBak  = spc[0] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
+               yBak  = spc[1] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
+               zBak  = spc[2] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
+
+               double mat[16];
+               mat[0]=_transform->GetMatrix()->GetElement(0,0);
+               mat[1]=_transform->GetMatrix()->GetElement(0,1);
+               mat[2]=_transform->GetMatrix()->GetElement(0,2);
+               mat[3]=_transform->GetMatrix()->GetElement(0,3);
+
+               mat[4]=_transform->GetMatrix()->GetElement(1,0);
+               mat[5]=_transform->GetMatrix()->GetElement(1,1);
+               mat[6]=_transform->GetMatrix()->GetElement(1,2);
+               mat[7]=_transform->GetMatrix()->GetElement(1,3);
+
+               mat[8]=_transform->GetMatrix()->GetElement(2,0);
+               mat[9]=_transform->GetMatrix()->GetElement(2,1);
+               mat[10]=_transform->GetMatrix()->GetElement(2,2);
+               mat[11]=_transform->GetMatrix()->GetElement(2,3);
+
+               mat[12]=_transform->GetMatrix()->GetElement(3,0);
+               mat[13]=_transform->GetMatrix()->GetElement(3,1);
+               mat[14]=_transform->GetMatrix()->GetElement(3,2);
+               mat[15]=_transform->GetMatrix()->GetElement(3,3);
+
+               _transformBak->SetMatrix(mat);
+       }
+
+// EED 25 Janvier 2005 TestLoic
+       this->_wxvtkmpr3Dview_A->TestLoic1();
+
+
+}
+
+
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::RefreshView()
+{
+       double spc[3];
+
+       if ( _wxvtkmpr3Dview_B!=NULL )
+       {
+               if (_btnTrack->GetValue()==true)
+               {
+               
+                       this->_marimageData->GetImageData()->GetSpacing(spc);  // image t=0
+                       vtkTransform *m = this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetTransformOrientation();
+                       double x  = spc[0] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
+                       double y  = spc[1] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
+                       double z  = spc[2] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
+                       double xx=this->_posX->GetValue()/30.0;
+                       double yy=this->_posY->GetValue()/30.0;
+                       double zz=this->_posZ->GetValue()/30.0;
+                       double sx=this->_scaleX->GetValue()/100.0;
+                       double sy=this->_scaleY->GetValue()/100.0;
+                       double sz=this->_scaleZ->GetValue()/100.0;
+                       _transform->Identity();
+//                     _transform->Translate(x,y,z);   
+
+
+
+//                     _transform->Translate((x-xBak),(y-yBak),(z-zBak) );
+//                     _transform->Translate( xBak , yBak , zBak  );
+                       _transform->Translate( xx , yy , zz  );
+                       _transform->Translate( x , y , z  );
+                       _transform->Concatenate( m->GetMatrix() );
+                       _transform->RotateX( _angAlfa->GetValue()/30.0 );
+                       _transform->RotateY( _angBeta->GetValue()/30.0 );
+                       _transform->RotateZ( _angGama->GetValue()/30.0 );
+                       _transform->Scale( sx,sy,sz );  
+                       _transform->Translate(-(xBak),-(yBak),-(zBak) );
+
+                       _transform->Concatenate( _transformBak->GetMatrix() );
+
+               }
+
+
+
+               vtkClipping3DDataViewer *vtkclipping3Ddataviewer = _wxvtkclipping3Dview_B->GetVtkClipping3DDataViewer();
+               vtkActor *vtkactor;
+               int i;
+               for (i=0;i<4;i++)
+               {
+                       vtkactor = vtkclipping3Ddataviewer->GetTissueActor(i);
+                       vtkactor->SetUserTransform( _transform );       
+               }
+               _wxvtkmpr3Dview_B                               -> RefreshView();
+               _wxvtkclipping3Dview_B                  -> Refresh();
+       }
+
+       _wxvtkmpr3Dview_A                               -> RefreshView();
+       _wxvtkclipping3Dview_A                  -> Refresh();
+       _wxvtk3Dbaseview_Clipping3D             -> Refresh();
+
+       if (_panelCutting!=NULL)
+       {
+               _panelCutting->RefreshView();
+       }
+
+}
+
+
+// EED 7 nov 2006
+//----------------------------------------------------------------------------
+wxPanel* wxManualRegistration3D::CreateRegistration3DControl( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       int maxX = vtkmprbasedata->GetMaxPositionX();
+       int maxY = vtkmprbasedata->GetMaxPositionY();
+       int maxZ = vtkmprbasedata->GetMaxPositionZ();
+       maxX=100;
+       maxY=100;
+       maxZ=100;
+
+       _posX = new wxSlider( panel, -1,0 , -maxX*2, maxX*2, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+       _posY = new wxSlider( panel, -1,0 , -maxY*2, maxY*2, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+       _posZ = new wxSlider( panel, -1,0 , -maxZ*2, maxZ*2, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+
+       _scaleX = new wxSlider( panel, -1,100 , 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+       _scaleY = new wxSlider( panel, -1,100 , 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+       _scaleZ = new wxSlider( panel, -1,100 , 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+
+
+       _angAlfa = new wxSlider( panel, -1,0 , -100, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+       _angBeta = new wxSlider( panel, -1,0 , -100, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+       _angGama = new wxSlider( panel, -1,0 , -100, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS  |wxSL_LABELS );
+
+
+       _btnTrack = new wxCheckBox(panel, -1,_T("Tracking"));   
+
+       _posX->SetTickFreq( 10, 0 );
+       _posY->SetTickFreq( 10, 0 );
+       _posZ->SetTickFreq( 10, 0 );
+
+       _angAlfa->SetTickFreq( 30, 0 );
+       _angBeta->SetTickFreq( 30, 0 );
+       _angGama->SetTickFreq( 30, 0 );
+
+
+
+
+       Connect(_posX->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+       Connect(_posY->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+       Connect(_posZ->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+
+       Connect(_scaleX->GetId()        , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+       Connect(_scaleY->GetId()        , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+       Connect(_scaleZ->GetId()        , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+
+       Connect(_angAlfa->GetId()       , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+       Connect(_angBeta->GetId()       , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+       Connect(_angGama->GetId()       , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation   );
+
+       Connect(_btnTrack->GetId()      , wxEVT_COMMAND_CHECKBOX_CLICKED                , (wxObjectEventFunction) &wxManualRegistration3D::OnTracking   );
+
+
+    wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add( _posX, 1, wxALL|wxEXPAND, 5);
+       sizerH1->Add( _posY, 1, wxALL|wxEXPAND, 5);
+       sizerH1->Add( _posZ, 1, wxALL|wxEXPAND, 5);
+
+
+    wxBoxSizer *sizerH2 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH2->Add( _scaleX, 1, wxALL|wxEXPAND, 5);
+       sizerH2->Add( _scaleY, 1, wxALL|wxEXPAND, 5);
+       sizerH2->Add( _scaleZ, 1, wxALL|wxEXPAND, 5);
+       
+    wxBoxSizer *sizerH3 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH3->Add( _angAlfa, 1, wxALL|wxEXPAND, 5);
+       sizerH3->Add( _angBeta, 1, wxALL|wxEXPAND, 5);
+       sizerH3->Add( _angGama, 1, wxALL|wxEXPAND, 5);
+
+
+    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( sizerH1 , 1, wxALL|wxEXPAND, 0);
+       sizer->Add( sizerH2 , 1, wxALL|wxEXPAND, 0);
+       sizer->Add( sizerH3 , 1, wxALL|wxEXPAND, 0);
+       sizer->Add( _btnTrack , 1, wxALL|wxEXPAND, 10);
+       sizer->Add( new wxPanel(panel,-1) , 1, wxALL|wxEXPAND, 0);
+       sizer->Add( new wxPanel(panel,-1) , 1, wxALL|wxEXPAND, 0);
+       sizer->Add( new wxPanel(panel,-1) , 1, wxALL|wxEXPAND, 0);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizer);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+       return panel;
+}
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::OnPositionRotation(wxScrollEvent& event)
+{
+
+       RefreshView();
+}
+
+//----------------------------------------------------------------------------
+wxPanel* wxManualRegistration3D::Create3DView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxWindow *wxwindow;
+       wxPanel *panel=new wxPanel(parent,-1);
+//
+       wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
+       _wxvtk3Dbaseview_Clipping3D                             = new wxVtk3DBaseView( panelClipping3D );
+//
+       _wxvtkclipping3Dview_A = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D);
+       vtkClipping3DDataViewer *vtkclipping3Ddataviewer_A = new vtkClipping3DDataViewer(); 
+       vtkclipping3Ddataviewer_A->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkclipping3Ddataviewer_A->Configure();
+       _wxvtkclipping3Dview_A->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer_A);
+
+       _wxvtkmpr3Dview_A = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D );
+       vtkMPR3DDataViewer *vtkmpr3Ddataviewer_A = new vtkMPR3DDataViewer(); 
+       vtkmpr3Ddataviewer_A->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkmpr3Ddataviewer_A->Configure();
+       _wxvtkmpr3Dview_A->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer_A);
+
+//--
+
+       wxWindow                        *window3D                       = _wxvtk3Dbaseview_Clipping3D->GetWxVTKRenderWindowInteractor();
+       wxSplitterWindow        *panelControlSplit      = new wxSplitterWindow(panelClipping3D,-1);     
+
+//
+       wxPanel         *panelControl_A                         = new wxPanel(panelControlSplit,-1,wxDefaultPosition,wxSize(800,800));  
+
+       wxPanel         *controlPanelMPR3D_A            = _wxvtkmpr3Dview_A->CreateControlPanel(panelControl_A);
+       wxPanel         *controlPanelClipping3D_A       = _wxvtkclipping3Dview_A->CreateControlPanel(panelControl_A);
+
+                        _btnCutImageData                       = new wxCheckBox(panelControl_A,-1,_T("Cut Module"));
+               Connect(_btnCutImageData->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED  , (wxObjectEventFunction) &wxManualRegistration3D::OnCutImagaData );
+
+
+//     wxBoxSizer              *sizerCtrol_A                           = new wxBoxSizer(wxVERTICAL);
+       wxFlexGridSizer *sizerCtrol_A               = new wxFlexGridSizer(1);
+
+       sizerCtrol_A->Add(controlPanelMPR3D_A           , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol_A->Add(controlPanelClipping3D_A      , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol_A->Add( _btnCutImageData                     , 1, wxALL, 2);
+
+
+       panelControl_A->SetAutoLayout(true);
+       panelControl_A->SetSizer(sizerCtrol_A);
+       panelControl_A->SetSize(400,350);
+       panelControl_A->Layout();
+
+
+//
+       _panelControl_B                         = new wxPanel(panelControlSplit,-1,wxDefaultPosition,wxSize(800,800));  
+
+
+       panelControlSplit->SplitVertically(panelControl_A, _panelControl_B);
+       panelControlSplit->SetMinimumPaneSize( 20 );
+
+       wxBoxSizer  *sizerCtrol             = new wxBoxSizer(wxHORIZONTAL);
+       sizerCtrol->Add(panelControlSplit , 1, wxALL|wxEXPAND, 2);
+
+       panelControlSplit->SetAutoLayout(true);
+       panelControlSplit->SetSizer(sizerCtrol);
+//     panelControlSplit->SetSize(400,350);
+       panelControlSplit->Layout();
+               
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+//EEDxx2.4
+//             panelClipping3D -> SetMinimumPaneSize( -50 );
+       panelClipping3D -> SplitHorizontally( panelControlSplit,window3D/*, (int)(hh*0.20)*/ );
+       panelClipping3D -> SetMinimumPaneSize( 20 );
+       wxwindow=panelClipping3D;
+
+    wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerH1);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+//EEDxx2.4
+//     panel->FitInside();
+//     FitInside();
+
+       return panel;
+}
+//--------------------------------------------------------------------------
+void wxManualRegistration3D::AddPanelControl_B( wxWindow *parent, marImageData *marimagedata)
+{
+
+//     _imageData_B=marimagedata->GetImageData();
+
+    vtkMPRBaseData* vtkmprbasedata = new vtkMPRBaseData();
+       vtkmprbasedata->SetMarImageData(marimagedata);
+
+       _wxvtkclipping3Dview_B = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D);
+       vtkClipping3DDataViewer *vtkclipping3Ddataviewer_B = new vtkClipping3DDataViewer(); 
+       vtkclipping3Ddataviewer_B->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkclipping3Ddataviewer_B->Configure();
+       _wxvtkclipping3Dview_B->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer_B);
+
+       _wxvtkmpr3Dview_B = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D );
+       vtkMPR3DDataViewer *vtkmpr3Ddataviewer_B = new vtkMPR3DDataViewer(); 
+       vtkmpr3Ddataviewer_B->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkmpr3Ddataviewer_B->Configure();
+       _wxvtkmpr3Dview_B->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer_B);
+
+//
+       wxPanel         *controlPanelMPR3D_B            = _wxvtkmpr3Dview_B->CreateControlPanel(_panelControl_B);
+       wxPanel         *controlPanelClipping3D_B       = _wxvtkclipping3Dview_B->CreateControlPanel(_panelControl_B);
+
+//     wxBoxSizer              *sizerCtrol_B                           = new wxBoxSizer(wxVERTICAL);
+       wxFlexGridSizer *sizerCtrol_B               = new wxFlexGridSizer(1);
+
+       sizerCtrol_B->Add(controlPanelMPR3D_B , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol_B->Add(controlPanelClipping3D_B , 1, wxALL|wxEXPAND, 2);
+
+       _panelControl_B->SetAutoLayout(true);
+       _panelControl_B->SetSizer(sizerCtrol_B);
+       _panelControl_B->SetSize(400,350);
+       _panelControl_B->Layout();
+}
+
+//--------------------------------------------------------------------------
+void wxManualRegistration3D::AddSecondVolume(marImageData *marimagedata)
+{
+       AddPanelControl_B(_panelControl_B,marimagedata);
+       ConfigureVTK_B();
+       RefreshView();
+}
+//--------------------------------------------------------------------------
+bool wxManualRegistration3D::GetIfSecondVolumeExist()
+{
+       bool result=false;
+       if (_wxvtkmpr3Dview_B!=NULL)
+       {
+               result=true;
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+void wxManualRegistration3D::OnCutImagaData(wxCommandEvent &event) 
+{
+       if (_btnCutImageData->GetValue()==true){
+               _framePanelCutting = new wxFrame(this,-1,_T("Cutting Module"),wxDefaultPosition,wxDefaultSize,wxCAPTION|wxSTAY_ON_TOP| wxRESIZE_BORDER );
+               _framePanelCutting->SetSize(550,400);
+               _panelCutting   = new wxPanelCuttingImageData(_framePanelCutting);
+               _panelCutting->SetWxVtk3DBaseView( _wxvtk3Dbaseview_Clipping3D  );
+               _panelCutting->SetVtkMPRBaseData( _vtkmprbasedata_A );
+               _panelCutting->Configure( );
+               _framePanelCutting->Show();
+//             _panelCutting->RefreshView();
+               RefreshView();
+       } else {
+               if (_framePanelCutting!=NULL){
+                       _panelCutting->RemoveActors();
+                       _framePanelCutting->Close();
+                       _framePanelCutting      = NULL;
+                       _panelCutting           = NULL;
+               }
+       }
+}
+
+//--------------------------------------------------------------------------
+
+
+// EOF - wxManualRegistration3D.cxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualRegistration3D.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualRegistration3D.h
new file mode 100644 (file)
index 0000000..1803eb6
--- /dev/null
@@ -0,0 +1,122 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxManualRegistration3D.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MANUAL__REGISTRATION__3D__HXX__
+#define __WX__MANUAL__REGISTRATION__3D__HXX__
+
+/*
+#include <vector>
+
+#include <vtkObjectBase.h>
+#include <vtkCommand.h>
+#include <vtkActor.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProbeFilter.h>
+#include <vtkPlaneSource.h> 
+#include <vtkImageChangeInformation.h>
+#include <vtkStructuredPoints.h> 
+#include <vtkTransform.h> 
+#include <vtkImageViewer2.h> 
+#include <vtkBoxWidget.h>
+*/
+            
+/*
+#include "kernel/marInterface.h"
+
+#include "wxMPRBaseData.h"
+#include "wxVtkBaseView.h"
+*/
+
+#include <vtkImageData.h> 
+
+#include "wxMPRWidget.h"
+
+#include <wx/panel.h>
+#include <wx/notebook.h>
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class wxManualRegistration3D : public wxPanel
+{
+public:
+    wxManualRegistration3D(wxWindow* parent,marImageData *marimageData);
+       ~wxManualRegistration3D( );
+
+       void            ConfigureVTK();
+       void            ConfigureVTK_B();
+
+       void            RefreshView();
+       void            OnRefreshView(wxCommandEvent & event);
+       void            OnPositionRotation(wxScrollEvent& event);
+
+       void            AddPanelControl_B( wxWindow *parent, marImageData *marimagedata);
+       void            AddSecondVolume(marImageData *marimagedata);
+       bool            GetIfSecondVolumeExist();
+       void            OnTracking(wxCommandEvent& event);
+       
+       void            OnCutImagaData(wxCommandEvent &event);
+
+private:
+
+       vtkMPRBaseData                                          *_vtkmprbasedata_A;
+
+       vtkTransform                                            *_transform;
+       vtkTransform                                            *_transformBak;
+
+       wxPanelCuttingImageData                         *_panelCutting; 
+       wxCheckBox                                                      *_btnCutImageData;
+       wxFrame                                                         *_framePanelCutting; 
+
+       double                                                          xBak;
+       double                                                          yBak;
+       double                                                          zBak;
+       wxSlider                                                        *_posX;
+       wxSlider                                                        *_posY;
+       wxSlider                                                        *_posZ; 
+       wxSlider                                                        *_scaleX; 
+       wxSlider                                                        *_scaleY; 
+       wxSlider                                                        *_scaleZ; 
+       wxSlider                                                        *_angAlfa; 
+       wxSlider                                                        *_angBeta;
+       wxSlider                                                        *_angGama; 
+       wxCheckBox                                                      *_btnTrack;
+       wxPanel                                                         *_panelControl_B;
+       marImageData                                            *_marimageData; 
+//     vtkImageData                                            *_imageData_B; 
+       wxVtk3DBaseView                                         *_wxvtk3Dbaseview_Clipping3D;
+       wxVtkMPR3DView                                          *_wxvtkmpr3Dview_A;
+       wxVtkClipping3DView                                     *_wxvtkclipping3Dview_A;
+       wxVtkMPR3DView                                          *_wxvtkmpr3Dview_B;
+       wxVtkClipping3DView                                     *_wxvtkclipping3Dview_B;
+
+       wxPanel*        Create3DView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+       wxPanel*        CreateRegistration3DControl( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+
+       DECLARE_EVENT_TABLE( );
+};
+
+
+
+#endif // __WX__MANUAL__REGISTRATION__3D__HXX__
+
+// EOF - wxManualRegistration3D.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.cxx
new file mode 100644 (file)
index 0000000..c242b36
--- /dev/null
@@ -0,0 +1,207 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxManualSegmentation_MPRWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include "wxManualSegmentation_MPRWidget.h"
+
+#include <wx/wx.h>
+#include <wx/splitter.h>
+#include <wx/notebook.h>
+#include <wx/colordlg.h>
+
+//EED 6 aout 2007
+//#include "../tools/MaracasTools.h"
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE( wxManualSegmentation_MPRWidget, wxPanel )
+       EVT_MENU( 12121, wxManualSegmentation_MPRWidget::OnRefreshView )
+//     EVT_MENU( 12122, wxManualSegmentation_MPRWidget::OnDClickLeft  )
+END_EVENT_TABLE( );
+
+
+wxManualSegmentation_MPRWidget::wxManualSegmentation_MPRWidget( wxWindow* parent,
+                          marImageData *marimageData ,double voxelSize)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+       _voxelSize                                                      = voxelSize;
+       _marimageData                                                   = marimageData;
+
+       _wxvtk3Dbaseview_Clipping3D_C           = NULL;
+       _wxvtkmpr3Dview_C                                       = NULL;
+       _wxvtkclipping3Dview_C                          = NULL;
+
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       
+       int ww,hh;
+       _MPRWidget2                                     = new wxMPRWidget2(pnlSplitter,_marimageData,voxelSize);
+       wxPanel *       contour3DView   = Create3DViewContour( pnlSplitter , _MPRWidget2->GetVtkMPRBaseData());
+       this->GetSize(&ww,&hh);
+
+    pnlSplitter        -> SplitVertically( _MPRWidget2, contour3DView , 600);
+       wxBoxSizer      *sizer  = new wxBoxSizer(wxVERTICAL  );
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 50 );
+       this            -> SetSizer(sizer);
+       //EEDxx2.4
+       //      FitInside();
+       
+
+       
+       //TEST
+
+//EED 6 aout 2007
+/*
+       MaracasTools* maracasTools = MaracasTools::GetInstance();
+       maracasTools->SetMPRWidget(this);
+       wxFrame* maracasToolsFrame = maracasTools->GetToolbox(this);
+       maracasToolsFrame->Show();
+*/
+       
+       
+
+}
+
+//----------------------------------------------------------------------------
+
+wxManualSegmentation_MPRWidget::~wxManualSegmentation_MPRWidget( )
+{
+       if (_wxvtk3Dbaseview_Clipping3D_C       != NULL) { delete       _wxvtk3Dbaseview_Clipping3D_C;  }
+       if (_wxvtkmpr3Dview_C                           != NULL) { delete       _wxvtkmpr3Dview_C;                              }
+       if (_wxvtkclipping3Dview_C                      != NULL) { delete       _wxvtkclipping3Dview_C;                 }
+}
+
+
+//----------------------------------------------------------------------------
+wxPanel* wxManualSegmentation_MPRWidget::Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxWindow *wxwindow;
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
+       _wxvtk3Dbaseview_Clipping3D_C = new wxVtk3DBaseView( panelClipping3D );
+
+       _wxvtkclipping3Dview_C = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_C);
+       vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
+       vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkclipping3Ddataviewer->Configure();
+       _wxvtkclipping3Dview_C->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
+
+       _wxvtkmpr3Dview_C = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_C );
+       vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
+       vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkmpr3Ddataviewer->Configure();
+       _wxvtkmpr3Dview_C->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+       wxWindow        *window3D                               = _wxvtk3Dbaseview_Clipping3D_C->GetWxVTKRenderWindowInteractor();
+
+       wxPanel         *panelControl                   = new wxPanel(panelClipping3D,-1);      
+       wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview_C->CreateControlPanel(panelControl);
+       wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview_C->CreateControlPanel(panelControl);
+
+//     wxBoxSizer  *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
+       wxFlexGridSizer  *sizerCtrol        = new wxFlexGridSizer(1);
+
+       sizerCtrol->Add(controlPanelMPR3D , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol->Add(controlPanelClipping3D , 1, wxALL|wxEXPAND, 2);
+       panelControl->SetAutoLayout(true);
+       panelControl->SetSizer(sizerCtrol);
+       panelControl->SetSize(400,350);
+       panelControl->Layout();
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+//EEDxx2.4
+//             panelClipping3D -> SetMinimumPaneSize( -50 );
+       panelClipping3D -> SplitHorizontally( panelControl,window3D, (int)(hh*0.20) );
+       wxwindow=panelClipping3D;
+
+    wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerH1);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+//EEDxx2.4
+//     panel->FitInside();
+//     FitInside();
+
+
+
+
+       return panel;
+}
+
+
+//----------------------------------------------------------------------------
+void wxManualSegmentation_MPRWidget::ConfigureVTK(){
+       _MPRWidget2->ConfigureVTK();
+       _wxvtk3Dbaseview_Clipping3D_C   ->  Configure();
+       _wxvtkmpr3Dview_C                               ->      Configure();
+       _wxvtkclipping3Dview_C                  ->      Configure();
+
+       vtkInteractorStyle3DView *vtkinteractorstyle3Dview      = new vtkInteractorStyle3DView();
+       vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_C);
+       vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_C);
+       _wxvtk3Dbaseview_Clipping3D_C->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
+
+}
+
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxManualSegmentation_MPRWidget::GetVtkMPRBaseData(){
+       return _MPRWidget2->GetVtkMPRBaseData();
+}
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxManualSegmentation_MPRWidget::GetVtkPlane2DView()
+{
+       return _MPRWidget2->GetVtkPlane2DView();
+}
+//----------------------------------------------------------------------------
+void wxManualSegmentation_MPRWidget::OnRefreshView(wxCommandEvent & event)
+{
+       RefreshView();
+}
+//----------------------------------------------------------------------------
+void wxManualSegmentation_MPRWidget::RefreshView()
+{
+       this->_MPRWidget2->RefreshView();
+       _wxvtkmpr3Dview_C                               -> RefreshView();
+       _wxvtkclipping3Dview_C                  -> Refresh();
+       _wxvtk3Dbaseview_Clipping3D_C   -> Refresh();
+}
+
+
+vtkRenderer* wxManualSegmentation_MPRWidget::GetRenderer(){
+       return _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
+}
+
+
+
+// EOF - wxManualSegmentation_MPRWidget.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualSegmentation_MPRWidget.h
new file mode 100644 (file)
index 0000000..ee25c06
--- /dev/null
@@ -0,0 +1,79 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxManualSegmentation_MPRWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MANUAL_SEGMENTATION__MPRWIDGET__HXX__
+#define __WX__MANUAL_SEGMENTATION__MPRWIDGET__HXX__
+
+#include "wxMPRWidget.h"
+#include "../manualContour.h"
+#include <wx/notebook.h>
+
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class wxManualSegmentation_MPRWidget : public wxPanel
+{
+
+public:
+    wxManualSegmentation_MPRWidget(wxWindow* parent,marImageData *marimageData,double voxelSize);
+       ~wxManualSegmentation_MPRWidget( );
+
+       void ConfigureVTK();
+
+       void RefreshView();
+       void OnRefreshView(wxCommandEvent & event);
+
+
+       vtkMPRBaseData          *GetVtkMPRBaseData();
+       vtkPlane2DView          *GetVtkPlane2DView();
+       vtkRenderer                     *GetRenderer();
+
+
+
+private:
+       double                                                          _voxelSize;
+       marImageData                                            *_marimageData; 
+       wxMPRWidget2                                            *_MPRWidget2;
+
+       //
+       wxVtk3DBaseView                                         *_wxvtk3Dbaseview_Clipping3D_C;
+       wxVtkMPR3DView                                          *_wxvtkmpr3Dview_C;
+       wxVtkClipping3DView                                     *_wxvtkclipping3Dview_C;
+
+       wxPanel         *Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+       void            ConfigureContour();
+
+       //MaracasTools* maracasTools;
+
+       DECLARE_EVENT_TABLE( );
+
+
+
+};
+
+
+
+
+#endif // __WX__MANUAL__TREE__SEGMENTATION__WIDGET__HXX__ 
+
+// EOF - wxManualSegmentation_MPRWidget.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualTree_MPRWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualTree_MPRWidget.cxx
new file mode 100644 (file)
index 0000000..b3e42b1
--- /dev/null
@@ -0,0 +1,353 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxManualTree_MPRWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include "wxManualTree_MPRWidget.h"
+
+#include <wx/wx.h>
+#include <wx/splitter.h>
+#include <wx/notebook.h>
+#include <wx/colordlg.h>
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE( wxManualTree_MPRWidget, wxPanel )
+       EVT_MENU( 12121, wxManualTree_MPRWidget::OnRefreshView )
+//     EVT_MENU( 12122, wxManualTree_MPRWidget::OnDClickLeft  )
+END_EVENT_TABLE( );
+
+
+wxManualTree_MPRWidget::wxManualTree_MPRWidget( wxWindow* parent,
+                          marImageData *marimageData ,double voxelSize)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+       _voxelSize                                                      = voxelSize;
+       _marimageData                                                   = marimageData;
+
+       _wxvtk3Dbaseview_Clipping3D_C           = NULL;
+       _wxvtkmpr3Dview_C                                       = NULL;
+       _wxvtkclipping3Dview_C                          = NULL;
+
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       
+       int ww,hh;
+       _MPRWidget2                                     = new wxMPRWidget2(pnlSplitter,_marimageData,voxelSize);
+       wxPanel *       contour3DView   = Create3DViewContour( pnlSplitter , _MPRWidget2->GetVtkMPRBaseData());
+       this->GetSize(&ww,&hh);
+
+    pnlSplitter        -> SplitVertically( _MPRWidget2, contour3DView , 600);
+       wxBoxSizer      *sizer  = new wxBoxSizer(wxVERTICAL  );
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 50 );
+       this            -> SetSizer(sizer);
+//EEDxx2.4
+//     FitInside();
+
+}
+
+//----------------------------------------------------------------------------
+
+wxManualTree_MPRWidget::~wxManualTree_MPRWidget( )
+{
+       if (_wxvtk3Dbaseview_Clipping3D_C       != NULL) { delete       _wxvtk3Dbaseview_Clipping3D_C;  }
+       if (_wxvtkmpr3Dview_C                           != NULL) { delete       _wxvtkmpr3Dview_C;                              }
+       if (_wxvtkclipping3Dview_C                      != NULL) { delete       _wxvtkclipping3Dview_C;                 }
+}
+
+
+//----------------------------------------------------------------------------
+wxPanel* wxManualTree_MPRWidget::Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxWindow *wxwindow;
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
+       _wxvtk3Dbaseview_Clipping3D_C = new wxVtk3DBaseView( panelClipping3D );
+
+       _wxvtkclipping3Dview_C = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_C);
+       vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
+       vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkclipping3Ddataviewer->Configure();
+       _wxvtkclipping3Dview_C->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
+
+       _wxvtkmpr3Dview_C = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_C );
+       vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
+       vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkmpr3Ddataviewer->Configure();
+       _wxvtkmpr3Dview_C->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+       wxWindow        *window3D                               = _wxvtk3Dbaseview_Clipping3D_C->GetWxVTKRenderWindowInteractor();
+
+       wxPanel         *panelControl                   = new wxPanel(panelClipping3D,-1);      
+       wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview_C->CreateControlPanel(panelControl);
+       wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview_C->CreateControlPanel(panelControl);
+
+//     wxBoxSizer  *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
+       wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
+
+       sizerCtrol->Add(controlPanelMPR3D , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol->Add(controlPanelClipping3D , 1, wxALL|wxEXPAND, 2);
+       panelControl->SetAutoLayout(true);
+       panelControl->SetSizer(sizerCtrol);
+       panelControl->SetSize(400,350);
+       panelControl->Layout();
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+//EEDxx2.4
+//             panelClipping3D -> SetMinimumPaneSize( -50 );
+       panelClipping3D -> SplitHorizontally( panelControl,window3D, (int)(hh*0.20) );
+       wxwindow=panelClipping3D;
+
+    wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerH1);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+//EEDxx2.4
+//     panel->FitInside();
+//     FitInside();
+
+       return panel;
+}
+//----------------------------------------------------------------------------
+void wxManualTree_MPRWidget::ConfigureContour()
+{      
+       wxVtkBaseView *wxvtkbaseview;
+       wxvtkbaseview                   = _MPRWidget2->GetWxVtkBaseView(0,2);
+
+//EED 3 oct 2006
+       double spc[3];
+       wxvtkbaseview->GetSpacing(spc);
+
+       _manContourControl_2    = new manualContour3VControler(2);
+       _mContourModel_2                = new manualContourModel();
+       _mViewContour_2                 = new manualView3VContour(2);
+       _mContourModel_2->SetCloseContour(false);
+       _mViewContour_2->SetModel( _mContourModel_2 );
+       _mViewContour_2->SetWxVtkBaseView( wxvtkbaseview );
+       _mViewContour_2->SetRange( 1 );
+       _mViewContour_2->SetMesureScale( _voxelSize     );
+
+//EED 3 oct 2006
+       _mViewContour_2->SetSpacing(spc);
+
+       wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_2 );
+
+       //
+       wxvtkbaseview                   = _MPRWidget2->GetWxVtkBaseView(0,0);
+       _manContourControl_0    = new manualContour3VControler(0);
+       _mViewContour_0                 = new manualView3VContour(0);
+       _mViewContour_0->SetModel( _mContourModel_2 );
+       _mViewContour_0->SetWxVtkBaseView( wxvtkbaseview );
+       _mViewContour_0->SetRange( 1 );
+       _mViewContour_0->SetMesureScale( _voxelSize     );
+
+//EED 3 oct 2006
+       _mViewContour_0->SetSpacing(spc);
+
+       wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_0 );
+
+       //
+       wxvtkbaseview                   = _MPRWidget2->GetWxVtkBaseView(0,1);
+       _manContourControl_1    = new manualContour3VControler(1);
+       _mViewContour_1                 = new manualView3VContour(1);
+       _mViewContour_1->SetModel( _mContourModel_2 );
+       _mViewContour_1->SetWxVtkBaseView( wxvtkbaseview );
+       _mViewContour_1->SetRange( 1 );
+       _mViewContour_1->SetMesureScale( _voxelSize     );
+
+//EED 3 oct 2006
+       _mViewContour_1->SetSpacing(spc);
+
+       wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
+
+
+       // perpendicular plane
+       wxvtkbaseview                   = _MPRWidget2->GetWxVtkBaseView(0,3);
+       _manContourControl_p    = new manualContourPerpPlaneControler();
+       _mViewContour_p                 = new manualViewPerpPlaneContour();
+       _mViewContour_p         ->      SetModel( _mContourModel_2 );
+       _mViewContour_p         ->      SetWxVtkBaseView( wxvtkbaseview );
+       _mViewContour_p         ->      SetRange( 1 );
+       _mViewContour_p->SetMesureScale( _voxelSize     );
+
+//EED 3 oct 2006
+       _mViewContour_p->SetSpacing(spc);
+
+//     wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_p );
+       wxvtkbaseview->GetInteractorStyleBaseView()->InsertInteractorStyleMaracas( 0, _manContourControl_p );
+
+       vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)wxvtkbaseview;
+       _manContourControl_p->SetVtkInteractorStylePlane2D( vtkplane2Dview->GetInteractorstyleplane2D() );
+
+       //
+       wxvtkbaseview                           = _wxvtkclipping3Dview_C->GetWxvtk3Dbaseview();
+       _manContourControl_3V3D         = new manualContour3V3DControler();
+       _mViewContour_3D                        = new manualView3DContour();
+       _mViewContour_3D->SetModel( _mContourModel_2 );
+       _mViewContour_3D->SetWxVtkBaseView( wxvtkbaseview );
+       _mViewContour_3D->SetRange( 1 );
+       _mViewContour_3D->SetMesureScale(_voxelSize     );
+
+//EED 3 oct 2006
+       _mViewContour_3D->SetSpacing(spc);
+
+       int dim[3];
+       this->_marimageData->GetImageData()->GetDimensions( dim );  // image t=0
+       _mViewContour_3D->SetDimensions( dim[0],dim[1],dim[2] );
+       _mViewContour_3D->SetVtkMPRBaseData( _wxvtkmpr3Dview_C->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData() );
+       wxvtkbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_3V3D );
+
+       //
+       _manContourControl_0    -> SetVtkMPRBaseData( _MPRWidget2->GetVtkMPRBaseData() );
+       _manContourControl_1    -> SetVtkMPRBaseData( _MPRWidget2->GetVtkMPRBaseData() );
+       _manContourControl_2    -> SetVtkMPRBaseData( _MPRWidget2->GetVtkMPRBaseData() );
+       _manContourControl_p    -> SetVtkMPRBaseData( _MPRWidget2->GetVtkMPRBaseData() );
+       _manContourControl_3V3D -> SetVtkMPRBaseData( _MPRWidget2->GetVtkMPRBaseData() );
+
+       _manContourControl_0    -> SetModelView( _mContourModel_2 , _mViewContour_0 );
+       _manContourControl_0    -> AddManualViewBaseContour( _mViewContour_1    );
+       _manContourControl_0    -> AddManualViewBaseContour( _mViewContour_2    );
+       _manContourControl_0    -> AddManualViewBaseContour( _mViewContour_p    );
+       _manContourControl_0    -> AddManualViewBaseContour( _mViewContour_3D   );
+
+       _manContourControl_1    -> SetModelView( _mContourModel_2 , _mViewContour_1);
+       _manContourControl_1    -> AddManualViewBaseContour( _mViewContour_2    );
+       _manContourControl_1    -> AddManualViewBaseContour( _mViewContour_0    );
+       _manContourControl_1    -> AddManualViewBaseContour( _mViewContour_p    );
+       _manContourControl_1    -> AddManualViewBaseContour( _mViewContour_3D   );
+
+       _manContourControl_2    -> SetModelView( _mContourModel_2 , _mViewContour_2 );
+       _manContourControl_2    -> AddManualViewBaseContour( _mViewContour_0    );
+       _manContourControl_2    -> AddManualViewBaseContour( _mViewContour_1    );
+       _manContourControl_2    -> AddManualViewBaseContour( _mViewContour_p    );
+       _manContourControl_2    -> AddManualViewBaseContour( _mViewContour_3D   );
+
+
+       //
+       wxvtkbaseview                           = _wxvtkclipping3Dview_C->GetWxvtk3Dbaseview();
+       manualContour3VControler *_manContourControl_3V = new manualContour3VControler(-1);
+       _manContourControl_3V   -> SetModelView( _mContourModel_2 , _mViewContour_3D );
+       _manContourControl_3V   -> AddManualViewBaseContour( _mViewContour_2    );
+       _manContourControl_3V   -> AddManualViewBaseContour( _mViewContour_0    );
+       _manContourControl_3V   -> AddManualViewBaseContour( _mViewContour_1    );
+       _manContourControl_3V   -> AddManualViewBaseContour( _mViewContour_p    );
+       _manContourControl_3V   -> SetVtkInteractorStyleBaseView (wxvtkbaseview->GetInteractorStyleBaseView() );
+       _manContourControl_3V3D -> SetManualContour3VControler( _manContourControl_3V );
+       _manContourControl_3V3D -> SetModelView( _mContourModel_2 , _mViewContour_3D );
+
+       //
+       wxvtkbaseview                   = _MPRWidget2->GetWxVtkBaseView(0,3);
+       manualContour3VControler *_manContourControl_3V_p = new manualContour3VControler(-1);
+       _manContourControl_3V_p -> SetModelView( _mContourModel_2 , _mViewContour_p );
+       _manContourControl_3V_p -> AddManualViewBaseContour( _mViewContour_2    );
+       _manContourControl_3V_p -> AddManualViewBaseContour( _mViewContour_0    );
+       _manContourControl_3V_p -> AddManualViewBaseContour( _mViewContour_1    );
+       _manContourControl_3V_p -> AddManualViewBaseContour( _mViewContour_3D   );
+       _manContourControl_3V_p -> SetVtkInteractorStyleBaseView (wxvtkbaseview->GetInteractorStyleBaseView() );
+       _manContourControl_p    -> SetManualContour3VControler( _manContourControl_3V_p );
+       _manContourControl_p    -> SetModelView( _mContourModel_2 , _mViewContour_p );
+
+
+       //
+       _manContourControl_0    -> CreateNewManualContour();
+       _manContourControl_1    -> CreateNewManualContour();
+       _manContourControl_2    -> CreateNewManualContour();
+       _manContourControl_p    -> CreateNewManualContour();
+       _manContourControl_3V3D -> CreateNewManualContour();
+
+       _manContourControl_0    -> SetActive(true);
+       _manContourControl_1    -> SetActive(true);
+       _manContourControl_2    -> SetActive(true);
+       _manContourControl_p    -> SetActive(true);
+       _manContourControl_3V3D -> SetActive(true);
+
+       _manContourControl_0    -> SetEasyCreation(false);
+       _manContourControl_1    -> SetEasyCreation(false);
+       _manContourControl_2    -> SetEasyCreation(false);
+       _manContourControl_p    -> SetEasyCreation(false);
+       _manContourControl_3V3D -> SetEasyCreation(false);
+
+       _mViewContour_0                 -> RefreshContour();
+       _mViewContour_1                 -> RefreshContour();
+       _mViewContour_2                 -> RefreshContour();
+       _mViewContour_p                 -> RefreshContour();
+       _mViewContour_3D                -> RefreshContour();
+
+}
+
+//----------------------------------------------------------------------------
+void wxManualTree_MPRWidget::ConfigureVTK(){
+       _MPRWidget2->ConfigureVTK();
+       _wxvtk3Dbaseview_Clipping3D_C   ->  Configure();
+       _wxvtkmpr3Dview_C                               ->      Configure();
+       _wxvtkclipping3Dview_C                  ->      Configure();
+
+       vtkInteractorStyle3DView *vtkinteractorstyle3Dview      = new vtkInteractorStyle3DView();
+       vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_C);
+       vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_C);
+       _wxvtk3Dbaseview_Clipping3D_C->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
+
+       ConfigureContour();
+}
+
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxManualTree_MPRWidget::GetVtkMPRBaseData(){
+       return _MPRWidget2->GetVtkMPRBaseData();
+}
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxManualTree_MPRWidget::GetVtkPlane2DView()
+{
+       return _MPRWidget2->GetVtkPlane2DView();
+}
+//----------------------------------------------------------------------------
+manualContourModel *wxManualTree_MPRWidget::GetManualContourModel()
+{
+       return _mContourModel_2;
+}
+//----------------------------------------------------------------------------
+void wxManualTree_MPRWidget::OnRefreshView(wxCommandEvent & event)
+{
+       RefreshView();
+}
+//----------------------------------------------------------------------------
+void wxManualTree_MPRWidget::RefreshView()
+{
+       this->_MPRWidget2->RefreshView();
+       _wxvtkmpr3Dview_C                               -> RefreshView();
+       _wxvtkclipping3Dview_C                  -> Refresh();
+       _wxvtk3Dbaseview_Clipping3D_C   -> Refresh();
+       _mViewContour_p                                 -> Refresh();
+}
+
+
+// EOF - wxManualTree_MPRWidget.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualTree_MPRWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxManualTree_MPRWidget.h
new file mode 100644 (file)
index 0000000..65b0131
--- /dev/null
@@ -0,0 +1,117 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxManualTree_MPRWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MANUAL__TREE__MPR__WIDGET__HXX__
+#define __WX__MANUAL__TREE__MPR__WIDGET__HXX__
+
+/*
+#include <vector>
+
+#include <vtkObjectBase.h>
+#include <vtkCommand.h>
+#include <vtkActor.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProbeFilter.h>
+#include <vtkPlaneSource.h> 
+#include <vtkImageChangeInformation.h>
+#include <vtkStructuredPoints.h> 
+#include <vtkTransform.h> 
+#include <vtkImageViewer2.h> 
+#include <vtkBoxWidget.h>
+*/
+            
+/*
+#include "kernel/marInterface.h"
+
+#include "wxMPRBaseData.h"
+#include "wxVtkBaseView.h"
+*/
+
+#include "wxMPRWidget.h"
+#include "../manualContour.h"
+
+#include <wx/notebook.h>
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class wxManualTree_MPRWidget : public wxPanel
+{
+public:
+    wxManualTree_MPRWidget(wxWindow* parent,marImageData *marimageData,double voxelSize);
+       ~wxManualTree_MPRWidget( );
+
+       void ConfigureVTK();
+
+       void RefreshView();
+       void OnRefreshView(wxCommandEvent & event);
+
+
+       vtkMPRBaseData          *GetVtkMPRBaseData();
+       vtkPlane2DView          *GetVtkPlane2DView();
+
+       manualContourModel      *GetManualContourModel();
+
+
+private:
+       double                                                          _voxelSize;
+       marImageData                                            *_marimageData; 
+       wxMPRWidget2                                            *_MPRWidget2;
+
+       //
+       manualContour3VControler                        *_manContourControl_0;
+       manualView3VContour                                     *_mViewContour_0;
+
+       manualContour3VControler                        *_manContourControl_1;
+       manualView3VContour                                     *_mViewContour_1;
+
+       manualContour3VControler                        *_manContourControl_2;
+       manualContourModel                                      *_mContourModel_2;
+       manualView3VContour                                     *_mViewContour_2;
+
+       manualContour3V3DControler                      *_manContourControl_3V3D;
+       manualView3DContour                                     *_mViewContour_3D;
+
+
+       manualContourPerpPlaneControler         *_manContourControl_p;
+       manualViewPerpPlaneContour                      *_mViewContour_p;
+
+       //
+       wxVtk3DBaseView                                         *_wxvtk3Dbaseview_Clipping3D_C;
+       wxVtkMPR3DView                                          *_wxvtkmpr3Dview_C;
+       wxVtkClipping3DView                                     *_wxvtkclipping3Dview_C;
+
+       wxPanel         *Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+       void            ConfigureContour();
+
+       DECLARE_EVENT_TABLE( );
+
+
+
+};
+
+
+
+
+#endif // __WX__MANUAL__TREE__MPR__WIDGET__HXX__
+
+// EOF - wxManualTree_MPRWidget.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.cxx
new file mode 100644 (file)
index 0000000..d9d07c6
--- /dev/null
@@ -0,0 +1,249 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_N_ViewersWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+//------------------------------------------------------------------------------------------------------------
+// Definition includes
+//------------------------------------------------------------------------------------------------------------
+#include "wxMaracas_N_ViewersWidget.h"
+
+//------------------------------------------------------------------------------------------------------------
+// Other includes
+//------------------------------------------------------------------------------------------------------------
+
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+
+
+       BEGIN_EVENT_TABLE( wxMaracas_N_ViewersWidget, wxPanel )
+               EVT_MENU( 12121, wxMaracas_N_ViewersWidget::OnRefreshView )
+               EVT_MENU( 12122, wxMaracas_N_ViewersWidget::OnDClickLeft  )
+       END_EVENT_TABLE( );
+
+       
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+
+
+
+       wxMaracas_N_ViewersWidget::wxMaracas_N_ViewersWidget(wxWindow *parent, vtkImageData* imagedata, std::vector<int> *nTypeView)
+               : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+       {
+               wxPanel                         *panel          = this;
+               wxWindow                                *wxwindow       = NULL;
+                                                               wxwindow1       = NULL;
+                                                               wxwindow2       = NULL;
+                                                               wxwindow3       = NULL;
+                                                               wxwindow4       = NULL;
+
+               if (nTypeView->size()==1)
+               {
+               wxwindow1 = new wxMaracas_ViewerWidget(panel, imagedata, (*nTypeView)[0]);
+               wxwindow1->ConfigureVTK();
+               wxwindow = wxwindow1;
+               }
+
+
+               if (nTypeView->size()==2)
+               {
+                       wxSplitterWindow        *spliter        = new wxSplitterWindow( panel , -1);
+                       wxwindow1 = new wxMaracas_ViewerWidget(spliter, imagedata, (*nTypeView)[0]);
+                       wxwindow2 = new wxMaracas_ViewerWidget(spliter, imagedata, (*nTypeView)[1]);
+                       wxwindow1->ConfigureVTK();
+                       wxwindow2->ConfigureVTK();
+                       spliter -> SplitVertically( wxwindow1 , wxwindow2  );
+                       wxwindow = spliter;
+               }
+
+
+               if (nTypeView->size()==3)
+               {
+                       wxSplitterWindow        *spliter        = new wxSplitterWindow( panel , -1);
+                       wxSplitterWindow        *spliterA       = new wxSplitterWindow( spliter , -1);
+                       wxwindow1 = new wxMaracas_ViewerWidget(spliter , imagedata, (*nTypeView)[0]);
+                       wxwindow2 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[1]);
+                       wxwindow3 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[2]);
+                       wxwindow1->ConfigureVTK();
+                       wxwindow2->ConfigureVTK();
+                       wxwindow3->ConfigureVTK();
+                       spliter -> SplitVertically( wxwindow1 , spliterA   );
+                       spliterA-> SplitHorizontally( wxwindow2 , wxwindow3  );
+                       wxwindow = spliter;
+               }
+
+               if (nTypeView->size()>=4)
+               {
+                       wxSplitterWindow        *spliter        = new wxSplitterWindow( panel , -1);
+                       wxSplitterWindow        *spliterA       = new wxSplitterWindow( spliter , -1);
+                       wxSplitterWindow        *spliterB       = new wxSplitterWindow( spliter , -1);
+                       wxwindow1 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[0]);
+                       wxwindow2 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[1]);
+                       wxwindow3 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[2]);
+                       wxwindow4 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[3]);
+                       wxwindow1->ConfigureVTK();
+                       wxwindow2->ConfigureVTK();
+                       wxwindow3->ConfigureVTK();
+                       wxwindow4->ConfigureVTK();
+                       spliter -> SplitVertically( spliterA , spliterB   );
+                       spliterA-> SplitHorizontally( wxwindow1 , wxwindow2  );
+                       spliterB-> SplitHorizontally( wxwindow3 , wxwindow4  );
+                       wxwindow = spliter;
+               }
+
+
+       wxBoxSizer *sizer       = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( wxwindow , 1, wxEXPAND, 0);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->Layout();
+       }
+       //-------------------------------------------------------------------------
+         
+       wxMaracas_N_ViewersWidget::~wxMaracas_N_ViewersWidget()
+       {
+       }
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+
+       //-------------------------------------------------------------------------
+
+       void wxMaracas_N_ViewersWidget::Update()
+       {
+               //wxvtkrenderwindowinteractor->Render();
+       //    wxvtkrenderwindowinteractor->Refresh();
+       //    Refresh();
+       }
+
+       //-------------------------------------------------------------------------
+
+       void wxMaracas_N_ViewersWidget::OnRefreshView(wxCommandEvent & event) 
+       {
+               RefreshView();
+       }
+       //----------------------------------------------------------------------------
+       void wxMaracas_N_ViewersWidget::OnDClickLeft(wxCommandEvent & event) 
+       {
+               RefreshView();
+       }
+
+               //-------------------------------------------------------------------------
+
+       vtkRenderer *wxMaracas_N_ViewersWidget::GetRenderer()
+       {
+               return NULL; //renderer;
+       }
+
+       void wxMaracas_N_ViewersWidget::RefreshView()
+       {
+               if (wxwindow1!=NULL) {wxwindow1->RefreshView(); }
+               if (wxwindow2!=NULL) {wxwindow2->RefreshView(); }
+               if (wxwindow3!=NULL) {wxwindow3->RefreshView(); }
+               if (wxwindow4!=NULL) {wxwindow4->RefreshView(); }
+       }
+
+       //-------------------------------------------------------------------------
+       wxMaracas_ViewerWidget *wxMaracas_N_ViewersWidget::GetWindow(int iWin)  
+       {
+               wxMaracas_ViewerWidget *tmpWin=NULL;
+               if  (iWin==1)
+               {
+                       tmpWin=wxwindow1;
+               }
+               if  (iWin==2)
+               {
+                       tmpWin=wxwindow2;
+               }
+               if  (iWin==3)
+               {
+                       tmpWin=wxwindow3;
+               }
+               if  (iWin==4)
+               {
+                       tmpWin=wxwindow4;
+               }
+               return tmpWin;
+       }
+
+       //-------------------------------------------------------------------------
+       wxVtkBaseView *wxMaracas_N_ViewersWidget::GetwxVtkBaseView(int iWin)
+       { 
+               wxVtkBaseView *wxvtkbaseview=NULL;
+               wxMaracas_ViewerWidget *tmpWin=GetWindow(iWin);
+               if (tmpWin!=NULL){  wxvtkbaseview = tmpWin->GetwxVtkBaseView();  }
+               return wxvtkbaseview;
+       }
+   
+       //-------------------------------------------------------------------------
+ void wxMaracas_N_ViewersWidget::Refresh(bool eraseBackground, const wxRect* rect )
+ {
+        wxPanel::Refresh(false);
+ }
+
+
+ void wxMaracas_N_ViewersWidget::SetImage( vtkImageData *image )
+ {
+        if (wxwindow1!=NULL) { wxwindow1->SetImage(image); }
+        if (wxwindow2!=NULL) { wxwindow2->SetImage(image); }
+        if (wxwindow3!=NULL) { wxwindow3->SetImage(image); }
+        if (wxwindow4!=NULL) { wxwindow4->SetImage(image); }
+ }
+
+
+double wxMaracas_N_ViewersWidget :: GetX()
+{
+       return wxwindow1->GetX();
+}
+
+double wxMaracas_N_ViewersWidget :: GetY()
+{
+       return wxwindow1->GetY();
+}
+
+
+double wxMaracas_N_ViewersWidget :: GetZ()
+{
+       return wxwindow1->GetZ();
+}
+
+
+/*
+double wxMaracas_N_ViewersWidget :: GetZ(int iWin)
+       {
+               double answerVal = 0.0;
+               if  (iWin==1)
+               {
+                       answerVal = wxwindow1->GetZ();
+               }
+               if  (iWin==2)
+               {
+                       answerVal = wxwindow2->GetZ();
+               }
+               if  (iWin==3)
+               {
+                       answerVal = wxwindow3->GetZ();
+               }
+               if  (iWin==4)
+               {
+                       answerVal = wxwindow4->GetZ();
+               }
+               return answerVal;
+       }
+*/
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.h
new file mode 100644 (file)
index 0000000..4e49628
--- /dev/null
@@ -0,0 +1,95 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_N_ViewersWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__N_VIEWERSWIDGET__H__
+#define __WX__MARACAS__N_VIEWERSWIDGET__H__
+
+
+// -----------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// -----------------------------------------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//------------------------------------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------------------------------------
+
+#include "vtkImageData.h"
+#include "wxMaracas_ViewerWidget.h"
+#include <iostream>
+#include <vector>
+
+//------------------------------------------------------------------------------------------------------------
+// Class definition
+//------------------------------------------------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS wxMaracas_N_ViewersWidget : public wxPanel
+  {
+  public:
+
+                 
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+
+       wxMaracas_N_ViewersWidget(wxWindow *parent, vtkImageData* imagedata, std::vector<int> *nTypeView);
+    ~wxMaracas_N_ViewersWidget();
+
+       
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+    void Update();
+    vtkRenderer *GetRenderer();
+       void RefreshView();
+
+       virtual void OnRefreshView(wxCommandEvent & event);
+       void OnDClickLeft(wxCommandEvent & event);
+       wxMaracas_ViewerWidget *GetWindow(int iWin);
+       wxVtkBaseView *GetwxVtkBaseView(int iWin);
+       virtual void Refresh(bool eraseBackground = true,const wxRect* rect = NULL );
+       void SetImage( vtkImageData *image      );
+//     double GetZ(int iWin);
+       double GetX();
+       double GetY();
+       double GetZ();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Attributes
+       //------------------------------------------------------------------------------------------------------------
+
+  private:
+       
+       wxMaracas_ViewerWidget  *wxwindow1;
+       wxMaracas_ViewerWidget  *wxwindow2;
+       wxMaracas_ViewerWidget  *wxwindow3;
+       wxMaracas_ViewerWidget  *wxwindow4;
+
+
+  DECLARE_EVENT_TABLE( );
+  };
+
+
+#endif // __WX__MARACAS__N_VIEWERWIDGET__H__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.cxx
new file mode 100644 (file)
index 0000000..66b0d25
--- /dev/null
@@ -0,0 +1,248 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ViewerWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+//------------------------------------------------------------------------------------------------------------
+// Definition includes
+//------------------------------------------------------------------------------------------------------------
+#include "wxMaracas_ViewerWidget.h"
+
+//------------------------------------------------------------------------------------------------------------
+// Other includes
+//------------------------------------------------------------------------------------------------------------
+
+
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+
+
+       wxMaracas_ViewerWidget::wxMaracas_ViewerWidget(wxWindow *parent, vtkImageData* imagedata, int type)
+               : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+       {
+               wxPanel *panel = this;
+               wxWindow *wxwindow = NULL;
+
+               mType = type;
+
+       marImageData    *marimagedata   = new marImageData( imagedata );                        
+               mvtkmprbasedata                                 = new vtkMPRBaseData(); 
+               mvtkmprbasedata->SetMarImageData(marimagedata);
+
+               mvtk2Dbaseview                          = NULL;
+               mvtkmpr2Dview_X                         = NULL;
+               mvtkmpr2Dview_Y                         = NULL;
+               mvtkmpr2Dview_Z                         = NULL;
+               mvtkplane2Dview                         = NULL;
+               mwidgetMesure                           = NULL;
+               mwxsphereview                           = NULL;
+               mwxvtkclipping3Dview            = NULL;
+               mwxvtk3Dbaseview_Clipping3D     = NULL;
+               mwxvtkmpr3Dview                         = NULL; 
+
+               if (type==-1)
+               {
+                       mvtk2Dbaseview  = new wxVtk2DBaseView(panel);
+                       mvtk2Dbaseview->SetVtkBaseData(mvtkmprbasedata);
+                       wxwindow                = mvtk2Dbaseview->GetWxVTKRenderWindowInteractor();
+               }
+
+
+               if (type==0)
+               {
+                       mvtkmpr2Dview_Z = new wxVtkMPR2DView(panel,0);
+                       mvtkmpr2Dview_Z->SetVtkBaseData(mvtkmprbasedata);
+                       wxwindow                = mvtkmpr2Dview_Z->GetWxVTKRenderWindowInteractor();
+               }
+               if (type==1)
+               {
+                       mvtkmpr2Dview_X = new wxVtkMPR2DView(panel,1);
+                       mvtkmpr2Dview_X->SetVtkBaseData(mvtkmprbasedata);
+                       wxwindow                =       mvtkmpr2Dview_X->GetWxVTKRenderWindowInteractor();
+               }
+               if (type==2)
+               {
+                       mvtkmpr2Dview_Y = new wxVtkMPR2DView(panel,2);
+                       mvtkmpr2Dview_Y->SetVtkBaseData(mvtkmprbasedata);
+                       wxwindow                = mvtkmpr2Dview_Y->GetWxVTKRenderWindowInteractor();
+               }
+
+
+               if (type==3)
+               {
+                       mwidgetMesure           = new wxWidgetMesure2D_Plane_in_MPR(panel);
+                       mvtkplane2Dview         = new vtkPlane2DView( mwidgetMesure->GetWindow2());
+                       mwidgetMesure   -> SetVtkPlane2DView( mvtkplane2Dview );
+                       mvtkplane2Dview -> SetImgSize( 200 );
+                       mvtkplane2Dview -> SetVtkBaseData(mvtkmprbasedata);
+                       wxwindow                        = mwidgetMesure;
+               }
+               if (type==4)
+               {
+                       mwxsphereview           = new wxSphereView( panel , mvtkmprbasedata, mvtkmprbasedata->GetImageData() );
+                       wxwindow=mwxsphereview->GetWxVTKRenderWindowInteractor();
+               }
+
+
+               if (type==5)
+               {
+                       wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
+                       mwxvtk3Dbaseview_Clipping3D                             = new wxVtk3DBaseView( panelClipping3D );
+
+                       mwxvtkclipping3Dview                                            = new wxVtkClipping3DView(mwxvtk3Dbaseview_Clipping3D);
+                       vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
+                       vtkclipping3Ddataviewer->SetVtkMPRBaseData(mvtkmprbasedata);
+                       vtkclipping3Ddataviewer->Configure();
+                       mwxvtkclipping3Dview->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
+
+                       mwxvtkmpr3Dview                                                 = new wxVtkMPR3DView( mwxvtk3Dbaseview_Clipping3D );
+                       vtkMPR3DDataViewer *vtkmpr3Ddataviewer  = new vtkMPR3DDataViewer(); 
+                       vtkmpr3Ddataviewer->SetVtkMPRBaseData(mvtkmprbasedata);
+                       vtkmpr3Ddataviewer->Configure();
+                       mwxvtkmpr3Dview->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+                       wxWindow        *window3D                                       = mwxvtk3Dbaseview_Clipping3D->GetWxVTKRenderWindowInteractor();
+
+                       wxPanel                 *panelControl                   = new wxPanel(panelClipping3D,-1);      
+                       wxPanel                 *controlPanelMPR3D              = mwxvtkmpr3Dview->CreateControlPanel(panelControl);
+                       wxPanel                 *controlPanelClipping3D = mwxvtkclipping3Dview->CreateControlPanel(panelControl);
+       //                               mbtnCutImageData               = new wxCheckBox(panelControl,-1,_T("Cut Module"));
+       //              Connect(_btnCutImageData->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED  , (wxObjectEventFunction) &wxMPRWidget::OnCutImagaData );
+
+                       wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
+                       sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
+                       sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
+       //              sizerCtrol->Add( mbtnCutImageData               , 1, wxALL, 2);
+
+                       panelControl->SetAutoLayout(true);
+                       panelControl->SetSizer(sizerCtrol);
+                       panelControl->SetSize(400,350);
+                       panelControl->Layout();
+                       panelClipping3D -> SetMinimumPaneSize( 5 );
+                       panelClipping3D -> SplitHorizontally( panelControl , window3D , 10  );
+                       wxwindow=panelClipping3D;
+               }
+
+       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( wxwindow , 1, wxEXPAND, 0);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->Layout();
+
+       //   mbbtkViewerMaracas= NULL;
+       }
+       //-------------------------------------------------------------------------
+         
+       wxMaracas_ViewerWidget::~wxMaracas_ViewerWidget()
+       {
+
+       }
+           
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+       //-------------------------------------------------------------------------
+
+       void wxMaracas_ViewerWidget::ConfigureVTK()
+       {
+               int x=0,y=0,z=0;
+
+               if ( mvtk2Dbaseview                             !=NULL ) { mvtk2Dbaseview                               ->      Configure();                            }
+               if ( mvtkmpr2Dview_X                    !=NULL ) { mvtkmpr2Dview_X                              ->      Configure();                            }
+               if ( mvtkmpr2Dview_Y                    !=NULL ) { mvtkmpr2Dview_Y                              ->      Configure();                            }
+               if ( mvtkmpr2Dview_Z                    !=NULL ) { mvtkmpr2Dview_Z                              ->      Configure();                            }
+               if ( mvtkplane2Dview                    !=NULL ) { mvtkplane2Dview                              ->      Configure();                            }
+               if ( mwidgetMesure                              !=NULL ) { mwidgetMesure                                ->      ConfigureA(mvtkplane2Dview);}
+               if ( mwidgetMesure                              !=NULL ) { mwidgetMesure                                ->      ConfigureA(mvtkplane2Dview);}
+               if ( mwidgetMesure                              !=NULL ) { mwidgetMesure                                ->      SetActiveLink(true);            }
+               if ( mwidgetMesure                              !=NULL ) { mwidgetMesure                                ->      SetMesureScale( 1 );            }
+               if ( mwxsphereview                              !=NULL ) { mwxsphereview                                ->      Configure();                            }
+
+               if (mwxvtk3Dbaseview_Clipping3D !=NULL) { mwxvtk3Dbaseview_Clipping3D   ->      Configure();                            }
+               if (mwxvtkmpr3Dview                             !=NULL) { mwxvtkmpr3Dview                               ->      Configure();                            }
+               if (mwxvtkclipping3Dview                !=NULL) { mwxvtkclipping3Dview                  ->      Configure();                            }
+
+               if (mvtkmprbasedata!=NULL)
+               {
+                       x = mvtkmprbasedata     ->      GetMaxPositionX()/2;
+                       y = mvtkmprbasedata     ->      GetMaxPositionY()/2;
+                       z = mvtkmprbasedata     ->      GetMaxPositionZ()/2;
+                       mvtkmprbasedata->SetX( x );
+                       mvtkmprbasedata->SetY( y );
+                       mvtkmprbasedata->SetZ( z );
+               }
+               RefreshView();
+       }
+
+       //-------------------------------------------------------------------------
+
+  void wxMaracas_ViewerWidget::Refresh(bool eraseBackground ,const wxRect* rect  )  // virtual  eraseBackground=true , rect=NULL
+  {
+    wxPanel::Refresh(false);
+  }
+
+       //-------------------------------------------------------------------------
+       void wxMaracas_ViewerWidget::RefreshView()
+       {
+                       if (mvtk2Dbaseview                              !=NULL ){ mvtk2Dbaseview                                -> Refresh();           }
+                       if (mvtkmpr2Dview_X                             !=NULL ){ mvtkmpr2Dview_X                               -> Refresh();           }
+                       if (mvtkmpr2Dview_Y                             !=NULL ){ mvtkmpr2Dview_Y                               -> Refresh();           }
+                       if (mvtkmpr2Dview_Z                             !=NULL ){ mvtkmpr2Dview_Z                               -> Refresh();           }
+                       if (mvtkplane2Dview                             !=NULL ){ mvtkplane2Dview                               -> Refresh();           }
+                       if (mwxsphereview                               !=NULL ){ mwxsphereview                                 -> Refresh();           }
+
+                       if (mwxvtkmpr3Dview                             !=NULL ){ mwxvtkmpr3Dview                               -> RefreshView();       }
+                       if (mwxvtkclipping3Dview                !=NULL ){ mwxvtkclipping3Dview                  -> Refresh();           }
+                       if (mwxvtk3Dbaseview_Clipping3D !=NULL ){ mwxvtk3Dbaseview_Clipping3D   -> Refresh();           }
+       }
+
+       //-------------------------------------------------------------------------
+
+       wxVtkBaseView *wxMaracas_ViewerWidget::GetwxVtkBaseView()
+       {
+               wxVtkBaseView *wxvtkbaseview=NULL;
+               if (mvtk2Dbaseview!=NULL)                               { wxvtkbaseview = mvtk2Dbaseview;                       }
+               if (mvtkmpr2Dview_X!=NULL)                              { wxvtkbaseview = mvtkmpr2Dview_X;                      }
+               if (mvtkmpr2Dview_Y!=NULL)                              { wxvtkbaseview = mvtkmpr2Dview_Y;                      }
+               if (mvtkmpr2Dview_Z!=NULL)                              { wxvtkbaseview = mvtkmpr2Dview_Z;                      }
+               if (mvtkplane2Dview!=NULL)                              { wxvtkbaseview = mvtkplane2Dview;                      }
+               if (mwxsphereview!=NULL)                                { wxvtkbaseview = mwxsphereview;                        }
+               if (mwxvtk3Dbaseview_Clipping3D!=NULL)  { wxvtkbaseview = mwxvtk3Dbaseview_Clipping3D;}
+               return wxvtkbaseview   ;
+       }
+
+       void wxMaracas_ViewerWidget::SetImage( vtkImageData *image      )
+       {
+               printf("EED wxMaracas_ViewerWidget::SetImage   IMPORTANT this methode is missing \n");
+       }
+
+       double wxMaracas_ViewerWidget :: GetX()
+       {
+               return mvtkmprbasedata->GetX();
+       }
+
+       double wxMaracas_ViewerWidget :: GetY()
+       {
+               return mvtkmprbasedata->GetY();
+       }
+
+       double wxMaracas_ViewerWidget :: GetZ()
+       {
+               return mvtkmprbasedata->GetZ();
+//             return mvtk2Dbaseview->GetVtkBaseData()->GetZ();
+       }
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_ViewerWidget.h
new file mode 100644 (file)
index 0000000..7e7e49e
--- /dev/null
@@ -0,0 +1,99 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ViewerWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:42 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__VIEWERWIDGET__H__
+#define __WX__MARACAS__VIEWERWIDGET__H__
+
+
+// -----------------------------------------------------------------------------------------------------------
+// WX headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// -----------------------------------------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//------------------------------------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------------------------------------
+
+#include "vtkImageData.h"
+#include "vtkRenderer.h"
+
+#include "wxVtkBaseView.h"
+#include "wxMPRWidget.h"
+
+//------------------------------------------------------------------------------------------------------------
+// Class definition
+//------------------------------------------------------------------------------------------------------------
+
+
+ class wxMaracas_ViewerWidget : public wxPanel
+  {
+  public:
+         
+       //------------------------------------------------------------------------------------------------------------
+       // Constructors & Destructors
+       //------------------------------------------------------------------------------------------------------------
+
+    wxMaracas_ViewerWidget(wxWindow *parent, vtkImageData* imagedata, int type);
+    ~wxMaracas_ViewerWidget();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Methods
+       //------------------------------------------------------------------------------------------------------------
+
+//    vtkRenderer *GetRenderer();
+       void ConfigureVTK();
+       void RefreshView();
+       virtual void Refresh(bool eraseBackground = true,const wxRect* rect = NULL );
+
+       wxVtkBaseView *GetwxVtkBaseView();
+       void SetImage( vtkImageData *image      );
+       double GetX();
+       double GetY();
+       double GetZ();
+
+       //------------------------------------------------------------------------------------------------------------
+       // Attributes
+       //------------------------------------------------------------------------------------------------------------
+
+  private:
+               int                                                             mType;
+
+               vtkMPRBaseData                                  *mvtkmprbasedata; 
+
+               wxVtk2DBaseView                                 *mvtk2Dbaseview;
+               wxVtkMPR2DView                                  *mvtkmpr2Dview_X; 
+               wxVtkMPR2DView                                  *mvtkmpr2Dview_Y; 
+               wxVtkMPR2DView                                  *mvtkmpr2Dview_Z; 
+               wxWidgetMesure2D_Plane_in_MPR   *mwidgetMesure;
+               vtkPlane2DView                                  *mvtkplane2Dview;
+               wxSphereView                                    *mwxsphereview; 
+
+               wxVtkClipping3DView                             *mwxvtkclipping3Dview;
+               wxVtk3DBaseView                                 *mwxvtk3Dbaseview_Clipping3D;
+               wxVtkMPR3DView                                  *mwxvtkmpr3Dview;
+
+
+  };
+
+#endif // __WX__MARACAS__VIEWERWIDGET__H__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxParametersDialog.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxParametersDialog.cpp
new file mode 100644 (file)
index 0000000..f1ff858
--- /dev/null
@@ -0,0 +1,379 @@
+// -*- C++ -*- generated by wxGlade 0.3pre1 on Thu Jul 17 15:06:51 2003
+
+#include "wxParametersDialog.h"
+#include "../marDictionary.h"
+
+wxParametersDialog::wxParametersDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
+wxDialog(parent, id, title, pos, size, wxCAPTION|wxDIALOG_NO_PARENT){
+
+       marDictionary marDict;
+
+    // begin wxGlade: wxParametersDialog::wxParametersDialog
+    notebookParameter                  = new wxNotebook(this, -1, wxDefaultPosition, wxDefaultSize, 0);
+    notebookParameterContour   = new wxPanel(notebookParameter, -1);
+    notebookParameterAxis              = new wxPanel(notebookParameter, -1);
+
+// borrame EED
+//    notebookParameterQuant           = new wxPanel(notebookParameter, -1);
+
+       // PS ->     notebookParameterGeneral = new wxPanel(notebookParameter, -1);
+       // PS -> //    label_1_copy = new wxStaticText(notebookParameterGeneral, -1, wxT("Work directory:"));
+       // PS -> //    edtWorkDir = new wxTextCtrl(notebookParameterGeneral, -1, wxT(""));
+       // PS -> //    button_4_copy = new wxButton(notebookParameterGeneral, ID_BTN_BROWSE_WORK_DIR, wxT("Browse..."));
+       // PS ->     label_2_copy = new wxStaticText(notebookParameterGeneral, -1, wxT("DICOM directory:"));
+       // PS ->     edtDICOMDir = new wxTextCtrl(notebookParameterGeneral, -1, wxT(""));
+       // PS ->     button_5_copy = new wxButton(notebookParameterGeneral, ID_BTN_BROWSE_DICOM_DIR, wxT("Browse..."));
+       // PS ->     chkMIP = new wxCheckBox(notebookParameterGeneral, -1, wxT("Calculate MIP by default?"));
+       // PS ->     chkSlices = new wxCheckBox(notebookParameterGeneral, -1, wxT("Select all slices by default?"));
+       // PS ->     chkDebugWindow = new wxCheckBox(notebookParameterGeneral, -1, wxT("Debug window visible?"));
+       // PS ->     chkConsole = new wxCheckBox(notebookParameterGeneral, -1, wxT("Console window visible?"));
+       // PS -> //    label_29 = new wxStaticText(notebookParameterGeneral, -1, wxT("3D background color:"));
+       // PS -> //    btn3DBackColor = new wxButton(notebookParameterGeneral, ID_BTN_3D_BACK_COLOR, wxT(""));
+       // PS -> //    radIsoContours = new wxRadioButton(notebookParameterContour, -1, wxT("IsoContours"));
+       // PS -> //    radDeriche = new wxRadioButton(notebookParameterContour, -1, wxT("Snake + Deriche"));
+    label_7_copy = new wxStaticText(notebookParameterContour, -1, wxString( marDict.GetString(515) , wxConvUTF8));//" %  Threshold  :"
+    edtThresholdIsoContours = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    radSnake = new wxRadioButton(notebookParameterContour, -1, wxT("Snake + IsoContours"));
+       // PS -> //    label_8_copy = new wxStaticText(notebookParameterContour, -1, wxT("Threshold:"));
+       // PS -> //    edtThresholdSnake = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_9_copy = new wxStaticText(notebookParameterContour, -1, wxT("Iterations No:"));
+       // PS -> //    edtIterationsSnake = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_10_copy = new wxStaticText(notebookParameterContour, -1, wxT("Extern coefficient:"));
+       // PS -> //    edtExternCoefSnake = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_3_copy = new wxStaticText(notebookParameterContour, -1, wxT("Iterations No:"));
+       // PS -> //    edtIterationsDeriche = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_4_copy = new wxStaticText(notebookParameterContour, -1, wxT("Ballon coefficient:"));
+       // PS -> //    edtBallonCoefDeriche = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_5_copy = new wxStaticText(notebookParameterContour, -1, wxT("Gradient coefficient:"));
+       // PS -> //    edtGradientCoefDeriche = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_6_copy = new wxStaticText(notebookParameterContour, -1, wxT("Sigma:"));
+       // PS -> //    edtSigmaDeriche = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_11 = new wxStaticText(notebookParameterContour, -1, wxT("Scale:"));
+       // PS -> //    edtScale = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+       // PS -> //    label_12 = new wxStaticText(notebookParameterContour, -1, wxT("Sample:"));
+       // PS -> //    edtSample = new wxTextCtrl(notebookParameterContour, -1, wxT(""));
+//EED    chkIsoContoursVis = new wxCheckBox(notebookParameterContour, -1, wxT("Visible \"IsoContours\""));
+//EED    chkDiametersVis               = new wxCheckBox(notebookParameterContour, -1, wxT(marDict.GetString(655)));//"Visible diameters?"
+//EED    chkInvertSliceOrder = new wxCheckBox(notebookParameterContour, -1, wxT(marDict.GetString(745)));//"Invert slice order"
+       // PS -> //    chkFillContours = new wxCheckBox(notebookParameterContour, -1, wxT("Fill contours?"));
+       // PS -> //    label_13 = new wxStaticText(notebookParameterAxis, -1, wxT("Distance cdg:"));
+       // PS -> //    edtDistanceCdg = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+    label_14 = new wxStaticText(notebookParameterAxis, -1, wxString( marDict.GetString(660), wxConvUTF8 ));//"Flexion coefficient:"
+    edtFlexionCoef = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+    label_15 = new wxStaticText(notebookParameterAxis, -1, wxString( marDict.GetString(665), wxConvUTF8 ));//"Tension coefficient:"
+    edtTensionCoef = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+    label_16 = new wxStaticText(notebookParameterAxis, -1, wxString( marDict.GetString(670), wxConvUTF8 ));//"Mask size (2*n+1). n:"
+    edtMaskSize = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+    label_17 = new wxStaticText(notebookParameterAxis, -1, wxString( marDict.GetString(675), wxConvUTF8 ));//"Discret step for axis (1/N):"
+    edtDiscreetStep = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS -> //    label_18 = new wxStaticText(notebookParameterAxis, -1, wxT("X"));
+       // PS -> //    edtVoxelX = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS -> //    label_19 = new wxStaticText(notebookParameterAxis, -1, wxT("Y"));
+       // PS -> //    edtVoxelY = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS -> //    label_20 = new wxStaticText(notebookParameterAxis, -1, wxT("Z"));
+       // PS -> //    edtVoxelZ = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS -> //    label_21 = new wxStaticText(notebookParameterAxis, -1, wxT("Axis color"));
+       // PS -> //    btnAxisColor = new wxButton(notebookParameterAxis, ID_BTN_AXIS_COLOR, wxT(""));
+       // PS -> //    radMinimum = new wxRadioButton(notebookParameterAxis, -1, wxT("Minimum voxel"));
+       // PS -> //    chkShowCell = new wxCheckBox(notebookParameterAxis, -1, wxT("Show cell?"));
+       // PS -> //    radNormal = new wxRadioButton(notebookParameterAxis, -1, wxT("Normal voxel"));
+       // PS -> //    chkShowIntCell = new wxCheckBox(notebookParameterAxis, -1, wxT("Show intensity cell?"));
+       // PS ->     label_22 = new wxStaticText(notebookParameterAxis, -1, wxT("Distance int:"));
+       // PS ->     edtDistanceInt = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     label_26 = new wxStaticText(notebookParameterAxis, -1, wxT("Step coefficient (1/N):"));
+       // PS ->     edtStepCoef = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     label_28 = new wxStaticText(notebookParameterAxis, -1, wxT("Step:"));
+       // PS ->     edtStep = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     label_23 = new wxStaticText(notebookParameterAxis, -1, wxT("Cell max. int. \ncoef (1/N):"));
+       // PS ->     edtCellMaxIntCoef = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     label_25 = new wxStaticText(notebookParameterAxis, -1, wxT("Mass power:"));
+       // PS ->     edtMassPower = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     panel_3 = new wxPanel(notebookParameterAxis, -1);
+       // PS ->     panel_4 = new wxPanel(notebookParameterAxis, -1);
+       // PS ->     label_24 = new wxStaticText(notebookParameterAxis, -1, wxT("Cell coefficient:"));
+       // PS ->     edtCellCoef = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     label_27 = new wxStaticText(notebookParameterAxis, -1, wxT("ROI dimension:"));
+       // PS ->     edtROIDimension = new wxTextCtrl(notebookParameterAxis, -1, wxT(""));
+       // PS ->     panel_5 = new wxPanel(notebookParameterAxis, -1);
+       // PS ->     panel_6 = new wxPanel(notebookParameterAxis, -1);
+
+/* // EED borrame
+    chkArea = new wxCheckBox(notebookParameterQuant, -1, wxT("Area"));
+    chkPerimeter = new wxCheckBox(notebookParameterQuant, -1, wxT("Perimeter"));
+    chkDiameterFromArea = new wxCheckBox(notebookParameterQuant, -1, wxT("Diameter from area"));
+    chkDiameterFromPerimeter = new wxCheckBox(notebookParameterQuant, -1, wxT("Diameter from perimeter"));
+    chkMinimumDiameter = new wxCheckBox(notebookParameterQuant, -1, wxT("Minimum diameter"));
+    chkMaximumDiameter = new wxCheckBox(notebookParameterQuant, -1, wxT("Maximum diameter"));
+    chkAverageDiameter = new wxCheckBox(notebookParameterQuant, -1, wxT("Average diameter"));
+    radArea = new wxRadioButton(notebookParameterQuant, -1, wxT("Area"));
+    radPerimeter = new wxRadioButton(notebookParameterQuant, -1, wxT("Perimeter"));
+    radDiameterFromArea = new wxRadioButton(notebookParameterQuant, -1, wxT("Diameter from area"));
+    radDiameterFromPerimeter = new wxRadioButton(notebookParameterQuant, -1, wxT("Diameter from perimeter"));
+    radMinimumDiameter = new wxRadioButton(notebookParameterQuant, -1, wxT("Minimum diameter"));
+    radMaximumDiameter = new wxRadioButton(notebookParameterQuant, -1, wxT("Maximum diameter"));
+    radAverageDiameter = new wxRadioButton(notebookParameterQuant, -1, wxT("Average diameter"));
+*/
+
+    buttonOK     = new wxButton(this, wxID_OK,        wxString( marDict.GetString(680), wxConvUTF8 ));//"OK"
+    buttonCancel = new wxButton(this, wxID_CANCEL,    wxString( marDict.GetString(685), wxConvUTF8 ));//"Cancel"
+    buttonReset  = new wxButton(this, ID_BTN_RESET,   wxString( marDict.GetString(690), wxConvUTF8 ));//"Reset"
+    buttonApply  = new wxButton(this, ID_BTN_APPLY,   wxString( marDict.GetString(695), wxConvUTF8 ));//"Apply"
+    buttonDefault= new wxButton(this, ID_BTN_DEFAULT, wxString( marDict.GetString(700), wxConvUTF8 ));//"Default"
+       
+    set_properties();
+    do_layout();
+    // end wxGlade
+}
+
+
+void wxParametersDialog::set_properties(){
+       marDictionary marDict;
+    // begin wxGlade: wxParametersDialog::set_properties
+    SetTitle(wxString(marDict.GetString(710), wxConvUTF8)); //"MARACAS Parameters..."
+       // PS -> //    SetSize(wxSize(530, 500));
+    SetSize(wxSize(400, 250));
+       // PS -> //    btn3DBackColor->SetSize(wxSize(511, 42));
+       // PS ->     chkIsoContoursVis->SetSize(wxSize(145, 44));
+       // PS ->     chkDiametersVis->SetSize(wxSize(129, 44));
+       // PS -> //    chkFillContours->SetSize(wxSize(103, 44));
+    // end wxGlade
+}
+
+
+void wxParametersDialog::do_layout(){
+       marDictionary marDict;
+    // begin wxGlade: wxParametersDialog::do_layout
+    wxBoxSizer* object_1 = new wxBoxSizer(wxVERTICAL);
+    wxBoxSizer* object_40 = new wxBoxSizer(wxHORIZONTAL);
+    wxBoxSizer* object_35 = new wxBoxSizer(wxHORIZONTAL);
+// EED borrame
+//    wxStaticBoxSizer* object_38 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterQuant, -1, wxT("Stenosis type")), wxHORIZONTAL);
+
+    wxFlexGridSizer* object_39 = new wxFlexGridSizer(7, 1, 0, 0);
+
+// EED Borrame
+//    wxStaticBoxSizer* object_36 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterQuant, -1, wxT("Data types")), wxHORIZONTAL);
+
+    wxFlexGridSizer* object_37 = new wxFlexGridSizer(7, 1, 0, 0);
+    wxBoxSizer* object_21 = new wxBoxSizer(wxVERTICAL);
+       // PS ->     wxStaticBoxSizer* object_33 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterAxis, -1, wxT("Other info")), wxHORIZONTAL);
+       // PS ->     wxFlexGridSizer* object_34 = new wxFlexGridSizer(3, 6, 20, 10);
+       // PS ->     wxStaticBoxSizer* object_22 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterAxis, -1, wxT("Static")), wxHORIZONTAL);
+    wxBoxSizer* object_23 = new wxBoxSizer(wxHORIZONTAL);
+       // PS -> //    wxBoxSizer* object_26 = new wxBoxSizer(wxVERTICAL);
+       // PS -> //    wxStaticBoxSizer* object_31 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterAxis, -1, wxT("Choose...")), wxHORIZONTAL);
+       // PS -> //    wxFlexGridSizer* object_32 = new wxFlexGridSizer(2, 2, 10, 0);
+       // PS -> //    wxBoxSizer* object_27 = new wxBoxSizer(wxHORIZONTAL);
+       // PS -> //    wxBoxSizer* object_30 = new wxBoxSizer(wxVERTICAL);
+       // PS -> //    wxStaticBoxSizer* object_28 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterAxis, -1, wxT("Voxel size")), wxHORIZONTAL);
+       // PS -> //    wxFlexGridSizer* object_29 = new wxFlexGridSizer(3, 2, 0, 10);
+    wxStaticBoxSizer* object_24 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterAxis, -1, wxString(marDict.GetString(720), wxConvUTF8)), wxHORIZONTAL);//"Extraction parameters"
+       // PS -> //    wxFlexGridSizer* object_25 = new wxFlexGridSizer(5, 2, 10, 10);//PS
+       wxFlexGridSizer* object_25 = new wxFlexGridSizer(4, 2, 10, 10);
+    wxBoxSizer* object_7 = new wxBoxSizer(wxVERTICAL);
+    wxBoxSizer* object_17 = new wxBoxSizer(wxHORIZONTAL);
+//EED    wxStaticBoxSizer* object_20 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterContour, -1, wxT(marDict.GetString(725))), wxVERTICAL);//"Debug"
+       // PS -> //    wxStaticBoxSizer* object_18 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterContour, -1, wxT("Slice")), wxHORIZONTAL);
+       // PS -> //    wxFlexGridSizer* object_19 = new wxFlexGridSizer(2, 2, 10, 10);
+    wxStaticBoxSizer* object_8 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterContour, -1, wxString(marDict.GetString(730), wxConvUTF8)), wxHORIZONTAL);//"Contour calculation algorithm"
+       // PS -> //    wxFlexGridSizer* object_9 = new wxFlexGridSizer(2, 2, 0, 0); //PS
+       wxFlexGridSizer* object_9 = new wxFlexGridSizer(1, 1, 0, 0);
+       // PS -> //    wxStaticBoxSizer* object_15 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterContour, -1, wxT("")), wxHORIZONTAL);
+       // PS -> //    wxGridSizer* object_16 = new wxGridSizer(4, 2, 0, 0);
+    wxBoxSizer* object_10 = new wxBoxSizer(wxVERTICAL);
+       // PS -> //    wxStaticBoxSizer* object_13 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterContour, -1, wxT("")), wxHORIZONTAL);
+       // PS -> //    wxFlexGridSizer* object_14 = new wxFlexGridSizer(3, 2, 0, 10);
+       // PS -> //    wxStaticBoxSizer* object_11 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterContour, -1, wxT("")), wxHORIZONTAL);
+    wxFlexGridSizer* object_12 = new wxFlexGridSizer(1, 2, 0, 10);
+       // PS ->     wxBoxSizer* object_2 = new wxBoxSizer(wxVERTICAL);
+       // PS ->     wxStaticBoxSizer* object_5 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterGeneral, -1, wxT("User configuration")), wxHORIZONTAL);
+       // PS -> //    wxFlexGridSizer* object_6 = new wxFlexGridSizer(6, 1, 0, 0); //PS
+       // PS ->        wxFlexGridSizer* object_6 = new wxFlexGridSizer(5, 1, 0, 0);
+       // PS ->     wxStaticBoxSizer* object_3 = new wxStaticBoxSizer(new wxStaticBox(notebookParameterGeneral, -1, wxT("Data locations")), wxHORIZONTAL);
+       // PS -> //    wxFlexGridSizer* object_4 = new wxFlexGridSizer(2, 3, 50, 0); //PS
+       // PS ->     wxFlexGridSizer* object_4 = new wxFlexGridSizer(1, 3, 0, 10);
+       // PS -> //    object_4->Add(label_1_copy, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_4->Add(edtWorkDir, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_4->Add(button_4_copy, 0, wxALIGN_CENTER_VERTICAL, 0);
+       // PS ->     object_4->Add(label_2_copy, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
+       // PS ->     object_4->Add(edtDICOMDir, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 0);
+       // PS ->     object_4->Add(button_5_copy, 0, wxALIGN_CENTER_VERTICAL, 0);
+       // PS ->     object_4->AddGrowableCol(1);
+       // PS ->     object_3->Add(object_4, 1, wxALIGN_CENTER_VERTICAL, 0);
+       // PS ->     object_2->Add(object_3, 1, wxEXPAND, 0);
+       // PS ->     object_6->Add(chkMIP, 0, 0, 0);
+       // PS ->     object_6->Add(chkSlices, 0, 0, 0);
+       // PS ->     object_6->Add(chkDebugWindow, 0, 0, 0);
+       // PS ->     object_6->Add(chkConsole, 0, 0, 0);
+       // PS -> //    object_6->Add(label_29, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 0);
+       // PS -> //    object_6->Add(btn3DBackColor, 0, wxEXPAND, 0);
+       // PS ->     object_6->AddGrowableRow(4);
+       // PS ->     object_6->AddGrowableCol(0);
+       // PS ->     object_5->Add(object_6, 1, wxEXPAND, 0);
+       // PS ->     object_2->Add(object_5, 1, wxEXPAND, 0);
+       // PS ->     notebookParameterGeneral->SetAutoLayout(true);
+       // PS ->     notebookParameterGeneral->SetSizer(object_2);
+       // PS ->     object_2->Fit(notebookParameterGeneral);
+       // PS ->     object_2->SetSizeHints(notebookParameterGeneral);
+       // PS -> //    object_9->Add(radIsoContours, 0, 0, 0);
+       // PS -> //    object_9->Add(radDeriche, 0, 0, 0);
+    object_12->Add(label_7_copy, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
+    object_12->Add(edtThresholdIsoContours, 0,wxEXPAND|wxALIGN_CENTER_VERTICAL , 0);
+    object_12->AddGrowableCol(1);
+       // PS -> //    object_11->Add(object_12, 1, wxALIGN_CENTER_VERTICAL, 0); 
+       // PS -> //    object_10->Add(object_11, 1, wxEXPAND, 0); //PS
+       object_10->Add(object_12, 1, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_10->Add(radSnake, 0, 0, 0);
+       // PS -> //    object_14->Add(label_8_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_14->Add(edtThresholdSnake, 0, wxEXPAND, 0);
+       // PS -> //    object_14->Add(label_9_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_14->Add(edtIterationsSnake, 0, 0, 0);
+       // PS -> //    object_14->Add(label_10_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_14->Add(edtExternCoefSnake, 0, 0, 0);
+       // PS -> //    object_13->Add(object_14, 1, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_10->Add(object_13, 1, wxEXPAND, 0);
+    object_9->Add(object_10, 1, wxEXPAND, 0);
+       // PS -> //    object_16->Add(label_3_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_16->Add(edtIterationsDeriche, 0, 0, 0);
+       // PS -> //    object_16->Add(label_4_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_16->Add(edtBallonCoefDeriche, 0, 0, 0);
+       // PS -> //    object_16->Add(label_5_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_16->Add(edtGradientCoefDeriche, 0, 0, 0);
+       // PS -> //    object_16->Add(label_6_copy, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_16->Add(edtSigmaDeriche, 0, 0, 0);
+       // PS -> //    object_15->Add(object_16, 1, wxEXPAND, 0);
+       // PS -> //    object_9->Add(object_15, 1, wxEXPAND, 0);
+    object_9->AddGrowableRow(1);
+    object_9->AddGrowableCol(1);
+    object_8->Add(object_9, 1, wxEXPAND, 0);
+       // PS -> //    object_7->Add(object_8, 2, wxEXPAND, 0);
+       object_7->Add(object_8, 1, wxEXPAND, 0);
+       // PS -> //    object_19->Add(label_11, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_19->Add(edtScale, 0, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_19->Add(label_12, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_19->Add(edtSample, 0, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_19->AddGrowableCol(1);
+       // PS -> //    object_18->Add(object_19, 1, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_17->Add(object_18, 1, wxEXPAND, 0);
+ //EED   object_20->Add(chkIsoContoursVis, 0, wxALIGN_CENTER_VERTICAL, 0);
+//EED    object_20->Add(chkDiametersVis                , 0, wxALIGN_CENTER_VERTICAL, 0);
+//EED    object_20->Add(chkInvertSliceOrder    , 0, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_20->Add(chkFillContours, 0, wxALIGN_CENTER_VERTICAL, 0);
+//EED    object_17->Add(object_20, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 0);
+    object_7->Add(object_17, 1, wxEXPAND, 0);
+    notebookParameterContour->SetAutoLayout(true);
+    notebookParameterContour->SetSizer(object_7);
+    object_7->Fit(notebookParameterContour);
+    object_7->SetSizeHints(notebookParameterContour);
+       // PS -> //    object_25->Add(label_13, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_25->Add(edtDistanceCdg, 0, wxEXPAND, 0);
+    object_25->Add(label_14, 0, wxALIGN_RIGHT, 0);
+    object_25->Add(edtFlexionCoef, 0, wxEXPAND, 0);
+    object_25->Add(label_15, 0, wxALIGN_RIGHT, 0);
+    object_25->Add(edtTensionCoef, 0, wxEXPAND, 0);
+    object_25->Add(label_16, 0, wxALIGN_RIGHT, 0);
+    object_25->Add(edtMaskSize, 0, wxEXPAND, 0);
+    object_25->Add(label_17, 0, wxALIGN_RIGHT, 0);
+    object_25->Add(edtDiscreetStep, 0, wxEXPAND, 0);
+    object_25->AddGrowableRow(4);
+    object_25->AddGrowableCol(1);
+    object_24->Add(object_25, 1, wxALIGN_CENTER_VERTICAL, 0);
+       object_23->Add(object_24, 1, wxEXPAND, 0);
+       // PS -> //    object_29->Add(label_18, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_29->Add(edtVoxelX, 0, wxEXPAND, 0);
+       // PS -> //    object_29->Add(label_19, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_29->Add(edtVoxelY, 0, wxEXPAND, 0);
+       // PS -> //    object_29->Add(label_20, 0, wxALIGN_RIGHT, 0);
+       // PS -> //    object_29->Add(edtVoxelZ, 0, wxEXPAND, 0);
+       // PS -> //    object_29->AddGrowableCol(1);
+       // PS -> //    object_28->Add(object_29, 1, 0, 0);
+       // PS -> //    object_27->Add(object_28, 1, wxEXPAND, 0);
+       // PS -> //    object_30->Add(label_21, 0, 0, 0);
+       // PS -> //    object_30->Add(btnAxisColor, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 0);
+       // PS -> //    object_27->Add(object_30, 1, 0, 0);
+       // PS -> //    object_26->Add(object_27, 1, wxEXPAND, 0);
+       // PS -> //    object_32->Add(radMinimum, 0, 0, 0);
+       // PS -> //    object_32->Add(chkShowCell, 0, 0, 0);
+       // PS -> //    object_32->Add(radNormal, 0, 0, 0);
+       // PS -> //    object_32->Add(chkShowIntCell, 0, 0, 0);
+       // PS -> //    object_31->Add(object_32, 1, wxALIGN_CENTER_VERTICAL, 0);
+       // PS -> //    object_26->Add(object_31, 1, wxEXPAND, 0);
+       // PS -> //    object_23->Add(object_26, 1, wxEXPAND, 0);
+       // PS ->        object_22->Add(object_23, 1, wxEXPAND, 0);
+       // PS ->        object_21->Add(object_22, 1, wxEXPAND, 0);
+       object_21->Add(object_23, 1, wxEXPAND, 0);
+       // PS ->     object_34->Add(label_22, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtDistanceInt, 0, 0, 0);
+       // PS ->     object_34->Add(label_26, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtStepCoef, 0, 0, 0);
+       // PS ->     object_34->Add(label_28, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtStep, 0, 0, 0);
+       // PS ->     object_34->Add(label_23, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtCellMaxIntCoef, 0, 0, 0);
+       // PS ->     object_34->Add(label_25, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtMassPower, 0, 0, 0);
+       // PS ->     object_34->Add(panel_3, 1, wxEXPAND, 0);
+       // PS ->     object_34->Add(panel_4, 1, wxEXPAND, 0);
+       // PS ->     object_34->Add(label_24, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtCellCoef, 0, 0, 0);
+       // PS ->     object_34->Add(label_27, 0, wxALIGN_RIGHT, 0);
+       // PS ->     object_34->Add(edtROIDimension, 0, 0, 0);
+       // PS ->     object_34->Add(panel_5, 1, wxEXPAND, 0);
+       // PS ->     object_34->Add(panel_6, 1, wxEXPAND, 0);
+       // PS ->     object_33->Add(object_34, 1, wxALIGN_CENTER_VERTICAL, 0);
+       // PS ->     object_21->Add(object_33, 1, wxEXPAND, 0);
+    notebookParameterAxis->SetAutoLayout(true);
+    notebookParameterAxis->SetSizer(object_21);
+    object_21->Fit(notebookParameterAxis);
+    object_21->SetSizeHints(notebookParameterAxis);
+
+/* EED Borrame
+    object_37->Add(chkArea, 0, 0, 0);
+    object_37->Add(chkPerimeter, 0, 0, 0);
+    object_37->Add(chkDiameterFromArea, 0, 0, 0);
+    object_37->Add(chkDiameterFromPerimeter, 0, 0, 0);
+    object_37->Add(chkMinimumDiameter, 0, 0, 0);
+    object_37->Add(chkMaximumDiameter, 0, 0, 0);
+    object_37->Add(chkAverageDiameter, 0, 0, 0);
+    object_37->AddGrowableRow(6);
+    object_36->Add(object_37, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
+    object_35->Add(object_36, 1, wxEXPAND, 0);
+    object_39->Add(radArea, 0, 0, 0);
+    object_39->Add(radPerimeter, 0, 0, 0);
+    object_39->Add(radDiameterFromArea, 0, 0, 0);
+    object_39->Add(radDiameterFromPerimeter, 0, 0, 0);
+    object_39->Add(radMinimumDiameter, 0, 0, 0);
+    object_39->Add(radMaximumDiameter, 0, 0, 0);
+    object_39->Add(radAverageDiameter, 0, 0, 0);
+    object_39->AddGrowableRow(6);
+    object_38->Add(object_39, 1, wxEXPAND, 0);
+    object_35->Add(object_38, 1, wxEXPAND, 0);
+    notebookParameterQuant->SetAutoLayout(true);
+    notebookParameterQuant->SetSizer(object_35);
+    object_35->Fit(notebookParameterQuant);
+    object_35->SetSizeHints(notebookParameterQuant);
+*/
+
+       // PS ->     notebookParameter->AddPage(notebookParameterGeneral, wxT("General Parameters"));
+    notebookParameter->AddPage(notebookParameterAxis, wxString( marDict.GetString(740) , wxConvUTF8));//"Axis Parameters"
+    notebookParameter->AddPage(notebookParameterContour, wxString( marDict.GetString(735), wxConvUTF8 ));//"Contour Parameters"
+
+// EED borrame
+//    notebookParameter->AddPage(notebookParameterQuant, wxT("Quantification Parameters"));
+
+// EED 08/06/2007
+//    object_1->Add(new wxNotebookSizer(notebookParameter), 1, wxALL|wxEXPAND, 0);
+    object_1->Add( notebookParameter , 1, wxALL|wxEXPAND, 0);
+
+    object_40->Add(buttonOK, 1, 0, 0);
+    object_40->Add(buttonCancel, 1, 0, 0);
+       object_40->Add(buttonDefault, 1, 0, 0);
+    object_40->Add(buttonReset, 1, 0, 0);
+    object_40->Add(buttonApply, 1, 0, 0);
+    object_1->Add(object_40, 0, wxALL|wxEXPAND, 0);
+    SetAutoLayout(true);
+    SetSizer(object_1);
+    Layout();
+    // end wxGlade
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxParametersDialog.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxParametersDialog.h
new file mode 100644 (file)
index 0000000..6263752
--- /dev/null
@@ -0,0 +1,156 @@
+// -*- C++ -*- generated by wxGlade 0.3pre1 on Thu Jul 17 15:06:51 2003
+
+#include <wx/wx.h>
+#include <wx/image.h>
+
+#ifndef wxParametersDialog_H
+#define wxParametersDialog_H
+
+// begin wxGlade: dependencies
+#include <wx/notebook.h>
+// end wxGlade
+
+
+class wxParametersDialog: public wxDialog {
+public:
+    // begin wxGlade: wxParametersDialog::ids
+    enum {
+        ID_BTN_BROWSE_WORK_DIR = 1024,
+                       ID_BTN_BROWSE_DICOM_DIR = 1025,
+                       ID_BTN_3D_BACK_COLOR = 1026,
+                       ID_BTN_AXIS_COLOR = 1027,
+                       ID_BTN_RESET = 1028,
+                       ID_BTN_APPLY = 1029,
+                       ID_BTN_DEFAULT = 1030
+    };
+    // end wxGlade
+       
+    wxParametersDialog(wxWindow* parent, int id, const wxString& title, 
+                              const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, 
+                                          long style=wxDEFAULT_DIALOG_STYLE);
+       
+private:
+    // begin wxGlade: wxParametersDialog::methods
+    void set_properties();
+    void do_layout();
+    // end wxGlade
+       
+protected:
+    // begin wxGlade: wxParametersDialog::attributes
+       // PS -> //    wxStaticText* label_1_copy;
+       // PS -> //    wxTextCtrl* edtWorkDir;
+       // PS -> //    wxButton* button_4_copy;
+       // PS ->     wxStaticText* label_2_copy;
+       // PS ->     wxTextCtrl* edtDICOMDir;
+       // PS ->     wxButton* button_5_copy;
+       // PS ->     wxCheckBox* chkMIP;
+       // PS ->     wxCheckBox* chkSlices;
+       // PS ->     wxCheckBox* chkDebugWindow;
+       // PS ->     wxCheckBox* chkConsole;
+       // PS -> //    wxStaticText* label_29;
+       // PS -> //    wxButton* btn3DBackColor;
+       // PS ->     wxPanel* notebookParameterGeneral;
+       // PS -> //    wxRadioButton* radIsoContours;
+       // PS -> //    wxRadioButton* radDeriche;
+    wxStaticText* label_7_copy;
+    wxTextCtrl* edtThresholdIsoContours;
+       // PS -> //    wxRadioButton* radSnake;
+       // PS -> //    wxStaticText* label_8_copy;
+       // PS -> //    wxTextCtrl* edtThresholdSnake;
+       // PS -> //    wxStaticText* label_9_copy;
+       // PS -> //    wxTextCtrl* edtIterationsSnake;
+       // PS -> //    wxStaticText* label_10_copy;
+       // PS -> //    wxTextCtrl* edtExternCoefSnake;
+       // PS -> //    wxStaticText* label_3_copy;
+       // PS -> //    wxTextCtrl* edtIterationsDeriche;
+       // PS -> //    wxStaticText* label_4_copy;
+       // PS -> //    wxTextCtrl* edtBallonCoefDeriche;
+       // PS -> //    wxStaticText* label_5_copy;
+       // PS -> //    wxTextCtrl* edtGradientCoefDeriche;
+       // PS -> //    wxStaticText* label_6_copy;
+       // PS -> //    wxTextCtrl* edtSigmaDeriche;
+       // PS -> //    wxStaticText* label_11;
+       // PS -> //    wxTextCtrl* edtScale;
+       // PS -> //    wxStaticText* label_12;
+       // PS -> //    wxTextCtrl* edtSample;
+
+//EED    wxCheckBox* chkIsoContoursVis;
+
+//EED    wxCheckBox    *chkDiametersVis;
+//EED    wxCheckBox    *chkInvertSliceOrder;
+       // PS -> //    wxCheckBox* chkFillContours;
+    wxPanel       *notebookParameterAxis;
+       // PS -> //    wxStaticText* label_13;
+       // PS -> //    wxTextCtrl* edtDistanceCdg;
+    wxStaticText  *label_14;
+    wxTextCtrl    *edtFlexionCoef;
+    wxStaticText  *label_15;
+    wxTextCtrl    *edtTensionCoef;
+    wxStaticText  *label_16;
+    wxTextCtrl    *edtMaskSize;
+    wxStaticText  *label_17;
+    wxTextCtrl    *edtDiscreetStep;
+       // PS -> //    wxStaticText* label_18;
+       // PS -> //    wxTextCtrl* edtVoxelX;
+       // PS -> //    wxStaticText* label_19;
+       // PS -> //    wxTextCtrl* edtVoxelY;
+       // PS -> //    wxStaticText* label_20;
+       // PS -> //    wxTextCtrl* edtVoxelZ;
+       // PS -> //    wxStaticText* label_21;
+       // PS -> //    wxButton* btnAxisColor;
+       // PS -> //    wxRadioButton* radMinimum;
+       // PS -> //    wxCheckBox* chkShowCell;
+       // PS -> //    wxRadioButton* radNormal;
+       // PS -> //    wxCheckBox* chkShowIntCell;
+       // PS ->     wxStaticText* label_22;
+       // PS ->     wxTextCtrl* edtDistanceInt;
+       // PS ->     wxStaticText* label_26;
+       // PS ->     wxTextCtrl* edtStepCoef;
+       // PS ->     wxStaticText* label_28;
+       // PS ->     wxTextCtrl* edtStep;
+       // PS ->     wxStaticText* label_23;
+       // PS ->     wxTextCtrl* edtCellMaxIntCoef;
+       // PS ->     wxStaticText* label_25;
+       // PS ->     wxTextCtrl* edtMassPower;
+       // PS ->     wxPanel* panel_3;
+       // PS ->     wxPanel* panel_4;
+       // PS ->     wxStaticText* label_24;
+       // PS ->     wxTextCtrl* edtCellCoef;
+       // PS ->     wxStaticText* label_27;
+       // PS ->     wxTextCtrl* edtROIDimension;
+       // PS ->     wxPanel* panel_5;
+       // PS ->     wxPanel* panel_6;
+    wxPanel    *notebookParameterContour;
+
+
+
+/* // EED Borrame
+    wxCheckBox* chkArea;
+    wxCheckBox* chkPerimeter;
+    wxCheckBox* chkDiameterFromArea;
+    wxCheckBox* chkDiameterFromPerimeter;
+    wxCheckBox* chkMinimumDiameter;
+    wxCheckBox* chkMaximumDiameter;
+    wxCheckBox* chkAverageDiameter;
+    wxRadioButton* radArea;
+    wxRadioButton* radPerimeter;
+    wxRadioButton* radDiameterFromArea;
+    wxRadioButton* radDiameterFromPerimeter;
+    wxRadioButton* radMinimumDiameter;
+    wxRadioButton* radMaximumDiameter;
+    wxRadioButton* radAverageDiameter;
+    wxPanel* notebookParameterQuant;
+*/
+
+    wxNotebook  *notebookParameter;
+    wxButton    *buttonOK;
+    wxButton    *buttonCancel;
+    wxButton    *buttonReset;
+    wxButton    *buttonApply;
+       wxButton    *buttonDefault;
+
+    // end wxGlade
+};
+
+
+#endif // wxParametersDialog_H
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxPathologyWidget_01.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxPathologyWidget_01.cxx
new file mode 100644 (file)
index 0000000..d189115
--- /dev/null
@@ -0,0 +1,1316 @@
+
+
+
+#include "vtkActor.h"
+#include "vtkAppendFilter.h"
+#include "vtkCamera.h"
+#include "vtkCallbackCommand.h"
+#include "vtkCellArray.h"
+#include "vtkCylinderSource.h"
+#include "vtkClosePolyData.h"
+#include "vtkCommand.h"
+#include "vtkDoubleArray.h"
+#include "vtkExtractVOI.h"
+#include "vtkImageReader.h"
+#include "vtkImageViewer.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageToStructuredPoints.h"
+#include "vtkImageThreshold.h" 
+#include "vtkImageWriter.h"
+#include "vtkImageClip.h"
+#include "vtkImageResample.h"
+#include "vtkImageReslice.h"
+#include "vtkImageResample.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageData.h"
+#include "vtkMath.h"
+#include "vtkMarchingCubes.h"
+#include "vtkObjectFactory.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkPolyDataConnectivityFilter.h"
+#include "vtkProperty.h"
+#include "vtkPriorityQueue.h"
+#include "vtkPoints.h"
+#include "vtkPolyData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataWriter.h"
+#include "vtkPolyDataReader.h"
+#include "vtkPointData.h"
+#include "vtkSphereSource.h"
+#include "vtkSTLWriter.h"
+#include "vtkStripper.h"
+#include "vtkTriangleFilter.h"
+#include "vtkTransform.h"
+
+#include "wxPathologyWidget_01.h"
+#include "kernel/vtkOtsuSphereSource.h"
+#include <wx/splitter.h>
+
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxPathologyWidget_01::wxPathologyWidget_01(wxWindow *parent, marInterface* mar)
+: wxPanel( parent, -1) 
+{
+       
+
+       _mar                                                            = mar;
+       wxBoxSizer                      *sizer                  = new wxBoxSizer(wxVERTICAL  );
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       wxPanel                         *viewPanel              = CreateViewPanel(pnlSplitter);
+       wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
+
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 150 );
+    pnlSplitter        -> SplitVertically( viewPanel, controlPanel, 600 );
+       this            -> SetSizer(sizer);
+
+
+
+       //DHC STL SURFACES
+       stlInterna = NULL;
+       stlExterna = NULL;
+       stlImageData = NULL;
+       workingDir = NULL;
+       
+       //PATHOLOGY
+       p1SphereSource = NULL;
+       p1Mapper = NULL;
+       p1Actor = NULL;
+
+       p2SphereSource = NULL;
+       p2Mapper = NULL;
+       p2Actor = NULL;
+
+       patSphereSource = NULL;
+       patMapper = NULL;
+       patActor = NULL;
+
+
+       pathologyFrame  = NULL;
+
+       patImageData    = NULL;
+       voiFilter               = NULL;
+       cubesFilter             = NULL;
+       dataMapper              = NULL;
+       dataActor               = NULL;
+
+       outlineFilter   = NULL;
+       outlineMapper   = NULL;
+       outlineActor    = NULL;
+
+
+       p3SphereSource  = NULL;
+       p3Mapper                = NULL;
+       p3Actor                 = NULL;
+       
+       
+}
+//-------------------------------------------------------------------
+wxPathologyWidget_01::~wxPathologyWidget_01(){
+       
+}
+//-------------------------------------------------------------------
+wxPanel* wxPathologyWidget_01::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+       _maracasSurfaceWidget = new wxSurfaceWidget(panel);
+       sizer->Add(_maracasSurfaceWidget        , 1, wxEXPAND, 0);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxPathologyWidget_01::CreateControlPanel(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+
+
+       //-- PATHOLOGY WIDGETS
+       
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer->Add(new wxStaticText(panel,-1,_T("  - - -  PATHOLOGY EXTRACTION - - - ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       wxButton *btnP1 = new wxButton(panel,-1,_T("Set P1"));
+       wxButton *btnP2 = new wxButton(panel,-1,_T("Set P2"));
+       wxButton *btnPat = new wxButton(panel,-1,_T("Set Region"));
+       wxButton *btnExtract = new wxButton(panel,-1,_T("Extract Region"));
+       wxButton *btnAxis = new wxButton(panel,-1, _T("Axis"));
+       sizer->Add(btnP1);
+       sizer->Add(btnP2);
+       sizer->Add(btnPat);sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(btnExtract);sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+       patSliderOpacity        = new wxSlider( panel, -1, 50 , 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       sizer->Add(new wxStaticText(panel, -1,_T("Opacity Pathological VOI")));
+       sizer->Add(patSliderOpacity);
+       patSliderMarchingCubes  = new wxSlider( panel, -1, 254 , 0, 1000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       sizer->Add(new wxStaticText(panel, -1,_T(" Marching Cubes Level Pathological VOI")));
+       sizer->Add(patSliderMarchingCubes);
+       sizer->Add(btnAxis);sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       //-- PATHOLOGY WIDGETS
+
+
+       
+       //-- STL WIDGETS
+       
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer->Add(new wxStaticText(panel,-1,_T("  - - -  STL Diego - - - ")));
+    sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       stlSliderDeltaGauss     = new wxSlider( panel, -1, 100 , 0, 300 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       stlSliderMarchingCubes= new wxSlider( panel, -1, 128 , 0, 256 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       
+       sizer->Add(new wxStaticText(panel,-1,_T(" Delta Gauss")));
+       sizer->Add(stlSliderDeltaGauss);
+
+       sizer->Add(new wxStaticText(panel,-1,_T(" Marching Cubes Level")));
+       sizer->Add(stlSliderMarchingCubes);
+
+       stlSliderOpacityInternal = new wxSlider(panel, -1, 100,0,100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       stlSliderOpacityExternal = new wxSlider(panel, -1, 100,0,100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL Internal")));
+       sizer->Add(stlSliderOpacityInternal);
+
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL External")));
+       sizer->Add(stlSliderOpacityExternal);
+
+       wxButton *btnFileSTL = new wxButton(panel,-1,_T("Generate STL files"));
+       sizer->Add(btnFileSTL);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+        //-- STL WIDGETS
+       
+
+       
+       
+       
+
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+
+
+       // -- PATHOLOGY CONNECT WIDGETS
+       Connect(btnP1->GetId(),wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &wxPathologyWidget_01::OnBtnSetP1);
+       Connect(btnP2->GetId(),wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &wxPathologyWidget_01::OnBtnSetP2);
+       Connect(btnPat->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &wxPathologyWidget_01::OnBtnSetPat);
+       Connect(btnExtract->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &wxPathologyWidget_01::OnBtnExtractPat);
+       Connect(patSliderOpacity->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxPathologyWidget_01::OnChangePatOpacity);
+       Connect(patSliderMarchingCubes->GetId(), wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxPathologyWidget_01::OnChangePatMarchingCubes);
+       Connect(btnAxis->GetId(), wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPathologyWidget_01::OnBtnExtractAxis);
+               
+
+       // -- PATHOLOGY CONNECT WIDGETS
+       
+       
+       // -- STL CONNECT WIDGETS
+       Connect(btnFileSTL->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPathologyWidget_01::OnBtnFileSTL           );
+       Connect(stlSliderDeltaGauss->GetId()    , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxPathologyWidget_01::OnChangeSTLGaussLevel  );
+       Connect(stlSliderMarchingCubes->GetId() , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxPathologyWidget_01::OnChangeSTLMarchingCubesLevel);
+       Connect(stlSliderOpacityInternal->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxPathologyWidget_01::OnOpacitySTLInternal);
+       Connect(stlSliderOpacityExternal->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxPathologyWidget_01::OnOpacitySTLExternal);
+       // -- STL CONNECT WIDGETS
+
+       
+
+       
+
+       return panel;
+}
+//------------------------------------------------------------------------
+void wxPathologyWidget_01::Refresh()
+{
+       _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->Render();
+}
+
+//------------------------------------------------------------------------
+void wxPathologyWidget_01::ConfigureVTK()
+{
+    wxBusyCursor wait;
+
+       vtkImageData    *imagedata              = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       //-Maracas-
+       _maracasSurfaceWidget->ShowMARACASData( _mar );
+
+       //CONFIGURACION ADICIONAL
+    this->ConfigureSTL();
+       this->ConfigurePathologyExtraction();
+       
+}
+
+
+void wxPathologyWidget_01::ConfigureVTK(vtkImageData *imagedata, int x, int y, int z, double param){
+
+       this->px = x;
+       this->py = y;
+       this->pz = z;
+
+       wxBusyCursor wait;
+       _maracasSurfaceWidget->ShowMARACASData( _mar );
+
+
+       //CONFIGURACION ADICIONAL
+       this->ConfigureMPR();
+       this->ConfigureSTL();
+       this->ConfigurePathologyExtraction();
+}
+
+
+
+
+
+// ==================================================================================================
+// CODIGO NUEVO ADICIONADO POR DIEGO CANTOR
+// ==================================================================================================
+
+
+// ------------------------------------------------------------------------
+// START MPR FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+void wxPathologyWidget_01::ConfigureMPR(){
+
+       mprSphereSource = vtkSphereSource::New();
+    mprMapper = vtkPolyDataMapper::New();
+    mprActor = vtkActor::New();
+
+       mprMapper->SetInput(mprSphereSource->GetOutput());
+       mprActor->SetMapper(mprMapper);
+       mprActor->PickableOff( );
+
+       mprSphereSource->SetCenter(this->px,this->py,this->pz);
+       mprSphereSource->SetRadius(2.5);
+
+       mprActor->GetProperty()->SetColor( 1.0, 0.0, 0.0 );
+    vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       ren->AddActor(mprActor);
+
+}
+
+// ------------------------------------------------------------------------
+// END MPR FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+
+
+// ------------------------------------------------------------------------
+// START STL FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+void wxPathologyWidget_01::ConfigureSTL()
+{
+       stlExterna = vtkPolyData::New();
+       stlInterna = vtkPolyData::New();
+
+       dsm1 = vtkPolyDataMapper ::New();
+    dsm1->SetInput (stlInterna); 
+    dsm1->ScalarVisibilityOff();
+
+    actorInternal = vtkActor::New();
+    actorInternal->SetMapper (dsm1);
+    actorInternal->GetProperty()->SetColor (0,1,0);
+
+    dsm2 = vtkPolyDataMapper ::New();
+    dsm2->SetInput (stlExterna);
+    dsm2->ScalarVisibilityOff();
+
+    actorExternal= vtkActor::New();
+    actorExternal->SetMapper (dsm2);
+    actorExternal->GetProperty()->SetRepresentationToWireframe();
+    vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+    ren->AddActor(actorInternal);
+    ren->AddActor(actorExternal);
+
+       stlExtractor = new vtkSTLExtractor();  
+}
+
+void wxPathologyWidget_01::generateSTLSurfaces()
+{
+       stlExtractor->setVolume(stlImageData);
+       stlExtractor->setSigmaLevel(stlDeltaGaussLevel);
+       stlExtractor->setMarchingCubesLevel(stlMarchingCubesLevel);
+       stlExtractor->calculate();
+       
+       stlInterna->DeepCopy(stlExtractor->getInnerSurface());
+       stlExterna->DeepCopy(stlExtractor->getOuterSurface());
+}
+
+
+void wxPathologyWidget_01::OnOpacitySTLExternal(wxScrollEvent& event){
+       double value = ((double)stlSliderOpacityExternal->GetValue())/100;
+    actorExternal->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+
+
+void wxPathologyWidget_01::OnOpacitySTLInternal(wxScrollEvent& event){
+       double value = ((double)stlSliderOpacityInternal->GetValue())/100;
+    actorInternal->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+
+void wxPathologyWidget_01::OnBtnFileSTL(wxCommandEvent& event)
+{
+       wxBusyCursor wait;
+       wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+       dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+       wxDirDialog dialog( this, _T("Choose a directory..."), ( !dirSTL.IsEmpty( ) )?
+       dirSTL: wxGetHomeDir( ) );
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+          
+       
+               // ------------------------------------------------------------------------
+               //  1.  GENERATE STL FILES
+               // ------------------------------------------------------------------------
+               const char* fileprefix = "c:\\Creatis\\";
+               std::string prefix = fileprefix;
+               
+
+               // 1.1. Se hace un filtro triangular puesto que el stl writer solo recibe poligonos triangulares.
+
+        vtkTriangleFilter *filtro = vtkTriangleFilter::New();
+               filtro->SetInput(stlInterna);
+               vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
+        pdcf->SetInput( filtro->GetOutput() );
+        vtkClosePolyData *cpd = vtkClosePolyData::New();
+        cpd->SetInput( pdcf->GetOutput() );
+
+               // 1.2 se escribe a disco el archivo stl de la superficie interna
+        cpd->Update();
+        vtkSTLWriter *writerI = vtkSTLWriter::New();
+        writerI->SetInput( cpd->GetOutput() );
+        prefix = fileprefix;
+        prefix += "internal.stl";
+        writerI->SetFileName(prefix.c_str());
+        writerI->SetFileTypeToASCII();
+        writerI->Write();
+        writerI->Delete();
+
+               // 1.3 se escribe a disco el archivo stl de la superficie externa
+               filtro->SetInput(stlExterna);
+        cpd->Update();
+        vtkSTLWriter *writerE = vtkSTLWriter::New();
+        writerE->SetInput( cpd->GetOutput() );
+        prefix = fileprefix;
+        prefix += "external.stl";
+        writerE->SetFileName( prefix.c_str() );
+        writerE->SetFileTypeToASCII();
+        writerE->Write();
+        writerE->Delete();
+   
+        filtro->Delete();
+        cpd->Delete();
+        pdcf->Delete();
+       }
+
+       //By default *always* update e_installation_directory:
+       _mar->_parameters->setStringParam( marParameters::e_installation_directory, dialog.GetPath( ) ); 
+       _mar->saveParameters( );
+}
+
+
+void wxPathologyWidget_01::OnChangeSTLGaussLevel(wxScrollEvent& event)
+{
+       stlDeltaGaussLevel  = ((double)stlSliderDeltaGauss->GetValue())/100;
+       generateSTLSurfaces();
+       Refresh();
+}
+
+
+void wxPathologyWidget_01::OnChangeSTLMarchingCubesLevel(wxScrollEvent& event)
+{
+       stlMarchingCubesLevel = ((double)stlSliderMarchingCubes->GetValue());
+       generateSTLSurfaces();
+       Refresh();
+       
+}
+
+
+// ------------------------------------------------------------------------
+// END STL FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+
+// ------------------------------------------------------------------------
+// START PATHOLOGY FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+double GetDistanciaEuclideana(double* a, double* b){
+       return sqrt(((a[0]-b[0])*(a[0]-b[0]))+((a[1]-b[1])*(a[1]-b[1]))+((a[2]-b[2])*(a[2]-b[2])));
+}
+
+
+double GetValorPromedio(vtkImageData *data){
+       int ext[6];
+       int i, j, k;
+       int numVoxels = 0;
+       double promedio = 0;
+       double valor;
+       
+       
+       data->GetExtent(ext);
+
+       
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               valor =data->GetScalarComponentAsDouble(i,j,k,0);
+                               promedio += valor;
+                               numVoxels++;
+                       }
+               }
+       }
+       return (double)promedio/(double)numVoxels;
+}
+
+
+void wxPathologyWidget_01::ConfigurePathologyExtraction()
+{
+}
+
+void wxPathologyWidget_01::generatePathologySurface(){
+       // 1. Inicializacion
+}
+
+
+void wxPathologyWidget_01::OnBtnSetP1(wxCommandEvent &event){
+       vtk3DSurfaceWidget *sw = _maracasSurfaceWidget->GetVtk3DSurfaceWidget();
+       
+       if(p1Actor){
+               sw->GetRenderer()->RemoveActor(p1Actor);
+       }
+       
+       
+       sw->GetSphereCenter(p1Center);
+
+       p1SphereSource = vtkSphereSource::New();
+    p1Mapper = vtkPolyDataMapper::New();
+    p1Actor = vtkActor::New();
+
+       p1Mapper->SetInput(p1SphereSource->GetOutput());
+       p1Actor->SetMapper(p1Mapper);
+       p1Actor->PickableOff( );
+
+       p1SphereSource->SetCenter(p1Center[0],p1Center[1],p1Center[2]);
+       p1SphereSource->SetRadius(0.5);
+
+       p1Actor->GetProperty()->SetColor( 0.0, 1.0, 0.0);
+
+       sw->GetRenderer()->AddActor(p1Actor);
+       Refresh();
+
+}
+
+void wxPathologyWidget_01::OnBtnSetP2(wxCommandEvent &event){
+
+       vtk3DSurfaceWidget *sw = _maracasSurfaceWidget->GetVtk3DSurfaceWidget();
+
+
+       if(p2Actor){
+               sw->GetRenderer()->RemoveActor(p1Actor);
+       }
+
+       sw->GetSphereCenter(p2Center);
+
+       p2SphereSource = vtkSphereSource::New();
+    p2Mapper = vtkPolyDataMapper::New();
+    p2Actor = vtkActor::New();
+
+       p2Mapper->SetInput(p2SphereSource->GetOutput());
+       p2Actor->SetMapper(p2Mapper);
+       p2Actor->PickableOff( );
+
+       p2SphereSource->SetCenter(p2Center[0],p2Center[1],p2Center[2]);
+       p2SphereSource->SetRadius(0.5);
+
+       p2Actor->GetProperty()->SetColor( 0.0, 1.0, 0.0);
+
+       sw->GetRenderer()->AddActor(p2Actor);
+       Refresh();
+}
+
+
+
+
+void wxPathologyWidget_01::OnBtnSetPat(wxCommandEvent &event){
+
+       if (p2SphereSource == NULL || p1SphereSource == NULL){
+               return;
+       }
+
+       vtk3DSurfaceWidget *sw = _maracasSurfaceWidget->GetVtk3DSurfaceWidget();
+
+       if(patActor){
+               sw->GetRenderer()->RemoveActor(patActor);
+       }
+
+       
+       double centro[3];
+
+       
+       centro[0] = (p1Center[0] + p2Center[0]) / 2;
+       centro[1] = (p1Center[1] + p2Center[1]) / 2;
+       centro[2] = (p1Center[2] + p2Center[2]) / 2;
+
+       patSphereSource = vtkSphereSource::New();
+    patMapper = vtkPolyDataMapper::New();
+    patActor = vtkActor::New();
+
+       patMapper->SetInput(patSphereSource->GetOutput());
+       patActor->SetMapper(patMapper);
+       
+
+       patSphereSource->SetCenter(centro[0],centro[1],centro[2]);
+       patSphereSource->SetRadius(GetDistanciaEuclideana(p1Center,p2Center));
+
+       patActor->GetProperty()->SetColor( 0.15, 0.75, 0.15 );
+       patActor->PickableOff( );
+       patActor->GetProperty( )->SetOpacity(0.15);
+
+       sw->GetRenderer()->AddActor(patActor);
+       Refresh();
+}
+
+
+       
+
+void wxPathologyWidget_01::OnBtnExtractPat(wxCommandEvent &event){
+
+       //RENDERER
+       //----------------------------------------------------------------------------------
+       vtkRenderer* renderer = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+
+       //IMAGEN ORIGINAL
+       //----------------------------------------------------------------------------------
+       vtkImageData* originalData = vtkImageData::New();
+       originalData->DeepCopy(_mar->_experiment->getDynData()->getVolume()->castVtk());
+       
+       double spacing[3];
+       originalData->GetSpacing(spacing);
+       
+       int extend[6];
+       originalData->GetExtent(extend);        
+
+       
+
+       //==================================================================================
+       // REGION DE INTERES EN LA IMAGEN ORIGINAL: patImageData
+       //==================================================================================
+
+       double p1crem[3], p2crem[3];
+
+       p1crem[0] = p1Center[0] / spacing[0];
+       p1crem[1] = p1Center[1] / spacing[1];
+       p1crem[2] = p1Center[2] / spacing[2];
+
+       p2crem[0] = p2Center[0] / spacing[0];
+       p2crem[1] = p2Center[1] / spacing[1];
+       p2crem[2] = p2Center[2] / spacing[2];
+
+       
+
+       
+
+    //COORDENADAS DE LA IMAGEN 
+
+       double radio = GetDistanciaEuclideana(p1crem,p2crem) / 2;
+       double centro[3];
+       
+       centro[0] = (p1crem[0] + p2crem[0]) / 2;
+       centro[1] = (p1crem[1] + p2crem[1]) / 2;
+       centro[2] = (p1crem[2] + p2crem[2]) / 2;
+
+       
+
+       //Obtener los ejes sobre la esfera para delimitar el area.
+
+       double lowX     = centro[0] - (2*radio);
+       double highX    = centro[0] + (2*radio);
+       double lowY     = centro[1] - (2*radio);
+       double highY    = centro[1] + (2*radio);
+       double lowZ     = centro[2] - (2*radio);
+       double highZ    = centro[2] + (2*radio);
+
+
+       
+       //Extraer la region de interes:patImageData
+       //----------------------------------------------------------------------------------
+
+       voiFilter = vtkExtractVOI::New();
+       voiFilter->SetInput(originalData);
+       voiFilter->SetVOI((int)lowX, (int)highX, (int)lowY, (int)highY, (int)lowZ, (int)highZ);
+       voiFilter->Update();
+       patImageData = vtkImageData::New();
+       patImageData->DeepCopy(voiFilter->GetOutput());
+//     patImageData->SetSpacing(spacing);
+
+       //==================================================================================
+       // REGION DE INTERES ESPECIFICA
+       //==================================================================================
+
+       vtkOtsuSphereSource *otsu = new vtkOtsuSphereSource();
+       thresholdOTSU = otsu->calculateOptimalThreshold(patImageData);
+
+
+       //==================================================================================
+       // MARCHING CUBES
+       //==================================================================================
+
+       patMCLevel = 128.0;
+       cubesFilter = vtkMarchingCubes::New();
+       cubesFilter->SetInput(otsu->getImageForSegmentation());
+       cubesFilter->SetValue(0,patMCLevel); 
+       cubesFilter->SetNumberOfContours(1);
+
+       //==================================================================================
+       // POLYDATA
+       //==================================================================================
+
+    polyUnico = vtkPolyDataConnectivityFilter::New();
+       polyUnico->SetInput(cubesFilter->GetOutput());
+       polyUnico->SetExtractionModeToLargestRegion();
+
+       stripper = vtkStripper::New();
+       stripper->SetInput(polyUnico->GetOutput());
+
+
+       //==================================================================================
+       // DATA MAPPING
+       //==================================================================================
+       
+       dataMapper = vtkPolyDataMapper::New();
+       dataMapper->SetInput(stripper->GetOutput());
+       dataMapper->ScalarVisibilityOff();
+
+       //==================================================================================
+       // ACTORES
+       //==================================================================================
+
+       
+       dataActor = vtkActor::New();
+       dataActor->SetMapper(dataMapper);
+       dataActor->SetPosition(lowX*spacing[0],lowY*spacing[1],lowZ*spacing[2]);
+       dataActor->GetProperty()->SetOpacity(patOpacityLevel);
+       dataActor->GetProperty()->SetColor( 0.20, 0.20, 1.0 );
+       dataActor->GetProperty()->SetRepresentationToWireframe();
+
+       renderer->AddActor(dataActor);
+       
+       
+       
+       outlineFilter = vtkOutlineFilter::New();
+    outlineFilter->SetInput(voiFilter->GetOutput());
+
+       vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();
+       outlineMapper->SetInput(outlineFilter->GetOutput());
+               
+       if(outlineActor){
+               renderer->RemoveActor(outlineActor);
+       }
+
+       if(patActor){
+               renderer->RemoveActor(patActor);
+       }
+
+       if(p3Actor){
+               renderer->RemoveActor(p3Actor);
+       }
+
+       
+       outlineActor = vtkActor::New();
+       outlineActor->SetMapper(outlineMapper);
+       outlineActor->GetProperty()->SetOpacity(1);
+
+
+       /*p3SphereSource = vtkSphereSource::New();
+    p3Mapper = vtkPolyDataMapper::New();
+    p3Actor = vtkActor::New();
+
+       p3Mapper->SetInput(p3SphereSource->GetOutput());
+       p3Actor->SetMapper(p3Mapper);
+       p3Actor->PickableOff( );
+
+       p3SphereSource->SetCenter(p2Center[0]-(lowX*spacing[0]), p2Center[1]-(lowY*spacing[1]) , p2Center[2]-(lowZ*spacing[2]) );
+       p3SphereSource->SetRadius(0.5);
+       p3Actor->GetProperty()->SetColor( 0.9, 0.4, 0.2);*/
+
+       
+       //renderer->AddActor(outlineActor);
+       //renderer->AddActor(p3Actor);
+       
+       
+       Refresh();
+}
+
+
+void wxPathologyWidget_01::OnChangePatOpacity(wxScrollEvent& event){
+       patOpacityLevel = ((double)patSliderOpacity->GetValue())/100.0;
+    dataActor->GetProperty( )->SetOpacity(patOpacityLevel);
+       Refresh();
+}
+
+void wxPathologyWidget_01::OnChangePatMarchingCubes(wxScrollEvent& event){
+       patMCLevel = ((double)patSliderMarchingCubes->GetValue());
+       cubesFilter->SetValue(0,patMCLevel);
+       cubesFilter->Update();
+       Refresh();
+}
+
+
+
+//Metodo auxiliar que devuelve la distancia minima de un punto a un polydata.
+//Se evalua la distancia del punto a todos los centros de las celdas del polydata y se devuelve la menor
+double GetDistanciaAPolydata(double* punto, vtkPoints* centers){
+       double distancia = 0.0;
+       double minima = 1e100;
+       double vertice[3];
+       int N = centers->GetNumberOfPoints();
+
+       for(int i = 0; i < N; i++){
+                centers->GetPoint(i,vertice);
+                distancia =  sqrt(((punto[0]-vertice[0])*(punto[0]-vertice[0]))+((punto[1]-vertice[1])*(punto[1]-vertice[1]))+((punto[2]-vertice[2])*(punto[2]-vertice[2])));
+
+                if (distancia < minima){
+                        minima = distancia;
+                }
+       }
+       return minima;
+}
+
+
+double GetProductoPunto(double* vectorA, double* vectorB){
+       return (vectorA[0]*vectorB[0] +  vectorA[1]*vectorB[1] + vectorA[2]*vectorB[2]);
+}
+
+
+double GetNormaVector(double* vector){
+       return sqrt(GetProductoPunto(vector, vector));
+}
+
+//construye el vector como la diferencia de dos puntos (vectores en el origen)
+void GetVector(double* p0, double* p1, double* resultado){ //p1:destino - p0:origen
+       
+       resultado[0] = p1[0] - p0[0];
+       resultado[1] = p1[1] - p0[1];
+       resultado[2] = p1[2] - p0[2];
+
+}
+
+
+void VectorUnitario(double *v){
+       double norma = GetNormaVector(v);
+       v[0] = v[0] / norma;
+       v[1] = v[1] / norma;
+       v[2] = v[2] / norma;
+}
+
+//calculo de las normales
+void GetNormalCelda(double* p0, double* p1, double* p2, double* normal){
+       
+       double U[3],V[3];
+       GetVector(p1,p2,U); //p2-p1
+       GetVector(p1,p0,V); //p0-p1
+       
+
+       normal[0] = (U[1]*V[2])-(U[2]*V[1]);
+       normal[1] = -((U[0]*V[2])-(U[2]*V[0]));
+       normal[2] = (U[0]*V[1])-(U[1]*V[0]);
+       VectorUnitario(normal);
+}
+
+void GetNormal(vtkPoints* puntosCelda, double* normal){
+       double p0[3], p1[3], p2[3];
+
+       puntosCelda->GetPoint(0, p0);
+       puntosCelda->GetPoint(1, p1);
+       puntosCelda->GetPoint(2, p2);
+
+       GetNormalCelda(p0,p1,p2, normal);
+}
+
+
+// Obtiene el ID de la celda mas cercana
+int GetClosestCellOnPolyData(double* punto, vtkPoints* centers){
+       double distancia = 0.0;
+       double minima = 1e100;
+       int ID = -1;
+       double vertice[3];
+       int N = centers->GetNumberOfPoints();
+
+       for(int i = 0; i < N; i++){
+                centers->GetPoint(i,vertice);
+                distancia =  sqrt(((punto[0]-vertice[0])*(punto[0]-vertice[0]))+((punto[1]-vertice[1])*(punto[1]-vertice[1]))+((punto[2]-vertice[2])*(punto[2]-vertice[2])));
+
+                if (distancia < minima){
+                        minima = distancia;
+                        ID = i;
+                }
+       }
+       
+       //printf("distancia del punto p: (%.2f,%.2f,%.2f) al polydata es %.2f (ID %i)\n", punto[0], punto[1], punto [2], minima, ID);
+       return ID;
+}
+
+double GetProjectionOnNormal(double* vector, double* normal){
+       double pp = GetProductoPunto(vector, normal);
+       double vv = GetNormaVector(normal);
+       double pr = pp / vv;
+       return pr;
+}
+
+
+
+
+
+void wxPathologyWidget_01::OnBtnExtractAxis(wxCommandEvent& event){
+
+
+
+       //================================================================================
+       // RENDERER
+       //================================================================================
+       vtkRenderer* renderer = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+
+       //===================================================================================
+       // IMAGEN ORIGINAL.
+       //===================================================================================
+       int extentOriginal[6];
+       this->patImageData->GetExtent(extentOriginal);  
+       
+
+       //===================================================================================
+       // REMUESTREO
+       //===================================================================================
+
+       int factor = 1;
+       double resampling = 1.0/(double)factor; 
+
+       
+
+       // REMUESTREO DE LA IMAGEN ORIGINAL
+       //-----------------------------------------------------------------------------------
+       vtkImageResample* resamplingFilter = vtkImageResample::New();
+       resamplingFilter->SetAxisOutputSpacing(0,resampling);
+       resamplingFilter->SetAxisOutputSpacing(1,resampling);
+       resamplingFilter->SetAxisOutputSpacing(2,resampling);
+       resamplingFilter->ReleaseDataFlagOff();
+       resamplingFilter->SetInput(patImageData);
+       resamplingFilter->SetInterpolationModeToCubic();
+       resamplingFilter->Update();
+
+
+       //IMAGEN ORIGINAL REMUESTREADA
+       //-----------------------------------------------------------------------------------
+       vtkImageData* imagenRemuestreada = resamplingFilter->GetOutput();
+       imagenRemuestreada->ReleaseDataFlagOff();
+       
+
+
+       //===================================================================================
+       // IMAGEN BINARIA = CRECIMIENTO DE REGIONES
+       //===================================================================================
+
+       this->isoBinaria = vtkImageData::New();
+       this->isoBinaria->CopyStructure(resamplingFilter->GetOutput());
+       this->isoBinaria->SetScalarTypeToDouble();
+       
+       
+       
+       //CALCULO DE LAS DIMENSIONES Y EL EXTENT
+       //-----------------------------------------------------------------------------------
+       int extentBinaria[6];
+       this->isoBinaria->GetExtent(extentBinaria);
+       int *dim = isoBinaria->GetDimensions();
+
+       
+       
+       // IMAGEN EN NEGRO.
+       //-----------------------------------------------------------------------------------
+       int eX, eY, eZ, idpoint; // extent
+       double *ptr = NULL;
+
+       FILE* logger = freopen("tests.txt","w",stdout);
+
+
+
+       for(eX = extentBinaria[0]; eX <= extentBinaria[1]; eX++){
+               for(eY = extentBinaria[2]; eY <= extentBinaria[3]; eY++){
+                       for (eZ = extentBinaria[4]; eZ <= extentBinaria[5]; eZ++){
+                               idpoint = isoBinaria->FindPoint(eX, eY, eZ);
+                               ptr = (double *)isoBinaria->GetScalarPointer(eX,eY,eZ); // El apuntador se obtiene sobre el extent.
+                               *ptr = 0;
+                       }
+               }
+       }
+
+
+    //===================================================================================
+       // POLYDATA
+       //===================================================================================
+     vtkPolyData *polyData= stripper->GetOutput();  //OJO SE TOMA SOLO LA SUPERFICIE MAS GRANDE (connectivity + stripper)
+        //===================================================================================
+
+        vtkPoints *puntosPolyData = polyData->GetPoints();
+        vtkPointData *pointData = polyData->GetPointData();
+       
+        vtkPolyDataWriter* writePoly = vtkPolyDataWriter::New();
+        writePoly->SetFileName("poly.vtk");
+        writePoly->SetInput(polyData);
+        writePoly->Write();
+        
+        
+        
+       // PROCESAR LOS VERTICES
+       //----------------------------------------------------------------------------------
+
+        int numVertices = puntosPolyData->GetNumberOfPoints();
+    
+        // mover el sistema de referencias del polydata para poder determinar lo que se encuentra
+        //por dentro segun las semillas.
+        int j;
+        double vertice[3];
+        /*for(j=0;j<numVertices;j++){
+                puntosPolyData->GetPoint(j,vertice);
+                vertice[0] = vertice[0] + extentOriginal[0];
+                vertice[1] = vertice[1] + extentOriginal[2];
+                vertice[2] = vertice[2] + extentOriginal[4];
+                puntosPolyData->SetPoint(j,vertice);
+        }*/
+
+
+       
+       // PROCESAR LAS CELDAS
+       //----------------------------------------------------------------------------------
+       
+
+        //1. Obtener normales de la superficie (celdas)
+        vtkPolyDataNormals* polyNormalsFilter = vtkPolyDataNormals::New(); //estas son las normales de los vertices NO de las celdas
+        polyNormalsFilter->SetInput(polyData);
+        polyNormalsFilter->SplittingOn();
+        polyNormalsFilter->ConsistencyOn();
+        polyNormalsFilter->NonManifoldTraversalOn();
+        polyNormalsFilter->ComputeCellNormalsOn();
+        polyNormalsFilter->Update();
+       
+        
+        vtkPolyData* polyDataConNormales = polyNormalsFilter->GetOutput();
+     
+
+        //2. Obtener los centros de las celdas
+        // Necesitamos el centro de las celdas para trazar el vector interno de un voxel 
+        //a una cara de la superficie.
+        vtkCellCenters* cellCentersFilter = vtkCellCenters::New();
+        cellCentersFilter->SetInput(polyDataConNormales);
+        cellCentersFilter->VertexCellsOn(); 
+        cellCentersFilter->Update();
+        
+        vtkPolyData* polydataCenters = cellCentersFilter->GetOutput();
+        vtkPoints*   polyCenterPoints  = polydataCenters->GetPoints();
+
+        vtkPoints*   puntosCelda = NULL;
+        vtkIdList*   lista = NULL;
+        vtkCell*     celda = NULL;
+     double normal[3]; 
+        int numCeldas = polyCenterPoints->GetNumberOfPoints();
+
+
+        vtkPoints *normales = vtkPoints::New();//almacena los componentes cartesianos de la normal de cada celda
+        
+     int i;    
+     for(i = 0; i < numCeldas ; i++){
+               
+               polyCenterPoints->GetPoint(i,vertice);
+       
+           celda = polyDataConNormales->GetCell(i);
+               puntosCelda = celda->GetPoints();
+       GetNormal(puntosCelda, normal);
+               normales->InsertPoint(i, normal);
+
+                               
+               lista = celda->GetPointIds();
+               for(j = 0; j < lista->GetNumberOfIds(); j++){
+                       int idPunto = lista->GetId(j);
+                       puntosCelda->GetPoint(j, vertice);
+                       
+               }
+
+        }
+
+       
+        
+        //==========================================================================================
+        //IMPLEMENTAR EL CRECIMIENTO DE REGIONES
+        //==========================================================================================
+        
+       double spacing[3];
+       patImageData->GetSpacing(spacing);
+       
+       double p1crem[3], p2crem[3];
+
+       p1crem[0] = p1Center[0] / spacing[0];
+       p1crem[1] = p1Center[1] / spacing[1];
+       p1crem[2] = p1Center[2] / spacing[2];
+
+       p2crem[0] = p2Center[0] / spacing[0];
+       p2crem[1] = p2Center[1] / spacing[1];
+       p2crem[2] = p2Center[2] / spacing[2];
+
+       
+
+       
+
+    //COORDENADAS DE LA IMAGEN 
+
+       double radio = GetDistanciaEuclideana(p1crem,p2crem) / 2;
+       double centro[3];
+       
+       centro[0] = (p1crem[0] + p2crem[0]) / 2;
+       centro[1] = (p1crem[1] + p2crem[1]) / 2;
+       centro[2] = (p1crem[2] + p2crem[2]) / 2;
+
+       
+
+       //Obtener los ejes sobre la esfera para delimitar el area.
+
+       double lowX             = centro[0] - (2*radio);
+       double highX    = centro[0] + (2*radio);
+       double lowY             = centro[1] - (2*radio);
+       double highY    = centro[1] + (2*radio);
+       double lowZ             = centro[2] - (2*radio);
+       double highZ    = centro[2] + (2*radio);
+
+       //================================================================================
+       //0. Inicializacion
+       //================================================================================
+       
+       int numeroPuntos = dim[0] * dim[1] * dim[2];
+
+
+       int sem[3];
+
+
+       sem[0] = (int)(p2Center[0]-(lowX*spacing[0]));
+       sem[1] = (int)(p2Center[1]-(lowY*spacing[1]));
+       sem[2] = (int)(p2Center[2]-(lowZ*spacing[2]));
+
+               
+       int idSemilla = isoBinaria->FindPoint(sem[0],sem[1],sem[2]);
+
+       if (idSemilla == -1) return;
+
+       int graphSize = (extentBinaria[1]-extentBinaria[0]) * (extentBinaria[3]-extentBinaria[2])*(extentBinaria[5]-extentBinaria[4]);
+
+               
+       vtkPriorityQueue *colaEvaluacion = vtkPriorityQueue::New();
+               
+       colaEvaluacion->Allocate(graphSize);
+               
+       colaEvaluacion->Insert(0, idSemilla);
+
+       vtkFloatingPointType prioridad;
+               
+       int longitudCola = colaEvaluacion->GetNumberOfItems();
+
+               
+       int vecinoID = -1;
+
+       int puntoID = -1;
+
+       double* coordsVecino;
+       
+       double* coordsPunto;
+
+       int cont=0;
+               
+       vtkPoints *resultado = vtkPoints::New();
+
+       int premiere = 1;
+
+
+       double centroCelda[3], vectorInterno[3], vectorNormal[3];
+       
+       while(longitudCola > 0){
+
+                       //================================================================================
+                       //1. Procesar el punto
+                       //================================================================================
+                                               
+                   puntoID = colaEvaluacion->Pop(0,prioridad);
+
+                       coordsPunto = isoBinaria->GetPoint(puntoID);
+                       
+                       
+                   ptr = (double *)isoBinaria->GetScalarPointer((int)(coordsPunto[0]*factor), (int)(coordsPunto[1]*factor), (int)(coordsPunto[2]*factor));
+                       *ptr = 255.0;
+
+                       if(premiere == 1){
+                               vtkImageWriter* writeImage = vtkImageWriter::New();
+                               writeImage->SetInput(isoBinaria);
+                               writeImage->SetFileName("sem.vtk");
+                               writeImage->Write();
+                               premiere = 0;
+                       }
+
+                       resultado->InsertPoint(cont, coordsPunto);
+                       cont++;
+               
+                       //printf("iniciando en el punto (%.1f,%.1f,%.1f) \n", coordsPunto[0], coordsPunto[1], coordsPunto [2]);
+
+                       //================================================================================
+                       //2. Evaluar los vecinos del punto
+                       //================================================================================
+                       int vk,vj,vi;
+                       for(vk = -1; vk<2; vk++) {
+                               for(vj = -1; vj<2; vj++) {
+                                       for(vi = -1; vi<2; vi++) {         
+    
+                                               vecinoID = puntoID + (vk * dim[1]*dim[0]) + (vj * dim[0]) + vi;
+                                               
+                                               if( vecinoID >= 0 && vecinoID < numeroPuntos && vecinoID != 0 && vecinoID != puntoID ) {
+                                               
+                                                               coordsVecino = isoBinaria->GetPoint(vecinoID);
+
+                                                               //ptr = (unsigned char *)isoBinaria->GetScalarPointer(coordsVecino[0],coordsVecino[1],coordsVecino[2]);
+                                                               ptr = (double *)isoBinaria->GetScalarPointer((int)(coordsVecino[0]*factor),(int)(coordsVecino[1]*factor),(int)(coordsVecino[2]*factor));
+                                                               
+                                                               //================================================================================
+                                                               // Para cada vecino no evaluado evaluar la distancia al polydata
+                                                               //================================================================================
+                                                               if (*ptr == 0){
+                                                                       //printf("evaluando punto (%.1f,%.1f,%.1f) \n", coordsVecino[0], coordsVecino[1], coordsVecino [2]);
+                                                                       
+                                                                       int normalID = GetClosestCellOnPolyData(coordsVecino, polyCenterPoints);
+                                                                       
+                                                                       
+                                                                       polyCenterPoints->GetPoint(normalID,centroCelda);
+                                                                       normales->GetPoint(normalID, vectorNormal);
+
+                                                                       GetVector(coordsVecino, centroCelda, vectorInterno);
+                                                                       VectorUnitario(vectorInterno);
+                                                                       
+                                                                       double projection = GetProjectionOnNormal(vectorInterno, vectorNormal);
+                                                                       ptr = (double *)isoBinaria->GetScalarPointer((int)(coordsVecino[0]*factor),(int)(coordsVecino[1]*factor),(int)(coordsVecino[2]*factor));
+
+                                                                       if (projection > 0){
+
+                                                                       //================================================================================
+                                                                       //2.1 Si la proyeccion es positiva
+                                                                       //colocar el vecino en la cola y poner el punto correspondiente en la imagen a 255.
+                                                                       // (no ha pasado la frontera, el marcado a 255 se hace arriba en el while, ver paso 1)
+                                                                       //================================================================================
+                                                                               colaEvaluacion->Insert(prioridad,vecinoID);
+
+                                                                       } else {
+                                                                       
+                                                                       //================================================================================      
+                                                                       //2.2 Si la proyeccion es negativa con la normal mas cercana del polydata,
+                                                                       //descartar el vecino == no poner en la cola == alcanzamos la superficie
+                                                                       //================================================================================
+                                                                       
+                                                                               *ptr = 0;
+                                                                       }
+                                                               }
+                                                       
+                                               }
+                                       }
+                               }
+                       }
+
+                       longitudCola = colaEvaluacion->GetNumberOfItems();
+       }
+       colaEvaluacion->Delete();
+               
+       
+       //================================================================================
+       //  MAPA DE DISTANCIAS
+       //================================================================================
+
+       this->isoDistance = vtkImageEuclideanDistance::New();
+       this->isoDistance->SetInput(this->isoBinaria);
+       this->isoDistance->InitializeOn();
+       this->isoDistance->Update();
+       vtkImageData *imDistancias = isoDistance->GetOutput();
+
+       
+       //================================================================================
+       //  CAMINO MINIMO SOBRE EL MAPA DE DISTANCIAS
+       //================================================================================
+       this->dijkstraFilter = vtkDijkstraImageData::New();
+       this->dijkstraFilter->SetInput(isoDistance->GetOutput());
+
+       int idA = (int)isoBinaria->FindPoint(p1Center[0],p1Center[1], p1Center[2]);
+       int idB = (int)isoBinaria->FindPoint(p2Center[0],p2Center[1], p2Center[2]);
+
+       dijkstraFilter->SourceID = idA;
+       dijkstraFilter->SinkID = idB;
+       dijkstraFilter->Update();
+       
+       caminoMapper = vtkPolyDataMapper::New();
+       caminoMapper->SetInput(dijkstraFilter->GetOutput());
+       caminoMapper->ScalarVisibilityOff();
+
+       renderer->RemoveActor(dataActor);
+
+       //=======================================================================================================       
+       //RECORRIDO DE LOS PUNTOS DEL EJE DETECTADO
+       //=======================================================================================================       
+       vtkIdList *camino = dijkstraFilter->GetShortestPathIdList();
+
+       int size = camino->GetNumberOfIds();
+       double coords[3];
+
+       for(i=0;i < size;i++){
+               int pointId = camino->GetId(i);
+               isoBinaria->GetPoint(pointId, coords);
+               double scalar = imagenRemuestreada->GetPointData()->GetScalars()->GetTuple1(pointId);
+                       
+               //----------------------------------------------------------------------------------------
+               //Visualizacion del nodo del eje
+               //----------------------------------------------------------------------------------------
+               vtkSphereSource   *_nodo   = vtkSphereSource::New();
+               _nodo->SetCenter(coords[0],coords[1],coords[2]);
+               _nodo->SetRadius(0.2);
+
+               vtkPolyDataMapper *_mapper = vtkPolyDataMapper::New();
+               _mapper->SetInput(_nodo->GetOutput());
+
+
+        vtkActor          *_actor  = vtkActor::New();
+               _actor->GetProperty()->SetColor( 0.8, 0.2, 0.3);
+           _actor->SetMapper(_mapper);
+               _actor->PickableOff( );
+               
+               renderer->AddActor(_actor);
+               
+       
+       }
+
+
+}
+// ------------------------------------------------------------------------
+// END PATHOLOGY FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxPathologyWidget_01.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxPathologyWidget_01.h
new file mode 100644 (file)
index 0000000..2315937
--- /dev/null
@@ -0,0 +1,201 @@
+
+#ifndef WX_PATHOLOGY_WIDGET_01
+#define WX_PATHOLOGY_WIDGET_01
+#include <vector>
+
+#include "vtkImageData.h"
+#include "vtkActor.h"
+#include "vtkMarchingCubes.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkAppendFilter.h"
+#include "vtkImageThreshold.h"
+#include "vtkExtractVOI.h"
+#include "vtkOutlineFilter.h"
+#include "vtkImageGaussianSmooth.h"
+#include "vtkImageCast.h"
+#include "vtkImageEuclideanDistance.h"
+#include "vtkPolyDataConnectivityFilter.h"
+#include "vtkPointSet.h"
+#include "vtkDataSetMapper.h"
+#include "vtkImageContinuousDilate3D.h"
+#include "vtkStripper.h"
+#include "vtkImageResample.h"
+#include "vtkPolyDataNormals.h"
+#include "vtkCellCenters.h"
+#include "vtkImageEuclideanDistance.h"
+//#include "vtkSphericalVOI.h"
+
+
+#include "wxVTKRenderWindowInteractor.h"
+#include "wxSurfaceWidget.h"
+#include "wxVtkBaseView.h"
+
+
+#include "kernel/marInterface.h"
+#include "kernel/axisExtractor02.h"
+#include "kernel/vtkSTLExtractor.h"
+#include "kernel/vtkDijkstraImageData.h"    
+
+
+
+class wxPathologyWidget_01: public wxPanel{
+public:
+       wxPathologyWidget_01(wxWindow *parentmar,marInterface *mar);
+       ~wxPathologyWidget_01();
+       void ConfigureVTK();
+       void ConfigureVTK(vtkImageData *imagedata, int x, int y, int z, double param);
+       void Refresh();
+       
+       // --------------------------------------
+       // STL FUNCTIONS DHC
+       // --------------------------------------
+       void ConfigureSTL();
+       void generateSTLSurfaces();
+       void OnBtnFileSTL(wxCommandEvent& event); 
+       void OnBtnLoadBinaryForSTL(wxCommandEvent& event);
+       void OnChangeSTLGaussLevel(wxScrollEvent& event);
+       void OnChangeSTLMarchingCubesLevel(wxScrollEvent& event);
+       void OnOpacitySTLExternal(wxScrollEvent& event);
+       void OnOpacitySTLInternal(wxScrollEvent& event);
+       void OnSTLSubdivisionLevel(wxScrollEvent& event);
+
+       //---------------------------------------
+       // PATHOLOGY FUNCTIONS
+       //---------------------------------------
+       void generatePathologySurface();
+       void OnBtnSetP1(wxCommandEvent& event);
+       void OnBtnSetP2(wxCommandEvent& event);
+       void OnBtnSetPat(wxCommandEvent& event);
+       void OnBtnExtractPat(wxCommandEvent& event);
+       void OnChangePatOpacity(wxScrollEvent& event);
+       void OnChangePatMarchingCubes(wxScrollEvent& event);
+       void OnBtnExtractAxis(wxCommandEvent& event);
+       
+
+private:
+
+       
+       wxVtk3DBaseView         *_imageviewer3D;
+       wxPanel                         *CreateControlPanel(wxWindow *parent);
+       wxPanel                         *CreateViewPanel(wxWindow *parent);
+
+       //Maracas
+       marInterface            *_mar;
+       wxSurfaceWidget         *_maracasSurfaceWidget;
+
+
+
+       //---------------------
+       // STL SURFACES DHC
+       //---------------------
+       char* workingDir;
+       double stlDeltaGaussLevel;
+       double stlMarchingCubesLevel;
+       int stlSubdivisionLevel;
+
+       vtkImageData * stlImageData;
+       vtkPolyData *stlInterna;
+       vtkPolyData *stlExterna;
+       
+       wxSlider        *stlSliderDeltaGauss;
+       wxSlider        *stlSliderMarchingCubes;
+       wxSlider    *stlSliderSubdivision;
+       
+       vtkPolyDataMapper *dsm1;
+    vtkActor *actorInternal;
+       wxSlider *stlSliderOpacityInternal;
+    
+       vtkPolyDataMapper *dsm2; 
+    vtkActor *actorExternal;
+       wxSlider *stlSliderOpacityExternal;
+
+       vtkSTLExtractor *stlExtractor;
+       
+
+       //------------------------
+       // MPR
+       //------------------------
+       void ConfigureMPR();
+       int px, py, pz;
+       vtkSphereSource                         *mprSphereSource;
+    vtkPolyDataMapper                  *mprMapper;
+    vtkActor                                   *mprActor;
+
+
+
+       //--------------------------
+       // PATHOLOGY
+       //--------------------------
+       void ConfigurePathologyExtraction();
+
+       vtkSphereSource         *p1SphereSource;
+       vtkPolyDataMapper       *p1Mapper;
+       vtkActor                        *p1Actor;
+
+       vtkSphereSource         *p2SphereSource;
+       vtkPolyDataMapper       *p2Mapper;
+       vtkActor                        *p2Actor;
+
+       vtkSphereSource         *patSphereSource;
+       vtkPolyDataMapper       *patMapper;
+       vtkActor                        *patActor;
+
+       vtkOutlineFilter    *outlineFilter;
+       vtkPolyDataMapper   *outlineMapper;
+       vtkActor            *outlineActor;
+
+
+       vtkSphereSource         *p3SphereSource;
+       vtkPolyDataMapper       *p3Mapper;
+       vtkActor                        *p3Actor;
+
+
+       wxFrame                         *pathologyFrame;
+       
+       
+       double p1Center[3];
+       double p2Center[3];
+
+       vtkImageData            *patImageData;
+       vtkImageData            *segImageData;
+       vtkExtractVOI           *voiFilter;
+       
+       vtkMarchingCubes        *cubesFilter;
+       vtkPolyDataMapper       *dataMapper;
+       vtkActor                        *dataActor;
+
+       vtkPolyDataMapper       *caminoMapper;
+       vtkActor                        *caminoActor;
+       
+       wxSlider        *patSliderOpacity;
+       wxSlider        *patSliderMarchingCubes;
+       wxSlider        *patSliderDeltaGauss;
+       double patOpacityLevel;
+       double patMCLevel;
+       double patDeltaGauss;
+       vtkImageGaussianSmooth          *gaussFilter; 
+       vtkImageSeedConnectivity        *connectivityFilter;
+       vtkImageThreshold                       *thresholdFilter;
+       vtkImageCast                            *castFilter;
+       wxSlider        *porcentajeSlider;
+       double thresholdOTSU;
+               
+
+       vtkDijkstraImageData *dijkstraFilter;
+
+
+       vtkImageContinuousDilate3D *dilateFilter;
+       vtkStripper *stripper;
+       vtkPolyDataConnectivityFilter *polyUnico;
+
+       
+       vtkImageData *isoBinaria;
+       vtkImageEuclideanDistance *isoDistance;
+
+};
+
+#endif // WX_PATHOLOGY_WIDGET_01
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxProcessingCTWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxProcessingCTWidget.cxx
new file mode 100644 (file)
index 0000000..84565b7
--- /dev/null
@@ -0,0 +1,597 @@
+
+#include "vtkActor.h"
+#include "vtkCylinderSource.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkProperty.h"
+#include "vtkCamera.h"
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+#include "vtkPolyData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataWriter.h"
+#include "vtkPolyDataReader.h"
+#include "vtkImageReader.h"
+#include "vtkImageViewer.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageToStructuredPoints.h"
+
+#include "vtkExtractVOI.h"
+#include "vtkImageClip.h"
+#include "vtkImageResample.h"
+#include "vtkImageCast.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkImageReslice.h"
+#include "vtkTransform.h"
+#include "vtkSphereSource.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkCommand.h"
+#include "vtkCallbackCommand.h"
+#include "vtkImageResample.h"
+#include "vtkMath.h"
+#include "vtkStripper.h"
+#include "vtkImageWriter.h"
+#include "vtkBMPWriter.h"
+#include "vtkImageCast.h"
+#include "vtkPolyDataWriter.h"
+
+#include "wxProcessingCTWidget.h"
+
+#include <wx/splitter.h>
+#include <wx/renderer.h>
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+
+BEGIN_EVENT_TABLE( wxProcessingCTWidget, wxPanel )
+       EVT_MENU( 12121, wxProcessingCTWidget::OnRefreshView )
+END_EVENT_TABLE( );
+
+//-------------------------------------------------------------------
+
+
+wxProcessingCTWidget::wxProcessingCTWidget(wxWindow *parent, marInterfaceCT *mar)
+: wxPanel( parent, -1) 
+{
+       wxSplitterWindow                *pnlSplitter            = new wxSplitterWindow( this , -1);
+       wxPanel                         *viewPanel              = CreateViewPanel(pnlSplitter);
+       wxPanel                         *controlPanel           = CreateControlPanel(pnlSplitter);
+
+       pnlSplitter     -> SplitVertically( viewPanel, controlPanel ,300);
+       pnlSplitter     -> SetMinimumPaneSize( 300 );
+
+       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL  );
+       sizer           -> Add( pnlSplitter ,1,wxALL|wxGROW  ,0);
+       this            -> SetSizer(sizer);
+       this->SetAutoLayout(true);
+//     panel->SetSize(400,400);
+       this->Layout();
+
+//EEDxx2.4
+//     FitInside();
+       _mar = mar;
+       _range[0]=0;
+       _range[1]=255;  
+
+}
+//-------------------------------------------------------------------
+wxProcessingCTWidget::~wxProcessingCTWidget(){
+// MAZV 27 sep 2006
+//     _thresh->Delete();
+//     _connect->Delete();
+
+       _connect2->Delete();
+       
+       _thresh2->Delete();
+
+       delete _imageviewer2D_1;
+       delete _imageviewer2D_2;
+       delete _imageviewer2D_3;
+}
+//-------------------------------------------------------------------
+wxPanel* wxProcessingCTWidget::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+
+       _imageviewer2D_1 = new wxVtk2DBaseView(panel);
+       _imageviewer2D_2 = new wxVtk2DBaseView(panel);
+       _imageviewer2D_3 = new wxVtk2DBaseView(panel);
+       wxVTKRenderWindowInteractor *iren   = _imageviewer2D_1->GetWxVTKRenderWindowInteractor();
+       wxVTKRenderWindowInteractor *iren_2 = _imageviewer2D_2->GetWxVTKRenderWindowInteractor();
+       wxVTKRenderWindowInteractor *iren_3 = _imageviewer2D_3->GetWxVTKRenderWindowInteractor();
+       sizer->Add(iren , 1, wxGROW, 0);
+       sizer->Add(iren_2, 1, wxGROW, 0);
+       sizer->Add(iren_3, 1, wxGROW, 0);
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+//     panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxProcessingCTWidget::CreateControlPanel(wxWindow *parent)
+{
+       _parent=parent;
+       wxPanel *panel          = new wxPanel(parent,-1);
+       _lowthreshold           = new wxSlider( panel, -1,65000 , 64000, 65000, wxDefaultPosition, wxSize(25,25), wxSL_HORIZONTAL | wxSL_LABELS | wxSL_AUTOTICKS  );
+       _lowthreshold->SetTickFreq(50,0);
+
+       _midthreshold           = new wxSlider( panel, -1, 65000 , 64000, 65000, wxDefaultPosition, wxSize(25,25), wxSL_HORIZONTAL | wxSL_LABELS | wxSL_AUTOTICKS );
+       _midthreshold->SetTickFreq(50,0);
+
+
+       _lowthresholdSpin1      = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
+       _lowthresholdSpin1->SetRange(1,8);
+       _lowthresholdSpin1->SetValue(5);
+       Connect(_lowthresholdSpin1->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED      , (wxObjectEventFunction) &wxProcessingCTWidget::OnSpinLowThresholdSpin1 ); 
+//     Connect(_lowthresholdSpin1->GetId()  , wxEVT_SCROLL_THUMBTRACK   , (wxObjectEventFunction) &wxProcessingCTWidget::OnSpinLowThresholdSpin1 ); 
+
+       _lowthresholdSpin2      = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
+       _lowthresholdSpin2->SetRange(1,8);
+       _lowthresholdSpin2->SetValue(5);
+       Connect(_lowthresholdSpin2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED      , (wxObjectEventFunction) &wxProcessingCTWidget::OnSpinLowThresholdSpin2 ); 
+//     Connect(_lowthresholdSpin2->GetId()  , wxEVT_SCROLL_THUMBTRACK   , (wxObjectEventFunction) &wxProcessingCTWidget::OnSpinLowThresholdSpin2 ); 
+
+
+
+// MAZV 27 sep 2006
+//     _highthreshold          = new wxSlider( panel, -1, 50, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _zslice                         = new wxSlider( panel, -1, 50, 0, 100 , wxDefaultPosition, wxSize(25,25), wxSL_HORIZONTAL | wxSL_LABELS | wxSL_AUTOTICKS );
+       _zslice->SetTickFreq(10,0);
+       _extract                        = new wxButton( panel, -1, _T("Axis extraction"));
+//     _midthreshold->SetSize(250,20);
+// MAZV 27 sep 2006
+       //_highthreshold->SetSize(250,20);  // Result Volume
+
+//         wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+    wxBoxSizer *sizer  = new wxBoxSizer(wxVERTICAL );
+
+       int flag = wxALL | wxGROW ;
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))                                                  , 1, flag, 0);
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))                                                  , 1, flag, 0);
+       sizer->Add(new wxStaticText(panel,-1,_T("Lower vascular threshold"))                            , 1, flag, 0);  
+
+    wxBoxSizer *sizerLowThreshold      = new wxBoxSizer(wxHORIZONTAL );
+       sizerLowThreshold->Add(_lowthresholdSpin1                                                       );
+       sizerLowThreshold->Add(_lowthreshold                                                            , 1, wxALL | wxGROW , 0);
+       sizer->Add(sizerLowThreshold                                                                    , 1, wxALL | wxGROW , 0);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))                                                  , 1, flag, 0);
+       sizer->Add(new wxStaticText(panel,-1,_T("Higher vascular threshold"))                           , 1, flag, 0);
+
+    wxBoxSizer *sizerMidThreshold      = new wxBoxSizer(wxHORIZONTAL );
+       sizerMidThreshold->Add(_lowthresholdSpin2                                                       );
+       sizerMidThreshold->Add(_midthreshold                                                            , 1, flag, 0);
+       sizer->Add(sizerMidThreshold                                                                    , 1, flag, 0);
+       
+
+// MAZV 27 sep 2006
+//     sizer->Add(new wxStaticText(panel,-1,"  "));
+//     sizer->Add(new wxStaticText(panel,-1,"Calcification threshold"));
+//     sizer->Add(_highthreshold);
+
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))                                                  , 1, flag, 0);
+       sizer->Add(new wxStaticText(panel,-1,_T("Z Slice"))                                             , 1, flag, 0);
+       sizer->Add(_zslice                                                                              , 1, flag, 0);
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))                                                  , 1, flag, 0);
+       sizer->Add(_extract                                                                             , 1, flag, 0);
+
+//     panel->SetSize(200,200);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->Layout();
+//     panel->FitInside(parent);
+
+       Connect(_lowthreshold->GetId()  , wxEVT_SCROLL_CHANGED                  , (wxObjectEventFunction) &wxProcessingCTWidget::OnLowThreshold); 
+       Connect(_lowthreshold->GetId()  , wxEVT_SCROLL_THUMBTRACK               , (wxObjectEventFunction) &wxProcessingCTWidget::OnLowThreshold); 
+       Connect(_midthreshold->GetId()  , wxEVT_SCROLL_CHANGED                  , (wxObjectEventFunction) &wxProcessingCTWidget::OnMidThreshold ); 
+       Connect(_midthreshold->GetId()  , wxEVT_SCROLL_THUMBTRACK               , (wxObjectEventFunction) &wxProcessingCTWidget::OnMidThreshold ); 
+
+
+// MAZV 27 sep 2006
+//  Connect(_highthreshold->GetId() , wxEVT_SCROLL_THUMBTRACK          , (wxObjectEventFunction) &wxProcessingCTWidget::OnHighThreshold );
+
+       Connect(_zslice->GetId()                , wxEVT_SCROLL_CHANGED                  , (wxObjectEventFunction) &wxProcessingCTWidget::OnZSlice );
+       Connect(_zslice->GetId()                , wxEVT_SCROLL_THUMBTRACK               , (wxObjectEventFunction) &wxProcessingCTWidget::OnZSlice );
+
+       Connect(_extract->GetId()               , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxProcessingCTWidget::OnExtract );
+       return panel;
+}
+
+
+//------------------------------------------------------------------------
+
+void wxProcessingCTWidget::Refresh()
+{
+       int z = (int)(_vtkbasedata_1->GetZ( ));
+
+       _vtkbasedata_1->SetZ( z );
+       _vtkbasedata_2->SetZ( z );
+       _vtkbasedata_3->SetZ( z );
+
+       _imageviewer2D_3->Refresh();
+       _imageviewer2D_1->Refresh();
+       _imageviewer2D_2->Refresh();
+
+       _imageviewer2D_3->RefreshView();
+       _imageviewer2D_1->RefreshView();
+       _imageviewer2D_2->RefreshView();
+
+
+}
+
+//----------------------------------------------------------------------------
+void wxProcessingCTWidget::OnSpinLowThresholdSpin1(wxScrollEvent& event)
+{
+       int value = _lowthreshold->GetValue();
+       int delta = (int) (pow( 4 , _lowthresholdSpin1->GetValue() ));
+       int min   = value - delta/2;
+       int max   = value + delta/2;
+       if (min<0)
+       {
+               min=0;
+               max=delta;
+       }
+       _lowthreshold->SetRange(min,max);
+}
+
+//----------------------------------------------------------------------------
+void wxProcessingCTWidget::OnSpinLowThresholdSpin2(wxScrollEvent& event)
+{
+       int value = _midthreshold->GetValue();
+       int delta = (int)(pow( 4 , _lowthresholdSpin2->GetValue() ));
+       int min=value - delta/2;
+       int max=value + delta/2;
+       if (min<0)
+       {
+               min=0;
+               max=delta;
+       }
+       _midthreshold->SetRange(min,max);
+}
+
+
+//----------------------------------------------------------------------------
+void wxProcessingCTWidget::OnRefreshView(wxCommandEvent & event)
+{
+       Refresh();
+}
+
+//------------------------------------------------------------------------
+
+void wxProcessingCTWidget::ConfigureVTK(marImageData *marimagedata, int x, int y, int z)
+{
+    wxBusyCursor wait;
+
+       _x = x;
+       _y = y;
+       _z = z;
+
+       vtkImageData *imagedata=marimagedata->GetImageData();
+       imagedata->UpdateInformation();
+       imagedata->SetUpdateExtent(imagedata->GetWholeExtent());
+       imagedata->Update();
+
+       data = imagedata;
+
+       double puntoactualprov[3];
+       puntoactualprov[0] = x;
+       puntoactualprov[1] = y;
+       puntoactualprov[2] = z;
+
+       double espprin[3];
+       int extprin[6];                         
+       
+       imagedata->GetSpacing(espprin);
+       imagedata->GetExtent(extprin);
+
+
+// MAZV 27 sep 2006
+//     puntoactualprov[0]=puntoactualprov[0]*espprin[0];
+//     puntoactualprov[1]=puntoactualprov[1]*espprin[1];
+//     puntoactualprov[2]=puntoactualprov[2]*espprin[2];
+       
+    imagedata->GetScalarRange( _range );
+
+
+       // Update Controls
+       _lowthreshold->SetRange( (int)(_range[0]), (int)(_range[1]));
+       _lowthreshold->SetValue( (int)(_range[1]/4) );
+
+       _midthreshold->SetRange( (int)(_range[0]),  (int)(_range[1]));
+       _midthreshold->SetValue( (int)(_range[1]/2) );
+
+// MAZV 27 sep 2006
+//     _highthreshold->SetRange(_range[0], _range[1]);
+//     _highthreshold->SetValue( _range[1] );
+
+       _zslice->SetRange(extprin[4], extprin[5]);
+       _zslice->SetValue(extprin[5]/2);
+    
+       
+       _thresh = vtkImageThreshold::New();
+       _thresh->SetInput(imagedata);
+       //_thresh->ReleaseDataFlagOff();
+       _thresh->SetInValue(255);
+       _thresh->SetOutputScalarTypeToUnsignedShort();
+       _thresh->SetOutValue(0);
+       _thresh->ThresholdBetween(_lowthreshold->GetValue(), _range[1]);
+
+       vtkImageCast *cast = vtkImageCast::New();
+       cast->SetInput(_thresh->GetOutput());
+       cast->SetOutputScalarTypeToUnsignedChar();
+       cast->Update();
+
+  
+       _connect = vtkImageSeedConnectivity::New();
+       _connect->SetInput(cast->GetOutput());
+       _connect->SetInputConnectValue(255);
+       _connect->SetOutputConnectedValue(255);
+       _connect->SetOutputUnconnectedValue(0);
+       _connect->AddSeed( (int)(puntoactualprov[0]), (int)(puntoactualprov[1]), (int)(puntoactualprov[2]));
+       _connect->Update();
+
+       cast3 = vtkImageCast::New();
+       cast3->SetInput(_connect->GetOutput());
+       cast3->SetOutputScalarTypeToUnsignedShort();
+       cast3->Update();
+
+       _thresh2 = vtkImageThreshold::New();
+       _thresh2->SetInput(imagedata);
+       //_thresh2->ReleaseDataFlagOff();
+       _thresh2->SetInValue(255);
+       _thresh2->SetOutputScalarTypeToUnsignedShort();
+       _thresh2->SetOutValue(0);
+       _thresh2->ThresholdBetween(_lowthreshold->GetValue(), _midthreshold->GetValue());
+
+       vtkImageCast *cast2 = vtkImageCast::New();
+       cast2->SetInput(_thresh2->GetOutput());
+       cast2->SetOutputScalarTypeToUnsignedChar();
+       cast2->Update();
+
+
+       _connect2 = vtkImageSeedConnectivity::New();
+       _connect2->SetInput(cast2->GetOutput());
+       _connect2->SetInputConnectValue(255);
+       _connect2->SetOutputConnectedValue(255);
+       _connect2->SetOutputUnconnectedValue(0);
+       _connect2->AddSeed(  (int)(puntoactualprov[0]),  (int)(puntoactualprov[1]),  (int)(puntoactualprov[2]) );
+       _connect2->Update();
+
+       cast4 = vtkImageCast::New();
+       cast4->SetInput(_connect2->GetOutput());
+       cast4->SetOutputScalarTypeToUnsignedShort();
+       cast4->Update();
+
+       // Interface Update
+
+       _vtkbasedata_1 = new vtkBaseData();
+       _vtkbasedata_1->SetMarImageData(marimagedata);
+       
+
+       cast3->GetOutput()->UpdateInformation();
+       cast3->GetOutput()->SetUpdateExtent( cast3->GetOutput()->GetWholeExtent() );
+       cast3->GetOutput()->SetUpdateExtent( cast3->GetOutput()->GetWholeExtent() );
+       
+       cast3->GetOutput()->Update();
+       _vtkbasedata_2 = new vtkBaseData();
+       _vtkbasedata_2->SetMarImageData( new marImageData(cast3->GetOutput()) );
+
+
+       cast4->GetOutput()->UpdateInformation();
+       cast4->GetOutput()->SetUpdateExtent(cast4->GetOutput()->GetWholeExtent());
+       cast4->GetOutput()->Update();
+       _vtkbasedata_3 = new vtkBaseData();
+       _vtkbasedata_3->SetMarImageData( new marImageData(cast4->GetOutput() ));
+
+       _imageviewer2D_1->SetVtkBaseData( _vtkbasedata_1  );
+       _imageviewer2D_1->Configure();
+
+       _imageviewer2D_2->SetVtkBaseData( _vtkbasedata_2  );
+       _imageviewer2D_2->Configure();
+
+       _imageviewer2D_3->SetVtkBaseData( _vtkbasedata_3  );
+       _imageviewer2D_3->Configure();
+// EED 31 Mai 2007
+//     Refresh();
+       
+}
+
+
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::MidThreshold()
+{
+       _thresh2->ThresholdBetween(_lowthreshold->GetValue(), _midthreshold->GetValue());
+       _thresh2->Update();
+}
+
+
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::LowThreshold()
+{
+// MAZV 27 sep 2006
+//     _thresh->ThresholdBetween(_lowthreshold->GetValue(), _highthreshold->GetValue());
+//     _thresh->Update();
+
+// MAZV 3 oct 2006
+       _thresh->ThresholdBetween(_lowthreshold->GetValue(), _range[1] );
+       _thresh->Update();
+       
+       MidThreshold();
+
+}
+
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::OnLowThreshold(wxScrollEvent& event)
+{      
+       LowThreshold();
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::OnMidThreshold(wxScrollEvent& event){
+       MidThreshold();
+       Refresh();
+}
+
+//------------------------------------------------------------------------
+// MAZV 27 sep 2006
+//void wxProcessingCTWidget::OnHighThreshold(wxScrollEvent& event){
+//   _thresh->ThresholdBetween(_lowthreshold->GetValue(), _highthreshold->GetValue());
+//     Refresh();
+//}
+
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::OnZSlice(wxScrollEvent& event){
+       _vtkbasedata_1->SetZ( _zslice->GetValue() );
+//     _vtkbasedata_2->SetZ( _zslice->GetValue() );
+//     _vtkbasedata_3->SetZ( _zslice->GetValue() );
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::OnExtract(wxCommandEvent& event){
+       
+    wxBusyCursor wait;
+    int ext[6];
+
+    vtkImageChangeInformation* change = vtkImageChangeInformation::New();
+    change->SetInput( _vtkbasedata_3->GetImageData() );
+    
+       _vtkbasedata_3->GetImageData()->GetWholeExtent(ext);
+    change->SetExtentTranslation( -ext[0], -ext[2], -ext[4] );
+    change->Update();
+       
+    vtkImageData *image = change->GetOutput();
+
+    marParameters *marParam  = new marParameters();
+    marParam->copyFrom ( *(_mar->getParameters()) );
+    marParam->setDoubleParam( marParameters::e_RescaleIntercept , 0 );
+    marParam->setDoubleParam( marParameters::e_RescaleSlope     , 1 );
+
+    marExperiment *newExperiment = new marExperiment( marParam );
+
+    kVolume *vol = new kVolume( image  );
+    newExperiment->setVOI(ext);
+    newExperiment->initExperiment(vol);
+    newExperiment->setStartPoint( _x, _y, _z);
+    newExperiment->extractVascularTree();
+
+       //_mar->_experiment->initExperiment(new kVolume(data));
+       _mar->appendAxis(newExperiment->getAxis(0));
+       //_mar->_experiment->setVOI(ext);
+       _mar->setAxis(0);
+       _mar->prepareQuantification( );
+
+       wxCommandEvent ev(wxEVT_COMMAND_MENU_SELECTED,20005);
+       _parent->ProcessEvent( ev );
+
+       int size = _mar->getNumberOfSlices( );
+
+       if (size != 0){
+               wxString msg;
+               msg.Printf(_T("Axis Extracted"));
+               wxMessageDialog(this, msg,_T("Information")).ShowModal();
+       }
+       
+
+/*
+       FILE *ff;
+    ff=fopen("c:/Temp/DATOS.txt","a+");
+       fprintf(ff,"z:%d -  x:%d y:%d\n",size,ext[1]+1,ext[3]+1,ext[5]+1);
+       fclose(ff);
+
+       vtkImageWriter *w = vtkImageWriter::New();
+
+       
+       for (int i = 0; i < size; i++){
+               std::string path = "C:/TEMP/";
+               w->SetInput(_mar->_experiment->getSliceImage(i));
+               char *f = "";
+               f = itoa(i, f, 10);
+               std::string fil(f);
+
+               path.append(fil.c_str());
+               w->SetFileName(path.c_str());
+               w->Write();
+       }
+       w->Delete();
+*/
+
+
+/*     vtkBMPWriter *w = vtkBMPWriter::New();
+       vtkImageCast *c = vtkImageCast::New();
+
+       for (int i = 0; i < size; i++){
+               std::string path = "C:/TEMP/";
+               
+
+               c->SetInput(_mar->_experiment->getSliceImage(i));
+               c->SetOutputScalarTypeToUnsignedChar();
+               c->Update();
+
+               w->SetInput(c->GetOutput());
+               char *f = "";
+               f = itoa(i, f, 10);
+               std::string fil(f);
+
+               path.append(fil.c_str());
+               path.append(".bmp");
+               w->SetFileName(path.c_str());
+               w->Write();
+       }*/
+
+       //Escritura a pcx con LibIDO
+/*
+       for ( int i = 0; i < size; i++){
+               PPIMAGE_USHORT imalibido = (PPIMAGE_USHORT) IdImaAlloc(128,128, IMA_USHORT);
+               for (int j = 0; j < 128; j++){
+                       for (int k = 0; k < 128; k++){
+                               imalibido[k][j] = (unsigned short)_mar->_experiment->getSliceImage(i)->GetScalarComponentAsDouble(j, k, 0, 0);
+                       }
+               }
+               std::string path = "C:/TEMP/";
+               char *f = "";
+               f = itoa(i, f, 10);
+               std::string fil(f);
+               path.append(fil.c_str());
+               path.append(".pcx");
+               PPIMAGE_UCHAR imagennueva =  IdImaRecad16To8(imalibido, -1, -1);
+               IdImaWritePCXFile((char*)path.c_str(), imagennueva);
+               IdImaClear((PPIMAGE)imalibido);
+       }
+
+*/
+
+}
+
+
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::SetThreshold(int min        ,int max)
+{
+       _lowthreshold->SetValue(min);
+       _midthreshold->SetValue(max);
+       LowThreshold();
+}
+//------------------------------------------------------------------------
+void wxProcessingCTWidget::GetThreshold(int *min       ,int *max)
+{
+       *min = _lowthreshold->GetValue();
+       *max = _midthreshold->GetValue();
+}
+
+
+//------------------------------------------------------------------------
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxProcessingCTWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxProcessingCTWidget.h
new file mode 100644 (file)
index 0000000..0157b98
--- /dev/null
@@ -0,0 +1,116 @@
+
+
+#ifndef __WX__PROCESSING__CT__WIDGET__
+#define __WX__PROCESSING__CT__WIDGET__
+
+
+
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>  
+#include <vtkPolyDataMapper.h>
+#include <vtkImageThreshold.h>
+#include <vtkImageData.h>
+#include <vtkImageSeedConnectivity.h>
+
+
+
+
+#include "wxMPRWidget.h"
+#include "wxVTKRenderWindowInteractor.h"
+#include <kernel/axisExtractor02.h>
+
+#include <kernel/marInterfaceCT.h>
+#include <kernel/marAxis.h>
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxProcessingCTWidget: public wxPanel{
+public:
+       wxProcessingCTWidget(wxWindow *parent, marInterfaceCT *mar);
+       ~wxProcessingCTWidget();
+       void ConfigureVTK(marImageData *marimagedata, int x, int y, int z);
+       void Refresh();
+       void OnLowThreshold(wxScrollEvent& event); // Umbral inferior
+       void OnMidThreshold(wxScrollEvent& event); // Umbral medio
+       void LowThreshold();
+       void MidThreshold();
+
+// MAZV 27 sep 2006
+//     void OnHighThreshold(wxScrollEvent& event); // Umbral alto
+       void OnZSlice(wxScrollEvent& event); // Z Slice
+       void OnExtract(wxCommandEvent& event);
+       void OnRefreshView(wxCommandEvent & event);
+
+       void SetThreshold(int min       ,int max);
+       void GetThreshold(int *min      ,int *max);
+
+       void OnSpinLowThresholdSpin1(wxScrollEvent& event);
+       void OnSpinLowThresholdSpin2(wxScrollEvent& event);
+
+
+
+private:
+       wxWindow                                        *_parent;
+
+       // Original Volume
+       vtkMarchingCubes        *_mCubes;
+       vtkPolyDataMapper       *_surfMapper;
+       vtkActor                        *_surfActor;
+
+       marInterfaceCT          *_mar;
+
+       // New vtk - thresholding
+       
+       vtkImageThreshold                       *_thresh;  //Lower - Upper
+       vtkImageThreshold                       *_thresh2; //Lower - Medium
+
+       
+       vtkImageSeedConnectivity        *_connect;
+       vtkImageSeedConnectivity        *_connect2;
+       vtkImageCast                            *cast3;
+       vtkImageCast                            *cast4;
+       vtkImageData                            *data;
+       
+
+       wxSlider                                        *_lowthreshold;
+       wxSlider                                        *_midthreshold;
+
+       wxSlider                                        *_lowthresholdSpin1;
+       wxSlider                                        *_lowthresholdSpin2;
+
+
+// MAZV 27 sep 2006
+//wxSlider                                             *_highthreshold;
+       wxSlider                                        *_zslice;
+       wxVtk2DBaseView                         *_imageviewer2D_1;
+       wxVtk2DBaseView                         *_imageviewer2D_2;
+       wxVtk2DBaseView                         *_imageviewer2D_3;
+
+       wxButton                                        *_extract;
+
+       vtkBaseData                                     *_vtkbasedata_1;
+       vtkBaseData                                     *_vtkbasedata_2;
+       vtkBaseData                                     *_vtkbasedata_3;
+
+       wxPanel                                         *CreateControlPanel(wxWindow *parent);
+       wxPanel                                         *CreateViewPanel(wxWindow *parent);
+
+       int                     _x, _y, _z;
+    double             _range[2];
+
+       DECLARE_EVENT_TABLE( );
+
+
+};
+
+#endif // __WX__PROCESSING__CT__WIDGET__
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget.cxx
new file mode 100644 (file)
index 0000000..d16b85a
--- /dev/null
@@ -0,0 +1,2298 @@
+
+
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxQuantificationWidget.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:43 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "wxQuantificationWidget.h"
+#include "../marDictionary.h"
+//#include "../wxMaracasMPR.h"
+
+
+//#include <matrix.h>
+//#include <wx/notebook.h>
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( wxQuantificationWidget, wxPanel )
+       EVT_BUTTON(ID_BUTTON_CONTOUR            , wxQuantificationWidget::OnContour_BT                                          )
+       EVT_BUTTON(ID_BUTTON_CLEAN                      , wxQuantificationWidget::OnClean_BT                                            )
+       EVT_BUTTON(ID_BUTTON_CLEAN_ALL          , wxQuantificationWidget::OnCleanAll_BT                                         )
+       EVT_BUTTON(ID_BUTTON_SAVE_CONTOURS3D, wxQuantificationWidget::OnSaveContours3D_BT                               )
+
+//     EVT_BUTTON(ID_BUTTON_HEALTHY,   wxQuantificationWidget::OnHealthySlice_BT                                       )
+
+       // PS ->     EVT_BUTTON(ID_BUTTON_CALCULATED, wxQuantificationWidget::OnCalculated_BT           )
+       // PS ->     EVT_BUTTON(ID_BUTTON_PAUSE,      wxQuantificationWidget::OnPause_BT                        )
+       // PS ->     EVT_BUTTON(ID_BUTTON_DELETE,     wxQuantificationWidget::OnDelete_BT                       )
+       // PS ->     EVT_BUTTON(ID_BUTTON_POINT,      wxQuantificationWidget::OnSetPoint_BT                     )
+
+       EVT_CHECKBOX(ID_CHECKBOX_HEALTHY,                       wxQuantificationWidget::OnHealthySlice_CB               )
+       EVT_CHECKBOX(ID_CHECKBOX_SHOW_SURFACE,          wxQuantificationWidget::OnShowSurface_CB                )
+       EVT_CHECKBOX(ID_CHECKBOX_VISIBLE_RINGS,         wxQuantificationWidget::OnVisibleRing_CB                )
+       EVT_CHECKBOX(ID_CHECKBOX_PERPENDICULAR,         wxQuantificationWidget::OnPerpendicular_CB              )
+
+       EVT_RADIOBUTTON(ID_RADIOBUTTON_GREYSCALE,       wxQuantificationWidget::OnGreyScale_RB                  )
+       EVT_RADIOBUTTON(ID_RADIOBUTTON_COLOR,           wxQuantificationWidget::OnColor_RB                              )
+
+       EVT_COMMAND_SCROLL(ID_SLIDER_SLICE,                     wxQuantificationWidget::OnSliderSliceScroll             )
+
+       EVT_COMMAND_SCROLL(ID_SLIDER_OPACITY,           wxQuantificationWidget::OnSliderOpacityScroll   )
+       EVT_COMMAND_SCROLL_THUMBRELEASE(ID_SLIDER_ISOVALUE, wxQuantificationWidget::OnSliderIsovalueScroll      )
+END_EVENT_TABLE( );
+
+
+//--------------------------------------------------------------------------------
+// Constructor
+//--------------------------------------------------------------------------------
+wxQuantificationWidget::wxQuantificationWidget(wxWindow* parent, wxWindowID id,
+                                               const wxPoint& pos, const wxSize& size, long style,
+                                               const wxString& name)
+: wxQuantificationWidget_base( parent, id, pos, size, style, name )
+{
+    panel_splitter              = new wxSplitterWindow( this                   , -1, wxDefaultPosition, wxSize(400,400 ), wxSP_3D | wxSP_LIVE_UPDATE | wxCLIP_CHILDREN );
+//     panel_left                       = new wxPanel(panel_splitter                   , -1, wxDefaultPosition, wxSize(400,400));
+       panel_right                      = new wxPanel(panel_splitter                   , -1, wxDefaultPosition, wxSize(400,400));
+
+    panel_splitter_left         = new wxSplitterWindow( panel_splitter                 , -1, wxDefaultPosition, wxSize(400,400 ), wxSP_3D | wxSP_LIVE_UPDATE | wxCLIP_CHILDREN );
+       panel_left_up            = new wxPanel(panel_splitter_left              , -1, wxDefaultPosition, wxSize(200,200));
+       panel_left_down          = new wxPanel(panel_splitter_left              , -1, wxDefaultPosition, wxSize(200,200));
+
+
+    panel_splitter_right = new wxSplitterWindow( panel_right   , -1, wxDefaultPosition, wxSize(400,400 ), wxSP_3D | wxSP_LIVE_UPDATE | wxCLIP_CHILDREN );
+       panel_right_up           = new wxPanel(panel_splitter_right             , -1, wxDefaultPosition, wxSize(200,200));
+       panel_right_down         = new wxPanel(panel_splitter_right             , -1, wxDefaultPosition, wxSize(200,200));
+
+
+
+       // maracas
+       _mar = NULL;
+       SetSizeHealthyRegion( 5 );
+
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _3DWorld = new vtk3DQuantSurfaceWidget( panel_left_up, ID_QUANTIF3D );
+       _3DWorld->SetInterfaceVtkPanelWidgets(this);
+
+       _2DWorld = new vtk2DQuantSliceWidget( panel_right_up, -1 );
+       _2DWorld->SetSize(800,800);
+       _2DWorld->SetInterfaceVtkPanelWidgets(this);
+       
+       
+       this->Set_control();
+       this->Do_layout();
+       this->Set_Data();
+       _bak_ActualSlice=-1;
+
+       Refresh();
+
+//EED Borrame
+//startTimeRI = clock();
+
+}
+
+
+//--------------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+wxQuantificationWidget::~wxQuantificationWidget( )
+{
+//EEDx15
+       _3DWorld->Delete( );
+//     delete _2DWorld;
+}
+// ----------------------------------------------------------------------------
+wxPanel* wxQuantificationWidget::CreateStenosisPanel(){
+       marDictionary marDict;
+
+       wxPanel* panel = new wxPanel(panel_right_down);
+
+       _st_Label100 = new wxStaticText(panel, -1, wxString(marDict.GetString(255), wxConvUTF8) ); // "Stenosis (area)"
+       _st_Label101 = new wxStaticText(panel, -1, wxString(marDict.GetString(260), wxConvUTF8) ); // "Stenosis (diameter)"
+//     _st_Label102 = new wxStaticText(panel, -1, "                          < Area (mm^2) > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+//     _st_Label103 = new wxStaticText(panel, -1, "                       < Perimeter (mm) > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+//     _st_Label104 = new wxStaticText(panel, -1, "        < Diameter (mm) from Area > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+//     _st_Label105 = new wxStaticText(panel, -1, "  < Diameter (mm) from Perimeter > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+//     _st_Label106 = new wxStaticText(panel, -1, "          < Minimum Diameter (mm) > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+//     _st_Label107 = new wxStaticText(panel, -1, "          < Maximum Diameter (mm) > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+//     _st_Label108 = new wxStaticText(panel, -1, "          < Avarege Diameter (mm) > Stenosis :  ",wxPoint(0,0),wxDefaultSize,wxALIGN_RIGHT );
+
+       _st_Value100 = new wxStaticText(panel, -1, _T("--                ") );
+       _st_Value101 = new wxStaticText(panel, -1, _T("--                ") );
+//     _st_Value102 = new wxStaticText(panel, -1, "--");
+//     _st_Value103 = new wxStaticText(panel, -1, "--");
+//     _st_Value104 = new wxStaticText(panel, -1, "--");
+//     _st_Value105 = new wxStaticText(panel, -1, "--");
+//     _st_Value106 = new wxStaticText(panel, -1, "--");
+//     _st_Value107 = new wxStaticText(panel, -1, "--");
+//     _st_Value108 = new wxStaticText(panel, -1, "--");
+
+//EEDxx 2.6
+//     wxStaticText *_st_LabelBlanc = new wxStaticText(panel, -1, "                 ");
+//     _st_LabelBlanc->SetBackgroundColour(*wxLIGHT_GREY);
+
+//EEDxx 2.6
+//     panel->SetBackgroundColour(wxColour(100,0,100));
+//     _st_Label100->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label101->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+
+
+//     _st_Label102->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label103->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label104->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label105->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label106->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label107->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label108->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+//EEDxx 2.6
+//     _st_Value100->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value101->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+//     _st_Value102->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value103->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value104->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value105->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value106->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value107->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value108->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxFont font(14,wxDEFAULT ,wxNORMAL,wxBOLD);
+//     _st_Label100->SetFont(font);
+//     _st_Label101->SetFont(font);
+       _st_Value100->SetFont(font);
+       _st_Value101->SetFont(font);
+
+
+
+       wxGridSizer*  gridSizer1        = new wxFlexGridSizer(1);
+       gridSizer1->Add( new wxStaticText(panel, -1, _T("                 "))   ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Value100    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Label100    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add( new wxStaticText(panel, -1, _T("                 "))   ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Value101    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Label101    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+
+
+
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label102);
+//     gridSizer->Add(_st_Value102);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label103);
+//     gridSizer->Add(_st_Value103);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label104);
+//     gridSizer->Add(_st_Value104);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label105);
+//     gridSizer->Add(_st_Value105);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label106);
+//     gridSizer->Add(_st_Value106);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label107);
+//     gridSizer->Add(_st_Value107);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_LabelBlanc);
+//     gridSizer->Add(_st_Label108);
+//     gridSizer->Add(_st_Value108);
+
+       wxGridSizer*  gridSizer         = new wxFlexGridSizer(4);
+       gridSizer->Add( new wxStaticText(panel, -1, _T("                 "))    ,15, wxALIGN_LEFT , 50);
+       gridSizer->Add( new wxStaticText(panel, -1, _T("                 "))    ,15, wxALIGN_LEFT , 50);
+       gridSizer->Add( new wxStaticText(panel, -1, _T("                 "))    ,15, wxALIGN_LEFT , 50);
+       gridSizer->Add(gridSizer1               ,15, wxALIGN_LEFT , 50);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(gridSizer);
+       panel->Layout();
+
+//EEDxx 2.6
+//     panel->SetBackgroundColour(*wxLIGHT_GREY);
+
+       panel->SetSize(400,300);
+       panel->SetSize( gridSizer->GetMinSize() );
+
+       return panel;
+}
+
+//--------------------------------------------------------
+
+void wxQuantificationWidget::Set_control(){
+       marDictionary marDict;
+       
+       // wxChart
+
+       // EED 
+       //_Chart = new wxChart( this, ID_QUANTIF3D );
+       //_Chart->SetMaxWidthHeight(500,300);
+       //_Chart->SetBackgroundColour(*wxWHITE);
+
+        _wxStenosisPanel = CreateStenosisPanel();
+
+       //wxButton
+       // PS ->   _bt_Point = new wxButton( this, ID_BUTTON_POINT, "Point...",
+       // PS ->                             wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+//     _bt_Healthy = new wxButton( panel_left, ID_BUTTON_HEALTHY, "Healthy Slice",
+//             wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+
+
+       // PS ->   _bt_ContourCalculated = new wxButton( this, ID_BUTTON_CALCULATED, "Contour calculated",
+       // PS ->                                         wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
+       // PS ->   _bt_Pause = new wxButton( this, ID_BUTTON_PAUSE, "Pause",
+       // PS ->                             wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+       // PS ->   _bt_Delete = new wxButton( this, ID_BUTTON_DELETE, "Delete Quantification",
+       // PS ->                              wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+
+       
+
+       _cb_HealthySlice        = new wxCheckBox( panel_left_down, ID_CHECKBOX_HEALTHY, wxString(marDict.GetString(205), wxConvUTF8)); // "Healthy slice"
+       _cb_HealthySlice->SetValue(true);
+//EEDxx 2.6
+//     _cb_HealthySlice->SetBackgroundColour(*wxLIGHT_GREY);
+       _cb_Perpendicular       = new wxCheckBox( panel_left_down, ID_CHECKBOX_PERPENDICULAR, wxString(marDict.GetString(210), wxConvUTF8)); //"Perpendicular section"
+       _cb_Perpendicular->SetValue(true);
+//EEDxx 2.6
+//     _cb_Perpendicular->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _rb_GreyScale           = new wxRadioButton( panel_left_down, ID_RADIOBUTTON_GREYSCALE, wxString(marDict.GetString(230), wxConvUTF8), wxDefaultPosition,wxDefaultSize,wxRB_GROUP  ); //"greyscale    "
+       _rb_GreyScale->SetValue(true);
+//EEDxx 2.6
+//     _rb_GreyScale->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _rb_Color                       = new wxRadioButton( panel_left_down, ID_RADIOBUTTON_COLOR, wxString(marDict.GetString(235), wxConvUTF8), wxDefaultPosition,wxDefaultSize );//"color    "
+       _rb_Color->SetValue(false);
+//EEDxx 2.6
+//     _rb_Color->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _cb_VisibleRings        = new wxCheckBox( panel_left_down, ID_CHECKBOX_VISIBLE_RINGS, wxString(marDict.GetString(215), wxConvUTF8));//"Visible rings"
+       _cb_VisibleRings->SetValue(true);
+//EEDxx 2.6
+//     _cb_VisibleRings->SetBackgroundColour(*wxLIGHT_GREY);
+       _cb_ShowSurface         = new wxCheckBox( panel_left_down, ID_CHECKBOX_SHOW_SURFACE, wxString(marDict.GetString(220), wxConvUTF8));//"Show Surface"
+       _cb_ShowSurface->SetValue(true);
+//EEDxx 2.6
+//     _cb_ShowSurface->SetBackgroundColour(*wxLIGHT_GREY);
+
+       
+       _bt_AddContour3D                = new wxButton( panel_left_down, ID_BUTTON_CONTOUR, wxString(marDict.GetString(245), wxConvUTF8) ,//"Add mark contour"
+                                      wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+       _bt_CleanContour3D              = new wxButton( panel_left_down, ID_BUTTON_CLEAN, wxString(marDict.GetString(250), wxConvUTF8) ,//"Erase mark contours"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       _bt_CleanAllContours3D  = new wxButton( panel_left_down, ID_BUTTON_CLEAN_ALL, wxString(marDict.GetString(253), wxConvUTF8) ,//"Erase all mark contours"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       _bt_SaveContours3D      = new wxButton( panel_left_down, ID_BUTTON_SAVE_CONTOURS3D, wxString(marDict.GetString(248), wxConvUTF8) ,//"Save contours 3D"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       //wxSlider
+       _sl_Slice    = new wxSlider( panel_left_down, ID_SLIDER_SLICE   , 0, 0, 10000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_Isovalue = new wxSlider( panel_left_down, ID_SLIDER_ISOVALUE, 0, 0, 10000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_Opacity  = new wxSlider( panel_left_down, ID_SLIDER_OPACITY , 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//EEDxx 2.6
+//     _sl_Slice->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_Isovalue->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_Opacity->SetBackgroundColour(*wxLIGHT_GREY);
+
+       // size
+       _sl_Slice->SetSize(1800,16);
+       _sl_Isovalue->SetSize(300,16);
+       _sl_Opacity->SetSize(300,16);
+       
+       // Text
+       _st_Slice        = new wxStaticText(panel_left_down, -1, wxString(marDict.GetString(90), wxConvUTF8) ); //"Slice "
+       _st_Isovalue = new wxStaticText(panel_left_down, -1, wxString(marDict.GetString(240), wxConvUTF8) ); //"Isovalue"
+       _st_Opacity  = new wxStaticText(panel_left_down, -1, wxString(marDict.GetString(225), wxConvUTF8) ); //"Opacity "
+//EEDxx 2.6
+//     _st_Slice->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Isovalue->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Opacity->SetBackgroundColour(*wxLIGHT_GREY);
+       
+       
+//     _st_Label0 = new wxStaticText(this, -1, "Partial Axis Lenght");
+//     _st_Value0 = new wxStaticText(this, -1, "0.00");
+//     _st_Label0->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value0->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label1 = new wxStaticText(this, -1, wxString(marDict.GetString(380), wxConvUTF8) ); //"Total Axis Lenght"
+       _st_Value1 = new wxStaticText(this, -1, _T("0.00"));
+
+//EEDxx 2.6
+//     _st_Label1->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value1->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _st_Label2 = new wxStaticText(this, -1, wxString(marDict.GetString(390), wxConvUTF8) );//"Area"
+       _st_Value2 = new wxStaticText(this, -1, _T("0.00"));
+//EEDxx 2.6
+//     _st_Label2->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value2->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _st_Label3 = new wxStaticText(this, -1, wxString(marDict.GetString(400), wxConvUTF8) );//"Perimeter"
+       _st_Value3 = new wxStaticText(this, -1, _T("0.00") );
+//EEDxx 2.6
+//     _st_Label3->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value3->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+//     _st_Label4 = new wxStaticText(this, -1, "Diameter from area");
+//     _st_Value4 = new wxStaticText(this, -1, "0.00");
+//     _st_Label4->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value4->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label5 = new wxStaticText(this, -1, "Diameter from perimeter");
+//     _st_Value5 = new wxStaticText(this, -1, "0.00");
+//     _st_Label5->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value5->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label6 = new wxStaticText(this, -1, wxString(marDict.GetString(405), wxConvUTF8) );//"Minimum Diameter"
+       _st_Value6 = new wxStaticText(this, -1, _T("0.00"));
+//EEDxx 2.6
+//     _st_Label6->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value6->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label7 = new wxStaticText(this, -1, wxString(marDict.GetString(410), wxConvUTF8) );//"Maximum Diameter"
+       _st_Value7 = new wxStaticText(this, -1, _T("0.00"));
+//EEDxx 2.6
+//     _st_Label7->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value7->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label8 = new wxStaticText(this, -1, wxString(marDict.GetString(415), wxConvUTF8) );//"Average Diameter"
+       _st_Value8 = new wxStaticText(this, -1, _T("0.00"));
+//EEDxx 2.6
+//     _st_Label8->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value8->SetBackgroundColour(*wxLIGHT_GREY);
+       // EED -> _st_Label9 = new wxStaticText(this, -1, "Stenosis");
+       // EED -> _st_Value9 = new wxStaticText(this, -1, "0.00");
+       // EED -> _st_Label9->SetBackgroundColour(*wxLIGHT_GREY);
+       // EED -> _st_Value9->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _st_LabelRef101 = new wxStaticText(this, -1, wxString(marDict.GetString(385), wxConvUTF8) );//"Seg. Length"
+       _st_ValueRef101 = new wxStaticText(this, -1, _T("--"));
+//EEDxx 2.6
+//     _st_LabelRef101->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_ValueRef101->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_LabelRef102 = new wxStaticText(this, -1, wxString(marDict.GetString(395), wxConvUTF8) );//"Ref. Area"
+       _st_ValueRef102 = new wxStaticText(this, -1, _T("--"));
+//EEDxx 2.6
+//     _st_LabelRef102->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_ValueRef102->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_LabelRef103 = new wxStaticText(this, -1, wxString(marDict.GetString(420), wxConvUTF8) );//"Ref. Average Diam."
+       _st_ValueRef103 = new wxStaticText(this, -1, _T("--"));
+//EEDxx 2.6
+//     _st_LabelRef103->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_ValueRef103->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _pl_cntlHealthySick2 = new wxPanelControlsHealthySickSlice2(panel_right_down,this);
+
+//EEDxx 2.6
+//   panel_left->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_right_up->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_right_down->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_splitter_right->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_splitter->SetBackgroundColour(*wxLIGHT_GREY);
+}
+
+//--------------------------------------------------------
+
+void wxQuantificationWidget::Do_layout()
+{
+       
+       //Do the layout:
+       
+       wxBoxSizer                      *sizer_principal        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status                         = new wxBoxSizer(wxHORIZONTAL);
+
+//EEDxx 2.6    
+//     wxFlexGridSizer         *medium_right_up        = new wxFlexGridSizer(1,0);
+       wxBoxSizer                      *medium_right_up        = new wxBoxSizer(wxVERTICAL);
+
+       wxFlexGridSizer         *medium_right_down      = new wxFlexGridSizer(1,0);
+
+
+       wxBoxSizer                      *medium_left_up         = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *medium_right           = new wxBoxSizer(wxVERTICAL);
+//     wxFlexGridSizer         *autoQuantif            = new wxFlexGridSizer(1,0);
+
+
+//     wxStaticBoxSizer        *axe                            = new wxStaticBoxSizer(new wxStaticBox(panel_left_down, -1, _T("")), wxVERTICAL);
+       wxFlexGridSizer         *axe                            = new wxFlexGridSizer(1);
+       axe->AddGrowableCol(0);
+
+       wxFlexGridSizer         *axe1                           = new wxFlexGridSizer(10,0);
+       wxBoxSizer                      *axe2                           = new wxBoxSizer(wxHORIZONTAL);
+       wxFlexGridSizer         *axe3                           = new wxFlexGridSizer(10,0);
+       wxFlexGridSizer         *axe4                           = new wxFlexGridSizer(10,0);
+       wxBoxSizer                      *axe5                           = new wxBoxSizer(wxHORIZONTAL);
+       wxBoxSizer                      *axe6                           = new wxBoxSizer(wxHORIZONTAL);
+       
+       wxBoxSizer                      *status0                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status1                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status2                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status3                        = new wxBoxSizer(wxVERTICAL);
+//     wxBoxSizer                      *status4                        = new wxBoxSizer(wxVERTICAL);
+//     wxBoxSizer                      *status5                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status6                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status7                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status8                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status9                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef1                     = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef2                     = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef3                     = new wxBoxSizer(wxVERTICAL);
+       
+
+       axe1->Add(_st_Slice                                     , 10, wxALL|wxEXPAND, 0);
+       axe1->Add(_sl_Slice                                     , 10, wxALL|wxGROW, 0);
+       axe1->AddGrowableCol(1);
+
+       axe2->Add(_cb_HealthySlice                      , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_Perpendicular                     , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_VisibleRings                      , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_ShowSurface                       , 10, wxALL|wxEXPAND, 0);
+
+       axe3->Add(_st_Opacity                           ,  1, wxALL|wxEXPAND, 0);
+       axe3->Add(_sl_Opacity                           , 10, wxALL|wxGROW, 0);
+       axe3->Add(_rb_GreyScale                         , 10, wxALL|wxEXPAND, 0);
+       axe3->Add(_rb_Color                                     , 10, wxALL|wxEXPAND, 0);
+       axe3->AddGrowableCol(1);
+
+       axe4->Add(_st_Isovalue                          ,  1, wxALL|wxEXPAND, 0);
+       axe4->Add(_sl_Isovalue                          ,  1, wxALL|wxGROW, 0);
+       axe4->AddGrowableCol(1);
+
+       axe5->Add(_bt_AddContour3D                      ,  1                            );
+       axe5->Add(_bt_CleanContour3D            ,  1                            );
+       axe6->Add(_bt_CleanAllContours3D        ,  1                            );
+       axe6->Add(_bt_SaveContours3D            ,  1                            );
+
+
+//     status0->Add(_st_Label0, 1, wxALL|wxALIGN_CENTER, 5);
+//     status0->Add(_st_Value0, 1, wxALL|wxALIGN_CENTER, 5);
+       status1->Add(_st_Label1, 1, wxALL|wxALIGN_CENTER, 5);
+       status1->Add(_st_Value1, 1, wxALL|wxALIGN_CENTER, 5);
+       status2->Add(_st_Label2, 1, wxALL|wxALIGN_CENTER, 5);
+       status2->Add(_st_Value2, 1, wxALL|wxALIGN_CENTER, 5);
+       status3->Add(_st_Label3, 1, wxALL|wxALIGN_CENTER, 5);
+       status3->Add(_st_Value3, 1, wxALL|wxALIGN_CENTER, 5);
+//     status4->Add(_st_Label4, 1, wxALL|wxALIGN_CENTER, 5);
+//     status4->Add(_st_Value4, 1, wxALL|wxALIGN_CENTER, 5);
+//     status5->Add(_st_Label5, 1, wxALL|wxALIGN_CENTER, 5);
+//     status5->Add(_st_Value5, 1, wxALL|wxALIGN_CENTER, 5);
+       status6->Add(_st_Label6, 1, wxALL|wxALIGN_CENTER, 5);
+       status6->Add(_st_Value6, 1, wxALL|wxALIGN_CENTER, 5);
+       status7->Add(_st_Label7, 1, wxALL|wxALIGN_CENTER, 5);
+       status7->Add(_st_Value7, 1, wxALL|wxALIGN_CENTER, 5);
+       status8->Add(_st_Label8, 1, wxALL|wxALIGN_CENTER, 5);
+       status8->Add(_st_Value8, 1, wxALL|wxALIGN_CENTER, 5);
+       // EED -> status9->Add(_st_Label9, 1, wxALL|wxALIGN_CENTER, 5);
+       // EED -> status9->Add(_st_Value9, 1, wxALL|wxALIGN_CENTER, 5);
+       
+       statusRef1->Add(_st_LabelRef101, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef1->Add(_st_ValueRef101, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef2->Add(_st_LabelRef102, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef2->Add(_st_ValueRef102, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef3->Add(_st_LabelRef103, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef3->Add(_st_ValueRef103, 1, wxALL|wxALIGN_CENTER, 5);
+
+
+//     status->Add(status0             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status1             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef1  , 1, wxALL|wxEXPAND, 0);
+       status->Add(status2             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef2  , 1, wxALL|wxEXPAND, 0);
+       status->Add(status3             , 1, wxALL|wxEXPAND, 0);
+//     status->Add(status4             , 1, wxALL|wxEXPAND, 0);
+//     status->Add(status5             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status6             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status7             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status8             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef3  , 1, wxALL|wxEXPAND, 0);
+       // EED -> status->Add(status9, 1, wxALL|wxEXPAND, 0);
+       
+       axe->Add(axe1, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe2, 2, wxALL|wxEXPAND, 0);   //wxALIGN_CENTER_HORIZONTAL
+       axe->Add(axe3, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe4, 2, wxALL|wxEXPAND, 0);
+
+//     axe->Add(axe5, 2, wxALL|wxEXPAND, 0);
+//     axe->Add(axe6, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe5);
+       axe->Add(axe6);
+
+       panel_left_down->SetAutoLayout(true);
+       panel_left_down->SetSizer(axe);
+       panel_left_down->Layout();
+
+
+//EEDxx 2.6 GROW
+//     medium_right_up->Add(_2DWorld                           , 1, wxALL|wxGROW, 5);
+       medium_right_up->Add(_2DWorld                           , 1, wxALL|wxEXPAND, 5);
+
+       medium_right_down->Add(_wxStenosisPanel         , 1, wxALL, 5);
+       medium_right_down->Add(_pl_cntlHealthySick2     , 1, wxALL, 5);
+
+
+       //medium_right->Add(_Chart                      , 1, wxALL|wxEXPAND     , 0);
+       
+//     panel_left->SetAutoLayout(true);
+//     panel_left->SetSizer(medium_left);
+//     panel_left->Layout();
+
+
+       medium_left_up->Add(_3DWorld                                    , 1, wxEXPAND, 0);
+       panel_left_up->SetAutoLayout(true);
+       panel_left_up->SetSizer(medium_left_up);
+       panel_left_up->Layout();
+
+
+    panel_splitter_left->SplitHorizontally( panel_left_up , panel_left_down );
+    panel_splitter_left->SetMinimumPaneSize( 50 );
+
+
+
+       panel_right_up->SetAutoLayout(true);
+       panel_right_up->SetSizer(medium_right_up);
+       panel_right_up->Layout();
+
+       panel_right_down->SetAutoLayout(true);
+       panel_right_down->SetSizer(medium_right_down);
+       panel_right_down->Layout();
+
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+    panel_splitter_right->SplitHorizontally( panel_right_up, panel_right_down, (int)(hh*0.4)  );
+    panel_splitter_right->SetMinimumPaneSize( 50 );
+       
+
+//EEDxx 2.6 GROW
+//     medium_right->Add(panel_splitter_right,1 ,wxGROW,0      );
+       medium_right->Add(panel_splitter_right,1 ,wxALL|wxEXPAND,0      );
+       panel_right->SetAutoLayout(true);
+       panel_right->SetSizer(medium_right);
+       panel_right->Layout();
+//     panel_right->FitInside();
+
+
+    panel_splitter->SplitVertically( panel_splitter_left , panel_right, (int)(ww*0.6) );
+    panel_splitter->SetMinimumPaneSize( 50 );
+
+//EEDxx 2.6 GROW
+//     sizer_principal->Add( panel_splitter    , 1     , wxGROW                );
+//     sizer_principal->Add( status                    , 0     , wxGROW                );
+       sizer_principal->Add( panel_splitter    , 1     , wxALL|wxEXPAND                );
+       sizer_principal->Add( status                    , 0     , wxALL|wxEXPAND                );
+       
+       this->SetSizer(sizer_principal);
+
+//EEDxx2.4
+//     FitInside();
+
+
+}
+
+//--------------------------------------------------------
+void wxQuantificationWidget::Set_Data( )
+{
+       _axis_index                             = -1;
+       _given_points                   = 0;
+       _nClicks                                = 0;
+       _quantifing                             = 0;
+       
+//EED  _real_first_point_quant = -1;
+//EED  _real_last_point_quant  = -1;
+       
+       _shown                                  = 0;
+       _quant_shown                    = 0;
+       
+       _actual_area                    = 0.00;
+       _actual_peri                    = 0.00;
+       _actual_darea                   = 0.00;
+       _actual_dperi                   = 0.00;
+       _actual_dmax                    = 0.00;
+       _actual_dmin                    = 0.00;
+       _actual_davg                    = 0.00;
+       _actual_sten                    = 0.00;
+       _actual_partial                 = 0.00;
+       
+       //_actual_total   = _mar->_experiment->GetAxisLength();
+       //_st_Value1->SetLabel(_actual_total);
+       //return( maracas_data::experiment->get_work_axis( )->get_total_length( ) );
+}
+
+
+/*EED
+//--------------------------------------------------------
+void wxQuantificationWidget::Positionate( )
+{
+       _given_points = 0;
+       _shown = true;
+       _first_quant = 1;
+}
+*/
+
+//--------------------------------------------------------
+void wxQuantificationWidget::Forget( )
+{
+       _shown = false;
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget::ShowMARACASData( marInterface* mar )
+{
+       double        min, max;
+       vtkImageData* imagedata;
+       int nos;
+       int actualQuant=-1;
+       
+       wxBusyCursor wait;
+       _mar = mar;
+       _mar->_experiment->prepareQuantification( );
+       nos = _mar->_experiment->getNumberOfSlices( );
+       actualQuant = (int) (nos-1)/2 ;
+       imagedata = _mar->_experiment->getSliceImage( actualQuant );
+       _mar->_experiment->getAxis()->setActualQuant( actualQuant ) ;
+       _mar->_experiment->getDynData( )->getVolume( )->getMinMax( min, max );
+       
+       _3DWorld->ShowMARACASDataAndAxe( mar );
+       _3DWorld->InitCameraReset( );
+       _2DWorld->ConstructVTK( imagedata );
+       
+       // GUI
+       _sl_Isovalue->SetRange( (int)min, (int)max);
+       _sl_Isovalue->SetValue( (int)(max/4) );
+       _sl_Opacity->SetValue( 50 );
+       Reset_sl_Slider();
+
+       _pl_cntlHealthySick2->GetPnlSearStenosis()->GetPanelAutomatic()->SetRange(0,nos-1);
+
+       int ww1,hh1;
+       int ww2,hh2;
+       int wwT,hhT;
+       int ss;
+       this->GetSize(&wwT,&hhT);
+       _wxStenosisPanel->GetSize(&ww1,&hh1);
+       _pl_cntlHealthySick2->GetSize(&ww2,&hh2);
+
+       ss=hhT-(hh1+hh2+85);
+       panel_splitter_right->SetSashPosition(ss,true);
+
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidget::Reset_sl_Slider()
+{
+       int nos = _mar->_experiment->getNumberOfSlices( );
+       _sl_Slice->SetRange(0, nos-1);
+       _sl_Slice->SetValue( (nos-1)/2 );
+//     _pl_cntlHealthySick->Reset_sl_Slider(nos);
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidget::SetSlider_Isovalue_Opacity(int isovalue,int opacity){
+       _sl_Isovalue->SetValue(isovalue);
+       _sl_Opacity->SetValue(opacity);
+       _3DWorld->SetSurfaceIsoValue( isovalue );
+       _3DWorld->SetSurfaceOpacity( opacity );
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidget::OnShowSurface_CB(wxCommandEvent& event)
+{
+    _3DWorld->SetSurfaceVisibility( _cb_ShowSurface->GetValue() );
+}
+// ---------------------------------------------------------------------------
+void wxQuantificationWidget::ResetAxis(){      
+       Reset_sl_Slider();
+       _mar->_experiment->getAxis()->setActualQuant( _sl_Slice->GetValue() );
+
+       _3DWorld->Hide3DHealthySliceActor();
+       _mar->_experiment->getAxis( )->setHealthySlice( 0,-1,0 );
+}
+// ---------------------------------------------------------------------------
+void wxQuantificationWidget::RefreshAxis( ){   
+       int acuatQuant = _mar->_experiment->getAxis()->getActualQuant();
+       vtkImageData* imagedata;
+       vtkProbeFilter* image3D;
+       vtkPolyData* vtkPolydata_2Dcontour;
+       vtkPoints* vtkPoints_2DDiameterMin;
+       vtkPoints* vtkPoints_2DDiameterMax;
+
+       image3D                                 = _mar->_experiment->get3DSlice                 ( acuatQuant );
+       imagedata                               = _mar->_experiment->getSliceImage              ( acuatQuant );
+       vtkPolydata_2Dcontour   = _mar->_experiment->get2Dcontour               ( acuatQuant );
+       vtkPoints_2DDiameterMin = _mar->_experiment->get2DDiameterMin   ( acuatQuant );
+       vtkPoints_2DDiameterMax = _mar->_experiment->get2DDiameterMax   ( acuatQuant );
+
+       _3DWorld->SetImage(image3D);
+       _3DWorld->Render( );
+       _2DWorld->SetImage(imagedata);
+
+       if (_cb_VisibleRings->GetValue()==true){
+               _2DWorld->SetContour( vtkPolydata_2Dcontour );
+               _2DWorld->SetDiameterMin( vtkPoints_2DDiameterMin , true );
+               _2DWorld->SetDiameterMax( vtkPoints_2DDiameterMax , true );
+       }
+       showVariables( );
+
+// PS ->       marContour * tutu=_mar->_experiment->getAxis()->getContour( event.GetPosition() );
+//     cnt = _mar->_experiment->generateContour(event.GetPosition(), -1, -1, NULL);
+// PS ->       tutu=_mar->_experiment->getAxis()->getContour( event.GetPosition() );
+//     _2DWorld->SetContour( cnt );
+
+
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget::MoveSlider(int actualQuant){
+
+       if (_bak_ActualSlice!=-1){
+               SetManualContour_ReplaceContour();
+               SetManualContour_2DWorld(false);
+       }
+
+       _mar->_experiment->getAxis()->setActualQuant( actualQuant );
+       RefreshAxis();
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget::OnSliderSliceScroll(wxScrollEvent& event){
+       MoveSlider( event.GetPosition() );
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidget::GetStenosisDiameter(int sickSlice){
+       double healthyAverageDiameter = _mar->_experiment->getReferenceAverDiam() ;
+       marContour *marcontourSick = _mar->_experiment->getContour( sickSlice );
+       return doubleStenosis( healthyAverageDiameter , marcontourSick->getMinimumDiameter() );
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidget::GetStenosisArea( int sickSlice){
+       double healthyArea = _mar->_experiment->getReferenceArea();
+       marContour *marcontourSick = _mar->_experiment->getContour( sickSlice );
+       return doubleStenosis( healthyArea , marcontourSick->getArea() );
+}
+// ----------------------------------------------------------------------------
+
+
+/* EED Borrame 
+// ----------------------------------------------------------------------------
+double wxQuantificationWidget::GetStenosisTEST1(marContour *marcontourH, marContour *marcontour){
+       double healthy= marcontourH->getMinimumDiameter() * marcontourH->getMaximumDiameter();
+       double sick= marcontour->getMinimumDiameter() * marcontour->getMaximumDiameter();
+       return doubleStenosis( healthy , sick );
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidget::GetStenosisTEST2(marContour *marcontourH, marContour *marcontour){
+       double steA = GetStenosisArea(marcontourH,marcontour);
+       double steB = GetStenosisDiameter(marcontourH,marcontour);
+       return sqrt(steA + steB);
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidget::GetStenosisTEST3(marContour *marcontourH, marContour *marcontour){
+       return doubleStenosis( marcontourH->getAverageDiameter() , marcontour->getAverageDiameter() );
+}
+*/
+
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget::showVariables()
+{
+       marContour* marcontour;
+       int actualQuant;
+       int healthySlice; 
+       int healthySliceStart; 
+       int healthySliceEnd; 
+
+//                     healthySlice = _sl_Slice->GetValue();
+//                     _mar->_experiment->getAxis( )->setHealthySlice( healthySlice );
+//                     _3DWorld->Set3DHealthySliceActor( );
+//                     _3DWorld->Show3DHealthySliceActor( );   
+       actualQuant = _mar->_experiment->getAxis()->getActualQuant( );
+       marcontour=_mar->_experiment->getContour( actualQuant );
+
+       wxString tmpString;
+//     tmpString.Printf( "%.2f mm" , marcontour->getPartialAxisLenght());              
+//     _st_Value0->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , _mar->_experiment->getTotalLength() );               _st_Value1->SetLabel(tmpString);
+
+
+       tmpString.Printf( _T("%.2f mm^2") , marcontour->getArea());                                              _st_Value2->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , marcontour->getPerimeter());                                 _st_Value3->SetLabel(tmpString);
+//     tmpString.Printf( _T("%.2f mm")   , marcontour->getDiameterFromArea());                  _st_Value4->SetLabel(tmpString);
+//     tmpString.Printf( _T("%.2f mm")   , marcontour->getDiameterFromPerimeter());     _st_Value5->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , marcontour->getMinimumDiameter());                   _st_Value6->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , marcontour->getMaximumDiameter());                   _st_Value7->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , marcontour->getAverageDiameter());                   _st_Value8->SetLabel(tmpString);
+
+       healthySlice            = _mar->_experiment->getAxis( )->getHealthySlice( );
+       healthySliceStart       = _mar->_experiment->getAxis( )->getHealthySliceStart( );
+       healthySliceEnd         = _mar->_experiment->getAxis( )->getHealthySliceEnd( );
+       if ( (healthySlice!=-1) ) {
+               _st_Value100->SetLabel( strStenosis( GetStenosisArea(actualQuant)     ) );
+               _st_Value101->SetLabel( strStenosis( GetStenosisDiameter(actualQuant) ) );
+               tmpString.Printf( _T("%.2f mm^2") , _mar->_experiment->getReferenceArea() );     _st_ValueRef102->SetLabel(tmpString);
+               tmpString.Printf( _T("%.2f mm")   , _mar->_experiment->getReferenceAverDiam() ); _st_ValueRef103->SetLabel(tmpString);
+       } else {
+               _st_Value100->SetLabel(_T("--"));
+               _st_Value101->SetLabel(_T("--"));
+               _st_ValueRef101->SetLabel(_T("--"));
+               _st_ValueRef102->SetLabel(_T("--"));
+               _st_ValueRef103->SetLabel(_T("--"));
+       }
+
+       int startSlice  = _mar->_experiment->getAxis()->getStartQuant();
+       int finishSlice = _mar->_experiment->getAxis()->getFinishQuant();
+    if ((startSlice!=-1) && (finishSlice!=-1)){
+               tmpString.Printf( _T("%.2f mm")   , _mar->_experiment->getSubAxisLength() );     _st_ValueRef101->SetLabel(tmpString);
+       } else {
+               _st_ValueRef101->SetLabel(_T("--"));
+       }
+
+       panel_splitter->SetSashPosition(panel_splitter->GetSashPosition() );
+
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidget::doubleStenosis(double healthy, double sick){
+       double result;
+       if (healthy==0) {       
+               result=-1;      
+       } else {  
+//EED borrame
+//             result = (fabs(healthy-sick)/healthy) * 100 ;   
+               result = (    (healthy-sick)/healthy) * 100 ;   
+       }
+
+       return result;
+}
+// ----------------------------------------------------------------------------
+wxString wxQuantificationWidget::strStenosis(double stenosis){
+
+       wxString tmpString;
+       if (stenosis==-1) {
+               tmpString.Printf(_T("%d"),-1);  
+       } else {
+               tmpString.Printf(_T("%.2f"), stenosis );        
+       }
+       return tmpString + _T(" \%");
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget::OnSliderIsovalueScroll(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+       _3DWorld->SetSurfaceIsoValue( event.GetPosition() );
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget::OnSliderOpacityScroll(wxScrollEvent& event)
+{
+       _3DWorld->SetSurfaceOpacity( event.GetPosition() );
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidget::AddAxisActors(){
+       // Axes ...
+       marAxis *maraxis = _mar->_experiment->getAxis( );
+       if (maraxis!=NULL) _3DWorld->SetAxis( maraxis->Draw( ) );
+       // Other Actors..
+       // ..
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidget::Clean3D( bool eraseAxe )
+{
+       _first_quant = -1;
+       _last_quant = -1;
+//EED  _real_first_point_quant = -1;
+//EED  _real_last_point_quant = -1;
+       //this->controls(1);
+       _quant_shown = false;
+       
+       _3DWorld->InitListContourActor( -1,_mar->_experiment->getNumberOfSlices() );
+       if (eraseAxe==true) { _3DWorld->RemoveAxis(); }
+
+/* EED borrame
+       _3DWorld->Hide3DSliceActor( );
+       _3DWorld->Hide3DContourActor( );
+       _3DWorld->Hide3DHealthySliceActor();
+*/
+
+       /*
+       if (_pRenderer3D != 0) _pRenderer3D->RemoveActor(hs_actor);
+       if (_hs_actor != 0)   hs_actor->delete();
+       if (_hs_mapper != 0)  hs_mapper->delete();
+       if (_hs_grid != 0)   hs_grid->delete();
+       if (_hs_points != 0)   hs_points->delete();
+       if (_hs_poly_line != 0)   hs_poly_line->delete();
+       */
+       
+/* EED
+       int i = 1;
+       int max = _rings_index->GetCount();
+       while  (i <= max) {
+       
+       if (_pRenderer3D != 0)
+    _pRenderer3D->RemoveActor(_cont3DActor(hs_actor[i]));
+       if (_cont3DActor[i] != 0)
+    _cont3DActor[i]->Delete();
+       if (_cont3DMapper[i] != 0)
+    _cont3DMapper[i]->Delete();
+       if (_cont3DGrid[i] != 0)
+    _cont3DGrid[i]->Delete();
+       if (_cont3DPolyLine[i] != 0)
+    _cont3DPolyLine[i]->Delete();
+       if (_cont3DPoints[i] != 0)
+    _cont3DPoints[i]->Delete();
+               
+               i++;
+       }
+       //_rings_index = _list;
+*/
+       
+
+}
+
+void wxQuantificationWidget::Reload_Axis(bool mask , bool step )
+{
+/*  if ( step  ) {
+this->redoAxisSpline();
+if ( pRenderer3D != 0 ) {
+_pRenderer3D->RemoveActor(GetSphereActorName(sphere_quant1));
+_pRenderer3D->RemoveActor(GetSphereActorName(sphere_quant2));
+}
+this->DeleteSphere(sphere_quant1);
+this->DeleteSphere(sphere_quant2);
+_given_points = 0;
+}
+else if ( mask  ) {
+this->recalculeAxisSignal()
+}
+
+  if ( ( mask || step ) && _shown ) {
+  tk_messageBox -icon info -message "$string_table::str_quant_will_be_erased" -type ok
+  catch { renderer_$widgets(work3D) RemoveActor hs_actor_$widgets(work3D) }
+  catch { hs_actor_$widgets(work3D) Delete }
+  catch { hs_mapper_$widgets(work3D) Delete }
+  catch { hs_grid_$widgets(work3D) Delete }
+  catch { hs_points_$widgets(work3D) Delete }
+  catch { hs_poly_line_$widgets(work3D) Delete }
+  foreach i $rings_index {
+  catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+  catch { cont3DActor_{$widgets(work3D)}_{$i}    Delete }
+  catch { cont3DMapper_{$widgets(work3D)}_{$i}   Delete }
+  catch { cont3DGrid_{$widgets(work3D)}_{$i}     Delete }
+  catch { cont3DPolyLine_{$widgets(work3D)}_{$i} Delete }
+  catch { cont3DPoints_{$widgets(work3D)}_{$i}   Delete }
+  
+   }
+   rings_index = list;
+   _area = 0.00;
+   _peri = 0.00;
+   _darea = 0.00;
+   _dperi = 0.00;
+   _dmax = 0.00;
+   _dmin = 0.00;
+   _davg = 0.00;
+   _sten = 0.00;
+   _quant_shown = false;
+   this->clean_graph();  // old BLT
+   
+       _first_quant = 1;
+       _range(getIntensityRange());
+       _resample(getVTKSource());
+       _bounds(resample(GetBounds());
+       
+        // Axis
+        set points [ getAxis_dll ]
+        set nP [ expr [ llength $points ] / 3 ]
+        $widgets(sclSlice) configure \
+        -from 0 \
+        -to   [ expr [ getNumberOfAxisPoints_dll ] - 1 ] \
+        -resolution 1
+        
+         // Poly-line actor construction...
+         catch { renderer_$widgets(work3D) RemoveActor axisActor_$widgets(work3D) }
+         catch { axisActor_$widgets(work3D)    Delete }
+         catch { axisMapper_$widgets(work3D)   Delete }
+         catch { axisGrid_$widgets(work3D)     Delete }
+         catch { axisPolyLine_$widgets(work3D) Delete }
+         catch { axisPoints_$widgets(work3D)   Delete }
+         
+          axisPoints = vtkPoints::New();
+          axisPolyLine = vtkPolyLine::New();
+          axisPolyLine->GetPointIds()->SetNumberOfIds( nP);
+          vox_size = getActualVoxelSize();
+          
+               for { set i 0 } { $i < $nP } { incr i } {
+               
+                [ axisPolyLine_$widgets(work3D) GetPointIds ] SetId $i $i
+                set p [ \
+                PointCoord \
+                [ lindex $points [ expr $i * 3 + 0 ] ] \
+                [ lindex $points [ expr $i * 3 + 1 ] ] \
+                [ lindex $points [ expr $i * 3 + 2 ] ] \
+                [ lindex $bounds 0 ] \
+                [ lindex $bounds 2 ] \
+                [ lindex $bounds 4 ] \
+                $vox_size $vox_size $vox_size \
+                ]
+                axisPoints->InsertNextPoint( lindex $p 0 ] [ lindex $p 1 ] [ lindex $p 2 ]
+                
+                 }
+                 
+                  axisGrid = vtkUnstructuredGrid::New();
+                  axisGrid->Allocate( 1, 1);
+                  axisGrid->InsertNextCell(  [ axisPolyLine->GetCellType(),  ] \
+                  [ axisPolyLine_$widgets(work3D) GetPointIds ]
+                  axisGrid->SetPoints(axisPoints);
+                  
+                       axisMapper = vtkDataSetMapper::New();
+                       axisMapper->SetInput(axisGrid);
+                       axisMapper->ImmediateModeRenderingOn();
+                       
+                        axisActor = vtkActor::New();
+                        axisActor->SetMapper(axisMapper);
+                        axisActor->GetProperty()->BackfaceCullingOn();
+                        axisActor->GetProperty()->SetDiffuseColor(1, 0, 0);
+                        
+                         _pRenderer3D->AddActor(axisActor);
+                         
+                          _pRenderWindow3D->Render();
+                          _pRenderWindow2D->Render();
+                          
+                               _pRenderer3D->AddActor(outlineActor));
+                               
+                                this->controls(0);
+                                
+                                 }
+                                 if ( _given_points == 1 )
+                                 this->controls(1);
+                                 
+                                  if ( _quant_shown )
+                                  this->update_blt_all_meassures();
+*/
+}
+
+
+void wxQuantificationWidget::Show_Max_Min_Diameters()
+{
+       
+/*
+slice = widgets(sclSlice);
+wxList *lmax = this->getMaximumLine();
+wxList *lmin = this->getMinimumLine();
+
+ if ( _pRenderer2D != 0 )
+       {
+       _pRenderer2D->RemoveActor(dMin_actor);
+       _pRenderer2D->RemoveActor(dMax_actor);
+       }
+       if ( dMax_actor != 0 )  dMax_actor->Delete();
+    if ( dMax_mapper != 0 )  dMax_mapper->Delete();
+    if ( dMax_line != 0 )  dMax_line->Delete();
+    if ( dMin_actor != 0 )  dMin_actor->Delete();
+    if ( dMin_mappe != 0 )  dMin_mappe->Delete();
+    if ( dMax_actor != 0 )  dMax_actor->Delete();
+    if ( dMin_line != 0 )  dMin_line->Delete();
+       
+        
+         dMax_line = vtkLineSource::New();
+         dMax_line->SetPoint1( lmax->Getfirst() , lmax->item(1), 0.0 );
+         dMax_line->SetPoint2( lmax->Item(2), lmax->Item(3), 0.0 );
+         
+          dMax_mapper =  vtkPolyDataMapper::New();
+          dMax_mapper->SetInput(dMax_line->GetOutput());
+          dMax_mapper->ImmediateModeRenderingOn();
+          
+               dMax_actor = vtkActor::New();
+               dMax_actor->SetMapper(dMax_mapper));
+               dMax_actor->GetProperty()->SetColor(1.00, 0.00, 0.00);
+               
+                dMin_line = vtkLineSource::New();
+                dMin_line->SetPoint1( lmin->GetFirst(), lmin->Item(1), 0.0);
+                dMin_line->SetPoint2( lmin->Item(2),    lmin->Item(3), 0.0);
+                
+                 dMin_mapper = vtkPolyDataMapper::New();
+                 dMin_mapper->SetInput(dMin_line->GetOutput());
+                 dMin_mapper->ImmediateModeRenderingOn();
+                 
+                  dMin_actor = vtkActor::New();
+                  dMin_actor->SetMapper(dMin_mapper);
+                  dMin_actor->GetProperty()->SetColor(0.00, 0.00, 1.00);
+                  
+                       array set arr( params(), 0 )
+                       if ( arr(e_debug_diameters) == 1 )
+                       {
+                       _prenderer2D->AddActor(dMax_actor);
+                       _prenderer2D->AddActor(dMin_actor);
+                       
+                        }
+                        
+                         //GetRenderWindow Render
+       */
+}
+
+
+
+int wxQuantificationWidget::Back( )
+{
+       int ret;
+       
+       ret = _shown;
+       _shown = 0;
+       return ret;
+}
+
+
+void wxQuantificationWidget::Set_plane_3D( double  x, double y )
+{
+/*
+_pRenderer3D->IsInViewport(0, 0);
+
+ busy hold
+ Update();
+  if ( _tmp_world_picker3D != 0)  tmp_world_picker3D->Delete();
+  
+   y =[ [ lindex [ $widgets(work3D) configure - height ] 4 ] - y - 1 ]
+   
+    _pickWPPos = Pick_point_local_actor $x $y _pRenderer3D _isoActor3D 0.001 ]
+       
+        _xc = _pickWPPos->item(1);
+        _yc = _pickWPPos->item(2);
+        _zc = _pickWPPos->item(3);
+        #Chercher le point de l'axe le plus proche au point choisi sur la surface
+        _indP = axisGrid3D->FindPoint(_xc, _yc, _zc);
+        _coordsP = axisGrid3D->GetPoint(_indP);
+        _xc =[lindex _coordsP 0]
+        _yc =[lindex _coordsP 1]
+        _zc =[lindex _coordsP 2]
+        
+         if ( _indP >= 0 )
+         {
+         $widgets(sclSlice) set $indP
+         this->Set_Plane();
+         }
+         
+          busy release .
+          update
+          
+               _pRenderWindow3D->Render();
+       */
+}
+
+
+/* EED
+void wxQuantificationWidget::Refresh_Quant( )
+{
+       if ( _real_first_point_quant != -1  &&  _real_last_point_quant  != -1  &&
+               _quant_sten->GetCount()  > 0) {
+               //_quant_sten = GetStenosisQuant();
+               //_sten  =  _quant_sten->Item(_widgets(sclSlice)->get() -
+               //                                       _real_first_point_quant  )
+       }
+       //this->update_blt_all_meassures();
+}
+*/
+
+
+void  wxQuantificationWidget::Point_Intensity(double x, double y)
+{
+       //y = [ lindex [ _pRenderWindow3D->Configure(height) ] ->Item(4) ] - y - 1;
+       
+       //if ( _tmp_picker != 0 )  _tmp_picker->Delete();
+       //_tmp_picker = vtkWorldPointPicker::New();
+       //_pickWP     = tmp_picker2D->Pick(x, y, 0) _pRenderer2D
+       //_pickWPPos  = tmp_picker2D->GetPickPosition();
+       
+       //x = [ lindex [ split [ lindex $pickWPPos 0 ] . ] 0 ]
+       //y = [ lindex [ split [ lindex $pickWPPos 1 ] . ] 0 ]
+       //y = GetCutSize()  - y - 1;
+       //_intensity = GetIntensityCut(x, y);
+}
+
+
+void wxQuantificationWidget::CleanContour()
+{
+/*  if ( _pRenderer2D != 0 ) {
+_pRenderer2D->RemoveActor(_debug2Actor3D);
+_pRenderer2D->RemoveActor(_debug1Actor3D);
+}
+if ( _debug2Actor3D != 0 )
+_debug2Actor3D->Delete();
+//if ( _connMapper3D != 0 )                    _connMapper3D->Delete();
+//if ( _isoStrips3D != 0 )                     _isoStrips3D->Delete();
+//if ( _cpd23D != 0 )                                  _cpd23D->Delete();
+//if ( _conn3D != 0 )                                  _conn3D->Delete();
+//if ( _cpd3D != 0 )                                   _cpd3D->Delete();
+if ( _debug1Actor3D != 0 )
+_debug1Actor3D->Delete();
+//if ( _cntVTKMapper3D != 0 )                  _cntVTKMapper3D->Delete();
+//if ( _cntVTK3D != 0 )                                _cntVTK3D->Delete();
+
+  if ( _pRenderer2D != 0 ) {
+  _pRenderer2D->RemoveActor(_aPolyLineActor2D);
+  _pRenderer2D->RemoveActor(_aPolygonActor2D);
+  }
+  
+       if ( _aPolyLineActor2D != 0 )
+    _aPolyLineActor2D->Delete();
+       //if ( _aPolyLineMapper2D != 0 )                _aPolyLineMapper2D->Delete();
+       //if ( _aPolyLineGrid2D != 0 )          _aPolyLineGrid2D->Delete();
+       //if ( _aPolyLine2D != 0 )                      _aPolyLine2D->Delete();
+       //if ( _PointsContour2D != 0 )          _PointsContour2D->Delete();
+       if ( _aPolygonActor2D != 0 )
+    _aPolygonActor2D->Delete();
+       //if ( _aPolygonMapper2D != 0 )         _aPolygonMapper2D->Delete();
+       //if ( _aPolygonGrid2D != 0 )                   _aPolygonGrid2D->Delete();
+       //if ( _aPolygon2D != 0 )                               _aPolygon2D->Delete();
+       
+         if ( _pRenderer2D != 0 ) {
+         _pRenderer2D->RemoveActor(_dMaxActor2D);
+         _pRenderer2D->RemoveActor(_dMinActor2D);
+         }
+         
+               if ( _dMaxActor2D != 0 )
+               _dMaxActor2D->Delete();
+               //if ( _dMaxMapper2D != 0 )                             _dMaxMapper2D->Delete();
+               //if ( _dMaxLine2D != 0 )                                       _dMaxLine2D->Delete();
+               if ( _dMinActor2D != 0 )
+               _dMinActor2D->Delete();
+               //if ( _dMinMapper2D != 0 )                             _dMinMapper2D->Delete();
+               //if ( _dMinLine2D != 0 )                                       _dMinLine2D->Delete();
+               
+                 _pRenderWindow3D->Render();
+       _pRenderWindow2D->Render();*/
+}
+
+
+//-----------------------------------------------------------------
+// Button
+void wxQuantificationWidget::Do_Quant()
+{
+/*
+if ( _quantifing == 0 )
+{
+this->Clean_Graph();
+this->Clean3D();
+
+ _quantifing = 1;
+  int f = ( _first_point_quant < _last_point_quant ) ? _first_point_quant : _last_point_quant;
+  int l = ( _first_point_quant > _last_point_quant ) ? _first_point_quant : _last_point_quant;
+  
+   this->Controls(2);
+   
+       _quant_x     = _list;
+       _quant_area  = _list;
+       _quant_peri  = _list;
+       _quant_darea = _list;
+       _quant_dperi = _list;
+       _quant_dmax  = _list;
+       _quant_dmin  = _list;
+       _quant_davg  = _list;
+       
+        for ( int i = f; i <= l; i++ )
+        lappend _quant_x->Append(i);
+        
+         update_blt_all_meassures();
+         
+          startQuant(f);
+          int  cont = f;
+          changeSliceAxis(f);
+          
+        wxMessageDialog* Q_recalculate = new wxDialog(this,
+               _str_recalculate_contours,
+               "Question",
+               wxYES_NO|wxNO_DEFAULT|wxCENTRE,
+               wxPoint(100, 100));
+               
+                int recal = 0;
+                if (Q_recalculate->ShowModal() ==  wxID_OK)
+                recal = 1;
+                
+                 delete Q_recalculate;
+                 
+                  this->Clean_Contour();
+                  $widgets(sclSlice) set cont ;
+                  planes_window::set_plane
+                  _quant_shown = 1;
+                  _params = GetContourParams();
+                  this->Generate_IsoContour( (GetCutSize()  / 2) (GetCutSize() / 2)
+                  (_params->Item(5) )
+                                                                  (_params->Item(6) )
+                                                                  while ( NextQuant(recal,IsoStrips3D) == 1 && cont <= l )
+                                                                  {
+                                                                  if ( _quantifing == 1 )
+                                                                  {
+                                                                  if ( _pRenderer2D != 0 )
+                                                                  {
+                                                                  _pRenderer2D->RemoveActor(_aPolygonActor2D);
+                                                                  _pRenderer2D->RemoveActor(_aPolyLineActor2D);
+                                                                  }
+                                                                  if ( _aPolygonActor2D != 0 )   _aPolygonActor2D->Delete();
+                                                                  if ( _aPolygonGrid2D != 0 )    _aPolygonGrid2D->Delete();
+                                                                  if ( _aPolyLineActor2D != 0 )  _aPolyLineActor2D->Delete();
+                                                                  if ( _aPolyLineMapper2D != 0 ) _aPolyLineMapper2D->Delete();
+                                                                  if ( _aPolyLineGrid2D != 0 )   _aPolyLineGrid2D->Delete();
+                                                                  if ( _aPolyLine2D != 0 )       _aPolyLine2D->Delete();
+                                                                  if ( _PointsContour2D != 0 )   _PointsContour2D->Delete();
+                                                                  if ( _aPolygon2D != 0 )        _aPolygon2D->Delete();
+                                                                  
+                                                                       _points = GetContourPoints();
+                                                                       _taille = _points->GetLength() / 2;
+                                                                       
+                                                                        aPolygon2D = vtkPolygon::New();
+                                                                        PointsContour2D = vtkPoints::New();
+                                                                        
+                                                                         aPolyLine2D = vtkPolyLine::New();
+                                                                         _PointIds = aPolyLine2D->GetPointIds();
+                                                                         _PointIds->SetNumberOfIds(_taille);
+                                                                         _PointIdsPolygon = aPolygon2D->GetPointIds();
+                                                                         _PointIdsPolygon->SetNumberOfIds( _taille);
+                                                                         
+                                                                          for ( int i =0; i < _taille ; i++ )
+                                                                          {
+                                                                          _PointIds->SetId(i, i);
+                                                                          _PointIdsPolygon->SetId(i, i);
+                                                                          PointsContour2D->InsertNextPoint( _points->Item( i * 2 ) + 0 ,
+                                                                          _points->Item(i * 2) + 1, 0);
+                                                                          }
+                                                                          
+                                                                               aPolyLineGrid2D = vtkUnstructuredGrid::New();
+                                                                               aPolyLineGrid2D->Allocate(1, 1);
+                                                                               _param1 = aPolyLine2D->GetCellType();
+                                                                               _param2 = aPolyLine2D->GetPointIds();
+                                                                               aPolyLineGrid2D->InsertNextCell(_param1, _param2);
+                                                                               aPolyLineGrid2D->SetPoints(PointsContour2D)
+                                                                               
+                                                                                aPolyLineMapper2D = vtkDataSetMapper::New();
+                                                                                aPolyLineMapper2D->SetInput(aPolyLineGrid2D);
+                                                                                
+                                                                                 aPolyLineActor2D = vtkActor::New();
+                                                                                 aPolyLineActor2D->SetMapper(aPolyLineMapper2D);
+                                                                                 _Property1 = aPolyLineActor2D->GetProperty();
+                                                                                 _Property1->SetColor(0, 1, 0);
+                                                                                 _Property1->SetLineWidth(2);
+                                                                                 _Property1->SetPointSize(2);
+                                                                                 _Property1->BackfaceCullingOff();
+                                                                                 
+                                                                                  _pRenderer2D->AddActor(aPolyLineActor2D);
+                                                                                  
+                                                                                       aPolygonGrid2D = vtkUnstructuredGrid::New();
+                                                                                       aPolygonGri2D->Allocate(1, 1);
+                                                                                       _param1 = aPolygon2D->GetCellType();
+                                                                                       _param2 = aPolygon2D->GetPointIds();
+                                                                                       aPolygonGrid2D->InsertNextCell(_param1, _param2);
+                                                                                       aPolygonGrid2D->SetPoints(PointsContour2D);
+                                                                                       
+                                                                                        aPolygonMapper2D = vtkDataSetMapper::New();
+                                                                                        aPolygonMapper2->SetInput(aPolygonGrid2D);
+                                                                                        
+                                                                                         aPolygonActor2D = vtkActor::New();
+                                                                                         aPolygonActor2D->SetMapper(aPolygonMapper2D);
+                                                                                         _Property1 = aPolygonActor2D->GetProperty();
+                                                                                         _Property1->SetColor(0, 1, 0);
+                                                                                         _Property1->SetLineWidth(2);
+                                                                                         _Property1->SetPointSize(2);
+                                                                                         _Property1->BackfaceCullingOff();
+                                                                                         
+                                                                                          int arr[] = Params(0);
+                                                                                          if ( arr(e_debug_fill_area) == 1 )
+                                                                                          _pRenderer2D->AddActor(aPolygonActor2D)
+                                                                                          
+                                                                                               this->Show_Max_Min_Diameters();
+                                                                                               
+                                                                                                _pRenderWindow2D->Render();
+                                                                                                
+                                                                                                 this->Draw3D_Contour(cont);
+                                                                                                 
+                                                                                                  _values = GetValues(cont);
+                                                                                                  
+                                                                                                       _quant_area->Append(_values->Item(1));
+                                                                                                       _quant_peri->Append(_values->Item(2));
+                                                                                                       _quant_darea->Append(_values->Item(3));
+                                                                                                       _quant_dperi->Append(_values->Item(4));
+                                                                                                       _quant_dmax->Append(_values->Item(5));
+                                                                                                       _quant_dmin->Append(_values->Item(6));
+                                                                                                       _quant_davg->Append(_values->Item(7));
+                                                                                                       
+                                                                                                        this->update_blt_all_meassures();
+                                                                                                        
+                                                                                                         _area  = _values->Item(1);
+                                                                                                         _peri  = _values->Item(2);
+                                                                                                         _darea = _values->Item(3);
+                                                                                                         _dperi = _values->Item(4);
+                                                                                                         _dmax  = _values->Item(5);
+                                                                                                         _dmin  = _values->Item(6);
+                                                                                                         _davg  = _values->Item(7);
+                                                                                                         
+                                                                                                          cont++;
+                                                                                                          
+                                                                                                               this->Clean_contour();
+                                                                                                               
+                                                                                                                $widgets(sclSlice) set $cont;
+                                                                                                                this->Set_Plane;
+                                                                                                                _params = GetContourParams();
+                                                                                                                this->Generate_IsoContour [  [ GetCutSize() / 2 ]
+                                                                                                                [ GetCutSize() / 2 ]
+                                                                                                                [ _params->Item(5) ]
+                                                                                                                [ _params->Item(6) ];
+                                                                                                                update();
+                                                                                                                
+                                                                                                                 }
+                                                                                                                 else if ( _quantifing == 2 )
+                                                                                                                 {
+                                                                                                                 while ( _quantifing == 2 )
+                                                                                                                 update();
+                                                                                                                 }
+                                                                                                                 else if ( _quantifing == 3 )
+                                                                                                                 {
+                                                                                                                 $widgets(btnPause) configure -text $string_table::str_pause
+                                                                                                                 break;
+                                                                                                                 }
+                                                                                                                 
+                                                                                                                  }
+                                                                                                                  FinishQuant();
+                                                                                                                  this->Clean_contour();
+                                                                                                                  _quantifing = 0;
+                                                                                                                  
+                                                                                                                       }
+                                                                                                                       else
+                                                                                                                       {
+                                                                                                                       _quantifing = 2;
+                                                                                                                       wxMessageDialog* Q_stop = new wxDialog(this,
+                                                                                                                       _str_stop_quantification,
+                                                                                                                       "Question",
+                                                                                                                       wxYES_NO|wxNO_DEFAULT|wxCENTRE,
+                                                                                                                       wxPoint(100, 100));
+                                                                                                                       
+                                                                                                                        _quantifing = 1;
+                                                                                                                        if (Q_stop->ShowModal() ==  wxID_OK)
+                                                                                                                        _quantifing = 3;
+                                                                                                                        delete Q_stop;
+                                                                                                                        }
+*/
+}
+
+
+//-----------------------------------------------------------------
+void wxQuantificationWidget::OnContour_BT(wxCommandEvent& event){
+       int slice=_sl_Slice->GetValue();
+       _3DWorld->Set3DContourActor( slice , _mar->_experiment->get3Dcontour(slice) , _cb_VisibleRings->GetValue() ,0 );
+}
+//-----------------------------------------------------------------
+void wxQuantificationWidget::OnClean_BT(wxCommandEvent& event){
+       int slice=_sl_Slice->GetValue();
+       _3DWorld->Erase3DContourActor( slice );
+}
+
+//-----------------------------------------------------------------
+void wxQuantificationWidget::OnCleanAll_BT(wxCommandEvent& event){
+       marDictionary marDict;
+       char tmp[256];
+
+       wxMessageDialog *wxdiag;
+       strcpy( tmp , marDict.GetString(870) ); strcat(tmp,"\n"); strcat(tmp,marDict.GetString(875));
+       wxdiag= new wxMessageDialog(this, wxString(tmp ,wxConvUTF8), wxString(marDict.GetString(865), wxConvUTF8) , wxOK | wxCANCEL);//"This option erase all 3D contours.\n Do you want to continue?","Alert"
+    if ( wxdiag->ShowModal() == wxID_OK ) {
+               _3DWorld->InitListContourActor( 0, _mar->_experiment->getNumberOfSlices() );
+       }            
+       wxdiag->Destroy();
+}
+
+//-----------------------------------------------------------------
+void wxQuantificationWidget::OnSaveContours3D_BT(wxCommandEvent& event)
+{
+       
+       wxFileDialog dialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.maracas_contour3D"), wxSAVE );
+       if (dialog.ShowModal() == wxID_OK)
+       {               
+               std::string pathfilename(  (const char *)(dialog.GetPath().mb_str()) );
+//             std::string directory(  (const char *)(dialog.GetDirectory().mb_str()) );
+//             std::string filename(  (const char *)(dialog.GetFilename().mb_str())  );
+//             std::string pathfilename        = directory + "/" + filename;
+//             printf("EED> wxQuantificationWidget::OnSaveContours3D_BT  > %s\n",pathfilename.c_str());
+               FILE *ff;
+               ff=fopen(pathfilename.c_str(), "w+");
+                 _mar->_experiment->getAxis()->SaveExisting3DContours(ff);
+               fclose(ff);
+       }
+       
+}
+
+// PS -> void wxQuantificationWidget::OnContour_BT(wxCommandEvent& event)
+// PS -> {
+// PS -> 
+// PS -> 
+// PS ->   int index;
+// PS -> 
+// PS ->   vtkPolyData* cnt;
+// PS ->   //marContour* cnt;
+// PS -> //  vtkUnstructuredGrid* allData;
+// PS -> 
+// PS ->   index = _sl_Slice->GetValue( );
+// PS -> //  this->CleanContour( );
+// PS ->   cnt = _mar->_experiment->generateContour(index, -1, -1, NULL);
+// PS -> //    allData = cnt->Draw( );
+// PS -> //  _2DWorld->SetContour( allData );
+// PS ->   _2DWorld->SetContour( cnt );
+// PS -> 
+// PS ->   _first_quant = 0;
+// PS -> 
+// PS ->   /*planes_window::show_max_min_diameters
+// PS -> 
+// PS ->       [ $widgets(image2D) GetRenderWindow ] Render
+// PS -> 
+// PS ->       planes_window::draw3D_contour $index
+// PS -> 
+// PS ->       set quant_data [ getValues_dll $index ]
+// PS ->       set actual_area  [ change_float_precision [ lindex $quant_data 0 ] 2 ]
+// PS ->       set actual_peri  [ change_float_precision [ lindex $quant_data 1 ] 2 ]
+// PS ->       set actual_darea [ change_float_precision [ lindex $quant_data 2 ] 2 ]
+// PS ->       set actual_dperi [ change_float_precision [ lindex $quant_data 3 ] 2 ]
+// PS ->       set actual_dmax  [ change_float_precision [ lindex $quant_data 4 ] 2 ]
+// PS ->       set actual_dmin  [ change_float_precision [ lindex $quant_data 5 ] 2 ]
+// PS ->       set actual_davg  [ change_float_precision [ lindex $quant_data 6 ] 2 ]
+// PS ->       set i [ lsearch -exact $actual_quant_x $index ]
+// PS ->       if { $i != -1 } {
+// PS -> 
+// PS ->               set actual_quant_area  [ lreplace $actual_quant_area  $i $i $actual_area ]
+// PS ->               set actual_quant_peri  [ lreplace $actual_quant_peri  $i $i $actual_peri ]
+// PS ->               set actual_quant_darea [ lreplace $actual_quant_darea $i $i $actual_darea ]
+// PS ->               set actual_quant_dperi [ lreplace $actual_quant_dperi $i $i $actual_dperi ]
+// PS ->               set actual_quant_dmax  [ lreplace $actual_quant_dmax  $i $i $actual_dmax ]
+// PS ->               set actual_quant_dmin  [ lreplace $actual_quant_dmin  $i $i $actual_dmin ]
+// PS ->               set actual_quant_davg  [ lreplace $actual_quant_davg  $i $i $actual_davg ]
+// PS ->               if { [ llength $actual_quant_sten ] > 0 } {
+// PS -> 
+// PS ->                       set actual_quant_sten [ getStenosisQuant_dll ]
+// PS ->                       set actual_sten [ change_float_precision [ lindex $actual_quant_sten [ expr $index - $real_first_point_quant ] ] 2 ]
+// PS -> 
+// PS ->               }
+// PS -> 
+// PS ->       }
+// PS ->       planes_window::update_blt_all_meassures*/
+// PS -> }
+
+
+// PS -> void wxQuantificationWidget::OnClean_BT(wxCommandEvent& event)
+// PS -> {
+// PS -> /*  this->CleanContour();*/
+// PS -> }
+
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::DetectHealthySickSlice( bool minSurf , bool maxSurf ){    
+       wxBusyCursor wait;
+       double          stenosis;
+       double          areaB;
+       int                     iSlice;
+       int                     startslice;
+       int                     endslice;
+       double          maxStenosis                     =       -9999999;
+       double          maxArea                         =       -9999999;
+       int                     sickSlice                       =       0;
+       int                     healthySlice            =       0;
+       int                     sizeHealthyRegion       =       GetSizeHealthyRegion();
+       int                     analysisTypeStenosis=   GetAnalysisTypeStenosis();
+
+
+//FILE *ff;
+//ff = fopen("c:/temp/MaracasStadistics.txt","a+");
+//long int endtime = clock();
+//double sg = (double)(endtime-startTimeRI) / (double)CLK_TCK;
+//fprintf(ff,"EED %p wxQuantificationWidget::DetectHealthySickSlice > RI_t = %f \n",this,sg);
+//fclose(ff);
+
+
+//startTimeCalcule = clock();
+
+       GetSliceLimites(0,startslice,endslice);
+
+    if (startslice>endslice){
+               int temp=endslice;
+               endslice=startslice;
+               startslice=temp;
+       }
+
+       int backSlice;
+       if (minSurf==false) { backSlice = _sl_Slice->GetValue(); }
+
+       for (iSlice=startslice; iSlice<=endslice;iSlice++){
+
+               if (minSurf==true){
+                       // this is equal to the minimum surface/diameter
+                       if (analysisTypeStenosis==1 ){ stenosis = GetStenosisDiameter(iSlice);  }
+                       if (analysisTypeStenosis==2 ){ stenosis = GetStenosisArea(iSlice);              }
+               }
+
+               if (maxSurf==true){
+                       areaB = _mar->_experiment->getAverageArea(iSlice-sizeHealthyRegion,iSlice+sizeHealthyRegion);
+               }
+
+               if ((stenosis>maxStenosis) &&(minSurf==true)){
+                       maxStenosis=stenosis;
+                       sickSlice=iSlice;
+               }
+               if ((areaB>maxArea) && (maxSurf==true)){
+                       maxArea=areaB;
+                       healthySlice=iSlice;
+               }
+               MoveSlider( iSlice );
+               _sl_Slice->SetValue( iSlice );
+       }
+
+//ff = fopen("c:/temp/MaracasStadistics.txt","a+");
+//endtime = clock();
+//sg = (double)(endtime-startTimeCalcule) / (double)CLK_TCK;
+//fprintf(ff,"EED %p wxQuantificationWidget::DetectHealthySickSlice > t = %f   ( %d , %d , %d )\n",this,sg,startslice,endslice, endslice-startslice);
+//fclose(ff);
+
+       if (minSurf==true){
+               MoveSlider( sickSlice );
+               _sl_Slice->SetValue( sickSlice );
+       }
+
+       if (maxSurf==true){
+               MoveSlider( healthySlice );
+               _sl_Slice->SetValue( healthySlice );
+       }
+
+}
+
+
+/*EED Borrame 
+//------------------------------------------------------------------------
+void wxQuantificationWidget::AutoQuantification(){     
+       int             analysisTypeStenosis    =       GetAnalysisTypeStenosis();
+       int             slice                                   =       _sl_Slice->GetValue();
+       int             healthySlice                    =       _mar->_experiment->getAxis()->getHealthySlice( );
+       int             healthySliceStart               =       _mar->_experiment->getAxis()->getHealthySliceStart( );
+       int             healthySliceEnd                 =       _mar->_experiment->getAxis()->getHealthySliceEnd( );
+       double  maxStenosis                             =       -9999999;
+       double  ste                                             =       0;
+
+       if (healthySlice !=-1 ) {
+               int iSickSlice,startslice,endslice;
+               GetSliceLimites(0,startslice,endslice);
+           if (startslice>endslice){
+                       int temp=endslice;
+                       endslice=startslice;
+                       startslice=temp;
+               }
+               for (iSickSlice=startslice; iSickSlice<=endslice;iSickSlice++){
+                       if (analysisTypeStenosis==1 ){ ste = GetStenosisDiameter(iSickSlice);   }
+                       if (analysisTypeStenosis==2 ){ ste = GetStenosisArea(iSickSlice);               }
+                       if (ste>maxStenosis){
+                               maxStenosis=ste;
+                               slice=iSickSlice;
+                       }
+                       MoveSlider( iSickSlice );
+                       _sl_Slice->SetValue( iSickSlice );
+               }
+               MoveSlider( slice );
+               _sl_Slice->SetValue( slice );
+       } else {
+               wxMessageBox( "Set an healthy slice.\n \n ","DxMM : MARACAS", wxOK | wxCENTRE | wxICON_INFORMATION, this);
+       }
+}
+*/
+
+//------------------------------------------------------------------------
+int wxQuantificationWidget::GetHealthySlice(){ 
+       return _mar->_experiment->getAxis()->getHealthySlice( );
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget::SetHealthySlice(int healthySlice){        
+       if (healthySlice==-1) {
+               healthySlice=_sl_Slice->GetValue();
+       }
+       int sizeHealthyRegion   = GetSizeHealthyRegion();
+       int maxSlider                   = GetMaxActualSlice();
+       int healthySliceStart   = healthySlice - sizeHealthyRegion;
+       int healthySliceEnd             = healthySlice + sizeHealthyRegion;
+       if (healthySliceStart < 0)         { healthySliceStart = 0;                     }
+       if (healthySliceEnd   < 0)         { healthySliceEnd   = 0;                     }
+       if (healthySliceStart > maxSlider) { healthySliceStart = maxSlider; }
+       if (healthySliceEnd   > maxSlider) { healthySliceEnd   = maxSlider; }
+       _mar->_experiment->getAxis()->setHealthySlice( healthySliceStart, healthySlice , healthySliceEnd);
+
+       _3DWorld->Set3DHealthySliceActor(  );
+       _3DWorld->Show3DHealthySliceActor();
+       _cb_HealthySlice->SetValue(true);       
+       _3DWorld->InitListContourActor( 1, _mar->_experiment->getNumberOfSlices() );
+       int iHealthySlice;
+       for ( iHealthySlice=healthySliceStart ; iHealthySlice<=healthySliceEnd ; iHealthySlice++){
+               _3DWorld->Set3DContourActor( iHealthySlice , _mar->_experiment->get3Dcontour(iHealthySlice) , true ,1);
+       }
+       showVariables();
+}
+
+/* EED borrame
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnHealthySlice_BT(wxCommandEvent& event){ 
+       SetHealthySlice( _sl_Slice->GetValue() );
+}
+*/
+
+// PS -> void wxQuantificationWidget::OnCalculated_BT(wxCommandEvent& event)
+// PS -> {
+// PS ->     /*
+// PS ->     _index = ( $widgets(sclSlice) get )
+// PS -> 
+// PS ->     this->Clean_Contour();
+// PS ->       _points = GetContourPoints();
+// PS ->       _taille = _points->Item(2) / 2;
+// PS -> 
+// PS ->     if ( _taille > 0 )
+// PS ->       {
+// PS ->         aPolygon2D = vtkPolygon::New();
+// PS ->         PointsContour2D = vtkPoints::New();
+// PS ->               aPolyLine2D = vtkPolyLine::New();
+// PS -> 
+// PS ->               _PointIds = aPolyLine2D->GetPointIds();
+// PS ->               _PointIds->SetNumberOfIds(_taille);
+// PS ->         _PointIdsPolygon = aPolygon2D->GetPointIds();
+// PS ->               _PointIdsPolygon->SetNumberOfIds(_taille);
+// PS -> 
+// PS ->         for (int i=0; i< _taille ; i++ )
+// PS ->               {
+// PS ->             _PointIds->SetId(i, i);
+// PS ->             _PointIdsPolygon->SetId(i, i);
+// PS ->             PointsContour2D->InsertNextPoint( _points->Item(i * 2  + 0),
+// PS ->                                  _points->Item(i * 2  + 1),  0 );
+// PS -> 
+// PS ->         }
+// PS -> 
+// PS ->         aPolyLineGrid2D = vtkUnstructuredGrid::New();
+// PS ->               aPolyLineGrid2D->Allocate(1, 1);
+// PS ->         _param1 = aPolyLine2D->GetCellType();
+// PS ->         _param2 = aPolyLine2D->GetPointIds();
+// PS ->         aPolyLineGrid2D->InsertNextCell(_param1, _param2);
+// PS ->         aPolyLineGrid2D->SetPoints(PointsContour2D);
+// PS -> 
+// PS ->               aPolyLineMapper2D = vtkDataSetMapper::New();
+// PS ->               aPolyLineMapper2D->SetInput(aPolyLineGrid2D);
+// PS -> 
+// PS ->               aPolyLineActor2D = vtkActor::New();
+// PS ->               aPolyLineActor2D->SetMapper(aPolyLineMapper2D);
+// PS ->         _Property1 = aPolyLineActor2D->GetProperty();
+// PS ->               _Property1->SetColor(0, 1, 0);
+// PS ->         _Property1->SetLineWidth(2);
+// PS ->         _Property1->SetPointSize(2);
+// PS ->         _Property1->BackfaceCullingOff();
+// PS -> 
+// PS ->         _pRenderer2D->AddActor(aPolyLineActor2D);
+// PS -> 
+// PS ->               aPolygonGrid2D = vtkUnstructuredGrid::New();
+// PS ->               aPolygonGrid2D->Allocate(1, 1);
+// PS ->         _param1 = aPolygon2D->GetCellType();
+// PS ->         _param2 = aPolygon2D->GetPointIds();
+// PS ->         aPolygonGrid2D->InsertNextCell(_param1, _param2);
+// PS ->         aPolygonGrid2D->SetPoints(PointsContour2D);
+// PS -> 
+// PS ->               aPolygonMapper2D = vtkDataSetMapper::New();
+// PS ->               aPolygonMapper2D->SetInput(aPolygonGrid2D);
+// PS -> 
+// PS ->               aPolygonActor2D = vtkActor::New();
+// PS ->           aPolygonActor2D->SetMapper(aPolygonMapper2D);
+// PS ->               _Property1 = aPolygonActor2D->GetProperty();
+// PS ->               _Property1->SetColor(0, 1, 0);
+// PS ->         _Property1->SetLineWidth(2);
+// PS ->         _Property1->SetPointSize(2);
+// PS ->         _Property1->BackfaceCullingOff();
+// PS -> 
+// PS ->         int arr[] = this->Params(0);
+// PS ->               if ( arr(_e_debug_fill_area) == 1 )
+// PS ->                       _pRenderer2D->AddActor(aPolygonActor2D);
+// PS -> 
+// PS ->         _pRenderWindow3D->Render();
+// PS ->         _pRenderWindow2D->Render();
+// PS -> 
+// PS ->     }
+// PS ->  */
+// PS -> }
+
+
+
+// PS -> void wxQuantificationWidget::OnPause_BT(wxCommandEvent& event)
+// PS -> {
+// PS ->   if ( _quantifing == 1 ) {
+// PS ->     _quantifing = 2;
+// PS ->     _bt_Pause->SetLabel("Play");
+// PS ->     _mar->_experiment->backQuant();
+// PS ->   }
+// PS ->   else if ( _quantifing == 2 )
+// PS ->   {
+// PS ->     _quantifing = 1;
+// PS ->     _bt_Pause->SetLabel("Pause");
+// PS ->   }
+// PS -> }
+
+
+// PS -> void wxQuantificationWidget::OnDelete_BT(wxCommandEvent& event)
+// PS -> {
+// PS ->       /*
+// PS ->       wxMessageDialog* Q_erase = new wxDialog(this,
+// PS ->          _str_erase_quant_q,
+// PS ->          "Question",
+// PS ->          wxYES_NO|wxNO_DEFAULT|wxCENTRE,
+// PS ->          wxPoint(100, 100));
+// PS -> 
+// PS ->    if (Q_erase->ShowModal() ==  wxID_OK)
+// PS ->    {
+// PS ->       _first_quant = 1;
+// PS ->       _real_first_point_quant = -1;
+// PS ->       _real_last_point_quant = -1;
+// PS ->       this->controls(1);
+// PS ->       _quant_shown = false;
+// PS -> 
+// PS ->         this->clean_graph();
+// PS -> 
+// PS ->         if (_pRenderer3D != 0) _pRenderer3D->RemoveActor(hs_actor);
+// PS ->         if (_hs_actor != 0)   hs_actor->delete();
+// PS ->         if (_hs_mapper != 0)  hs_mapper->delete();
+// PS ->       if (_hs_grid != 0)   hs_grid->delete();
+// PS ->       if (_hs_points != 0)   hs_points->delete();
+// PS ->       if (_hs_poly_line != 0)   hs_poly_line->delete();
+// PS -> 
+// PS ->      foreach i $rings_index
+// PS ->               {
+// PS -> 
+// PS ->             catch { renderer_$widgets(work3D) RemoveActor cont3DActor_{$widgets(work3D)}_{$i} }
+// PS ->             catch { cont3DActor_{$widgets(work3D)}_{$i}    Delete }
+// PS ->             catch { cont3DMapper_{$widgets(work3D)}_{$i}   Delete }
+// PS ->             catch { cont3DGrid_{$widgets(work3D)}_{$i}     Delete }
+// PS ->             catch { cont3DPolyLine_{$widgets(work3D)}_{$i} Delete }
+// PS ->             catch { cont3DPoints_{$widgets(work3D)}_{$i}   Delete }
+// PS -> 
+// PS ->         }
+// PS ->       _rings_index = _list;
+// PS ->         _quant_x     = _list;
+// PS ->       _quant_area  = _list;
+// PS ->       _quant_peri  = _list;
+// PS ->       _quant_darea = _list;
+// PS ->       _quant_dperi = _list;
+// PS ->       _quant_dmax  = _list;
+// PS ->       _quant_dmin  = _list;
+// PS ->       _quant_davg  = _list;
+// PS ->       _quant_sten  = _list;
+// PS -> 
+// PS ->       _area = 0.00;
+// PS ->       _peri = 0.00;
+// PS ->       _darea = 0.00;
+// PS ->       _dperi = 0.00;
+// PS ->       _dmax  = 0.00;
+// PS ->       _dmin  = 0.00;
+// PS ->       _davg  = 0.00;
+// PS ->       _sten  = 0.00;
+// PS ->       _shown = false;
+// PS -> 
+// PS ->       _pRenderWindow3D->Render();
+// PS ->         this->clean_contour();
+// PS -> 
+// PS ->       wxMessageDialog* Q_extract = new wxDialog(this,
+// PS ->                       _str_erase_extracted_contours,
+// PS ->                       "Question",
+// PS ->                       wxYES_NO|wxNO_DEFAULT|wxCENTRE,
+// PS ->                       wxPoint(100, 100));
+// PS -> 
+// PS ->       if (Q_extract->ShowModal() ==  wxID_OK)
+// PS ->                this->cleanData();
+// PS -> 
+// PS ->         delete Q_extract;
+// PS -> 
+// PS ->    }
+// PS ->    delete Q_erase;
+// PS ->    */
+// PS -> }
+
+
+
+
+// PS -> void wxQuantificationWidget::OnSetPoint_BT(wxCommandEvent& event)
+// PS -> {
+// PS ->     //set slice = [ $widgets(sclSlice) get ]
+// PS ->     //this->select_axis_point( 0, 0, $slice
+// PS -> }
+
+
+
+//--------------------------------------------------------------------
+// CheckBox
+void wxQuantificationWidget::OnHealthySlice_CB(wxCommandEvent& event)
+{
+       // Visible
+       /*  if ( _show_hs == 1 ) {
+    if ( _pRenderer3D != 0 )
+       _pRenderer3D->AddActor(_hsActor3D);
+       }
+       // Hide
+       else {
+    if ( _pRenderer3D != 0 )
+       _pRenderer3D->RemoveActor(_hsActor3D);
+       }
+       
+       _pRenderWindow3D->Render();  // Maj*/
+
+       
+       int healthySlice = _mar->_experiment->getAxis( )->getHealthySlice( );
+       if (healthySlice!=-1) {
+               if ( _cb_HealthySlice->GetValue() )
+                       _3DWorld->Show3DHealthySliceActor();
+               else
+                       _3DWorld->Hide3DHealthySliceActor();
+       }
+}
+
+
+//--------------------------------------------------------------------
+void wxQuantificationWidget::OnVisibleRing_CB(wxCommandEvent& event){
+       if ( _cb_VisibleRings->GetValue() ){
+               _3DWorld->Show3DContourActor();
+               _2DWorld->Show2DContourDiameters();
+               RefreshAxis();
+       } else {
+               _3DWorld->Hide3DContourActor();
+               _2DWorld->Hide2DContourDiameters();
+       }
+
+       // GetNumberOfAxisPoints()
+       /*  int noap = _mar->_experiment->getNumberOfAxes();
+       for (int i= 0; i < noap;  i++ ) {
+    if ( _show_rings == 0 ) {
+       if ( _pRenderer3D != 0 )
+       _pRenderer3D->RemoveActor(_contActor3D[i]);
+    }
+    else  {
+       if ( _pRenderer3D != 0 )
+       _pRenderer3D->AddActor(_contActor3D[i]);
+    }
+       }
+       _pRenderWindow3D->Render(); // Maj*/
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::OnPerpendicular_CB(wxCommandEvent& event)
+{
+       if ( _cb_Perpendicular->GetValue() )
+               _3DWorld->Show3DSliceActor();
+       else
+               _3DWorld->Hide3DSliceActor();
+}
+//--------------------------------------------------------------------
+// RadioButton
+void wxQuantificationWidget::OnGreyScale_RB(wxCommandEvent& event){
+       if ( _rb_GreyScale->GetValue() ){
+               _3DWorld->SetBWLookUp();
+       }
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::OnColor_RB(wxCommandEvent& event){
+       if ( _rb_Color->GetValue() ){
+               _3DWorld->SetColorLookUp();
+       }
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::CallBackOnLeftDClick( wxMouseEvent& event ){
+
+       double pp[3], cp[3];
+       _3DWorld->GetLast3DClickPoint(pp,cp);
+
+       int i,iback,maxPoints;
+       double *c, cc[3];
+       double dist,distMin=-1;
+       iback=-1;
+           
+       marAxis *maraxis = _mar->_experiment->getAxis( );
+       maxPoints = maraxis->getNumberOfSplinePoints();
+       for ( i=0 ; i<maxPoints ; i++ ){
+               c = maraxis->getSplinePoint(i); 
+               cc[0]=c[0]-pp[0];
+               cc[1]=c[1]-pp[1];
+               cc[2]=c[2]-pp[2];
+               dist=sqrt( cc[0]*cc[0] + cc[1]*cc[1] + cc[2]*cc[2] );
+               if ((distMin==-1) || (dist<distMin)) {
+                       iback=i;
+                       distMin=dist;
+               }
+       }
+       _sl_Slice->SetValue(iback);
+       MoveSlider(iback);
+
+}
+
+//--------------------------------------------------------------------
+void wxQuantificationWidget::CallBackOnMouseWheel( wxMouseEvent& event ){
+       int slice=_sl_Slice->GetValue();
+       if (event.GetWheelRotation()>0){ slice++; }
+       if (event.GetWheelRotation()<0){ slice--; }
+    if (slice < _sl_Slice->GetMin() ) { slice=_sl_Slice->GetMin(); }
+    if (slice > _sl_Slice->GetMax() ) { slice=_sl_Slice->GetMax(); }
+    _sl_Slice->SetValue(slice);
+       MoveSlider(slice);
+}
+//--------------------------------------------------------------------
+int wxQuantificationWidget::GetActualSlice(){
+       return _sl_Slice->GetValue();
+}
+//--------------------------------------------------------------------
+int wxQuantificationWidget::GetMaxActualSlice(){
+       return _sl_Slice->GetMax();
+}
+//--------------------------------------------------------------------
+int  wxQuantificationWidget::GetSizeHealthyRegion(){
+       return _sizeHealthyRegion;
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetSizeHealthyRegion(int size){
+       _sizeHealthyRegion = size;
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::GetHealthySliceRange(int &healthySliceStart,int &healthySliceEnd){
+       healthySliceStart       = _mar->_experiment->getAxis()->getHealthySliceStart( );
+       healthySliceEnd         = _mar->_experiment->getAxis()->getHealthySliceEnd( );
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Set3DRegionSliceActor( int type, int k1,int k2 ){
+       _3DWorld->Set3DRegionSliceActor(type,k1,k2);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Set3DStartRegionSliceActor( int type, int k){
+       _3DWorld->Set3DStartRegionSliceActor(type,k);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Set3DEndRegionSliceActor( int type, int k){
+       _3DWorld->Set3DEndRegionSliceActor(type,k);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Show3DRegionSliceActor( int type ){
+       _3DWorld->Show3DRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Show3DStartRegionSliceActor( int type ){
+       _3DWorld->Show3DStartRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Show3DEndRegionSliceActor( int type ){
+       _3DWorld->Show3DEndRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Hide3DRegionSliceActor( int type ){
+       _3DWorld->Hide3DRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Hide3DStartRegionSliceActor( int type ){
+       _3DWorld->Hide3DStartRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::Hide3DEndRegionSliceActor( int type ){
+       _3DWorld->Hide3DEndRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::GetSliceLimites(int type, int &sliceStart, int &sliceEnd){
+       _3DWorld->GetSliceLimites(type,sliceStart,sliceEnd);
+}
+//--------------------------------------------------------------------
+int wxQuantificationWidget::GetAnalysisTypeStenosis(){
+       return _3DWorld->GetAnalysisTypeStenosis();
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetAnalysisTypeStenosis(int analysisTypeStenosis){
+       _3DWorld->SetAnalysisTypeStenosis(analysisTypeStenosis);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetManualContour_2DWorld(bool ok){
+
+       if (ok==false){ 
+               _2DWorld->SetState(1);
+               _2DWorld->EraseManualContour();
+       }
+       if (ok==true){  
+               _2DWorld->SetState(2);
+               _2DWorld->CreateNewManualContour();
+               _2DWorld->Render();
+
+       }
+
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetManualContour_AddPoint_2DWorld(){
+       _bak_ActualSlice        = _sl_Slice->GetValue();
+       _2DWorld->Hide2DContourDiameters();
+       _mar->_experiment->getAxis()->EraseContour(_bak_ActualSlice);
+       _3DWorld->Erase3DContourActor( _bak_ActualSlice );
+
+       _2DWorld->SetStateManualContour(0);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetManualContour_InsertPoint_2DWorld(){
+       _2DWorld->SetStateManualContour(2);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetManualContour_ErasePoint_2DWorld(){
+       _2DWorld->SetStateManualContour(3);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetManualContour_MovePoint_2DWorld(){
+       _2DWorld->SetStateManualContour(4);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidget::SetManualContour_ReplaceContour(){
+       if (_bak_ActualSlice!=-1){
+               int size                = _2DWorld->GetNumberOfPointsSplineManualContour();
+               double *vx              = _2DWorld->GetVectorPointsXManualContour();
+               double *vy              = _2DWorld->GetVectorPointsYManualContour();
+               _mar->_experiment->getAxis()->replaceContour2D(_bak_ActualSlice,size,vx,vy);
+               free(vx);
+               free(vy);
+               RefreshAxis();
+               _bak_ActualSlice=-1;
+       }
+}
+//------------------------------------------------------------------------
+kVolume* wxQuantificationWidget::GetVolumeAxisExtended(int wz1,int wz2)
+{
+       // Create Volume
+       vtkImageData *imagedata;
+       imagedata=_mar->_experiment->getSliceImage(wz1);
+       int dims[3];
+       imagedata->GetDimensions (dims);
+       int wx=dims[0];
+       int wy=dims[1];
+       int wz  = wz2-wz1+1;
+       kVolume *kvol =new kVolume( kVolume::USHORT, wx, wy, wz,1, 1, 1, malloc(sizeof(unsigned short)*wx*wy*wz ) );
+       vtkImageData *vol = kvol->castVtk();
+
+       // Fill Volume
+       int i;
+       for (i=wz1;i<=wz2;i++)
+       {
+               // GetImage
+               imagedata=_mar->_experiment->getSliceImage(i);
+
+               // InsertImage
+            void *p_imagedata  = imagedata->GetScalarPointer(0,0,0);
+                void *p_vol            = vol->GetScalarPointer(0,0,i-wz1);
+         memcpy( p_vol, p_imagedata , sizeof(unsigned short)*dims[0]*dims[1] );
+       }
+       return kvol;
+}
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnContourWall()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnContourLumen()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnContourHypo()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnContourCalc()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnReplaceContourWall()
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnReplaceContourLumen()
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnReplaceContourHypo()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnReplaceContourCalc() 
+{
+}
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnSliderDiscontinuityScroll(int percentage)
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnSliderLumenPercentageScroll(int percentage)
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnSliderCalcPercentageScroll(int percentage)
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnCalibration() 
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnFile()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnShowAll(bool value) 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnShowWall(bool value)
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnShowLumen(bool value)
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnShowCalc(bool value)
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget::OnShowHypo(bool value)
+{
+}
+
+
+// EOF - wxQuantificationWidget.cxx
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget.h
new file mode 100644 (file)
index 0000000..1054f8a
--- /dev/null
@@ -0,0 +1,371 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxQuantificationWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__QUANTIF__WDG__HXX__
+#define __WX__MARACAS__QUANTIF__WDG__HXX__
+
+
+#include "vtk3DQuantSurfaceWidget.h"
+#include "vtk2DQuantSliceWidget.h"
+#include "wxImageViewerWidget.h"
+
+#include "wxChart.h"
+
+#include <wx/wx.h>
+#include <wx/slider.h>
+#include <wx/panel.h>
+#include <wx/minifram.h>
+#include <wx/splitter.h>
+#include <kernel/marInterface.h>
+#include "wxQuantificationWidget_base.h"
+
+
+
+
+
+class wxQuantificationWidget : public wxQuantificationWidget_base
+{
+public:
+
+  enum WidgetsIDs { 
+    ID_QUANTIF3D = wxID_HIGHEST + 1 
+  };
+
+  enum  FunctionIDs {
+    ID_BUTTON_CONTOUR = wxID_HIGHEST + 1,
+    ID_BUTTON_CLEAN,
+    ID_BUTTON_CLEAN_ALL,
+    ID_BUTTON_SAVE_CONTOURS3D,
+    ID_BUTTON_AUTOQUANT,
+    ID_BUTTON_HEALTHY,
+    ID_BUTTON_CALCULATED,
+    ID_BUTTON_PAUSE,
+    ID_BUTTON_DELETE,
+    ID_BUTTON_POINT
+  };
+  
+  enum  ParamIDs {
+    ID_CHECKBOX_HEALTHY = wxID_HIGHEST + 1,
+    ID_CHECKBOX_PERPENDICULAR,
+    ID_CHECKBOX_VISIBLE_RINGS,
+    ID_CHECKBOX_SHOW_SURFACE,
+    ID_RADIOBUTTON_GREYSCALE,
+    ID_RADIOBUTTON_COLOR,
+    ID_SLIDER_SLICE,
+    ID_SLIDER_SLICE22,
+    ID_SLIDER_ISOVALUE,
+    ID_SLIDER_OPACITY
+};
+
+  // Constructor &  Destructor
+  wxQuantificationWidget(wxWindow* parent, wxWindowID id = -1,
+                         const wxPoint& pos = wxDefaultPosition,
+                         const wxSize& size = wxDefaultSize,
+                         long style = 0/*wxScrolledWindowStyle*/,
+                         const wxString& name = wxPanelNameStr);
+  
+  ~wxQuantificationWidget( );
+    
+  // Initialize
+  void Set_control( );
+  void Do_layout( );
+  void Set_Data( );
+
+//EED  void Positionate( );
+  void Forget( );
+  void Reload_Axis(bool mask, bool step);
+  void Show_Max_Min_Diameters( );
+  int  Back( );
+  void AddAxisActors();
+  void Clean3D( bool eraseAxe = false  );
+  void ResetAxis( );
+  virtual void RefreshAxis( );
+//EED  void Refresh_Quant( );
+  void Point_Intensity(double x, double y);
+  void Set_plane_3D( double  x, double y );
+  void CleanContour();
+
+  void OnContourWall();
+  void OnContourLumen();
+  void OnContourHypo();
+  void OnContourCalc();
+  void OnReplaceContourWall();
+  void OnReplaceContourLumen();
+  void OnReplaceContourHypo();
+  void OnReplaceContourCalc();
+  void OnSliderDiscontinuityScroll(int percentage);
+  void OnSliderLumenPercentageScroll(int percentage);
+  void OnSliderCalcPercentageScroll(int percentage);
+  void OnCalibration();
+  void OnFile();
+  void OnShowAll(bool value); 
+  void OnShowWall(bool value);
+  void OnShowLumen(bool value);
+  void OnShowCalc(bool value);
+  void OnShowHypo(bool value);
+
+  wxPanel* CreateStenosisPanel();
+
+  //Button
+  void Do_Quant( );
+  void OnContour_BT(wxCommandEvent& event);
+  void OnClean_BT(wxCommandEvent& event);
+  void OnCleanAll_BT(wxCommandEvent& event);
+  void OnSaveContours3D_BT(wxCommandEvent& event);
+
+  void OnAutoQuantification_BT(wxCommandEvent& event);
+
+
+
+  virtual void DetectHealthySickSlice( bool minSurf , bool maxSurf );
+
+  
+  //CheckBox
+  void OnHealthySlice_CB(wxCommandEvent& event);
+  void OnShowSurface_CB(wxCommandEvent& event);
+  void OnVisibleRing_CB(wxCommandEvent& event);
+  void OnPerpendicular_CB(wxCommandEvent& event);
+    
+  // RadioButton
+  void OnGreyScale_RB(wxCommandEvent& event);
+  void OnColor_RB(wxCommandEvent& event);
+    
+  //Slider
+  void OnSliderSliceScroll(wxScrollEvent& event);
+  void OnSliderIsovalueScroll(wxScrollEvent& event);
+  void OnSliderOpacityScroll(wxScrollEvent& event);
+  virtual int  GetActualSlice();
+  virtual int  GetMaxActualSlice();
+  virtual int  GetHealthySlice();
+  void GetHealthySliceRange(int &healthySliceStart,int &healthySliceEnd);
+  virtual int  GetSizeHealthyRegion();
+  virtual void SetSizeHealthyRegion(int size);
+  virtual void SetHealthySlice(int healthySlice=-1);   
+
+  void ShowMARACASData( marInterface* mar );
+  void CallBackOnMouseWheel( wxMouseEvent& event );
+  void CallBackOnLeftDClick( wxMouseEvent& event );
+
+  virtual void Set3DRegionSliceActor( int type, int k1,int k2 );
+  virtual void Set3DStartRegionSliceActor( int type, int k );
+  void Set3DEndRegionSliceActor( int type, int k );
+
+  void Show3DRegionSliceActor(int type );
+  virtual void Show3DStartRegionSliceActor(int type );
+  void Show3DEndRegionSliceActor(int type );
+
+  void Hide3DRegionSliceActor(int type );
+  virtual void Hide3DStartRegionSliceActor(int type );
+  virtual void Hide3DEndRegionSliceActor(int type );
+  virtual void GetSliceLimites(int type, int &sliceStart,int &sliceEnd);
+
+  int  GetAnalysisTypeStenosis();
+  virtual void SetAnalysisTypeStenosis(int analysisTypeStenosis);
+
+  void SetSlider_Isovalue_Opacity(int isovalue,int opacity);
+  virtual void SetManualContour_2DWorld(bool ok);
+  virtual void SetManualContour_AddPoint_2DWorld();
+  void SetManualContour_InsertPoint_2DWorld();
+  void SetManualContour_ErasePoint_2DWorld();
+  void SetManualContour_MovePoint_2DWorld();
+  virtual void SetManualContour_ReplaceContour();
+
+  virtual kVolume *GetVolumeAxisExtended(int wz1,int wz2);
+
+private:
+
+  // App
+  marInterface                         *_mar;
+  
+  // VTK
+  vtk3DQuantSurfaceWidget      *_3DWorld;
+  vtk2DQuantSliceWidget                *_2DWorld;
+
+  // Chart
+
+  // EED
+  //wxChart                                    *_Chart;
+  wxPanel                                      *_wxStenosisPanel;
+  wxSplitterWindow                     *panel_splitter; 
+  wxSplitterWindow                     *panel_splitter_right; 
+  wxSplitterWindow                     *panel_splitter_left; 
+//  wxPanel                                    *panel_left;
+  wxPanel                                      *panel_left_up;
+  wxPanel                                      *panel_left_down;
+  wxPanel                                      *panel_right;
+  wxPanel                                      *panel_right_up;
+  wxPanel                                      *panel_right_down;
+
+  // Group button
+  wxButton                                     *_bt_AddContour3D;
+  wxButton                                     *_bt_CleanContour3D;
+  wxButton                                     *_bt_CleanAllContours3D;
+  wxButton                                     *_bt_SaveContours3D;
+  wxButton                                     *_bt_Healthy;
+
+  wxPanelControlsHealthySickSlice2 *_pl_cntlHealthySick2;
+
+
+//  wxButton                           *_bt_ContourCalculated;
+//  wxButton                           *_bt_Pause;
+//  wxButton                           *_bt_Delete;
+//  wxButton                           *_bt_Point;
+
+  // Tool graph
+  wxRadioButton                                *_rb_GreyScale;
+  wxRadioButton                                *_rb_Color;
+
+  wxCheckBox                           *_cb_HealthySlice;
+  wxCheckBox                           *_cb_Perpendicular;
+
+  wxCheckBox                           *_cb_VisibleRings;
+  wxCheckBox                           *_cb_ShowSurface;
+  wxSlider                                     *_sl_Slice;
+  wxSlider                                     *_sl_Isovalue;
+  wxSlider                                     *_sl_Opacity;
+  wxStaticText                         *_st_Slice;
+  wxStaticText                         *_st_Isovalue;
+  wxStaticText                         *_st_Opacity; 
+
+  // Status Text
+//  wxStaticText       *_st_Label0;
+//  wxStaticText       *_st_Value0;
+  wxStaticText         *_st_Label1;
+  wxStaticText         *_st_Value1;
+  wxStaticText         *_st_Label2;
+  wxStaticText         *_st_Value2;
+  wxStaticText         *_st_Label3;
+  wxStaticText         *_st_Value3;
+//  wxStaticText       *_st_Label4;
+//  wxStaticText       *_st_Value4;
+//  wxStaticText       *_st_Label5;
+//  wxStaticText       *_st_Value5;
+  wxStaticText         *_st_Label6;
+  wxStaticText         *_st_Value6;
+  wxStaticText         *_st_Label7;
+  wxStaticText         *_st_Value7;
+  wxStaticText         *_st_Label8;
+  wxStaticText         *_st_Value8;
+//  wxStaticText       *_st_Label9;
+//  wxStaticText       *_st_Value9;
+
+
+  wxStaticText         *_st_Label100;
+  wxStaticText         *_st_Value100;
+  wxStaticText         *_st_Label101;
+  wxStaticText         *_st_Value101;
+//  wxStaticText       *_st_Label102;
+//  wxStaticText       *_st_Value102;
+//  wxStaticText       *_st_Label103;
+//  wxStaticText       *_st_Value103;
+//  wxStaticText       *_st_Label104;
+//  wxStaticText       *_st_Value104;
+//  wxStaticText       *_st_Label105;
+//  wxStaticText       *_st_Value105;
+//  wxStaticText       *_st_Label106;
+//  wxStaticText       *_st_Value106;
+//  wxStaticText       *_st_Label107;
+//  wxStaticText       *_st_Value107;
+//  wxStaticText       *_st_Label108;
+//  wxStaticText       *_st_Value108;
+
+
+  wxStaticText         *_st_LabelRef101;
+  wxStaticText         *_st_ValueRef101;
+  wxStaticText         *_st_LabelRef102;
+  wxStaticText         *_st_ValueRef102;
+  wxStaticText         *_st_LabelRef103;
+  wxStaticText         *_st_ValueRef103;
+
+
+
+  // Quantification
+  // int
+  int _numpoint;
+  int _axis_index;
+  int _width, _height, _depth;
+  int _bak_ActualSlice;
+
+  int _given_points;
+  int _typ;
+  int _actual_actor;
+  int _perpe;
+  int _shown;
+  int _quant_shown;
+  int _show_rings;
+  int _show_hs;
+  int _showS;
+  
+  int _first_quant;
+  int _last_quant;
+  int _first_point_quant;
+  int _last_point_quant;
+  int _bounds;
+  int _intRange;
+  int _nClicks;
+  int _quantifing;
+  int _sizeHealthyRegion;
+
+  int _initX;
+  int _initY;
+  int _initWindow;
+  int _initLevel;
+
+  // float
+//  float _real_first_point_quant;
+//  float _real_last_point_quant;
+  float _actual_area;
+  float _actual_peri;
+  float _actual_darea;
+  float _actual_dperi;
+  float _actual_dmax;
+  float _actual_dmin;
+  float _actual_davg;
+  float _actual_sten;
+  float _actual_partial;
+  float _actual_total;
+  float _ip[3], _fp[3];
+
+  // wxList
+  wxList  *_rings_index;
+  wxList  *_quant_sten;
+  wxList  *_man_points;
+  wxList  *_actual_quant_x;
+  wxList  *_actual_quant_area;
+  wxList  *_actual_quant_peri;
+  wxList  *_actual_quant_darea;
+  wxList  *_actual_quant_dperi;
+  wxList  *_actual_quant_dmax;
+  wxList  *_actual_quant_dmin;
+  wxList  *_actual_quant_davg;
+  wxList  *_actual_quant_sten;
+
+  DECLARE_EVENT_TABLE( );
+       
+  void         MoveSlider(int actualQuant);
+  void         Reset_sl_Slider();
+  void         showVariables();
+  wxString     strStenosis(double stenosis);
+  double       doubleStenosis(double healthy, double sick);
+  double       GetStenosisArea(int sickSlice);
+  double       GetStenosisDiameter(int sickSlice);
+
+};
+
+#endif // __WX__MARACAS__QUANTIF__WDG
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidgetCT.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidgetCT.cxx
new file mode 100644 (file)
index 0000000..d921c88
--- /dev/null
@@ -0,0 +1,2149 @@
+
+
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxQuantificationWidgetCT.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:43 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "wxQuantificationWidgetCT.h"
+#include "../marDictionary.h"
+#include "vtkPolyDataWriter.h"
+
+
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( wxQuantificationWidgetCT, wxPanel )
+       EVT_BUTTON(ID_BUTTON_CONTOUR    , wxQuantificationWidgetCT::OnContour_BT                                                )
+       EVT_BUTTON(ID_BUTTON_CLEAN              , wxQuantificationWidgetCT::OnClean_BT                                          )
+       EVT_BUTTON(ID_BUTTON_CLEAN_ALL  , wxQuantificationWidgetCT::OnCleanAll_BT                                               )
+       EVT_CHECKBOX(ID_CHECKBOX_HEALTHY,                       wxQuantificationWidgetCT::OnHealthySlice_CB             )
+       EVT_CHECKBOX(ID_CHECKBOX_SHOW_SURFACE,          wxQuantificationWidgetCT::OnShowSurface_CB              )
+       EVT_CHECKBOX(ID_CHECKBOX_VISIBLE_RINGS,         wxQuantificationWidgetCT::OnVisibleRing_CB              )
+       EVT_CHECKBOX(ID_CHECKBOX_PERPENDICULAR,         wxQuantificationWidgetCT::OnPerpendicular_CB            )
+
+       EVT_RADIOBUTTON(ID_RADIOBUTTON_GREYSCALE,       wxQuantificationWidgetCT::OnGreyScale_RB                        )
+       EVT_RADIOBUTTON(ID_RADIOBUTTON_COLOR,           wxQuantificationWidgetCT::OnColor_RB                            )
+
+       EVT_COMMAND_SCROLL(ID_SLIDER_SLICE,                     wxQuantificationWidgetCT::OnSliderSliceScroll           )
+
+       EVT_COMMAND_SCROLL(ID_SLIDER_OPACITY,           wxQuantificationWidgetCT::OnSliderOpacityScroll )
+       EVT_COMMAND_SCROLL_THUMBRELEASE(ID_SLIDER_ISOVALUE, wxQuantificationWidgetCT::OnSliderIsovalueScroll    )
+       
+END_EVENT_TABLE( );
+
+//--------------------------------------------------------------------------------
+// Constructor
+//--------------------------------------------------------------------------------
+wxQuantificationWidgetCT::wxQuantificationWidgetCT(wxWindow* parent, wxWindowID id,
+                                               const wxPoint& pos, const wxSize& size, long style,
+                                               const wxString& name)
+: wxQuantificationWidget_base( parent, id, pos, size, style, name )
+{
+/*
+    panel_splitter              = new wxSplitterWindow( this                   , -1, wxDefaultPosition, wxSize(400,400 ), wxSP_3D );
+       panel_left                       = new wxPanel(panel_splitter                   , -1, wxDefaultPosition, wxSize(400,400));
+    panel_splitter_right = new wxSplitterWindow( panel_splitter , -1, wxDefaultPosition, wxSize(400,400 ), wxSP_3D );
+       panel_right_up           = new wxPanel(panel_splitter_right             , -1, wxDefaultPosition, wxSize(600,600));
+       panel_right_down         = new wxPanel(panel_splitter_right             , -1, wxDefaultPosition, wxSize(600,600));
+       panel_rightm_up          = CreateViewPanel(panel_right_up);
+
+       // maracas
+       _mar = NULL;
+       SetSizeHealthyRegion( 5 );
+
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _3DWorld = new vtk3DQuantSurfaceWidget( panel_left, ID_QUANTIF3D );
+
+       
+//EED OJO Este NULL es solo para que compile   
+       _3DWorld->SetInterfaceVtkPanelWidgets(NULL);
+
+//     _2DWorld = new vtk2DQuantSliceWidget( panel_right_up, -1 );
+//     _2DWorld->SetSize(200,200);
+
+//EED OJO Este NULL es solo para que compile   
+//     _2DWorld->SetInterfaceVtkPanelWidgets(NULL);
+       
+       
+       this->Set_control();
+       this->Do_layout();
+       this->Set_Data();
+*/
+       _bak_ActualSlice=-1;
+       _bak_ActualSlice2=-1;
+
+       _mar = NULL;
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( CreatePanelPrincipal(this), 1, wxALL|wxEXPAND, 0 );
+       sizer->Add( CreatePanelStatus(this) , 0, wxALL|wxEXPAND, 0 );
+
+       SetSizer(sizer);
+       Layout();       
+
+
+
+}
+
+
+//--------------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+wxQuantificationWidgetCT::~wxQuantificationWidgetCT( ){
+       _3DWorld->Delete( );
+       delete _contourViewer;
+       delete _lineViewer;
+       delete _pointViewer;
+//     delete _2DWorld;
+       
+       for (int i = 0; i < _manContours.size(); i++)
+       {
+               delete _manContours[i];
+               _manContours[i] = NULL;
+       }
+       delete _imageviewer2D_1;
+}
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreatePanelPrincipal(wxWindow *parent)
+{
+       wxPanel *panel                  = new wxPanel(parent,-1);
+       _splitPanelPrincipal    = new wxSplitterWindow(panel, -1);
+       _splitPanelPrincipal->SetMinimumPaneSize(50);
+
+       wxWindow *principal_Left        = CreatePanel_Left(_splitPanelPrincipal) ;
+       wxWindow *principal_Right       = CreatePanel_Right(_splitPanelPrincipal);
+
+       _splitPanelPrincipal->SplitVertically(principal_Left , principal_Right,600 );
+
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _splitPanelPrincipal, 1,wxGROW,0 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreatePanel_Left(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+       _splitpanel_left        = new wxSplitterWindow(panel, -1);
+       _splitpanel_left->SetMinimumPaneSize(50);
+
+       _3DWorld = new vtk3DQuantSurfaceWidget( _splitpanel_left, ID_QUANTIF3D );
+       _3DWorld->SetInterfaceVtkPanelWidgets(NULL);
+       wxWindow *controlPanel3D        = CreateControlPanel3D(_splitpanel_left);
+
+       _splitpanel_left->SplitHorizontally(_3DWorld , controlPanel3D,0 );
+
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _splitpanel_left, 1,wxGROW,0 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+
+
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreateControlPanel3D(wxWindow *parent)
+{
+       wxPanel *panel                                          = new wxPanel(parent,-1);
+       marDictionary marDict;
+       
+       _cb_HealthySlice        = new wxCheckBox( panel, ID_CHECKBOX_HEALTHY, wxString( marDict.GetString(205) , wxConvUTF8)); // "Healthy slice"
+       _cb_HealthySlice->SetValue(true);
+       _cb_Perpendicular       = new wxCheckBox( panel, ID_CHECKBOX_PERPENDICULAR, wxString(marDict.GetString(210), wxConvUTF8)); //"Perpendicular section"
+       _cb_Perpendicular->SetValue(true);
+
+       _rb_GreyScale           = new wxRadioButton( panel, ID_RADIOBUTTON_GREYSCALE, wxString(marDict.GetString(230), wxConvUTF8), wxDefaultPosition,wxDefaultSize,wxRB_GROUP ); //"greyscale    "
+       _rb_GreyScale->SetValue(true);
+
+       _rb_Color                       = new wxRadioButton( panel, ID_RADIOBUTTON_COLOR, wxString(marDict.GetString(235), wxConvUTF8), wxDefaultPosition,wxDefaultSize );//"color    "
+       _rb_Color->SetValue(false);
+
+       _cb_VisibleRings        = new wxCheckBox( panel, ID_CHECKBOX_VISIBLE_RINGS, wxString(marDict.GetString(215), wxConvUTF8));//"Visible rings"
+       _cb_VisibleRings->SetValue(true);
+       _cb_ShowSurface         = new wxCheckBox( panel, ID_CHECKBOX_SHOW_SURFACE, wxString(marDict.GetString(220), wxConvUTF8));//"Show Surface"
+       _cb_ShowSurface->SetValue(true);
+
+       
+       _bt_AddContour3D                = new wxButton( panel, ID_BUTTON_CONTOUR, wxString(marDict.GetString(245), wxConvUTF8) ,//"Add mark contour"
+                                      wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+       _bt_CleanContour3D              = new wxButton( panel, ID_BUTTON_CLEAN, wxString(marDict.GetString(250), wxConvUTF8) ,//"Erase mark contours"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       _bt_CleanAllContours3D  = new wxButton( panel, ID_BUTTON_CLEAN_ALL, wxString(marDict.GetString(253), wxConvUTF8) ,//"Erase all mark contours"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       //wxSlider
+       _sl_Slice    = new wxSlider( panel, ID_SLIDER_SLICE     , 0, 0, 10000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_Isovalue = new wxSlider( panel, ID_SLIDER_ISOVALUE  , 0, 0, 10000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_Opacity  = new wxSlider( panel, ID_SLIDER_OPACITY   , 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+
+
+       // size
+       _sl_Slice->SetSize(800,16);
+       _sl_Isovalue->SetSize(300,16);
+       _sl_Opacity->SetSize(300,16);
+       
+       // Text
+       _st_Slice                       = new wxStaticText(panel, -1, wxString(marDict.GetString( 90), wxConvUTF8) ); //"Slice "
+       _st_Isovalue            = new wxStaticText(panel, -1, wxString(marDict.GetString(240), wxConvUTF8) ); //"Isovalue"
+       _st_Opacity                     = new wxStaticText(panel, -1, wxString(marDict.GetString(225), wxConvUTF8) ); //"Opacity "
+
+       _txt_Position           = new wxStaticText(panel, -1, _T("  ") ); //"Position "
+
+
+//--
+
+       wxFlexGridSizer         *axe                            = new wxFlexGridSizer(1);
+
+       wxFlexGridSizer         *axe1                           = new wxFlexGridSizer(10);
+       wxBoxSizer                      *axe2                           = new wxBoxSizer(wxHORIZONTAL);
+       wxFlexGridSizer         *axe3                           = new wxFlexGridSizer(10,0);
+       wxFlexGridSizer         *axe4                           = new wxFlexGridSizer(10,0);
+       wxBoxSizer                      *axe5                           = new wxBoxSizer(wxHORIZONTAL);
+
+
+
+       axe1->Add(_st_Slice                             , 10, wxALL|wxEXPAND, 0);
+       axe1->Add(_sl_Slice                             , 10, wxALL|wxGROW, 0);
+       axe1->Add(_txt_Position                 , 10, wxALL|wxEXPAND, 0);
+       axe1->AddGrowableCol(1);
+
+       axe2->Add(_cb_HealthySlice                      , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_Perpendicular                     , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_VisibleRings                      , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_ShowSurface                       , 10, wxALL|wxEXPAND, 0);
+
+       axe3->Add(_st_Opacity                           ,  1, wxALL|wxEXPAND, 0);
+       axe3->Add(_sl_Opacity                           , 10, wxALL|wxGROW, 0);
+       axe3->Add(_rb_GreyScale                         , 10, wxALL|wxEXPAND, 0);
+       axe3->Add(_rb_Color                             , 10, wxALL|wxEXPAND, 0);
+       axe3->AddGrowableCol(1);
+
+       axe4->Add(_st_Isovalue                          ,  1, wxALL|wxEXPAND, 0);
+       axe4->Add(_sl_Isovalue                          ,  1, wxALL|wxGROW, 0);
+       axe4->AddGrowableCol(1);
+
+       axe5->Add(_bt_AddContour3D                      ,  1 );
+       axe5->Add(_bt_CleanContour3D                    ,  1 );
+       axe5->Add(_bt_CleanAllContours3D                ,  1 );
+
+
+       axe->Add(axe1, 2, wxALL|wxGROW, 0);
+       axe->Add(axe2, 2, wxALL, 0);   //wxALIGN_CENTER_HORIZONTAL
+       axe->Add(axe3, 2, wxALL|wxGROW, 0);
+       axe->Add(axe4, 2, wxALL|wxGROW, 0);
+       axe->Add(axe5, 2, wxALL, 0);
+
+
+
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( axe, 1,wxALL|wxGROW,5 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+
+}
+
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreatePanel_Right(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+       _splitpanel_right       = new wxSplitterWindow(panel, -1);
+       _splitpanel_right->SetMinimumPaneSize(50);
+
+       wxWindow *window2D                      = CreateView2DPanel(_splitpanel_right);
+       wxWindow *windowRightDown       = CreatePanel_Right_Down(_splitpanel_right);
+
+       _splitpanel_right->SplitHorizontally(window2D , windowRightDown,0 );
+
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _splitpanel_right, 1,wxGROW,0 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+
+
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreatePanel_Right_Down(wxWindow *parent)
+{
+       wxPanel *panel                  = new wxPanel(parent,-1);
+       _splitpanel_right_down  = new wxSplitterWindow(panel, -1);
+       _splitpanel_right_down->SetMinimumPaneSize(10);
+
+       _pl_cntlHealthySick2    = new wxPanelControlsHealthySickSliceCT(_splitpanel_right_down,this);
+       _wxStenosisPanel                = CreateStenosisPanel(_splitpanel_right_down);
+
+       _splitpanel_right_down->SplitHorizontally(_pl_cntlHealthySick2,_wxStenosisPanel  ,300 );
+
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _splitpanel_right_down, 1,wxGROW,0 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+
+
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreatePanelStatus(wxWindow *parent)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       
+//--   
+       marDictionary marDict;
+       
+       _st_Label1 = new wxStaticText(panel, -1, wxString(marDict.GetString(380), wxConvUTF8) ); //"Total Axis Lenght"
+       _st_Value1 = new wxStaticText(panel, -1, _T("0.00"));
+       _st_Label2 = new wxStaticText(panel, -1, wxString(marDict.GetString(390), wxConvUTF8) );//"Area"
+       _st_Value2 = new wxStaticText(panel, -1, _T("0.00"));
+       _st_Label3 = new wxStaticText(panel, -1, wxString(marDict.GetString(400), wxConvUTF8) );//"Perimeter"
+       _st_Value3 = new wxStaticText(panel, -1, _T("0.00"));
+       _st_Label6 = new wxStaticText(panel, -1, wxString(marDict.GetString(405), wxConvUTF8) );//"Minimum Diameter"
+       _st_Value6 = new wxStaticText(panel, -1, _T("0.00"));
+       _st_Label7 = new wxStaticText(panel, -1, wxString(marDict.GetString(410), wxConvUTF8) );//"Maximum Diameter"
+       _st_Value7 = new wxStaticText(panel, -1, _T("0.00"));
+       _st_Label8 = new wxStaticText(panel, -1, wxString(marDict.GetString(415), wxConvUTF8) );//"Average Diameter"
+       _st_Value8 = new wxStaticText(panel, -1, _T("0.00"));
+
+       _st_LabelRef101 = new wxStaticText(panel, -1, wxString(marDict.GetString(385), wxConvUTF8) );//"Seg. Length"
+       _st_ValueRef101 = new wxStaticText(panel, -1, _T("--"));
+       _st_LabelRef102 = new wxStaticText(panel, -1, wxString(marDict.GetString(395), wxConvUTF8) );//"Ref. Area"
+       _st_ValueRef102 = new wxStaticText(panel, -1, _T("--"));
+       _st_LabelRef103 = new wxStaticText(panel, -1, wxString(marDict.GetString(420), wxConvUTF8) );//"Ref. Average Diam."
+       _st_ValueRef103 = new wxStaticText(panel, -1, _T("--"));
+
+//--
+       wxBoxSizer                      *status                         = new wxBoxSizer(wxHORIZONTAL);
+       wxBoxSizer                      *status0                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status1                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status2                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status3                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status6                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status7                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status8                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status9                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef1                     = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef2                     = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef3                     = new wxBoxSizer(wxVERTICAL);
+       
+       status1->Add(_st_Label1, 1, wxALL|wxALIGN_CENTER, 5);
+       status1->Add(_st_Value1, 1, wxALL|wxALIGN_CENTER, 5);
+       status2->Add(_st_Label2, 1, wxALL|wxALIGN_CENTER, 5);
+       status2->Add(_st_Value2, 1, wxALL|wxALIGN_CENTER, 5);
+       status3->Add(_st_Label3, 1, wxALL|wxALIGN_CENTER, 5);
+       status3->Add(_st_Value3, 1, wxALL|wxALIGN_CENTER, 5);
+
+       status6->Add(_st_Label6, 1, wxALL|wxALIGN_CENTER, 5);
+       status6->Add(_st_Value6, 1, wxALL|wxALIGN_CENTER, 5);
+       status7->Add(_st_Label7, 1, wxALL|wxALIGN_CENTER, 5);
+       status7->Add(_st_Value7, 1, wxALL|wxALIGN_CENTER, 5);
+       status8->Add(_st_Label8, 1, wxALL|wxALIGN_CENTER, 5);
+       status8->Add(_st_Value8, 1, wxALL|wxALIGN_CENTER, 5);
+
+       
+       statusRef1->Add(_st_LabelRef101, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef1->Add(_st_ValueRef101, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef2->Add(_st_LabelRef102, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef2->Add(_st_ValueRef102, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef3->Add(_st_LabelRef103, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef3->Add(_st_ValueRef103, 1, wxALL|wxALIGN_CENTER, 5);
+
+
+
+       status->Add(status1             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef1  , 1, wxALL|wxEXPAND, 0);
+       status->Add(status2             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef2  , 1, wxALL|wxEXPAND, 0);
+       status->Add(status3             , 1, wxALL|wxEXPAND, 0);
+
+       status->Add(status6             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status7             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status8             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef3  , 1, wxALL|wxEXPAND, 0);
+
+
+//--   
+       
+       wxBoxSizer * sizer = new wxBoxSizer(wxHORIZONTAL);
+       sizer->Add( status, 1,wxALL|wxEXPAND,0 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+// ----------------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreateStenosisPanel(wxWindow *parent){
+       marDictionary marDict;
+
+       wxPanel* panel = new wxPanel(parent);
+
+       _st_Label100 = new wxStaticText(panel, -1, (wxChar)(marDict.GetString(255)) ); // "Stenosis (area)"
+       _st_Label101 = new wxStaticText(panel, -1, (wxChar)(marDict.GetString(260)) ); // "Stenosis (diameter)"
+       _st_Value100 = new wxStaticText(panel, -1, _T("--                "));
+       _st_Value101 = new wxStaticText(panel, -1, _T("--                "));
+//     wxStaticText *_st_LabelBlanc = new wxStaticText(panel, -1, "                 ");
+
+//EEDxx 2.6
+//     _st_LabelBlanc->SetBackgroundColour(*wxLIGHT_GREY);
+
+//EEDxx 2.6
+//     panel->SetBackgroundColour(wxColour(100,0,100));
+//     _st_Label100->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Label101->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value100->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value101->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+       wxFont font(14,wxDEFAULT ,wxNORMAL,wxBOLD);
+       _st_Value100->SetFont(font);
+       _st_Value101->SetFont(font);
+
+
+
+       wxGridSizer*  gridSizer1        = new wxFlexGridSizer(1);
+       gridSizer1->Add(new wxStaticText(panel, -1, _T("                 "))    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Value100    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Label100    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(new wxStaticText(panel, -1, _T("                 "))    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Value101    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+       gridSizer1->Add(_st_Label101    ,15, wxALL|wxEXPAND|wxALIGN_CENTRE_HORIZONTAL, 0);
+
+       wxGridSizer*  gridSizer         = new wxFlexGridSizer(4);
+       gridSizer->Add(new wxStaticText(panel, -1, _T("                 "))     ,15, wxALIGN_LEFT , 50);
+       gridSizer->Add(new wxStaticText(panel, -1, _T("                 "))     ,15, wxALIGN_LEFT , 50);
+       gridSizer->Add(new wxStaticText(panel, -1, _T("                 "))     ,15, wxALIGN_LEFT , 50);
+       gridSizer->Add(gridSizer1               ,15, wxALIGN_LEFT , 50);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(gridSizer);
+       panel->Layout();
+//EEDxx 2.6
+//     panel->SetBackgroundColour(*wxLIGHT_GREY);
+       panel->SetSize(400,300);
+       panel->SetSize( gridSizer->GetMinSize() );
+
+       return panel;
+}
+
+//--------------------------------------------------------
+/*
+void wxQuantificationWidgetCT::Set_control(){
+       marDictionary marDict;
+       
+    _wxStenosisPanel = CreateStenosisPanel();
+
+       _cb_HealthySlice        = new wxCheckBox( panel_left, ID_CHECKBOX_HEALTHY, wxT( marDict.GetString(205) )); // "Healthy slice"
+       _cb_HealthySlice->SetValue(true);
+//EEDxx 2.6
+//     _cb_HealthySlice->SetBackgroundColour(*wxLIGHT_GREY);
+       _cb_Perpendicular       = new wxCheckBox( panel_left, ID_CHECKBOX_PERPENDICULAR, wxT(marDict.GetString(210))); //"Perpendicular section"
+       _cb_Perpendicular->SetValue(true);
+//EEDxx 2.6
+//     _cb_Perpendicular->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _rb_GreyScale           = new wxRadioButton( panel_left, ID_RADIOBUTTON_GREYSCALE, wxT(marDict.GetString(230)), wxDefaultPosition,wxDefaultSize,wxRB_GROUP ); //"greyscale    "
+       _rb_GreyScale->SetValue(true);
+//EEDxx 2.6
+//     _rb_GreyScale->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _rb_Color                       = new wxRadioButton( panel_left, ID_RADIOBUTTON_COLOR, wxT(marDict.GetString(235)), wxDefaultPosition,wxDefaultSize );//"color    "
+       _rb_Color->SetValue(false);
+//EEDxx 2.6
+//     _rb_Color->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _cb_VisibleRings        = new wxCheckBox( panel_left, ID_CHECKBOX_VISIBLE_RINGS, wxT(marDict.GetString(215)));//"Visible rings"
+       _cb_VisibleRings->SetValue(true);
+//EEDxx 2.6
+//     _cb_VisibleRings->SetBackgroundColour(*wxLIGHT_GREY);
+       _cb_ShowSurface         = new wxCheckBox( panel_left, ID_CHECKBOX_SHOW_SURFACE, wxT(marDict.GetString(220)));//"Show Surface"
+       _cb_ShowSurface->SetValue(true);
+//EEDxx 2.6
+//     _cb_ShowSurface->SetBackgroundColour(*wxLIGHT_GREY);
+
+       
+       _bt_AddContour3D                = new wxButton( panel_left, ID_BUTTON_CONTOUR, marDict.GetString(245) ,//"Add mark contour"
+                                      wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+       _bt_CleanContour3D              = new wxButton( panel_left, ID_BUTTON_CLEAN, marDict.GetString(250) ,//"Erase mark contours"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       _bt_CleanAllContours3D  = new wxButton( panel_left, ID_BUTTON_CLEAN_ALL, marDict.GetString(253) ,//"Erase all mark contours"
+                                    wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator);
+
+       //wxSlider
+       _sl_Slice    = new wxSlider( panel_left, ID_SLIDER_SLICE        , 0, 0, 10000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_Isovalue = new wxSlider( panel_left, ID_SLIDER_ISOVALUE     , 0, 0, 10000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_Opacity  = new wxSlider( panel_left, ID_SLIDER_OPACITY      , 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//EEDxx 2.6
+//     _sl_Slice->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_Isovalue->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_Opacity->SetBackgroundColour(*wxLIGHT_GREY);
+
+       // size
+       _sl_Slice->SetSize(800,16);
+       _sl_Isovalue->SetSize(300,16);
+       _sl_Opacity->SetSize(300,16);
+       
+       // Text
+       _st_Slice                       = new wxStaticText(panel_left, -1, marDict.GetString( 90) ); //"Slice "
+       _st_Isovalue            = new wxStaticText(panel_left, -1, marDict.GetString(240) ); //"Isovalue"
+       _st_Opacity                     = new wxStaticText(panel_left, -1, marDict.GetString(225) ); //"Opacity "
+
+       _txt_Position           = new wxStaticText(panel_left, -1, "  " ); //"Position "
+
+//EEDxx 2.6
+//     _st_Slice->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Isovalue->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Opacity->SetBackgroundColour(*wxLIGHT_GREY);
+       
+
+       _st_Label1 = new wxStaticText(this, -1, marDict.GetString(380) ); //"Total Axis Lenght"
+       _st_Value1 = new wxStaticText(this, -1, "0.00");
+//EEDxx 2.6
+//     _st_Label1->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value1->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label2 = new wxStaticText(this, -1, marDict.GetString(390) );//"Area"
+       _st_Value2 = new wxStaticText(this, -1, "0.00");
+//EEDxx 2.6
+//     _st_Label2->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value2->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label3 = new wxStaticText(this, -1, marDict.GetString(400) );//"Perimeter"
+       _st_Value3 = new wxStaticText(this, -1, "0.00");
+//EEDxx 2.6
+//     _st_Label3->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value3->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label6 = new wxStaticText(this, -1, marDict.GetString(405) );//"Minimum Diameter"
+       _st_Value6 = new wxStaticText(this, -1, "0.00");
+//EEDxx 2.6
+//     _st_Label6->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value6->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label7 = new wxStaticText(this, -1, marDict.GetString(410) );//"Maximum Diameter"
+       _st_Value7 = new wxStaticText(this, -1, "0.00");
+//EEDxx 2.6
+//     _st_Label7->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value7->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_Label8 = new wxStaticText(this, -1, marDict.GetString(415) );//"Average Diameter"
+       _st_Value8 = new wxStaticText(this, -1, "0.00");
+//EEDxx 2.6
+//     _st_Label8->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_Value8->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _st_LabelRef101 = new wxStaticText(this, -1, marDict.GetString(385) );//"Seg. Length"
+       _st_ValueRef101 = new wxStaticText(this, -1, "--");
+//EEDxx 2.6
+//     _st_LabelRef101->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_ValueRef101->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_LabelRef102 = new wxStaticText(this, -1, marDict.GetString(395) );//"Ref. Area"
+       _st_ValueRef102 = new wxStaticText(this, -1, "--");
+//EEDxx 2.6
+//     _st_LabelRef102->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_ValueRef102->SetBackgroundColour(*wxLIGHT_GREY);
+       _st_LabelRef103 = new wxStaticText(this, -1, marDict.GetString(420) );//"Ref. Average Diam."
+       _st_ValueRef103 = new wxStaticText(this, -1, "--");
+//EEDxx 2.6
+//     _st_LabelRef103->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_ValueRef103->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _pl_cntlHealthySick2 = new wxPanelControlsHealthySickSliceCT(panel_right_down,this);
+
+//EEDxx 2.6
+//    panel_left->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_right_up->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_right_down->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_splitter_right->SetBackgroundColour(*wxLIGHT_GREY);
+//     panel_splitter->SetBackgroundColour(*wxLIGHT_GREY);
+}
+*/
+//--------------------------------------------------------
+/*
+void wxQuantificationWidgetCT::Do_layout()
+{
+       
+       //Do the layout:
+       
+       wxBoxSizer                      *sizer_principal        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status                         = new wxBoxSizer(wxHORIZONTAL);
+       
+// EED 25 sep 2006
+//     wxFlexGridSizer         *medium_right_up        = new wxFlexGridSizer(1,0);
+//     wxFlexGridSizer         *medium_right_down      = new wxFlexGridSizer(1,0);
+       wxBoxSizer                  *medium_right_up    = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                  *medium_right_down  = new wxBoxSizer(wxVERTICAL);
+
+       //MIS TESTS
+//     wxFlexGridSizer         *right_up_div           = new wxFlexGridSizer(1,0);
+
+// EED 25 sep 2006
+       wxBoxSizer                  *right_up_div               = new wxBoxSizer(wxVERTICAL);
+
+
+       wxBoxSizer                      *medium_left            = new wxBoxSizer(wxVERTICAL);
+
+
+       wxStaticBoxSizer        *axe                            = new wxStaticBoxSizer(new wxStaticBox(this, -1, ""), wxVERTICAL);
+
+
+//     wxFlexGridSizer         *axe1                           = new wxFlexGridSizer(10,0);
+       wxBoxSizer                      *axe1                           = new wxBoxSizer(wxHORIZONTAL);
+
+       wxBoxSizer                      *axe2                           = new wxBoxSizer(wxHORIZONTAL);
+       wxFlexGridSizer         *axe3                           = new wxFlexGridSizer(10,0);
+       wxFlexGridSizer         *axe4                           = new wxFlexGridSizer(10,0);
+       wxBoxSizer                      *axe5                           = new wxBoxSizer(wxHORIZONTAL);
+       wxFlexGridSizer         *axe6                           = new wxFlexGridSizer(10,0);
+       wxFlexGridSizer         *axe7                           = new wxFlexGridSizer(10,0);
+       wxFlexGridSizer         *axe8                           = new wxFlexGridSizer(10,0);
+       
+       wxBoxSizer                      *status0                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status1                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status2                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status3                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status6                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status7                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status8                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *status9                        = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef1                     = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef2                     = new wxBoxSizer(wxVERTICAL);
+       wxBoxSizer                      *statusRef3                     = new wxBoxSizer(wxVERTICAL);
+       
+
+       axe1->Add(_st_Slice                                     , 10, wxALL|wxEXPAND, 0);
+       axe1->Add(_sl_Slice                                     , 10, wxALL|wxEXPAND, 0);
+       axe1->Add(_txt_Position                         , 10, wxALL|wxEXPAND, 0);
+
+       axe2->Add(_cb_HealthySlice                      , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_Perpendicular                     , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_VisibleRings                      , 10, wxALL|wxEXPAND, 0);
+       axe2->Add(_cb_ShowSurface                       , 10, wxALL|wxEXPAND, 0);
+
+       axe3->Add(_st_Opacity                           ,  1, wxALL|wxEXPAND, 0);
+       axe3->Add(_sl_Opacity                           , 10, wxALL|wxEXPAND, 0);
+       axe3->Add(_rb_GreyScale                         , 10, wxALL|wxEXPAND, 0);
+       axe3->Add(_rb_Color                                     , 10, wxALL|wxEXPAND, 0);
+
+       axe4->Add(_st_Isovalue                          ,  1, wxALL|wxEXPAND, 0);
+       axe4->Add(_sl_Isovalue                          ,  1, wxALL|wxEXPAND, 0);
+
+       axe5->Add(_bt_AddContour3D                      ,  1                            );
+       axe5->Add(_bt_CleanContour3D            ,  1                            );
+       axe5->Add(_bt_CleanAllContours3D        ,  1                            );
+
+
+
+       status1->Add(_st_Label1, 1, wxALL|wxALIGN_CENTER, 5);
+       status1->Add(_st_Value1, 1, wxALL|wxALIGN_CENTER, 5);
+       status2->Add(_st_Label2, 1, wxALL|wxALIGN_CENTER, 5);
+       status2->Add(_st_Value2, 1, wxALL|wxALIGN_CENTER, 5);
+       status3->Add(_st_Label3, 1, wxALL|wxALIGN_CENTER, 5);
+       status3->Add(_st_Value3, 1, wxALL|wxALIGN_CENTER, 5);
+
+       status6->Add(_st_Label6, 1, wxALL|wxALIGN_CENTER, 5);
+       status6->Add(_st_Value6, 1, wxALL|wxALIGN_CENTER, 5);
+       status7->Add(_st_Label7, 1, wxALL|wxALIGN_CENTER, 5);
+       status7->Add(_st_Value7, 1, wxALL|wxALIGN_CENTER, 5);
+       status8->Add(_st_Label8, 1, wxALL|wxALIGN_CENTER, 5);
+       status8->Add(_st_Value8, 1, wxALL|wxALIGN_CENTER, 5);
+
+       
+       statusRef1->Add(_st_LabelRef101, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef1->Add(_st_ValueRef101, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef2->Add(_st_LabelRef102, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef2->Add(_st_ValueRef102, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef3->Add(_st_LabelRef103, 1, wxALL|wxALIGN_CENTER, 5);
+       statusRef3->Add(_st_ValueRef103, 1, wxALL|wxALIGN_CENTER, 5);
+
+
+
+       status->Add(status1             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef1  , 1, wxALL|wxEXPAND, 0);
+       status->Add(status2             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef2  , 1, wxALL|wxEXPAND, 0);
+       status->Add(status3             , 1, wxALL|wxEXPAND, 0);
+
+       status->Add(status6             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status7             , 1, wxALL|wxEXPAND, 0);
+       status->Add(status8             , 1, wxALL|wxEXPAND, 0);
+       status->Add(statusRef3  , 1, wxALL|wxEXPAND, 0);
+
+       
+       axe->Add(axe1, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe2, 2, wxALL|wxEXPAND, 0);   //wxALIGN_CENTER_HORIZONTAL
+       axe->Add(axe3, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe4, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe6, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe7, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe8, 2, wxALL|wxEXPAND, 0);
+       axe->Add(axe5, 2);
+       
+
+//     right_up_div->Add(_2DWorld, 1, wxALL|wxEXPAND, 5);
+       right_up_div->Add(panel_rightm_up, 1, wxALL|wxEXPAND, 5);
+       medium_left->Add(_3DWorld                                       , 1, wxEXPAND, 0);
+       medium_left->Add(axe                                            , 0, wxALL|wxEXPAND, 0);
+       medium_right_up->Add( right_up_div      , 1, wxALL|wxEXPAND, 5);
+//     medium_right_up->Add(           , 2, wxALL|wxEXPAND, 5);
+       medium_right_down->Add(_pl_cntlHealthySick2     , 1, wxALL, 5);
+       medium_right_down->Add(_wxStenosisPanel         , 1, wxALL, 5);
+
+
+       
+       
+       panel_left->SetAutoLayout(true);
+       panel_left->SetSizer(medium_left);
+       panel_left->Layout();
+
+       panel_right_up->SetAutoLayout(true);
+       panel_right_up->SetSizer(medium_right_up);
+       panel_right_up->Layout();
+
+       panel_right_down->SetAutoLayout(true);
+       panel_right_down->SetSizer(medium_right_down);
+       panel_right_down->Layout();
+
+    panel_splitter_right->SetMinimumPaneSize( 50 );
+    panel_splitter_right->SplitHorizontally( panel_right_up, panel_right_down, 400 );
+
+
+
+    panel_splitter->SetMinimumPaneSize( 50 );
+    panel_splitter->SplitVertically( panel_left, panel_splitter_right, 420 );
+
+       
+       sizer_principal->Add(panel_splitter, 1, wxALL|wxEXPAND, 0);
+       sizer_principal->Add(status, 0, wxALL|wxEXPAND, 0);
+       
+       this->SetAutoLayout(true);
+       this->SetSizer(sizer_principal);
+       this->Layout();
+
+//EEDxx2.4
+//     FitInside();
+}
+
+*/
+
+//--------------------------------------------------------
+void wxQuantificationWidgetCT::Set_Data( )
+{
+       _axis_index                             = -1;
+       _given_points                   = 0;
+       _nClicks                                = 0;
+       _quantifing                             = 0;
+       
+
+       
+       _shown                                  = 0;
+       _quant_shown                    = 0;
+       
+       _actual_area                    = 0.00;
+       _actual_peri                    = 0.00;
+       _actual_darea                   = 0.00;
+       _actual_dperi                   = 0.00;
+       _actual_dmax                    = 0.00;
+       _actual_dmin                    = 0.00;
+       _actual_davg                    = 0.00;
+       _actual_sten                    = 0.00;
+       _actual_partial                 = 0.00;
+       
+
+}
+
+
+
+
+//--------------------------------------------------------
+void wxQuantificationWidgetCT::Forget( )
+{
+       _shown = false;
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::ShowMARACASData( marInterfaceCT* mar )
+{
+       double        min, max;
+       vtkImageData* imagedata;
+       int nos;
+       int actualQuant=-1;
+       
+       wxBusyCursor wait;
+       _mar = mar;
+       
+       _mar->prepareQuantification();
+       nos = _mar->getNumberOfSlices();
+
+       //MAZV se añade para manejo de contornos manuales
+       for (int i = 0; i < nos; i++)
+       {
+               _manContours.push_back(NULL);
+       }
+
+
+       actualQuant = (int) (nos-1)/2 ;
+       imagedata = _mar->getSliceImage(actualQuant);
+       
+       _mar->setActualQuant( actualQuant ) ;
+       _mar->getMinMax(min, max);
+       
+       
+       _3DWorld->ShowMARACASDataAndAxeCT( mar );
+       _3DWorld->InitCameraReset( );
+//     _2DWorld->ConstructVTK( imagedata );
+       
+
+       ConfigureVTK( new marImageData(imagedata) );
+       
+       // GUI
+       _sl_Isovalue->SetRange( (int)min, (int)max);
+       _sl_Isovalue->SetValue( (int)(max/4) );
+       _sl_Opacity->SetValue( 50 );
+       Reset_sl_Slider();
+
+// EED 02Dic2006
+//     int ww1,hh1;
+//     int ww2,hh2;
+//     int wwT,hhT;
+//     int ss;
+//     this->GetSize(&wwT,&hhT);
+//     _wxStenosisPanel->GetSize(&ww1,&hh1);
+//     _pl_cntlHealthySick2->GetSize(&ww2,&hh2);
+
+//     ss=hhT-(hh1+hh2+85);
+
+//     panel_splitter_right->SetSashPosition(ss,true);
+
+       _splitPanelPrincipal    -> SetSashPosition(600,true);
+       _splitpanel_left                -> SetSashPosition(360,true);
+       _splitpanel_right               -> SetSashPosition(200,true);
+       _splitpanel_right_down  -> SetSashPosition(230,true);
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::Reset_sl_Slider()
+{
+       int nos = _mar->getNumberOfSlices();
+       
+       _sl_Slice->SetRange(0, nos-1);
+       _sl_Slice->SetValue( (nos-1)/2 );
+
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetSlider_Isovalue_Opacity(int isovalue,int opacity){
+       _sl_Isovalue->SetValue(isovalue);
+       _sl_Opacity->SetValue(opacity);
+       _3DWorld->SetSurfaceIsoValue( isovalue );
+       _3DWorld->SetSurfaceOpacity( opacity );
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnShowSurface_CB(wxCommandEvent& event)
+{
+    _3DWorld->SetSurfaceVisibility( _cb_ShowSurface->GetValue() );
+}
+// ---------------------------------------------------------------------------
+void wxQuantificationWidgetCT::ResetAxis(){    
+       Reset_sl_Slider();
+       _mar->setActualQuant( _sl_Slice->GetValue() );
+
+       _3DWorld->Hide3DHealthySliceActor();
+       _mar->setHealthySlice( 0,-1,0 );
+       _mar->setActualQuant( _sl_Slice->GetValue() );
+
+}
+// ---------------------------------------------------------------------------
+void wxQuantificationWidgetCT::RefreshAxis( ){ 
+       int actualQuant = _mar->getActualQuant();
+       vtkImageData* imagedata;
+       vtkProbeFilter* image3D;
+       vtkPolyData* vtkPolydata_2Dcontour;
+
+// EED 26 sep 2006
+//     vtkPoints* vtkPoints_2DDiameterMin;
+//     vtkPoints* vtkPoints_2DDiameterMax;
+
+       int contours = _mar->getNumberOfContours(actualQuant);
+
+       image3D                                 = _mar->get3DSlice                      ( actualQuant );
+       imagedata                               = _mar->getSliceImage           ( actualQuant );
+
+       
+       _contourViewer->DeleteContours();
+       _lineViewer->DeleteLines();
+       _pointViewer->DeletePoints();
+       
+
+
+       
+       _pointViewer->CreateNewPoint(64,64,0);
+       for (int i = 0; i < contours; i++)
+       {
+               ;
+               vtkPolydata_2Dcontour   = _mar->get2Dcontour( actualQuant, i );
+               
+//             vtkPoints_2DDiameterMin = _mar->get2DDiameterMin        ( actualQuant, 0 );
+//             vtkPoints_2DDiameterMax = _mar->get2DDiameterMax        ( actualQuant, 0 );
+
+               if (_cb_VisibleRings->GetValue()==true){
+//                     _2DWorld->SetContour( vtkPolydata_2Dcontour );
+                       _contourViewer->CreateNewContour(vtkPolydata_2Dcontour,  _mar->getContourType(actualQuant, i));
+//                     _2DWorld->SetDiameterMin( vtkPoints_2DDiameterMin , true );
+//                     _2DWorld->SetDiameterMax( vtkPoints_2DDiameterMax , true );
+               }
+       }
+
+       int puntos = _mar->getPointSize();
+
+       for (int j = 0; j < puntos; j++)
+       {
+               marPoint *p = _mar->getPoint(j);
+               _pointViewer->CreateNewPoint(p->getX(),p->getY(),p->getType());
+       }
+       
+
+       _3DWorld->SetImage(image3D);
+       _3DWorld->Render( );
+//     _2DWorld->SetImage(imagedata);
+       
+       RefreshView( new marImageData(imagedata) );
+
+       
+
+       
+       showVariables( );
+
+
+
+
+}
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::MoveSlider(int actualQuant){
+
+       if (actualQuant!=_bak_ActualSlice2)
+       {
+          _bak_ActualSlice2=actualQuant;
+               if (_bak_ActualSlice!=-1){
+                       SetManualContour_ReplaceContour();
+                       SetManualContour_2DWorld(false);
+               }
+               _mar->setActualQuant( actualQuant );
+               RefreshAxis();
+
+// EED 17 NOV 2006
+               double *p;
+               p = _mar->GetExperiment()->getAxis()->getPoints( actualQuant );
+               double spc[3];
+               _mar->getDynData()->GetMarImageData()->GetImageData()->GetSpacing(spc);
+               int nX=0,nY=0,nZ=0;
+               nX = _mar->getDynData()->GetMarImageData()->GetXOriginal( (int)(p[0]/spc[0]) );
+               nY = _mar->getDynData()->GetMarImageData()->GetYOriginal( (int)(p[1]/spc[1]) );
+               nZ = _mar->getDynData()->GetMarImageData()->GetZOriginal( (int)(p[2]/spc[2]) );
+               char resultText[50],temp[50];
+               strcpy(resultText," \n        (");
+
+//             ltoa ((int)nX,temp,10);
+               sprintf(temp,"%d",(int)nX);
+
+               strcat(resultText,temp);
+               strcat(resultText,",");
+
+//             ltoa ((int)nY,temp,10);
+               sprintf(temp,"%d",(int)nY);
+
+               strcat(resultText,temp);
+               strcat(resultText,",");
+
+//             ltoa ((int)nZ,temp,10);
+               sprintf(temp,"%d",(int)nZ);
+
+               strcat(resultText,temp);
+               strcat(resultText,")");
+               _txt_Position->SetLabel( wxString(resultText, wxConvUTF8) );
+       } // 
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnSliderSliceScroll(wxScrollEvent& event){
+       MoveSlider( event.GetPosition() );
+}
+
+// ----------------------------------------------------------------------------
+double wxQuantificationWidgetCT::GetStenosisDiameter(int sickSlice){
+       double healthyAverageDiameter = _mar->getReferenceAverDiam() ;
+       marContour *marcontourSick = _mar->getContour( sickSlice, sickSlice );
+       return doubleStenosis( healthyAverageDiameter , marcontourSick->getMinimumDiameter() );
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidgetCT::GetStenosisArea( int sickSlice){
+       double healthyArea = _mar->getReferenceArea();
+       marContour *marcontourSick = _mar->getContour( sickSlice, sickSlice );
+       return doubleStenosis( healthyArea , marcontourSick->getArea() );
+}
+// ----------------------------------------------------------------------------
+
+
+
+
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::showVariables()
+{
+// EED 26 sep 2006
+//     marContour* marcontour;
+
+       int actualQuant;
+       int healthySlice; 
+       int healthySliceStart; 
+       int healthySliceEnd; 
+       
+       actualQuant = _mar->getActualQuant( );
+//     marcontour=_mar->getContour( actualQuant, actualQuant );
+       
+       wxString tmpString;
+
+       tmpString.Printf( _T("%.2f mm")   , 20)/*_mar->getTotalLength() )*/;             _st_Value1->SetLabel(tmpString);
+
+
+       tmpString.Printf( _T("%.2f mm^2") , 20)/*marcontour->getArea())*/;                                               _st_Value2->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , 20)/*marcontour->getPerimeter())*/;                          _st_Value3->SetLabel(tmpString);
+
+       tmpString.Printf( _T("%.2f mm")   , 20)/*marcontour->getMinimumDiameter())*/;                    _st_Value6->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , 20)/*marcontour->getMaximumDiameter())*/;                    _st_Value7->SetLabel(tmpString);
+       tmpString.Printf( _T("%.2f mm")   , 20)/*marcontour->getAverageDiameter())*/;                    _st_Value8->SetLabel(tmpString);
+
+       healthySlice            = _mar->getHealthySlice( );
+       healthySliceStart       = _mar->getHealthySliceStart( );
+       healthySliceEnd         = _mar->getHealthySliceEnd( );
+       if ( (healthySlice!=-1) ) {
+               _st_Value100->SetLabel( strStenosis( GetStenosisArea(actualQuant)     ) );
+               _st_Value101->SetLabel( strStenosis( GetStenosisDiameter(actualQuant) ) );
+               tmpString.Printf( _T("%.2f mm^2") , _mar->getReferenceArea() );  _st_ValueRef102->SetLabel(tmpString);
+               tmpString.Printf( _T("%.2f mm")   , _mar->getReferenceAverDiam() ); _st_ValueRef103->SetLabel(tmpString);
+               //CAMBIAR ESTOS DOS
+       } else {
+               _st_Value100->SetLabel(_T("--"));
+               _st_Value101->SetLabel(_T("--"));
+               _st_ValueRef101->SetLabel(_T("--"));
+               _st_ValueRef102->SetLabel(_T("--"));
+               _st_ValueRef103->SetLabel(_T("--"));
+       }
+
+       int startSlice  = _mar->getQuantStart();
+       int finishSlice = _mar->getQuantFinish();
+    if ((startSlice!=-1) && (finishSlice!=-1)){
+               tmpString.Printf( _T("%.2f mm")   , _mar->getSubAxisLength() );  _st_ValueRef101->SetLabel(tmpString);
+       } else {
+               _st_ValueRef101->SetLabel(_T("--"));
+       }
+
+}
+// ----------------------------------------------------------------------------
+double wxQuantificationWidgetCT::doubleStenosis(double healthy, double sick){
+       double result;
+       if (healthy==0) {       
+               result=-1;      
+       } else {  
+               result = (    (healthy-sick)/healthy) * 100 ;   
+       }
+
+       return result;
+}
+// ----------------------------------------------------------------------------
+wxString wxQuantificationWidgetCT::strStenosis(double stenosis){
+       wxString tmpString;
+       if (stenosis==-1) {
+               tmpString.Printf(_T("%d"),-1);  
+       } else {
+               tmpString.Printf(_T("%.2f"), stenosis );        
+       }
+       return tmpString + _T(" \%");
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnSliderIsovalueScroll(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+       _3DWorld->SetSurfaceIsoValue( event.GetPosition() );
+}
+// ----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnSliderOpacityScroll(wxScrollEvent& event)
+{
+       _3DWorld->SetSurfaceOpacity( event.GetPosition() );
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::AddAxisActors(){
+
+       marAxis *maraxis = _mar->getAxis( );
+       if (maraxis!=NULL) _3DWorld->SetAxis( maraxis->Draw( ) );
+
+}
+//----------------------------------------------------------------------------
+void wxQuantificationWidgetCT::Clean3D( bool eraseAxe )
+{
+       _first_quant = -1;
+       _last_quant = -1;
+
+       _quant_shown = false;
+       
+       _3DWorld->InitListContourActor( -1,_mar->getNumberOfSlices() );
+       if (eraseAxe==true) { _3DWorld->RemoveAxis(); }
+
+
+       
+
+}
+
+void wxQuantificationWidgetCT::Reload_Axis(bool mask , bool step )
+{
+
+}
+
+
+void wxQuantificationWidgetCT::Show_Max_Min_Diameters()
+{
+
+}
+
+
+
+int wxQuantificationWidgetCT::Back( )
+{
+       int ret;
+       
+       ret = _shown;
+       _shown = 0;
+       return ret;
+}
+
+
+void wxQuantificationWidgetCT::Set_plane_3D( double  x, double y )
+{
+
+}
+
+
+
+
+
+void  wxQuantificationWidgetCT::Point_Intensity(double x, double y)
+{
+
+}
+
+
+void wxQuantificationWidgetCT::CleanContour()
+{
+
+}
+
+
+//-----------------------------------------------------------------
+// Button
+void wxQuantificationWidgetCT::Do_Quant()
+{
+
+}
+
+
+//-----------------------------------------------------------------
+void wxQuantificationWidgetCT::OnContour_BT(wxCommandEvent& event){
+       int slice=_sl_Slice->GetValue();
+    _3DWorld->Set3DContourActor( slice , _mar->get3Dcontour(slice, slice) , _cb_VisibleRings->GetValue() ,0 );
+}
+//-----------------------------------------------------------------
+void wxQuantificationWidgetCT::OnClean_BT(wxCommandEvent& event){
+       int slice=_sl_Slice->GetValue();
+       _3DWorld->Erase3DContourActor( slice );
+}
+
+//-----------------------------------------------------------------
+void wxQuantificationWidgetCT::OnCleanAll_BT(wxCommandEvent& event){
+       marDictionary marDict;
+       char tmp[256];
+
+       wxMessageDialog *wxdiag;
+       strcpy( tmp , marDict.GetString(870) ); strcat(tmp,"\n"); strcat(tmp,marDict.GetString(875));
+       wxdiag= new wxMessageDialog(this, wxString(tmp, wxConvUTF8), wxString(marDict.GetString(865), wxConvUTF8) , wxOK | wxCANCEL);//"This option erase all 3D contours.\n Do you want to continue?","Alert"
+    if ( wxdiag->ShowModal() == wxID_OK ) {
+               _3DWorld->InitListContourActor( 0, _mar->getNumberOfSlices() );
+       }            
+       wxdiag->Destroy();
+}
+
+
+
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::DetectHealthySickSlice( bool minSurf , bool maxSurf ){  
+
+       //ESTE ES EL METODO QUE SE MODIFICA PARA CALCULAR LA ESTENOSIS 
+       /*
+       wxBusyCursor wait;
+       double          stenosis;
+       double          areaB;
+       int                     iSlice;
+       int                     startslice;
+       int                     endslice;
+       double          maxStenosis                     =       -9999999;
+       double          maxArea                         =       -9999999;
+       int                     sickSlice                       =       0;
+       int                     healthySlice            =       0;
+       int                     sizeHealthyRegion       =       GetSizeHealthyRegion();
+       int                     analysisTypeStenosis=   GetAnalysisTypeStenosis();
+
+
+
+
+
+
+       GetSliceLimites(0,startslice,endslice);
+
+    if (startslice>endslice){
+               int temp=endslice;
+               endslice=startslice;
+               startslice=temp;
+       }
+
+       int backSlice;
+       if (minSurf==false) { backSlice = _sl_Slice->GetValue(); }
+
+       for (iSlice=startslice; iSlice<=endslice;iSlice++){
+
+               if (minSurf==true){
+                       // this is equal to the minimum surface/diameter
+                       if (analysisTypeStenosis==1 ){ stenosis = GetStenosisDiameter(iSlice);  }
+                       if (analysisTypeStenosis==2 ){ stenosis = GetStenosisArea(iSlice);              }
+               }
+
+               if (maxSurf==true){
+                       areaB = _mar->getAverageArea(iSlice-sizeHealthyRegion,iSlice+sizeHealthyRegion);
+                       _3DWorld->InitListContourActor( 0, _mar->getNumberOfSlices() );
+
+               }
+
+               if ((stenosis>maxStenosis) &&(minSurf==true)){
+                       maxStenosis=stenosis;
+                       sickSlice=iSlice;
+               }
+               if ((areaB>maxArea) && (maxSurf==true)){
+                       maxArea=areaB;
+                       healthySlice=iSlice;
+               }
+               MoveSlider( iSlice );
+               _sl_Slice->SetValue( iSlice );
+       }
+
+
+
+       if (minSurf==true){
+               MoveSlider( sickSlice );
+               _sl_Slice->SetValue( sickSlice );
+       }
+
+       if (maxSurf==true){
+               MoveSlider( healthySlice );
+               _sl_Slice->SetValue( healthySlice );
+       }
+*/
+}
+
+
+
+
+//------------------------------------------------------------------------
+int wxQuantificationWidgetCT::GetHealthySlice(){
+       return _mar->getHealthySlice( );
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetHealthySlice(int healthySlice){      
+       if (healthySlice==-1) {
+               healthySlice=_sl_Slice->GetValue();
+       }
+       /*int sizeHealthyRegion = GetSizeHealthyRegion();
+       int maxSlider                   = GetMaxActualSlice();
+       int healthySliceStart   = healthySlice - sizeHealthyRegion;
+       int healthySliceEnd             = healthySlice + sizeHealthyRegion;
+       if (healthySliceStart < 0)         { healthySliceStart = 0;                     }
+       if (healthySliceEnd   < 0)         { healthySliceEnd   = 0;                     }
+       if (healthySliceStart > maxSlider) { healthySliceStart = maxSlider; }
+       if (healthySliceEnd   > maxSlider) { healthySliceEnd   = maxSlider; }
+       _mar->setHealthySlice( healthySliceStart, healthySlice , healthySliceEnd);
+
+       _3DWorld->Set3DHealthySliceActor(  );
+       _3DWorld->Show3DHealthySliceActor();
+       _cb_HealthySlice->SetValue(true);
+       _3DWorld->InitListContourActor( 1, _mar->getNumberOfSlices() );
+       int iHealthySlice;
+       for ( iHealthySlice=healthySliceStart ; iHealthySlice<=healthySliceEnd ; iHealthySlice++){
+               _3DWorld->Set3DContourActor( iHealthySlice , _mar->get3Dcontour(iHealthySlice, iHealthySlice) , true ,1);
+       }
+       showVariables();*/
+}
+
+
+
+
+
+//--------------------------------------------------------------------
+// CheckBox
+void wxQuantificationWidgetCT::OnHealthySlice_CB(wxCommandEvent& event)
+{
+
+
+       int healthySlice = _mar->getHealthySlice( );
+       if (healthySlice!=-1) {
+               if ( _cb_HealthySlice->GetValue() )
+                       _3DWorld->Show3DHealthySliceActor();
+               else
+                       _3DWorld->Hide3DHealthySliceActor();
+       }
+}
+
+
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnVisibleRing_CB(wxCommandEvent& event){
+       if ( _cb_VisibleRings->GetValue() ){
+               _3DWorld->Show3DContourActor();
+//             _2DWorld->Show2DContourDiameters();
+               RefreshAxis();
+       } else {
+               _3DWorld->Hide3DContourActor();
+//             _2DWorld->Hide2DContourDiameters();
+       }
+
+
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnPerpendicular_CB(wxCommandEvent& event)
+{
+       if ( _cb_Perpendicular->GetValue() )
+               _3DWorld->Show3DSliceActor();
+       else
+               _3DWorld->Hide3DSliceActor();
+}
+//--------------------------------------------------------------------
+// RadioButton
+void wxQuantificationWidgetCT::OnGreyScale_RB(wxCommandEvent& event){
+       if ( _rb_GreyScale->GetValue() ){
+               _3DWorld->SetBWLookUp();
+       }
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnColor_RB(wxCommandEvent& event){
+       if ( _rb_Color->GetValue() ){
+               _3DWorld->SetColorLookUp();
+       }
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::CallBackOnLeftDClick( wxMouseEvent& event ){
+
+       double pp[3], cp[3];
+       _3DWorld->GetLast3DClickPoint(pp,cp);
+
+       int i,iback,maxPoints;
+       double *c, cc[3];
+       double dist,distMin=-1;
+       iback=-1;
+       
+    marAxis *maraxis = _mar->getAxis( );
+       maxPoints = maraxis->getNumberOfSplinePoints();
+       for ( i=0 ; i<maxPoints ; i++ ){
+               c = maraxis->getSplinePoint(i); 
+               cc[0]=c[0]-pp[0];
+               cc[1]=c[1]-pp[1];
+               cc[2]=c[2]-pp[2];
+               dist=sqrt( cc[0]*cc[0] + cc[1]*cc[1] + cc[2]*cc[2] );
+               if ((distMin==-1) || (dist<distMin)) {
+                       iback=i;
+                       distMin=dist;
+               }
+       }
+       _sl_Slice->SetValue(iback);
+       MoveSlider(iback);
+
+}
+
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::CallBackOnMouseWheel( wxMouseEvent& event ){
+       int slice=_sl_Slice->GetValue();
+       if (event.GetWheelRotation()>0){ slice++; }
+       if (event.GetWheelRotation()<0){ slice--; }
+    if (slice < _sl_Slice->GetMin() ) { slice=_sl_Slice->GetMin(); }
+    if (slice > _sl_Slice->GetMax() ) { slice=_sl_Slice->GetMax(); }
+    _sl_Slice->SetValue(slice);
+       MoveSlider(slice);
+}
+//--------------------------------------------------------------------
+int wxQuantificationWidgetCT::GetActualSlice(){
+       return _sl_Slice->GetValue();
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetActualSlice(int slice){
+       _sl_Slice->SetValue(slice);
+       MoveSlider(slice);
+}
+//--------------------------------------------------------------------
+int wxQuantificationWidgetCT::GetMaxActualSlice(){
+       return _sl_Slice->GetMax();
+}
+//--------------------------------------------------------------------
+int  wxQuantificationWidgetCT::GetSizeHealthyRegion(){
+       return _sizeHealthyRegion;
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetSizeHealthyRegion(int size){
+       _sizeHealthyRegion = size;
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::GetHealthySliceRange(int &healthySliceStart,int &healthySliceEnd){
+       healthySliceStart       = _mar->getHealthySliceStart( );
+       healthySliceEnd         = _mar->getHealthySliceEnd( );
+       
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Set3DRegionSliceActor( int type, int k1,int k2 ){
+       _3DWorld->Set3DRegionSliceActor(type,k1,k2);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Set3DStartRegionSliceActor( int type, int k){
+//     _3DWorld->Set3DStartRegionSliceActor(type,k);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Set3DEndRegionSliceActor( int type, int k){
+//     _3DWorld->Set3DEndRegionSliceActor(type,k);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Show3DRegionSliceActor( int type ){
+       _3DWorld->Show3DRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Show3DStartRegionSliceActor( int type ){
+       _3DWorld->Show3DStartRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Show3DEndRegionSliceActor( int type ){
+       _3DWorld->Show3DEndRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Hide3DRegionSliceActor( int type ){
+       _3DWorld->Hide3DRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Hide3DStartRegionSliceActor( int type ){
+       _3DWorld->Hide3DStartRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::Hide3DEndRegionSliceActor( int type ){
+       _3DWorld->Hide3DEndRegionSliceActor(type);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::GetSliceLimites(int type, int &sliceStart, int &sliceEnd){
+       _3DWorld->GetSliceLimites(type,sliceStart,sliceEnd);
+}
+//--------------------------------------------------------------------
+int wxQuantificationWidgetCT::GetAnalysisTypeStenosis(){
+       return _3DWorld->GetAnalysisTypeStenosis();
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetAnalysisTypeStenosis(int analysisTypeStenosis){
+       _3DWorld->SetAnalysisTypeStenosis(analysisTypeStenosis);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetManualContour_2DWorld(bool ok){
+
+       if (ok==false){ 
+//             _2DWorld->SetState(1);
+//             _2DWorld->EraseManualContour();
+       }
+       if (ok==true){  
+       //      _2DWorld->SetState(2);
+       //      _2DWorld->CreateNewManualContour();
+       }
+
+}
+//--------------------------------------------------------------------
+//TODO: SIM - MODIFICAR PARA VARIOS CONTORNOS
+void wxQuantificationWidgetCT::SetManualContour_AddPoint_2DWorld(){
+       _bak_ActualSlice        = _sl_Slice->GetValue();
+//     _2DWorld->Hide2DContourDiameters();
+       //ESTE NO EXISTE
+       _mar->EraseContour(_bak_ActualSlice);
+       
+       _3DWorld->Erase3DContourActor( _bak_ActualSlice );
+
+//     _2DWorld->SetStateManualContour(0);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetManualContour_InsertPoint_2DWorld(){
+//     _2DWorld->SetStateManualContour(2);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetManualContour_ErasePoint_2DWorld(){
+//     _2DWorld->SetStateManualContour(3);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetManualContour_MovePoint_2DWorld(){
+//     _2DWorld->SetStateManualContour(4);
+}
+//--------------------------------------------------------------------
+void wxQuantificationWidgetCT::SetManualContour_ReplaceContour(){
+/*     if (_bak_ActualSlice!=-1){
+               int size                = _2DWorld->GetNumberOfPointsSplineManualContour();
+               double *vx              = _2DWorld->GetVectorPointsXManualContour();
+               double *vy              = _2DWorld->GetVectorPointsYManualContour();
+               
+               _mar->replaceContour2D(_bak_ActualSlice,size,vx,vy);
+               free(vx);
+               free(vy);
+               RefreshAxis();
+               _bak_ActualSlice=-1;
+       }*/
+       //TODO El remplazo de contornos debe cambiar
+}
+//------------------------------------------------------------------------
+kVolume* wxQuantificationWidgetCT::GetVolumeAxisExtended(int wz1,int wz2)
+{
+       // Create Volume
+       vtkImageData *imagedata;
+       imagedata=_mar->getSliceImage(wz1);
+       int dims[3];
+       imagedata->GetDimensions (dims);
+       int wx=dims[0];
+       int wy=dims[1];
+       int wz  = wz2-wz1+1;
+       kVolume *kvol =new kVolume( kVolume::USHORT, wx, wy, wz,1, 1, 1, malloc(sizeof(unsigned short)*wx*wy*wz ) );
+       vtkImageData *vol = kvol->castVtk();
+
+       // Fill Volume
+       int i;
+       for (i=wz1;i<=wz2;i++)
+       {
+               // GetImage
+               imagedata=_mar->getSliceImage(i);
+
+               // InsertImage
+            void *p_imagedata  = imagedata->GetScalarPointer(0,0,0);
+                void *p_vol            = vol->GetScalarPointer(0,0,i-wz1);
+         memcpy( p_vol, p_imagedata , sizeof(unsigned short)*dims[0]*dims[1] );
+       }
+       return kvol;
+}
+
+//-------------------------------------------------------------------
+wxWindow* wxQuantificationWidgetCT::CreateView2DPanel(wxWindow *parent)
+{
+       wxPanel         *panel  =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+
+       _imageviewer2D_1 = new wxVtk2DBaseView(panel);
+       wxVTKRenderWindowInteractor *iren   = _imageviewer2D_1->GetWxVTKRenderWindowInteractor();
+       sizer->Add(iren , 1, wxEXPAND, 0);
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::Refresh()
+{
+       _imageviewer2D_1->Refresh();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::RefreshView(marImageData *marimagedata)
+{
+       vtkImageData *imagedata= marimagedata->GetImageData(); // t=0
+       _imageviewer2D_1->SetActualSlice(0);
+       imagedata->UpdateInformation();
+       imagedata->SetUpdateExtent(imagedata->GetWholeExtent());
+       imagedata->Update();
+       _data = imagedata;
+       
+       _vtkbasedata_1->SetMarImageData(marimagedata);  
+       _imageviewer2D_1->ResetView();
+
+       int i;
+       for (i = 0; i < _manContours.size(); i++)
+       {
+               if (_manContours[i] !=NULL)
+               {
+                       _manContours[i]->clear();
+               }
+       }
+
+       for (i = 0; i < _manContours.size(); i++)
+       {
+               if (_manContours[i] !=NULL)
+               {
+                       _manContours[i]->refreshWall(_imageviewer2D_1);
+                       _manContours[i]->refreshLumen(_imageviewer2D_1);
+
+                       int j; 
+                       for (j = 0; j < _manContours[i]->getNumberOfCalcContours(); j++)
+                       {
+                               _manContours[i]->refreshCalc(j,_imageviewer2D_1);
+                       }
+
+                       for (j = 0; j < _manContours[i]->getNumberOfHypoContours(); j++)
+                       {
+                               _manContours[i]->refreshHypo(j,_imageviewer2D_1);
+                               
+                       }
+
+                       
+               }
+                       
+               
+
+       }
+
+
+       
+               
+/*     _mViewContourWall->ClearContour();
+       _mViewContourLumen->ClearContour();
+       
+       delete _mViewContourWall;
+       delete _manContourControlWall;
+       delete _mContourModelWall;
+       
+       delete _mViewContourLumen;
+       delete _manContourControlLumen;
+       delete _mContourModelLumen;
+*/
+       CreateManualContours();
+
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::ConfigureVTK(marImageData *marimagedata)
+{
+   wxBusyCursor wait;
+
+       vtkImageData *imagedata=marimagedata->GetImageData(); // t=0
+       imagedata->UpdateInformation();
+       imagedata->SetUpdateExtent(imagedata->GetWholeExtent());
+       imagedata->Update();
+       _data = imagedata;
+       _vtkbasedata_1 = new vtkBaseData();
+       _vtkbasedata_1->SetMarImageData(marimagedata);  
+       _imageviewer2D_1->SetVtkBaseData( _vtkbasedata_1 );
+       _imageviewer2D_1->Configure();
+
+
+       _contourViewer = new ContourView();
+       _contourViewer->SetWxVtkBaseView(_imageviewer2D_1);
+       _lineViewer = new LineView();
+       _lineViewer->SetWxVtkBaseView(_imageviewer2D_1);
+       _pointViewer = new PointView();
+       _pointViewer->SetWxVtkBaseView(_imageviewer2D_1);
+       CreateManualContours();
+       Refresh();      
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnContourWall()
+{
+       if (_manContours[_mar->getActualQuant()]->getWallController() == NULL)
+       {
+               _manContours[_mar->getActualQuant()]->createWallContour(_imageviewer2D_1);
+               _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( 
+                                               _manContours[_mar->getActualQuant()]->getWallController() );
+       }
+       _manContours[_mar->getActualQuant()]->setWallActive();
+       _manContours[_mar->getActualQuant()]->setWallVisibility(true);
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnContourLumen()
+{
+       if (_manContours[_mar->getActualQuant()]->getLumenController() == NULL)
+       {
+               _manContours[_mar->getActualQuant()]->createLumenContour(_imageviewer2D_1);
+               _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( 
+                                               _manContours[_mar->getActualQuant()]->getLumenController() );
+       }
+       _manContours[_mar->getActualQuant()]->setLumenActive();
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnContourHypo()
+{
+       
+
+
+       if (_manContours[_mar->getActualQuant()]->getNumberOfHypoContours() > 0)
+       {
+
+               int answer = wxMessageBox(_T("Create new hypodense contour? (answer no, will modify existing ones)"), 
+                                               _T("Confirm"), wxYES_NO | wxCANCEL, this);
+
+               if (answer == wxYES)
+               {
+                       addManualContours(HYPODENSE);
+                       int tam = _manContours[_mar->getActualQuant()]->getNumberOfHypoContours() - 1;
+                       _manContours[_mar->getActualQuant()] -> setHypoContourActive(tam);
+
+               }
+               else if (answer == wxNO)
+               {
+                       _manContours[_mar->getActualQuant()] ->setHypoActive();
+               }
+       }
+       else
+       {
+               addManualContours(HYPODENSE);
+               int tam = _manContours[_mar->getActualQuant()]->getNumberOfHypoContours() - 1;
+               _manContours[_mar->getActualQuant()] -> setHypoContourActive(tam);
+       }
+       
+
+
+
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnContourCalc()
+{
+
+
+       if (_manContours[_mar->getActualQuant()]->getNumberOfCalcContours() > 0)
+       {
+
+               int answer = wxMessageBox(_T("Create new calcification contour? (answer no, will modify existing ones)"), 
+                                               _T("Confirm"), wxYES_NO | wxCANCEL, this);
+
+               if (answer == wxYES)
+               {
+                       addManualContours(CALCIFICATION);
+                       int tam = _manContours[_mar->getActualQuant()]->getNumberOfCalcContours() - 1;
+                       _manContours[_mar->getActualQuant()] -> setCalcContourActive(tam);
+
+               }
+               else if (answer == wxNO)
+               {
+                       _manContours[_mar->getActualQuant()] ->setCalcActive();
+               }
+       }
+       else
+       {
+               addManualContours(CALCIFICATION);
+               int tam = _manContours[_mar->getActualQuant()]->getNumberOfCalcContours() - 1;
+               _manContours[_mar->getActualQuant()] -> setCalcContourActive(tam);
+       }
+
+}
+
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnReplaceContourWall()
+{
+
+       int size = _manContours[_mar->getActualQuant()]->getNumberOfWallContourPoints();
+       double *vx = _manContours[_mar->getActualQuant()]->getXVectorWallPoints();
+       double *vy = _manContours[_mar->getActualQuant()]->getYVectorWallPoints();
+
+
+       _mar->cleanContours(WALL);
+       _mar->replaceContour2D(size,vx,vy,WALL);
+       _manContours[_mar->getActualQuant()]->clearWall();
+       _manContours[_mar->getActualQuant()]->restartWallContour(_imageviewer2D_1);
+       RefreshAxis();
+
+
+
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnReplaceContourLumen()
+{
+       int size = _manContours[_mar->getActualQuant()]->getNumberOfLumenContourPoints();
+       double *vx = _manContours[_mar->getActualQuant()]->getXVectorLumenPoints();
+       double *vy = _manContours[_mar->getActualQuant()]->getYVectorLumenPoints();
+
+       _mar->cleanContours(ELUMEN);
+       _mar->replaceContour2D(size,vx,vy,ELUMEN);
+       _manContours[_mar->getActualQuant()]->clearLumen();
+       _manContours[_mar->getActualQuant()]->restartLumenContour(_imageviewer2D_1);
+       RefreshAxis();
+
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnReplaceContourCalc()
+{
+       int conts = _manContours[_mar->getActualQuant()]->getNumberOfCalcContours();
+
+       _mar->cleanContours(CALCIFICATION);
+       for (int i = 0; i < conts; i++)
+       {
+               int size = _manContours[_mar->getActualQuant()]->getNumberOfCalcContourPoints(i);
+               double *vx = _manContours[_mar->getActualQuant()]->getXVectorCalcPoints(i);
+               double *vy = _manContours[_mar->getActualQuant()]->getYVectorCalcPoints(i);
+               _mar->replaceContour2D(size,vx,vy,CALCIFICATION);
+       }
+       _manContours[_mar->getActualQuant()]->clearCalc();
+       _manContours[_mar->getActualQuant()]->restartCalcContours();
+       RefreshAxis();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnReplaceContourHypo()
+{
+/*     int conts = _manContours[_mar->getActualQuant()]->getNumberOfHypoContours();
+
+       _mar->cleanContours(HYPODENSE);
+       for (int i = 0; i < conts; i++)
+       {
+               int size = _manContours[_mar->getActualQuant()]->getNumberOfHypoContourPoints(i);
+               double *vx = _manContours[_mar->getActualQuant()]->getXVectorHypoPoints(i);
+               double *vy = _manContours[_mar->getActualQuant()]->getYVectorHypoPoints(i);
+       }
+
+       _manContours[_mar->getActualQuant()]->clearHypo();
+       _manContours[_mar->getActualQuant()]->restartHypoContours();
+       RefreshAxis();*/
+       performXOR();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::performXOR()
+{
+       if (_manContours [_mar->getActualQuant()]->getWallController() != NULL)
+       {
+               int size = _manContours[_mar->getActualQuant()]->getNumberOfWallContourPoints();
+               double *vx = _manContours[_mar->getActualQuant()]->getXVectorWallPoints();
+               double *vy = _manContours[_mar->getActualQuant()]->getYVectorWallPoints();      
+
+               marIsocontour* m = _mar->loadMarIsocontour(size,vx,vy);
+               std::vector<marIsocontour *> walls;
+
+               walls.push_back(m);
+
+               double intersection = _mar->performUnion(WALL,walls);
+               double xor_ = _mar->performXOR(WALL,walls);
+               
+               xor_ = xor_ / intersection;
+               wxLogMessage(wxString("Indice XOR (pared): %f", wxConvUTF8), xor_*100);
+
+               double and_ = _mar->performAND(WALL,walls);
+               and_ = and_/ intersection;
+               
+               
+               wxLogMessage(wxString("Indice AND (pared): %f", wxConvUTF8), and_*100);
+
+               
+               wxLogMessage(wxString("Indice Unión (pared): %f", wxConvUTF8), intersection);
+
+               double razon = 0;
+
+
+               if (and_ == 0)
+               {
+                       razon = -1;
+               }
+               else
+               {
+                       razon = xor_ / and_;
+               }
+
+               wxLogMessage(wxString("Razón (pared): %f", wxConvUTF8), razon);
+       }
+               else
+       {
+               wxLogMessage(wxString("SIN INFORMACION PARED", wxConvUTF8));
+       }       
+
+       //LUMEN
+
+       if (_manContours [_mar->getActualQuant()]->getLumenController() != NULL)
+       {
+               int size = _manContours[_mar->getActualQuant()]->getNumberOfLumenContourPoints();
+               double* vx = _manContours[_mar->getActualQuant()]->getXVectorLumenPoints();
+               double* vy = _manContours[_mar->getActualQuant()]->getYVectorLumenPoints();
+               marIsocontour* m = _mar->loadMarIsocontour(size,vx,vy);
+               std::vector<marIsocontour *> lumen;
+
+
+               lumen.push_back(m);
+               double intersection = _mar->performUnion(ELUMEN,lumen);
+               double xor_ = _mar->performXOR(ELUMEN,lumen);
+               xor_ = xor_ / intersection;
+               wxLogMessage(wxString("Indice OR (lumen): %f", wxConvUTF8), xor_*100);
+
+               double and_ = _mar->performAND(ELUMEN,lumen);
+               and_ = and_/ intersection;
+               wxLogMessage(wxString("Indice AND (lumen): %f", wxConvUTF8), and_*100);
+
+               
+               wxLogMessage(wxString("Indice Unión (pared): %f", wxConvUTF8), intersection);
+
+               double razon = 0;
+
+               if (and_ == 0)
+               {
+                       razon = -1;
+               }
+               else
+               {
+                       razon = xor_ / and_;
+               }
+               wxLogMessage(wxString("Razón (lumen): %f", wxConvUTF8), razon);
+       }
+       else
+       {
+               wxLogMessage(wxString("SIN INFORMACION LUMEN", wxConvUTF8));
+       }
+       
+
+       
+
+       //CALC
+       int conts = _manContours[_mar->getActualQuant()]->getNumberOfCalcContours();
+
+       std::vector<marIsocontour *> calc;
+       for (int i = 0; i < conts; i++)
+       {
+               int size = _manContours[_mar->getActualQuant()]->getNumberOfCalcContourPoints(i);
+               double* vx = _manContours[_mar->getActualQuant()]->getXVectorCalcPoints(i);
+               double* vy = _manContours[_mar->getActualQuant()]->getYVectorCalcPoints(i);
+               marIsocontour* m = _mar->loadMarIsocontour(size,vx,vy);
+               calc.push_back(m);
+       }
+
+       if (conts > 0)
+       {
+               double intersection = _mar->performUnion(CALCIFICATION,calc);
+               double xor_ = _mar->performXOR(CALCIFICATION,calc);
+               xor_ = xor_ /intersection;
+
+               wxLogMessage(wxString("Indice OR (calc): %f", wxConvUTF8), xor_*100);
+
+               double and_ = _mar->performAND(CALCIFICATION,calc);
+               and_ = and_ / intersection;
+               wxLogMessage(wxString("Indice AND (calc): %f", wxConvUTF8), and_*100);
+
+               
+               wxLogMessage(wxString("Indice Unión (pared): %f", wxConvUTF8), intersection);
+
+               double razon = 0;
+
+               if (and_ == 0)
+               {
+                       razon = -1;
+               }
+               else
+               {
+                       razon = xor_ / and_;
+               }
+
+               wxLogMessage(wxString("Razón (calc): %f", wxConvUTF8), razon);
+       }
+       else
+       {
+               wxLogMessage(_T("INFORMACION NO DISPONIBLE PARA CALCIFICACION"));
+       }
+       
+}
+
+void wxQuantificationWidgetCT::performAND()
+{
+
+       int size = _manContours[_mar->getActualQuant()]->getNumberOfWallContourPoints();
+       double *vx = _manContours[_mar->getActualQuant()]->getXVectorWallPoints();
+       double *vy = _manContours[_mar->getActualQuant()]->getYVectorWallPoints();      
+
+       marIsocontour* m = _mar->loadMarIsocontour(size,vx,vy);
+       std::vector<marIsocontour *> walls;
+
+       walls.push_back(m);
+
+       
+
+
+}
+
+void wxQuantificationWidgetCT::getIndex()
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnSliderDiscontinuityScroll(int percentage)
+{
+       _mar->updateDiscontinuityThreshold(percentage);
+       RefreshAxis();
+       
+}
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnSliderLumenPercentageScroll(int percentage)
+{
+       _mar->updateLumenPercentage(percentage);
+       _contourViewer->Refresh();
+}
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnCalibration() 
+{
+
+       int actual = _mar->getActualQuant();
+       _mar->ClearContoursPartial(actual - 1);
+       _mar->setStartIndex(actual);
+       _mar->setCalibration(true);
+
+       wxLogMessage(_T("Contours calibrated"));
+       _mar->markUpLumen(actual);
+       RefreshAxis(); 
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnFile()
+{
+       
+       _mar->generateFile();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnShowAll(bool value) 
+{
+       OnShowWall(value);
+       OnShowLumen(value);
+       OnShowCalc(value);
+       OnShowHypo(value);
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnShowWall(bool value)
+{
+
+       _manContours[_mar->getActualQuant()]->setWallVisibility(value);
+       _imageviewer2D_1->Refresh();
+       _imageviewer2D_1->RefreshView();
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnShowLumen(bool value)
+{
+       _manContours[_mar->getActualQuant()]->setLumenVisibility(value);
+       _imageviewer2D_1->Refresh();
+       _imageviewer2D_1->RefreshView();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnShowCalc(bool value)
+{
+       _manContours[_mar->getActualQuant()]->setCalcVisibility(value);
+       _imageviewer2D_1->Refresh();
+       _imageviewer2D_1->RefreshView();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnShowHypo(bool value)
+{
+       _manContours[_mar->getActualQuant()]->setHypoVisibility(value);
+       _imageviewer2D_1->Refresh();
+       _imageviewer2D_1->RefreshView();
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::OnSliderCalcPercentageScroll(int percentage)
+{
+       int actual = _mar->getActualQuant();
+       _mar->updateCalcPercentage(percentage);
+       _contourViewer->Refresh();
+       //_mar->markUpLumen(actual);
+       RefreshAxis();
+       
+}
+
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::CreateManualContours()
+{
+       
+
+       for (int i = 0; i < _mar->getNumberOfSlices(); i++)
+       {
+               if (_manContours[i] != NULL && _mar->getActualQuant() != i)
+               {
+                       _manContours[i]->setWallVisibility(false);
+                       _manContours[i]->setLumenVisibility(false);
+                       _manContours[i]->setCalcVisibility(false);
+                       _manContours[i]->setHypoVisibility(false);
+                       _manContours[i]->inactivate();  
+               }
+       }
+
+       _imageviewer2D_1->Refresh();
+
+// EED 31 Mai 2007
+//_imageviewer2D_1->RefreshView();
+
+       if (_manContours[_mar->getActualQuant()] == NULL)
+       {
+               _manContours[_mar->getActualQuant()] = new manualContourContainer();
+               
+       /*      _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContours[_mar->getActualQuant()]->getWallController() );
+               _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContours[_mar->getActualQuant()]->getLumenController() );*/
+       }
+       else
+       {
+               _manContours[_mar->getActualQuant()]->setWallVisibility(true);
+               _manContours[_mar->getActualQuant()]->setLumenVisibility(true);
+               _manContours[_mar->getActualQuant()]->setCalcVisibility(true);
+               _manContours[_mar->getActualQuant()]->setHypoVisibility(true);
+               _imageviewer2D_1->Refresh();
+               _imageviewer2D_1->RefreshView();
+       }
+
+
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidgetCT::addManualContours(int type)
+{
+       int tam = 0;
+       
+       if (type == CALCIFICATION)
+       {
+               tam = _manContours[_mar->getActualQuant()]->addCalcificationContour(_imageviewer2D_1);
+               _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContours[_mar->getActualQuant()]->getCalcController(tam) );
+       }
+       else if (type == HYPODENSE)
+       {
+               tam = _manContours[_mar->getActualQuant()]->addHypodenseContour(_imageviewer2D_1);
+               _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContours[_mar->getActualQuant()]->getHypoController(tam) );
+       }
+}
+
+
+// EOF - wxQuantificationWidgetCT.cxx
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidgetCT.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidgetCT.h
new file mode 100644 (file)
index 0000000..871c968
--- /dev/null
@@ -0,0 +1,452 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxQuantificationWidgetCT.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__QUANTIF__CT__WDG__HXX__
+#define __WX__MARACAS__QUANTIF__CT__WDG__HXX__
+
+
+#include "vtk3DQuantSurfaceWidget.h"
+#include "vtk2DQuantSliceWidget.h"
+#include "wxImageViewerWidget.h"
+
+#include "wxChart.h"
+
+#include <wx/wx.h>
+#include <wx/slider.h>
+#include <wx/panel.h>
+#include <wx/minifram.h>
+#include <wx/splitter.h>
+#include <kernel/marInterfaceCT.h>
+#include "wxQuantificationWidget_base.h"
+#include "ContourView.h"
+#include "PointView.h"
+#include "LineView.h"
+#include "../manualContourContainer.h"
+#include <vector>
+
+
+
+class wxQuantificationWidgetCT : public wxQuantificationWidget_base
+{
+public:
+
+  enum WidgetsIDs { 
+    ID_QUANTIF3D = wxID_HIGHEST + 1 
+  };
+
+  enum  FunctionIDs {
+    ID_BUTTON_CONTOUR = wxID_HIGHEST + 1,
+    ID_BUTTON_CLEAN,
+    ID_BUTTON_CLEAN_ALL,
+    ID_BUTTON_AUTOQUANT,
+    ID_BUTTON_HEALTHY,
+    ID_BUTTON_CALCULATED,
+    ID_BUTTON_PAUSE,
+    ID_BUTTON_DELETE,
+    ID_BUTTON_POINT
+  };
+  
+  enum  ParamIDs {
+    ID_CHECKBOX_HEALTHY = wxID_HIGHEST + 1,
+    ID_CHECKBOX_PERPENDICULAR,
+    ID_CHECKBOX_VISIBLE_RINGS,
+    ID_CHECKBOX_SHOW_SURFACE,
+    ID_RADIOBUTTON_GREYSCALE,
+    ID_RADIOBUTTON_COLOR,
+    ID_SLIDER_SLICE,
+    ID_SLIDER_SLICE22,
+    ID_SLIDER_ISOVALUE,
+    ID_SLIDER_OPACITY
+};
+
+  
+
+  // Constructor &  Destructor
+  wxQuantificationWidgetCT(wxWindow* parent, wxWindowID id = -1,
+                         const wxPoint& pos = wxDefaultPosition,
+                         const wxSize& size = wxDefaultSize,
+                         long style = 0/*wxScrolledWindowStyle*/,
+                         const wxString& name = wxPanelNameStr);
+  
+  ~wxQuantificationWidgetCT( );
+    
+  // Initialize
+
+//  void Set_control( );
+//  void Do_layout( );
+  void Set_Data( );
+
+//EED  void Positionate( );
+  void Forget( );
+  void Reload_Axis(bool mask, bool step);
+  void Show_Max_Min_Diameters( );
+  int  Back( );
+  void AddAxisActors();
+  void Clean3D( bool eraseAxe = false  );
+  void ResetAxis( );
+  void RefreshAxis( );
+//EED  void Refresh_Quant( );
+  void Point_Intensity(double x, double y);
+  void Set_plane_3D( double  x, double y );
+  void CleanContour();
+
+
+  //Button
+  void Do_Quant( );
+  void OnContour_BT(wxCommandEvent& event);
+  void OnClean_BT(wxCommandEvent& event);
+  void OnCleanAll_BT(wxCommandEvent& event);
+
+
+  void OnAutoQuantification_BT(wxCommandEvent& event);
+
+
+
+  void DetectHealthySickSlice( bool minSurf , bool maxSurf );
+    
+  //CheckBox
+  void OnHealthySlice_CB(wxCommandEvent& event);
+  void OnShowSurface_CB(wxCommandEvent& event);
+  void OnVisibleRing_CB(wxCommandEvent& event);
+  void OnPerpendicular_CB(wxCommandEvent& event);
+    
+  // RadioButton
+  void OnGreyScale_RB(wxCommandEvent& event);
+  void OnColor_RB(wxCommandEvent& event);
+    
+  //Slider
+  void OnSliderSliceScroll(wxScrollEvent& event);
+  void OnSliderIsovalueScroll(wxScrollEvent& event);
+  void OnSliderOpacityScroll(wxScrollEvent& event);
+  
+  int  GetActualSlice();
+  void SetActualSlice(int slice);
+  int  GetMaxActualSlice();
+  int  GetHealthySlice();
+  void GetHealthySliceRange(int &healthySliceStart,int &healthySliceEnd);
+  int  GetSizeHealthyRegion();
+  void SetSizeHealthyRegion(int size);
+  void SetHealthySlice(int healthySlice=-1);   
+
+  void MoveSlider(int actualQuant);
+
+
+  void ShowMARACASData( marInterfaceCT* mar );
+  void CallBackOnMouseWheel( wxMouseEvent& event );
+  void CallBackOnLeftDClick( wxMouseEvent& event );
+
+  void Set3DRegionSliceActor( int type, int k1,int k2 );
+  void Set3DStartRegionSliceActor( int type, int k );
+  void Set3DEndRegionSliceActor( int type, int k );
+
+  void Show3DRegionSliceActor(int type );
+  void Show3DStartRegionSliceActor(int type );
+  void Show3DEndRegionSliceActor(int type );
+
+  void Hide3DRegionSliceActor(int type );
+  void Hide3DStartRegionSliceActor(int type );
+  void Hide3DEndRegionSliceActor(int type );
+  void GetSliceLimites(int type, int &sliceStart,int &sliceEnd);
+
+  int  GetAnalysisTypeStenosis();
+  void SetAnalysisTypeStenosis(int analysisTypeStenosis);
+
+  void SetSlider_Isovalue_Opacity(int isovalue,int opacity);
+  void SetManualContour_2DWorld(bool ok);
+  void SetManualContour_AddPoint_2DWorld();
+  void SetManualContour_InsertPoint_2DWorld();
+  void SetManualContour_ErasePoint_2DWorld();
+  void SetManualContour_MovePoint_2DWorld();
+  void SetManualContour_ReplaceContour();
+
+  kVolume *GetVolumeAxisExtended(int wz1,int wz2);
+
+
+  void Refresh();
+  void RefreshView(marImageData *marimagedata);
+  void ConfigureVTK(marImageData *marimagedata);
+
+  void OnContourWall();
+  void OnContourLumen();
+  void OnContourHypo();
+  void OnContourCalc();
+  void OnReplaceContourWall();
+  void OnReplaceContourLumen();
+  void OnReplaceContourHypo();
+  void OnReplaceContourCalc();
+
+  void OnSliderDiscontinuityScroll(int percentage);
+  void OnSliderLumenPercentageScroll(int percentage);
+  void OnSliderCalcPercentageScroll(int percentage);
+  void OnCalibration();
+  void OnFile();
+
+  void OnShowAll(bool value); 
+  void OnShowWall(bool value);
+  void OnShowLumen(bool value);
+  void OnShowCalc(bool value);
+  void OnShowHypo(bool value);
+
+  void performXOR();
+  void performAND();
+  void getIndex();
+
+private:
+
+enum ContourTypes
+       {
+               WALL = 1,              /*!< Wall Type. */ 
+               CALCIFICATION,     /*!< Calcification Type. */  
+               HYPODENSE,          /*!< Hypodense Type. */
+               ELUMEN                          /*!< Extracted Lumen */
+       };
+
+       
+
+  // App
+  marInterfaceCT                       *_mar;
+  
+  // VTK
+  vtk3DQuantSurfaceWidget      *_3DWorld;
+//  vtk2DQuantSliceWidget              *_2DWorld;
+
+  //Visualization
+  wxVtk2DBaseView                      *_imageviewer2D_1;
+  vtkImageData                         *_data;
+  vtkBaseData                          *_vtkbasedata_1;
+
+
+  //Manual Contour Wall
+  /*manualContourControler     *_manContourControlWall;
+  manualContourModel           *_mContourModelWall;
+  manualViewContour                    *_mViewContourWall;
+
+  //Manual Contour Lumen
+  manualContourControler       *_manContourControlLumen;
+  manualContourModel           *_mContourModelLumen;
+  manualViewContour                    *_mViewContourLumen;
+
+  //Manual Contour Calc
+  std::vector <manualContourControler *> _manContourControlCalc;
+  std::vector <manualContourModel *> _mContourModelCalc;
+  std::vector <manualViewContour *> _mViewContourCalc;
+
+  //Manual Contour Hypo
+  std::vector <manualContourControler *> _manContourControlHypo;
+  std::vector <manualContourModel *> _mContourModelHypo;
+  std::vector <manualViewContour *> _mViewContourHypo; 
+  
+*/
+  std::vector <manualContourContainer *> _manContours;
+  //Default contours, points and lines viewing
+  ContourView                          *_contourViewer;
+  LineView                                     *_lineViewer;
+  PointView                                    *_pointViewer;
+
+  // Chart
+
+  // EED
+  //wxChart                                    *_Chart;
+  wxWindow                                     *_wxStenosisPanel;
+
+//  wxSplitterWindow                   *panel_splitter; 
+//  wxSplitterWindow                   *panel_splitter_right; 
+//  wxPanel                                    *panel_left;
+//  wxPanel                                    *panel_right_up;
+//  wxPanel                                    *panel_right_down;
+//  wxPanel                                    *panel_rightm_up;
+
+  // Group button
+  wxButton                                     *_bt_AddContour3D;
+  wxButton                                     *_bt_CleanContour3D;
+  wxButton                                     *_bt_CleanAllContours3D;
+  wxButton                                     *_bt_Healthy;
+
+  wxPanelControlsHealthySickSliceCT *_pl_cntlHealthySick2;
+
+
+//  wxButton                           *_bt_ContourCalculated;
+//  wxButton                           *_bt_Pause;
+//  wxButton                           *_bt_Delete;
+//  wxButton                           *_bt_Point;
+
+  // Tool graph
+  wxRadioButton                                *_rb_GreyScale;
+  wxRadioButton                                *_rb_Color;
+
+  wxCheckBox                           *_cb_HealthySlice;
+  wxCheckBox                           *_cb_Perpendicular;
+
+  wxCheckBox                           *_cb_VisibleRings;
+  wxCheckBox                           *_cb_ShowSurface;
+  wxSlider                                     *_sl_Slice;
+  wxSlider                                     *_sl_Isovalue;
+  wxSlider                                     *_sl_Opacity;
+  wxStaticText                         *_st_Slice;
+  wxStaticText                         *_st_Isovalue;
+  wxStaticText                         *_st_Opacity; 
+  
+
+  // Status Text
+//  wxStaticText       *_st_Label0;
+//  wxStaticText       *_st_Value0;
+  wxStaticText         *_txt_Position;
+
+  wxStaticText         *_st_Label1;
+  wxStaticText         *_st_Value1;
+  wxStaticText         *_st_Label2;
+  wxStaticText         *_st_Value2;
+  wxStaticText         *_st_Label3;
+  wxStaticText         *_st_Value3;
+//  wxStaticText       *_st_Label4;
+//  wxStaticText       *_st_Value4;
+//  wxStaticText       *_st_Label5;
+//  wxStaticText       *_st_Value5;
+  wxStaticText         *_st_Label6;
+  wxStaticText         *_st_Value6;
+  wxStaticText         *_st_Label7;
+  wxStaticText         *_st_Value7;
+  wxStaticText         *_st_Label8;
+  wxStaticText         *_st_Value8;
+//  wxStaticText       *_st_Label9;
+//  wxStaticText       *_st_Value9;
+
+
+  wxStaticText         *_st_Label100;
+  wxStaticText         *_st_Value100;
+  wxStaticText         *_st_Label101;
+  wxStaticText         *_st_Value101;
+//  wxStaticText       *_st_Label102;
+//  wxStaticText       *_st_Value102;
+//  wxStaticText       *_st_Label103;
+//  wxStaticText       *_st_Value103;
+//  wxStaticText       *_st_Label104;
+//  wxStaticText       *_st_Value104;
+//  wxStaticText       *_st_Label105;
+//  wxStaticText       *_st_Value105;
+//  wxStaticText       *_st_Label106;
+//  wxStaticText       *_st_Value106;
+//  wxStaticText       *_st_Label107;
+//  wxStaticText       *_st_Value107;
+//  wxStaticText       *_st_Label108;
+//  wxStaticText       *_st_Value108;
+
+
+  wxStaticText         *_st_LabelRef101;
+  wxStaticText         *_st_ValueRef101;
+  wxStaticText         *_st_LabelRef102;
+  wxStaticText         *_st_ValueRef102;
+  wxStaticText         *_st_LabelRef103;
+  wxStaticText         *_st_ValueRef103;
+
+
+
+  // Quantification
+  // int
+  int _numpoint;
+  int _axis_index;
+  int _width, _height, _depth;
+  int _bak_ActualSlice;
+  int _bak_ActualSlice2;
+
+  int _given_points;
+  int _typ;
+  int _actual_actor;
+  int _perpe;
+  int _shown;
+  int _quant_shown;
+  int _show_rings;
+  int _show_hs;
+  int _showS;
+  
+  int _first_quant;
+  int _last_quant;
+  int _first_point_quant;
+  int _last_point_quant;
+  int _bounds;
+  int _intRange;
+  int _nClicks;
+  int _quantifing;
+  int _sizeHealthyRegion;
+
+  int _initX;
+  int _initY;
+  int _initWindow;
+  int _initLevel;
+
+  // float
+//  float _real_first_point_quant;
+//  float _real_last_point_quant;
+  float _actual_area;
+  float _actual_peri;
+  float _actual_darea;
+  float _actual_dperi;
+  float _actual_dmax;
+  float _actual_dmin;
+  float _actual_davg;
+  float _actual_sten;
+  float _actual_partial;
+  float _actual_total;
+  float _ip[3], _fp[3];
+
+  // wxList
+  wxList  *_rings_index;
+  wxList  *_quant_sten;
+  wxList  *_man_points;
+  wxList  *_actual_quant_x;
+  wxList  *_actual_quant_area;
+  wxList  *_actual_quant_peri;
+  wxList  *_actual_quant_darea;
+  wxList  *_actual_quant_dperi;
+  wxList  *_actual_quant_dmax;
+  wxList  *_actual_quant_dmin;
+  wxList  *_actual_quant_davg;
+  wxList  *_actual_quant_sten;
+
+  DECLARE_EVENT_TABLE( );
+       
+  void         Reset_sl_Slider();
+  void         showVariables();
+  wxString     strStenosis(double stenosis);
+  double       doubleStenosis(double healthy, double sick);
+  double       GetStenosisArea(int sickSlice);
+  double       GetStenosisDiameter(int sickSlice);
+  wxWindow* CreateView2DPanel(wxWindow *parent);
+  void         CreateManualContours();
+  void         addManualContours(int type);
+
+       wxSplitterWindow *_splitPanelPrincipal;
+       wxSplitterWindow *_splitpanel_left;
+       wxSplitterWindow *_splitpanel_right;
+       wxSplitterWindow *_splitpanel_right_down;
+
+       wxWindow* CreatePanelPrincipal(wxWindow *parent);
+       wxWindow* CreatePanelStatus(wxWindow *parent);
+       wxWindow* CreatePanel_Left(wxWindow *parent);
+       wxWindow* CreatePanel_Right(wxWindow *parent);
+       wxWindow* CreateStenosisPanel(wxWindow *parent);
+       wxWindow* CreateControlPanel3D(wxWindow *parent);
+       wxWindow* CreatePanel_Right_Down(wxWindow *parent);
+
+};
+
+
+
+
+#endif // __WX__MARACAS__QUANTIF__CT__WDG__HXX__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget_base.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget_base.cxx
new file mode 100644 (file)
index 0000000..2b0d35e
--- /dev/null
@@ -0,0 +1,1339 @@
+
+
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxQuantificationWidget_base.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:43 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "wxQuantificationWidget_base.h"
+#include "../marDictionary.h"
+#include "../wxMaracasMPR.h"
+
+
+//#include <matrix.h>
+//#include <wx/notebook.h>
+
+
+
+
+// EED Borrame
+long int startTimeCalcule;
+long int startTimeRI;
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPnlModifyContour::wxPnlModifyContour(wxWindow* parent, wxQuantificationWidget_base *quantificationWidget_base)
+                                       : wxPanel(parent,-1){
+
+       marDictionary marDict;
+       char tmp[256];
+
+       _quantificationWidget_base=quantificationWidget_base;
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+       wxStaticText *title             = new wxStaticText(this,-1,wxString(marDict.GetString(803), wxConvUTF8)); // "Contour modification"
+
+// EEDxx 2.6
+//     wxStaticText *blank             = new wxStaticText(this,-1,"   ");
+
+       strcpy( tmp , marDict.GetString(820) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(825) );
+                       _newContour             = new wxButton(this, -1, wxString(tmp, wxConvUTF8)                                      ,wxPoint(0,0),wxSize(80,80));  // " New\nContour"
+                       _fixContour             = new wxButton(this, -1, wxString(marDict.GetString(830), wxConvUTF8) ,wxPoint(0,0),wxSize(80,80));  // " Replace " 
+//                     _cancelContour  = new wxButton(this, -1, marDict.GetString(835) ,wxPoint(0,0),wxSize(80,35));  // " End "
+//                     _insert                 = new wxRadioButton(this, -1, wxString(marDict.GetString(840), wxConvUTF8), wxDefaultPosition, wxDefaultSize, wxRB_SINGLE  ); // " Insert Point "
+//                     _erase                  = new wxRadioButton(this, -1, wxString(marDict.GetString(845), wxConvUTF8), wxDefaultPosition, wxDefaultSize, wxRB_SINGLE  ); // " Delete Point "
+//                     _move                   = new wxRadioButton(this, -1, wxString(marDict.GetString(850), wxConvUTF8), wxDefaultPosition, wxDefaultSize, wxRB_SINGLE ); // " Move Point "
+                                 _one          = new wxStaticText(this,-1,wxString(marDict.GetString(805), wxConvUTF8) );  // "1"
+                                 _two          = new wxStaticText(this,-1,wxString(marDict.GetString(810), wxConvUTF8) );  // "2"
+                                 _three        = new wxStaticText(this,-1,wxString(marDict.GetString(815), wxConvUTF8) );  // "3"
+
+       strcpy( tmp , "\n\n" ); 
+       strcat( tmp , marDict.GetString(855) ); 
+       strcat( tmp , "\n" ); 
+       strcat( tmp , marDict.GetString(860) );
+                                 _msg          = new wxStaticText(this,-1,wxString(tmp, wxConvUTF8) );  // "\n\nUse mouse left button \n to create the new contour"
+
+       wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+       title   -> SetFont(font);
+       _one    -> SetFont(font);
+       _two    -> SetFont(font);
+       _three  -> SetFont(font);
+
+//EEDxx 2.6
+//     title   -> SetBackgroundColour(*wxLIGHT_GREY);
+//     _insert -> SetBackgroundColour(*wxLIGHT_GREY);
+//     _erase  -> SetBackgroundColour(*wxLIGHT_GREY);
+//     _move   -> SetBackgroundColour(*wxLIGHT_GREY);
+//     _msg    -> SetBackgroundColour(*wxLIGHT_GREY);
+
+       _fixContour             -> Disable();
+//     _cancelContour  -> Disable();
+//     _insert                 -> Disable();
+//     _erase                  -> Disable();
+//     _move                   -> Disable();
+       _two                    -> Disable();
+       _three                  -> Disable();
+       _msg                    -> Disable();
+//     _msg                    -> Show(false);
+
+       Connect(_newContour->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlModifyContour::OnNewContour      );
+       Connect(_fixContour->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlModifyContour::OnFixContour      );
+//     Connect(_cancelContour->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlModifyContour::OnCancelContour   );
+//     Connect(_insert->GetId()                , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlModifyContour::OnInsertPoint       );
+//     Connect(_erase->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlModifyContour::OnErasePoint        );
+//     Connect(_move->GetId()                  , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlModifyContour::OnMovePoint );
+
+
+       wxFlexGridSizer *sizer  = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizerAh= new wxFlexGridSizer(6);
+       wxFlexGridSizer *sizerAv= new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizerBv= new wxFlexGridSizer(1);
+
+//     sizerAv->Add(_insert            ,       1, wxALL|wxEXPAND, 6);
+//     sizerAv->Add(_erase                     ,       1, wxALL|wxEXPAND, 6);
+//     sizerAv->Add(_move                      ,       1, wxALL|wxEXPAND, 6);
+
+       sizerBv->Add(_fixContour        ,       1, wxALL|wxEXPAND, 6);
+//     sizerBv->Add(_cancelContour     ,       1, wxALL|wxEXPAND, 6);
+
+       sizerAh->Add(new wxStaticText(this,-1,_T("   "))                        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(_one                       ,       1, wxALIGN_CENTER_HORIZONTAL, 3);
+       sizerAh->Add(new wxStaticText(this,-1,_T("   "))                        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(_two                       ,       1, wxALIGN_CENTER_HORIZONTAL, 3);
+       sizerAh->Add(new wxStaticText(this,-1,_T("   "))                        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(_three                     ,       1, wxALIGN_CENTER_HORIZONTAL, 3);
+
+       sizerAh->Add(new wxStaticText(this,-1,_T("   "))                        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(_newContour        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(new wxStaticText(this,-1,_T("   "))                        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(_msg                       ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(new wxStaticText(this,-1,_T("   "))                        ,       1, wxALL|wxEXPAND, 3);
+       sizerAh->Add(sizerBv            ,       1, wxALL|wxEXPAND, 3);
+
+//     sizerAh->Add(blank                      ,       1, wxALL|wxEXPAND, 3);
+//     sizerAh->Add(blank                      ,       1, wxALL|wxEXPAND, 3);
+//     sizerAh->Add(blank                      ,       1, wxALL|wxEXPAND, 3);
+//     sizerAh->Add(_msg                       ,       1, wxALIGN_CENTER_HORIZONTAL, 3);
+//     sizerAh->Add(blank                      ,       1, wxALL|wxEXPAND, 3);
+//     sizerAh->Add(blank                      ,       1, wxALL|wxEXPAND, 3);
+
+       sizer->Add(title                        ,       1, wxALL|wxEXPAND, 10);
+       sizer->Add(sizerAh                      ,       1, wxALL|wxEXPAND, 10);
+
+       this->SetSizer(sizer);
+       this->SetSize(wxSize(400,400));
+}
+
+//------------------------------------------------------------------------
+void wxPnlModifyContour::OnFixContour(wxCommandEvent& event){
+       _fixContour             -> Enable(false);
+       _two                    -> Enable(false);
+       _three                  -> Enable(false);
+       _msg                    -> Enable(false);
+    _quantificationWidget_base->SetManualContour_ReplaceContour();
+    _quantificationWidget_base->SetManualContour_2DWorld(false);
+}
+//------------------------------------------------------------------------
+void wxPnlModifyContour::OnNewContour(wxCommandEvent& event){
+
+//     _insert                 -> Enable(true);
+//     _erase                  -> Enable(true);
+//     _move                   -> Enable(true);
+       _fixContour             -> Enable(true);
+//     _cancelContour  -> Enable(true);
+       _two                    -> Enable(true);
+       _three                  -> Enable(true);
+       _msg                    -> Enable(true);
+//     _msg                    -> Show(true);
+
+//     _insert                 -> SetValue(true);
+//     _erase                  -> SetValue(false);
+//     _move                   -> SetValue(false);
+
+    _quantificationWidget_base->SetManualContour_AddPoint_2DWorld();
+    _quantificationWidget_base->SetManualContour_2DWorld(false);
+    _quantificationWidget_base->SetManualContour_2DWorld(true);
+
+}
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPnlSearchStenosisAutomatic::wxPnlSearchStenosisAutomatic(wxWindow *parent, wxQuantificationWidget_base *quantificationWidget_base)
+                                                               :wxPanel(parent,-1){
+       marDictionary marDict;
+       char tmp[256];
+
+       _quantificationWidget_base=quantificationWidget_base;
+       int wx_border = 5;
+       wxPanel* _panelAutomatic=this;
+       wxFlexGridSizer *sizerPanelAutomatic1   = new wxFlexGridSizer(7);
+
+//EEDxx 2.6
+//                                     _st1_blank                              = new wxStaticText(_panelAutomatic,-1," ");
+
+       strcpy( tmp , marDict.GetString(275) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(280) );
+                                       _st1_text1                              = new wxStaticText(_panelAutomatic,-1,wxString(tmp, wxConvUTF8) ); //"Select\n slice"
+                                       _st1_next1                              = new wxStaticText(_panelAutomatic,-1,_T("    ")); //->
+                                       _st1_next2                              = new wxStaticText(_panelAutomatic,-1,_T("    ")); //->
+                                       _st1_next3                              = new wxStaticText(_panelAutomatic,-1,_T("    ")); //->
+                                       _st1_cero                               = new wxStaticText(_panelAutomatic,-1,wxString(marDict.GetString(273), wxConvUTF8) );//"0"
+                                       _st1_one                                = new wxStaticText(_panelAutomatic,-1,wxString(marDict.GetString(283), wxConvUTF8) );//"1"
+                                       _st1_two                                = new wxStaticText(_panelAutomatic,-1,wxString(marDict.GetString(293), wxConvUTF8) );//"2"
+                                       _st1_three                              = new wxStaticText(_panelAutomatic,-1,wxString(marDict.GetString(303), wxConvUTF8) );//"3"
+       strcpy( tmp , marDict.GetString(285) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(290) );
+                                       _bt1_HealthySlice               = new wxButton(_panelAutomatic,-1,wxString(tmp, wxConvUTF8),wxPoint(0,0),wxSize(80,85));//"    Validate\nHealthy Slice"
+       strcpy( tmp , marDict.GetString(295) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(300) );
+                                       _bt1_EndRegion                  = new wxButton(_panelAutomatic,-1,wxString(tmp, wxConvUTF8),wxPoint(0,0),wxSize(80,85));//"   Validate\nEnd region"
+       strcpy( tmp , marDict.GetString(305) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(310) );
+                                       _bt1_Start                              = new wxButton(_panelAutomatic,-1,wxString(tmp, wxConvUTF8),wxPoint(0,0),wxSize(80,85));//"   Find \nStenosis"
+       wxStaticText    *title                                  = new wxStaticText(this,-1,wxString(marDict.GetString(270), wxConvUTF8)); //"Automatic stenosis search"
+
+    // SpecialPanel
+       _panelSpecial                           = new wxPanel(_panelAutomatic,-1,wxDefaultPosition,wxSize(400,200));
+       _st_BeginRegion                         = new wxStaticText(_panelSpecial,-1,_T("Begin Region : "));
+       _st_EndRegion                           = new wxStaticText(_panelSpecial,-1,_T("   End Region : "));
+       _sl_BeginRegion                         = new wxSlider(_panelSpecial, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_EndRegion                           = new wxSlider(_panelSpecial, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _rb_surface                                     = new wxRadioButton(_panelSpecial, -1, _T("Stenosis by Surface     "), wxDefaultPosition, wxDefaultSize, wxRB_GROUP   );
+       _rb_diameter                            = new wxRadioButton(_panelSpecial, -1, _T("Stenosis by Diameter    "), wxDefaultPosition, wxDefaultSize  );
+       _bt_MaxSurface                          = new wxButton(_panelSpecial,-1,_T("Find Max Surface"));
+       wxButton *bt_AxisMPR            = new wxButton(_panelSpecial,-1,_T("Axis MPR"));
+
+       _bt_plus                = new wxButton(_panelAutomatic,-1,_T("+"),wxPoint(0,0),wxSize(15,15));
+       _bt_plus->Show(true);
+
+
+       Connect(_bt1_HealthySlice->GetId()      , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBtHealthySlice        );
+       Connect(_bt1_EndRegion->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBtEndRegion           );
+       Connect(_bt1_Start->GetId()                     , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBtStart                       );
+
+       Connect(_sl_BeginRegion->GetId()        , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBeginSlider );
+       Connect(_sl_EndRegion->GetId()          , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnEndSlider   );
+       Connect(_bt_plus->GetId()                       , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBtPlus );     
+       Connect(_bt_MaxSurface->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBtMaxSurf );
+       Connect(bt_AxisMPR->GetId()                     , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnBtAxisMPR );
+
+       Connect(_rb_surface->GetId()      , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnRbArea );
+       Connect(_rb_diameter->GetId()     , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlSearchStenosisAutomatic::OnRbDiameter );
+           
+
+       wxFlexGridSizer *sizerPanelSpecial      = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizerPanelSpecial1     = new wxFlexGridSizer(2);
+       wxFlexGridSizer *sizerPanelSpecial2     = new wxFlexGridSizer(2);
+       wxFlexGridSizer *sizerPanelSpecial3     = new wxFlexGridSizer(3);
+
+       wxFlexGridSizer *sizerPanelAutomatic    = new wxFlexGridSizer(1);
+
+//EEDxx 2.6
+//     _panelAutomatic->SetBackgroundColour(*wxLIGHT_GREY);
+
+//EEDxx 2.6
+//     _st1_blank      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_text1      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_next1      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_next2      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_next3      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_next3      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_cero       ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_one        ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_two        ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st1_three      ->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+       title           ->SetFont(font);
+//EEDxx 2.6
+//     title           ->SetBackgroundColour(*wxLIGHT_GREY);
+       _st1_cero       ->SetFont(font);
+       _st1_one        ->SetFont(font);
+       _st1_two        ->SetFont(font);
+       _st1_three      ->SetFont(font);
+       _st1_next1      ->SetFont(font);
+       _st1_next2      ->SetFont(font);
+       _st1_next3      ->SetFont(font);
+//    _st1_one ->Disable();
+    _st1_two   ->Disable();
+    _st1_three ->Disable();
+//    bt1_HealthySlice->Disable();
+    _bt1_EndRegion->Disable();
+    _bt1_Start->Disable();
+
+//EEDxx 2.6
+//     _panelSpecial   ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_BeginRegion ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_EndRegion   ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_BeginRegion ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_EndRegion   ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _rb_diameter    ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _rb_surface             ->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _sl_BeginRegion ->SetSize(330,30);
+       _sl_EndRegion   ->SetSize(330,30);
+    _st_BeginRegion    ->Disable();
+    _st_EndRegion      ->Disable();
+    _sl_BeginRegion    ->Disable();
+    _sl_EndRegion      ->Disable();
+    _rb_diameter       ->Disable();
+    _rb_surface                ->Disable();
+    _bt_MaxSurface     ->Disable();
+
+       _rb_surface->SetValue(true);
+       _quantificationWidget_base->SetAnalysisTypeStenosis(2);
+
+       // line cero
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+
+       // fist line
+       sizerPanelAutomatic1->Add(_st1_cero                             ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_st1_one                              ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_st1_two                              ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(new wxStaticText(_panelAutomatic,-1,_T(" "))                  ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_st1_three                    ,       15, wxALIGN_CENTER_HORIZONTAL, wx_border);
+       // second line
+       sizerPanelAutomatic1->Add(_st1_text1                    ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_st1_next1                    ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_bt1_HealthySlice             ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_st1_next2                    ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_bt1_EndRegion                ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_st1_next3                    ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+       sizerPanelAutomatic1->Add(_bt1_Start                    ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, wx_border);
+
+       // Special panel
+       sizerPanelSpecial1->Add(_rb_surface                     ,1      ,wxALL                  ,0);
+       sizerPanelSpecial1->Add(_rb_diameter            ,1      ,wxALL                  ,0);
+       sizerPanelSpecial2->Add(_st_BeginRegion         ,1      ,wxALL                  ,0);
+       sizerPanelSpecial2->Add(_sl_BeginRegion         ,1      ,wxALL|wxGROW   ,0);
+       sizerPanelSpecial2->Add(_st_EndRegion           ,1      ,wxALL                  ,0);
+       sizerPanelSpecial2->Add(_sl_EndRegion           ,1      ,wxALL|wxGROW   ,0);
+       sizerPanelSpecial3->Add(_bt_MaxSurface          ,1      ,wxALL                  ,0);
+       sizerPanelSpecial3->Add( bt_AxisMPR                     ,1      ,wxALL                  ,0);
+
+// EED 27 oct 2007
+       sizerPanelSpecial2->AddGrowableCol(1);
+       
+
+       sizerPanelSpecial->Add(sizerPanelSpecial1       ,1      ,wxALL|wxALIGN_RIGHT    , 0 );
+       sizerPanelSpecial->Add(sizerPanelSpecial2       ,1      ,wxALL|wxGROW                   , 0 );
+       sizerPanelSpecial->Add(sizerPanelSpecial3       ,1      ,wxALL                                  , 0 );
+       _panelSpecial->SetSizer(sizerPanelSpecial);
+       _panelSpecial->SetAutoLayout(true);
+       _panelSpecial->SetSize( sizerPanelSpecial->GetMinSize() );
+
+       sizerPanelAutomatic->Add(title                                  ,15, wxALL                              , 10);
+       sizerPanelAutomatic->Add(sizerPanelAutomatic1   ,15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL  , 10);
+       sizerPanelAutomatic->Add(_bt_plus                               ,15, wxALL                              , 0);
+       sizerPanelAutomatic->Add(_panelSpecial                  ,15, wxALL|wxGROW               , 0);
+       _panelAutomatic->SetSizer(sizerPanelAutomatic);
+       _panelAutomatic->SetAutoLayout(true);
+
+       _panelSpecial->Show(true);
+
+       _panelAutomatic->SetSize(400,270);
+       _panelAutomatic->SetSize( sizerPanelAutomatic->GetMinSize() );
+}
+
+
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::SetRange(int min, int max)
+{
+       _sl_BeginRegion->SetRange(min,max);
+       _sl_EndRegion->SetRange(min,max);
+}
+
+
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnBtHealthySlice(wxCommandEvent& event){
+       // Automatique panel
+    _st1_two           -> Enable();
+    _bt1_EndRegion     -> Enable();
+    _st_BeginRegion    -> Enable();
+    _sl_BeginRegion    -> Enable();
+       int slice=_quantificationWidget_base->GetActualSlice();
+       _quantificationWidget_base->SetHealthySlice(slice);
+
+       int startSlice,endSlice;
+       _quantificationWidget_base->GetSliceLimites(0,startSlice,endSlice);
+       if ((_panelSpecial->IsShown()==false) || (startSlice==-1)){
+               _quantificationWidget_base->Set3DStartRegionSliceActor( 0, slice );
+               _quantificationWidget_base->Show3DStartRegionSliceActor(0);
+               _sl_BeginRegion ->SetValue(slice);
+               _quantificationWidget_base->RefreshAxis();
+       }
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnBtEndRegion(wxCommandEvent& event){
+    _st1_three         -> Enable();
+    _bt1_Start         -> Enable();
+    _st_EndRegion      -> Enable();
+    _sl_EndRegion      -> Enable();
+    _rb_diameter       -> Enable();
+    _rb_surface                -> Enable();
+    _bt_MaxSurface     -> Enable();
+       int slice=_quantificationWidget_base->GetActualSlice();
+       _quantificationWidget_base->Set3DEndRegionSliceActor( 0, slice );
+       _quantificationWidget_base->Show3DEndRegionSliceActor(0);
+       _sl_EndRegion->SetValue(slice);
+       _quantificationWidget_base->RefreshAxis();
+}
+
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnBtStart(wxCommandEvent& event)
+{
+       _quantificationWidget_base->DetectHealthySickSlice( true, false );
+}
+
+
+//------------------------------------------------------------------------
+
+void wxPnlSearchStenosisAutomatic::OnBtAxisMPR(wxCommandEvent& event){
+       wxBusyCursor wait;
+       wxFrame *frame = new wxFrame(this,-1,_T("MPR Axe"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE|wxSTAY_ON_TOP);
+       int wz1 = _sl_BeginRegion->GetValue();
+       int wz2 = _sl_EndRegion->GetValue();
+       if (wz2<wz1)
+       {
+               int tmp = wz1;
+               wz1 = wz2;
+               wz2 = tmp;
+       }
+
+       kVolume *vol = _quantificationWidget_base->GetVolumeAxisExtended(wz1,wz2);
+
+
+       wxMaracasMPR *wxmaracasMPR = new wxMaracasMPR( frame , new marImageData( vol->castVtk() ) , 1);
+//     wxMaracasMPR *wxmaracasMPR = new wxMaracasMPR( frame , vol->castVtk() , getVoxelSize???? );
+
+
+       vtkPlane2DView *planeView = wxmaracasMPR->GetVtkPlane2DView();
+       planeView->SetImgSize(100);
+       wxmaracasMPR->ConfigureVTK();
+       frame->SetSize(600,600);
+       frame->Show();
+}
+
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnBtPlus(wxCommandEvent& event){
+       if (_panelSpecial->IsShown()==true){
+               _bt_plus->SetLabel(_T("+"));
+               _panelSpecial->Show(false);
+       } else {
+               _bt_plus->SetLabel(_T("-"));
+               // Sliders
+               int startSlice,endSlice;
+               _quantificationWidget_base->GetSliceLimites(0,startSlice,endSlice);
+               int maxSlices   = _quantificationWidget_base->GetMaxActualSlice();
+               _sl_BeginRegion->SetRange(0,maxSlices);
+               _sl_BeginRegion->SetValue(startSlice);
+               _sl_EndRegion->SetRange(0,maxSlices);
+               _sl_EndRegion->SetValue(endSlice);
+               _quantificationWidget_base->RefreshAxis();
+               //Show panel
+               _panelSpecial->Show(true);
+       }
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnBeginSlider(wxScrollEvent& event){
+       _quantificationWidget_base->Set3DStartRegionSliceActor(  0, _sl_BeginRegion->GetValue() );
+       _quantificationWidget_base->Show3DStartRegionSliceActor( 0 );
+       _quantificationWidget_base->RefreshAxis();
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnEndSlider(wxScrollEvent& event){
+       _quantificationWidget_base->Set3DEndRegionSliceActor(  0, _sl_EndRegion->GetValue() );
+       _quantificationWidget_base->Show3DEndRegionSliceActor( 0 );
+       _quantificationWidget_base->RefreshAxis();
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnBtMaxSurf(wxCommandEvent& event){
+       _quantificationWidget_base->DetectHealthySickSlice( false, true );
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnRbArea(wxCommandEvent& event){
+       _quantificationWidget_base->SetAnalysisTypeStenosis( 2 );
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisAutomatic::OnRbDiameter(wxCommandEvent& event){
+       _quantificationWidget_base->SetAnalysisTypeStenosis( 1 );
+}
+//------------------------------------------------------------------------
+
+
+
+
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPnlSearchStenosisManual::wxPnlSearchStenosisManual(wxWindow *parent, wxQuantificationWidget_base *quantificationWidget_base)
+                                                               :wxPanel(parent,-1){
+       marDictionary marDict;
+       char tmp[256];
+
+       _quantificationWidget_base=quantificationWidget_base;
+       wxPanel* _panelManual=this;
+       wxFlexGridSizer *sizerPanelManual       = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizerPanelManual1      = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizerPanelManual2      = new wxFlexGridSizer(5);
+
+//EEDxx 2.6
+//                                     _st2_blank                      = new wxStaticText(_panelManual,-1," ");
+
+       strcpy( tmp , marDict.GetString(330) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(335) );
+                                       _st2_text1                      = new wxStaticText(_panelManual,-1,wxString(tmp, wxConvUTF8));//"Select\n slice"
+       strcpy( tmp , marDict.GetString(340) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(345) );
+                                       _st2_text2                      = new wxStaticText(_panelManual,-1,wxString(tmp, wxConvUTF8));//"    Select \n other slice"
+                                       _st2_next1                      = new wxStaticText(_panelManual,-1,_T("        ")); //->
+                                       _st2_next2                      = new wxStaticText(_panelManual,-1,_T("        ")); //->
+                                       _st2_cero                       = new wxStaticText(_panelManual,-1, wxString(marDict.GetString(328), wxConvUTF8) ); //"0"
+                                       _st2_one                        = new wxStaticText(_panelManual,-1, wxString(marDict.GetString(338), wxConvUTF8) ); //"1"
+                                       _st2_two                        = new wxStaticText(_panelManual,-1, wxString(marDict.GetString(348), wxConvUTF8) ); //"2"
+       strcpy( tmp , marDict.GetString(350) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(355) );
+                                       _bt2_HealthySlice       = new wxButton(_panelManual,-1,wxString(tmp, wxConvUTF8),wxPoint(0,0),wxSize(85,85)); //"    Validate\nHealthy Slice"
+       wxStaticText    *title                          = new wxStaticText(this,-1,wxString( marDict.GetString(325) , wxConvUTF8  ));//"Manual stenosis search"
+
+       Connect(_bt2_HealthySlice->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPnlSearchStenosisManual::OnBtHealthySlice        );
+//EEDxx 2.6
+//     _panelManual->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_blank      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_text1      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_text2      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_cero       ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_one        ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_two        ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_next1      ->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st2_next2      ->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+       title           ->SetFont(font);
+//EEDxx 2.6
+//     title           ->SetBackgroundColour(*wxLIGHT_GREY);
+       _st2_cero       ->SetFont(font);
+       _st2_one        ->SetFont(font);
+       _st2_two        ->SetFont(font);
+       _st2_next1      ->SetFont(font);
+       _st2_next2      ->SetFont(font);
+
+       _st2_two->Disable();
+       _st2_text2->Disable();
+
+       sizerPanelManual1->Add( title, 15, wxALL, 10 );
+
+       // cero line
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       // fist line
+       sizerPanelManual2->Add(_st2_cero                ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add(_st2_one                 ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add( new wxStaticText(_panelManual,-1,_T(" "))               ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add(_st2_two                 ,       15, wxALIGN_CENTER_HORIZONTAL, 10);
+       // second line
+       sizerPanelManual2->Add(_st2_text1               ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add(_st2_next1               ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add(_bt2_HealthySlice,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add(_st2_next2               ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10);
+       sizerPanelManual2->Add(_st2_text2               ,       15, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10);
+
+       sizerPanelManual->Add(sizerPanelManual1);
+       sizerPanelManual->Add(sizerPanelManual2);
+
+
+       _panelManual->SetSizer(sizerPanelManual);
+       _panelManual->SetAutoLayout(true);
+       _panelManual->SetSize(400,300);
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosisManual::OnBtHealthySlice(wxCommandEvent& event){
+       // Manual Panel
+       _st2_two        ->Enable();
+       _st2_text2      ->Enable();
+       _quantificationWidget_base->SetHealthySlice();
+}
+//------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPnlSearchStenosis::wxPnlSearchStenosis(wxWindow* parent, wxQuantificationWidget_base *quantificationWidget_base)
+                                       : wxPanel(parent,-1){
+       marDictionary marDict;
+       _quantificationWidget_base=quantificationWidget_base;
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxFlexGridSizer *axis1                  = new wxFlexGridSizer(2);
+       wxFlexGridSizer *sizer                  = new wxFlexGridSizer(1);
+    wxRadioButton      *rb_automatique = new wxRadioButton(this,-1,wxString(marDict.GetString(315), wxConvUTF8), wxDefaultPosition, wxDefaultSize, wxRB_GROUP  ); //"Automatic"
+    wxRadioButton      *rb_manual              = new wxRadioButton(this,-1,wxString(marDict.GetString(320), wxConvUTF8), wxDefaultPosition, wxDefaultSize   );            //"Manual"
+
+       Connect(rb_automatique->GetId() , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlSearchStenosis::OnRbAutomatic );
+       Connect(rb_manual->GetId()              , wxEVT_COMMAND_RADIOBUTTON_SELECTED , (wxObjectEventFunction) &wxPnlSearchStenosis::OnRbManual );
+
+       rb_automatique->SetValue(true);
+//EEDxx 2.6
+//     rb_automatique->SetBackgroundColour(*wxLIGHT_GREY);
+//     rb_manual->SetBackgroundColour(*wxLIGHT_GREY);
+
+    wxPanel                    *panelWork              = new wxPanel(this,-1);
+                                       _panelAutomatic = new wxPnlSearchStenosisAutomatic(panelWork,_quantificationWidget_base);
+                                       _panelManual    = new wxPnlSearchStenosisManual(panelWork,_quantificationWidget_base);
+       panelWork->SetSize(_panelAutomatic->GetSize());
+
+       _panelAutomatic->Show(true);
+       _panelManual->Show(false);
+
+       axis1->Add(rb_automatique);
+       axis1->Add(rb_manual);
+
+       sizer->Add(panelWork,1, wxALL|wxEXPAND, 0);
+       sizer->Add(axis1        ,1, wxALL|wxALIGN_RIGHT , 0);
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->SetSize(wxSize(400,600));
+       this->SetSize( sizer->GetMinSize() );
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosis::OnRbAutomatic(wxCommandEvent& event){
+       _panelAutomatic->Show(true);
+       _panelManual->Show(false);
+       _quantificationWidget_base->Show3DStartRegionSliceActor( 0 );
+       _quantificationWidget_base->Show3DEndRegionSliceActor( 0 );
+}
+//------------------------------------------------------------------------
+void wxPnlSearchStenosis::OnRbManual(wxCommandEvent& event){
+       _panelAutomatic->Show(false);
+       _panelManual->Show(true);
+       _quantificationWidget_base->Hide3DStartRegionSliceActor( 0 );
+       _quantificationWidget_base->Hide3DEndRegionSliceActor( 0 );
+}
+//------------------------------------------------------------------------
+wxPnlSearchStenosisAutomatic* wxPnlSearchStenosis::GetPanelAutomatic(){
+       return _panelAutomatic;
+}
+
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPanelSizeHealthyRegion::wxPanelSizeHealthyRegion(wxWindow* parent, wxQuantificationWidget_base *quantificationWidget_base)
+                                                               : wxPanel(parent,-1){
+       marDictionary marDict;
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+       _quantificationWidget_base              = quantificationWidget_base;
+       int maxSliderSize                               = 30;
+       int sizeHealthyRegion                   = 0;
+       sizeHealthyRegion                               = _quantificationWidget_base->GetSizeHealthyRegion();
+
+       wxFlexGridSizer *sizer                  = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizer1                 = new wxFlexGridSizer(1);
+       wxFlexGridSizer *sizer2                 = new wxFlexGridSizer(2);
+
+//EEDxx 2.6
+//     wxStaticText    *st_Blank               = new wxStaticText( this, -1,"    ",wxPoint(0,0));
+
+       wxStaticText    *st_Title               = new wxStaticText(     this, -1,wxString(marDict.GetString(370), wxConvUTF8),wxPoint(0,0));//"Size of the Healty Region:"
+       wxStaticText    *st_Size                = new wxStaticText(     this, -1, wxString(marDict.GetString(373), wxConvUTF8) ); //"n : "
+                                       _sl_Size                = new wxSlider(         this, -1, sizeHealthyRegion, 0, maxSliderSize, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       wxButton                *buttonRefresh  = new wxButton(         this, -1, wxString(marDict.GetString(375), wxConvUTF8));//"Refresh healthy region"
+       wxStaticText    *title                  = new wxStaticText(     this, -1,wxString(marDict.GetString(365), wxConvUTF8));//"Healthy region size "
+
+
+       wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+       title           ->SetFont(font);
+//EEDxx 2.6
+//     title           ->SetBackgroundColour(*wxLIGHT_GREY);
+
+       Connect(buttonRefresh->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxPanelSizeHealthyRegion::OnButtonRefresh );
+       sizer1->Add( title, 15, wxALL, 10 );
+
+       sizer2->Add( new wxStaticText( this, -1,_T("    "),wxPoint(0,0)) );
+       sizer2->Add( st_Title );
+
+       sizer2->Add( new wxStaticText( this, -1,_T("    "),wxPoint(0,0)) );
+       sizer2->Add( new wxStaticText( this, -1,_T("    "),wxPoint(0,0)) );
+
+       sizer2->Add( st_Size );
+       sizer2->Add( _sl_Size ,1,wxALL|wxGROW);
+// EED 27 oct 2007
+       sizer2->AddGrowableCol(1);
+
+       sizer2->Add( new wxStaticText( this, -1,_T("    "),wxPoint(0,0)) );
+       sizer2->Add( new wxStaticText( this, -1,_T("    "),wxPoint(0,0)) );
+
+       sizer2->Add( new wxStaticText( this, -1,_T("    "),wxPoint(0,0)) );
+       sizer2->Add( buttonRefresh );
+
+       sizer->Add( sizer1 );
+       sizer->Add( sizer2 );
+
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->SetSize(200,400);
+} 
+//------------------------------------------------------------------------
+void wxPanelSizeHealthyRegion::OnButtonRefresh(wxScrollEvent& event){
+       _quantificationWidget_base->SetSizeHealthyRegion( _sl_Size->GetValue() );
+       int healthySlice=_quantificationWidget_base->GetHealthySlice();
+       if (healthySlice!=-1) {
+               _quantificationWidget_base->SetHealthySlice( healthySlice );
+       }
+}
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPanelControlsHealthySickSlice2::wxPanelControlsHealthySickSlice2(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base)
+                                                               : wxPanel(parent,-1){
+       marDictionary marDict;
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+       //_quantificationWidget = quantificationWidget;
+
+    wxNotebook *wxnotbook = new wxNotebook(this, -1);
+//EEDxx 2.6
+//     wxnotbook->SetBackgroundColour(*wxLIGHT_GREY);
+
+                                       wxpnlsearchstenosis     = new wxPnlSearchStenosis( wxnotbook , quantificationWidget_base);
+       wxPanelSizeHealthyRegion        *page2  = new wxPanelSizeHealthyRegion (wxnotbook , quantificationWidget_base);
+       wxPnlModifyContour                      *page3  = new wxPnlModifyContour( wxnotbook , quantificationWidget_base);
+       wxnotbook->AddPage(wxpnlsearchstenosis, wxString(marDict.GetString(265), wxConvUTF8) ); //"Stenosis search "
+       wxnotbook->AddPage(page2, wxString(marDict.GetString(360), wxConvUTF8) ); //"Healty region size "
+       wxnotbook->AddPage(page3, wxString(marDict.GetString(800), wxConvUTF8) ); //"Contour modification"
+       wxnotbook->SetSize(400,315);
+//     int w,h;
+//     page1->GetSize(&w,&h);
+//     wxnotbook->SetSize( w+20 , h+25 );
+
+       wxFlexGridSizer *sizer                          = new wxFlexGridSizer(1);
+       sizer->Add(wxnotbook, 1, wxALL|wxEXPAND, 0);
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout();
+       this->SetSize(400,315);
+//     this->SetSize( wxnotbook->GetSize() );
+
+}
+
+//------------------------------------------------------------------------
+wxPnlSearchStenosis *wxPanelControlsHealthySickSlice2::GetPnlSearStenosis()
+{
+       return wxpnlsearchstenosis;
+}
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPnlContourControl::wxPnlContourControl(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base)
+                       :wxPanel(parent,-1){
+
+       marDictionary marDict;
+       
+       _quantificationWidget_base=quantificationWidget_base;
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxStaticText *title             = new wxStaticText(this,-1,wxString(marDict.GetString(940), wxConvUTF8)); // "Contour modification"
+//     wxStaticText *blank             = new wxStaticText(this,-1,"   ");
+       
+//EEDxx 2.6
+//     title   -> SetBackgroundColour(*wxLIGHT_GREY);
+
+
+       wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+       title   -> SetFont(font);
+
+    _sl_Discontinuity   = new wxSlider(this, -1, 10, 0, 20, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _sl_LumenPercentage = new wxSlider(this, -1, 86, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _sl_CalcPercentage = new wxSlider(this, -1, 90, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+
+//EEDxx 2.6
+//     _sl_Discontinuity->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_LumenPercentage->SetBackgroundColour(*wxLIGHT_GREY);
+//     _sl_CalcPercentage->SetBackgroundColour(*wxLIGHT_GREY);
+
+       _sl_Discontinuity->SetSize(300,16);
+       _sl_LumenPercentage->SetSize(300,16);
+       _sl_CalcPercentage->SetSize(300,16);
+
+       _st_Discontinuity       = new wxStaticText(this, -1, wxString(marDict.GetString(925), wxConvUTF8) ); //"Threshold "
+       _st_LumenPercentage     = new wxStaticText(this, -1, wxString(marDict.GetString(930), wxConvUTF8) ); //"Lumen % "
+       _st_CalcPercentage      = new wxStaticText(this, -1, wxString(marDict.GetString(935), wxConvUTF8) ); //"Calcification % "
+
+
+       btnCalibration  = new wxButton( this, -1, _T("Calibrate"),wxPoint(0,0),wxSize(92,20));
+       btnFile                 = new wxButton( this, -1, _T("Generate File"),wxPoint(0,0),wxSize(92,20));
+
+//EEDxx 2.6
+//     _st_Discontinuity->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_LumenPercentage->SetBackgroundColour(*wxLIGHT_GREY);
+//     _st_CalcPercentage->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+       Connect(_sl_Discontinuity->GetId()      , wxEVT_SCROLL_THUMBRELEASE     , (wxObjectEventFunction) &wxPnlContourControl::OnSliderDiscontinuityScroll     );
+       Connect(_sl_LumenPercentage->GetId()    , wxEVT_SCROLL_THUMBRELEASE     , (wxObjectEventFunction) &wxPnlContourControl::OnSliderLumenPercentageScroll   );
+       Connect(_sl_CalcPercentage->GetId()     , wxEVT_SCROLL_THUMBRELEASE     , (wxObjectEventFunction) &wxPnlContourControl::OnSliderCalcPercentageScroll    );
+       Connect(btnCalibration->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlContourControl::OnCalibration );
+       Connect(btnFile->GetId()                , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlContourControl::OnFile );
+
+       wxFlexGridSizer *sizer  = new wxFlexGridSizer(1);
+
+       wxFlexGridSizer         *axe1                           = new wxFlexGridSizer(2);
+       wxFlexGridSizer         *axe2                           = new wxFlexGridSizer(2);
+       wxFlexGridSizer         *axe3                           = new wxFlexGridSizer(2);
+
+
+       axe1->Add(_st_Discontinuity                     ,  1, wxALL|wxEXPAND, 0);
+       axe1->Add(_sl_Discontinuity                     ,  1, wxALL|wxEXPAND, 0);
+
+       axe2->Add(_st_LumenPercentage           ,  1, wxALL|wxEXPAND, 0);
+       axe2->Add(_sl_LumenPercentage           ,  1, wxALL|wxEXPAND, 0);
+
+       axe3->Add(_st_CalcPercentage            ,  1, wxALL|wxEXPAND, 0);
+       axe3->Add(_sl_CalcPercentage            ,  1, wxALL|wxEXPAND, 0);
+
+       sizer->Add(title                        ,       1, wxALL|wxEXPAND, 10);
+       sizer->Add(axe1, 2, wxALL|wxEXPAND, 10);
+       sizer->Add(axe2, 2, wxALL|wxEXPAND, 10);   //wxALIGN_CENTER_HORIZONTAL
+       sizer->Add(axe3, 2, wxALL|wxEXPAND, 10);
+       sizer->Add(btnCalibration, 2, wxALL|wxEXPAND, 10);
+       sizer->Add(btnFile, 2, wxALL|wxEXPAND, 10);
+
+       this->SetSizer(sizer);
+       this->SetSize(wxSize(400,400));
+
+}
+// ----------------------------------------------------------------------------
+void wxPnlContourControl::OnSliderDiscontinuityScroll(wxScrollEvent& event) 
+{
+
+       _quantificationWidget_base->OnSliderDiscontinuityScroll(event.GetPosition());
+
+}
+// ----------------------------------------------------------------------------
+void wxPnlContourControl::OnSliderLumenPercentageScroll(wxScrollEvent& event)
+{
+
+       _quantificationWidget_base->OnSliderLumenPercentageScroll(event.GetPosition());
+
+}
+// ----------------------------------------------------------------------------
+void wxPnlContourControl::OnSliderCalcPercentageScroll(wxScrollEvent& event)
+{
+       _quantificationWidget_base->OnSliderCalcPercentageScroll(event.GetPosition());
+}
+
+// ----------------------------------------------------------------------------
+void wxPnlContourControl::OnCalibration(wxScrollEvent& event)
+{
+       _quantificationWidget_base->OnCalibration();
+}
+
+// ----------------------------------------------------------------------------
+void wxPnlContourControl::OnFile(wxScrollEvent& event)
+{
+       _quantificationWidget_base->OnFile();
+}
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPnlManualContour::wxPnlManualContour(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base)  
+                       :wxPanel(parent,-1){
+
+       marDictionary marDict;
+       _quantificationWidget_base=quantificationWidget_base;
+
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxStaticText *title             = new wxStaticText(this,-1,wxString(marDict.GetString(803), wxConvUTF8)); // "Contour modification"
+//     wxStaticText *blank             = new wxStaticText(this,-1,"   ");
+       
+
+       wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+       title   -> SetFont(font);
+
+//EEDxx 2.6
+//     title   -> SetBackgroundColour(*wxLIGHT_GREY);
+
+
+       //MAZV - texts not included in marDictionary since this is not the final version
+       btnContourWall  = new wxButton( this, -1, _T("External wall \ncontour"),wxPoint(0,0),wxSize(92,40));
+       btnContourLumen = new wxButton( this, -1, _T("Lumen contours"),wxPoint(0,0),wxSize(92,40));
+       btnContourCalc  = new wxButton( this, -1, _T("Calcification \ncontours"),wxPoint(0,0),wxSize(92,40));
+       btnContourHypo  = new wxButton( this, -1, _T("Hipodense \ncontours"),wxPoint(0,0),wxSize(92,40));
+       
+       
+//     btnContourAB            = new wxButton( this, -1, "Active Contour AB",wxPoint(0,0),wxSize(92,20));
+       fixContourWall          = new wxButton(this, -1, _T("Replace \nExternal wall") ,wxPoint(0,0),wxSize(92,40));  
+       fixContourLumen         = new wxButton(this, -1, _T("Replace \nLumen") ,wxPoint(0,0),wxSize(92,40));  
+       fixContourCalc          = new wxButton(this, -1, _T("Replace \nCalcifications") ,wxPoint(0,0),wxSize(92,40)); 
+       fixContourHypo          = new wxButton(this, -1, _T("Replace \nHipodense") ,wxPoint(0,0),wxSize(92,40)); 
+       
+       cbShowAllManual         = new wxCheckBox(this,-1,_T("Show All")); 
+       cbShowWall                      = new wxCheckBox(this,-1,_T("Show Wall"));
+       cbShowLumen                     = new wxCheckBox(this,-1,_T("Show Lumen"));  
+       cbShowCalc                      = new wxCheckBox(this,-1,_T("Show Calcifications"));
+       cbShowHypo                      = new wxCheckBox(this,-1,_T("Show Hypodense"));
+
+       cbShowAllManual->SetValue(true);
+       cbShowWall->SetValue(true);
+       cbShowLumen->SetValue(true);
+       cbShowCalc->SetValue(true);
+       cbShowHypo->SetValue(true);
+
+
+       wxFlexGridSizer *sizer  = new wxFlexGridSizer(1);
+
+       wxFlexGridSizer         *conts                          = new wxFlexGridSizer(4);
+       wxFlexGridSizer         *replace                        = new wxFlexGridSizer(4);
+       wxFlexGridSizer         *options                        = new wxFlexGridSizer(5);       
+
+
+       conts->Add(btnContourWall       ,  1, wxALL|wxEXPAND, 0);
+       conts->Add(btnContourLumen      ,  1, wxALL|wxEXPAND, 0);
+       conts->Add(btnContourCalc       ,  1, wxALL|wxEXPAND, 0);
+       conts->Add(btnContourHypo       ,  1, wxALL|wxEXPAND, 0);
+       //conts->Add(btnContourAB       ,  1, wxALL|wxEXPAND, 0);
+
+       replace->Add(fixContourWall     ,  1, wxALL|wxEXPAND, 0);
+       replace->Add(fixContourLumen    ,  1, wxALL|wxEXPAND, 0);
+       replace->Add(fixContourCalc     ,  1, wxALL|wxEXPAND, 0);
+       replace->Add(fixContourHypo     ,  1, wxALL|wxEXPAND, 0);
+       //replace->Add(fixContourAB     ,  1, wxALL|wxEXPAND, 0);
+
+       options->Add(cbShowAllManual    ,  1, wxALL|wxEXPAND, 0);
+       options->Add(cbShowWall         ,  1, wxALL|wxEXPAND, 0);
+       options->Add(cbShowLumen        ,  1, wxALL|wxEXPAND, 0);
+       options->Add(cbShowCalc         ,  1, wxALL|wxEXPAND, 0);
+       options->Add(cbShowHypo         ,  1, wxALL|wxEXPAND, 0);
+
+       sizer->Add(title                ,       1, wxALL|wxEXPAND, 10);
+       sizer->Add(conts                ,       2, wxALL|wxEXPAND, 10);
+       sizer->Add(replace              ,       2, wxALL|wxEXPAND, 10);   //wxALIGN_CENTER_HORIZONTAL
+       sizer->Add(options              ,       2, wxALL|wxEXPAND, 10);         
+
+       this->SetSizer(sizer);
+       this->SetSize(wxSize(400,400));
+
+       Connect(btnContourWall->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnContourWall  );
+       Connect(btnContourLumen->GetId()        , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnContourLumen  );
+       Connect(btnContourCalc->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnContourCalc );
+       Connect(btnContourHypo->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnContourHypo );
+
+       Connect(fixContourWall->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnReplaceContourWall  );
+       Connect(fixContourLumen->GetId()        , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnReplaceContourLumen  );
+       Connect(fixContourCalc->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnReplaceContourCalc );
+       Connect(fixContourHypo->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxPnlManualContour::OnReplaceContourHypo );
+
+       Connect(cbShowAllManual->GetId()        , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxPnlManualContour::OnShowAll );
+       Connect(cbShowWall->GetId()             , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxPnlManualContour::OnShowWall );
+       Connect(cbShowLumen->GetId()            , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxPnlManualContour::OnShowLumen );
+       Connect(cbShowCalc->GetId()             , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxPnlManualContour::OnShowCalc );
+       Connect(cbShowHypo->GetId()             , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxPnlManualContour::OnShowHypo );
+
+
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnContourWall(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnContourWall();
+}
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnContourLumen(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnContourLumen();
+}
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnContourHypo(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnContourHypo();
+}
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnContourCalc(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnContourCalc();
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnReplaceContourWall(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnReplaceContourWall();
+}
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnReplaceContourLumen(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnReplaceContourLumen();
+}
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnReplaceContourHypo(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnReplaceContourHypo();
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnReplaceContourCalc(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnReplaceContourCalc();
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnShowAll(wxCommandEvent& event)
+{
+       cbShowCalc->SetValue(cbShowAllManual->GetValue());
+       cbShowHypo->SetValue(cbShowAllManual->GetValue());
+       cbShowLumen->SetValue(cbShowAllManual->GetValue());
+       cbShowWall->SetValue(cbShowAllManual->GetValue());
+       _quantificationWidget_base->OnShowAll(cbShowAllManual->GetValue());
+
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnShowWall(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnShowWall(cbShowWall->GetValue());
+}
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnShowLumen(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnShowLumen(cbShowLumen->GetValue());
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnShowCalc(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnShowCalc(cbShowCalc->GetValue());
+}
+
+//------------------------------------------------------------------------
+void wxPnlManualContour::OnShowHypo(wxCommandEvent& event)
+{
+       _quantificationWidget_base->OnShowHypo(cbShowHypo->GetValue());
+}
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+wxPanelControlsHealthySickSliceCT::wxPanelControlsHealthySickSliceCT(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base)
+                                                               : wxPanel(parent,-1)
+{
+       marDictionary marDict;
+//EEDxx 2.6
+//     this->SetBackgroundColour(*wxLIGHT_GREY);
+
+
+       //_quantificationWidget = quantificationWidget;
+
+    wxNotebook *wxnotbook = new wxNotebook(this, -1);
+//EEDxx 2.6
+//     wxnotbook->SetBackgroundColour(*wxLIGHT_GREY);
+
+       wxPnlSearchStenosis             *page1  = new wxPnlSearchStenosis( wxnotbook , quantificationWidget_base);
+       wxPanelSizeHealthyRegion        *page2  = new wxPanelSizeHealthyRegion (wxnotbook , quantificationWidget_base);
+       wxPnlManualContour              *page3  = new wxPnlManualContour( wxnotbook , quantificationWidget_base);
+       wxPnlContourControl             *page4  = new wxPnlContourControl( wxnotbook , quantificationWidget_base);
+       wxnotbook->AddPage(page1, wxString(marDict.GetString(265), wxConvUTF8) ); //"Stenosis search "
+       wxnotbook->AddPage(page2, wxString(marDict.GetString(360), wxConvUTF8) ); //"Healty region size "
+       wxnotbook->AddPage(page3, wxString(marDict.GetString(800), wxConvUTF8) ); //"Contour modification"
+       wxnotbook->AddPage(page4, wxString(marDict.GetString(940), wxConvUTF8) ); //"Contour Control"
+       wxnotbook->SetSize(400,315);
+
+       wxFlexGridSizer *sizer          = new wxFlexGridSizer(1);
+       sizer->Add(wxnotbook, 1, wxTOP|wxLEFT|wxRIGHT, 5);
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout();
+       this->SetSize(400,400);
+
+}
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+
+//--------------------------------------------------------------------------------
+// Constructor
+//--------------------------------------------------------------------------------
+
+
+wxQuantificationWidget_base::wxQuantificationWidget_base(wxWindow* parent, wxWindowID id,
+                                               const wxPoint& pos, const wxSize& size, long style,
+                                               const wxString& name)
+: wxPanel( parent, id, pos, size, style, name )
+{
+}
+
+
+//--------------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+wxQuantificationWidget_base::~wxQuantificationWidget_base()  // virtual 
+{
+}
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::SetManualContour_ReplaceContour()  // virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::SetManualContour_2DWorld(bool ok)  // virtual 
+{
+}
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::SetManualContour_AddPoint_2DWorld() // virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::SetAnalysisTypeStenosis(int analysisTypeStenosis) // virtual 
+{
+}
+
+
+// ----------------------------------------------------------------------------
+int  wxQuantificationWidget_base::GetActualSlice() // virtual 
+{
+       return 0;
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::SetHealthySlice(int healthySlice) // virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::GetSliceLimites(int type, int &sliceStart,int &sliceEnd)// virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Set3DStartRegionSliceActor( int type, int k )// virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::RefreshAxis( )// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnContourWall()// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnContourLumen()// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnContourHypo()// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnContourCalc()// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnReplaceContourWall()// virtual 
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnReplaceContourLumen()// virtual 
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnReplaceContourHypo()// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnReplaceContourCalc()// virtual 
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnSliderDiscontinuityScroll(int percentage) // virtual
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnSliderLumenPercentageScroll(int percentage) // virtual
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnSliderCalcPercentageScroll(int percentage) // virtual
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnCalibration() //virtual
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnFile() //virtual
+{
+}
+
+
+// ----------------------------------------------------------------------------
+kVolume *wxQuantificationWidget_base::GetVolumeAxisExtended(int wz1,int wz2)// virtual 
+{
+       return NULL;
+}
+
+// ----------------------------------------------------------------------------
+int  wxQuantificationWidget_base::GetMaxActualSlice()// virtual 
+{
+       return 0;
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Set3DRegionSliceActor( int type, int k1,int k2 )// virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::DetectHealthySickSlice( bool minSurf , bool maxSurf )// virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Show3DStartRegionSliceActor(int type ) // virtual 
+{
+}
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Set3DEndRegionSliceActor( int type, int k ) // virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Show3DEndRegionSliceActor(int type ) // virtual 
+{
+}
+
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Hide3DStartRegionSliceActor(int type ) // virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::Hide3DEndRegionSliceActor(int type ) // virtual 
+{
+}
+
+// ----------------------------------------------------------------------------
+int wxQuantificationWidget_base::GetSizeHealthyRegion() // virtual
+{
+       return 0;
+}
+
+// ----------------------------------------------------------------------------
+void wxQuantificationWidget_base::SetSizeHealthyRegion(int size) // virtual
+{
+}
+// ----------------------------------------------------------------------------
+int  wxQuantificationWidget_base::GetHealthySlice() // virtual
+{
+       return 0;
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnShowAll(bool value) // virtual
+{
+       
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnShowWall(bool value) // virtual
+{
+}
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnShowLumen(bool value) // virtual
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnShowCalc(bool value) // virtual
+{
+}
+
+//------------------------------------------------------------------------
+void wxQuantificationWidget_base::OnShowHypo(bool value) // virtual
+{
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget_base.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxQuantificationWidget_base.h
new file mode 100644 (file)
index 0000000..5c2add7
--- /dev/null
@@ -0,0 +1,312 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxQuantificationWidget_base.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__QUANTIF__WDG__BASE__HXX__
+#define __WX__MARACAS__QUANTIF__WDG__BASE__HXX__
+
+
+#include "vtk3DQuantSurfaceWidget.h"
+#include "vtk2DQuantSliceWidget.h"
+#include "wxImageViewerWidget.h"
+
+#include "wxChart.h"
+
+#include <wx/wx.h>
+#include <wx/slider.h>
+#include <wx/panel.h>
+#include <wx/minifram.h>
+#include <wx/splitter.h>
+#include <kernel/marInterface.h>
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+
+class wxQuantificationWidget_base : public wxPanel, public InterfaceVtkPanelWidgets
+{
+public:
+
+       // Constructor &  Destructor
+       wxQuantificationWidget_base(wxWindow* parent, wxWindowID id,
+                                               const wxPoint& pos, const wxSize& size, long style,
+                                               const wxString& name);
+  
+       virtual ~wxQuantificationWidget_base();
+
+       virtual void SetManualContour_ReplaceContour();
+       virtual void SetManualContour_2DWorld(bool ok);
+    virtual void SetManualContour_AddPoint_2DWorld();
+       virtual void SetAnalysisTypeStenosis(int analysisTypeStenosis);
+       virtual int  GetActualSlice();
+       virtual void SetHealthySlice(int healthySlice=-1);      
+       virtual void GetSliceLimites(int type, int &sliceStart,int &sliceEnd);
+       virtual void Set3DStartRegionSliceActor( int type, int k );
+       virtual void RefreshAxis( );
+       virtual kVolume *GetVolumeAxisExtended(int wz1,int wz2);
+       virtual int  GetMaxActualSlice();
+       virtual void Set3DRegionSliceActor( int type, int k1,int k2 );
+       virtual void DetectHealthySickSlice( bool minSurf , bool maxSurf );
+       virtual void Show3DStartRegionSliceActor(int type );
+       virtual void Set3DEndRegionSliceActor( int type, int k );
+       virtual void Show3DEndRegionSliceActor(int type );
+       virtual void Hide3DStartRegionSliceActor(int type );
+       virtual void Hide3DEndRegionSliceActor(int type );
+       virtual int  GetSizeHealthyRegion();
+       virtual void SetSizeHealthyRegion(int size);
+       virtual int  GetHealthySlice();
+       virtual void OnContourWall();
+       virtual void OnContourLumen();
+       virtual void OnContourHypo();
+       virtual void OnContourCalc();
+       virtual void OnReplaceContourWall();
+       virtual void OnReplaceContourLumen();
+       virtual void OnReplaceContourHypo();
+       virtual void OnReplaceContourCalc();
+       virtual void OnSliderDiscontinuityScroll(int percentage);
+       virtual void OnSliderLumenPercentageScroll(int percentage);
+       virtual void OnSliderCalcPercentageScroll(int percentage);
+       virtual void OnCalibration(); 
+       virtual void OnFile();
+       virtual void OnShowAll(bool value); 
+       virtual void OnShowWall(bool value);
+       virtual void OnShowLumen(bool value);
+       virtual void OnShowCalc(bool value);
+       virtual void OnShowHypo(bool value);
+       
+
+private:
+
+
+
+};
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPnlSearchStenosisAutomatic: public wxPanel{
+public:
+       wxPnlSearchStenosisAutomatic(wxWindow* parent, wxQuantificationWidget_base *quantificationWidget_base);
+       void OnBtHealthySlice(wxCommandEvent& event);
+       void OnBtEndRegion(wxCommandEvent& event);
+       void OnBtStart(wxCommandEvent& event);
+       void OnBtPlus(wxCommandEvent& event);
+       void OnBeginSlider(wxScrollEvent& event);
+       void OnEndSlider(wxScrollEvent& event);
+       void OnBtMaxSurf(wxCommandEvent& event);
+       void OnRbArea(wxCommandEvent& event);
+       void OnRbDiameter(wxCommandEvent& event);
+       void OnBtAxisMPR(wxCommandEvent& event);
+
+       void SetRange(int min, int max);
+
+private:
+       wxQuantificationWidget_base                             *_quantificationWidget_base;
+
+//    wxStaticText     *_st1_blank;
+    wxStaticText       *_st1_text1;
+    wxStaticText       *_st1_next1;
+    wxStaticText       *_st1_next2;
+    wxStaticText       *_st1_next3;
+    wxStaticText       *_st1_cero;
+    wxStaticText       *_st1_one;
+    wxStaticText       *_st1_two;
+    wxStaticText       *_st1_three;
+    wxButton           *_bt1_HealthySlice;
+    wxButton           *_bt1_EndRegion;
+    wxButton           *_bt1_Start;
+
+       // Special Panel
+       wxButton                *_bt_plus;
+       wxPanel                 *_panelSpecial;
+       wxStaticText    *_st_BeginRegion;
+       wxStaticText    *_st_EndRegion;
+       wxSlider                *_sl_BeginRegion;
+       wxSlider                *_sl_EndRegion;
+    wxRadioButton      *_rb_diameter;
+    wxRadioButton      *_rb_surface;
+       wxButton                *_bt_MaxSurface;
+
+}; 
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPnlSearchStenosisManual : public wxPanel{
+public:
+       wxPnlSearchStenosisManual(wxWindow* parent, wxQuantificationWidget_base *quantificationWidget_base);
+       void OnBtHealthySlice(wxCommandEvent& event);
+
+private:
+       wxQuantificationWidget_base                             *_quantificationWidget_base;
+//    wxStaticText     *_st2_blank;
+    wxStaticText       *_st2_text1;
+    wxStaticText       *_st2_text2;
+    wxStaticText       *_st2_next1;
+    wxStaticText       *_st2_next2;
+    wxStaticText       *_st2_cero;
+    wxStaticText       *_st2_one;
+    wxStaticText       *_st2_two;
+    wxButton           *_bt2_HealthySlice;
+}; 
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPnlSearchStenosis : public wxPanel{
+public:
+       wxPnlSearchStenosis(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base);
+       void OnRbAutomatic(wxCommandEvent& event);
+       void OnRbManual(wxCommandEvent& event);
+       wxPnlSearchStenosisAutomatic* GetPanelAutomatic();
+
+private:
+       wxQuantificationWidget_base     *_quantificationWidget_base;
+       // Automatic Stenosis Quantification Panel
+       wxPnlSearchStenosisAutomatic    *_panelAutomatic;
+       // Manual Stenosis Quantification Panel
+       wxPanel                                                 *_panelManual;
+}; 
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+class wxPanelSizeHealthyRegion : public wxPanel {
+public :
+       wxPanelSizeHealthyRegion(wxWindow* parent, wxQuantificationWidget_base *quantificationWidget_base);
+private:
+       wxQuantificationWidget_base     *_quantificationWidget_base;
+       wxSlider                                        *_sl_Size;
+
+       void OnButtonRefresh(wxScrollEvent& event);
+};
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPnlModifyContour : public wxPanel{
+public:
+       wxPnlModifyContour(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base);
+       void OnNewContour(wxCommandEvent& event);
+       void OnFixContour(wxCommandEvent& event);
+
+       
+private:
+    wxQuantificationWidget_base                                *_quantificationWidget_base;
+       wxButton                *_newContour;
+       wxButton                *_editContour;
+       wxButton                *_fixContour;
+       wxButton                *_cancelContour;
+       wxRadioButton   *_insert;
+       wxRadioButton   *_erase;
+       wxRadioButton   *_move;
+
+       wxStaticText    *_one;
+       wxStaticText    *_two;
+       wxStaticText    *_three;
+       wxStaticText    *_msg;
+
+}; 
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPanelControlsHealthySickSlice2 : public wxPanel{
+public:
+       wxPanelControlsHealthySickSlice2(wxWindow* parent , wxQuantificationWidget_base *quantificationWidget_base);
+       wxPnlSearchStenosis *GetPnlSearStenosis();
+private: 
+       wxPnlSearchStenosis                     *wxpnlsearchstenosis;
+};  
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPnlContourControl : public wxPanel{
+public:
+
+
+       wxPnlContourControl(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base);
+       void OnSliderDiscontinuityScroll(wxScrollEvent& event);
+       void OnSliderLumenPercentageScroll(wxScrollEvent& event);
+       void OnSliderCalcPercentageScroll(wxScrollEvent& event);
+       void OnCalibration(wxScrollEvent& event);
+       void OnFile(wxScrollEvent& event);
+
+private:
+       wxQuantificationWidget_base     *_quantificationWidget_base;
+       wxSlider                                        *_sl_Discontinuity;
+       wxSlider                                        *_sl_LumenPercentage;
+       wxSlider                                        *_sl_CalcPercentage;
+       wxButton                                        *btnCalibration;
+       wxButton                                        *btnFile;
+
+       wxStaticText                            *_st_Discontinuity;
+       wxStaticText                            *_st_LumenPercentage;
+       wxStaticText                            *_st_CalcPercentage;
+};
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPanelControlsHealthySickSliceCT : public wxPanel{
+public:
+       wxPanelControlsHealthySickSliceCT(wxWindow* parent , wxQuantificationWidget_base *quantificationWidget_base);
+private: 
+};
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+class wxPnlManualContour : public wxPanel{
+public:
+       wxPnlManualContour(wxWindow* parent,wxQuantificationWidget_base *quantificationWidget_base);
+       void OnContourWall(wxCommandEvent& event);
+       void OnContourLumen(wxCommandEvent& event);
+       void OnContourHypo(wxCommandEvent& event);
+       void OnContourCalc(wxCommandEvent& event);
+       void OnReplaceContourWall(wxCommandEvent& event);
+       void OnReplaceContourLumen(wxCommandEvent& event);
+       void OnReplaceContourHypo(wxCommandEvent& event);
+       void OnReplaceContourCalc(wxCommandEvent& event);
+       void OnShowAll(wxCommandEvent& event);
+       void OnShowWall(wxCommandEvent& event);
+       void OnShowLumen(wxCommandEvent& event);
+       void OnShowCalc(wxCommandEvent& event);
+       void OnShowHypo(wxCommandEvent& event);
+
+private:
+       wxQuantificationWidget_base     *_quantificationWidget_base;
+       wxButton                                        *btnContourWall;
+       wxButton                                        *btnContourLumen;
+       wxButton                                        *btnContourCalc;
+       wxButton                                        *btnContourHypo;
+       wxButton                                        *btnContourAB;
+       wxButton                                        *fixContourWall;
+       wxButton                                        *fixContourLumen;
+       wxButton                                        *fixContourCalc;
+       wxButton                                        *fixContourHypo;
+       wxCheckBox                                      *cbShowAllManual; 
+       wxCheckBox                                      *cbShowWall;
+       wxCheckBox                                      *cbShowLumen;
+       wxCheckBox                                      *cbShowCalc;
+       wxCheckBox                                      *cbShowHypo;
+       
+};
+
+#endif // __WX__MARACAS__QUANTIF__WDG__BASE__HXX__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxReadingPriorityPanel.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxReadingPriorityPanel.cpp
new file mode 100644 (file)
index 0000000..90965cb
--- /dev/null
@@ -0,0 +1,1172 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        Test_ReadingPriorityFrm.cpp
+// Purpose:     
+// Author:      
+// Modified by: 
+// Created:     
+// RCS-ID:      
+// Copyright:   (C)2003 
+// Licence:     wxWindows
+/////////////////////////////////////////////////////////////////////////////
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#include "wx/wxprec.h"
+#include <wx/thread.h>
+
+
+#ifndef WX_PRECOMP
+       #include "wx/wx.h"
+#endif
+
+#include "wxReadingPriorityPanel.h"
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+PriorityLoop::PriorityLoop(){
+       _vecIdImage                     =       NULL;
+       _loadingSerie           =       false;
+       _forceReadRegion        =       false;
+       _i_forceReadReagion =   -1;
+       _needToChange       =   false;
+       _deltaImg                       =       0;
+}
+// ----------------------------------------------------------------------------
+PriorityLoop::~PriorityLoop(){
+       if (_vecIdImage!=NULL) {
+               free(_vecIdImage);
+       }
+}
+// ----------------------------------------------------------------------------
+void PriorityLoop::StopLoop(){
+       _loadingSerie = false;
+}
+// ----------------------------------------------------------------------------
+bool PriorityLoop::IsLoop(){
+       return _loadingSerie;
+}
+// ----------------------------------------------------------------------------
+void PriorityLoop::ForceEndLoopRegion(){
+       _forceReadRegion=true;
+}
+
+// ----------------------------------------------------------------------------
+void PriorityLoop::InitLoop(){
+       _loadingSerie = true;
+       NeedToChange();
+       Create_Empty_Vector();
+       InitConfiguration();
+       _counterReading = 0;
+}
+
+// ----------------------------------------------------------------------------
+void PriorityLoop::Iteration(){
+
+       NeedToChange();
+
+       if (_forceReadRegion==false){
+               int ii,i=Get_i_image();
+               for (ii=i-_deltaImg;ii<=i+_deltaImg;ii++){
+                       if (_Action_i( ii )==true){
+                               _counterReading++;
+                       }
+               }
+       } else {
+               _loadingSerie=_ForceEndLoopRegion();
+       }
+
+       if (_counterReading==_maxImages){
+               _loadingSerie=false;
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+bool PriorityLoop::_ForceEndLoopRegion (){
+       bool ok=true;
+       if (_i_forceReadReagion==-1){
+               _i_forceReadReagion=_start;
+       }
+       _Action_i( _i_forceReadReagion );
+       _i_forceReadReagion++;
+       if (_i_forceReadReagion>_end){
+               ok=false;
+       }
+       return ok;
+}
+// ----------------------------------------------------------------------------
+void PriorityLoop::Create_Empty_Vector(){
+       if (_vecIdImage!=NULL) {
+               free(_vecIdImage);
+       }
+       _vecIdImage =  (bool*)malloc(sizeof(bool)*(_maxImages+1) );
+       int i;
+       for (i=0; i<=_maxImages;i++){
+               _vecIdImage[i]=false;
+       }       
+
+}
+
+// ----------------------------------------------------------------------------
+void PriorityLoop::SetStartEndActualMax(int start,int end, int actual, int deltaImg,int maxImages){
+       _tstart         = start;
+       _tend           = end;
+       _tactual        = actual;
+       _tdeltaImg      = deltaImg;
+       _tmaxImages     = maxImages;
+       _needToChange = true;
+}
+// ----------------------------------------------------------------------------
+void PriorityLoop::NeedToChange(){
+       if (_needToChange==true){
+               _needToChange   = false;
+               _start                  = _tstart;
+               _end                    = _tend;
+               _actual                 = _tactual;
+               _deltaImg               = _tdeltaImg;
+               _maxImages              = _tmaxImages;
+               InitConfiguration();
+       }
+}
+
+// ----------------------------------------------------------------------------
+void PriorityLoop::InitConfiguration(){
+       _forceReadRegion=false;
+       int i;
+       for (i=0;i<PriorityLoadImage_MAX_P;i++){
+               _dg[i]=false;
+               _counterActual[i]=0;
+       }
+       _priorityType=0;
+       _priority=9;
+}
+
+// ----------------------------------------------------------------------------
+bool PriorityLoop::_Action_i( int i ){
+       bool ok=false;
+       if (i!=-1) {
+               if ((i>=0) && (i<_maxImages)){
+                       if (_vecIdImage[i]==false ) {
+                               Action_i(i);
+                               _vecIdImage[i]=true;
+                               ok=true;
+                       }
+               }
+       }
+       return ok;
+}
+
+// ----------------------------------------------------------------------------
+void PriorityLoop::Action_i( int i ){
+}
+
+// ----------------------------------------------------------------------------
+int PriorityLoop::Get_i_image(){
+       int p=4;
+
+       int i=-1;
+       while ((i==-1) || (p==4) ){
+               if (_priorityType==0){
+                       if ((_priority<=9) && (_priority>=5))   { p=0; }
+                       if ((_priority<=4) && (_priority>=2))   { p=1; }
+                       if ((_priority<=1) && (_priority>=0))   { p=2; }
+               }
+               if (_priorityType==1){
+                       if ((_priority<=9) && (_priority>=4))   { p=1; }
+                       if ((_priority<=3) && (_priority>=2))   { p=2; }
+                       if ((_priority<=1) && (_priority>=0))   { p=3; }
+               }
+               if (_priorityType==2){
+                       if ((_priority<=9) && (_priority>=3))   { p=2; }
+                       if ((_priority<=2) && (_priority>=0))   { p=3; }
+               }
+               if (_priorityType==3){
+                       if ((_priority<=9) && (_priority>=0))   { p=3; }
+               }
+               if (_priorityType==4){
+                       p=4;
+               }
+               _priority--;
+               if (_priority==-1) {_priority=9;}
+
+               if (p==0) { i=Geti(p,5,_start,_actual           ,_actual                ,_end);                 }
+               if (p==1) { i=Geti(p,1,_start,_actual           ,_actual                ,_end);                 }
+               if (p==2) { i=Geti(p,5,0         ,_start                ,_end                   ,_maxImages);   }
+               if (p==3) { i=Geti(p,1,0         ,_start                ,_end                   ,_maxImages);   }
+               if (p==4) { i=Geti(p,1,0         ,_maxImages    ,_maxImages             ,_maxImages);   }
+
+               if ((_priorityType==0) && (p==0) && (i==-1)) { _priorityType++; _priority=9; }
+               if ((_priorityType==1) && (p==1) && (i==-1)) { _priorityType++; _priority=9; }
+               if ((_priorityType==2) && (p==2) && (i==-1)) { _priorityType++; _priority=9; }
+               if ((_priorityType==3) && (p==3) && (i==-1)) { _priorityType++; _priority=9; }
+       }
+       return i;
+}
+
+// ----------------------------------------------------------------------------
+
+int PriorityLoop::Geti(int id,int step,int start,int actualg,int actuald,int end){
+       int tempig=0;
+       int tempid=0;
+       int i=-2;
+       while (i==-2){
+               if (_dg[id]==true) { _counterActual[id] = _counterActual[id]+step; }
+               tempig=actualg - _counterActual[id];
+               tempid=actuald + _counterActual[id];
+               if (_dg[id]==true){
+                       if (tempig>=start) { 
+                               if (_vecIdImage[tempig]==false ) {
+                                       i=tempig;
+                               }
+                       }
+               }
+               if (_dg[id]==false){
+                       if (tempid<=end) { 
+                               if (_vecIdImage[tempid]==false ) {
+                                       i=tempid;
+                               }
+                       }
+               }
+               if ((tempig<start) && (tempid>end)){
+                       i=-1;
+               }
+               _dg[id]=!_dg[id];
+       }
+       return i;
+}
+// ----------------------------------------------------------------------------
+void PriorityLoop::WaitUntil_i_isDone(int i){
+       WaitUntil_segment_isDone(i-_deltaImg,i+_deltaImg,false);
+}
+// ----------------------------------------------------------------------------
+void PriorityLoop::WaitUntil_segment_isDone(int start, int end,bool forceEndLoopRegion){
+       if (forceEndLoopRegion==true) { ForceEndLoopRegion(); }
+       if (_loadingSerie==true){
+               int s=start,e=end;
+               if (s<0){
+                       s=0;
+               }
+               if (e>_maxImages-1){
+                       e=_maxImages-1;
+               }
+               bool ok=false;
+               while (ok==false){
+                       int i;
+                       ok=true;
+                       for (i=s;i<=e;i++){
+                               ok = ok && _vecIdImage[i];
+                       }
+                       if (ok==false) { 
+                               RefreshForce();
+                               wxThread::Sleep(100); 
+                       }
+               }
+       }
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+PriorityLoadImageBar::PriorityLoadImageBar(marFilesBase *marfilesbase, BarLoading *bar){
+       _marfilesbase=marfilesbase;
+       _bar=bar;
+}
+// ----------------------------------------------------------------------------
+PriorityLoadImageBar::~PriorityLoadImageBar(){
+}
+// ----------------------------------------------------------------------------
+void PriorityLoadImageBar::Action_i(int i){
+
+       if (_bar!=NULL){
+
+// EED 09 Oct 2007 
+               _bar->SetI(i);
+
+               #if defined(WIN32)
+//                     _bar->Refresh(false);
+                       //_bar->Paint();
+//                     Sleep(1);
+               #else
+//                     _bar->Refresh(false);
+//                     _bar->Update();
+//                     _bar->Paint();
+//                     usleep(1000);
+               #endif
+       }
+
+
+       if (_marfilesbase!=NULL){
+               _marfilesbase->loadImage(i);
+               vtkImageData *imagedata = _marfilesbase->getVolume()->castVtk();
+               imagedata->Update();
+       }
+}
+// ----------------------------------------------------------------------------
+void PriorityLoadImageBar::RefreshForce(){
+       _bar->RefreshForce();
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(BarLoading, wxPanel)
+BEGIN_EVENT_TABLE(BarLoading, wxPanel)
+        EVT_PAINT(BarLoading::OnPaint)
+END_EVENT_TABLE()
+
+static wxMutex *s_mutexProtectingTheGlobalData=NULL;
+
+
+// ----------------------------------------------------------------------------
+BarLoading::BarLoading(wxWindow *parent, int w, int h) 
+ :wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL)
+{
+       _w=w;
+       _h=h;
+       SetSize(_w,_h);
+       SetWindowStyle(wxNO_FULL_REPAINT_ON_RESIZE);
+       _bitmap = new wxBitmap(_w,_h);
+       _flag_bitmap=true;
+       _flag2_bitmap=true;
+
+       if (s_mutexProtectingTheGlobalData!=NULL)
+       {
+               delete s_mutexProtectingTheGlobalData;
+               s_mutexProtectingTheGlobalData=NULL;
+       }
+       s_mutexProtectingTheGlobalData = new wxMutex();
+       Reset();
+}
+
+// ----------------------------------------------------------------------------
+BarLoading::~BarLoading()
+{
+}
+// ----------------------------------------------------------------------------
+void BarLoading::SetI(int i)
+{
+
+s_mutexProtectingTheGlobalData->Lock();
+
+       _flag_bitmap=false;
+
+       while (_flag2_bitmap==false){
+               //sleep force
+#if defined(WIN32)
+               Sleep(1);
+#else
+//             usleep(1000);
+#endif
+       }
+
+/*
+       wxMemoryDC temp_dc;
+       temp_dc.SelectObject( *_bitmap );
+       int x = (_w*i)/_sizeData;
+       int d = (_w/_sizeData)+1;
+       temp_dc.SetBrush(wxBrush( wxColour(0,0,255),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(0,0,255),1,wxSOLID  ));
+       temp_dc.DrawRectangle(x,0,d,_h);
+*/
+
+       lstInt.push_back(i);
+
+s_mutexProtectingTheGlobalData->Unlock();
+       _flag_bitmap=true;
+
+}
+// ----------------------------------------------------------------------------
+void BarLoading::RefreshForce()
+{
+//     Refresh();
+//     Update();
+}
+// ----------------------------------------------------------------------------
+void BarLoading::SetSizeData(int sizeData)
+{
+   _sizeData=sizeData;
+}
+// ----------------------------------------------------------------------------
+void BarLoading::Reset()
+{
+       if (_flag_bitmap==true){
+               wxMemoryDC temp_dc;
+               temp_dc.SelectObject( *_bitmap );
+               temp_dc.SetBrush(wxBrush( wxColour(255,0,0),wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(255,0,0),1,wxSOLID  ));
+               temp_dc.DrawRectangle(0,0,_w,_h);
+               lstInt.clear();
+       }
+}
+
+
+// ----------------------------------------------------------------------------
+void BarLoading::Paint( )
+{
+  _flag2_bitmap=false;
+  wxMutexLocker lock(*s_mutexProtectingTheGlobalData);
+
+
+       if (_flag_bitmap==true){
+               wxMemoryDC temp_dc;
+               temp_dc.SelectObject( *_bitmap );
+       
+       int i,ii,size=lstInt.size();
+        for (ii=0;ii<size; ii++)
+       {
+               i=lstInt[ii];
+               int x = (_w*i)/_sizeData;
+               int d = (_w/_sizeData)+1;
+               temp_dc.SetBrush(wxBrush( wxColour(0,0,255),wxSOLID  ));
+               temp_dc.SetPen(wxPen( wxColour(0,0,255),1,wxSOLID  ));
+               temp_dc.DrawRectangle(x,0,d,_h);
+       }
+       lstInt.clear();
+
+
+
+
+               wxPaintDC dc( this );
+               dc.Blit(0,0, _w, _h, &temp_dc, 0, 0);
+       }
+       _flag2_bitmap=true;//SIL//POR QUE TANTAS VECES LO MISMO??????
+       _flag2_bitmap=true;
+       _flag2_bitmap=true;
+       _flag2_bitmap=true;
+       _flag2_bitmap=true;
+       _flag2_bitmap=true;
+
+
+}
+
+
+// ----------------------------------------------------------------------------
+void BarLoading::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+       Paint();
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+/* EED Borrame
+IMPLEMENT_CLASS(BarRange, wxPanel)
+BEGIN_EVENT_TABLE(BarRange, wxPanel)
+        EVT_PAINT(BarRange::OnPaint)
+END_EVENT_TABLE()
+
+
+BarRange::BarRange(wxWindow *parent, int w, int h)
+ :wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL)
+{
+       _w=w;
+       _h=h;
+       SetSize(_w,_h);
+       SetWindowStyle(wxNO_FULL_REPAINT_ON_RESIZE);
+       _bitmap = new wxBitmap(_w,_h);
+
+       _start = 0;
+       _max   = 100;
+       _end   = _max;
+}
+// ----------------------------------------------------------------------------
+BarRange::~BarRange()
+{
+}
+// ----------------------------------------------------------------------------
+void BarRange::SetStart(int i)
+{
+       _start=i;
+}
+// ----------------------------------------------------------------------------
+void BarRange::SetActual(int i)
+{
+       _actual=i;
+}
+// ----------------------------------------------------------------------------
+void BarRange::SetEnd(int i)
+{
+       _end=i;
+}
+// ----------------------------------------------------------------------------
+void BarRange::SetMax(int i)
+{
+       _max=i;
+}
+// ----------------------------------------------------------------------------
+void BarRange::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+
+       RefreshView();
+
+    wxMemoryDC temp_dc;
+       temp_dc.SelectObject( *_bitmap );
+       wxPaintDC dc( this );
+       dc.Blit(0,0, _w, _h, &temp_dc, 0, 0);
+
+}
+// ----------------------------------------------------------------------------
+
+void BarRange::RefreshView()
+{
+       wxPoint points[3];
+
+       int px1=(_w*_start)/_max;
+       int px2=(_w*_end)/_max;
+       int px3=(_w*_actual)/_max;
+
+       wxMemoryDC temp_dc;
+       temp_dc.SelectObject( *_bitmap );
+
+       // Background
+       wxColour colourParent =  GetParent()->GetBackgroundColour();
+       temp_dc.SetBrush(wxBrush( colourParent ,wxSOLID  ));
+       temp_dc.SetPen(wxPen( colourParent ,1,wxSOLID  ));
+       temp_dc.DrawRectangle(0,0,_w,_h);
+
+       // Yellow line
+       temp_dc.SetBrush(wxBrush( wxColour(255,0,255),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(255,0,255),1,wxSOLID  ));
+       temp_dc.DrawRectangle( px1 , 0 , px2-px1 , _h );
+
+       // 2 Start End ( triangles )
+       temp_dc.SetBrush(wxBrush( wxColour(0,0,255),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(0,0,255),1,wxSOLID  ));
+       points[0].x=0;
+       points[0].y=0;
+       points[1].x=-3;
+       points[1].y=_h;
+       points[2].x=3;
+       points[2].y=_h;
+       temp_dc.DrawPolygon(3,points,px1,0);
+       temp_dc.DrawPolygon(3,points,px2,0);
+
+       // Actual ( black triangles )
+       // 2 Start End ( yellow triangles )
+       temp_dc.SetBrush(wxBrush( wxColour(255,255,0),wxSOLID  ));
+       temp_dc.SetPen(wxPen( wxColour(255,255,0),1,wxSOLID  ));
+       points[0].x = -3;
+       points[0].y = 0;
+       points[1].x = 3;
+       points[1].y = 0;
+       points[2].x = 0;
+       points[2].y = _h;
+       temp_dc.DrawPolygon(3,points,px3,0);
+
+}
+// ----------------------------------------------------------------------------
+void BarRange::RefreshForce()
+{
+       Refresh();
+       Update();
+}
+// ----------------------------------------------------------------------------
+*/
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+
+/*
+PriorityBar::PriorityBar(BarLoading *bar){
+       _bar = bar;
+}
+// ----------------------------------------------------------------------------
+PriorityBar::~PriorityBar(){
+}
+// ----------------------------------------------------------------------------
+void PriorityBar::Action_i(int i){
+       _bar->SetI(i);
+       _bar->Refresh();
+       wxThread::Sleep(100); 
+}
+// ----------------------------------------------------------------------------
+void PriorityBar::RefreshForce(){
+       _bar->RefreshForce();
+}
+*/
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+AdminThreadEED::AdminThreadEED()
+: m_condAllDone(m_mutexAllDone){
+
+        // the mutex associated with a condition must be initially locked, it will
+    // only be unlocked when we call Wait()
+    m_mutexAllDone.Lock();
+    m_waitingUntilAllDone = FALSE;
+
+}
+// ----------------------------------------------------------------------------
+AdminThreadEED::~AdminThreadEED(){
+       // the mutex must be unlocked before being destroyed
+    m_mutexAllDone.Unlock();
+}
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+MyThread::MyThread(PriorityLoop *priorityLoop,AdminThreadEED *adminThreadEED){
+   _priorityLoop       =       priorityLoop;
+   _adminThreadEED     =       adminThreadEED;
+
+}
+
+// ----------------------------------------------------------------------------
+void MyThread::OnExit(){
+    _priorityLoop->StopLoop();
+    wxCriticalSectionLocker locker(_adminThreadEED->m_critsect);
+    wxArrayThread& threads = _adminThreadEED->m_threads;
+    threads.Remove(this);
+
+    if ( threads.IsEmpty() )    {
+        if ( _adminThreadEED->m_waitingUntilAllDone ){
+            _adminThreadEED->m_waitingUntilAllDone = FALSE;
+            wxMutexLocker lock(_adminThreadEED->m_mutexAllDone);
+            _adminThreadEED->m_condAllDone.Signal();
+        }
+    }
+}
+// ----------------------------------------------------------------------------
+
+void *MyThread::Entry(){
+       _priorityLoop->InitLoop();
+       while ( _priorityLoop->IsLoop()==true ){
+        if ( TestDestroy() ){
+            break;
+               }
+               _priorityLoop->Iteration();
+    }
+    return NULL;
+}
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+LoadRangeImage::LoadRangeImage(wxWindow *parent,marFilesBase *marfilesbase ) 
+: wxPanel(parent, -1)
+{
+       _marfilesbase           = marfilesbase;
+       
+    wxPanel *panel             = new wxPanel(this, -1);
+       int wx=550;
+       _bar                            = new BarLoading(panel,wx-10,15);
+       //SIL//_barRange                        = new BarRange(panel,wx-10,5);
+       //SIL//
+       _sl_barRange_ROI        = new mBarRange(panel,wx-10 ,70);
+       _sl_barRange_ROI-> SetOrientation(true);
+       _sl_barRange_ROI -> setVisibleLabels ( true );
+       _sl_barRange_ROI -> setActiveStateTo ( true );  
+       _sl_barRange_ROI -> setDeviceBlitStart (2,2);
+       _sl_barRange_ROI -> setDeviceEndMargin(0);
+       _sl_barRange_ROI -> SetTrianglesHalfWidth(5);
+
+       
+       parent->SetBackgroundColour(wxColour(255,255,255 )) ;
+       panel->SetBackgroundColour(parent-> GetBackgroundColour());
+
+/*
+       parent->SetBackgroundColour(wxColour(255,0,0 )) ;
+       panel->SetBackgroundColour(wxColour(0,255,0 )) ;*/
+       /*
+       panel->SetBackgroundColour(wxColour(0,0,0 ));
+       parent->SetBackgroundColour(wxColour(255,0,0 ));
+       (parent->GetParent())->SetBackgroundColour(wxColour(0,255,0 )) ;
+       ((parent->GetParent())->GetParent())->SetBackgroundColour(wxColour(0,0,255 )) ;*/
+       
+
+       _sl_barRange_ROI-> setBackgroundColor( parent-> GetBackgroundColour()/*wxColour(255,255,255 )*/);
+       reseteableActual =true;
+
+
+/*_//SIL//
+       _sldActual                      = new wxSlider(panel,-1,0,0,10000,wxDefaultPosition,wxSize(wx-10,20),wxSL_HORIZONTAL);
+       
+       _btnStart                       = new wxButton(panel,-1,_T("Start:"),wxDefaultPosition, wxSize(70,20) );
+       _btnEnd                         = new wxButton(panel,-1,_T("End:"),wxDefaultPosition, wxSize(70,20) );
+       _textActual                     = new wxStaticText(panel,-1,_T("Actual: 0000000000"));*/
+       _textActual                     = new wxStaticText(panel,-1,_T("  "));
+
+//EEDxx2.4
+//     _sldActual      ->SetSize(wx-10,20);
+//     _btnStart       ->SetSize(70,20);
+//     _btnEnd         ->SetSize(70,20);
+
+       //SIL//_sizer1a = new wxFlexGridSizer(1);
+       //SIL//_sizer1a->Add(_btnStart                                          );
+       //SIL//_sizer1a->Add(_textActual ,wxALIGN_CENTER,0      );
+       //SIL//_sizer1a->Add(_btnEnd                                            );
+
+//     _btnStart       ->Show(true);
+//     _btnEnd         ->Show(true);
+
+       //SIL//_sizer1a->Show(_btnStart, false);
+       //SIL//_sizer1a->Show(_btnEnd, false);
+
+
+//     _sizer1a = new wxFlexGridSizer(1);
+//     _sizer1a->Add(_textActual ,wxALIGN_CENTER,0     );
+
+       wxFlexGridSizer *sizer1 = new wxFlexGridSizer(1);
+//     sizer1->AddGrowableRow(1);
+//     wxBoxSizer *sizer1 =  new wxBoxSizer(wxVERTICAL );
+       //SIL//sizer1->Add(_sldActual);
+       sizer1->Add(_bar);
+       //SIL//sizer1->Add(_barRange);
+       //SIL//
+       sizer1->Add(_sl_barRange_ROI,1,wxEXPAND,0);
+
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+//     sizer -> AddGrowableRow(1);//SIL//
+//     sizer->Add(_sizer1a, 1, wxALL , 5 );
+       sizer->Add(_textActual);
+       sizer->Add(sizer1,1,wxEXPAND,0);
+
+
+
+       /*wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
+       sizer->Add(_bar, 0, wxEXPAND);  
+       sizer->Add(_sl_barRange_ROI, 0, wxEXPAND);*/
+
+
+/*//SIL//
+       Connect(_btnStart->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED      , (wxObjectEventFunction) (wxCommandEventFunction) &LoadRangeImage::OnBtnStart          );
+       Connect(_btnEnd->GetId()        , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) (wxCommandEventFunction) &LoadRangeImage::OnBtnEnd                    );
+*/
+       //Connect(_sldActual->GetId() , wxEVT_COMMAND_SLIDER_UPDATED    , (wxObjectEventFunction) (wxEventFunction) (wxScrollEventFunction) &LoadRangeImage::OnSliceActual      );
+       //SIL//
+       Connect(_sl_barRange_ROI->GetId(),wxEVT_TSBAR,(wxObjectEventFunction) (wxCommandEventFunction) &LoadRangeImage::OnBarrange );
+       Connect(_sl_barRange_ROI->GetId(),wxEVT_TSBAR_START,(wxObjectEventFunction) (wxCommandEventFunction)  &LoadRangeImage::OnStartChange_BarRange );
+       Connect(_sl_barRange_ROI->GetId(),wxEVT_TSBAR_END,(wxObjectEventFunction) (wxCommandEventFunction)  &LoadRangeImage::OnEndChange_BarRange );
+       Connect(_sl_barRange_ROI->GetId(),wxEVT_TSBAR_ACTUAL,(wxObjectEventFunction) (wxCommandEventFunction)  &LoadRangeImage::OnActualChange_BarRange );
+       Connect(_sl_barRange_ROI->GetId(),wxEVT_TSBAR_MOVED,(wxObjectEventFunction) (wxCommandEventFunction)  &LoadRangeImage::OnBarMoved_BarRange );
+       Connect(_sl_barRange_ROI->GetId(),wxEVT_SELECTION_END,(wxObjectEventFunction) (wxCommandEventFunction)  &LoadRangeImage::OnSelectionEnd_BarRange );
+
+       // EED
+       _timer=NULL;
+#if defined(WIN32)
+       //...
+#else
+    _timer = new wxTimer(this);
+       _timer->Start(100);
+    Connect( _timer->GetId(), wxEVT_TIMER , (wxObjectEventFunction) (wxTimerEventFunction)  &LoadRangeImage::OnTimer );
+#endif
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout( TRUE );
+
+       this->SetSize(wx,75);
+       panel->SetSize(wx,75);
+
+       _mythread                       = NULL;
+       _priorityLoadImageBar           = new PriorityLoadImageBar(_marfilesbase,_bar);
+       _adminThreadEED                 = new AdminThreadEED();
+}
+// ----------------------------------------------------------------------------
+LoadRangeImage::~LoadRangeImage()
+{
+       if (_timer!=NULL){
+               _timer->Stop();
+               delete _timer;
+       }
+       _Stop();
+}
+
+// ----------------------------------------------------------------------------
+void LoadRangeImage::ResetLoadRegion()
+{
+       int s,e,a;
+       s=_startSlice;
+       e=_endSlice;
+       //SIL//a=_sldActual->GetValue();
+       //a=_sl_barRange_ROI->GetActual();
+       a = _toShowSlice;
+       if ((a<s) || (a>e))
+       {
+               s=0;
+               e=_maxZ;
+       } 
+       _priorityLoadImageBar->SetStartEndActualMax(s,e,a,0,_maxZ);
+}
+
+// ----------------------------------------------------------------------------
+void LoadRangeImage::Start(  )
+{
+
+    vtkImageData *vol = _marfilesbase->getVolume( )->castVtk();
+       int dim[3];
+       vol->GetDimensions(dim);
+       _maxZ=dim[2]-1;
+
+       _startSlice     =       0;
+       _endSlice       =       _maxZ;
+
+       this->SetStartSlice(_startSlice);
+       this->SetEndSlice(_endSlice);
+
+
+       _bar ->                 SetSizeData(_maxZ);
+//SIL// Para quitar luego als siguientes dos lineas
+       /*_sldActual -> SetRange(0, _maxZ);
+       _sldActual ->   SetValue( _maxZ/2 );*/
+
+       //SIL//
+       _sl_barRange_ROI -> setRepresentedValues (0,_maxZ);
+       _sl_barRange_ROI -> SetActual(_maxZ/2);
+       _sl_barRange_ROI -> RefreshForce();     
+
+
+       SetStartSlice( 0 );
+       SetEndSlice( _maxZ );
+       _toShowSlice = _sl_barRange_ROI->GetActual();
+       RefreshSlice();
+
+//EEDx44
+       _marfilesbase->ResetLstFileNotReaded();
+
+       _Start();
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::_Start()
+{
+
+       ResetLoadRegion();
+       _mythread = new MyThread (_priorityLoadImageBar,_adminThreadEED);
+       _mythread->Create();
+       wxCriticalSectionLocker enter(_adminThreadEED->m_critsect);
+       _adminThreadEED->m_threads.Add(_mythread);
+       if ( _mythread->Run() != wxTHREAD_NO_ERROR ){
+               wxLogError(wxT("Can't start thread!"));
+       }
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::_Stop(  )
+{
+
+    _adminThreadEED->m_critsect.Enter();
+    // stop the last thread
+    if ( _adminThreadEED->m_threads.IsEmpty() ){
+        //wxLogError(wxT("No thread to stop!"));
+       _adminThreadEED->m_critsect.Leave();
+    } else {
+        wxThread *_mythread = _adminThreadEED->m_threads.Last();
+        // it's important to leave critical section before calling Delete()
+        // because delete will (implicitly) call OnExit() which also tries
+        // to enter the same crit section - would dead lock.
+        _adminThreadEED->m_critsect.Leave();
+        _mythread->Delete();
+    }
+
+}
+
+// ----------------------------------------------------------------------------
+/*
+void LoadRangeImage::OnBtnRestart( wxCommandEvent& event ){
+       _priorityLoadImageBar->WaitUntil_segment_isDone( _sldStart->GetValue(),_sldEnd->GetValue() );
+
+       OnBtnStop(event);
+       _bar->Reset();
+       _bar->Refresh();
+}
+*/
+// ----------------------------------------------------------------------------
+void LoadRangeImage::OnSliceActual(wxScrollEvent& event)
+{
+       //SIL// metodo para quitar
+       _toShowSlice = _sl_barRange_ROI->GetActual();
+       ResetLoadRegion();
+       RefreshSlice();
+}
+
+// ----------------------------------------------------------------------------
+
+void LoadRangeImage::OnBtnStart( wxCommandEvent &  event )
+{
+       //SIL// metodo para quitar
+       /*SetStartSlice( _sldActual->GetValue() );
+       ResetLoadRegion();
+       RefreshSlice();*/
+}
+
+// ----------------------------------------------------------------------------
+void LoadRangeImage::OnBtnEnd( wxCommandEvent &  event )
+{
+       //SIL// metodo para quitar
+       /*SetEndSlice( _sldActual->GetValue() );
+       ResetLoadRegion();
+       RefreshSlice();*/
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::SetStartEnd( int start, int end )
+{
+       SetStartSlice( start );
+       SetEndSlice( end );
+       ResetLoadRegion();
+       RefreshSlice();
+}
+
+// ----------------------------------------------------------------------------
+void LoadRangeImage::Reset( )
+{
+       int delta= (int) (_maxZ*0.1);
+       SetStartSlice( 0 + delta );
+       SetEndSlice( _maxZ - delta );
+
+//EEDxx2.4
+//     _btnStart       ->Show(true);
+//     _btnEnd         ->Show(true);
+
+       //SIL//_sizer1a->Show(_btnStart, true );
+       //SIL//_sizer1a->Show(_btnEnd   , true );
+//    _sizer1a->Layout();      
+       RefreshSlice();
+}
+
+// ----------------------------------------------------------------------------
+void LoadRangeImage::SetStartSlice(int value)
+{
+       if (value<_endSlice){
+               _startSlice     = value;
+               /*wxString txt;
+               txt.Printf(_T("%d"),_startSlice);
+               _textActual->SetLabel(txt);*/
+               
+               //SIL// para quitar las siguientes 4 lineas
+               /*
+               _btnStart->SetLabel(_T("Start:  ")+txt);
+               _barRange->SetMax(_maxZ);
+               _barRange->SetStart(_startSlice);
+               _barRange->RefreshForce();*/
+
+               //SIL//
+               _sl_barRange_ROI->SetMax(_maxZ);
+               _sl_barRange_ROI->SetStart(_startSlice);
+               _sl_barRange_ROI->RefreshForce(); 
+       }
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::SetEndSlice(int value)
+{
+       if (value>_startSlice){
+               _endSlice       = value;
+               /*wxString txt;
+               txt.Printf(_T("%d"),_endSlice);
+               _textActual->SetLabel(txt);*/
+               //SIL//_btnEnd->SetLabel(_T("End:  ")+txt);
+               _sl_barRange_ROI->SetEnd(_endSlice);
+               _sl_barRange_ROI->RefreshForce(); 
+
+       }
+}
+
+// ----------------------------------------------------------------------------
+void LoadRangeImage::RefreshSlice()
+{
+//SIL//        _priorityLoadImageBar->WaitUntil_i_isDone( _sldActual->GetValue() );
+       _priorityLoadImageBar->WaitUntil_i_isDone( _toShowSlice );
+
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,12122);
+       this->GetParent()->ProcessEvent(newevent);
+/* //SIL//
+       wxString text;  
+       //SIL//text.Printf(_T("Actual: %d "), _sldActual->GetValue() );
+       text.Printf(_T("Start: %d\n Actual: %d\n End: %d"), _sl_barRange_ROI->GetStart(),_sl_barRange_ROI->GetActual(),_sl_barRange_ROI->GetEnd() );
+       _textActual->SetLabel(text);*/
+       
+       //SIL// Para borrar las lineas de barrange
+       /*_barRange->SetMax(_maxZ);
+       _barRange->SetActual( _sldActual->GetValue() );
+       _barRange->SetStart(_startSlice);
+       _barRange->SetEnd(_endSlice);
+       _barRange->RefreshForce();*/
+
+       //SIL//
+       // EED
+//     _sl_barRange_ROI->SetMax(_maxZ);
+       //_sl_barRange_ROI->SetActual(  _sldActual->GetValue() );
+//     _sl_barRange_ROI->SetStart(_startSlice);
+//     _sl_barRange_ROI->SetEnd(_endSlice);
+       _sl_barRange_ROI->RefreshForce();
+
+//EED 28 Fev 2008
+//     _bar->Refresh();
+//     _bar->Update();
+
+   Refresh(false);
+//     _imageViewerWidget->SetZSlice( _sldActual->GetValue()  );
+//     _imageViewerWidget->Render();
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::CallBackOnMouseWheel( wxMouseEvent& event )
+{
+       /* //SIL ImageViewer no existe//int actual = _imageViewerWidget->GetZSlice();
+       if (actual<_sl_barRange_ROI->GetActual()) {
+               actual = _sl_barRange_ROI->GetActual();
+       }
+       if (actual>_sl_barRange_ROI->GetEnd()) {
+               actual = _sl_barRange_ROI->GetEnd();
+       }
+       _sl_barRange_ROI->SetActual( actual );
+       ResetLoadRegion();
+       RefreshSlice();
+*/
+       /*int actual = _imageViewerWidget->GetZSlice();
+       if (actual<_sldStart->GetValue()) {
+               actual = _sldStart->GetValue();
+       }
+       if (actual>_sldEnd->GetValue()) {
+               actual = _sldEnd->GetValue();
+       }
+       _sldActual->SetValue( actual );
+       ResetLoadRegion();
+       RefreshSlice();*/
+
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::ForceToFinisReadActiveImages()
+{
+       int s=_startSlice;
+       int e=_endSlice;
+
+       _priorityLoadImageBar->WaitUntil_segment_isDone(s,e,true);
+
+
+//EEDx44
+       std::string msgLstFile( _marfilesbase->GetMsgLstFile() );
+       if ( msgLstFile!="")
+       {
+               wxDialog *dialog = new wxDialog( this , -1, wxString(_T("The following files doesn't exist:")), wxDefaultPosition, wxSize(550,300),  wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );                        
+               wxTextCtrl *textCtrl = new wxTextCtrl(dialog, -1, wxString (msgLstFile.c_str(), wxConvUTF8) ,wxDefaultPosition , wxSize(100,100) , wxTE_MULTILINE | wxTE_READONLY );
+               textCtrl->SetSelection(0,0);
+               wxBoxSizer *sizer       = new wxBoxSizer(wxVERTICAL  );
+               sizer->Add( textCtrl , 1, wxALL|wxEXPAND, 0);
+               dialog->SetAutoLayout(true);
+               dialog->SetSizer( sizer );      // use the sizer for layout
+               dialog->Layout(); 
+//EEDxx2.4
+//             dialog->FitInside();
+               dialog->ShowModal();
+       }
+
+
+
+
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::GetROI( int extent[6] )
+{
+       extent[4]=_startSlice;
+       extent[5]=_endSlice;
+}
+// ----------------------------------------------------------------------------
+void LoadRangeImage::SetActualSlice( int actual )
+{
+
+       if ( actual > _endSlice ){
+               actual=_endSlice;
+       }
+       if ( actual < _startSlice ){
+               actual = _startSlice;
+       }
+
+       //SIL//_sldActual->SetValue( actual  );//SIL// para quitar esta linea
+       //SIL//
+       _sl_barRange_ROI->SetActual( actual);//de pronto no se necesita aca
+       _toShowSlice=actual;
+
+       ResetLoadRegion();
+       RefreshSlice();
+}
+// ----------------------------------------------------------------------------
+int LoadRangeImage::GetActualSlice( )
+{
+       return _toShowSlice;/*_sl_barRange_ROI->GetActual()*/; 
+}
+// ----------------------------------------------------------------------------
+
+void  LoadRangeImage::ResetActualSlice( )
+{
+       if( reseteableActual )
+               _toShowSlice = _sl_barRange_ROI->GetActual();
+}
+
+//------------------------------------------------------------------------
+// Events captured form the barrange used configuring the ROI
+//------------------------------------------------------------------------
+void  LoadRangeImage::OnBarrange(wxCommandEvent& event)
+{
+       
+}
+void  LoadRangeImage::OnActualChange_BarRange(wxCommandEvent& event)
+{
+       //reseteableActual =true;
+       _toShowSlice = _sl_barRange_ROI->GetActual();
+       ResetLoadRegion();
+       RefreshSlice(); 
+}
+void  LoadRangeImage::OnStartChange_BarRange(wxCommandEvent& event)
+{      
+       reseteableActual =false;
+       _toShowSlice = _sl_barRange_ROI->GetStart();
+       SetStartSlice( _sl_barRange_ROI->GetStart() );
+       ResetLoadRegion();
+       RefreshSlice();
+}
+
+void  LoadRangeImage::OnEndChange_BarRange(wxCommandEvent& event)
+{
+       reseteableActual =false;
+       _toShowSlice = _sl_barRange_ROI->GetEnd();
+       SetEndSlice( _sl_barRange_ROI->GetEnd() );
+       ResetLoadRegion();
+       RefreshSlice();
+}
+void  LoadRangeImage:: OnBarMoved_BarRange (wxCommandEvent& event)
+{
+       SetEndSlice( _sl_barRange_ROI->GetEnd() );
+       SetStartSlice( _sl_barRange_ROI->GetStart() );
+       ResetLoadRegion();
+       RefreshSlice();
+
+}
+void  LoadRangeImage:: OnSelectionEnd_BarRange (wxCommandEvent& event)
+{
+       reseteableActual = true;
+}
+
+// ---  Timer ------
+void LoadRangeImage:: OnTimer(wxTimerEvent& event)
+{
+//  EED  used in linux  (see constructor)
+       _bar->Refresh(false);
+       _bar->Update();
+       RefreshSlice();
+}
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxReadingPriorityPanel.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxReadingPriorityPanel.h
new file mode 100644 (file)
index 0000000..a49a007
--- /dev/null
@@ -0,0 +1,299 @@
+
+#ifndef wx_Reading_Priority_Panel_H
+#define wx_Reading_Priority_Panel_H
+
+#include <wx/wx.h>
+#include <wx/slider.h>
+#include <wx/panel.h>
+
+
+//EED 15Avril2008 
+//  #include "wxImageViewerWidget.h"
+#include "InterfaceVtkPanelWidgets.h"
+
+#include "marGdcmDicom.h"
+#include "pPlotter/mBarRange.h"//SIL//
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+
+#define PriorityLoadImage_MAX_P 5
+
+class PriorityLoop  {
+       public:
+               PriorityLoop();
+               ~PriorityLoop();
+                               void    SetStartEndActualMax(int start,int end, int actual,int deltaImg, int maxImages);
+                               void    Iteration();
+                               void    InitLoop();
+
+                               void    StopLoop();
+                               bool    IsLoop();
+                               void    WaitUntil_i_isDone(int i);
+                               void    WaitUntil_segment_isDone(int start, int end,bool forceEndLoopRegion=true);
+                               void    ForceEndLoopRegion();
+               virtual void    Action_i( int i );
+               virtual void    RefreshForce() {}; 
+
+       private:
+
+
+               int             _start;
+               int             _end;
+               int             _actual;
+               int             _deltaImg;
+               int             _maxImages;
+               int             _tstart;
+               int             _tend;
+               int             _tactual;
+               int             _tdeltaImg;
+               int             _tmaxImages;
+
+               int             _counterReading;
+               int             _max_p;
+               bool    _loadingSerie;
+               int     _forceReadRegion;
+               int             _i_forceReadReagion;
+               bool    _needToChange;
+
+               int             _priority;
+               int             _priorityType;
+               bool    _dg[PriorityLoadImage_MAX_P];                 // right - left
+               int             _counterActual[PriorityLoadImage_MAX_P];      // 
+               bool    *_vecIdImage;
+
+               int             Get_i_image();
+               int             Geti(int id,int step,int start,int actualg,int actuald,int end);
+               bool    _Action_i( int i );
+               void    Create_Empty_Vector();
+               void    InitConfiguration();
+               bool    _ForceEndLoopRegion();
+               void    NeedToChange();
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class BarLoading :public  wxPanel{
+public:
+       BarLoading(wxWindow *parent, int w, int h);
+       ~BarLoading();
+       void SetI(int i);
+       void Reset();
+       void Paint();
+       virtual void OnPaint( wxPaintEvent &WXUNUSED(event) );
+       void SetSizeData(int sizeData);
+       void RefreshForce();
+private:
+        std::vector<int>    lstInt;
+       int                     _w;
+       int                     _h;
+       int                     _sizeData;
+       wxBitmap        *_bitmap;
+       bool            _flag_bitmap;
+       bool            _flag2_bitmap;
+       DECLARE_CLASS(BarLoading)
+    // any class wishing to process wxWindows events must use this macro
+    DECLARE_EVENT_TABLE()
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+/*  EED Borrame
+class BarRange :public  wxPanel{
+public:
+       BarRange(wxWindow *parent, int w, int h);
+       ~BarRange();
+       void SetActual(int i);
+       void SetStart(int i);
+       void SetEnd(int i);
+       void SetMax(int i);
+       void OnPaint( wxPaintEvent &WXUNUSED(event) );
+       void RefreshView();
+       void RefreshForce();
+
+private:
+       int                     _w;
+       int                     _h;
+       int                     _actual;
+       int                     _start;
+       int                     _end;
+       int                     _max;
+       wxBitmap        *_bitmap;
+       DECLARE_CLASS(BarRange)
+    // any class wishing to process wxWindows events must use this macro
+    DECLARE_EVENT_TABLE()
+};
+*/
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class PriorityLoadImageBar : public PriorityLoop{
+public:
+       PriorityLoadImageBar(marFilesBase *marfilesbase, BarLoading *bar);
+       ~PriorityLoadImageBar();
+       void Action_i(int i);
+       virtual void RefreshForce();
+
+private:
+       marFilesBase    *_marfilesbase;
+       BarLoading              *_bar;
+};
+
+
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+/*
+
+class PriorityBar : public PriorityLoop{
+public:
+       PriorityBar(BarLoading *bar);
+       ~PriorityBar();
+       void Action_i(int i);
+       virtual void RefreshForce();
+
+private:
+       BarLoading *_bar;
+};
+*/
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+WX_DEFINE_ARRAY(wxThread *, wxArrayThread);
+
+class AdminThreadEED{
+public:
+       AdminThreadEED();
+       ~AdminThreadEED();
+
+       wxCriticalSection m_critsect;
+    // all the threads currently alive - as soon as the thread terminates, it's
+    // removed from the array
+    wxArrayThread m_threads;
+    // the last exiting thread should signal m_condAllDone if this is true
+    // (protected by the same m_critsect)
+    bool m_waitingUntilAllDone;
+    wxCondition m_condAllDone;
+    // the (mutex, condition) pair used to wait for the threads to exit, see
+    // MyFrame::OnQuit()
+    wxMutex m_mutexAllDone;
+
+private:
+};
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class MyThread : public wxThread{
+public:
+       MyThread(PriorityLoop *priorityLoop, AdminThreadEED *adminThreadEED);
+    virtual void* Entry();
+       virtual void  OnExit();
+private:
+       PriorityLoop *_priorityLoop;
+       AdminThreadEED *_adminThreadEED;
+};
+
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+class LoadRangeImage : public wxPanel, InterfaceVtkPanelWidgets{
+public:
+       LoadRangeImage(wxWindow *parent,marFilesBase *marfilesbase/*,wxImageViewerWidget *imageViewerWidget*/);
+       ~LoadRangeImage();
+// EED Borrame
+//     void OnSliceStart(wxScrollEvent& event);
+//     void OnSliceEnd(wxScrollEvent& event);
+       void OnSliceActual(wxScrollEvent& event);
+       void OnBtnStart(wxCommandEvent& event);
+       void OnBtnEnd(wxCommandEvent& event);
+//     void OnBtnResetRoi(wxCommandEvent& event);
+       void Reset();
+
+       void RefreshSlice();
+       void SetActualSlice(int actual);
+       int  GetActualSlice();
+       void ResetActualSlice();
+
+       virtual void CallBackOnMouseWheel( wxMouseEvent& event );
+       void Start();
+       void ForceToFinisReadActiveImages();
+       void GetROI( int extent[6] );
+       void SetStartEnd( int start, int end );
+
+       //SIL//
+       // --------------------------------------
+       // Events captured form the barrange used configuring the ROI
+       // --------------------------------------
+       void  OnBarrange(wxCommandEvent& event);
+       void  OnActualChange_BarRange(wxCommandEvent& event);
+       void  OnStartChange_BarRange(wxCommandEvent& event);
+       void  OnEndChange_BarRange(wxCommandEvent& event);
+       void  OnBarMoved_BarRange(wxCommandEvent& event);
+       void  OnSelectionEnd_BarRange(wxCommandEvent& event);
+
+       void OnTimer(wxTimerEvent& event);
+
+private:
+
+       wxTimer                         *_timer;
+       bool                            reseteableActual;
+       int                             _toShowSlice;
+       int                             _maxZ;
+       marFilesBase                    *_marfilesbase;
+// EED Borrame
+//     wxSlider                                *_sldStart;
+//     wxSlider                                *_sldEnd;
+       int                                             _startSlice;
+       int                                             _endSlice;
+//     wxSlider                                *_sldActual;
+       BarLoading                              *_bar;
+
+// EED Borrame
+//     BarRange                                *_barRange;
+
+       //SIL//
+       mBarRange                               *_sl_barRange_ROI;
+       PriorityLoadImageBar    *_priorityLoadImageBar;
+       AdminThreadEED                  *_adminThreadEED;
+       MyThread                                *_mythread;
+
+       wxFlexGridSizer                 *_sizer1a;
+       wxButton                                *_btnStart;
+       wxButton                                *_btnEnd;
+       wxStaticText                    *_textActual; 
+
+//     wxImageViewerWidget             *_imageViewerWidget;
+
+       void    ResetLoadRegion();
+       void    _Start();
+       void    _Stop();
+
+       void    SetStartSlice(int value);
+       void    SetEndSlice(int value);
+
+
+};
+
+
+
+
+
+
+
+#endif // wx_Reading_Priority_Panel_H
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_02.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_02.cxx
new file mode 100644 (file)
index 0000000..f0f5ccf
--- /dev/null
@@ -0,0 +1,726 @@
+
+#include "vtkObjectFactory.h"
+
+#include "vtkActor.h"
+#include "vtkCylinderSource.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkProperty.h"
+#include "vtkCamera.h"
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+#include "vtkPolyData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataWriter.h"
+#include "vtkPolyDataReader.h"
+#include "vtkImageReader.h"
+#include "vtkImageViewer.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageToStructuredPoints.h"
+#include <vtkImageThreshold.h> 
+#include "vtkImageWriter.h"
+
+
+#include "vtkExtractVOI.h"
+#include "vtkImageClip.h"
+#include "vtkImageResample.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkImageReslice.h"
+#include "vtkTransform.h"
+#include "vtkSphereSource.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkCommand.h"
+#include "vtkCallbackCommand.h"
+#include "vtkImageResample.h"
+#include "vtkMath.h"
+#include "vtkStripper.h"
+#include <vtkSTLReader.h> 
+
+
+#include "vtkTriangleFilter.h"
+#include "vtkSTLWriter.h"
+#include "vtkPolyDataConnectivityFilter.h"
+#include "vtkClosePolyData.h"
+#include "vtkAppendFilter.h"
+
+#include "wxSTLWidget_02.h"
+
+#include <wx/splitter.h>
+
+#include <wx/filedlg.h>
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxSTLWidget_02::wxSTLWidget_02(wxWindow *parent, marInterface* mar)
+: wxPanel( parent, -1) 
+{
+       _sensibility_JF                 = 0.5;
+       _maxSphereSize_JF               = 30;
+       _minSphereSize_JF               = 5;
+
+       _stlMarchingCubesLevel  = 128;
+       _stlDeltaGaussLevel             = 100;
+
+       _mar=new marInterface();        
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+       _mar->initExperiment( );
+        
+
+       wxBoxSizer                      *sizer                  = new wxBoxSizer(wxVERTICAL  );
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( this , -1);
+       wxPanel                         *viewPanel              = CreateViewPanel(pnlSplitter);
+       wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
+
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 150 );
+    pnlSplitter        -> SplitVertically( viewPanel, controlPanel, 600 );
+       this            -> SetSizer(sizer);
+
+       // Result 2: Volume + Axis
+       _2_prgov                        = NULL;
+       _2_mapfinal                     = NULL;
+       _2_stripfinal           = NULL;
+       _2_isoMapperMC6         = NULL;
+       _2_isoActorMC6          = NULL;
+       _2_isoMC6                       = NULL;
+
+
+       //DHC STL SURFACES
+       stlInterna = NULL;
+       stlExterna = NULL;
+
+       _loadSTLMapper          = NULL;
+       _loadActorSTL           = NULL;
+
+       
+       //JOIN REGIONS
+       arteryImageData         = NULL;
+       joinMarchingCubes       = NULL;
+    joinMapper                 = NULL; 
+       joinActor                       = NULL;
+
+
+}
+//-------------------------------------------------------------------
+wxSTLWidget_02::~wxSTLWidget_02(){
+       ResetTree2_JF();
+       Reset_vtk_STLFile();
+}
+//-------------------------------------------------------------------
+wxPanel* wxSTLWidget_02::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+
+
+   // MPR
+       vtkImageData *imagedata;
+       imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       imagedata->Update();    
+       _wxMaracasMPR = new wxMaracasMPR( panel, new marImageData(imagedata), _mar->_parameters->getVoxelSize() );
+       _wxMaracasMPR->ConfigureVTK();
+       
+       sizer->Add(     _wxMaracasMPR , 1, wxEXPAND, 0);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxSTLWidget_02::CreateControlPanel(wxWindow *parent)
+{
+       wxPanel *panel                  = new wxPanel(parent,-1);
+       
+       _opacity_Res2VolJF              = new wxSlider( panel, -1, 25, 0, 100                            , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_sensibility_JF              = new wxSlider( panel, -1, 0 , 0, 100                            , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_maxSphereSize_JF    = new wxSlider( panel, -1, _maxSphereSize_JF, 0, 100 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl_minSphereSize_JF    = new wxSlider( panel, -1, _minSphereSize_JF , 0, 20 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+
+
+       int tmp_sensibility= (int)(_sensibility_JF*100.0);
+       _sl_sensibility_JF->SetValue( tmp_sensibility );
+
+       _opacity_Res2VolJF      ->SetSize(250,20);  // Result 2 Volume JF
+
+       //Extract Tree 2 JF
+       wxButton *btnExtractTree2_JF    = new wxButton(panel,-1,_T("Extract Tree 2 JF"));
+       wxButton *btnEraseTree2_JF              = new wxButton(panel,-1,_T("Erase Tree 2 JF"));
+
+
+       wxButton *btnReadSTLFile                        = new wxButton(panel,-1,_T("Read STL File"));
+       wxButton *btnEraseReadSTLFile           = new wxButton(panel,-1,_T("Erase STL File"));
+       _sl_opacity_STL_file                            = new wxSlider( panel, -1, 100 , 0, 100 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  - - -  Segmentation - - - ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))); 
+       sizer->Add(new wxStaticText(panel,-1,_T(" % Sensibility")));
+       sizer->Add(_sl_sensibility_JF);
+       sizer->Add(new wxStaticText(panel,-1,_T(" Biggest radium")));
+       sizer->Add(_sl_maxSphereSize_JF);
+       sizer->Add(new wxStaticText(panel,-1,_T(" Minimum radium")));
+       sizer->Add(_sl_minSphereSize_JF);
+
+
+       sizer->Add(btnExtractTree2_JF);
+       sizer->Add(btnEraseTree2_JF);
+
+       wxButton *btnJoinRegions = new wxButton(panel,-1,_T("Join Regions"));
+       sizer->Add(btnJoinRegions);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Result Volume")));
+       sizer->Add(_opacity_Res2VolJF);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+
+//-- STL WIDGETS
+       
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer->Add(new wxStaticText(panel,-1,_T("  - - -  STL - - - ")));
+    sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       stlSliderDeltaGauss     = new wxSlider( panel, -1, (int)(_stlDeltaGaussLevel) , 0, 300 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       stlSliderMarchingCubes= new wxSlider( panel, -1, (int)(_stlMarchingCubesLevel) , 0, 256 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       
+
+
+       sizer->Add(new wxStaticText(panel,-1,_T(" Delta Gauss")));
+       sizer->Add(stlSliderDeltaGauss);
+
+       sizer->Add(new wxStaticText(panel,-1,_T(" Marching Cubes Level")));
+       sizer->Add(stlSliderMarchingCubes);
+
+       stlSliderOpacityInternal = new wxSlider(panel, -1, 100,0,100, wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS);
+       stlSliderOpacityExternal = new wxSlider(panel, -1, 100,0,100, wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS);
+
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL Internal")));
+       sizer->Add(stlSliderOpacityInternal);
+
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL External")));
+       sizer->Add(stlSliderOpacityExternal);
+
+       wxButton *btnFileSTL = new wxButton(panel,-1,_T("Generate STL files"));
+       sizer->Add(btnFileSTL);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+//-- STL WIDGETS
+       
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(btnReadSTLFile );
+       sizer->Add(btnEraseReadSTLFile );
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL File")));
+       sizer->Add(_sl_opacity_STL_file);
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+
+       Connect(_opacity_Res2VolJF->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSTLWidget_02::OnOpacity_Res2VolJF  ); 
+       Connect(_sl_sensibility_JF->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSTLWidget_02::OnSensibility        ); 
+       Connect(_sl_maxSphereSize_JF->GetId()           , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSTLWidget_02::OnMaxSphereSize_JF   ); 
+       Connect(_sl_minSphereSize_JF->GetId()           , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSTLWidget_02::OnMinSphereSize_JF   ); 
+
+
+       Connect(btnExtractTree2_JF->GetId()             , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_02::OnBtnExtractTree2_JF ); 
+       Connect(btnEraseTree2_JF->GetId()               , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_02::OnBtnEraseTree2_JF   ); 
+       Connect(btnJoinRegions->GetId()                 , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_02::OnJoinRegions        ); 
+
+       
+       Connect(btnReadSTLFile->GetId()                 , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_02::OnBtnSTLFileLoad     ); 
+       Connect(btnEraseReadSTLFile->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_02::OnBtnSTLFileErase    ); 
+       Connect(_sl_opacity_STL_file->GetId()   , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSTLWidget_02::OnOpacitySTLFile             ); 
+
+
+       // -- STL CONNECT WIDGETS
+       Connect(btnFileSTL->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_02::OnBtnCreateFileSTL         );
+       Connect(stlSliderDeltaGauss->GetId()    , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxSTLWidget_02::OnChangeSTLGaussLevel        );
+       Connect(stlSliderMarchingCubes->GetId() , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxSTLWidget_02::OnChangeSTLMarchingCubesLevel);
+       Connect(stlSliderOpacityInternal->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxSTLWidget_02::OnOpacitySTLInternal);
+       Connect(stlSliderOpacityExternal->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxSTLWidget_02::OnOpacitySTLExternal);
+       // -- STL CONNECT WIDGETS
+
+       return panel;
+}
+
+//------------------------------------------------------------------------
+
+void wxSTLWidget_02::Refresh()
+{
+       _wxMaracasMPR->RefreshView();
+}
+
+//------------------------------------------------------------------------
+
+void wxSTLWidget_02::ConfigureVTK()
+{
+    wxBusyCursor wait;
+       vtkImageData    *imagedata              = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+
+       //CONFIGURACION ADICIONAL
+    this->ConfigureSTL();
+       this->ConfigureJoinRegions();
+
+       
+}
+
+
+void wxSTLWidget_02::ResetTree2_JF()
+{
+       // Remove 
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+
+    if (_2_isoActorMC6){
+               ren->RemoveActor(_2_isoActorMC6);
+       }
+    if (_2_stripfinal){
+               ren->RemoveActor(_2_stripfinal);
+       }
+
+       // Delete 
+       if (_2_prgov            ) {     _2_prgov                -> Delete(); }
+       if (_2_mapfinal         ) {     _2_mapfinal             -> Delete(); }
+       if (_2_stripfinal       ) {     _2_stripfinal   -> Delete(); }
+       if (_2_isoMapperMC6     ) {     _2_isoMapperMC6 -> Delete(); }
+       if (_2_isoActorMC6      ) {     _2_isoActorMC6  -> Delete(); }
+       if (_2_isoMC6           ) {     _2_isoMC6               -> Delete(); }
+
+       // Init
+       _2_prgov                = NULL;
+       _2_mapfinal             = NULL;
+       _2_stripfinal   = NULL;
+       _2_isoMapperMC6 = NULL;
+       _2_isoActorMC6  = NULL;
+       _2_isoMC6               = NULL;
+}
+
+
+
+
+
+
+//------------------------------------------------------------------------
+void wxSTLWidget_02::ExtractTree2_JF(int x, int y, int z)
+{
+       
+       double opacity_Res2VolJF = ((double)_opacity_Res2VolJF->GetValue())/100;
+       vtkImageData *imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+
+       double  puntoactualprov[3];
+       double  espprin[3];
+       int             extprin[6];                             
+
+       puntoactualprov[0]=x;
+       puntoactualprov[1]=y;
+       puntoactualprov[2]=z;
+       
+       imagedata->GetSpacing(espprin);
+       imagedata->GetExtent(extprin);
+
+       puntoactualprov[0]=puntoactualprov[0]*espprin[0];
+       puntoactualprov[1]=puntoactualprov[1]*espprin[1];
+       puntoactualprov[2]=puntoactualprov[2]*espprin[2];
+       
+       _2_prgov= axisExtractor02::New();
+       _2_prgov->SetParam(1);
+       _2_prgov->SetParam2(1);
+       _2_prgov->SetParam3(_sensibility_JF);
+       _2_prgov->SetMaxant(_maxSphereSize_JF);
+       _2_prgov->SetMinant(_minSphereSize_JF);
+       _2_prgov->SetInput(imagedata);
+       _2_prgov->SetPoint(puntoactualprov);
+       _2_prgov->Update();
+
+
+       //--------------------------------------------------------
+
+       marAxis *maraxis = this->_mar->_experiment->getAxis( );
+       
+
+       if (maraxis!=NULL) {
+               vtkPolyData  *inputAxisRadio    = maraxis->GetAxisData();
+               _2_prgov->distanciaejes(inputAxisRadio,_2_prgov->GetOutput());
+
+                       
+       }
+
+       //--------------------------------------------------------
+       
+       
+       //ADICIONAR SEGMENTO
+       if (arteryImageData){
+               arteryImageData = joiner->join(arteryImageData, _2_prgov->GetVolumen());
+       }
+       else{
+               arteryImageData = _2_prgov->GetVolumen();
+       }
+       
+       //ADICIONAR SEGMENTO
+
+       
+               
+               
+       // Visualisation - result vascular tree
+       vtkPolyData *polydata   =       _2_prgov->GetOutput();
+       _2_mapfinal = vtkPolyDataMapper::New();
+       _2_mapfinal->SetInput(polydata);
+
+       _2_stripfinal = vtkActor::New();
+       _2_stripfinal->SetMapper(_2_mapfinal);
+       _2_stripfinal->GetProperty()->SetColor(0.0, 0.0, 1.0);
+       _2_stripfinal->GetProperty()->SetLineWidth(2);
+       _2_stripfinal->GetProperty()->BackfaceCullingOff();
+
+       // Visualisation - result volume
+   
+    _2_isoMC6 = vtkMarchingCubes::New();
+    //_2_isoMC6->SetInput(_2_prgov->GetVolumen());
+       _2_isoMC6->SetInput(arteryImageData);
+    _2_isoMC6->SetValue(0, 128);
+       _2_isoMC6->Update();
+
+       _2_isoMapperMC6 = vtkPolyDataMapper::New();
+    _2_isoMapperMC6->SetInput(_2_isoMC6->GetOutput());
+    _2_isoMapperMC6->ScalarVisibilityOff();
+    _2_isoMapperMC6->ImmediateModeRenderingOn();
+
+       _2_isoActorMC6 = vtkActor::New();
+    _2_isoActorMC6->SetMapper(_2_isoMapperMC6);
+    _2_isoActorMC6->GetProperty()->SetColor(1.0, 1.0, 0.5);
+    _2_isoActorMC6->GetProperty()->SetOpacity( opacity_Res2VolJF );
+    
+       // Interface Update
+
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+       ren->AddActor(_2_isoActorMC6);
+       ren->AddActor(_2_stripfinal);
+
+}
+
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnSensibility(wxScrollEvent& event)
+{
+       _sensibility_JF = (double)(_sl_sensibility_JF->GetValue())/100;
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnOpacity_Res2VolJF(wxScrollEvent& event)
+{
+       if (_2_isoActorMC6!=NULL){
+               double value = ((double)_opacity_Res2VolJF->GetValue())/100;
+               _2_isoActorMC6->GetProperty( )->SetOpacity( value );
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnMaxSphereSize_JF(wxScrollEvent& event)
+{
+       _maxSphereSize_JF = _sl_maxSphereSize_JF->GetValue();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnMinSphereSize_JF(wxScrollEvent& event)
+{
+       _minSphereSize_JF = _sl_minSphereSize_JF->GetValue();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnBtnExtractTree2_JF(wxCommandEvent& event)
+{
+       wxBusyCursor wait;              
+       double px=_wxMaracasMPR->GetVtkMPRBaseData()->GetX();
+       double py=_wxMaracasMPR->GetVtkMPRBaseData()->GetY();
+       double pz=_wxMaracasMPR->GetVtkMPRBaseData()->GetZ();
+       ExtractTree2_JF( (int)(px) , (int)(py) , (int)(pz) );
+       //------------------------------------
+       generateSTLSurfaces(); //DHC: AFTER EXTRACTING THE TREE, THE STL SURFACES ARE CALCULATED.
+       //------------------------------------
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnBtnEraseTree2_JF(wxCommandEvent& event)
+{
+       ResetTree2_JF();
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnOpacitySTLFile(wxScrollEvent& event)
+{
+       if (_loadActorSTL!=NULL)
+       {
+               double value = ((double)_sl_opacity_STL_file->GetValue())/100;
+               _loadActorSTL->GetProperty( )->SetOpacity( value );
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::Reset_vtk_STLFile()
+{
+       // Remove
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+    if (_loadActorSTL){
+               ren->RemoveActor(_loadActorSTL);
+       }
+
+       // Delete 
+       if (_loadSTLMapper              ) {     _loadSTLMapper          -> Delete(); }
+       if (_loadActorSTL               ) {     _loadActorSTL           -> Delete(); }
+
+       // Init
+       _loadSTLMapper          = NULL;
+       _loadActorSTL           = NULL;
+
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnBtnSTLFileErase(wxCommandEvent& event)
+{
+       Reset_vtk_STLFile();
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_02::OnBtnSTLFileLoad(wxCommandEvent& event)
+{
+       wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+       dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+       wxFileDialog dialog( this, _T("Choose a directory..."), ( !dirSTL.IsEmpty( ) )?
+       dirSTL: wxGetHomeDir( ) );
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+               Reset_vtk_STLFile();
+               vtkSTLReader *imgReader= vtkSTLReader::New();
+               imgReader->SetFileName( dialog.GetPath().mb_str(wxConvUTF8) );  
+               _loadSTLMapper = vtkPolyDataMapper::New();
+               _loadSTLMapper->SetInput(imgReader->GetOutput());
+               _loadActorSTL = vtkActor::New();
+               _loadActorSTL->SetMapper(_loadSTLMapper);
+               _loadActorSTL->GetProperty()->SetColor( 1, 0, 0);
+               _loadActorSTL->GetProperty()->SetOpacity( 0.5 );
+               vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+               ren->AddActor(_loadActorSTL);
+               imgReader->Delete();
+       }
+       //By default *always* update e_installation_directory:
+       _mar->_parameters->setStringParam( marParameters::e_installation_directory, dialog.GetPath( ) ); 
+       _mar->saveParameters( );
+}
+
+// ------------------------------------------------------------------------
+// START JOIN FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+void wxSTLWidget_02::ConfigureJoinRegions()
+{
+       arteryImageData = NULL;
+       joiner = new vtkJoiner();
+}
+
+
+void wxSTLWidget_02::OnJoinRegions(wxCommandEvent& event)
+{
+       
+   
+    joinMarchingCubes= vtkMarchingCubes::New();
+    joinMarchingCubes->SetInput(arteryImageData);
+    joinMarchingCubes->SetValue(0, 128);
+       joinMarchingCubes->Update();
+
+       joinMapper = vtkPolyDataMapper::New();
+    joinMapper->SetInput(joinMarchingCubes->GetOutput());
+    joinMapper->ScalarVisibilityOff();
+    joinMapper->ImmediateModeRenderingOn();
+
+       joinActor = vtkActor::New();
+    joinActor->SetMapper(joinMapper);
+    joinActor->GetProperty()->SetColor(1.0, 0.3, 1.0);
+    joinActor->GetProperty()->SetOpacity( 0.9 );
+    
+       // Interface Update
+//     vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+       ren->AddActor(joinActor);
+
+}
+// ------------------------------------------------------------------------
+// END JOIN FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+// ------------------------------------------------------------------------
+// START STL FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+void wxSTLWidget_02::ConfigureSTL()
+{
+       stlExterna = vtkPolyData::New();
+       stlInterna = vtkPolyData::New();
+
+       dsm1 = vtkPolyDataMapper ::New();
+    dsm1->SetInput (stlInterna); 
+    dsm1->ScalarVisibilityOff();
+
+    actorInternal = vtkActor::New();
+    actorInternal->SetMapper (dsm1);
+    actorInternal->GetProperty()->SetColor (0,1,0);
+
+    dsm2 = vtkPolyDataMapper ::New();
+    dsm2->SetInput (stlExterna);
+    dsm2->ScalarVisibilityOff();
+
+    actorExternal= vtkActor::New();
+    actorExternal->SetMapper (dsm2);
+    actorExternal->GetProperty()->SetRepresentationToWireframe();
+
+//    vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+    ren->AddActor(actorInternal);
+    ren->AddActor(actorExternal);
+
+       stlExtractor = new vtkSTLExtractor();  
+}
+
+void wxSTLWidget_02::generateSTLSurfaces()
+{
+       stlExtractor->setVolume(_2_prgov->GetVolumen());
+       stlExtractor->setSigmaLevel(_stlDeltaGaussLevel);
+       stlExtractor->setMarchingCubesLevel(_stlMarchingCubesLevel);
+       stlExtractor->calculate();
+       stlInterna->DeepCopy(stlExtractor->getInnerSurface());
+       stlExterna->DeepCopy(stlExtractor->getOuterSurface());
+}
+
+
+void wxSTLWidget_02::OnOpacitySTLExternal(wxScrollEvent& event){
+       double value = ((double)stlSliderOpacityExternal->GetValue())/100;
+    actorExternal->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+
+
+void wxSTLWidget_02::OnOpacitySTLInternal(wxScrollEvent& event){
+       double value = ((double)stlSliderOpacityInternal->GetValue())/100;
+    actorInternal->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+
+void wxSTLWidget_02::OnBtnCreateFileSTL(wxCommandEvent& event)
+{
+
+       wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+       dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+       wxDirDialog dialog( this, _T("Choose a directory..."), ( !dirSTL.IsEmpty( ) )?
+       dirSTL: wxGetHomeDir( ) );
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+          
+       
+               // ------------------------------------------------------------------------
+               //  1.  GENERATE STL FILES
+               // ------------------------------------------------------------------------
+//             const char* fileprefix = "c:\\Creatis\\";
+               std::string prefix( dialog.GetPath().mb_str(wxConvUTF8) );
+               std::string filename;
+
+               // 1.1. Se hace un filtro triangular puesto que el stl writer solo recibe poligonos triangulares.
+
+        vtkTriangleFilter *filtro = vtkTriangleFilter::New();
+               filtro->SetInput(stlInterna);
+               vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
+        pdcf->SetInput( filtro->GetOutput() );
+        vtkClosePolyData *cpd = vtkClosePolyData::New();
+        cpd->SetInput( pdcf->GetOutput() );
+
+               // 1.2 se escribe a disco el archivo stl de la superficie interna
+        cpd->Update();
+        vtkSTLWriter *writerI = vtkSTLWriter::New();
+        writerI->SetInput( cpd->GetOutput() );
+//        prefix = fileprefix;
+               filename=prefix+"\\internal.stl";
+        writerI->SetFileName(filename.c_str());
+        writerI->SetFileTypeToASCII();
+        writerI->Write();
+        writerI->Delete();
+
+               // 1.3 se escribe a disco el archivo stl de la superficie externa
+               filtro->SetInput(stlExterna);
+        cpd->Update();
+        vtkSTLWriter *writerE = vtkSTLWriter::New();
+        writerE->SetInput( cpd->GetOutput() );
+//        prefix = fileprefix;
+               filename=prefix+"\\external.stl";
+        writerE->SetFileName( filename.c_str() );
+        writerE->SetFileTypeToASCII();
+        writerE->Write();
+        writerE->Delete();
+   
+        filtro->Delete();
+        cpd->Delete();
+        pdcf->Delete();
+       }
+
+       //By default *always* update e_installation_directory:
+       _mar->_parameters->setStringParam( marParameters::e_installation_directory, dialog.GetPath( ) ); 
+       _mar->saveParameters( );
+}
+
+
+void wxSTLWidget_02::OnChangeSTLGaussLevel(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+       _stlDeltaGaussLevel  = ((double)stlSliderDeltaGauss->GetValue())/100;
+       generateSTLSurfaces();
+       Refresh();
+}
+
+
+void wxSTLWidget_02::OnChangeSTLMarchingCubesLevel(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+       _stlMarchingCubesLevel = ((double)stlSliderMarchingCubes->GetValue());
+       generateSTLSurfaces();
+       Refresh();
+       
+}
+
+
+// ------------------------------------------------------------------------
+// END STL FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+
+
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_02.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_02.h
new file mode 100644 (file)
index 0000000..858948a
--- /dev/null
@@ -0,0 +1,167 @@
+
+#ifndef WX_STL_WIDGET_02
+#define WX_STL_WIDGET_02
+
+#include <vector>
+
+#include <vtkImageData.h>
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkAppendFilter.h>
+#include <vtkImageThreshold.h>
+#include <vtkExtractVOI.h>
+#include <vtkOutlineFilter.h>
+#include <vtkImageSeedConnectivity.h>
+#include <vtkImageCast.h>
+
+#include "wxVTKRenderWindowInteractor.h"
+#include "wxSurfaceWidget.h"
+#include "wxVtkBaseView.h"
+
+
+#include "../wxMaracasMPR.h"
+
+#include <kernel/marInterface.h>
+#include <kernel/axisExtractor02.h>
+
+
+#include "kernel/vtkSTLExtractor.h"    
+#include "kernel/vtkJoiner.h"
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxSTLWidget_02: public wxPanel{
+public:
+       wxSTLWidget_02(wxWindow *parentmar,marInterface *mar);
+       ~wxSTLWidget_02();
+       void ConfigureVTK();
+       void Refresh();
+
+       void OnOpacity_Res2VolJF(wxScrollEvent& event);         // Result 2 Volume JF
+
+
+       void OnBtnExtractTree2_JF(wxCommandEvent& event);
+       void OnBtnEraseTree2_JF(wxCommandEvent& event);
+
+       void OnSensibility(wxScrollEvent& event);
+       void OnMaxSphereSize_JF(wxScrollEvent& event);          // radio Max
+       void OnMinSphereSize_JF(wxScrollEvent& event);          // radio Min
+
+       //
+       void Reset_vtk_STLFile();
+       void OnBtnSTLFileLoad(wxCommandEvent& event);
+       void OnBtnSTLFileErase(wxCommandEvent& event);
+       void OnOpacitySTLFile(wxScrollEvent& event);            
+
+
+       // --------------------------------------
+       // STL FUNCTIONS DHC
+       // --------------------------------------
+       void generateSTLSurfaces();
+       void OnBtnCreateFileSTL(wxCommandEvent& event); 
+       void OnChangeSTLGaussLevel(wxScrollEvent& event);
+       void OnChangeSTLMarchingCubesLevel(wxScrollEvent& event);
+       void OnOpacitySTLExternal(wxScrollEvent& event);
+       void OnOpacitySTLInternal(wxScrollEvent& event);
+
+       //---------------------------------------
+       // JOIN REGIONS FUNCTIONS
+       //---------------------------------------
+       void OnJoinRegions(wxCommandEvent& event);
+
+private:
+
+
+       // Result 1 volume + Axis   
+//     vtkPolyDataMapper       *_1_mapfinal;
+//     vtkActor                        *_1_stripfinal;
+//     vtkPolyDataMapper       *_1_isoMapperMC6;
+//     vtkActor                        *_1_isoActorMC6;
+//     vtkMarchingCubes        *_1_isoMC6;
+
+       // Result 2 volume + Axis   
+       axisExtractor02         *_2_prgov;
+       vtkPolyDataMapper       *_2_mapfinal;
+       vtkActor                        *_2_stripfinal;
+       vtkPolyDataMapper       *_2_isoMapperMC6;
+       vtkActor                        *_2_isoActorMC6;
+       vtkMarchingCubes        *_2_isoMC6;
+       double                          _sensibility_JF;
+       int                                     _maxSphereSize_JF;
+       int                                     _minSphereSize_JF;
+
+       // Load STL file
+       vtkPolyDataMapper *_loadSTLMapper;
+       vtkActor                  *_loadActorSTL;
+
+
+       wxSlider                        *_opacity_Res2VolJF;
+       wxSlider                        *_sl_sensibility_JF;
+       wxSlider                        *_sl_maxSphereSize_JF;
+       wxSlider                        *_sl_minSphereSize_JF;
+       
+       wxVtk3DBaseView         *_imageviewer3D;
+       wxPanel                         *CreateControlPanel(wxWindow *parent);
+       wxPanel                         *CreateViewPanel(wxWindow *parent);
+
+       //Maracas
+       marInterface            *_mar;
+       wxMaracasMPR            *_wxMaracasMPR;
+
+       void ResetTree2_JF();
+       void ExtractTree2_JF(int x, int y, int z);
+
+
+
+       //---------------------
+       // STL SURFACES DHC
+       //---------------------
+       void            ConfigureSTL();
+       double          _stlDeltaGaussLevel;
+       double          _stlMarchingCubesLevel;
+
+       
+       vtkPolyData *stlInterna;
+       vtkPolyData *stlExterna;
+       
+       wxSlider        *stlSliderDeltaGauss;
+       wxSlider        *stlSliderMarchingCubes;
+       
+       vtkPolyDataMapper *dsm1;
+    vtkActor   *actorInternal;
+       wxSlider        *stlSliderOpacityInternal;
+    
+       vtkPolyDataMapper *dsm2; 
+    vtkActor   *actorExternal;
+       wxSlider        *stlSliderOpacityExternal;
+
+       vtkSTLExtractor *stlExtractor;   
+
+       wxSlider        *_sl_opacity_STL_file;
+
+
+
+       //--------------------------
+       // JOIN REGIONS
+       //--------------------------
+       void ConfigureJoinRegions();
+
+       vtkImageData            *arteryImageData;
+       vtkJoiner                       *joiner;
+       vtkMarchingCubes        *joinMarchingCubes;
+    vtkPolyDataMapper  *joinMapper; 
+       vtkActor                        *joinActor; 
+
+};
+
+#endif // WX_STL_WIDGET_02
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_03.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_03.cxx
new file mode 100644 (file)
index 0000000..1afdbfb
--- /dev/null
@@ -0,0 +1,1033 @@
+
+#include "vtkObjectFactory.h"
+
+#include "vtkActor.h"
+#include "vtkCylinderSource.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkProperty.h"
+#include "vtkCamera.h"
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+#include "vtkPolyData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataWriter.h"
+#include "vtkPolyDataReader.h"
+#include "vtkImageReader.h"
+#include "vtkImageViewer.h"
+#include "vtkImageViewer2.h"
+#include "vtkImageToStructuredPoints.h"
+#include <vtkImageThreshold.h> 
+#include "vtkImageWriter.h"
+
+
+#include "vtkExtractVOI.h"
+#include "vtkImageClip.h"
+#include "vtkImageResample.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkImageReslice.h"
+#include "vtkTransform.h"
+#include "vtkSphereSource.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkCommand.h"
+#include "vtkCallbackCommand.h"
+#include "vtkImageResample.h"
+#include "vtkMath.h"
+#include "vtkStripper.h"
+#include <vtkSTLReader.h> 
+#include "vtkMetaImageWriter.h"
+
+
+#include "vtkTriangleFilter.h"
+#include "vtkSTLWriter.h"
+#include "vtkPolyDataConnectivityFilter.h"
+#include "vtkClosePolyData.h"
+#include "vtkAppendFilter.h"
+
+#include "wxSTLWidget_03.h"
+
+#include <wx/splitter.h>
+
+#include <wx/filedlg.h>
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxSTLWidget_03::wxSTLWidget_03(wxWindow *parent, marInterface* mar)
+: wxPanel( parent, -1) 
+{
+       _wxMaracasMPR           = NULL;
+       _maxSize                = 2000;
+       _minSize                = 300;
+
+       _stlMarchingCubesLevel  = 128;
+       _stlDeltaGaussLevel             = 100;
+
+       _mar=new marInterface();        
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+       _mar->initExperiment( );
+        
+
+       wxBoxSizer              *sizer          = new wxBoxSizer(wxVERTICAL  );
+       wxSplitterWindow        *pnlSplitter    = new wxSplitterWindow( this , -1);
+       wxPanel                 *viewPanel      = CreateViewPanel(pnlSplitter);
+printf("EED wxSTLWidget_03::wxSTLWidget_03 01\n");
+       wxPanel                 *controlPanel   = CreateControlPanel(pnlSplitter);
+printf("EED wxSTLWidget_03::wxSTLWidget_03 02\n");
+
+       sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
+       pnlSplitter     -> SetMinimumPaneSize( 150 );
+       pnlSplitter     -> SplitVertically( viewPanel, controlPanel, 600 );
+
+//     pnlSplitter     -> SplitVertically( new wxPanel(pnlSplitter,-1), new wxPanel(pnlSplitter,-1) , 600 );
+//     pnlSplitter     -> SplitVertically( viewPanel, new wxPanel(pnlSplitter,-1) , 600 );
+
+       this            -> SetSizer(sizer);
+
+       // Result 2: Volume + Axis
+//     _2_prgov                = NULL;
+       _2_mapfinal             = NULL;
+       _2_stripfinal           = NULL;
+       _2_isoMapperMC6         = NULL;
+       _2_isoActorMC6          = NULL;
+       _2_isoMC6               = NULL;
+
+       //DHC STL SURFACES
+       stlInterna              = NULL;
+       stlExterna              = NULL;
+
+       _loadSTLMapper          = NULL;
+       _loadActorSTL           = NULL;
+
+       
+       //JOIN REGIONS
+       arteryImageData         = NULL;
+       joinMarchingCubes       = NULL;
+    joinMapper                 = NULL; 
+       joinActor               = NULL;
+printf("EED wxSTLWidget_03::wxSTLWidget_03 03\n");
+
+
+}
+//-------------------------------------------------------------------
+wxSTLWidget_03::~wxSTLWidget_03(){
+       ResetTree2_JF();
+       Reset_vtk_STLFile();
+}
+//-------------------------------------------------------------------
+wxPanel* wxSTLWidget_03::CreateViewPanel(wxWindow *parent)
+{
+       wxPanel *panel          =       new wxPanel(parent,-1);
+    wxBoxSizer *sizer  =       new wxBoxSizer(wxVERTICAL);
+
+
+   // MPR
+       vtkImageData *imagedata;
+       imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       imagedata->Update();    
+printf("EED wxSTLWidget_03::CreateViewPanel  01 \n");
+       _wxMaracasMPR = new wxMaracasMPR( panel, new marImageData(imagedata), _mar->_parameters->getVoxelSize() );
+printf("EED wxSTLWidget_03::CreateViewPanel  02 \n");
+       _wxMaracasMPR->ConfigureVTK();
+printf("EED wxSTLWidget_03::CreateViewPanel  03 \n");
+       
+       sizer->Add(     _wxMaracasMPR , 1, wxEXPAND, 0);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,400);
+       panel->Layout();
+printf("EED wxSTLWidget_03::CreateViewPanel  04 \n");
+       return panel;
+}
+//-------------------------------------------------------------------
+wxWindow* wxSTLWidget_03::CreateSelectAPointPanel(wxWindow *parent)
+{
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  01\n");
+       wxPanel *panel          = new wxPanel(parent,-1);
+
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  02\n");
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  03\n");
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  04\n");
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  05\n");
+
+       sizer->Add(new wxStaticText(panel,-1,_T(" Select a 3D Point...")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  06\n");
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+printf("EED wxSTLWidget_03::CreateSelectAPointPanel  07\n");
+
+
+       return panel;
+}
+//-------------------------------------------------------------------
+wxWindow* wxSTLWidget_03::CreateSegmentationPanel(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+
+
+       _opacity_Vol            = new wxSlider( panel, -1, 40, 0, 100                            , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       _opacity_Vol    ->SetSize(250,20);  
+       /*SIL
+       _sl_maxSize                     = new wxSlider( panel, -1, 300 , 0, 2000 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL  |  wxSL_AUTOTICKS | wxSL_LABELS );
+       _sl_minSize                     = new wxSlider( panel, -1, 200 , 0, 2000 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL  |  wxSL_AUTOTICKS | wxSL_LABELS );
+       
+       _sl_minSizeSpin = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
+       _sl_minSizeSpin->SetRange(1,8);
+       _sl_minSizeSpin->SetValue(5);
+
+       _sl_maxSizeSpin = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
+       _sl_maxSizeSpin->SetRange(1,8);
+       _sl_maxSizeSpin->SetValue(5);
+
+       */
+
+       _sl_RangeSizeSpin = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
+       _sl_RangeSizeSpin->SetRange(1,8);
+       _sl_RangeSizeSpin->SetValue(5);
+
+
+       //SIL//
+       sl_barrange_segmentation = new mBarRange(panel, 300,70);
+       sl_barrange_segmentation -> setVisibleLabels ( true );
+       sl_barrange_segmentation -> setIfWithActualDrawed( false );
+       sl_barrange_segmentation -> setActiveStateTo ( true );
+       sl_barrange_segmentation -> setRepresentedValues (0,  2000);
+       sl_barrange_segmentation -> setDeviceBlitStart (10,10);
+       sl_barrange_segmentation -> setDeviceEndMargin(10);
+       parent->SetBackgroundColour(wxColour(255,255,255));
+       sl_barrange_segmentation-> setBackgroundColor( wxColour(255,255,255 ));
+
+
+       wxButton *btnExtract                            = new wxButton(panel,-1,_T("Segmentation"));
+       wxButton *btnSaveBinaryFile                     = new wxButton(panel,-1,_T("Save Binary File"));
+
+//SIL//        Connect(_sl_minSizeSpin->GetId()        , wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxSTLWidget_03::OnMinSpin ); 
+//SIL//        Connect(_sl_maxSizeSpin->GetId()        , wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxSTLWidget_03::OnMaxSpin ); 
+       Connect(_opacity_Vol->GetId()           , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSTLWidget_03::OnOpacity_Vol                                        ); 
+       Connect(btnExtract->GetId()                     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_03::OnBtnExtraction                                      ); 
+       Connect(btnSaveBinaryFile->GetId()      , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_03::OnBtnSaveBinaryFile                          ); 
+
+       //SIL//
+       Connect(_sl_RangeSizeSpin->GetId()      , wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxSTLWidget_03::OnRangeSpin ); 
+       Connect(sl_barrange_segmentation->GetId(),wxEVT_TSBAR_START,(wxObjectEventFunction) (wxCommandEventFunction)  &wxSTLWidget_03::OnStartChanged_range );
+       Connect(sl_barrange_segmentation->GetId(),wxEVT_TSBAR_END,(wxObjectEventFunction) (wxCommandEventFunction)  &wxSTLWidget_03::OnEndChanged_range );      
+       Connect(sl_barrange_segmentation->GetId(),wxEVT_TSBAR_MOVED,(wxObjectEventFunction) (wxCommandEventFunction)  &wxSTLWidget_03::OnBarMoved_range );
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  - - -  Segmentation - - - ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))); 
+       
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))); 
+
+       /*sizer->Add(new wxStaticText(panel,-1,_T(" Threshold min")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))); 
+       sizer->Add(_sl_minSizeSpin, 1, wxALL|wxEXPAND, 0);*/
+       //sizer->Add(_sl_minSize, 1, wxALL|wxEXPAND, 0);
+
+       sizer->Add(new wxStaticText(panel,-1,_T(" Threshold min-max")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  "))); 
+       sizer->Add(_sl_RangeSizeSpin, 1, wxALL|wxEXPAND, 0);
+       sizer->Add(sl_barrange_segmentation,3,wxALL|wxGROW,0 );
+       
+       //SIL//sizer->Add(new wxStaticText(panel,-1,_T(" Threshold max")));
+       //SIL//sizer->Add(new wxStaticText(panel,-1,_T("  "))); 
+       //SIL// sizer->Add(_sl_maxSizeSpin, 1, wxALL|wxEXPAND, 0);
+       //SIL//sizer->Add(_sl_maxSize, 1, wxALL|wxEXPAND, 0);
+       
+       sizer->Add(btnExtract);
+       sizer->Add(new wxStaticText(panel,-1,_T(" ")));
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("Opacity - Result Volume")));
+       sizer->Add(_opacity_Vol);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(btnSaveBinaryFile);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+
+       return panel;
+}
+//-------------------------------------------------
+wxWindow* wxSTLWidget_03::CreateSmoothingPanel(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+
+       stlSliderDeltaGauss     = new wxSlider( panel, -1, (int)(_stlDeltaGaussLevel) , 0, 300 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       stlSliderMarchingCubes= new wxSlider( panel, -1, (int)(_stlMarchingCubesLevel) , 0, 256 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+       stlSliderOpacityInternal = new wxSlider(panel, -1, 100,0,100, wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS);
+       stlSliderOpacityExternal = new wxSlider(panel, -1, 100,0,100, wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS);
+       wxButton *btnFileSTL = new wxButton(panel,-1,_T("Generate STL files"));
+
+       Connect(btnFileSTL->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_03::OnBtnCreateFileSTL                   );
+       Connect(stlSliderDeltaGauss->GetId()    , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxSTLWidget_03::OnChangeSTLGaussLevel                );
+       Connect(stlSliderMarchingCubes->GetId() , wxEVT_SCROLL_THUMBRELEASE             , (wxObjectEventFunction) &wxSTLWidget_03::OnChangeSTLMarchingCubesLevel);
+       Connect(stlSliderOpacityInternal->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxSTLWidget_03::OnOpacitySTLInternal                 );
+       Connect(stlSliderOpacityExternal->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxSTLWidget_03::OnOpacitySTLExternal                 );
+
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+       sizer->Add(new wxStaticText(panel,-1,_T("-- Smoothing --")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       
+       sizer->Add(new wxStaticText(panel,-1,_T(" Delta Gauss")));
+       sizer->Add(stlSliderDeltaGauss);
+
+       sizer->Add(new wxStaticText(panel,-1,_T(" Marching Cubes Level")));
+       sizer->Add(stlSliderMarchingCubes);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL Internal")));
+       sizer->Add(stlSliderOpacityInternal);
+
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL External")));
+       sizer->Add(stlSliderOpacityExternal);
+
+       sizer->Add(btnFileSTL);
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------
+wxWindow* wxSTLWidget_03::CreateReadSTLFilePanel(wxWindow *parent)
+{
+       wxPanel *panel          = new wxPanel(parent,-1);
+
+       wxButton *btnReadSTLFile                        = new wxButton(panel,-1,_T("Read STL File"));
+       wxButton *btnEraseReadSTLFile           = new wxButton(panel,-1,_T("Erase STL File"));
+       _sl_opacity_STL_file                            = new wxSlider( panel, -1, 100 , 0, 100 , wxDefaultPosition, wxSize(200,40), wxSL_HORIZONTAL | wxSL_LABELS );
+
+       Connect(btnReadSTLFile->GetId()                 , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_03::OnBtnSTLFileLoad                     ); 
+       Connect(btnEraseReadSTLFile->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxSTLWidget_03::OnBtnSTLFileErase                    ); 
+       Connect(_sl_opacity_STL_file->GetId()   , wxEVT_SCROLL_THUMBRELEASE     , (wxObjectEventFunction) &wxSTLWidget_03::OnOpacitySTLFile                             ); 
+
+
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+       sizer->Add(new wxStaticText(panel,-1,_T("-- Read STL File --")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+       sizer->Add(new wxStaticText(panel,-1,_T("  ")));
+
+       sizer->Add(btnReadSTLFile );
+       sizer->Add(btnEraseReadSTLFile );
+       sizer->Add(new wxStaticText(panel, -1,_T(" Opacity STL File")));
+       sizer->Add(_sl_opacity_STL_file);
+
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+       return panel;
+}
+//-------------------------------------------------------------------
+wxPanel* wxSTLWidget_03::CreateControlPanel(wxWindow *parent)
+{
+printf("EED wxSTLWidget_03::CreateControlPanel 01\n");
+       wxPanel *panel                  = new wxPanel(parent,-1);
+
+       wxNotebook *noteBook    = new wxNotebook(panel, -1);
+printf("EED wxSTLWidget_03::CreateControlPanel 02\n");
+       noteBook->AddPage(CreateSelectAPointPanel(noteBook),_T("0 ->") );
+printf("EED wxSTLWidget_03::CreateControlPanel 03\n");
+       noteBook->AddPage(CreateSegmentationPanel(noteBook),_T("1 ->") );
+printf("EED wxSTLWidget_03::CreateControlPanel 04\n");
+       noteBook->AddPage(CreateSmoothingPanel(noteBook)   ,_T("2 ->") );
+printf("EED wxSTLWidget_03::CreateControlPanel 05\n");
+       noteBook->AddPage(CreateReadSTLFilePanel(noteBook) ,_T("3 "  ) );
+printf("EED wxSTLWidget_03::CreateControlPanel 06\n");
+       noteBook->SetSelection(0);
+       noteBook->SetSize(350,250);
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+       sizer->Add(noteBook);
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(400,600);
+       panel->Layout();
+
+printf("EED wxSTLWidget_03::CreateControlPanel 07\n");
+       return panel;
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_03::Refresh()
+{
+       if (_wxMaracasMPR!=NULL){
+               _wxMaracasMPR->RefreshView();
+       }
+}
+
+//------------------------------------------------------------------------
+
+
+void wxSTLWidget_03::ConfigureProcessing(marImageData *marimagedata, int x, int y, int z)
+{
+    wxBusyCursor wait;
+
+       _imagedata=marimagedata->GetImageData(); // image t=0
+       _imagedata->UpdateInformation();
+       _imagedata->SetUpdateExtent(_imagedata->GetWholeExtent());
+       _imagedata->Update();
+
+
+       double puntoactualprov[3];
+       puntoactualprov[0] = x;
+       puntoactualprov[1] = y;
+       puntoactualprov[2] = z;
+
+       double espprin[3];
+       int extprin[6];                         
+       
+       _imagedata->GetSpacing(espprin);
+       _imagedata->GetExtent(extprin);
+
+
+// MAZV 27 sep 2006
+//     puntoactualprov[0]=puntoactualprov[0]*espprin[0];
+//     puntoactualprov[1]=puntoactualprov[1]*espprin[1];
+//     puntoactualprov[2]=puntoactualprov[2]*espprin[2];
+       
+    _imagedata->GetScalarRange( _range );
+
+       // Update Controls
+       //SIL//
+       /*_sl_minSize->SetRange( (int)(_range[0]), (int)( _range[1]) );
+       _sl_minSize->SetValue( (int)(_range[1]/4) );
+
+       _sl_maxSize->SetRange( (int)(_range[0]) , (int)(_range[1]));
+       _sl_maxSize->SetValue( (int)(_range[1]/2) );*/
+
+       //SIL//
+       minRangeValue = _range[0];
+       maxRangeValue = _range[1];
+
+       sl_barrange_segmentation ->setRepresentedValues(minRangeValue, maxRangeValue);
+       sl_barrange_segmentation ->SetStart((int)(maxRangeValue/4));
+       sl_barrange_segmentation ->SetEnd((int)(maxRangeValue/2));
+       sl_barrange_segmentation -> RefreshForce();     
+       lastResizeRef_Value = ( maxRangeValue - minRangeValue)/2;       
+
+// MAZV 27 sep 2006
+//     _highthreshold->SetRange(_range[0], _range[1]);
+//     _highthreshold->SetValue( _range[1] );
+
+//     _zslice->SetRange(extprin[4], extprin[5]);
+//     _zslice->SetValue(extprin[5]/2);
+       
+       _thresh = vtkImageThreshold::New();
+       _thresh->SetInput(_imagedata);
+       //_thresh->ReleaseDataFlagOff();
+       _thresh->SetInValue(255);
+       _thresh->SetOutputScalarTypeToUnsignedShort();
+       _thresh->SetOutValue(0);
+       //_thresh->ThresholdBetween(_sl_minSize->GetValue(), _range[1]);
+       //SIL//
+       _thresh->ThresholdBetween(sl_barrange_segmentation->GetStart(), sl_barrange_segmentation->GetEnd()); 
+
+       vtkImageCast *cast = vtkImageCast::New();
+       cast->SetInput(_thresh->GetOutput());
+       cast->SetOutputScalarTypeToUnsignedChar();
+       cast->Update();
+
+  
+       _connect = vtkImageSeedConnectivity::New();
+       _connect->SetInput(cast->GetOutput());
+       _connect->SetInputConnectValue(255);
+       _connect->SetOutputConnectedValue(255);
+       _connect->SetOutputUnconnectedValue(0);
+       _connect->AddSeed((int)(puntoactualprov[0]), (int)(puntoactualprov[1]), (int)(puntoactualprov[2]));
+//     _connect->Update();
+
+       cast3 = vtkImageCast::New();
+       cast3->SetInput(_connect->GetOutput());
+       cast3->SetOutputScalarTypeToUnsignedShort();
+       cast3->Update();
+//SIL//
+       
+       _thresh2 = vtkImageThreshold::New();
+       _thresh2->SetInput(_imagedata);
+       //_thresh2->ReleaseDataFlagOff();
+       _thresh2->SetInValue(255);
+       _thresh2->SetOutputScalarTypeToUnsignedShort();
+       _thresh2->SetOutValue(0);
+       //SIL//_thresh2->ThresholdBetween(_sl_minSize->GetValue(), _sl_maxSize->GetValue());
+       _thresh2->ThresholdBetween(sl_barrange_segmentation->GetStart(), sl_barrange_segmentation->GetEnd());
+       
+       cast2 = vtkImageCast::New();
+       cast2->SetInput(_thresh2->GetOutput());
+       cast2->SetOutputScalarTypeToUnsignedChar();
+       cast2->Update();
+
+       _connect2 = vtkImageSeedConnectivity::New();
+       _connect2->SetInput(cast2->GetOutput());
+       _connect2->SetInputConnectValue(255);
+       _connect2->SetOutputConnectedValue(255);
+       _connect2->SetOutputUnconnectedValue(0);
+       _connect2->AddSeed( (int)(puntoactualprov[0]), (int)(puntoactualprov[1]), (int)(puntoactualprov[2]));
+       _connect2->Update();
+
+       cast4 = vtkImageCast::New();
+       cast4->SetInput(_connect2->GetOutput());
+       cast4->SetOutputScalarTypeToUnsignedShort();
+       cast4->Update();
+}
+
+//------------------------------------------------------------------------
+
+
+
+void wxSTLWidget_03::ConfigureVTK()
+{
+       wxBusyCursor wait;
+//     vtkImageData    *imagedata              = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       marImageData    *marimagedata           = _mar->_experiment->getDynData( )->GetMarImageData();
+       
+       //CONFIGURACION ADICIONAL
+       this->ConfigureSTL();
+       this->ConfigureProcessing(marimagedata,0,0,0);
+       
+}
+
+//------------------------------------------------------------------------
+
+void wxSTLWidget_03::ResetTree2_JF()
+{
+       // Remove 
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+
+    if (_2_isoActorMC6){
+               ren->RemoveActor(_2_isoActorMC6);
+       }
+    if (_2_stripfinal){
+               ren->RemoveActor(_2_stripfinal);
+       }
+
+       // Delete 
+//     if (_2_prgov            ) {     _2_prgov                -> Delete(); }
+       if (_2_mapfinal         ) {     _2_mapfinal             -> Delete(); }
+       if (_2_stripfinal       ) {     _2_stripfinal   -> Delete(); }
+       if (_2_isoMapperMC6     ) {     _2_isoMapperMC6 -> Delete(); }
+       if (_2_isoActorMC6      ) {     _2_isoActorMC6  -> Delete(); }
+       if (_2_isoMC6           ) {     _2_isoMC6               -> Delete(); }
+
+       // Init
+//     _2_prgov                = NULL;
+       _2_mapfinal             = NULL;
+       _2_stripfinal   = NULL;
+       _2_isoMapperMC6 = NULL;
+       _2_isoActorMC6  = NULL;
+       _2_isoMC6               = NULL;
+}
+
+
+
+
+
+
+//------------------------------------------------------------------------
+void wxSTLWidget_03::ExtractSurface(int x, int y, int z)
+{
+       
+       double opacityvol               = ((double)_opacity_Vol->GetValue())/100;
+//     vtkImageData *imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+
+       double  puntoactualprov[3];
+       double  espprin[3];
+       int             extprin[6];                             
+
+
+       puntoactualprov[0]      =       x;
+       puntoactualprov[1]      =       y;
+       puntoactualprov[2]      =       z;
+       
+       _imagedata->UpdateInformation();
+       _imagedata->SetUpdateExtent(_imagedata->GetWholeExtent());
+       _imagedata->Update();
+
+       _imagedata->GetSpacing(espprin);
+       _imagedata->GetExtent(extprin);
+
+
+
+
+       _connect->RemoveAllSeeds ();
+       _connect->AddSeed( (int)(puntoactualprov[0] ), (int)(puntoactualprov[1]) ,(int)( puntoactualprov[2]) );
+       _connect->Update();
+       cast3->Update();
+
+
+
+       _thresh->ThresholdBetween(3000, 3002 );
+       _thresh2->ThresholdBetween(3000, 3001);
+//     _thresh->Update();
+//     _thresh2->Update();
+
+       _thresh->ThresholdBetween(_minSize, _range[1] );
+       _thresh->Update();
+
+       _thresh2->ThresholdBetween(_minSize, _maxSize);
+       _thresh2->Update();
+
+       cast2->Update();
+       _connect2->RemoveAllSeeds ();
+       _connect2->AddSeed( (int)(puntoactualprov[0]) , (int)(puntoactualprov[1]) , (int)(puntoactualprov[2]) );
+       _connect2->Update();
+       cast4->Update();
+
+
+
+
+       // Visualisation - result volume
+   
+    _2_isoMC6 = vtkMarchingCubes::New();
+       _2_isoMC6->SetInput(cast4->GetOutput());
+
+    _2_isoMC6->SetValue(0, 128);
+       _2_isoMC6->Update();
+
+       _2_isoMapperMC6 = vtkPolyDataMapper::New();
+    _2_isoMapperMC6->SetInput(_2_isoMC6->GetOutput());
+    _2_isoMapperMC6->ScalarVisibilityOff();
+    _2_isoMapperMC6->ImmediateModeRenderingOn();
+
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+
+       if (_2_isoActorMC6!=NULL)
+       {
+               ren->RemoveActor(_2_isoActorMC6);
+       }
+
+
+       _2_isoActorMC6 = vtkActor::New();
+    _2_isoActorMC6->SetMapper(_2_isoMapperMC6);
+    _2_isoActorMC6->GetProperty()->SetColor(1.0, 1.0, 0.5);
+    _2_isoActorMC6->GetProperty()->SetOpacity( opacityvol );
+    
+       // Interface Update
+
+       ren->AddActor(_2_isoActorMC6);
+
+}
+
+//------------------------------------------------------------------------
+void wxSTLWidget_03::OnOpacity_Vol(wxScrollEvent& event)
+{
+       if (_2_isoActorMC6!=NULL){
+               double value = ((double)_opacity_Vol->GetValue())/100;
+               _2_isoActorMC6->GetProperty( )->SetOpacity( value );
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+
+void wxSTLWidget_03::OnMinSpin         (       wxScrollEvent &          event           )      
+{
+       /*wxSlider *sl_A=_sl_minSize;
+       wxSlider *sl_B=_sl_minSizeSpin;
+       int value = sl_A->GetValue();
+       int delta=(int)pow( 4 , sl_B->GetValue() );
+       int min=value - delta/2;
+       int max=value + delta/2;
+       if (min<0)
+       {
+               min=0;
+               max=delta;
+       }
+       sl_A->SetRange(min,max);
+
+
+       */
+}
+
+//------------------------------------------------------------------------
+
+void wxSTLWidget_03::OnMaxSpin         (       wxScrollEvent &          event           )      
+{
+       /*wxSlider *sl_A=_sl_maxSize;
+       wxSlider *sl_B=_sl_maxSizeSpin;
+       int value = sl_A->GetValue();
+       int delta = (int)pow( 4 , sl_B->GetValue() );
+       int min=value - delta/2;
+       int max=value + delta/2;
+       if (min<0)
+       {
+               min=0;
+               max=delta;
+       }
+       sl_A->SetRange(min,max);*/      
+}
+
+//------------------------------------------------------------------------
+
+void wxSTLWidget_03::OnRangeSpin       (       wxScrollEvent &          event           )      
+{
+       wxSlider *sl_B=_sl_RangeSizeSpin;
+
+       int value = lastResizeRef_Value;
+       int delta = (int)pow( 4 , sl_B->GetValue() );
+       int startResized = value - delta/2;
+       int endResized = value + delta/2;
+
+       if( startResized < minRangeValue )
+               startResized = minRangeValue;
+
+       if( endResized > maxRangeValue )
+               endResized = maxRangeValue;
+
+       sl_barrange_segmentation->setRepresentedValues(startResized,endResized);
+       sl_barrange_segmentation -> RefreshForce();     
+}
+
+//------------------------------------------------------------------------
+void wxSTLWidget_03:: OnStartChanged_range(wxCommandEvent& event)
+{
+       lastResizeRef_Value = sl_barrange_segmentation->GetStart();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_03:: OnEndChanged_range(wxCommandEvent& event)
+{
+       lastResizeRef_Value = sl_barrange_segmentation->GetEnd();   
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_03:: OnBarMoved_range(wxCommandEvent& event)
+{
+       lastResizeRef_Value = (sl_barrange_segmentation->GetEnd() - sl_barrange_segmentation->GetStart())/2 ;
+}
+//------------------------------------------------------------------------
+
+void wxSTLWidget_03::OnBtnSaveBinaryFile(wxCommandEvent& event)
+{
+       wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+       dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+       wxFileDialog dialog( this, _T("Choose a directory..."), ( !dirSTL.IsEmpty( ) )?
+       dirSTL: wxGetHomeDir( ) );
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+               vtkMetaImageWriter  *writer= vtkMetaImageWriter::New();
+               writer->SetFileName( dialog.GetPath().mb_str(wxConvUTF8) );     
+               writer->SetInput(cast4->GetOutput());
+               writer->Write();
+               writer->Delete();
+       }
+}
+
+//------------------------------------------------------------------------
+void wxSTLWidget_03::OnBtnExtraction(wxCommandEvent& event)
+{
+       /*wxBusyCursor wait;
+       _minSize = _sl_minSize->GetValue();
+       _maxSize = _sl_maxSize->GetValue();
+
+       double px=_wxMaracasMPR->GetVtkMPRBaseData()->GetX();
+       double py=_wxMaracasMPR->GetVtkMPRBaseData()->GetY();
+       double pz=_wxMaracasMPR->GetVtkMPRBaseData()->GetZ();
+       ExtractSurface((int)(px),(int)(py),(int)(pz));
+       generateSTLSurfaces(); //DHC: AFTER SEGMENTATION THE TREE, THE STL SURFACES ARE CALCULATED.
+
+       Refresh();
+*/
+       //SIL//
+       wxBusyCursor wait;
+       _minSize = sl_barrange_segmentation->GetStart();
+       _maxSize = sl_barrange_segmentation->GetEnd();
+
+       double px=_wxMaracasMPR->GetVtkMPRBaseData()->GetX();
+       double py=_wxMaracasMPR->GetVtkMPRBaseData()->GetY();
+       double pz=_wxMaracasMPR->GetVtkMPRBaseData()->GetZ();
+       ExtractSurface((int)(px),(int)(py),(int)(pz));
+       generateSTLSurfaces(); //DHC: AFTER SEGMENTATION THE TREE, THE STL SURFACES ARE CALCULATED.
+
+       Refresh();
+}
+
+//------------------------------------------------------------------------
+void wxSTLWidget_03::OnOpacitySTLFile(wxScrollEvent& event)
+{
+       if (_loadActorSTL!=NULL)
+       {
+               double value = ((double)_sl_opacity_STL_file->GetValue())/100;
+               _loadActorSTL->GetProperty( )->SetOpacity( value );
+               Refresh();
+       }
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_03::Reset_vtk_STLFile()
+{
+       // Remove
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+    if (_loadActorSTL){
+               ren->RemoveActor(_loadActorSTL);
+       }
+
+       // Delete 
+       if (_loadSTLMapper              ) {     _loadSTLMapper          -> Delete(); }
+       if (_loadActorSTL               ) {     _loadActorSTL           -> Delete(); }
+
+       // Init
+       _loadSTLMapper          = NULL;
+       _loadActorSTL           = NULL;
+
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_03::OnBtnSTLFileErase(wxCommandEvent& event)
+{
+       Reset_vtk_STLFile();
+       Refresh();
+}
+//------------------------------------------------------------------------
+void wxSTLWidget_03::OnBtnSTLFileLoad(wxCommandEvent& event)
+{
+       wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+       dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+       wxFileDialog dialog( this, _T("Choose a directory..."), ( !dirSTL.IsEmpty( ) )?
+       dirSTL: wxGetHomeDir( ) );
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+               Reset_vtk_STLFile();
+               vtkSTLReader *imgReader= vtkSTLReader::New();
+               imgReader->SetFileName( dialog.GetPath().mb_str(wxConvUTF8) );  
+               _loadSTLMapper = vtkPolyDataMapper::New();
+               _loadSTLMapper->SetInput(imgReader->GetOutput());
+               _loadActorSTL = vtkActor::New();
+               _loadActorSTL->SetMapper(_loadSTLMapper);
+               _loadActorSTL->GetProperty()->SetColor( 1, 0, 0);
+               _loadActorSTL->GetProperty()->SetOpacity( 0.5 );
+               vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+               ren->AddActor(_loadActorSTL);
+               imgReader->Delete();
+       }
+       //By default *always* update e_installation_directory:
+       _mar->_parameters->setStringParam( marParameters::e_installation_directory, dialog.GetPath( ) ); 
+       _mar->saveParameters( );
+}
+
+
+
+// ------------------------------------------------------------------------
+// END JOIN FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+// ------------------------------------------------------------------------
+// START STL FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+void wxSTLWidget_03::ConfigureSTL()
+{
+       stlExterna = vtkPolyData::New();
+       stlInterna = vtkPolyData::New();
+
+       dsm1 = vtkPolyDataMapper ::New();
+    dsm1->SetInput (stlInterna); 
+    dsm1->ScalarVisibilityOff();
+
+    actorInternal = vtkActor::New();
+    actorInternal->SetMapper (dsm1);
+    actorInternal->GetProperty()->SetColor (0,1,0);
+
+    dsm2 = vtkPolyDataMapper ::New();
+    dsm2->SetInput (stlExterna);
+    dsm2->ScalarVisibilityOff();
+
+    actorExternal= vtkActor::New();
+    actorExternal->SetMapper (dsm2);
+    actorExternal->GetProperty()->SetRepresentationToWireframe();
+
+//    vtkRenderer *ren = _maracasSurfaceWidget->GetVtk3DSurfaceWidget()->GetRenderer();
+       vtkRenderer *ren = _wxMaracasMPR->GetWxvtkmpr3Dview_BB()->GetWxvtk3Dbaseview()->GetRenderer();
+    ren->AddActor(actorInternal);
+    ren->AddActor(actorExternal);
+
+       stlExtractor = new vtkSTLExtractor();  
+}
+
+void wxSTLWidget_03::generateSTLSurfaces()
+{
+// EED 09Janvier2007
+//     stlExtractor->setVolume(_2_prgov->GetVolumen());
+
+       stlExtractor->setVolume(cast4->GetOutput());
+
+       stlExtractor->setSigmaLevel(_stlDeltaGaussLevel);
+       stlExtractor->setMarchingCubesLevel(_stlMarchingCubesLevel);
+       stlExtractor->calculate();
+       stlInterna->DeepCopy(stlExtractor->getInnerSurface());
+       stlExterna->DeepCopy(stlExtractor->getOuterSurface());
+}
+
+
+void wxSTLWidget_03::OnOpacitySTLExternal(wxScrollEvent& event){
+       double value = ((double)stlSliderOpacityExternal->GetValue())/100;
+    actorExternal->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+
+
+void wxSTLWidget_03::OnOpacitySTLInternal(wxScrollEvent& event){
+       double value = ((double)stlSliderOpacityInternal->GetValue())/100;
+    actorInternal->GetProperty( )->SetOpacity( value );
+       Refresh();
+}
+
+void wxSTLWidget_03::OnBtnCreateFileSTL(wxCommandEvent& event)
+{
+
+       wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+       dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+
+       
+//     wxDirDialog dialog( this, "Choose a directory...", ( !dirSTL.IsEmpty( ) )?dirSTL: wxGetHomeDir( ) );
+       wxFileDialog dialog( this, _T("Choose a directory..."), dirSTL , _T(""), _T("*.*"), wxSAVE );
+
+
+       if( dialog.ShowModal( ) == wxID_OK ) 
+       {
+          
+       
+               // ------------------------------------------------------------------------
+               //  1.  GENERATE STL FILES
+               // ------------------------------------------------------------------------
+//             const char* fileprefix = "c:\\Creatis\\";
+               std::string prefix ( dialog.GetPath().mb_str(wxConvUTF8) );
+               std::string filename;
+
+               // 1.1. Se hace un filtro triangular puesto que el stl writer solo recibe poligonos triangulares.
+
+        vtkTriangleFilter *filtro = vtkTriangleFilter::New();
+               filtro->SetInput(stlInterna);
+               vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
+        pdcf->SetInput( filtro->GetOutput() );
+        vtkClosePolyData *cpd = vtkClosePolyData::New();
+        cpd->SetInput( pdcf->GetOutput() );
+
+               // 1.2 se escribe a disco el archivo stl de la superficie interna
+        cpd->Update();
+        vtkSTLWriter *writerI = vtkSTLWriter::New();
+        writerI->SetInput( cpd->GetOutput() );
+//        prefix = fileprefix;
+               filename=prefix+"_internal.stl";
+        writerI->SetFileName(filename.c_str());
+        writerI->SetFileTypeToASCII();
+        writerI->Write();
+        writerI->Delete();
+
+               // 1.3 se escribe a disco el archivo stl de la superficie externa
+               filtro->SetInput(stlExterna);
+        cpd->Update();
+        vtkSTLWriter *writerE = vtkSTLWriter::New();
+        writerE->SetInput( cpd->GetOutput() );
+//        prefix = fileprefix;
+               filename=prefix+"_external.stl";
+        writerE->SetFileName( filename.c_str() );
+        writerE->SetFileTypeToASCII();
+        writerE->Write();
+        writerE->Delete();
+   
+        filtro->Delete();
+        cpd->Delete();
+        pdcf->Delete();
+       }
+
+       //By default *always* update e_installation_directory:
+       _mar->_parameters->setStringParam( marParameters::e_installation_directory, dialog.GetPath( ) ); 
+       _mar->saveParameters( );
+}
+
+
+void wxSTLWidget_03::OnChangeSTLGaussLevel(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+       _stlDeltaGaussLevel  = ((double)stlSliderDeltaGauss->GetValue())/100;
+       generateSTLSurfaces();
+       Refresh();
+}
+
+
+void wxSTLWidget_03::OnChangeSTLMarchingCubesLevel(wxScrollEvent& event)
+{
+       wxBusyCursor wait;
+       _stlMarchingCubesLevel = ((double)stlSliderMarchingCubes->GetValue());
+       generateSTLSurfaces();
+       Refresh();
+       
+}
+
+
+// ------------------------------------------------------------------------
+// END STL FUNCTIONS - DHC
+// ------------------------------------------------------------------------
+
+
+
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_03.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSTLWidget_03.h
new file mode 100644 (file)
index 0000000..f120b4f
--- /dev/null
@@ -0,0 +1,197 @@
+
+#ifndef WX_STL_WIDGET_03
+#define WX_STL_WIDGET_03
+
+#include <vector>
+
+#include <vtkImageData.h>
+#include <vtkActor.h>
+#include <vtkMarchingCubes.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkAppendFilter.h>
+#include <vtkImageThreshold.h>
+#include <vtkExtractVOI.h>
+#include <vtkOutlineFilter.h>
+#include <vtkImageSeedConnectivity.h>
+#include <vtkImageCast.h>
+
+#include "wxVTKRenderWindowInteractor.h"
+#include "wxSurfaceWidget.h"
+#include "wxVtkBaseView.h"
+
+
+#include "../wxMaracasMPR.h"
+#include "pPlotter/mBarRange.h"//SIL//
+
+#include <kernel/marInterface.h>
+#include <kernel/axisExtractor02.h>
+
+
+#include "kernel/vtkSTLExtractor.h"    
+#include "kernel/vtkJoiner.h"
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxSTLWidget_03: public wxPanel{
+public:
+       wxSTLWidget_03(wxWindow *parentmar,marInterface *mar);
+       ~wxSTLWidget_03();
+       void ConfigureVTK();
+       void Refresh();
+
+       void OnOpacity_Vol(wxScrollEvent& event);               // Result Volume 
+       void OnMinSpin ( wxScrollEvent & event );
+       void OnMaxSpin ( wxScrollEvent & event ); 
+
+       //SIL new// 
+       void OnRangeSpin( wxScrollEvent & event );
+
+       //Handled events form the bar
+       void OnStartChanged_range(wxCommandEvent& event);
+       void OnEndChanged_range(wxCommandEvent& event);
+       void OnBarMoved_range(wxCommandEvent& event);
+
+
+       void OnBtnExtraction(wxCommandEvent& event);
+       void OnBtnSaveBinaryFile(wxCommandEvent& event);
+
+       //
+       void Reset_vtk_STLFile();
+       void OnBtnSTLFileLoad(wxCommandEvent& event);
+       void OnBtnSTLFileErase(wxCommandEvent& event);
+       void OnOpacitySTLFile(wxScrollEvent& event);            
+
+
+       // --------------------------------------
+       // STL FUNCTIONS DHC
+       // --------------------------------------
+       void generateSTLSurfaces();
+       void OnBtnCreateFileSTL(wxCommandEvent& event); 
+       void OnChangeSTLGaussLevel(wxScrollEvent& event);
+       void OnChangeSTLMarchingCubesLevel(wxScrollEvent& event);
+       void OnOpacitySTLExternal(wxScrollEvent& event);
+       void OnOpacitySTLInternal(wxScrollEvent& event);
+
+       
+       //---------------------------------------
+       // JOIN REGIONS FUNCTIONS
+       //---------------------------------------
+       void OnJoinRegions(wxCommandEvent& event);
+
+private:
+
+       //Processing
+       vtkImageData                            *_imagedata;
+       double                                          _range[2];
+       vtkImageCast                            *cast2;
+       vtkImageCast                            *cast3;
+       vtkImageCast                            *cast4; // binary segmentation result
+       vtkImageThreshold                       *_thresh;
+       vtkImageThreshold                       *_thresh2;
+       vtkImageSeedConnectivity        *_connect;
+       vtkImageSeedConnectivity        *_connect2;
+
+
+
+       vtkPolyDataMapper       *_2_mapfinal;
+       vtkActor                        *_2_stripfinal;
+       vtkPolyDataMapper       *_2_isoMapperMC6;
+       vtkActor                        *_2_isoActorMC6;
+       vtkMarchingCubes        *_2_isoMC6;
+       double                          _sensibility_JF;
+       int                                     _maxSize;
+       int                                     _minSize;
+
+       // Load STL file
+       vtkPolyDataMapper *_loadSTLMapper;
+       vtkActor                  *_loadActorSTL;
+
+
+       wxSlider                        *_opacity_Vol;
+       wxSlider                        *_sl_minSize;
+       wxSlider                        *_sl_maxSize;
+       wxSlider                        *_sl_minSizeSpin;
+       wxSlider                        *_sl_maxSizeSpin;
+       wxSlider                        *_sl_RangeSizeSpin;
+
+       
+       /*
+       * Represents the bar of min and max for merging the functionality of two sliders for controlling the segmentation parameters
+       */
+       mBarRange                       * sl_barrange_segmentation;
+       int                                     lastResizeRef_Value;
+       int                                     minRangeValue;
+       int                                     maxRangeValue;
+       
+       wxVtk3DBaseView         *_imageviewer3D;
+       wxPanel                         *CreateControlPanel(wxWindow *parent);
+       wxPanel                         *CreateViewPanel(wxWindow *parent);
+
+       //Maracas
+       marInterface            *_mar;
+       wxMaracasMPR            *_wxMaracasMPR;
+
+       void ResetTree2_JF();
+       void ExtractSurface(int x, int y, int z);
+
+       wxWindow* CreateSelectAPointPanel(wxWindow *parent);
+       wxWindow* CreateSegmentationPanel(wxWindow *parent);
+       wxWindow* CreateSmoothingPanel(wxWindow *parent);
+       wxWindow* CreateReadSTLFilePanel(wxWindow *parent);
+
+       //---------------------
+       // Processing
+       //---------------------
+       void ConfigureProcessing(marImageData *marimagedata, int x, int y, int z);
+
+
+       //---------------------
+       // STL SURFACES DHC
+       //---------------------
+       void            ConfigureSTL();
+       double          _stlDeltaGaussLevel;
+       double          _stlMarchingCubesLevel;
+
+       
+       vtkPolyData *stlInterna;
+       vtkPolyData *stlExterna;
+       
+       wxSlider        *stlSliderDeltaGauss;
+       wxSlider        *stlSliderMarchingCubes;
+       
+       vtkPolyDataMapper *dsm1;
+    vtkActor   *actorInternal;
+       wxSlider        *stlSliderOpacityInternal;
+    
+       vtkPolyDataMapper *dsm2; 
+    vtkActor   *actorExternal;
+       wxSlider        *stlSliderOpacityExternal;
+
+       vtkSTLExtractor *stlExtractor;   
+
+       wxSlider        *_sl_opacity_STL_file;
+
+
+
+       //--------------------------
+       // JOIN REGIONS
+       //--------------------------
+
+       vtkImageData            *arteryImageData;
+       vtkJoiner                       *joiner;
+       vtkMarchingCubes        *joinMarchingCubes;
+    vtkPolyDataMapper  *joinMapper; 
+       vtkActor                        *joinActor; 
+
+};
+
+#endif // WX_STL_WIDGET_03
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.cxx
new file mode 100644 (file)
index 0000000..dd486e1
--- /dev/null
@@ -0,0 +1,426 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxSegmentationFM3DWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+
+#include <wx/wx.h>
+#include <wx/splitter.h>
+#include <wx/notebook.h>
+#include <wx/colordlg.h>
+
+#include "vtkMarchingCubes.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkActor.h"
+
+
+#include "wxSegmentationFM3DWidget.h"
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE( wxSegmentationFM3DWidget, wxPanel )
+       EVT_MENU( 12121, wxSegmentationFM3DWidget::OnRefreshView )
+//     EVT_MENU( 12122, wxSegmentationFM3DWidget::OnDClickLeft  )
+END_EVENT_TABLE( );
+
+
+wxSegmentationFM3DWidget::wxSegmentationFM3DWidget( wxWindow* parent,
+                          marImageData *marimageData ,double voxelSize)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+       _voxelSize                                                      = voxelSize;
+       _marimageData                                                   = marimageData;
+
+       _wxvtk3Dbaseview_Clipping3D_C           = NULL;
+       _wxvtkmpr3Dview_C                                       = NULL;
+       _wxvtkclipping3Dview_C                          = NULL;
+
+       wxSplitterWindow* mainSplitter = new wxSplitterWindow(this,-1);
+    wxSplitterWindow   *pnlSplitter    = new wxSplitterWindow( mainSplitter , -1);
+       
+       int ww,hh;
+       _MPRWidget2                                     = new wxMPRWidget2(pnlSplitter,_marimageData,voxelSize);
+       wxPanel *       contour3DView   = Create3DViewContour( pnlSplitter , _MPRWidget2->GetVtkMPRBaseData());
+       this->GetSize(&ww,&hh);
+
+    pnlSplitter        -> SplitVertically( _MPRWidget2, contour3DView , 600);
+
+
+
+
+
+       //PANEL DE OPERACIONES
+       //------------------------------------------------------------------
+       
+       wxPanel* panelOperaciones          = new wxPanel(mainSplitter, -1);
+
+       wxFlexGridSizer *fgs = new wxFlexGridSizer(2);
+
+       fgs->Add( new wxStaticText(panelOperaciones, -1, _T("Fast Marching Controls")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Alpha")));
+       slAlpha = new wxSlider(panelOperaciones, -1, 50, 1, 400, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       fgs->Add(slAlpha);
+       
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Beta")));
+       slBeta = new wxSlider(panelOperaciones, -1, 128, 0, 800, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       fgs->Add(slBeta);
+               
+       btnSegment = new wxButton(panelOperaciones, -1, _T("Segment"));
+       fgs->Add(btnSegment);
+       btnUndo = new wxButton(panelOperaciones, -1, _T("Undo"));
+       fgs->Add(btnUndo);
+       
+       
+
+       
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+
+
+       
+       fgs->Add( new wxStaticText(panelOperaciones, -1, _T("Mesh Controls")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
+
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Opacity")));
+       slVolumeOpacity = new wxSlider(panelOperaciones, -1,50,1,100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       fgs->Add(slVolumeOpacity);
+
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Sigma")));
+       slSigmaLevel = new wxSlider(panelOperaciones, -1,100,1,300, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       fgs->Add(slSigmaLevel);
+
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Convergence")));
+       slLaplacianConvergence = new wxSlider(panelOperaciones, -1,3000,1,3000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       fgs->Add(slLaplacianConvergence);
+
+       fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Iterations")));
+       slLaplacianIterations = new wxSlider(panelOperaciones, -1,100,1,2000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+       fgs->Add(slLaplacianIterations);
+       
+       panelOperaciones->SetSizer(fgs);
+
+       btnUndo->Disable();
+       slSigmaLevel->Disable();
+       slVolumeOpacity->Disable();
+       slLaplacianConvergence->Disable();
+       slLaplacianIterations->Disable();
+
+       Connect(slAlpha->GetId(),                               wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeAlpha);
+       Connect(slBeta->GetId(),                                wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeBeta);
+       Connect(btnSegment->GetId(),                    wxEVT_COMMAND_BUTTON_CLICKED,   (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnBtnSegment);
+       Connect(btnUndo->GetId(),                               wxEVT_COMMAND_BUTTON_CLICKED,   (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnBtnUndo);
+       Connect(slVolumeOpacity->GetId(),               wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeOpacity);
+       Connect(slSigmaLevel->GetId(),                  wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeSigmaLevel);
+       Connect(slLaplacianConvergence->GetId(),wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeLaplacianConvergence);
+       Connect(slLaplacianIterations->GetId(), wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeLaplacianIteration);
+       //-------------------------------------------------------------------
+
+       mainSplitter->SplitVertically(pnlSplitter, panelOperaciones, 600);
+
+       wxBoxSizer      *sizer  = new wxBoxSizer(wxVERTICAL  );
+       sizer->Add(mainSplitter,1, wxGROW,0);
+       pnlSplitter     -> SetMinimumPaneSize( 50 );
+       this            -> SetSizer(sizer);
+
+
+       // MODELO
+       //------------------------------------------------------------------
+       alphaValue = 0.5;
+       betaValue = 128;
+       opacityValue = 0.5;
+       convergenceValue = 1;
+       iterationsValue = 100;
+       filtroSegmentacion = new itkFM3D();
+       //------------------------------------------------------------------
+
+
+       // RENDERIZACION VTK
+       //------------------------------------------------------------------
+       f_gauss = vtkImageGaussianSmooth::New();
+       f_laplace = vtkSmoothPolyDataFilter::New();
+       f_cubes = vtkMarchingCubes::New();
+       f_mapper = vtkPolyDataMapper::New();
+       f_cubes->SetInput(f_gauss->GetOutput());
+       f_cubes->SetValue(0,128);
+       f_laplace->SetInput(f_cubes->GetOutput());
+       f_mapper->SetInput(f_laplace->GetOutput());
+       f_mapper->ScalarVisibilityOff();
+       f_actor = vtkActor::New();
+       f_actor->SetMapper(f_mapper);
+       f_actor->GetProperty()->SetColor(0.9,0.5,0.5);
+       //------------------------------------------------------------------
+
+       
+}
+
+//----------------------------------------------------------------------------
+
+wxSegmentationFM3DWidget::~wxSegmentationFM3DWidget( )
+{
+       if (_wxvtk3Dbaseview_Clipping3D_C       != NULL) { delete       _wxvtk3Dbaseview_Clipping3D_C;  }
+       if (_wxvtkmpr3Dview_C                           != NULL) { delete       _wxvtkmpr3Dview_C;                              }
+       if (_wxvtkclipping3Dview_C                      != NULL) { delete       _wxvtkclipping3Dview_C;                 }
+}
+
+
+//----------------------------------------------------------------------------
+wxPanel* wxSegmentationFM3DWidget::Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
+{
+       wxWindow *wxwindow;
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
+       _wxvtk3Dbaseview_Clipping3D_C = new wxVtk3DBaseView( panelClipping3D );
+
+       _wxvtkclipping3Dview_C = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_C);
+       vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
+       vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkclipping3Ddataviewer->Configure();
+       _wxvtkclipping3Dview_C->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
+
+       _wxvtkmpr3Dview_C = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_C );
+       vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
+       vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
+       vtkmpr3Ddataviewer->Configure();
+       _wxvtkmpr3Dview_C->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
+
+       wxWindow        *window3D                               = _wxvtk3Dbaseview_Clipping3D_C->GetWxVTKRenderWindowInteractor();
+
+       wxPanel         *panelControl                   = new wxPanel(panelClipping3D,-1);      
+       wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview_C->CreateControlPanel(panelControl);
+       wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview_C->CreateControlPanel(panelControl);
+
+//     wxBoxSizer  *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
+       wxFlexGridSizer  *sizerCtrol        = new wxFlexGridSizer(1);
+
+       sizerCtrol->Add(controlPanelMPR3D , 1, wxALL|wxEXPAND, 2);
+       sizerCtrol->Add(controlPanelClipping3D , 1, wxALL|wxEXPAND, 2);
+       panelControl->SetAutoLayout(true);
+       panelControl->SetSizer(sizerCtrol);
+       panelControl->SetSize(400,350);
+       panelControl->Layout();
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+//EEDxx2.4
+//             panelClipping3D -> SetMinimumPaneSize( -50 );
+       panelClipping3D -> SplitHorizontally( panelControl,window3D, (int)(hh*0.20) );
+       wxwindow=panelClipping3D;
+
+    wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerH1);
+       panel->SetSize(400,400);
+       panel->Layout();
+
+//EEDxx2.4
+//     panel->FitInside();
+//     FitInside();
+
+       return panel;
+}
+
+
+//----------------------------------------------------------------------------
+void wxSegmentationFM3DWidget::ConfigureVTK(){
+       _MPRWidget2->ConfigureVTK();
+       _wxvtk3Dbaseview_Clipping3D_C   ->  Configure();
+       _wxvtkmpr3Dview_C                               ->      Configure();
+       _wxvtkclipping3Dview_C                  ->      Configure();
+
+       vtkInteractorStyle3DView *vtkinteractorstyle3Dview      = new vtkInteractorStyle3DView();
+       vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_C);
+       vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_C);
+       _wxvtk3Dbaseview_Clipping3D_C->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
+
+}
+
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxSegmentationFM3DWidget::GetVtkMPRBaseData(){
+       return _MPRWidget2->GetVtkMPRBaseData();
+}
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxSegmentationFM3DWidget::GetVtkPlane2DView()
+{
+       return _MPRWidget2->GetVtkPlane2DView();
+}
+//----------------------------------------------------------------------------
+void wxSegmentationFM3DWidget::OnRefreshView(wxCommandEvent & event)
+{
+       RefreshView();
+}
+//----------------------------------------------------------------------------
+void wxSegmentationFM3DWidget::RefreshView()
+{
+       this->_MPRWidget2->RefreshView();
+       _wxvtkmpr3Dview_C                               -> RefreshView();
+       _wxvtkclipping3Dview_C                  -> Refresh();
+       _wxvtk3Dbaseview_Clipping3D_C   -> Refresh();
+}
+
+
+
+
+
+/**
+* This method is invoked when the segmentation button is pressed
+* 
+*/
+void wxSegmentationFM3DWidget::OnBtnSegment(wxCommandEvent& event){
+
+       wxBusyCursor wait;
+       
+
+       double x =_MPRWidget2->GetVtkMPRBaseData()->GetX();
+       double y =_MPRWidget2->GetVtkMPRBaseData()->GetY();
+       double z = _MPRWidget2->GetVtkMPRBaseData()->GetZ();
+
+       filtroSegmentacion->AddSeed(x,y,z);
+       filtroSegmentacion->SetAlpha(this->alphaValue);
+       filtroSegmentacion->SetBeta(this->betaValue);
+
+       vtkImageData* resultado = filtroSegmentacion->segment(_MPRWidget2->GetVtkMPRBaseData()->GetImageData() );
+
+               
+       f_gauss->SetInput(resultado);
+       f_gauss->SetStandardDeviation(this->sigmaValue);
+       
+    f_laplace->SetNumberOfIterations(this->iterationsValue);
+       f_laplace->SetConvergence(this->convergenceValue);
+       f_laplace->Update();
+
+       f_actor->GetProperty()->SetOpacity(this->opacityValue);
+       
+       vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
+       
+       ren->AddActor(f_actor);
+       RefreshView();
+       
+       btnUndo->Enable();
+       slVolumeOpacity->Enable();
+       slSigmaLevel->Enable();
+       slLaplacianConvergence->Enable();
+       slLaplacianIterations->Enable();
+}
+
+
+/**
+* This method is invoked when the slAlpha scroll change its value
+*
+*/
+void wxSegmentationFM3DWidget::OnChangeAlpha(wxScrollEvent& event){
+       alphaValue = ((double)slAlpha->GetValue());
+       alphaValue = alphaValue / 100;
+}
+
+/**
+* This method is invoked when the slBeta scroll change its value
+*
+*/
+void wxSegmentationFM3DWidget::OnChangeBeta(wxScrollEvent& event){
+       betaValue = ((double)slBeta->GetValue());
+}
+
+/**
+*      Carga la imagen resultado de la segmentacion FM ITK
+*
+*/
+void wxSegmentationFM3DWidget::OnBtnUndo(wxCommandEvent& event){
+
+       if (f_actor != NULL){
+               vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
+               ren->RemoveActor(f_actor);
+               RefreshView();
+               btnUndo->Disable();
+               slSigmaLevel->Disable();
+               slVolumeOpacity->Disable();
+               slLaplacianConvergence->Disable();
+               slLaplacianIterations->Disable();
+       }
+
+
+}
+
+/**
+* Este metodo cambia la opacidad del actor que representa la segmentacion realizada
+*
+*/
+void wxSegmentationFM3DWidget::OnChangeOpacity(wxScrollEvent& event){
+       if (f_actor != NULL){
+               opacityValue = ((double)slVolumeOpacity->GetValue())/100.0;
+               f_actor->GetProperty()->SetOpacity(opacityValue);
+               RefreshView();
+       }
+}
+
+/**
+* Cambia el valor de la desviacion estandar del filtro gaussiano aplicado al 
+* volumen resultado de la segmentacion
+*/
+void wxSegmentationFM3DWidget::OnChangeSigmaLevel(wxScrollEvent& event){
+       if(f_actor != NULL){
+               this->sigmaValue = ((double)slSigmaLevel->GetValue())/300.0;
+               f_gauss->SetStandardDeviation(this->sigmaValue);
+               f_laplace->Update();
+               RefreshView();
+       }
+}
+
+/**
+* Cambia el valor de la convergencia del filtro de suavizado laplaciano aplicado
+* a la superficie que representa el volumen resultado de la segmentacion
+*/
+void wxSegmentationFM3DWidget::OnChangeLaplacianConvergence(wxScrollEvent& event){
+       if(f_actor != NULL){
+               this->convergenceValue = ((double)slLaplacianConvergence->GetValue())/3000.0;
+               f_laplace->SetConvergence(this->convergenceValue);
+               f_laplace->Update();
+               RefreshView();
+       }
+}
+
+/**
+* Cambia el numero de iteraciones del filtro de suavizado laplaciano aplicado a la superficie
+* que representa el volumen resultado de la segmentacion
+*/
+void wxSegmentationFM3DWidget::OnChangeLaplacianIteration(wxScrollEvent& event){
+       if(f_actor != NULL){
+               this->iterationsValue = slLaplacianIterations->GetValue();
+               f_laplace->SetNumberOfIterations(this->iterationsValue);
+               f_laplace->Update();
+               RefreshView();
+       }
+}
+
+// EOF - wxSegmentationFM3DWidget.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.h
new file mode 100644 (file)
index 0000000..bad33f9
--- /dev/null
@@ -0,0 +1,144 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxSegmentationFM3DWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__SEGMENTATION__FM3D__HXX__
+#define __WX__SEGMENTATION__FM3D__HXX__
+
+/*
+#include <vector>
+
+#include <vtkObjectBase.h>
+#include <vtkCommand.h>
+#include <vtkActor.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProbeFilter.h>
+#include <vtkPlaneSource.h> 
+#include <vtkImageChangeInformation.h>
+#include <vtkStructuredPoints.h> 
+#include <vtkTransform.h> 
+#include <vtkImageViewer2.h> 
+#include <vtkBoxWidget.h>
+*/
+            
+/*
+#include "kernel/marInterface.h"
+
+#include "wxMPRBaseData.h"
+#include "wxVtkBaseView.h"
+*/
+
+
+#include <wx/notebook.h>
+
+#include "vtkImageGaussianSmooth.h"
+#include "vtkSmoothPolyDataFilter.h"
+
+#include "wxMPRWidget.h"
+#include "../manualContour.h"
+
+#include "itkFM3D.h"
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class wxSegmentationFM3DWidget : public wxPanel
+{
+public:
+    wxSegmentationFM3DWidget(wxWindow* parent,marImageData *marimageData,double voxelSize);
+       ~wxSegmentationFM3DWidget( );
+
+       void ConfigureVTK();
+
+       void RefreshView();
+       void OnRefreshView(wxCommandEvent & event);
+
+
+       vtkMPRBaseData          *GetVtkMPRBaseData();
+       vtkPlane2DView          *GetVtkPlane2DView();
+
+
+
+private:
+       double                                                          _voxelSize;
+       marImageData                                            *_marimageData; 
+       wxMPRWidget2                                            *_MPRWidget2;
+
+       //
+       wxVtk3DBaseView                                         *_wxvtk3Dbaseview_Clipping3D_C;
+       wxVtkMPR3DView                                          *_wxvtkmpr3Dview_C;
+       wxVtkClipping3DView                                     *_wxvtkclipping3Dview_C;
+
+       wxPanel         *Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata);
+       void            ConfigureContour();
+
+       //DCH: CONTROLES INTERFAZ GRAFICA
+
+       wxSlider* slAlpha;
+       wxSlider* slBeta;
+       wxButton* btnSegment;
+       wxButton* btnUndo;
+       wxSlider* slVolumeOpacity;
+       wxSlider* slSigmaLevel;
+       wxSlider* slLaplacianConvergence;
+       wxSlider* slLaplacianIterations;
+
+
+       void OnChangeAlpha(wxScrollEvent& event);
+       void OnChangeBeta(wxScrollEvent& event);
+       void OnBtnSegment(wxCommandEvent& event);
+       void OnBtnUndo(wxCommandEvent& event);
+       void OnChangeOpacity(wxScrollEvent& event);
+       void OnChangeSigmaLevel(wxScrollEvent& event);
+       void OnChangeLaplacianConvergence(wxScrollEvent& event);
+       void OnChangeLaplacianIteration(wxScrollEvent& event);
+
+
+       // DHC: MODELO
+       itkFM3D* filtroSegmentacion;
+       double alphaValue;
+       double betaValue;
+       double opacityValue;
+       double sigmaValue;
+       float convergenceValue;
+       int        iterationsValue;
+
+       // DHC: RENDERIZACION VTK
+       vtkImageGaussianSmooth*         f_gauss;
+       vtkMarchingCubes*                       f_cubes;
+       vtkSmoothPolyDataFilter*        f_laplace;
+       vtkPolyDataMapper*                      f_mapper;
+       vtkActor*                                       f_actor;
+
+
+
+       DECLARE_EVENT_TABLE( );
+
+
+
+};
+
+
+
+
+#endif // __WX__SEGMENTATION__FM3D__HXX__ 
+
+// EOF - wxSegmentationFM3DWidget.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceMPR.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceMPR.cxx
new file mode 100644 (file)
index 0000000..8a70c78
--- /dev/null
@@ -0,0 +1,1226 @@
+
+#include <vtkPlanes.h>
+#include <vtkProperty.h> 
+#include <vtkPolyData.h> 
+#include <vtkDataSet.h> 
+
+#include "wxSurfaceMPR.h"
+#include <wx/colordlg.h>
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+/*
+
+
+void boxVolumeObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
+       if (eventId==vtkCommand::StartInteractionEvent){
+               _renWin->SetDesiredUpdateRate(10);
+       }
+       if (eventId==vtkCommand::InteractionEvent){
+               _renWin->SetDesiredUpdateRate(0.001);
+       }
+       if (eventId==vtkCommand::EndInteractionEvent){
+               vtkPlanes *planes = vtkPlanes::New();
+               vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
+               boxwidget->GetPlanes(planes);
+               _volumeMapper->SetClippingPlanes(planes);
+               planes -> Delete();
+       }
+}
+//-------------------------------------------------------------------
+void boxVolumeObserver::SetRenWin( vtkRenderWindow *renWin ){
+       _renWin = renWin;
+}
+//-------------------------------------------------------------------
+void boxVolumeObserver::SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper){
+       _volumeMapper = volumeMapper;
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+void boxSurfaceObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
+       vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
+       boxwidget->GetPlanes(_planes);
+       _actor->VisibilityOn();
+}
+//-------------------------------------------------------------------
+void boxSurfaceObserver::SetPlanes(vtkPlanes *planes){
+       _planes = planes;
+}
+//-------------------------------------------------------------------
+void boxSurfaceObserver::SetActor(vtkActor *actor){
+       _actor = actor;
+}
+
+*/
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+/*
+vtkMPR3DData::vtkMPR3DData()
+{
+       _colour[0]= new wxColour(255,127, 64);
+       _colour[1]= new wxColour(255,255,250);
+       _colour[2]= new wxColour(  0,255,000);
+       _colour[3]= new wxColour(  0,  0,255);
+       _visiblePosition[0]=true;
+       _visiblePosition[1]=true;
+       _visiblePosition[2]=true;
+}
+//-------------------------------------------------------------------
+vtkMPR3DData::~vtkMPR3DData()
+{
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               _tissueExtractor[i]             ->Delete();
+               _tissueNormals[i]               ->Delete();
+               _tissueStripper[i]              ->Delete();
+               _tissueMapper[i]                ->Delete();
+               delete _colour[i];
+               _tissuePlanes[i]                ->Delete();
+               _tissueClipper[i]               ->Delete();
+       }
+       _outlineData            ->Delete();
+       _mapOutline                     ->Delete();
+       _outline                        ->Delete();
+
+       // Volume
+       _tfun                           ->Delete();
+       _ctfun                          ->Delete();
+       _compositeFunction      ->Delete();
+       _volumeMapper           ->Delete();
+       _volumeProperty         ->Delete();
+       _newvol                         ->Delete();
+}
+//-------------------------------------------------------------------
+vtkActor* vtkMPR3DData::GetOutlineActor()
+{
+       return _outline;
+}
+//-------------------------------------------------------------------
+vtkPolyDataMapper* vtkMPR3DData::GetTissueMapper(int id)
+{
+       return _tissueMapper[id];
+}
+//-------------------------------------------------------------------
+vtkPlanes* vtkMPR3DData::GetTissuePlanes(int id)
+{
+       return _tissuePlanes[id];
+}
+//-------------------------------------------------------------------
+vtkStripper* vtkMPR3DData::GetTissueStripper(int id)
+{
+       return _tissueStripper[id];
+}
+//-------------------------------------------------------------------
+vtkImageActor* vtkMPR3DData::GetImageActor(int id)
+{
+       vtkImageActor *tmpVtkActor=NULL;
+       if (id==0){
+               tmpVtkActor = GetvtkActor_saggital();
+       }
+       if (id==1){
+               tmpVtkActor = GetvtkActor_coronal();
+       }
+       if (id==2){
+               tmpVtkActor = GetvtkActor_axial();
+       }
+       return tmpVtkActor;
+}
+//-------------------------------------------------------------------
+void vtkMPR3DData::Configure()
+{
+       int i;
+
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+
+               _tissueExtractor[i] = vtkContourFilter::New();
+               _tissueExtractor[i]->SetInput((vtkDataSet *) GetImageData() );
+               _tissueExtractor[i]->SetValue(0, 0);
+           _tissueNormals[i] = vtkPolyDataNormals::New();
+               _tissueNormals[i]->SetInput(_tissueExtractor[i]->GetOutput());
+               _tissueNormals[i]->SetFeatureAngle(60.0);
+               _tissueStripper[i] = vtkStripper::New();
+               _tissueStripper[i]->SetInput(_tissueNormals[i]->GetOutput());
+
+               if (i==0){
+                       _tissuePlanes[i]  = vtkPlanes::New();
+                       _tissueClipper[i] = vtkClipPolyData::New();
+                       _tissueClipper[i]->SetInput( _tissueStripper[i]->GetOutput() );
+                       _tissueClipper[i]->SetClipFunction( _tissuePlanes[i] );
+                       _tissueClipper[i]->InsideOutOn( );
+
+                       _tissueMapper[i] = vtkPolyDataMapper::New();
+                       _tissueMapper[i]->SetInput( _tissueClipper[i]->GetOutput() );
+               } else {
+                       _tissueMapper[i] = vtkPolyDataMapper::New();
+                       _tissueMapper[i]->SetInput(_tissueStripper[i]->GetOutput());
+//                     _tissueMapper[i]->ScalarVisibilityOff();
+
+               }
+
+       }
+
+
+
+  // An outline provides context around the data.
+  //
+       _outlineData = vtkOutlineFilter::New();
+    _outlineData->SetInput((vtkDataSet *) GetImageData() );
+       _mapOutline = vtkPolyDataMapper::New();
+    _mapOutline->SetInput(_outlineData->GetOutput());
+       _outline = vtkActor::New();
+    _outline->SetMapper(_mapOutline);
+    _outline->GetProperty()->SetColor(0,0,0);
+
+  // Now we are creating three orthogonal planes passing through the
+  // volume. Each plane uses a different texture map and therefore has
+  // diferent coloration.
+
+
+  // Volume
+  _tfun = vtkPiecewiseFunction::New();
+
+//     _tfun->AddPoint(70.0, 0.0);
+//     _tfun->AddPoint(599.0, 0);
+//     _tfun->AddPoint(600.0, 0);
+//     _tfun->AddPoint(1195.0, 0);
+//     _tfun->AddPoint(1200, .2);
+//     _tfun->AddPoint(1300, .3);
+//     _tfun->AddPoint(2000, .3);
+//     _tfun->AddPoint(4095.0, 1.0);
+
+       _tfun->AddPoint(70      , 0.0);
+       _tfun->AddPoint(599     , 0.0);
+       _tfun->AddPoint(600     , 0.0);
+       _tfun->AddPoint(1110, 0.0);
+       _tfun->AddPoint(1111, 1.0);
+       _tfun->AddPoint(1300, 1.0);
+       _tfun->AddPoint(2000, 1.0);
+       _tfun->AddPoint(4095, 1.0);
+
+  _ctfun = vtkColorTransferFunction::New();
+
+//    _ctfun->AddRGBPoint(0.0, 0.5, 0.0, 0.0);
+//     _ctfun->AddRGBPoint(600.0, 1.0, 0.5, 0.5);
+//     _ctfun->AddRGBPoint(1280.0, 0.9, 0.2, 0.3);
+//     _ctfun->AddRGBPoint(1960.0, 0.81, 0.27, 0.1);
+//     _ctfun->AddRGBPoint(4095.0, 0.5, 0.5, 0.5);
+
+       _ctfun->AddRGBPoint(0.0         , 0.5   , 0.0   , 0.0 );
+       _ctfun->AddRGBPoint(600.0       , 1.0   , 0.5   , 0.5 );
+       _ctfun->AddRGBPoint(1130.0      , 0.9   , 0.2   , 0.3 );
+       _ctfun->AddRGBPoint(1131.0      , 0.3   , 0.9   , 0.9 );
+       _ctfun->AddRGBPoint(1135.0      , 0.3   , 0.8   , 0.8 );
+       _ctfun->AddRGBPoint(1960.0      , 0.1   , 0.27  , 0.71);
+       _ctfun->AddRGBPoint(4095.0      , 0.5   , 0.5   , 0.5 );
+
+  _compositeFunction = vtkVolumeRayCastCompositeFunction::New();
+  
+  _volumeMapper = vtkVolumeRayCastMapper::New();
+       _volumeMapper->SetInput( GetImageData() );
+       _volumeMapper->SetVolumeRayCastFunction(_compositeFunction);
+
+  _volumeProperty = vtkVolumeProperty::New();
+       _volumeProperty->SetColor(_ctfun);
+       _volumeProperty->SetScalarOpacity(_tfun);
+       _volumeProperty->SetInterpolationTypeToLinear();
+       _volumeProperty->ShadeOn();
+
+  _newvol = vtkVolume::New();
+       _newvol->SetMapper(_volumeMapper);
+       _newvol->SetProperty(_volumeProperty);
+
+       vtkMPRBaseData::Configure();
+
+}
+
+
+//-------------------------------------------------------------------
+void vtkMPR3DData::SetIsovalue(int idTissue, int isoValue)
+{
+       _tissueExtractor[idTissue]->SetValue(0, isoValue);
+}
+
+//-------------------------------------------------------------------
+wxColour* vtkMPR3DData::GetColour(int idColour)
+{
+       return _colour[idColour];
+}
+//-------------------------------------------------------------------
+void vtkMPR3DData::SetVisiblePosition(int idPosition, bool visible)
+{
+       _visiblePosition[idPosition]=visible;
+}
+//-------------------------------------------------------------------
+bool vtkMPR3DData::GetVisiblePosition(int idPosition)
+{
+       return _visiblePosition[idPosition];
+}
+//-------------------------------------------------------------------
+vtkVolume* vtkMPR3DData::GetVolumeActor()
+{
+   return _newvol;
+}
+//-------------------------------------------------------------------
+vtkVolumeRayCastMapper* vtkMPR3DData::GetVolumeMapper(){
+       return _volumeMapper;
+}
+
+*/
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+/*
+
+wxVtkMPR3DView::wxVtkMPR3DView(wxWindow *parent)
+:wxVtk3DBaseView( parent )
+{
+       int i;
+       for (i=0; i<VTKMPRDATA_MAXTISSUE; i++){
+               _visibleTissue[i]=true;
+       }
+       _visibleVolume=true;
+
+}
+
+//-------------------------------------------------------------------
+wxVtkMPR3DView::~wxVtkMPR3DView(){
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               _tissue[i]->Delete();
+       }
+
+       _boxWidget              -> Delete();
+       _observerV              -> Delete();
+       _boxWidgetS1    -> Delete();
+       _observerS1             -> Delete();
+
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::SetVisibleTissue(int idTissue, bool visible){
+       _visibleTissue[idTissue]=visible;
+}
+//-------------------------------------------------------------------
+bool wxVtkMPR3DView::GetVisibleTissue(int idTissue){
+       return _visibleTissue[idTissue];
+}
+//-------------------------------------------------------------------
+vtkActor* wxVtkMPR3DView::GetTissueActor(int id){
+       return _tissue[id];
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::Configure(){
+       vtkMPR3DData *vtkmpr3Ddata = (vtkMPR3DData*)GetVtkmprbasedata();
+       wxVtk3DBaseView::Configure();
+       // vtkActor tissue
+       int i;
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               // tissue
+               _tissue[i] = vtkActor::New();
+               _tissue[i]->SetMapper(vtkmpr3Ddata->GetTissueMapper(i));
+
+//             wxColour* cc=_vtkmprdata->GetColour(i); 
+//             float cr=cc->Red(),cg=cc->Green(),cb=cc->Blue();
+//             _tissue[i]->GetProperty()->SetDiffuseColor(cr/255, cg/255   , cb/255   );
+//             _tissue[i]->GetProperty()->SetSpecular(.3);
+//             _tissue[i]->GetProperty()->SetSpecularPower(20);
+
+               if (i==0) _tissue[i]->GetProperty()->SetColor(1, 0   , 0   );
+               if (i==2) _tissue[i]->GetProperty()->SetColor(0.85, 0.85   , 0.85   );
+               if (i==3) _tissue[i]->GetProperty()->SetColor(0, 1   ,  0  );
+               if (i==4) _tissue[i]->GetProperty()->SetColor(0, 0   , 1   );
+
+               if (i==0){
+                 _tissue[i]->VisibilityOff();
+                 _tissue[i]->SetScale(1.01, 1.01, 1.01);
+               }
+       }
+
+  // Volume (RayCast)
+       GetRenderer()->AddVolume( vtkmpr3Ddata->GetVolumeActor()  );    // RayCast
+       GetRenderer()->SetBackground(0.5, 0.5, 0.5);
+
+  // Actors are added to the renderer. 
+  GetRenderer()->AddActor( vtkmpr3Ddata->GetOutlineActor() );                  
+  GetRenderer()->AddActor( vtkmpr3Ddata->GetImageActor(0)  );  // _saggital
+  GetRenderer()->AddActor( vtkmpr3Ddata->GetImageActor(1)  );  // _axial
+  GetRenderer()->AddActor( vtkmpr3Ddata->GetImageActor(2)  );  // _coronal
+
+
+
+       // Box Volume
+       
+  // The SetInteractor method is how 3D widgets are associated with the
+  // render window interactor. Internally, SetInteractor sets up a bunch
+  // of callbacks using the Command/Observer mechanism (AddObserver()).
+  _boxWidget = vtkBoxWidget::New();
+       _boxWidget->SetInteractor( GetWxVTKRenderWindowInteractor() );
+       _boxWidget->SetPlaceFactor(1.0);
+
+  // Place the interactor initially. The output of the reader is used to
+  // place the box widget.
+
+       _observerV = boxVolumeObserver::New();
+       _observerV->SetRenWin( GetRenWin() );
+       _observerV->SetVolumeMapper( vtkmpr3Ddata->GetVolumeMapper() );
+
+       _boxWidget->SetInput( vtkmpr3Ddata->GetImageData() );
+       _boxWidget->PlaceWidget();
+       _boxWidget->InsideOutOn();
+       _boxWidget->AddObserver( vtkCommand::StartInteractionEvent      , _observerV );
+       _boxWidget->AddObserver( vtkCommand::InteractionEvent           , _observerV );
+       _boxWidget->AddObserver( vtkCommand::EndInteractionEvent        , _observerV );
+       _boxWidget->On();
+
+       vtkProperty *outlineProperty = _boxWidget->GetOutlineProperty();
+       outlineProperty->SetRepresentationToWireframe();
+       outlineProperty->SetAmbient(1.0);
+       outlineProperty->SetAmbientColor(1, 1, 1);
+       outlineProperty->SetLineWidth(3);
+
+       vtkProperty *selectedOutlineProperty = _boxWidget->GetSelectedOutlineProperty();
+       selectedOutlineProperty->SetRepresentationToWireframe();
+       selectedOutlineProperty->SetAmbient(1.0);
+       selectedOutlineProperty->SetAmbientColor(1, 0, 0);
+       selectedOutlineProperty->SetLineWidth(3);
+
+//--
+       // Box Surface
+
+  // Place the interactor initially. The output of the reader is used to
+  // place the box widget.
+
+//     _observerV = boxVolumeObserver::New();
+//     _observerV->SetRenWin( _renWin );
+//     _observerV->SetVolumeMapper( _vtkmprdata->GetVolumeMapper() );
+
+       _observerS1 = boxSurfaceObserver::New();
+       _observerS1->SetPlanes( vtkmpr3Ddata->GetTissuePlanes(0) );
+       _observerS1->SetActor( _tissue[0] );
+
+  _boxWidgetS1 = vtkBoxWidget::New();
+       _boxWidgetS1->SetInteractor( GetWxVTKRenderWindowInteractor() );
+       _boxWidgetS1->SetPlaceFactor(1.25);
+
+
+       _boxWidgetS1->SetInput( vtkmpr3Ddata->GetTissueStripper(0)->GetOutput() );
+//     _boxWidgetS1->SetInput( vtkmpr3Ddata->GetGlyph(0)->GetOutput() );
+       _boxWidgetS1->PlaceWidget();
+       _boxWidgetS1->InsideOutOff();
+//     _boxWidgetS1->AddObserver( vtkCommand::StartInteractionEvent , _observerV );
+//     _boxWidgetS1->AddObserver( vtkCommand::InteractionEvent          , _observerV );
+//     _boxWidgetS1->AddObserver( vtkCommand::EndInteractionEvent       , _observerV );
+//     _boxWidgetS1->AddObserver( vtkCommand::EndInteractionEvent       , _observerS1 );
+       _boxWidgetS1->AddObserver( vtkCommand::InteractionEvent          , _observerS1 );
+
+//     vtkProperty *outlinePropertyS1 = _boxWidgetS1->GetOutlineProperty();
+//     outlinePropertyS1->SetRepresentationToWireframe();
+//     outlinePropertyS1->SetAmbient(1.0);
+//     outlinePropertyS1->SetAmbientColor(0, 0, 1);
+//     outlinePropertyS1->SetLineWidth(3);
+
+//     vtkProperty *selectedOutlinePropertyS1 = _boxWidgetS1->GetSelectedOutlineProperty();
+//     selectedOutlinePropertyS1->SetRepresentationToWireframe();
+//     selectedOutlinePropertyS1->SetAmbient(1.0);
+//     selectedOutlinePropertyS1->SetAmbientColor(1, 0, 0);
+//     selectedOutlinePropertyS1->SetLineWidth(3);
+
+
+       // vtkActor tissue
+       for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
+               GetRenderer()->AddActor( _tissue[i] );                  
+       }
+
+       _boxWidgetS1->On();
+
+//--
+
+  // Turn off bone for this example.
+//  _bone->VisibilityOff();
+
+
+  // An initial camera view is created.  The Dolly() method moves 
+  // the camera towards the FocalPoint, thereby enlarging the image.
+  GetRenderer()->SetActiveCamera(GetCamera());
+  GetRenderer()->ResetCamera ();
+  GetCamera()->Dolly(1.5);
+
+  // Set a background color for the renderer and set the size of the
+  // render window (expressed in pixels).
+  GetRenderer()->SetBackground(1,1,1);
+  GetRenWin()->SetSize(400, 400);
+
+  // Note that when camera movement occurs (as it does in the Dolly()
+  // method), the clipping planes often need adjusting. Clipping planes
+  // consist of two planes: near and far along the view direction. The 
+  // near plane clips out objects in front of the plane; the far plane
+  // clips out objects behind the plane. This way only what is drawn
+  // between the planes is actually rendered.
+  GetRenderer()->ResetCameraClippingRange();
+
+}
+
+
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::VisibleActor(int idTissue, bool visTissue, bool visGuide){
+       if (visTissue!=GetVisibleTissue(idTissue)){
+               if (visTissue==false){
+                       GetRenderer()->RemoveActor( GetTissueActor(idTissue)  );        
+               } else {
+                       GetRenderer()->AddActor( GetTissueActor(idTissue)  );   
+               }
+               SetVisibleTissue(idTissue,visTissue);
+       }
+
+       if (visGuide==true){
+               _boxWidgetS1->On();
+       } else {
+               _boxWidgetS1->Off();
+       }
+
+}
+//-------------------------------------------------------------------
+void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible){
+       vtkMPR3DData *vtkmpr3Ddata = (vtkMPR3DData*)GetVtkmprbasedata();
+       if (visible!=vtkmpr3Ddata->GetVisiblePosition(idPosition)){
+               if (visible==false){
+                       GetRenderer()->RemoveActor( vtkmpr3Ddata->GetImageActor(idPosition)  ); 
+               } else {
+                       GetRenderer()->AddActor( vtkmpr3Ddata->GetImageActor(idPosition)  );    
+               }
+               vtkmpr3Ddata->SetVisiblePosition(idPosition,visible);
+       }
+}
+
+//-------------------------------------------------------------------
+
+void wxVtkMPR3DView::VisibleVolumeActor( bool visVolume,bool visGuide){
+       vtkMPR3DData *vtkmpr3Ddata = (vtkMPR3DData*)GetVtkmprbasedata();
+       if (visVolume!=_visibleVolume){
+               if (visVolume==false){
+                       GetRenderer()->RemoveActor( vtkmpr3Ddata->GetVolumeActor()  );  
+               } else {
+                       GetRenderer()->AddActor( vtkmpr3Ddata->GetVolumeActor() );      
+               }
+               _visibleVolume=visVolume;
+       }
+       if (visGuide==true){
+               _boxWidget->On();
+       } else {
+               _boxWidget->Off();
+       }
+}
+
+*/
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+/*
+wxSurfaceMPR::wxSurfaceMPR(wxWindow *parent,  vtkImageData *imagedata, const wxString& title)
+                               : wxFrame( parent, -1, title) {
+
+       _vtkmpr3Ddata = new vtkMPR3DData(); 
+       _vtkmpr3Ddata->SetImageData(imagedata);
+
+       wxPanel *MPRPanel               = CreateMPRPanel(this,_vtkmpr3Ddata);
+       wxPanel *controlPanel   = CreateControlPanel(this);
+
+    wxFlexGridSizer *sizer  = new wxFlexGridSizer(2);
+       sizer->Add(MPRPanel );
+       sizer->Add(controlPanel );
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->SetSize(800,900);
+}
+
+//-------------------------------------------------------------------
+wxPanel* wxSurfaceMPR::CreateMPRPanel(wxWindow *parent, vtkMPR3DData *vtkmpr3Ddata){
+       wxPanel *panel=new wxPanel(parent,-1);
+
+       _vtkmprview[1] = new wxVtkMPR3DView(panel);
+       _vtkmprview[1]->SetVtkmprbasedata(vtkmpr3Ddata);
+       wxVTKRenderWindowInteractor *iren1 = _vtkmprview[1]->GetWxVTKRenderWindowInteractor();  
+
+       _vtkmprview[2] = new wxVtkMPR3DView(panel);
+       _vtkmprview[2]->SetVtkmprbasedata(vtkmpr3Ddata);
+       wxVTKRenderWindowInteractor *iren2 = _vtkmprview[2]->GetWxVTKRenderWindowInteractor();  
+
+       _vtkmprview[3] = new wxVtkMPR3DView(panel);
+       _vtkmprview[3]->SetVtkmprbasedata(vtkmpr3Ddata);
+       wxVTKRenderWindowInteractor *iren3 = _vtkmprview[3]->GetWxVTKRenderWindowInteractor();  
+
+       _vtkmprview[0] = new wxVtkMPR3DView(panel);
+       _vtkmprview[0]->SetVtkmprbasedata(vtkmpr3Ddata);
+       wxVTKRenderWindowInteractor *iren0 = _vtkmprview[0]->GetWxVTKRenderWindowInteractor();  
+
+    wxBoxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
+    wxBoxSizer *sizerH1= new wxBoxSizer(wxHORIZONTAL);
+    wxBoxSizer *sizerH2= new wxBoxSizer(wxHORIZONTAL);
+       sizerH1->Add(iren0 , 1, wxEXPAND, 0);
+
+       sizerH1->Add(iren1 , 1, wxEXPAND, 0);
+       sizerH2->Add(iren2 , 1, wxEXPAND, 0);
+       sizerH2->Add(iren3 , 1, wxEXPAND, 0);
+
+       sizerV->Add(sizerH1, 1, wxEXPAND, 0);
+       sizerV->Add(sizerH2, 1, wxEXPAND, 0);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerV);
+       panel->SetSize(900,900);
+       panel->Layout();
+
+
+       return panel;
+}
+
+//-------------------------------------------------------------------
+
+wxPanel* wxSurfaceMPR::CreateControlPanel(wxWindow *parent){
+       wxPanel *panel=new wxPanel(parent,-1);
+
+// position 
+       wxPanel *panel1 =new wxPanel(panel,-1);
+       wxStaticText *text_space1 = new wxStaticText(panel1,-1,"    ");
+       wxStaticText *text1_box1  = new wxStaticText(panel1,-1,"x  ");
+       wxStaticText *text2_box1  = new wxStaticText(panel1,-1,"y  ");
+       wxStaticText *text3_box1  = new wxStaticText(panel1,-1,"z  ");
+       _sl1_box1 = new wxSlider( panel1, -1, 0, 0, _vtkmpr3Ddata->GetMaxPositionX(), wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl2_box1 = new wxSlider( panel1, -1, 0, 0, _vtkmpr3Ddata->GetMaxPositionY(), wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _sl3_box1 = new wxSlider( panel1, -1, 0, 0, _vtkmpr3Ddata->GetMaxPositionZ(), wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+
+       _sl1_box1->SetSize(250,20);
+       _sl2_box1->SetSize(250,20);
+       _sl3_box1->SetSize(250,20);
+
+    wxFlexGridSizer *sizerBox1 = new wxFlexGridSizer(3);
+       // line 1
+       sizerBox1->Add(text_space1);
+       sizerBox1->Add(text1_box1);
+       sizerBox1->Add( _sl1_box1);
+       // line 2
+       sizerBox1->Add(text_space1);
+       sizerBox1->Add(text2_box1);
+       sizerBox1->Add( _sl2_box1);
+       // line 3
+       sizerBox1->Add(text_space1);
+       sizerBox1->Add(text3_box1);
+       sizerBox1->Add( _sl3_box1);
+       panel1->SetSizer(sizerBox1);
+       panel1->SetAutoLayout(true);
+       panel1->SetSize(250,80);
+
+
+// Layers
+       wxPanel *panel2 =new wxPanel(panel,-1);
+       wxStaticText *text_space2 = new wxStaticText(panel2,-1,"   ");
+       wxStaticText *text_             = new wxStaticText(panel2,-1,"  ");
+                                 _btnA         = new wxButton(panel2,-1,"A");
+                                 _btnB         = new wxButton(panel2,-1,"B");
+                                 _btnC         = new wxButton(panel2,-1,"C");
+                                 _btnD         = new wxButton(panel2,-1,"D");
+                     _text_A   = new wxStaticText(panel2,-1,"000000");
+                     _text_B   = new wxStaticText(panel2,-1,"000000");
+                     _text_C   = new wxStaticText(panel2,-1,"000000");
+                     _text_D   = new wxStaticText(panel2,-1,"000000");
+       wxStaticText *text_A    = new wxStaticText(panel2,-1,"A ");
+       wxStaticText *text_B    = new wxStaticText(panel2,-1,"B ");
+       wxStaticText *text_C    = new wxStaticText(panel2,-1,"C ");
+       wxStaticText *text_D    = new wxStaticText(panel2,-1,"D ");
+       _slA1_box2 = new wxSlider( panel2, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _slA2_box2 = new wxSlider( panel2, -1, 0, 0,  60, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slA3_box2 = new wxSlider( panel2, -1, 0, 0,  50, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slB1_box2 = new wxSlider( panel2, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _slB2_box2 = new wxSlider( panel2, -1, 0, 0,  60, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slB3_box2 = new wxSlider( panel2, -1, 0, 0,  50, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slC1_box2 = new wxSlider( panel2, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _slC2_box2 = new wxSlider( panel2, -1, 0, 0,  60, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slC3_box2 = new wxSlider( panel2, -1, 0, 0,  50, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slD1_box2 = new wxSlider( panel2, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+       _slD2_box2 = new wxSlider( panel2, -1, 0, 0,  60, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+       _slD3_box2 = new wxSlider( panel2, -1, 0, 0,  50, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL  );
+
+       _chk1_box1 = new wxCheckBox(panel2, -1, "Visible X");
+       _chk2_box1 = new wxCheckBox(panel2, -1, "Visible Y");
+       _chk3_box1 = new wxCheckBox(panel2, -1, "Visible Z");
+
+       _chkA_box2              = new wxCheckBox(panel2, -1, "Vis.");
+       _chkB_box2              = new wxCheckBox(panel2, -1, "Vis.");
+       _chkC_box2              = new wxCheckBox(panel2, -1, "Vis.");
+       _chkD_box2              = new wxCheckBox(panel2, -1, "Vis.");
+       _chkAA_box2             = new wxCheckBox(panel2, -1, ".");
+       _chkBB_box2             = new wxCheckBox(panel2, -1, ".");
+       _chkCC_box2             = new wxCheckBox(panel2, -1, ".");
+       _chkDD_box2             = new wxCheckBox(panel2, -1, ".");
+       _chkViewA_box2  = new wxCheckBox(panel2, -1, "A");
+       _chkViewB_box2  = new wxCheckBox(panel2, -1, "B");
+       _chkViewC_box2  = new wxCheckBox(panel2, -1, "C");
+       _chkViewD_box2  = new wxCheckBox(panel2, -1, "D");
+
+       _chk1_box1->SetValue(true);
+       _chk2_box1->SetValue(true);
+       _chk3_box1->SetValue(true);
+       _chkA_box2->SetValue(true);
+       _chkB_box2->SetValue(true);
+       _chkC_box2->SetValue(true);
+       _chkD_box2->SetValue(true);
+       _chkAA_box2->SetValue(true);
+       _chkBB_box2->SetValue(true);
+       _chkCC_box2->SetValue(true);
+       _chkDD_box2->SetValue(true);
+       _chkViewA_box2->SetValue(true);
+       _chkViewB_box2->SetValue(true);
+       _chkViewC_box2->SetValue(true);
+       _chkViewD_box2->SetValue(true);
+
+       _slA1_box2->SetSize(250,20);
+       _slA2_box2->SetSize(150,20);
+       _slA3_box2->SetSize(150,20);
+       _slB1_box2->SetSize(250,20);
+       _slB2_box2->SetSize(150,20);
+       _slB3_box2->SetSize(150,20);
+       _slC1_box2->SetSize(250,20);
+       _slC2_box2->SetSize(150,20);
+       _slC3_box2->SetSize(150,20);
+       _slD1_box2->SetSize(250,20);
+       _slD2_box2->SetSize(150,20);
+       _slD3_box2->SetSize(150,20);
+       _btnA->SetSize(20,20);
+       _btnB->SetSize(20,20);
+       _btnC->SetSize(20,20);
+       _btnD->SetSize(20,20);
+
+       _btnA->SetBackgroundColour( *(_vtkmpr3Ddata->GetColour(0))  );
+       _btnB->SetBackgroundColour( *(_vtkmpr3Ddata->GetColour(1))  );
+       _btnC->SetBackgroundColour( *(_vtkmpr3Ddata->GetColour(2))  );
+       _btnD->SetBackgroundColour( *(_vtkmpr3Ddata->GetColour(3))  );
+
+
+    wxFlexGridSizer *sizerPanel2A = new wxFlexGridSizer(5);
+    // line A2
+       sizerPanel2A->Add(text_space2);
+       sizerPanel2A->Add(text_A);
+       sizerPanel2A->Add(_slA2_box2);
+       sizerPanel2A->Add(_slA3_box2);
+       sizerPanel2A->Add(_text_A);
+    // line B2
+       sizerPanel2A->Add(text_space2);
+       sizerPanel2A->Add(text_B);
+       sizerPanel2A->Add(_slB2_box2);
+       sizerPanel2A->Add(_slB3_box2);
+       sizerPanel2A->Add(_text_B);
+    // line C2
+       sizerPanel2A->Add(text_space2);
+       sizerPanel2A->Add(text_C);
+       sizerPanel2A->Add(_slC2_box2);
+       sizerPanel2A->Add(_slC3_box2);
+       sizerPanel2A->Add(_text_C);
+    // line D2
+       sizerPanel2A->Add(text_space2);
+       sizerPanel2A->Add(text_D);
+       sizerPanel2A->Add(_slD2_box2);
+       sizerPanel2A->Add(_slD3_box2);
+       sizerPanel2A->Add(_text_D);
+
+
+    wxFlexGridSizer *sizerPanel2B = new wxFlexGridSizer(5);
+    // line A1
+       sizerPanel2B->Add(text_space2);
+       sizerPanel2B->Add(_btnA);
+       sizerPanel2B->Add(_slA1_box2);
+       sizerPanel2B->Add(_chkA_box2);
+       sizerPanel2B->Add(_chkAA_box2);
+    // line B1
+       sizerPanel2B->Add(text_space2);
+       sizerPanel2B->Add(_btnB);
+       sizerPanel2B->Add(_slB1_box2);
+       sizerPanel2B->Add(_chkB_box2);
+       sizerPanel2B->Add(_chkBB_box2);
+    // line C1
+       sizerPanel2B->Add(text_space2);
+       sizerPanel2B->Add(_btnC);
+       sizerPanel2B->Add(_slC1_box2);
+       sizerPanel2B->Add(_chkC_box2);
+       sizerPanel2B->Add(_chkCC_box2);
+    // line D1
+       sizerPanel2B->Add(text_space2);
+       sizerPanel2B->Add(_btnD);
+       sizerPanel2B->Add(_slD1_box2);
+       sizerPanel2B->Add(_chkD_box2);
+       sizerPanel2B->Add(_chkDD_box2);
+
+    wxFlexGridSizer *sizerPanel2C = new wxFlexGridSizer(4);
+       sizerPanel2C->Add(_chkViewA_box2);
+       sizerPanel2C->Add(_chkViewB_box2);
+       sizerPanel2C->Add(_chkViewC_box2);
+       sizerPanel2C->Add(_chkViewD_box2);
+
+    wxFlexGridSizer *sizerPanel2D = new wxFlexGridSizer(2);
+       sizerPanel2D->Add(text_space2);
+       sizerPanel2D->Add(_chk1_box1);
+       sizerPanel2D->Add(text_space2);
+       sizerPanel2D->Add(_chk2_box1);
+       sizerPanel2D->Add(text_space2);
+       sizerPanel2D->Add(_chk3_box1);
+
+    wxFlexGridSizer *sizerPanel2 = new wxFlexGridSizer(1);
+       sizerPanel2->Add(sizerPanel2A);
+       sizerPanel2->Add(text_space2);
+       sizerPanel2->Add(sizerPanel2C);
+       sizerPanel2->Add(text_space2);
+       sizerPanel2->Add(sizerPanel2D);
+       sizerPanel2->Add(text_space2);
+       sizerPanel2->Add(sizerPanel2B);
+
+       panel2->SetSizer(sizerPanel2);
+       panel2->SetAutoLayout(true);
+       panel2->SetSize(350,320);
+
+// cut1
+       wxPanel *panel3 = new wxPanel(panel,-1);
+       wxStaticText *text_space3 = new wxStaticText(panel3,-1,"    ");
+       _chk_box3 = new wxCheckBox(panel3, -1, "Vis.");
+       _chk_box33 = new wxCheckBox(panel3, -1, "Vis.");
+       _chk_box3->SetValue(true);
+       _chk_box33->SetValue(true);
+    wxFlexGridSizer *sizerPanel3 = new wxFlexGridSizer(3);
+       // line 1
+       sizerPanel3->Add(text_space3);
+       sizerPanel3->Add(_chk_box3);
+       sizerPanel3->Add(_chk_box33);
+       panel3->SetSizer(sizerPanel3);
+       panel3->SetAutoLayout(true);
+       panel3->SetSize(250,100);
+
+//     _sl1_box3 = new wxSlider( panel3, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl2_box3 = new wxSlider( panel3, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl3_box3 = new wxSlider( panel3, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     wxStaticText *text1_box3 = new wxStaticText(panel3,-1,"A");
+//     wxStaticText *text2_box3 = new wxStaticText(panel3,-1,"B");
+//     wxStaticText *text3_box3 = new wxStaticText(panel3,-1,"Dist");
+//  wxFlexGridSizer *sizerPanel3 = new wxFlexGridSizer(3);
+//     // line 1
+//     sizerPanel3->Add(text_space3);
+//     sizerPanel3->Add(_chk_box3);
+//     sizerPanel3->Add(text_space3);
+//     // line 2
+//     sizerPanel3->Add(text_space3);
+//     sizerPanel3->Add(text1_box3);
+//     sizerPanel3->Add(_sl1_box3);
+//     // line 3
+//     sizerPanel3->Add(text_space3);
+//     sizerPanel3->Add(text2_box3);
+//     sizerPanel3->Add(_sl2_box3);
+//     // line 4
+//     sizerPanel3->Add(text_space3);
+//     sizerPanel3->Add(text3_box3);
+//     sizerPanel3->Add(_sl3_box3);
+//     panel3->SetSizer(sizerPanel3);
+//     panel3->SetAutoLayout(true);
+//     panel3->SetSize(250,100);
+//  // cut2
+//
+//     wxPanel *panel4 = new wxPanel(panel,-1);
+//     _chk_box4 = new wxCheckBox(panel4, -1, "Vis.");
+//     _slA_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _slB_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl1_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl2_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl3_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl4_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl5_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     _sl6_box4 = new wxSlider( panel4, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );
+//     wxStaticText *text_space4 = new wxStaticText(panel3,-1,"    ");
+//     wxStaticText *textA_box4 = new wxStaticText(panel4,-1,"A");
+//     wxStaticText *textB_box4 = new wxStaticText(panel4,-1,"B");
+//     wxStaticText *text1_box4 = new wxStaticText(panel4,-1,"D1");
+//     wxStaticText *text2_box4 = new wxStaticText(panel4,-1,"D2");
+//     wxStaticText *text3_box4 = new wxStaticText(panel4,-1,"D3");
+//     wxStaticText *text4_box4 = new wxStaticText(panel4,-1,"D4");
+//     wxStaticText *text5_box4 = new wxStaticText(panel4,-1,"D5");
+//     wxStaticText *text6_box4 = new wxStaticText(panel4,-1,"D6");
+//  wxFlexGridSizer *sizerPanel4 = new wxFlexGridSizer(3);
+//     // line 1
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(_chk_box4);
+//     sizerPanel4->Add(text_space4);
+//     // line 2
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(textA_box4);
+//     sizerPanel4->Add(_slA_box4);
+//     // line 3
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(textB_box4);
+//     sizerPanel4->Add(_slB_box4);
+//     // line 4
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(text1_box4);
+//     sizerPanel4->Add(_sl1_box4);
+//     // line 5
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(text2_box4);
+//     sizerPanel4->Add(_sl2_box4);
+//     // line 6
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(text3_box4);
+//     sizerPanel4->Add(_sl3_box4);
+//     // line 7
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(text4_box4);
+//     sizerPanel4->Add(_sl4_box4);
+//     // line 8
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(text5_box4);
+//     sizerPanel4->Add(_sl5_box4);
+//     // line 9
+//     sizerPanel4->Add(text_space4);
+//     sizerPanel4->Add(text6_box4);
+//     sizerPanel4->Add(_sl6_box4);
+//     //
+//     panel4->SetSizer(sizerPanel4);
+//     panel4->SetAutoLayout(true);
+//     panel4->SetSize(250,300);
+
+
+
+// All
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
+
+       sizer->Add(new wxStaticText(panel,-1,"Position") );
+       sizer->Add(panel1);
+       sizer->Add(new wxStaticText(panel,-1,"Layer") );
+       sizer->Add(panel2);
+       sizer->Add(new wxStaticText(panel,-1,"Cut 1") );
+       sizer->Add(panel3);
+//     sizer->Add(new wxStaticText(panel,-1,"Cut 2") );
+//     sizer->Add(panel4);
+
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->SetSize(350,750);
+
+
+       // Position 
+       Connect(_sl1_box1->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnPositionX );
+       Connect(_sl2_box1->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnPositionY );
+       Connect(_sl3_box1->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnPositionZ );
+       Connect(_chk1_box1->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleX );
+       Connect(_chk2_box1->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleY );
+       Connect(_chk3_box1->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleZ );
+
+       // Opacity
+       Connect(_slA1_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE   , (wxObjectEventFunction) &wxSurfaceMPR::OnOpacity0 );
+       Connect(_slB1_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE   , (wxObjectEventFunction) &wxSurfaceMPR::OnOpacity1 );
+       Connect(_slC1_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE   , (wxObjectEventFunction) &wxSurfaceMPR::OnOpacity2 );
+       Connect(_slD1_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE   , (wxObjectEventFunction) &wxSurfaceMPR::OnOpacity3 );
+       Connect(_btnA->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxSurfaceMPR::OnBtnColourA );
+       Connect(_btnB->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxSurfaceMPR::OnBtnColourB );
+       Connect(_btnC->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxSurfaceMPR::OnBtnColourC );
+       Connect(_btnD->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxSurfaceMPR::OnBtnColourD );
+
+
+
+       // Isovalue
+       Connect(_slA2_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue0 );
+       Connect(_slA3_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue0 );
+       Connect(_slB2_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue1 );
+       Connect(_slB3_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue1 );
+       Connect(_slC2_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue2 );
+       Connect(_slC3_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue2 );
+       Connect(_slD2_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue3 );
+       Connect(_slD3_box2->GetId()  , wxEVT_SCROLL_THUMBRELEASE  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue3 );
+       Connect(_slA2_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_0 );
+       Connect(_slA3_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_0 );
+       Connect(_slB2_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_1 );
+       Connect(_slB3_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_1 );
+       Connect(_slC2_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_2 );
+       Connect(_slC3_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_2 );
+       Connect(_slD2_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_3 );
+       Connect(_slD3_box2->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED  , (wxObjectEventFunction) &wxSurfaceMPR::OnIsoValue_3 );
+
+       Connect(_chkA_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueA );
+       Connect(_chkB_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueB );
+       Connect(_chkC_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueC );
+       Connect(_chkD_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueD );
+       Connect(_chkAA_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueA );
+       Connect(_chkBB_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueB );
+       Connect(_chkCC_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueC );
+       Connect(_chkDD_box2->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleTissueD );
+
+       Connect(_chk_box3->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleVolume );
+       Connect(_chk_box33->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxSurfaceMPR::OnVisibleVolume );
+
+       return panel;
+}
+
+
+*/
+
+
+/*
+
+//------------------------------------------------------------------------
+
+void wxSurfaceMPR::Refresh(){
+       _vtkmprview[0]->Refresh();
+       _vtkmprview[1]->Refresh();
+       _vtkmprview[2]->Refresh();
+       _vtkmprview[3]->Refresh();
+}
+
+
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnPositionX(wxScrollEvent& event){
+       _vtkmpr3Ddata->SetPositionX( _sl1_box1->GetValue() );
+    Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnPositionY(wxScrollEvent& event){
+       _vtkmpr3Ddata->SetPositionY( _sl2_box1->GetValue() );
+    Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnPositionZ(wxScrollEvent& event){
+       _vtkmpr3Ddata->SetPositionZ( _sl3_box1->GetValue() );
+    Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OpacityTissue(int idView, int idTissue, int opacity){
+       vtkActor *tmpActor;
+       tmpActor = _vtkmprview[ idView ]->GetTissueActor(idTissue);
+       tmpActor->GetProperty()->SetOpacity((float) opacity/100 );
+       _vtkmprview[idView]->Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnOpacity0(wxScrollEvent& event){
+       int opacity = _slA1_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){OpacityTissue(0,0, opacity ); }
+       if (_chkViewB_box2->GetValue()==true){OpacityTissue(1,0, opacity ); }
+       if (_chkViewC_box2->GetValue()==true){OpacityTissue(2,0, opacity ); }
+       if (_chkViewD_box2->GetValue()==true){OpacityTissue(3,0, opacity ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnOpacity1(wxScrollEvent& event){
+       int opacity = _slB1_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){OpacityTissue(0,1, opacity ); }
+       if (_chkViewB_box2->GetValue()==true){OpacityTissue(1,1, opacity ); }
+       if (_chkViewC_box2->GetValue()==true){OpacityTissue(2,1, opacity ); }
+       if (_chkViewD_box2->GetValue()==true){OpacityTissue(3,1, opacity ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnOpacity2(wxScrollEvent& event){
+       int opacity = _slC1_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){OpacityTissue(0,2, opacity ); }
+       if (_chkViewB_box2->GetValue()==true){OpacityTissue(1,2, opacity ); }
+       if (_chkViewC_box2->GetValue()==true){OpacityTissue(2,2, opacity ); }
+       if (_chkViewD_box2->GetValue()==true){OpacityTissue(3,2, opacity ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnOpacity3(wxScrollEvent& event){
+       int opacity = _slD1_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){OpacityTissue(0,3, opacity ); }
+       if (_chkViewB_box2->GetValue()==true){OpacityTissue(1,3, opacity ); }
+       if (_chkViewC_box2->GetValue()==true){OpacityTissue(2,3, opacity ); }
+       if (_chkViewD_box2->GetValue()==true){OpacityTissue(3,3, opacity ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue0(wxScrollEvent& event){
+       int isoValue=_slA2_box2->GetValue() * 50 + _slA3_box2->GetValue();
+       _vtkmpr3Ddata->SetIsovalue(0,isoValue);
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_A->SetLabel(tmpStr);
+    Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue1(wxScrollEvent& event){
+       int isoValue=_slB2_box2->GetValue() * 50 + _slB3_box2->GetValue();
+       _vtkmpr3Ddata->SetIsovalue(1,isoValue);
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_B->SetLabel(tmpStr);
+    Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue2(wxScrollEvent& event){
+       int isoValue=_slC2_box2->GetValue() * 50 + _slC3_box2->GetValue();
+       _vtkmpr3Ddata->SetIsovalue(2,isoValue);
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_C->SetLabel(tmpStr);
+    Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue3(wxScrollEvent& event){
+       int isoValue=_slD2_box2->GetValue() * 50 + _slD3_box2->GetValue();
+       _vtkmpr3Ddata->SetIsovalue(3,isoValue);
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_D->SetLabel(tmpStr);
+    Refresh();
+}
+
+
+
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue_0(wxScrollEvent& event){
+       int isoValue=_slA2_box2->GetValue() * 50 + _slA3_box2->GetValue();
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_A->SetLabel(tmpStr);
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue_1(wxScrollEvent& event){
+       int isoValue=_slB2_box2->GetValue() * 50 + _slB3_box2->GetValue();
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_B->SetLabel(tmpStr);
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue_2(wxScrollEvent& event){
+       int isoValue=_slC2_box2->GetValue() * 50 + _slC3_box2->GetValue();
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_C->SetLabel(tmpStr);
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnIsoValue_3(wxScrollEvent& event){
+       int isoValue=_slD2_box2->GetValue() * 50 + _slD3_box2->GetValue();
+       wxString tmpStr;
+       tmpStr.Printf("%d",isoValue);
+       _text_D->SetLabel(tmpStr);
+}
+
+
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnBtnColourA(wxCommandEvent& event){
+  wxColourDialog dlgColour(this);
+  dlgColour.ShowModal();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnBtnColourB(wxCommandEvent& event){
+  wxColourDialog dlgColour(this);
+  dlgColour.ShowModal();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnBtnColourC(wxCommandEvent& event){
+  wxColourDialog dlgColour(this);
+  dlgColour.ShowModal();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnBtnColourD(wxCommandEvent& event){
+  wxColourDialog dlgColour(this);
+  dlgColour.ShowModal();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::VisibleActor(int idView, int idTissue, bool visTissue, bool visGuide){
+       _vtkmprview[idView]->VisibleActor(idTissue, visTissue, visGuide);
+       _vtkmprview[idView]->Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::VisibleImageActor(int idView, int idTissue, bool visible){
+       _vtkmprview[idView]->VisibleImageActor(idTissue, visible);
+       _vtkmprview[idView]->Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleX(wxCommandEvent& event){
+       bool visible = _chk1_box1->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleImageActor(0,0, visible ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleImageActor(1,0, visible ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleImageActor(2,0, visible ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleImageActor(3,0, visible ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleY(wxCommandEvent& event){
+       bool visible = _chk2_box1->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleImageActor(0,1, visible ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleImageActor(1,1, visible ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleImageActor(2,1, visible ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleImageActor(3,1, visible ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleZ(wxCommandEvent& event){
+       bool visible = _chk3_box1->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleImageActor(0,2, visible ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleImageActor(1,2, visible ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleImageActor(2,2, visible ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleImageActor(3,2, visible ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleTissueA(wxCommandEvent& event){
+       bool visiTissue = _chkA_box2->GetValue();
+       bool visGuide = _chkAA_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleActor(0,0, visiTissue, visGuide ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleActor(1,0, visiTissue, visGuide ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleActor(2,0, visiTissue, visGuide ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleActor(3,0, visiTissue, visGuide ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleTissueB(wxCommandEvent& event){
+       bool visiTissue = _chkA_box2->GetValue();
+       bool visGuide = _chkAA_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleActor(0,1, visiTissue, visGuide ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleActor(1,1, visiTissue, visGuide ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleActor(2,1, visiTissue, visGuide ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleActor(3,1, visiTissue, visGuide ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleTissueC(wxCommandEvent& event){
+       bool visiTissue = _chkA_box2->GetValue();
+       bool visGuide = _chkAA_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleActor(0,2, visiTissue, visGuide ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleActor(1,2, visiTissue, visGuide ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleActor(2,2, visiTissue, visGuide ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleActor(3,2, visiTissue, visGuide ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleTissueD(wxCommandEvent& event){
+       bool visiTissue = _chkA_box2->GetValue();
+       bool visGuide = _chkAA_box2->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleActor(0,3, visiTissue, visGuide ); }
+       if (_chkViewB_box2->GetValue()==true){VisibleActor(1,3, visiTissue, visGuide ); }
+       if (_chkViewC_box2->GetValue()==true){VisibleActor(2,3, visiTissue, visGuide ); }
+       if (_chkViewD_box2->GetValue()==true){VisibleActor(3,3, visiTissue, visGuide ); }
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::VisibleVolumeActor(int idView, bool visVolume, bool visGuide){
+       _vtkmprview[idView]->VisibleVolumeActor( visVolume,visGuide);
+       _vtkmprview[idView]->Refresh();
+}
+//------------------------------------------------------------------------
+void wxSurfaceMPR::OnVisibleVolume(wxCommandEvent& event){
+       bool visVolume = _chk_box3->GetValue();
+       bool visGuide = _chk_box33->GetValue();
+       if (_chkViewA_box2->GetValue()==true){VisibleVolumeActor(0, visVolume, visGuide); }
+       if (_chkViewB_box2->GetValue()==true){VisibleVolumeActor(1, visVolume, visGuide); }
+       if (_chkViewC_box2->GetValue()==true){VisibleVolumeActor(2, visVolume, visGuide); }
+       if (_chkViewD_box2->GetValue()==true){VisibleVolumeActor(3, visVolume, visGuide); }
+}
+
+//------------------------------------------------------------------------
+void wxSurfaceMPR::ConfigureVTK(){
+       _vtkmprview[0]->Configure();
+       _vtkmprview[1]->Configure();
+       _vtkmprview[2]->Configure();
+       _vtkmprview[3]->Configure();
+}
+
+
+*/
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceMPR.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceMPR.h
new file mode 100644 (file)
index 0000000..ccd024d
--- /dev/null
@@ -0,0 +1,287 @@
+
+/*
+#ifndef SURFACE_MPR_H
+#define SURFACE_MPR_H
+
+#include "vtkRenderWindow.h"
+#include <vtkVolumeRayCastMapper.h>
+#include "vtkImageActor.h"
+#include "vtkActor.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkStripper.h"
+#include <vtkGlyph3D.h>
+#include "vtkLODActor.h"
+#include "vtkContourFilter.h"
+#include "vtkPolyDataNormals.h"
+#include <vtkClipPolyData.h>
+#include "vtkOutlineFilter.h"
+#include <vtkPiecewiseFunction.h>
+#include <vtkColorTransferFunction.h>
+#include <vtkVolume.h>
+#include <vtkVolumeProperty.h>
+#include <vtkVolumeRayCastMapper.h>
+#include <vtkVolumeRayCastCompositeFunction.h>
+#include <vtkBoxWidget.h>
+
+#include "wxMPRBaseData.h"
+#include "wxVtkBaseView.h"
+
+//----------------------------------------------------------------------------
+
+
+#define VTKMPRDATA_MAXTISSUE 4
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+// Callback for the interaction
+class boxVolumeObserver : public vtkCommand{
+       public:
+               vtkRenderWindow                 *_renWin;
+               vtkVolumeRayCastMapper  *_volumeMapper;
+
+               boxVolumeObserver() {  }
+
+               virtual char const *GetClassName() const { return "boxVolumeObserver";}
+
+               static boxVolumeObserver *New(){
+                               boxVolumeObserver * result;
+                               result = new boxVolumeObserver();
+                       return result;
+               }
+
+               virtual void Execute(vtkObject *wdg, unsigned long eventId, void* calldata) ;
+               void SetRenWin( vtkRenderWindow *renWin );
+               void SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper);
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+// Callback for the interaction
+class boxSurfaceObserver : public vtkCommand{
+       public:
+               vtkPlanes                       *_planes;
+               vtkActor                        *_actor;
+
+               boxSurfaceObserver() {  }
+
+               virtual char const *GetClassName() const { return "boxSurfaceObserver";}
+
+               static boxSurfaceObserver *New(){
+                               boxSurfaceObserver * result;
+                               result = new boxSurfaceObserver();
+                       return result;
+               }
+
+               virtual void Execute(vtkObject *wdg, unsigned long eventId, void* calldata) ;
+               void SetPlanes(vtkPlanes *planes);
+               void SetActor(vtkActor *actor);
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkMPR3DData : public vtkMPRBaseData{
+public:
+       vtkMPR3DData();
+       ~vtkMPR3DData();
+       vtkImageActor*                  GetImageActor(int id);
+       vtkActor*                               GetOutlineActor();
+       vtkPolyDataMapper*              GetTissueMapper(int id);
+       vtkPlanes*                              GetTissuePlanes(int id);
+       vtkStripper*                    GetTissueStripper(int id);
+       vtkGlyph3D*                             GetGlyph(int id);
+       vtkLODActor*                    GetMaceActor(int id);
+
+       virtual void                    Configure();
+       void                                    SetIsovalue(int idTissue, int isoValue);
+       wxColour*                               GetColour(int idColour);
+       void                                    SetVisiblePosition(int idPosition, bool visible);
+       bool                                    GetVisiblePosition(int idPosition);
+       vtkVolume*                              GetVolumeActor();
+       vtkVolumeRayCastMapper  *GetVolumeMapper();
+
+private:
+       
+       bool                                                            _visiblePosition[3];
+       wxColour                                                        *_colour[ VTKMPRDATA_MAXTISSUE ];
+
+    // tissue
+       vtkContourFilter                                        *_tissueExtractor[ VTKMPRDATA_MAXTISSUE ];
+       vtkPolyDataNormals                                      *_tissueNormals[ VTKMPRDATA_MAXTISSUE ];
+       vtkStripper                                                     *_tissueStripper[ VTKMPRDATA_MAXTISSUE ];
+       vtkPolyDataMapper                                       *_tissueMapper[ VTKMPRDATA_MAXTISSUE ];
+       vtkPlanes                                                       *_tissuePlanes[ VTKMPRDATA_MAXTISSUE ];
+       vtkClipPolyData                                         *_tissueClipper[ VTKMPRDATA_MAXTISSUE ];
+
+       // outline
+       vtkOutlineFilter                                        *_outlineData;
+       vtkPolyDataMapper                                       *_mapOutline;
+       vtkActor                                                        *_outline;
+
+       /// Volume
+       vtkPiecewiseFunction                            *_tfun;
+       vtkColorTransferFunction                        *_ctfun;
+       vtkVolumeRayCastCompositeFunction       *_compositeFunction;
+       vtkVolumeRayCastMapper                          *_volumeMapper;
+       vtkVolumeProperty                                       *_volumeProperty;
+       vtkVolume                                                       *_newvol;
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class wxVtkMPR3DView: public wxVtk3DBaseView, public vtkMPRBaseView{
+public:
+       wxVtkMPR3DView( wxWindow *parent );
+       ~wxVtkMPR3DView();
+       void            SetVtkMPRData(vtkMPR3DData *tmp_vtkmpr3Ddata);
+       vtkActor*       GetTissueActor(int id);
+       void            VisibleActor(int idTissue, bool visTissue, bool visGuide);
+       void            VisibleImageActor(int idPosition, bool visible);
+       void            VisibleVolumeActor( bool visVolume,bool visGuide);
+       void            SetVisibleTissue(int idTissue, bool visible);
+       bool            GetVisibleTissue(int idTissue);
+       virtual void Configure();
+
+private:
+       bool                            _visibleTissue[VTKMPRDATA_MAXTISSUE];
+       bool                            _visibleVolume;
+       vtkActor                        *_tissue[VTKMPRDATA_MAXTISSUE];
+       //volume
+       boxVolumeObserver       *_observerV;
+       vtkBoxWidget            *_boxWidget;
+       boxSurfaceObserver      *_observerS1;
+       vtkBoxWidget            *_boxWidgetS1;
+
+protected:
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxSurfaceMPR: public wxFrame{
+       public:
+
+       wxSurfaceMPR(wxWindow *parent,  vtkImageData *imagedata, const wxString& title);
+       void ConfigureVTK();
+       void OnPositionX(wxScrollEvent& event);
+       void OnPositionY(wxScrollEvent& event);
+       void OnPositionZ(wxScrollEvent& event);
+       void VisibleActor(int idView, int idTissue, bool visTissue, bool visGuide);
+       void VisibleImageActor(int idView, int idTissue, bool visible);
+       void VisibleVolumeActor(int idView, bool visVolume, bool visGuide);
+
+       void OnVisibleX(wxCommandEvent& event);
+       void OnVisibleY(wxCommandEvent& event);
+       void OnVisibleZ(wxCommandEvent& event);
+       void OnVisibleTissueA(wxCommandEvent& event);
+       void OnVisibleTissueB(wxCommandEvent& event);
+       void OnVisibleTissueC(wxCommandEvent& event);
+       void OnVisibleTissueD(wxCommandEvent& event);
+       void OnVisibleVolume(wxCommandEvent& event);
+
+       void OpacityTissue(int idView, int idTissue, int opacity);
+       void OnOpacity0(wxScrollEvent& event);
+       void OnOpacity1(wxScrollEvent& event);
+       void OnOpacity2(wxScrollEvent& event);
+       void OnOpacity3(wxScrollEvent& event);
+       void OnIsoValue0(wxScrollEvent& event);
+       void OnIsoValue1(wxScrollEvent& event);
+       void OnIsoValue2(wxScrollEvent& event);
+       void OnIsoValue3(wxScrollEvent& event);
+       void OnIsoValue_0(wxScrollEvent& event);
+       void OnIsoValue_1(wxScrollEvent& event);
+       void OnIsoValue_2(wxScrollEvent& event);
+       void OnIsoValue_3(wxScrollEvent& event);
+       void OnBtnColourA(wxCommandEvent& event);
+       void OnBtnColourB(wxCommandEvent& event);
+       void OnBtnColourC(wxCommandEvent& event);
+       void OnBtnColourD(wxCommandEvent& event);
+
+       void Refresh();
+
+       private:
+
+       wxSlider        *_sl1_box1;
+       wxSlider        *_sl2_box1;
+       wxSlider        *_sl3_box1;
+       wxCheckBox      *_chk1_box1;
+       wxCheckBox      *_chk2_box1;
+       wxCheckBox      *_chk3_box1;
+
+       wxButton        *_btnA;
+       wxButton        *_btnB;
+       wxButton        *_btnC;
+       wxButton        *_btnD;
+       wxSlider        *_slA1_box2;
+       wxSlider        *_slA2_box2;
+       wxSlider        *_slA3_box2;
+       wxSlider        *_slB1_box2;
+       wxSlider        *_slB2_box2;
+       wxSlider        *_slB3_box2;
+       wxSlider        *_slC1_box2;
+       wxSlider        *_slC2_box2;
+       wxSlider        *_slC3_box2;
+       wxSlider        *_slD1_box2;
+       wxSlider        *_slD2_box2;
+       wxSlider        *_slD3_box2;
+       wxCheckBox      *_chkA_box2;
+       wxCheckBox      *_chkB_box2;
+       wxCheckBox      *_chkC_box2;
+       wxCheckBox      *_chkD_box2;
+       wxCheckBox      *_chkAA_box2;
+       wxCheckBox      *_chkBB_box2;
+       wxCheckBox      *_chkCC_box2;
+       wxCheckBox      *_chkDD_box2;
+       wxCheckBox      *_chkViewA_box2;
+       wxCheckBox      *_chkViewB_box2;
+       wxCheckBox      *_chkViewC_box2;
+       wxCheckBox      *_chkViewD_box2;
+       
+       wxStaticText *_text_A;
+       wxStaticText *_text_B;
+       wxStaticText *_text_C;
+       wxStaticText *_text_D;
+
+       wxSlider        *_sl1_box3;
+       wxSlider        *_sl2_box3;
+       wxSlider        *_sl3_box3;
+       wxCheckBox      *_chk_box3;
+       wxCheckBox      *_chk_box33;
+
+       wxSlider        *_slA_box4;
+       wxSlider        *_slB_box4;
+       wxSlider        *_sl1_box4;
+       wxSlider        *_sl2_box4;
+       wxSlider        *_sl3_box4;
+       wxSlider        *_sl4_box4;
+       wxSlider        *_sl5_box4;
+       wxSlider        *_sl6_box4;
+       wxCheckBox      *_chk_box4;
+
+
+       vtkMPR3DData    *_vtkmpr3Ddata;
+       wxVtkMPR3DView  *_vtkmprview[4];
+
+       wxPanel* CreateControlPanel(wxWindow *parent);
+       wxPanel* CreateMPRPanel(wxWindow *parent,vtkMPR3DData *vtkmpr3Ddata);
+
+};
+
+#endif // SURFACE_MPR_H
+
+
+
+*/
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceSTLWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceSTLWidget.cxx
new file mode 100644 (file)
index 0000000..6073792
--- /dev/null
@@ -0,0 +1,310 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxSurfaceSTLWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxSurfaceSTLWidget.h"
+#include <matrix.h>
+
+#include <wx/dialog.h>
+#include <wx/colordlg.h>
+
+#ifndef __WXMSW__
+#   include "../res/bitmaps/extract.xpm"
+#   include "../res/bitmaps/del_axis.xpm"
+#   include "../res/bitmaps/vessels.xpm"
+#   include "../res/bitmaps/cutter.xpm"
+#   include "../res/bitmaps/stl.xpm"
+#endif
+
+//----------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( wxSurfaceSTLWidget, wxPanel )
+
+    EVT_TOOL(ID_BUTTON_VESSELS_CONSTRUCTION, wxSurfaceSTLWidget::OnVesselConstruction )
+    EVT_TOOL(ID_BUTTON_3D_CUTTER, wxSurfaceSTLWidget::On3DCutter )
+    EVT_TOOL(ID_BUTTON_EXPORT_STL, wxSurfaceSTLWidget::OnExportAsSTL )
+
+    EVT_BUTTON(ID_BUTTON_CHOOSE_COLOR, wxSurfaceSTLWidget::OnChooseSurfaceColor )
+    EVT_CHECKBOX(ID_CHECKBOX_ISOVISIBLE, wxSurfaceSTLWidget::OnIsoVisible )
+    EVT_CHECKBOX(ID_CHECKBOX_STL_VISIBLE, wxSurfaceSTLWidget::OnSTLSurfaceVisible )
+
+    EVT_COMMAND_SCROLL(ID_SLIDER_OPACITY, wxSurfaceSTLWidget::OnSliderOpacityScrollThumbrelease)
+
+    EVT_COMMAND_SCROLL_THUMBRELEASE(ID_SLIDER_ISOVAL, wxSurfaceSTLWidget::OnSliderIsovalueScrollThumbrelease)
+    EVT_COMMAND_SCROLL_THUMBRELEASE(ID_SLIDER_STL_THRESH, wxSurfaceSTLWidget::OnSliderSTLSurfaceValueThumbrelease)
+
+    EVT_CHECKBOX(ID_CHECKBOX_INVERT_SLICE_ORDER, wxSurfaceSTLWidget::OnInvertSliceOrder )
+
+END_EVENT_TABLE( );
+
+//----------------------------------------------------------------------------
+wxSurfaceSTLWidget::wxSurfaceSTLWidget(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style,
+    const wxString& name) : wxPanel( parent, id, pos, size, style, name )
+{
+    _mar = NULL;
+
+    _3DWorldSTL = new vtk3DSurfaceSTLWidget( this, ID_WORLD3D );
+
+    // Set up axis toolbar
+    wxBitmap axisToolBarBitmaps[ 2 ];
+    axisToolBarBitmaps[ 0 ] = wxBITMAP( axistoolbar_extract );
+    axisToolBarBitmaps[ 1 ] = wxBITMAP( axistoolbar_erase );
+
+
+    //By default the Iso value is visible.
+    _isoVisible = new wxCheckBox( this, ID_CHECKBOX_ISOVISIBLE, _T("Iso visible") );
+    _isoVisible->SetValue( true );
+    _isoValue = new wxSlider( this, ID_SLIDER_ISOVAL, 0, 0, 10000 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _opacity = new wxSlider( this, ID_SLIDER_OPACITY, 0, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _isoValue->SetLabel( _T("IsoValue") );
+    _opacity->SetLabel( _T("Surface opacity") );
+
+    //I can't get to brighten the button when mouse over:
+    //_surface_color = new wxButton(this, ID_BUTTON_CHOOSE_COLOR, "", wxPoint(0,0), wxSize(150,50), wxRAISED_BORDER);
+    //_surface_color->SetBackgroundColour( wxColour(250, 235, 214));
+    
+    // Set up vessels toolbar
+    wxBitmap vesselsToolBarBitmaps[ 3 ];
+    vesselsToolBarBitmaps[ 0 ] = wxBITMAP( vesselstoolbar_extract );
+    vesselsToolBarBitmaps[ 1 ] = wxBITMAP( vesselstoolbar_cutter );
+    vesselsToolBarBitmaps[ 2 ] = wxBITMAP( vesselstoolbar_stl );
+
+        _vessels_tb = new wxToolBar( this, -1);
+    _vessels_tb->SetMargins( 4, 4 );
+    _vessels_tb->SetToolBitmapSize( wxSize( vesselsToolBarBitmaps[ 0 ].GetWidth( ), vesselsToolBarBitmaps[ 0 ].GetHeight( ) ) );
+    _vessels_tb->AddTool(ID_BUTTON_VESSELS_CONSTRUCTION, _T("Construct Surface"), vesselsToolBarBitmaps[ 0 ],  _T("Construct Surface"));
+    _vessels_tb->AddSeparator( );
+    //_vessels_tb->AddTool(ID_BUTTON_3D_CUTTER, vesselsToolBarBitmaps[ 1 ], "Delete axis", "short help string");
+    _vessels_tb->AddCheckTool(ID_BUTTON_3D_CUTTER, _T("Delete axis"), vesselsToolBarBitmaps[ 1 ], wxNullBitmap, _T("Delete axis") ); //, "short help string"
+    _vessels_tb->AddSeparator( );
+    _vessels_tb->AddTool(ID_BUTTON_EXPORT_STL, _T("Export as STL"), vesselsToolBarBitmaps[ 2 ], _T("Export as STL"));
+    _vessels_tb->Realize( );
+    _vessels_tb->SetRows( 1 ); ///\todo : what that ? mat
+
+
+    //Set Properties:
+    _isoValue->SetSize(wxSize(64, 16));
+    //End set properties
+    
+    //Do the layout:
+    wxStaticBoxSizer* sizer_3 = new wxStaticBoxSizer(new wxStaticBox(this, -1, _T("Iso Surface values")), wxVERTICAL);
+    //Some borders are needed on wxGTK otherwise static text and slider labels collides.
+    sizer_3->Add(_isoVisible, 1, wxALL|wxEXPAND, 2);
+    sizer_3->Add(new wxStaticText(this, -1, _T("Isovalue")), 1, wxALL|wxEXPAND, 2);
+    sizer_3->Add(_isoValue, 1, wxALL|wxEXPAND, 2);
+    sizer_3->Add(new wxStaticText(this, -1, _T("Opacity (%)")), 1, wxALL|wxEXPAND, 2);
+    sizer_3->Add(_opacity, 1, wxALL|wxEXPAND, 2);
+
+    //By default the STL Iso value is visible.
+    _stlIntSurfaceVisible = new wxCheckBox( this, ID_CHECKBOX_STL_VISIBLE, _T("Internal STL Surface visible") );
+    _stlIntSurfaceVisible->SetValue( true );
+    _stlExtSurfaceVisible = new wxCheckBox( this, ID_CHECKBOX_STL_VISIBLE, _T("External STL Surface visible") );
+    _stlExtSurfaceVisible->SetValue( true );
+    _stlSurfaceValue = new wxSlider( this, ID_SLIDER_STL_THRESH, 0, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _stlSurfaceValue->SetLabel( _T("STL Surface Value") );
+    _stlSurfaceValue->SetRange(0, 100);
+    //hard coded value 'cause thie is still not reachable: (int)_3DWorldSTL->GetSTLThreshold()
+    _stlSurfaceValue->SetValue( 45 ); //100*.45 remember to multiply by 100
+
+
+    //Do the layout:
+    wxStaticBoxSizer* sizer_4 = new wxStaticBoxSizer(new wxStaticBox(this, -1, _T("STL Surface values")), wxVERTICAL);
+    sizer_4->Add(_stlIntSurfaceVisible, 1, wxALL|wxEXPAND, 2);
+    sizer_4->Add(_stlExtSurfaceVisible, 1, wxALL|wxEXPAND, 2);
+    sizer_4->Add(new wxStaticText(this, -1, _T("STL Isovalue")), 1, wxALL|wxEXPAND, 2);
+    sizer_4->Add(_stlSurfaceValue, 1, wxALL|wxEXPAND, 2);
+    
+    _stlIntSurfaceVisible->Disable();
+    _stlExtSurfaceVisible->Disable();
+    _stlSurfaceValue->Disable();
+
+    _chkInvertSliceOrder = new wxCheckBox(this, ID_CHECKBOX_INVERT_SLICE_ORDER, _T("Invert slice order")); 
+
+    wxBoxSizer* sizer_2 = new wxBoxSizer(wxVERTICAL);
+    sizer_2->Add(sizer_3, 1, wxEXPAND, 0);
+// EED Borrame
+//    sizer_2->Add(_axis_tb, 1, wxEXPAND|wxALL|wxALIGN_LEFT, 0);
+    sizer_2->Add(sizer_4, 1, wxEXPAND, 0);
+    sizer_2->Add(_vessels_tb, 1, wxEXPAND|wxALL|wxALIGN_LEFT, 0);
+    sizer_2->Add(_chkInvertSliceOrder, 1, wxEXPAND|wxALL|wxALIGN_LEFT, 0);
+
+    wxBoxSizer* sizer_1 = new wxBoxSizer(wxHORIZONTAL);
+    sizer_1->Add(_3DWorldSTL, 1, wxEXPAND, 0);
+    sizer_1->Add(sizer_2, 0, wxALL|wxALIGN_RIGHT, 5);
+
+    SetAutoLayout(true);
+    SetSizer(sizer_1);
+    Layout();
+
+}
+
+//----------------------------------------------------------------------------
+wxSurfaceSTLWidget::~wxSurfaceSTLWidget( )
+{
+       _3DWorldSTL->Delete();
+}
+
+//----------------------------------------------------------------------------
+/*void wxSurfaceSTLWidget::ShowMARACASDataDebug( vtkImageData *ima )
+{
+    _3DWorldSTL->ShowMARACASData2Debug( ima );
+       
+    //GUI stuff:
+       float minmax[2];
+       float min,max;
+       ima->GetScalarRange( minmax );
+       min = minmax[0];
+    max = minmax[1];
+    
+    
+     _isoValue->SetRange((int)min, (int)max);
+     _isoValue->SetValue( (int)(max/2) );
+
+}*/
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::ShowMARACASData( marInterface* mar )
+{
+wxBusyCursor wait;
+
+
+//    _width  = _mar->_experiment->getDynData( )->getVolume( )->getWidth( );
+//    _height = _mar->_experiment->getDynData( )->getVolume( )->getHeight( );
+//    _depth  = _mar->_experiment->getDynData( )->getVolume( )->getDepth( );
+    
+
+    double min, max; //backward compatibility
+
+    _mar = mar;
+    //_3DWorldSTL->_mar = mar;
+//    _3DWorldSTL->ShowMARACASData( mar );
+    _3DWorldSTL->ShowMARACASDataAndAxe( mar );
+
+       
+    //GUI stuff:
+    _mar->_experiment->getDynData( )->getVolume( )->getMinMax( min, max );
+
+    _isoValue->SetRange((int)min, (int)max);
+    _isoValue->SetValue( (int)(max/4) );
+     
+    _opacity->SetValue( 50 );
+       _chkInvertSliceOrder->SetValue( _mar->_parameters->getBoolParam( marParameters::e_invest_slice_order ) );
+
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnChooseSurfaceColor(wxCommandEvent& WXUNUSED(event))
+{
+    wxColourData data;
+    data.SetChooseFull( true );
+    for( int i = 0; i < 16; i++ )
+    {
+       wxColour colour( i * 16, i * 16, i * 16 );
+       data.SetCustomColour( i, colour );
+    } // rof
+
+    wxColourDialog dialog ( this, &data );
+    dialog.SetTitle( _T("choose color") );
+
+    if( dialog.ShowModal( ) == wxID_OK )
+    {
+       wxColourData retData = dialog.GetColourData( );
+       wxColour col = retData.GetColour( );
+      //_surface_color->SetBackgroundColour( col );
+
+      _3DWorldSTL->SetSurfaceColor(col.Red(), col.Green(), col.Blue() );
+
+    } // fi
+}
+
+
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnInvertSliceOrder(wxCommandEvent& WXUNUSED(event)){
+  wxMessageDialog *msgDlg = new wxMessageDialog(this, _T("You have to restart the application!"), _T("WARNING!!"), wxOK );  
+  msgDlg->ShowModal();
+  delete msgDlg;
+  _mar->_parameters->setBoolParam( marParameters::e_invest_slice_order, _chkInvertSliceOrder->GetValue( ) );
+  _mar->saveParameters( );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnIsoVisible(wxCommandEvent& WXUNUSED(event))
+{
+  _3DWorldSTL->SetSurfaceVisibility( _isoVisible->GetValue() );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnSliderSTLSurfaceValueThumbrelease(wxScrollEvent& WXUNUSED(event))
+{
+  wxBusyCursor wait;
+  double tmp=(double)_stlSurfaceValue->GetValue();
+  _3DWorldSTL->SetSTLThresholdRatio( tmp );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnSTLSurfaceVisible(wxCommandEvent& WXUNUSED(event))
+{
+  _3DWorldSTL->SetSTLSurfaceVisibility( _stlIntSurfaceVisible->GetValue(), _stlExtSurfaceVisible->GetValue() );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnSliderIsovalueScrollThumbrelease(wxScrollEvent& event)
+{
+  wxBusyCursor wait;
+  _3DWorldSTL->SetSurfaceIsoValue( event.GetPosition() );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnSliderOpacityScrollThumbrelease(wxScrollEvent& event)
+{
+  _3DWorldSTL->SetSurfaceOpacity( event.GetPosition() );
+}
+
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnVesselConstruction(wxCommandEvent& WXUNUSED(event))
+{
+       wxBusyCursor wait;
+  _3DWorldSTL->ConstructVessel( );
+  _vessels_tb->EnableTool(ID_BUTTON_3D_CUTTER, true);
+  _vessels_tb->EnableTool(ID_BUTTON_EXPORT_STL, true);
+
+  _stlIntSurfaceVisible->Enable();
+  _stlExtSurfaceVisible->Enable();
+  _stlSurfaceValue->Enable();
+  _vessels_tb->EnableTool(ID_BUTTON_VESSELS_CONSTRUCTION, false);
+//  this->GetParent()->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, false);
+}
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::On3DCutter(wxCommandEvent& event)
+{
+       wxBusyCursor wait;
+  _3DWorldSTL->SetCuttingMode( event.IsChecked() );
+}
+
+//----------------------------------------------------------------------------
+void wxSurfaceSTLWidget::OnExportAsSTL(wxCommandEvent& WXUNUSED(event))
+{
+       wxBusyCursor wait;
+  wxString dirSTL = _mar->_parameters->getStringParam( 
+    marParameters::e_installation_directory ); 
+  dirSTL = ( dirSTL == _T("NO_DIRECTORY") ) ? wxGetHomeDir( ) : dirSTL;
+  wxDirDialog dialog( this, _T("Choose a directory..."), ( !dirSTL.IsEmpty( ) )?
+  dirSTL: wxGetHomeDir( ) );
+
+  if( dialog.ShowModal( ) == wxID_OK ) 
+  {
+     wxString tmpSTR(dialog.GetPath( ) +  _T("/") + _mar->_dicom->GetPatientName() );
+      _3DWorldSTL->ExportSurfaceAsSTL( (const char*)(tmpSTR.mb_str())  );
+  }
+
+  //By default *always* update e_installation_directory:
+  _mar->_parameters->setStringParam( marParameters::e_installation_directory,
+    dialog.GetPath( ) ); 
+  _mar->saveParameters( );
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceSTLWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceSTLWidget.h
new file mode 100644 (file)
index 0000000..0228951
--- /dev/null
@@ -0,0 +1,111 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxSurfaceSTLWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __WX__3D__SURF__STL__WDG__
+#define __WX__3D__SURF__STL__WDG__
+
+//#include "wxVTKRenderWindowInteractor.h"
+#include "vtk3DSurfaceSTLWidget.h"
+#include <wx/wx.h>
+#include <wx/slider.h>
+#include <kernel/marInterface.h>
+
+//----------------------------------------------------------------------------
+/**
+ * \brief Panel class composed of a vtk renderwindow with double click available
+ * and add some buttons
+ */
+class wxSurfaceSTLWidget : public wxPanel
+{
+public:
+    enum ToolBarIDs
+    {
+        ID_TOOL_BAR = 300,
+        ID_BUTTON_NEW_AXIS,
+        ID_BUTTON_DELETE_AXIS,
+        ID_CHECKBOX_ISOVISIBLE,
+        ID_SLIDER_ISOVAL,
+        ID_SLIDER_OPACITY,
+        ID_BUTTON_CHOOSE_COLOR,
+        ID_BUTTON_VESSELS_CONSTRUCTION,
+        ID_BUTTON_3D_CUTTER,
+        ID_BUTTON_EXPORT_STL,
+        ID_CHECKBOX_STL_VISIBLE,
+        ID_SLIDER_STL_THRESH,
+               ID_CHECKBOX_INVERT_SLICE_ORDER,
+    };
+    enum WidgetsIDs
+    {
+        ID_WORLD3D = 800
+    };
+
+public:
+
+    wxSurfaceSTLWidget(
+        wxWindow* parent,
+        wxWindowID id = -1,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = wxScrolledWindowStyle,
+        const wxString& name = wxPanelNameStr
+        );
+
+    ~wxSurfaceSTLWidget( );
+
+
+       //vessels toolbar
+    void OnVesselConstruction(wxCommandEvent& event);
+    void On3DCutter(wxCommandEvent& event);
+    void OnExportAsSTL(wxCommandEvent& event);
+
+    //surface
+    void OnChooseSurfaceColor(wxCommandEvent& event);
+    void OnIsoVisible(wxCommandEvent& event);
+    void OnSTLSurfaceVisible(wxCommandEvent& event);
+
+    //slider isovalue
+    void OnSliderIsovalueScrollThumbrelease(wxScrollEvent& event);
+
+    //slider opacity
+    void OnSliderOpacityScrollThumbrelease(wxScrollEvent& event);
+
+       // Invers lecture order
+   void OnInvertSliceOrder(wxCommandEvent& WXUNUSED(event));
+
+
+    void OnSliderSTLSurfaceValueThumbrelease(wxScrollEvent& event);
+
+    void ShowMARACASData( marInterface* mar );
+
+    wxToolBar  *_axis_tb;
+    wxToolBar  *_vessels_tb;
+    wxCheckBox *_isoVisible;
+    wxSlider   *_isoValue;
+    wxSlider   *_opacity;
+    wxButton   *_surface_color; //mat
+    wxCheckBox *_stlIntSurfaceVisible;
+    wxCheckBox *_stlExtSurfaceVisible;
+    wxSlider   *_stlSurfaceValue;
+    wxCheckBox *_chkInvertSliceOrder;
+
+    marInterface* _mar;
+    
+    vtk3DSurfaceSTLWidget *_3DWorldSTL;
+
+    DECLARE_EVENT_TABLE( );
+};
+
+#endif // __WX__3D__SURF__STL__WDG__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceWidget.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceWidget.cxx
new file mode 100644 (file)
index 0000000..99ac246
--- /dev/null
@@ -0,0 +1,455 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxSurfaceWidget.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "../res/bitmaps/extract.xpm"
+#include "../res/bitmaps/del_axis.xpm"
+#include "../res/bitmaps/plans.xpm"
+#include "wxSurfaceWidget.h"
+#include "../marDictionary.h"
+#include "../wxMaracas_ManualTree_MPRDlg.h"
+
+
+#include <matrix.h>
+
+#include <wx/dialog.h>
+#include <wx/colordlg.h>
+
+// PS -> #ifndef __WXMSW__
+// PS -> #   include "../res/bitmaps/extract.xpm"
+// PS -> #   include "../res/bitmaps/del_axis.xpm"
+// PS -> #endif
+
+//----------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( wxSurfaceWidget, wxPanel )
+
+    EVT_BUTTON(ID_BUTTON_NEW_AXIS              , wxSurfaceWidget::OnExtractAxis                        )
+    EVT_BUTTON(ID_BUTTON_DELETE_AXIS   , wxSurfaceWidget::OnDeleteAxis                         )
+    EVT_BUTTON(ID_BUTTON_QUANTIFICATION , wxSurfaceWidget::OnQuantification                    )
+    EVT_BUTTON(ID_BUTTON_MANUAL_AXIS   , wxSurfaceWidget::OnManualAxis                         )
+
+
+    EVT_BUTTON(ID_BUTTON_CHOOSE_COLOR  , wxSurfaceWidget::OnChooseSurfaceColor         )
+    EVT_CHECKBOX(ID_CHECKBOX_ISOVISIBLE        , wxSurfaceWidget::OnIsoVisible                         )
+
+    EVT_COMMAND_SCROLL(ID_SLIDER_OPACITY, wxSurfaceWidget::OnSliderOpacityScrollThumbrelease)
+    EVT_COMMAND_SCROLL_THUMBRELEASE(ID_SLIDER_ISOVAL, wxSurfaceWidget::OnSliderIsovalueScrollThumbrelease)
+END_EVENT_TABLE( );
+
+//----------------------------------------------------------------------------
+wxSurfaceWidget::wxSurfaceWidget(wxWindow* parent, wxWindowID id, const wxPoint& pos, 
+                                                                const wxSize& size, long style, const wxString& name) 
+                                                                : wxPanel( parent, id, pos, size, style, name )
+{
+printf("EED wxSurfaceWidget::wxSurfaceWidget  1 \n" );
+
+       marDictionary marDict;
+       char tmp[256];
+
+       _id_toolbar_plans=-1;
+       _mar = NULL;
+
+       _3DWorld = new vtk3DSurfaceWidget( this, ID_WORLD3D );
+       _3DWorld->SetInterfaceVtkPanelWidgets(this);
+
+    // Set up axis toolbar
+    wxBitmap axisToolBarBitmaps[ 3 ];
+    axisToolBarBitmaps[ 0 ] = wxBITMAP( axistoolbar_extract );
+    axisToolBarBitmaps[ 1 ] = wxBITMAP( axistoolbar_erase   );
+    axisToolBarBitmaps[ 2 ] = wxBITMAP( toolbar_plans       );
+
+
+   _bt_new_axis                        = new wxBitmapButton( this, ID_BUTTON_NEW_AXIS          , axisToolBarBitmaps[ 0 ] );
+   _bt_delete_axis             = new wxBitmapButton( this, ID_BUTTON_DELETE_AXIS       , axisToolBarBitmaps[ 1 ] );
+   _bt_call_quantification     = new wxBitmapButton( this, ID_BUTTON_QUANTIFICATION, axisToolBarBitmaps[ 2 ],wxDefaultPosition,wxSize(70,70));
+
+       _bt_manual_axis         = new wxButton(this, ID_BUTTON_MANUAL_AXIS, _T("Manual Axis")); 
+//     _bt_manual_axis->SetSize(80,40);
+
+
+
+
+
+    //By default the Iso value is visible.
+    _isoVisible = new wxCheckBox ( this, ID_CHECKBOX_ISOVISIBLE, wxString(marDict.GetString(15), wxConvUTF8) );  //"Iso visible"
+    _isoValue   = new wxSlider   ( this, ID_SLIDER_ISOVAL, 0, 0, 10000 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _opacity    = new wxSlider   ( this, ID_SLIDER_OPACITY, 0, 0, 100 , wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
+    _isoVisible->SetValue( true );
+    _isoValue->SetLabel( wxString(marDict.GetString(25), wxConvUTF8) ); // "IsoValue"
+    _opacity->SetLabel( wxString(marDict.GetString(0), wxConvUTF8) ); //"Surface opacity"
+
+
+    //I can't get to brighten the button when mouse over:
+    //_surface_color = new wxButton(this, ID_BUTTON_CHOOSE_COLOR, "", wxPoint(0,0), wxSize(150,50), wxRAISED_BORDER);
+    //_surface_color->SetBackgroundColour( wxColour(250, 235, 214));
+
+
+    //Set Properties:
+    _isoValue->SetSize(wxSize(64, 16));
+    //End set properties
+
+    //Do the layout:
+    wxStaticBoxSizer* sizer_3 = new wxStaticBoxSizer(new wxStaticBox(this, -1,wxString(marDict.GetString(10), wxConvUTF8)  ), wxVERTICAL);//"Iso Surface values"
+    //Some borders are needed on wxGTK otherwise static text and slider labels collides.
+    sizer_3->Add(_isoVisible, 1, wxALL|wxEXPAND, 2);
+    sizer_3->Add(new wxStaticText(this, -1, wxString(marDict.GetString(20), wxConvUTF8)), 1, wxALL|wxEXPAND, 2); // "Opacity (%)"
+    sizer_3->Add(_opacity, 1, wxALL|wxEXPAND, 2);
+    sizer_3->Add(new wxStaticText(this, -1,wxString(marDict.GetString(25), wxConvUTF8) ), 1, wxALL|wxEXPAND, 2); // "Isovalue"
+    sizer_3->Add(_isoValue, 1, wxALL|wxEXPAND, 2);
+
+    //Do the layout:
+       strcpy( tmp , marDict.GetString(30) ); 
+       _st_cero        = new wxStaticText(this,-1 , wxString(tmp, wxConvUTF8),wxPoint(0,0),wxDefaultSize,wxALIGN_CENTRE );     // "0"
+
+       strcpy( tmp , marDict.GetString(35) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(40) );
+       _st_text        = new wxStaticText(this,-1 , wxString(tmp, wxConvUTF8),wxPoint(0,0),wxDefaultSize,wxALIGN_CENTRE);      // "Select\n artery" 
+
+       strcpy( tmp , marDict.GetString(45) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(50) );
+       _st_one = new wxStaticText(this,-1 , wxString(tmp, wxConvUTF8),wxPoint(0,0),wxDefaultSize,wxALIGN_CENTRE );             // "1 \n Axis Extraction" 
+
+       strcpy( tmp , marDict.GetString(55) ); strcat( tmp , "\n" ); strcat( tmp , marDict.GetString(60) );
+       _st_two = new wxStaticText(this,-1 , wxString(tmp, wxConvUTF8),wxPoint(0,0),wxDefaultSize,wxALIGN_CENTRE);              // " 2 \n Quantification"
+
+
+//     wxFont font(12,wxDEFAULT ,wxNORMAL,wxBOLD);
+//     st_blank->SetFont(font);
+//     st_next1->SetFont(font);
+//     st_next2->SetFont(font);
+//     _st_one->SetFont(font);
+//     _st_two->SetFont(font);
+//     _st_cero->SetFont(font);
+       _st_one->Disable();
+       _bt_new_axis->Disable();
+       _bt_delete_axis->Disable();
+        _st_two->Disable();
+       _bt_call_quantification->Disable();
+
+
+
+       wxFlexGridSizer *axis_sizer = new wxFlexGridSizer(3,5,5,5);
+       axis_sizer->Add(_st_cero                                ,0,wxALIGN_CENTER_HORIZONTAL);
+       axis_sizer->Add(new wxStaticText(this,-1 , _T(" "))                             ,0,wxALIGN_CENTER_HORIZONTAL);
+       axis_sizer->Add(_st_one                                 ,0,wxALIGN_CENTER_HORIZONTAL);
+       axis_sizer->Add(new wxStaticText(this,-1 , _T(" "))                             ,0,wxALIGN_CENTER_HORIZONTAL);
+       axis_sizer->Add(_st_two                                 ,0,wxALIGN_CENTER_HORIZONTAL);
+
+       axis_sizer->Add(_st_text                                ,0,wxALIGN_CENTRE_VERTICAL);
+       axis_sizer->Add(new wxStaticText(this,-1 , _T(" "))     ,0,wxALIGN_CENTRE_VERTICAL);
+       axis_sizer->Add(_bt_new_axis                    ,0,wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL);
+       axis_sizer->Add(new wxStaticText(this,-1 , _T("  "))                            ,0,wxALIGN_CENTRE_VERTICAL);
+       axis_sizer->Add(_bt_call_quantification ,0,wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL);
+
+       axis_sizer->Add(new wxStaticText(this,-1 , _T(" "))                             ,0,wxALIGN_CENTRE_VERTICAL);
+       axis_sizer->Add(new wxStaticText(this,-1 , _T(" "))                             ,0,wxALIGN_CENTRE_VERTICAL);
+       axis_sizer->Add(_bt_delete_axis                 ,0,wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL);
+    wxBoxSizer *sizer_2 = new wxBoxSizer(wxVERTICAL);
+    sizer_2->Add(sizer_3       , 1, wxEXPAND, 0);
+    sizer_2->Add(new wxStaticText(this,-1 , _T(" "))   );
+    sizer_2->Add(new wxStaticText(this,-1 , _T(" "))   );
+    sizer_2->Add(new wxStaticText(this,-1 , _T(" "))   );
+    sizer_2->Add(new wxStaticText(this,-1 , _T(" "))   );
+    sizer_2->Add(axis_sizer    , 1, wxEXPAND|wxALL|wxALIGN_LEFT, 0);
+    sizer_2->Add(_bt_manual_axis);
+
+
+    wxBoxSizer* sizer_1 = new wxBoxSizer(wxHORIZONTAL);
+    sizer_1->Add(_3DWorld, 1, wxEXPAND, 0);
+    sizer_1->Add(sizer_2, 0, wxALL|wxALIGN_RIGHT, 5);
+
+    SetSizer(sizer_1);
+    SetAutoLayout(true);
+    Layout();
+
+
+
+}
+
+//----------------------------------------------------------------------------
+wxSurfaceWidget::~wxSurfaceWidget( )
+{
+       _3DWorld->Delete();
+}
+
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::ShowMARACASData( marInterface* mar )
+{
+  wxBusyCursor wait;
+
+   double min, max; //backward compatibility
+  _mar = mar;
+  _3DWorld->ShowMARACASData( mar );
+  _3DWorld->ConfigureVTK( );
+  _3DWorld->InitCameraReset( );
+
+  //GUI stuff:
+  _mar->_experiment->getDynData( )->getVolume( )->getMinMax( min, max );
+
+  _isoValue->SetRange((int)min, (int)max);
+  _isoValue->SetValue( (int)(max/4) );
+
+  _opacity->SetValue( 50 );
+
+//EED 31 Mai 2007
+//  _3DWorld->Render();
+
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnChooseSurfaceColor(wxCommandEvent& WXUNUSED(event))
+{
+    wxColourData data;
+    data.SetChooseFull( true );
+    for( int i = 0; i < 16; i++ )
+    {
+       wxColour colour( i * 16, i * 16, i * 16 );
+       data.SetCustomColour( i, colour );
+    } // rof
+
+    wxColourDialog dialog ( this, &data );
+    dialog.SetTitle( _T("choose color") );
+
+    if( dialog.ShowModal( ) == wxID_OK )
+    {
+       wxColourData retData = dialog.GetColourData( );
+       wxColour col = retData.GetColour( );
+      //_surface_color->SetBackgroundColour( col );
+
+      _3DWorld->SetSurfaceColor(col.Red(), col.Green(), col.Blue() );
+
+    } // fi
+
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnIsoVisible(wxCommandEvent& WXUNUSED(event))
+{
+  _3DWorld->SetSurfaceVisibility( _isoVisible->GetValue() );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnSliderIsovalueScrollThumbrelease(wxScrollEvent& event)
+{
+  wxBusyCursor wait;
+  _3DWorld->SetSurfaceIsoValue( event.GetPosition() );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnSliderOpacityScrollThumbrelease(wxScrollEvent& event)
+{
+  _3DWorld->SetSurfaceOpacity( event.GetPosition() );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnExtractAxis(wxCommandEvent& event)
+{
+  if(_3DWorld->GetInitialSphere() )
+  {
+// EED Borrame
+long int startTimeAE = clock();;
+
+
+   wxBusyCursor wait;
+
+       gtm::TVector< double > xc( 3 );
+       double data[3];
+       int extent[ 6 ];
+       double spc[ 3 ];
+// PS ->       vtkPolyData* allData; //PS
+
+       vtkImageData *imageData=_mar->_experiment->getDynData( )->getVolume( )->castVtk();
+    imageData->GetExtent( extent );
+    imageData->GetSpacing( spc );
+    _3DWorld->GetSphereCenter( data );
+
+
+//EED 20 Sep 2006
+//     _mar->_experiment->setStartPoint( (int)data[0] - extent[0], (int)data[1] - extent[2], (int)data[2] - extent[4]);
+       double x,y,z;
+       x= (data[0] - extent[0]) / spc[0];
+       y= (data[1] - extent[2]) / spc[1];
+       z= (data[2] - extent[4]) / spc[2];
+       _mar->_experiment->setStartPoint( (int)x, (int)y, (int)z);
+
+       _mar->_experiment->extractVascularTree( );
+
+       _mar->_experiment->setAxis( 0 );
+
+       AddAxisActors();
+// PS ->        allData = temp->Draw( ); //PS
+// PS ->      _3DWorld->SetAxis( allData );//PS
+
+    //Disabling tool
+
+//EED    _axis_tb->EnableTool(ID_BUTTON_NEW_AXIS, false);
+//EED    _axis_tb->EnableTool(ID_BUTTON_DELETE_AXIS, true);
+
+       _bt_new_axis->Disable();
+    _st_two->Enable();
+       _bt_delete_axis->Enable();
+       _bt_call_quantification->Enable();
+
+       event.Skip();
+       wxCommandEvent ev(wxEVT_COMMAND_MENU_SELECTED,ID_BUTTON_NEW_AXIS);
+       ProcessEvent( ev );
+
+/*
+//EED Borrame
+FILE *ff;
+ff = fopen("c:/temp/MaracasStadistics.txt","a+");
+long int endtime = clock();
+double sg = (double)(endtime-startTimeAE) / (double)CLK_TCK;
+fprintf(ff,"EED %p wxSurfaceWidget::OnExtractAxis > AE_t = %f \n",this,sg);
+fclose(ff);
+*/
+
+  }
+  else
+  {
+       wxMessageBox( _T("Set an initial point.\n \n (Double click over the interest artery.)"),
+                                         _T("DxMM : MARACAS"), wxOK | wxCENTRE | wxICON_INFORMATION, this);
+  }
+
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::AddAxisActors(){
+       // Axes ...
+       marAxis         *maraxis                = _mar->_experiment->getAxis( );
+       vtkPolyData *vtkpolydata        = maraxis->Draw();
+       vtkPoints       *vtkpoints              = vtkpolydata->GetPoints();
+       int                     size                    = vtkpoints->GetNumberOfPoints();
+
+// EED 22 sep 2006
+// EED 07 dic 2006
+       double voxelSize = _mar->_parameters->getVoxelSize();
+       double pp[3];
+       int i;
+       for (i=0;i<size;i++)
+       {
+               vtkpoints->GetPoint(i,pp);
+               pp[0]=pp[0] * voxelSize;
+               pp[1]=pp[1] * voxelSize;
+               pp[2]=pp[2] * voxelSize;
+       }
+
+
+       if (maraxis!=NULL) _3DWorld->SetAxis( vtkpolydata );
+       // Other Actors..
+       // ..
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::Clean3D(){
+  _3DWorld->RemoveAxis( );
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::RefreshAxis() {   
+       _3DWorld->Render(); 
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnDeleteAxis(wxCommandEvent& event)
+{
+       wxBusyCursor wait;
+       Clean3D();
+       _mar->_experiment->DeleteAxis( 0 );
+
+    //Disabling tool
+    //wxToolBar::EnableTool This function should only be called after Realize.
+
+       _bt_new_axis->Enable();
+       _bt_delete_axis->Disable();
+       _bt_call_quantification->Disable();
+       _st_one->Enable();
+       _st_two->Disable();
+
+       event.Skip();
+       wxCommandEvent ev(wxEVT_COMMAND_MENU_SELECTED,ID_BUTTON_DELETE_AXIS);
+       ProcessEvent(  ev );
+
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::CallBackOnLeftDClick( wxMouseEvent& event ){
+       _3DWorld->SetInitialPoint();
+       if ( _3DWorld->GetInitialSphere() ){  
+               marAxis *maraxis = _mar->_experiment->getAxis( );
+
+               if (maraxis==NULL) {
+                       _st_one->Enable();
+                       _bt_new_axis->Enable();
+               } else {
+                       _st_one->Disable();
+                       _bt_new_axis->Disable();
+               }
+
+       }
+
+
+       if ( !_3DWorld->GetInitialSphere() ) {
+                       _st_one->Disable();
+                       _bt_new_axis->Disable();
+       }
+
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnQuantification(wxCommandEvent& event){
+       if (_id_toolbar_plans!=-1){
+          wxCommandEvent ev(wxEVT_COMMAND_MENU_SELECTED,_id_toolbar_plans);
+          ProcessEvent(  ev );
+       }
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::SetId_toolbar_plans(int id_toolbar_plans ){
+       _id_toolbar_plans=id_toolbar_plans;
+}
+//----------------------------------------------------------------------------
+int wxSurfaceWidget::GetIsovalue(){
+       return _isoValue->GetValue();
+}
+//----------------------------------------------------------------------------
+int wxSurfaceWidget::GetOpacity(){
+       return _opacity->GetValue();
+}
+//----------------------------------------------------------------------------
+vtk3DSurfaceWidget *wxSurfaceWidget::GetVtk3DSurfaceWidget(){
+       return _3DWorld;
+}
+//----------------------------------------------------------------------------
+void wxSurfaceWidget::OnManualAxis(wxCommandEvent& event)
+{
+       wxBusyCursor wait;
+       if ( _bt_delete_axis->IsEnabled() )
+       {
+               OnDeleteAxis(event);
+       }
+
+       vtkImageData *imagedata =  _mar->_experiment->getDynData( )->getVolume( )->castVtk();   
+       wxMaracas_ManualTree_MPRDlg  *maracasManualTreeMPRDlg = new wxMaracas_ManualTree_MPRDlg( this , new marImageData(imagedata), _mar->_parameters->getVoxelSize() );
+       marAxis *maraxis = new marAxis( _mar->_experiment->getParameters() );
+       maracasManualTreeMPRDlg->SetMarAxis( maraxis );
+       maracasManualTreeMPRDlg->ConfigureVTK();
+       if (maracasManualTreeMPRDlg->ShowModal()==wxID_OK)
+       {
+               if (maracasManualTreeMPRDlg->ExportPoints()==true){
+                       _mar->_experiment->appendAxis(maraxis);
+                       _bt_new_axis->Disable();
+                       _st_two->Enable();
+                       _bt_delete_axis->Enable();
+                       _bt_call_quantification->Enable();
+                       AddAxisActors();
+                       event.Skip();
+                       wxCommandEvent ev(wxEVT_COMMAND_MENU_SELECTED,ID_BUTTON_NEW_AXIS);
+                       ProcessEvent(  ev );
+               } else {
+                       delete maraxis;
+               }
+       }
+       maracasManualTreeMPRDlg->Destroy();
+
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceWidget.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSurfaceWidget.h
new file mode 100644 (file)
index 0000000..ea88224
--- /dev/null
@@ -0,0 +1,116 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxSurfaceWidget.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:43 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __WX__3D__SURF__WDG__
+#define __WX__3D__SURF__WDG__
+
+#include "vtk3DSurfaceWidget.h"
+#include <wx/wx.h>
+#include <wx/slider.h>
+#include <kernel/marInterface.h>
+
+//----------------------------------------------------------------------------
+/**
+ * \brief Panel class composed of a vtk renderwindow with double click available
+ * and add some buttons
+ */
+class wxSurfaceWidget : public wxPanel , InterfaceVtkPanelWidgets
+{
+public:
+  enum ToolBarIDs {
+    ID_TOOL_BAR = 300,
+    ID_BUTTON_NEW_AXIS,
+    ID_BUTTON_DELETE_AXIS,
+    ID_CHECKBOX_ISOVISIBLE,
+    ID_SLIDER_ISOVAL,
+    ID_SLIDER_OPACITY,
+    ID_BUTTON_CHOOSE_COLOR,
+    ID_BUTTON_QUANTIFICATION,
+    ID_BUTTON_MANUAL_AXIS,
+  };
+  
+  enum WidgetsIDs {
+    ID_WORLD3D = 800
+  };
+
+  wxSurfaceWidget( wxWindow* parent, wxWindowID id = -1,
+                  const wxPoint& pos   = wxDefaultPosition,
+                  const wxSize& size   = wxDefaultSize,
+                  long style                   = 0/*wxScrolledWindowStyle*/,
+                  const wxString& name = wxPanelNameStr
+                  );
+
+  ~wxSurfaceWidget( );
+
+  void AddAxisActors();
+  void RefreshAxis();
+  void Clean3D();
+
+  //axis toolbar
+  void OnExtractAxis(wxCommandEvent& event);
+  void OnDeleteAxis(wxCommandEvent& event);
+  void OnQuantification(wxCommandEvent& event);
+
+  //surface
+  void OnChooseSurfaceColor(wxCommandEvent& event);
+  void OnIsoVisible(wxCommandEvent& event);
+
+  //slider isovalue
+  void OnSliderIsovalueScrollThumbrelease(wxScrollEvent& event);
+
+  //slider opacity
+  void OnSliderOpacityScrollThumbrelease(wxScrollEvent& event);
+
+  void ShowMARACASData( marInterface* mar );
+
+  void CallBackOnLeftDClick( wxMouseEvent& event );
+  void SetId_toolbar_plans(int _id_toolbar_plans );
+
+  int  GetIsovalue();
+  int  GetOpacity();
+
+  vtk3DSurfaceWidget *GetVtk3DSurfaceWidget();
+       void OnManualAxis(wxCommandEvent& event);
+       void OnRefreshManualAxis(wxCommandEvent& event);
+
+
+  private:
+
+       int                                     _id_toolbar_plans;
+
+    wxButton                   *_bt_new_axis;
+    wxButton                   *_bt_delete_axis;
+    wxButton                   *_bt_call_quantification;
+
+       wxButton                        *_bt_manual_axis; 
+       wxButton                        *_bt_refresh_manual_axis;
+
+    wxStaticText               *_st_cero;
+       wxStaticText            *_st_text;
+    wxStaticText               *_st_one;
+    wxStaticText               *_st_two;
+
+       wxCheckBox                      *_isoVisible;
+       wxSlider                        *_isoValue;
+       wxSlider                        *_opacity;
+       wxButton                        *_surface_color; //mat
+       marInterface            *_mar;
+       vtk3DSurfaceWidget      *_3DWorld;
+
+  DECLARE_EVENT_TABLE( );
+};
+
+#endif // __WX__3D__SURF__WDG__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.cxx
new file mode 100644 (file)
index 0000000..b2340f6
--- /dev/null
@@ -0,0 +1,768 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: wxVTKRenderWindowInteractor.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:44 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxVTKRenderWindowInteractor.h"
+
+//This is needed for vtk 3.1 :
+#ifndef VTK_MAJOR_VERSION
+#  include "vtkVersion.h"
+#endif
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+#  include "vtkCommand.h"
+#else
+#  include "vtkInteractorStyle.h"
+#endif
+
+//Keep this for compatibilty reason, this was introduced in wxGTK 2.4.0
+#if (!wxCHECK_VERSION(2, 4, 0))
+wxWindow* wxGetTopLevelParent(wxWindow *win)
+{
+    while ( win && !win->IsTopLevel() )
+         win = win->GetParent();
+    return win;
+}
+#endif
+
+// To access objc calls on cocoa
+#ifdef __WXCOCOA__
+#ifdef VTK_USE_COCOA
+#import <Cocoa/Cocoa.h>
+// This trick is no longer need in VTK CVS, should get rid of that:
+#define id Id
+#else
+#error Build mismatch you need both wxWidgets and VTK to be configure against Cocoa to work
+#endif //VTK_USE_COCOA
+#endif //__WXCOCOA__
+
+#ifdef __WXGTK__
+#    include <gdk/gdkx.h> // GDK_WINDOW_XWINDOW is found here in wxWidgets 2.8.0
+#    include "gdk/gdkprivate.h"
+#ifdef __WXGTK20__
+#include <wx/gtk/win_gtk.h>
+#else
+#include <wx/gtk1/win_gtk.h>
+#endif
+#define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \
+                          GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \
+                          GDK_WINDOW_XWINDOW((wxwin)->m_widget->window)
+#endif
+
+#ifdef __WXX11__
+#include "wx/x11/privx.h"
+#define GetXWindow(wxwin)   ((Window)(wxwin)->GetHandle())
+#endif
+
+
+//For more info on this class please go to:
+//http://wxvtk.sf.net
+//This hack is for some buggy wxGTK version:
+#if wxCHECK_VERSION(2, 3, 2) && !wxCHECK_VERSION(2, 4, 1) && defined(__WXGTK__)
+#  define WX_USE_X_CAPTURE 0
+#else
+#  define WX_USE_X_CAPTURE 1
+#endif
+
+#define ID_wxVTKRenderWindowInteractor_TIMER 1001
+
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+IMPLEMENT_DYNAMIC_CLASS(wxVTKRenderWindowInteractor, wxGLCanvas)
+#else
+IMPLEMENT_DYNAMIC_CLASS(wxVTKRenderWindowInteractor, wxWindow)
+#endif  //__WXGTK__
+
+//---------------------------------------------------------------------------
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+BEGIN_EVENT_TABLE(wxVTKRenderWindowInteractor, wxGLCanvas)
+#else
+BEGIN_EVENT_TABLE(wxVTKRenderWindowInteractor, wxWindow)
+#endif //__WXGTK__
+  //refresh window by doing a Render
+  EVT_PAINT       (wxVTKRenderWindowInteractor::OnPaint)
+  EVT_ERASE_BACKGROUND(wxVTKRenderWindowInteractor::OnEraseBackground)
+  EVT_MOTION      (wxVTKRenderWindowInteractor::OnMotion)
+
+  //Bind the events to the event converters
+  EVT_LEFT_DOWN   (wxVTKRenderWindowInteractor::OnButtonDown)
+  EVT_MIDDLE_DOWN (wxVTKRenderWindowInteractor::OnButtonDown)
+  EVT_RIGHT_DOWN  (wxVTKRenderWindowInteractor::OnButtonDown)
+  EVT_LEFT_UP     (wxVTKRenderWindowInteractor::OnButtonUp)
+  EVT_MIDDLE_UP   (wxVTKRenderWindowInteractor::OnButtonUp)
+  EVT_RIGHT_UP    (wxVTKRenderWindowInteractor::OnButtonUp)
+#if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
+  EVT_ENTER_WINDOW(wxVTKRenderWindowInteractor::OnEnter)
+  EVT_LEAVE_WINDOW(wxVTKRenderWindowInteractor::OnLeave)
+  EVT_MOUSEWHEEL  (wxVTKRenderWindowInteractor::OnMouseWheel)
+// If we use EVT_KEY_DOWN instead of EVT_CHAR, capital versions
+// of all characters are always returned.  EVT_CHAR also performs
+// other necessary keyboard-dependent translations.
+  //EVT_KEY_DOWN    (wxVTKRenderWindowInteractor::OnKeyDown)
+  EVT_CHAR        (wxVTKRenderWindowInteractor::OnKeyDown)
+  EVT_KEY_UP      (wxVTKRenderWindowInteractor::OnKeyUp)
+#endif
+  EVT_TIMER       (ID_wxVTKRenderWindowInteractor_TIMER, wxVTKRenderWindowInteractor::OnTimer)
+  EVT_SIZE        (wxVTKRenderWindowInteractor::OnSize)
+END_EVENT_TABLE()
+
+//---------------------------------------------------------------------------
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+wxVTKRenderWindowInteractor::wxVTKRenderWindowInteractor() : vtkRenderWindowInteractor(), wxGLCanvas()
+#else
+wxVTKRenderWindowInteractor::wxVTKRenderWindowInteractor() : vtkRenderWindowInteractor(), wxWindow()
+#endif //__WXGTK__
+      , timer(this, ID_wxVTKRenderWindowInteractor_TIMER)
+      , ActiveButton(wxEVT_NULL)
+      , RenderAllowed(0)
+      , Stereo(0)
+      , Handle(0)
+      , Created(true)
+      , RenderWhenDisabled(1)
+      , UseCaptureMouse(0)
+{
+  
+  this->RenderWindow = NULL;
+  this->SetRenderWindow(vtkRenderWindow::New());
+  this->RenderWindow->Delete();
+  
+  //this->SetBackgroundColour( wxColour(255,0,255) );
+}
+//---------------------------------------------------------------------------
+wxVTKRenderWindowInteractor::wxVTKRenderWindowInteractor(wxWindow *parent,
+                                                         wxWindowID id,
+                                                         const wxPoint &pos,
+                                                         const wxSize &size,
+                                                         long style,
+                                                         const wxString &name)
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+      : vtkRenderWindowInteractor(), wxGLCanvas(parent, id, pos, size, style, name)
+#else
+      : vtkRenderWindowInteractor(), wxWindow(parent, id, pos, size, style, name)
+#endif //__WXGTK__
+      , timer(this, ID_wxVTKRenderWindowInteractor_TIMER)
+      , ActiveButton(wxEVT_NULL)
+      , RenderAllowed(0)
+      , Stereo(0)
+      , Handle(0)
+      , Created(true)
+      , RenderWhenDisabled(1)
+      , UseCaptureMouse(0)
+{
+  
+  this->RenderWindow = NULL;
+  this->SetRenderWindow(vtkRenderWindow::New());
+  this->RenderWindow->Delete();
+  
+  // this->SetBackgroundColour( wxColour(255,0,0) );
+}
+//---------------------------------------------------------------------------
+wxVTKRenderWindowInteractor::~wxVTKRenderWindowInteractor()
+{   
+  // LG : trompe la mort !
+  SetReferenceCount(0);
+}
+//---------------------------------------------------------------------------
+wxVTKRenderWindowInteractor * wxVTKRenderWindowInteractor::New()
+{
+  // we don't make use of the objectfactory, because we're not registered
+  return new wxVTKRenderWindowInteractor;
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::Initialize()
+{
+  int *size = RenderWindow->GetSize();
+  // enable everything and start rendering
+  Enable();
+  //RenderWindow->Start();
+
+  // set the size in the render window interactor
+  Size[0] = size[0];
+  Size[1] = size[1];
+
+  // this is initialized
+  Initialized = 1;
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::Enable()
+{
+  // if already enabled then done
+  if (Enabled)
+    return;
+
+  // that's it
+  Enabled = 1;
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+  SetCurrent();
+#endif
+  Modified();
+}
+//---------------------------------------------------------------------------
+bool wxVTKRenderWindowInteractor::Enable(bool enable)
+{
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+  return wxGLCanvas::Enable(enable);
+#else
+  return wxWindow::Enable(enable);
+#endif
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::Disable()
+{
+  // if already disabled then done
+  if (!Enabled)
+    return;
+
+  // that's it (we can't remove the event handler like it should be...)
+  Enabled = 0;
+  Modified();
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::Start()
+{
+  // the interactor cannot control the event loop
+  vtkErrorMacro( << "wxVTKRenderWindowInteractor::Start() "
+    "interactor cannot control event loop.");
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::UpdateSize(int x, int y)
+{
+  if( RenderWindow )
+  {
+    // if the size changed tell render window
+    if ( x != Size[0] || y != Size[1] )
+    {
+      // adjust our (vtkRenderWindowInteractor size)
+      Size[0] = x;
+      Size[1] = y;
+      // and our RenderWindow's size
+      RenderWindow->SetSize(x, y);
+    }
+  }
+}
+//---------------------------------------------------------------------------
+int wxVTKRenderWindowInteractor::CreateTimer(int WXUNUSED(timertype))
+{
+  // it's a one shot timer
+  if (!timer.Start(10, TRUE))
+    assert(false);
+
+  return 1;
+  
+}
+//---------------------------------------------------------------------------
+int wxVTKRenderWindowInteractor::DestroyTimer()
+{
+  // do nothing
+  return 1;
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnTimer(wxTimerEvent& WXUNUSED(event))
+{
+  if (!Enabled)
+    return;
+    
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::TimerEvent, NULL);
+#else
+    // old style
+    InteractorStyle->OnTimer();
+#endif
+}
+
+//---------------------------------------------------------------------------
+// NOTE on implementation:
+// Bad luck you ended up in the only tricky place of this code.
+// A few note, wxWidgets still refuse to provide such convenient method
+// so I have to maintain it myself, eventhough this is completely integrated
+// in wxPython...
+// Anyway if this happen to break for you then compare to a recent version of wxPython
+// and look for the function long wxPyGetWinHandle(wxWindow* win)
+// in wxPython/src/helpers.cpp
+long wxVTKRenderWindowInteractor::GetHandleHack()
+{
+  //helper function to hide the MSW vs GTK stuff
+  long handle_tmp = 0;
+
+// __WXMSW__ is for Win32
+//__WXMAX__ stands for using Carbon C-headers, using either the CarbonLib/CFM or the native Mach-O builds (which then also use the latest features available)
+// __WXGTK__ is for both gtk 1.2.x and gtk 2.x
+#if defined(__WXMSW__) || defined(__WXMAC__)
+    handle_tmp = (long)this->GetHandle();
+#endif //__WXMSW__
+
+//__WXCOCOA__ stands for using the objective-c Cocoa API
+#ifdef __WXCOCOA__
+   // Here is how to find the NSWindow
+   wxTopLevelWindow* toplevel = dynamic_cast<wxTopLevelWindow*>(
+     wxGetTopLevelParent( this ) );
+   if (toplevel != NULL )    
+   {
+     handle_tmp = (long)toplevel->GetNSWindow();
+   }
+   // The NSView will be deducted from 
+   // [(NSWindow*)Handle contentView]
+   // if only I knew how to write that in c++
+#endif //__WXCOCOA__
+
+    // Find and return the actual X-Window.
+#if defined(__WXGTK__) || defined(__WXX11__)
+    return (long)GetXWindow(this);
+#endif
+
+//#ifdef __WXMOTIF__
+//    handle_tmp = (long)this->GetXWindow();
+//#endif
+
+  return handle_tmp;
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+
+  //must always be here
+  wxPaintDC pDC(this);
+
+  //do it here rather than in the cstor: this is safer.
+  if(!Handle)
+  {
+    Handle = GetHandleHack();
+    RenderWindow->SetWindowId(reinterpret_cast<void *>(Handle));
+#ifdef __WXMSW__
+    RenderWindow->SetParentId(reinterpret_cast<void *>(this->GetParent()->GetHWND()));
+#endif //__WXMSW__
+  }
+  // get vtk to render to the wxWindows
+  //bbtkDebugMessage("Wx",9,"wxVTKRenderWindowInteractor::OnPaint"<<std::endl);
+  //std::cout << "wxVTKRenderWindowInteractor::OnPaint"<<std::endl;
+  Render();
+
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+  //  bbtkDebugMessage("Core",9,"wxVTKRenderWindowInteractor::OnPaint   public wxGLCanvas, virtual public vtkRenderWindowInteractor  \n");
+#else
+  //  bbtkDebugMessage("Core",9,"wxVTKRenderWindowInteractor::OnPaint public wxWindow, virtual public vtkRenderWindowInteractor     \n");
+#endif //__WXGTK__
+
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnEraseBackground(wxEraseEvent &event)
+{
+  //printf("EED wxVTKRenderWindowInteractor::OnEraseBackground \n");
+  //turn off background erase to reduce flickering on MSW
+  event.Skip(false);
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnSize(wxSizeEvent& WXUNUSED(event))
+{
+  int w, h;
+  GetClientSize(&w, &h);
+  UpdateSize(w, h);
+
+  if (!Enabled) 
+    {
+    return;
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+  InvokeEvent(vtkCommand::ConfigureEvent, NULL);
+#endif
+  //this will check for Handle
+  //Render();
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnMotion(wxMouseEvent &event)
+{
+ if (!Enabled) 
+    {
+   return;
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+    event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+
+  InvokeEvent(vtkCommand::MouseMoveEvent, NULL);
+#else
+  InteractorStyle->OnMouseMove(event.ControlDown(), event.ShiftDown(),
+    event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+}
+//---------------------------------------------------------------------------
+#if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
+void wxVTKRenderWindowInteractor::OnEnter(wxMouseEvent &event)
+{
+       SetFocus();
+  if (!Enabled) 
+    {          
+               return; 
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+      event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+
+  InvokeEvent(vtkCommand::EnterEvent, NULL);
+#else
+    // old style
+  InteractorStyle->OnEnter(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);  
+#endif
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnLeave(wxMouseEvent &event)
+{
+  if (!Enabled) 
+    {
+    return;
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+      event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+
+  InvokeEvent(vtkCommand::LeaveEvent, NULL);
+#else
+    // old style
+  InteractorStyle->OnLeave(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);  
+#endif
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnKeyDown(wxKeyEvent &event)
+{
+  if (!Enabled) 
+    {
+    return;
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+  int keycode = event.GetKeyCode();
+
+  char key = '\0';
+  if ( keycode < 256 )
+  {
+    // TODO: Unicode in non-Unicode mode ??
+    key = (char)keycode;
+  }
+  else//Dic 2007
+  {
+       if ( keycode==314 )//Real keyCode for Left ARROW and non-Unicode
+       {       
+               key = 'L';//Left
+       }
+       else if( keycode==315 )//Real keyCode for Left ARROW and non-Unicode
+       {
+               key = 'U';//Up
+       }
+       else if( keycode==316 )//Real keyCode for Left ARROW and non-Unicode
+       {
+               key = 'R';//Right
+       }
+       else if( keycode==317 )//Real keyCode for Down ARROW and non-Unicode
+       {
+               key = 'D';//Down
+       }
+       else if( keycode==312 )//Real keyCode for Diagonal left down ARROW and non-Unicode
+       {
+               key = 'W';//Diagonal left down
+       }
+       else if( keycode==313 )//Real keyCode for Diagonal left up ARROW and non-Unicode
+       {
+               key = 'Q';//Diagonal left up
+       }
+       else if( keycode==366 )//Real keyCode for Diagonal right up ARROW and non-Unicode
+       {
+               key = 'P';//Diagonal right up
+       }
+       else if( keycode==367 )//Real keyCode for Diagonal right down ARROW and non-Unicode
+       {
+               key = 'M';//Diagonal right down
+       }
+  }
+
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+    event.ControlDown(), event.ShiftDown(), key, 0, NULL);
+
+  InvokeEvent(vtkCommand::KeyPressEvent, NULL);
+  InvokeEvent(vtkCommand::CharEvent, NULL);
+#else
+  InteractorStyle->OnKeyDown(event.ControlDown(), event.ShiftDown(), 
+    event.GetKeyCode(), 1);
+#endif
+  event.Skip();
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnKeyUp(wxKeyEvent &event)
+{
+  if (!Enabled) 
+    {
+    return;
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+  int keycode = event.GetKeyCode();
+  char key = '\0';
+  if (keycode < 256)
+  {
+    // TODO: Unicode in non-Unicode mode ??
+    key = (char)keycode;
+  }
+
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+    event.ControlDown(), event.ShiftDown(), key, 0, NULL);
+  InvokeEvent(vtkCommand::KeyReleaseEvent, NULL);
+#else
+  InteractorStyle->OnKeyUp(event.ControlDown(), event.ShiftDown(), 
+    event.GetKeyCode(), 1);
+#endif
+  event.Skip();
+}
+#endif //!(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event)
+{
+  if (!Enabled || (ActiveButton != wxEVT_NULL))
+    {
+    return;
+    }
+  ActiveButton = event.GetEventType();
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+    event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+#endif
+
+  if(event.RightDown())
+  {
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::RightButtonPressEvent, NULL);
+#else            
+    // old style
+    InteractorStyle->OnRightButtonDown(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+  }
+  else if(event.LeftDown())
+  {
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::LeftButtonPressEvent, NULL);
+#else            
+    // old style
+    InteractorStyle->OnLeftButtonDown(event.ControlDown(),  event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+  }
+  else if(event.MiddleDown())
+  {
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::MiddleButtonPressEvent, NULL);
+#else            
+    // old style
+    InteractorStyle->OnMiddleButtonDown(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+  }
+  //save the button and capture mouse until the button is released
+  //Only if :
+  //1. it is possible (WX_USE_X_CAPTURE)
+  //2. user decided to.
+  if ((ActiveButton != wxEVT_NULL) && WX_USE_X_CAPTURE && UseCaptureMouse)
+  {
+    CaptureMouse();
+  }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event)
+{
+  //EVT_xxx_DOWN == EVT_xxx_UP - 1
+  //This is only needed if two mouse buttons are pressed at the same time.
+  //In wxWindows 2.4 and later: better use of wxMOUSE_BTN_RIGHT or 
+  //wxEVT_COMMAND_RIGHT_CLICK
+  if (!Enabled || (ActiveButton != (event.GetEventType()-1))) 
+    {
+    return;
+    }
+
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+  SetEventInformationFlipY(event.GetX(), event.GetY(), 
+    event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+#endif
+  
+  if(ActiveButton == wxEVT_RIGHT_DOWN)
+  {
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::RightButtonReleaseEvent, NULL);
+#else            
+    // old style
+    InteractorStyle->OnRightButtonUp(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+  }
+  else if(ActiveButton == wxEVT_LEFT_DOWN)
+  {
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::LeftButtonReleaseEvent, NULL);
+#else            
+    // old style
+    InteractorStyle->OnLeftButtonUp(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+  }
+  else if(ActiveButton == wxEVT_MIDDLE_DOWN)
+  {
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
+    // new style
+    InvokeEvent(vtkCommand::MiddleButtonReleaseEvent, NULL);
+#else            
+    // old style
+    InteractorStyle->OnMiddleButtonUp(event.ControlDown(), event.ShiftDown(),
+      event.GetX(), Size[1] - event.GetY() - 1);
+#endif
+  }
+  //if the ActiveButton is realeased, then release mouse capture
+  if ((ActiveButton != wxEVT_NULL) && WX_USE_X_CAPTURE && UseCaptureMouse)
+  {
+    ReleaseMouse();
+  }
+  ActiveButton = wxEVT_NULL;
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::OnMouseWheel(wxMouseEvent& event)
+{
+// Mouse wheel was only added after VTK 4.4 (I think...)
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2)
+  // new style
+  //Set vtk event information ... The numebr of wheel rotations is stored in
+  //the x varible.  y varible is zero
+  SetEventInformationFlipY(event.GetWheelRotation() / event.GetWheelDelta(), 0, 
+                           event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+  if(event.GetWheelRotation() > 0)
+    {
+      //Send event to VTK
+// EED
+//      InvokeEvent(vtkCommand::MouseWheelForwardEvent, NULL);
+    }
+  else
+    {
+      //Send event to VTK
+// EED
+//      InvokeEvent(vtkCommand::MouseWheelBackwardEvent, NULL);
+    }
+#endif
+    
+}
+
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::Render()
+{
+  RenderAllowed = 1;
+  if (!RenderWhenDisabled)
+    {
+    //the user doesn't want us to render when the toplevel frame
+    //is disabled - first find the top level parent
+    wxWindow *topParent = wxGetTopLevelParent(this);
+    if (topParent)
+      {
+      //if it exists, check whether it's enabled
+      //if it's not enabeld, RenderAllowed will be false
+      RenderAllowed = topParent->IsEnabled();
+      }
+    }
+
+  if (RenderAllowed)
+    {
+    if(Handle && (Handle == GetHandleHack()) )
+      {
+      RenderWindow->Render();
+      }
+#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2)
+    else if(GetHandleHack())
+      {
+      //this means the user has reparented us; let's adapt to the
+      //new situation by doing the WindowRemap dance
+      //store the new situation
+      Handle = GetHandleHack();
+      RenderWindow->SetNextWindowId(reinterpret_cast<void *>(Handle));
+      RenderWindow->WindowRemap();
+      RenderWindow->Render();
+      }
+#endif
+    }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractor::SetRenderWhenDisabled(int newValue)
+{
+  //Change value of __RenderWhenDisabled ivar.
+  //If __RenderWhenDisabled is false (the default), this widget will not
+  //call Render() on the RenderWindow if the top level frame (i.e. the
+  //containing frame) has been disabled.
+
+  //This prevents recursive rendering during wxSafeYield() calls.
+  //wxSafeYield() can be called during the ProgressMethod() callback of
+  //a VTK object to have progress bars and other GUI elements updated -
+  //it does this by disabling all windows (disallowing user-input to
+  //prevent re-entrancy of code) and then handling all outstanding
+  //GUI events.
+        
+  //However, this often triggers an OnPaint() method for wxVTKRWIs,
+  //resulting in a Render(), resulting in Update() being called whilst
+  //still in progress.
+
+  RenderWhenDisabled = (bool)newValue;
+}
+//---------------------------------------------------------------------------
+//
+// Set the variable that indicates that we want a stereo capable window
+// be created. This method can only be called before a window is realized.
+//
+void wxVTKRenderWindowInteractor::SetStereo(int capable)
+{
+  if (Stereo != capable)
+    {
+    Stereo = capable;
+    RenderWindow->StereoCapableWindowOn();
+    RenderWindow->SetStereoTypeToCrystalEyes();
+    Modified();
+    }
+}
+
+//---------------------------------------------------------------------------
+//
+//
+void wxVTKRenderWindowInteractor::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os, indent);
+}
+
+
+#if defined(_WIN32)
+const char * wxVTKRenderWindowInteractor::GetClassName() const
+{
+  return "wxVTKRenderWindowInteractor";
+}
+#endif //_WIN32
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractor.h
new file mode 100644 (file)
index 0000000..098884c
--- /dev/null
@@ -0,0 +1,176 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: wxVTKRenderWindowInteractor.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:44 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+// .NAME  wxVTKRenderWindowInteractor - class to enable VTK to render to 
+// and interact with wxWindow.
+// .SECTION Description
+//  wxVTKRenderWindowInteractor provide a VTK widget for wxWindow. This class
+// was completely rewrote to have the 'Look & Feel' of the python version:
+// wxVTKRenderWindowInteractor.py
+// .SECTION Caveats 
+//  - There is a know bug that prevent this class to works for more info see 
+// WX_USE_X_CAPTURE. This bug only affect wxGTK from 2.3.2 to wxGTK 2.4.0.
+//  - Furthermore this class is tempated over either wxWindows or wxGLCanvas,
+// in wxWindows 2.3.1 and earlier, the wxGLCanvas had scroll bars, you can avoid
+// this effect by playing with WX_BASE_CLASS at your risk (you might end up with
+// lot of flickering.)
+//  - This class might not be easily readable as it tried to work with VTK 3.2
+//  and 4.x. This class doesn't support reparenting with VTK 4.2 and earlier.
+// .SECTION see also
+// wxVTKRenderWindowInteractor.py wxVTKRenderWindow.py
+
+#ifndef _wxVTKRenderWindowInteractor_h_
+#define _wxVTKRenderWindowInteractor_h_
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#  pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include <wx/timer.h>
+#include <wx/dcclient.h>
+
+// vtk includes
+#include "vtkRenderWindowInteractor.h"
+#include "vtkRenderWindow.h"
+
+// Apparently since wxGTK 2.8.0 one can finally use wxWindow (just as in any
+// other port):
+#if (!wxCHECK_VERSION(2, 8, 0))
+#define USE_WXGLCANVAS
+#endif
+
+
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+# if wxUSE_GLCANVAS
+#    include <wx/glcanvas.h>
+# else
+#    error "problem of wxGLCanvas, you need to build wxWidgets with opengl"
+# endif //wxUSE_GLCANVAS
+#endif //__WXGTK__
+
+// Motif version (renamed into wxX11 for wxWindow 2.4 and newer)
+#if defined(__WXMOTIF__) 
+# error This GUI is not supported by wxVTKRenderWindowInteractor for now
+#endif
+
+// wx forward declarations
+class wxPaintEvent;
+class wxMouseEvent;
+class wxTimerEvent;
+class wxKeyEvent;
+class wxSizeEvent;
+
+#if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
+class VTK_RENDERING_EXPORT wxVTKRenderWindowInteractor : public wxGLCanvas, virtual public vtkRenderWindowInteractor
+#else
+class /*VTK_RENDERING_EXPORT*/ wxVTKRenderWindowInteractor : public wxWindow, virtual public vtkRenderWindowInteractor
+#endif //__WXGTK__
+{
+  DECLARE_DYNAMIC_CLASS(wxVTKRenderWindowInteractor)
+  
+  public:
+    //constructors
+    wxVTKRenderWindowInteractor();
+
+    wxVTKRenderWindowInteractor(wxWindow *parent,
+                                wxWindowID id,
+                                const wxPoint &pos = wxDefaultPosition,
+                                const wxSize &size = wxDefaultSize,
+                                long style = wxWANTS_CHARS | wxNO_FULL_REPAINT_ON_RESIZE,
+                                const wxString &name = wxPanelNameStr);
+       //vtk ::New()
+    static wxVTKRenderWindowInteractor * New();
+    void PrintSelf(ostream& os, vtkIndent indent);
+
+         //destructor
+    ~wxVTKRenderWindowInteractor();
+
+#if defined(_WIN32)
+    const char * wxVTKRenderWindowInteractor::GetClassName() const;
+#endif //_WIN32
+
+
+    // vtkRenderWindowInteractor overrides
+    void Initialize();
+    void Enable();
+    bool Enable(bool enable);
+    void Disable();
+    void Start();
+    void UpdateSize(int x, int y);
+    int CreateTimer(int timertype);
+    int DestroyTimer();
+    void TerminateApp() {};
+
+    // event handlers
+    void OnPaint(wxPaintEvent &event);
+    void OnEraseBackground (wxEraseEvent& event);
+    void OnMotion(wxMouseEvent &event);
+
+    void OnButtonDown(wxMouseEvent &event);
+    void OnButtonUp(wxMouseEvent &event);
+#if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
+    void OnEnter(wxMouseEvent &event);
+    void OnLeave(wxMouseEvent &event);
+    void OnKeyDown(wxKeyEvent &event);
+    void OnKeyUp(wxKeyEvent &event);
+#endif
+    void OnTimer(wxTimerEvent &event);
+    void OnSize(wxSizeEvent &event);
+    void OnMouseWheel(wxMouseEvent& event);
+
+    void Render();
+    void SetRenderWhenDisabled(int newValue);
+
+    // Description:
+    // Prescribe that the window be created in a stereo-capable mode. This
+    // method must be called before the window is realized. Default if off.
+    vtkGetMacro(Stereo,int);
+    vtkBooleanMacro(Stereo,int);
+    virtual void SetStereo(int capable);
+
+    // Description:
+    // As CaptureMouse could be a problem sometimes on a window box
+    // This method allow to set or not the CaptureMouse.
+    // This method actually will works only if WX_USE_X_CAPTURE was set to 1
+    vtkSetMacro(UseCaptureMouse,int);
+    vtkBooleanMacro(UseCaptureMouse,int);
+
+  protected:
+    wxTimer timer;
+    int ActiveButton;
+    int RenderAllowed;
+    long GetHandleHack();
+    int Stereo;
+    
+  private:
+    long Handle;
+    bool Created;
+    int RenderWhenDisabled;
+    int UseCaptureMouse;
+
+    DECLARE_EVENT_TABLE()
+};
+
+#endif //_wxVTKRenderWindowInteractor_h_
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractorEditContour.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractorEditContour.cxx
new file mode 100644 (file)
index 0000000..837cab6
--- /dev/null
@@ -0,0 +1,328 @@
+#include "wxVTKRenderWindowInteractorEditContour.h"
+
+//---------------------------------------------------------------------------
+vtkInteractorStyle3DMaracas::vtkInteractorStyle3DMaracas(){
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyle3DMaracas::~vtkInteractorStyle3DMaracas(){
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnRightButtonDown (){    
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnRightButtonDown();
+               }
+*/
+  this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], 
+                          this->Interactor->GetEventPosition()[1]);
+
+  if (this->CurrentRenderer == NULL)
+    {
+    return;
+    }
+
+  if (this->Interactor->GetControlKey()) {
+      this->StartDolly();
+  }
+
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnRightButtonUp () {
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnRightButtonUp();
+               }
+*/
+
+               
+  switch (this->State) 
+    {
+    case VTKIS_DOLLY:
+      this->EndDolly();
+      break;
+    }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnMouseMove () {
+
+//             this->vtkInteractorStyleTrackballCamera::OnMouseMove();
+
+  int x = this->Interactor->GetEventPosition()[0];
+  int y = this->Interactor->GetEventPosition()[1];
+
+
+  vtkRenderWindowInteractor *rwi = this->Interactor;
+
+  int lx =  rwi->GetLastEventPosition()[0];
+  int ly =  rwi->GetLastEventPosition()[1];
+  int dx = rwi->GetEventPosition()[0] ;
+  int dy = rwi->GetEventPosition()[1] ;
+
+
+  switch (this->State) 
+    {
+    case VTKIS_ROTATE:
+ //     this->FindPokedRenderer(x, y);
+      this->Rotate();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+
+    case VTKIS_PAN:
+ //     this->FindPokedRenderer(x, y);
+      this->Pan();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+
+    case VTKIS_DOLLY:
+ //     this->FindPokedRenderer(x, y);
+      this->Dolly();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+
+    case VTKIS_SPIN:
+ //     this->FindPokedRenderer(x, y);
+      this->Spin();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+    }
+
+
+
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnLeftButtonDown (){
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
+               } else {
+                       this->vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
+               }
+*/
+
+
+  this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], 
+                          this->Interactor->GetEventPosition()[1]);
+  if (this->CurrentRenderer == NULL)
+    {
+    return;
+    }
+
+  if (this->Interactor->GetControlKey()) {
+      this->StartPan();
+  } else {
+      this->StartRotate();
+  }
+
+ /* 
+  if (this->Interactor->GetShiftKey()) 
+    {
+    if (this->Interactor->GetControlKey()) 
+      {
+      this->StartDolly();
+      }
+    else 
+      {
+      this->StartPan();
+      }
+    } 
+  else 
+    {
+    if (this->Interactor->GetControlKey()) 
+      {
+      this->StartSpin();
+      }
+    else 
+      {
+      this->StartRotate();
+      }
+    }
+*/
+
+
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnLeftButtonUp () {
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
+               } else {
+                       this->vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
+               }
+*/
+  switch (this->State) 
+    {
+
+    case VTKIS_PAN:
+      this->EndPan();
+      break;
+
+    case VTKIS_ROTATE:
+      this->EndRotate();
+      break;
+    }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnMiddleButtonDown () {
+//             this->vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle3DMaracas::OnMiddleButtonUp () {
+//             this->vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
+}
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+vtkInteractorStyle2DMaracas::vtkInteractorStyle2DMaracas(){
+       _obs=NULL;
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyle2DMaracas::~vtkInteractorStyle2DMaracas(){
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnRightButtonDown (){    
+       if (GetInteractor()->GetControlKey()==1 ){
+               this->vtkInteractorStyleImage::OnRightButtonDown();
+       }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnRightButtonUp () {
+       if (GetInteractor()->GetControlKey()==1 ){
+               this->vtkInteractorStyleImage::OnRightButtonUp();
+       }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnMouseMove () {
+       this->vtkInteractorStyleImage::OnMouseMove();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnLeftButtonDown (){
+       if ((GetInteractor()->GetControlKey()==1) && (GetInteractor()->GetShiftKey()==0) ){
+               this->vtkInteractorStyleImage::OnMiddleButtonDown();
+       } else if ((GetInteractor()->GetControlKey()==0) && (GetInteractor()->GetShiftKey()==1) ){
+               if (_obs){
+                       _obs->Execute( NULL , vtkCommand::LeftButtonPressEvent  , NULL ) ;
+               }
+       } else {
+               this->vtkInteractorStyleImage::OnLeftButtonDown();
+       }
+}
+
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnLeftButtonUp () {
+       if ((GetInteractor()->GetControlKey()==1) && (GetInteractor()->GetShiftKey()==0) ){
+               this->vtkInteractorStyleImage::OnMiddleButtonUp();
+       } else if ((GetInteractor()->GetControlKey()==0) && (GetInteractor()->GetShiftKey()==1) ){
+               if (_obs) {
+                       _obs->Execute( NULL , vtkCommand::LeftButtonReleaseEvent  , NULL );
+               }
+       } else {
+               this->vtkInteractorStyleImage::OnLeftButtonUp();
+       }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnMiddleButtonDown () {
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyle2DMaracas::OnMiddleButtonUp () {
+}
+
+//---------------------------------------------------------------------------
+void vtkInteractorStyle2DMaracas::SetObserver(vtkCommand* obs){
+       this->_obs=obs;
+}
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+wxVTKRenderWindowInteractorEditContour::wxVTKRenderWindowInteractorEditContour(wxWindow *parent,wxWindowID id)
+  :wxVTKRenderWindowInteractor(parent,id){
+       this->_state=0;
+}
+//---------------------------------------------------------------------------
+wxVTKRenderWindowInteractorEditContour::~wxVTKRenderWindowInteractorEditContour(){
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::OnButtonDown(wxMouseEvent &event){
+       if (this->_state==1){
+         wxVTKRenderWindowInteractor::OnButtonDown(event);
+       }
+       if (this->_state==2){
+               if(event.LeftDown()==true){
+                       SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+                       _obs->Execute( NULL , wxEVT_LEFT_DOWN  , NULL ) ;
+               }
+               if(event.RightDown()==true){
+           wxVTKRenderWindowInteractor::OnButtonDown(event);
+                       SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+                       _obs->Execute( NULL , wxEVT_RIGHT_DOWN  , NULL ) ;
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::OnButtonUp(wxMouseEvent &event){
+       if (this->_state==1){
+         wxVTKRenderWindowInteractor::OnButtonUp(event);
+       }
+       if (this->_state==2){
+               if(event.LeftUp()==true){
+                       SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+                       _obs->Execute( NULL , wxEVT_LEFT_UP  , NULL ) ;
+               }
+               if(event.RightUp()==true){
+           wxVTKRenderWindowInteractor::OnButtonUp(event);
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::OnButtonDouble(wxMouseEvent &event){
+       if (this->_state==1){
+// EED 22 dec 2007 :  SIL que tengo que hacer aqui ..??  Esto creo que lo quito silvia y como se 
+// remplaza
+//       wxVTKRenderWindowInteractor::OnButtonDouble(event);
+       }
+       if (this->_state==2){
+               if(event.LeftDClick()==true){
+                       SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+                       _obs->Execute( NULL , wxEVT_LEFT_DCLICK  , NULL ) ;
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::OnMotion(wxMouseEvent &event){
+       if (this->_state==1){
+               wxVTKRenderWindowInteractor::OnMotion(event);
+       }
+       if (this->_state==2){
+               wxVTKRenderWindowInteractor::OnMotion(event);
+               if(event.Moving()==true){
+                       SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
+                       _obs->Execute( NULL , wxEVT_MOTION   , NULL ) ;
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::OnKeyDown(wxKeyEvent &event){
+       wxVTKRenderWindowInteractor::OnKeyDown(event);
+       if (( event.GetKeyCode()==WXK_BACK ) || ( event.GetKeyCode()==WXK_DELETE) ){
+               _obs->Execute( NULL , WXK_CLEAR   , NULL ) ;
+       }
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::SetState(int state){
+       this->_state=state;
+}
+//---------------------------------------------------------------------------
+int     wxVTKRenderWindowInteractorEditContour::GetState(){
+       return this->_state;
+}
+//---------------------------------------------------------------------------
+void wxVTKRenderWindowInteractorEditContour::SetObserver(vtkCommand* obs){
+       this->_obs=obs;
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractorEditContour.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVTKRenderWindowInteractorEditContour.h
new file mode 100644 (file)
index 0000000..63ffd09
--- /dev/null
@@ -0,0 +1,221 @@
+#ifndef _wxVTKRenderWindowInteractorEditContour_h_
+#define _wxVTKRenderWindowInteractorEditContour_h_
+
+
+#include "wxVTKRenderWindowInteractor.h"
+
+#include <vtkCommand.h> 
+#include <vtkImageData.h> 
+//#include <vtkRenderWindow.h> 
+#include <vtkImageViewer2.h> 
+
+#include <vtkInteractorStyleTrackballCamera.h> 
+#include <vtkInteractorStyleImage.h> 
+
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+class vtkInteractorStyle3DMaracas : public vtkInteractorStyleTrackballCamera    {
+public:
+       vtkInteractorStyle3DMaracas();
+       ~vtkInteractorStyle3DMaracas();
+
+       virtual char const *GetClassName() const { return "vtkInteractorStyle3DMaracas";}
+       static vtkInteractorStyle3DMaracas *New(){
+                                       return new vtkInteractorStyle3DMaracas();
+                               }
+
+       virtual void  OnMouseMove () ;
+       virtual void  OnLeftButtonDown (); 
+       virtual void  OnLeftButtonUp () ;
+       virtual void  OnMiddleButtonDown (); 
+       virtual void  OnMiddleButtonUp () ;
+       virtual void  OnRightButtonDown () ;
+       virtual void  OnRightButtonUp () ;
+
+private:
+
+};
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+class vtkMaracasImageViewer2Callback : public vtkCommand
+{
+public:
+  vtkMaracasImageViewer2Callback() {} ;
+  ~vtkMaracasImageViewer2Callback() {} ;
+  static vtkMaracasImageViewer2Callback *New() {
+     return new vtkMaracasImageViewer2Callback(); 
+  }
+
+  virtual char const *GetClassName() const { return "vtkMaracasImageViewer2Callback";}
+  
+  void Execute(vtkObject *caller, 
+               unsigned long event, 
+               void *vtkNotUsed(callData))
+    {
+      if (this->IV->GetInput() == NULL)
+        {
+        return;
+        }
+
+      // Reset
+
+      if (event == vtkCommand::ResetWindowLevelEvent)
+        {
+        this->IV->GetInput()->UpdateInformation();
+        this->IV->GetInput()->SetUpdateExtent
+          (this->IV->GetInput()->GetWholeExtent());
+        this->IV->GetInput()->Update();
+        double *range = this->IV->GetInput()->GetScalarRange();
+        this->IV->SetColorWindow(range[1] - range[0]);
+        this->IV->SetColorLevel(0.5 * (range[1] + range[0]));
+        this->IV->Render();
+        return;
+        }
+
+      // Start
+
+      if (event == vtkCommand::StartWindowLevelEvent)
+        {
+        this->InitialWindow = this->IV->GetColorWindow();
+        this->InitialLevel = this->IV->GetColorLevel();
+        return;
+        }
+      
+      // Adjust the window level here
+
+      vtkInteractorStyleImage *isi = 
+        static_cast<vtkInteractorStyleImage *>(caller);
+
+      int *size = this->IV->GetRenderWindow()->GetSize();
+      double window = this->InitialWindow;
+      double level = this->InitialLevel;
+      
+      // Compute normalized delta
+
+      double dx = 4.0 * 
+        (isi->GetWindowLevelCurrentPosition()[0] - 
+         isi->GetWindowLevelStartPosition()[0]) / size[0];
+      double dy = 4.0 * 
+        (isi->GetWindowLevelStartPosition()[1] - 
+         isi->GetWindowLevelCurrentPosition()[1]) / size[1];
+      
+      // Scale by current values
+
+      if (fabs(window) > 0.01)
+        {
+        dx = dx * window;
+        }
+      else
+        {
+        dx = dx * (window < 0 ? -0.01 : 0.01);
+        }
+      if (fabs(level) > 0.01)
+        {
+        dy = dy * level;
+        }
+      else
+        {
+        dy = dy * (level < 0 ? -0.01 : 0.01);
+        }
+      
+      // Abs so that direction does not flip
+
+      if (window < 0.0) 
+        {
+        dx = -1*dx;
+        }
+      if (level < 0.0) 
+        {
+        dy = -1*dy;
+        }
+      
+      // Compute new window level
+
+      double newWindow = dx + window;
+      double newLevel;
+      newLevel = level - dy;
+      
+      // Stay away from zero and really
+
+      if (fabs(newWindow) < 0.01)
+        {
+        newWindow = 0.01*(newWindow < 0 ? -1 : 1);
+        }
+      if (fabs(newLevel) < 0.01)
+        {
+        newLevel = 0.01*(newLevel < 0 ? -1 : 1);
+        }
+      
+      this->IV->SetColorWindow(newWindow);
+      this->IV->SetColorLevel(newLevel);
+      this->IV->Render();
+    }
+  
+  vtkImageViewer2 *IV;
+  double InitialWindow;
+  double InitialLevel;
+};
+
+
+class vtkInteractorStyle2DMaracas : public vtkInteractorStyleImage{
+public:
+       vtkInteractorStyle2DMaracas();
+       ~vtkInteractorStyle2DMaracas();
+
+       virtual char const *GetClassName() const { return "vtkInteractorStyle2DMaracas";}
+       static vtkInteractorStyle2DMaracas *New(){
+                                       return new vtkInteractorStyle2DMaracas();
+                               }
+
+       virtual void  OnMouseMove () ;
+       virtual void  OnLeftButtonDown (); 
+       virtual void  OnLeftButtonUp () ;
+       virtual void  OnMiddleButtonDown (); 
+       virtual void  OnMiddleButtonUp () ;
+       virtual void  OnRightButtonDown () ;
+       virtual void  OnRightButtonUp () ;
+                       void  SetObserver( vtkCommand *obs );
+
+private:
+       vtkCommand *_obs;
+};
+
+
+//-----------------------------------------------------------------------------
+
+
+
+
+class wxVTKRenderWindowInteractorEditContour : public wxVTKRenderWindowInteractor{
+
+public:
+
+       wxVTKRenderWindowInteractorEditContour(wxWindow *parent,wxWindowID id); 
+       ~wxVTKRenderWindowInteractorEditContour(); 
+
+       virtual void OnButtonDown(wxMouseEvent &event);
+       virtual void OnButtonUp(wxMouseEvent &event);
+       virtual void OnButtonDouble(wxMouseEvent &event);
+    virtual void OnMotion(wxMouseEvent &event);
+       virtual void OnKeyDown(wxKeyEvent &event);
+
+                       void SetState(int state);
+                       int      GetState();
+                       void SetObserver(vtkCommand *obs);
+
+private:
+       int                      _state;
+       vtkCommand      *_obs;
+};
+
+
+#endif //_wxVTKRenderWindowInteractorEditContour_h_
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkBaseView.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkBaseView.cxx
new file mode 100644 (file)
index 0000000..a090ea2
--- /dev/null
@@ -0,0 +1,1737 @@
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderWindow.h>
+#include <vtkObjectFactory.h>
+#include <vtkCamera.h>
+#include <vtkProperty.h>
+#include <vtkActor.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkInteractorStyleSwitch.h>
+#include <vtkImageActor.h>
+#include <vtkTextProperty.h>
+#include <vtkImageMapToWindowLevelColors.h>
+
+#include "wxVtkBaseView.h"
+
+vtkStandardNewMacro(vtkInteractorStyleBaseView);
+vtkStandardNewMacro(vtkInteractorStyleBaseView2D);
+vtkStandardNewMacro(vtkInteractorStyleBaseView3D);
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+vtkImageViewer2_XYZ::vtkImageViewer2_XYZ()
+{
+       _vtkimageviewer2=  vtkImageViewer2::New();
+}
+//-------------------------------------------------------------------
+vtkImageViewer2_XYZ::~vtkImageViewer2_XYZ()
+{
+       _vtkimageviewer2->Delete();
+}
+//-------------------------------------------------------------------
+void vtkImageViewer2_XYZ::SetExtentDimension(int x1,int x2,
+                                                                                        int y1,int y2,
+                                                                                        int z1,int z2)
+{
+       _x1=x1;
+       _x2=x2;
+       _y1=y1;
+       _y2=y2;
+       _z1=z1;
+       _z2=z2;
+}
+//-------------------------------------------------------------------
+void vtkImageViewer2_XYZ::SetXSlice(int slice)
+{
+       vtkImageActor *imageActor = _vtkimageviewer2->GetImageActor();
+       imageActor->SetDisplayExtent(slice, slice, _y1, _y2, _z1, _z2 );  
+}
+//-------------------------------------------------------------------
+void vtkImageViewer2_XYZ::SetYSlice(int slice)
+{
+       vtkImageActor *imageActor = _vtkimageviewer2->GetImageActor();
+       imageActor->SetDisplayExtent(_x1, _x2, slice, slice, _z1, _z2 );  
+}
+//-------------------------------------------------------------------
+void vtkImageViewer2_XYZ::SetZSlice(int slice)
+{
+#if (VTK_MAJOR_VERSION >= 5)
+//             _vtkimageviewer2->SetSlice( slice );
+       vtkImageActor *imageActor = _vtkimageviewer2->GetImageActor();
+       imageActor->SetDisplayExtent(_x1, _x2, _y1, _y2, slice, slice );  
+#else
+               _vtkimageviewer2->SetZSlice( slice );
+#endif
+
+
+}
+//-------------------------------------------------------------------
+int vtkImageViewer2_XYZ::GetXSlice()
+{
+       vtkImageActor *imageActor = _vtkimageviewer2->GetImageActor();
+       return imageActor->GetDisplayExtent()[0];
+}
+//-------------------------------------------------------------------
+int vtkImageViewer2_XYZ::GetYSlice()
+{
+       vtkImageActor *imageActor = _vtkimageviewer2->GetImageActor();
+       return imageActor->GetDisplayExtent()[2];
+}
+//-------------------------------------------------------------------
+int vtkImageViewer2_XYZ::GetZSlice()
+{
+
+        int result;
+#if (VTK_MAJOR_VERSION >= 5)
+               result= _vtkimageviewer2->GetSlice( );
+#else
+               result= _vtkimageviewer2->GetZSlice( );
+#endif
+
+       
+       return result;
+}
+//-------------------------------------------------------------------
+vtkImageViewer2 *vtkImageViewer2_XYZ::GetVtkImageViewer2()
+{
+       return _vtkimageviewer2;
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+
+BEGIN_EVENT_TABLE( wxVTKRenderWindowInteractorPlus, wxVTKRenderWindowInteractor )
+    EVT_LEFT_DCLICK( wxVTKRenderWindowInteractorPlus::OnLeftDClick )
+    EVT_RIGHT_DCLICK( wxVTKRenderWindowInteractorPlus::OnRightDClick )
+    EVT_MIDDLE_DCLICK( wxVTKRenderWindowInteractorPlus::OnMiddleDClick )
+       EVT_MOUSEWHEEL( wxVTKRenderWindowInteractorPlus::OnMouseWheel )
+END_EVENT_TABLE( );
+
+//-------------------------------------------------------------------
+wxVTKRenderWindowInteractorPlus::wxVTKRenderWindowInteractorPlus() 
+: wxVTKRenderWindowInteractor()
+{
+}
+
+
+//-------------------------------------------------------------------
+wxVTKRenderWindowInteractorPlus::wxVTKRenderWindowInteractorPlus(wxWindow *parent, wxVtkBaseView *wxvtkbaseview)
+: wxVTKRenderWindowInteractor(parent, -1)
+{
+       _wxvtkbaseview = wxvtkbaseview;
+}
+
+//-------------------------------------------------------------------
+wxVTKRenderWindowInteractorPlus::~wxVTKRenderWindowInteractorPlus()
+{
+}
+
+//---------------------------------------------------------------------------
+wxVTKRenderWindowInteractorPlus * wxVTKRenderWindowInteractorPlus::New()
+{
+  // we don't make use of the objectfactory, because we're not registered
+  return new wxVTKRenderWindowInteractorPlus;
+}
+
+//-------------------------------------------------------------------
+void wxVTKRenderWindowInteractorPlus::OnLeftDClick( wxMouseEvent& event )
+{
+       _wxvtkbaseview->GetInteractorStyleBaseView()->OnLeftDClick();
+}
+//-------------------------------------------------------------------
+void wxVTKRenderWindowInteractorPlus::OnRightDClick( wxMouseEvent& event )
+{
+       _wxvtkbaseview->GetInteractorStyleBaseView()->OnRightDClick();
+}
+//-------------------------------------------------------------------
+void wxVTKRenderWindowInteractorPlus::OnMiddleDClick( wxMouseEvent& event )
+{
+       _wxvtkbaseview->GetInteractorStyleBaseView()->OnMiddleDClick();
+}
+//-------------------------------------------------------------------
+void wxVTKRenderWindowInteractorPlus::OnMouseWheel( wxMouseEvent& event )
+{
+       _wxvtkbaseview->GetInteractorStyleBaseView()->OnMouseWheel();
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+wxVtkBaseView::wxVtkBaseView()
+{
+       _parent                         = NULL;
+       _iren                           = NULL;
+       _interactorStyle        = NULL;
+}
+
+//-------------------------------------------------------------------
+
+wxVtkBaseView::wxVtkBaseView(wxWindow *parent)
+{
+       _parent                         = parent;
+       _iren                           = new wxVTKRenderWindowInteractorPlus(_parent,this);
+//     _iren->UseCaptureMouseOn();
+//     _iren                           = new wxVTKRenderWindowInteractor(_parent,-1);
+       _interactorStyle        = NULL;
+
+
+}
+
+//-------------------------------------------------------------------
+wxVtkBaseView::~wxVtkBaseView()
+{
+ //    _iren -> Delete();
+}
+//-------------------------------------------------------------------
+wxVTKRenderWindowInteractor* wxVtkBaseView::GetWxVTKRenderWindowInteractor()
+{
+   return _iren;
+}
+//-------------------------------------------------------------------
+void wxVtkBaseView::Configure()  // virtual 
+{
+}
+//-------------------------------------------------------------------
+void wxVtkBaseView::Refresh()  // virtual 
+{
+// EED 10 Oct 2007
+
+       #if defined(WIN32)
+               _iren->Refresh(false);
+       #else
+               _iren->Render();
+               //_iren->Refresh();
+       #endif
+
+}
+//-------------------------------------------------------------------
+void wxVtkBaseView::RefreshView()  // virtual 
+{
+// EED 10 Oct 2007
+
+       #if defined(WIN32)
+               GetRenWin()->Render();
+       #else
+               //GetRenWin()->Render();
+       #endif
+
+}
+//---------------------------------------------------------------------------
+vtkRenderer* wxVtkBaseView::GetRenderer()      // virtual 
+{
+       return NULL;
+}
+//---------------------------------------------------------------------------
+vtkRenderWindow* wxVtkBaseView::GetRenWin()            // virtual
+{
+       return _iren->GetRenderWindow();
+}
+
+//----------------------------------------------------------------------------
+
+void wxVtkBaseView::TransfromeCoordScreenToWorld(double &X, double &Y, double &Z, int type) // virtual
+{  
+       GetRenderer()->SetDisplayPoint((int)X, (int)Y, (int)Z);
+       GetRenderer()->DisplayToWorld();
+       double fP[4];
+       GetRenderer()->GetWorldPoint( fP );
+       if ( fP[3] ){
+               fP[0] /= fP[3];
+               fP[1] /= fP[3];
+               fP[2] /= fP[3];
+       }
+
+// EEDx5
+       this->GetInteractorStyleBaseView()->GetWxVtk2DBaseView()->TransformCoordinate_spacing_ViewToModel( fP[0] , fP[1] , fP[2] );
+
+       if (type!=0)
+       {
+               X=fP[0];
+       }
+       if (type!=1)
+       {
+               Y=fP[1];
+       }
+       if (type!=2)
+       {
+               Z=fP[2];
+       } 
+}
+
+//---------------------------------------------------------------------------
+
+vtkInteractorStyleBaseView*    wxVtkBaseView::GetInteractorStyleBaseView()
+{
+       return _interactorStyle;
+}
+
+//---------------------------------------------------------------------------
+
+void wxVtkBaseView::SetInteractorStyleBaseView( vtkInteractorStyleBaseView*    interactorStyle)
+{
+       _interactorStyle = interactorStyle;
+}
+
+//---------------------------------------------------------------------------
+
+void wxVtkBaseView::GetSpacing(double spc[3])  // virtual
+{
+       spc[0]=1;
+       spc[1]=1;
+       spc[2]=1;
+}
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+InteractorStyleMaracas::InteractorStyleMaracas()
+{
+       _active                                         = true;
+       _vtkInteractorStyleBaseView     = NULL;
+}
+//---------------------------------------------------------------------------
+InteractorStyleMaracas::~InteractorStyleMaracas()
+{
+}
+
+// ----------------------------------------------------------------------------
+InteractorStyleMaracas * InteractorStyleMaracas :: Clone()  // virtual 
+{
+       InteractorStyleMaracas * clone = new InteractorStyleMaracas();
+       CopyAttributesTo(clone);
+       return clone;
+}
+
+// ---------------------------------------------------------------------------
+
+void InteractorStyleMaracas::CopyAttributesTo( InteractorStyleMaracas * cloneObject)
+{
+       // Fathers object
+       //<FATHERCLASS>::CopyAttributesTo(cloneObject);
+
+       cloneObject->SetActive(  this->GetActive() );
+}
+
+
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnChar()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnMouseMove()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnLeftButtonDown()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnLeftButtonUp()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool  InteractorStyleMaracas::OnLeftDClick()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnMiddleButtonDown() 
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnMiddleButtonUp()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnMiddleDClick()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnRightButtonDown()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnRightButtonUp()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnRightDClick()
+{
+       return true;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::OnMouseWheel()
+{
+       return true;
+}
+
+//---------------------------------------------------------------------------
+void InteractorStyleMaracas::SetVtkInteractorStyleBaseView(vtkInteractorStyleBaseView* vtkInteractorStyleBaseView)
+{
+       _vtkInteractorStyleBaseView = vtkInteractorStyleBaseView;
+}
+
+//---------------------------------------------------------------------------
+void InteractorStyleMaracas::RemoveVtkInteractorStyleBaseView()
+{
+       _vtkInteractorStyleBaseView = NULL;
+}
+//---------------------------------------------------------------------------
+void InteractorStyleMaracas::SetActive(bool active)
+{
+       _active = active;
+}
+//---------------------------------------------------------------------------
+bool InteractorStyleMaracas::GetActive()
+{
+       return _active;
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+manualInteractorWindowLevel::manualInteractorWindowLevel()
+{
+       _stateWindowLevel       =       false;
+       _backPx                         =       0;
+       _backPy                         =       0;
+       _backWindow                     =       -1;
+       _backLevel                      =       -1;
+}
+
+//-------------------------------------------------------------------
+
+manualInteractorWindowLevel::~manualInteractorWindowLevel()
+{
+}
+
+//-------------------------------------------------------------------
+
+bool manualInteractorWindowLevel::OnMouseMove()                        // virtual 
+{
+
+       if (_stateWindowLevel==true)
+       {
+               int tmpPx,tmpPy;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition( tmpPx , tmpPy );
+               int colorWin=_backWindow - 2*( _backPx - tmpPx );
+               int colorLev=_backLevel  + 2*( _backPy - tmpPy );       
+
+               if (colorWin<0)
+               { 
+                       colorWin=0;
+               }
+               if (colorWin>100000)
+               { 
+                       colorWin=100000;
+               }       
+
+               if (colorLev<0)
+               { 
+                       colorLev=0;
+               }
+               if (colorLev>100000)
+               { 
+                       colorLev=100000;
+               }
+               vtkImageViewer2 *vtkimageviewer2;
+               vtkimageviewer2=_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->_imageViewer2XYZ->GetVtkImageViewer2();
+               vtkimageviewer2->SetColorWindow(colorWin);
+               vtkimageviewer2->SetColorLevel(colorLev);
+//             vtkimageviewer2->Render();
+       }
+       return true;
+}
+
+//-------------------------------------------------------------------
+
+bool manualInteractorWindowLevel::OnMiddleButtonDown() // virtual 
+{
+       if ((_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==0) &&
+               (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==0) ){
+
+               _stateWindowLevel       = true;
+               wxVTKRenderWindowInteractor *wxVTKiren;
+               wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+               wxVTKiren->GetEventPosition( _backPx , _backPy );
+
+               _backWindow = (int)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->_imageViewer2XYZ->GetVtkImageViewer2()->GetColorWindow());
+               _backLevel  = (int)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->_imageViewer2XYZ->GetVtkImageViewer2()->GetColorLevel());
+       }
+       return true;
+}
+
+//-------------------------------------------------------------------
+
+bool manualInteractorWindowLevel::OnMiddleButtonUp()           // virtual
+{
+       if (_stateWindowLevel==true)
+       {
+               _stateWindowLevel=false;
+       }
+       return true;
+}
+
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+vtkInteractorScrollZ::vtkInteractorScrollZ()
+{
+       _stateFordware=false;
+}
+//---------------------------------------------------------------------------
+vtkInteractorScrollZ::~vtkInteractorScrollZ()
+{
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorScrollZ::OnRightButtonDown()
+{    
+       vtkRenderWindowInteractor *interactor = _vtkInteractorStyleBaseView->GetInteractor();
+       if ((interactor->GetControlKey()==0) && (interactor->GetShiftKey()==0) ){
+               _stateFordware  = true;
+               _fordwareX      = interactor->GetEventPosition()[0];
+               _fordwareY      = interactor->GetEventPosition()[1];
+               _sliceZ         = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetActualSlice();
+       }
+       return true;
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorScrollZ::OnRightButtonUp() 
+{
+       _stateFordware=false;
+       return true;
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorScrollZ::OnMouseMove () 
+{
+       if (_stateFordware==true){
+           int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
+        int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
+               int delta = (_fordwareY - fy)/3;
+               _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->SetActualSlice( _sliceZ + delta);
+
+               this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
+
+       //      wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,12121);
+       //      _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent);
+
+               //_wxvtk2Dbaseview->Refresh();
+       } 
+       return true;
+}
+
+
+
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+vtkInteractorStyleBaseView::vtkInteractorStyleBaseView()
+{
+       _refresh_waiting                = false;
+       _parent_refresh_waiting = false;
+       _blockRefresh                   = false;
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyleBaseView::~vtkInteractorStyleBaseView()
+{
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnMouseMove() // virtual 
+{
+       CallLstInteractorStyleMaracas(3);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnLeftButtonDown()  // virtual 
+{
+       CallLstInteractorStyleMaracas(4);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnLeftButtonUp() // virtual 
+{
+       CallLstInteractorStyleMaracas(5);
+}
+
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnLeftDClick()  // virtual
+{
+       CallLstInteractorStyleMaracas( 11 );
+}
+
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnMiddleButtonDown()  // virtual 
+{
+       CallLstInteractorStyleMaracas(6);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnMiddleButtonUp() // virtual 
+{
+       CallLstInteractorStyleMaracas(7);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnMiddleDClick()  // virtual
+{
+       CallLstInteractorStyleMaracas( 13 );
+}
+
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnRightButtonDown() // virtual 
+{
+       CallLstInteractorStyleMaracas(1);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnRightButtonUp() // virtual 
+{
+       CallLstInteractorStyleMaracas(2);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnRightDClick()  // virtual
+{
+       CallLstInteractorStyleMaracas( 12 );
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::OnMouseWheel()  // virtual
+{
+       CallLstInteractorStyleMaracas( 14 );
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::AddInteractorStyleMaracas(InteractorStyleMaracas* interactorStyleMaracas)
+{
+       interactorStyleMaracas->SetVtkInteractorStyleBaseView(this);
+       _lstInteractorStyleMaracas.push_back(interactorStyleMaracas);
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView::RemoveInteractorStyleMaracas(InteractorStyleMaracas* interactorStyleMaracas)
+{
+       interactorStyleMaracas->RemoveVtkInteractorStyleBaseView();
+       int i, size = _lstInteractorStyleMaracas.size();
+       std::vector< InteractorStyleMaracas* >::iterator iter = _lstInteractorStyleMaracas.begin();
+       bool removed = false;
+       for (i=0; !removed && i<size; i++)
+       {
+               if ( _lstInteractorStyleMaracas[i] == interactorStyleMaracas )
+               {
+                       _lstInteractorStyleMaracas.erase(iter);
+                       removed = true;
+               }
+               iter++;
+       }               
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::InsertInteractorStyleMaracas(int pos, InteractorStyleMaracas* interactorStyleMaracas)
+{
+       interactorStyleMaracas->SetVtkInteractorStyleBaseView(this);
+       _lstInteractorStyleMaracas.insert(_lstInteractorStyleMaracas.begin()+pos,interactorStyleMaracas);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::CallLstInteractorStyleMaracas(int type)
+{
+
+       InteractorStyleMaracas *intStyMar;
+
+       int i,size=_lstInteractorStyleMaracas.size();
+
+//EED Borrame
+//FILE *ff = fopen("c:/temp/wxVtkBaseView_SceneManagerStadistics.txt","a+");
+//fprintf(ff,"EED vtkInteractorStyleBaseView::CallLstInteractorStyleMaracas \n" );
+//for (i=0;i<size;i++)
+//{
+//fprintf(ff,"    %p\n" , _lstInteractorStyleMaracas[i] );
+//}
+//fclose(ff);
+
+
+
+       for (i=0;i<size;i++)
+       {
+               intStyMar = _lstInteractorStyleMaracas[i];
+               if (intStyMar->GetActive()==true){
+                       if (type ==1)
+                       {  // OnRightButtonDown
+                               if (intStyMar->OnRightButtonDown()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type ==2)
+                       {  // OnRightButtonUp
+                               if (intStyMar->OnRightButtonUp()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==3)
+                       {  // OnMouseMouve
+                               if (intStyMar->OnMouseMove()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==4)
+                       {  // OnLeftButtonDown
+                               if (intStyMar->OnLeftButtonDown()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==5)
+                       {  // OnLeftButtonUp
+                               if (intStyMar->OnLeftButtonUp()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==6)
+                       {  // OnMiddleButtonDown
+                               if (intStyMar->OnMiddleButtonDown()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==7)
+                       {  // OnMiddleButtonUp
+                               if (intStyMar->OnMiddleButtonUp()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==10)
+                       {  // OnMiddleButtonUp
+                               if (intStyMar->OnChar()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==11)
+                       {  // OnLeftDClick
+                               if (intStyMar->OnLeftDClick()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==12)
+                       {  // OnRightDClick
+                               if (intStyMar->OnRightDClick()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==13)
+                       {  // OnMiddleDClick
+                               if (intStyMar-> OnMiddleDClick()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+                       if (type==14)
+                       {  // OnMouseWheel
+                               if (intStyMar->OnMouseWheel()==false)
+                               {
+                                       i=size;
+                               }
+                       }
+               } // if active
+       } // for
+
+       EvaluateToRefresh();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView::OnChar()  // virtual 
+{    
+//     char a=GetInteractor()->GetKeyCode();
+       CallLstInteractorStyleMaracas(10);
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::TransformCoordinate(double &X, double &Y, double &Z)
+{
+    vtkImageViewer2 *imageViewer = GetWxVtk2DBaseView()->_imageViewer2XYZ->GetVtkImageViewer2();
+
+       imageViewer->GetRenderer()->SetDisplayPoint((int)X, (int)Y, (int)Z);
+       imageViewer->GetRenderer()->DisplayToWorld();
+       double fP[4];
+       imageViewer->GetRenderer()->GetWorldPoint( fP );
+
+       if ( fP[3] ){
+               fP[0] /= fP[3];
+               fP[1] /= fP[3];
+               fP[2] /= fP[3];
+       }
+
+// EEDx5
+       GetWxVtk2DBaseView()->TransformCoordinate_spacing_ViewToModel(fP[0],fP[1],fP[2]);
+
+       X=fP[0];
+       Y=fP[1];
+       Z=fP[2];
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::SetwxVtkBaseView(wxVtkBaseView *wxvtkbaseview)
+{
+       _wxvtkbaseview = wxvtkbaseview;
+}
+//---------------------------------------------------------------------------
+wxVtk2DBaseView* vtkInteractorStyleBaseView::GetWxVtk2DBaseView()
+{
+       return (wxVtk2DBaseView*)_wxvtkbaseview;
+}
+//---------------------------------------------------------------------------
+wxVtk3DBaseView* vtkInteractorStyleBaseView::GetWxVtk3DBaseView()
+{
+       return (wxVtk3DBaseView*)_wxvtkbaseview;
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::SetActiveAllInteractors(bool ok)
+{
+       InteractorStyleMaracas *intStyMar;
+       int i,size=_lstInteractorStyleMaracas.size();
+       for (i=0;i<size;i++)
+       {
+               intStyMar = _lstInteractorStyleMaracas[i];
+               intStyMar->SetActive(ok);
+       }
+
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::SetRefresh_waiting()
+{
+       _refresh_waiting=true;
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorStyleBaseView::GetRefresh_waiting()
+{
+       return _refresh_waiting;
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::SetParent_refresh_waiting()
+{
+       _parent_refresh_waiting=true;
+}
+//---------------------------------------------------------------------------
+bool vtkInteractorStyleBaseView::GetParent_refresh_waiting()
+{
+       return _parent_refresh_waiting;
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::EvaluateToRefresh()
+{
+
+       if  ( _blockRefresh==false )
+       {
+               if ( (_refresh_waiting==true) && (_parent_refresh_waiting==false))
+               {
+                       _refresh_waiting                = false;
+                       this->_wxvtkbaseview->Refresh();
+               }
+               if (_parent_refresh_waiting==true)
+               {
+                       _parent_refresh_waiting = false;
+                       wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
+                       this->_wxvtkbaseview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::BlockRefresh()
+{
+       _blockRefresh=true;
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView::UnBlockRefresh()
+{
+       _blockRefresh=false;
+}
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+
+
+//---------------------------------------------------------------------------
+vtkInteractorStyleBaseView2D::vtkInteractorStyleBaseView2D()
+{
+       _manualinteractorwindowlevel= new manualInteractorWindowLevel();
+       AddInteractorStyleMaracas( _manualinteractorwindowlevel );
+
+       _vtkInteractorScrollZ = new vtkInteractorScrollZ();
+       AddInteractorStyleMaracas(_vtkInteractorScrollZ);
+       
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyleBaseView2D::~vtkInteractorStyleBaseView2D()
+{
+}
+
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView2D::OnRightButtonDown()  // virtual
+{    
+       vtkInteractorStyleBaseView::OnRightButtonDown();
+
+       if ((GetInteractor()->GetControlKey()==1) && (GetInteractor()->GetShiftKey()==0) ){
+               this->vtkInteractorStyleImage::OnRightButtonDown();
+       }
+
+}
+
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView2D::OnRightButtonUp()  // virtual
+{
+       vtkInteractorStyleBaseView::OnRightButtonUp();
+       this->vtkInteractorStyleImage::OnRightButtonUp();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView2D::OnMouseMove () // virtual
+{
+       vtkInteractorStyleBaseView::OnMouseMove();
+       this->vtkInteractorStyleImage::OnMouseMove();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView2D::OnLeftButtonDown() // virtual
+{
+       vtkInteractorStyleBaseView::OnLeftButtonDown();
+
+       if ((GetInteractor()->GetControlKey()==0) && (GetInteractor()->GetShiftKey()==1) )
+       {
+               this->vtkInteractorStyleImage::OnLeftButtonDown();
+       }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView2D::OnLeftButtonUp () // virtual
+{
+       vtkInteractorStyleBaseView::OnLeftButtonUp();
+
+       this->vtkInteractorStyleImage::OnLeftButtonUp();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView2D::OnMiddleButtonDown () // virtual
+{
+       vtkInteractorStyleBaseView::OnMiddleButtonDown();
+
+       if ((GetInteractor()->GetControlKey()==1) || (GetInteractor()->GetShiftKey()==1) )
+       {
+               this->vtkInteractorStyleImage::OnLeftButtonDown();
+       }
+}
+//---------------------------------------------------------------------------
+void vtkInteractorStyleBaseView2D::OnMiddleButtonUp () // virtual
+{
+       vtkInteractorStyleBaseView::OnMiddleButtonUp();
+
+       if ((GetInteractor()->GetControlKey()==1) || (GetInteractor()->GetShiftKey()==1) )
+       {
+               this->vtkInteractorStyleImage::OnLeftButtonUp();
+       }
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+vtkInteractorStyleBaseView3D::vtkInteractorStyleBaseView3D(){
+}
+//---------------------------------------------------------------------------
+vtkInteractorStyleBaseView3D::~vtkInteractorStyleBaseView3D(){
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnRightButtonDown ()
+{    
+       vtkInteractorStyleBaseView::OnRightButtonDown();
+
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnRightButtonDown();
+               }
+*/
+  this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], 
+                          this->Interactor->GetEventPosition()[1]);
+
+  if (this->CurrentRenderer == NULL)
+    {
+    return;
+    }
+
+  if (this->Interactor->GetControlKey()) {
+      this->StartDolly();
+  }
+
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnRightButtonUp () 
+{
+       vtkInteractorStyleBaseView::OnRightButtonUp();
+
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnRightButtonUp();
+               }
+*/
+
+               
+  switch (this->State) 
+    {
+    case VTKIS_DOLLY:
+      this->EndDolly();
+      break;
+    }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnMouseMove () 
+{
+       vtkInteractorStyleBaseView::OnMouseMove();
+
+//             this->vtkInteractorStyleTrackballCamera::OnMouseMove();
+
+  int x = this->Interactor->GetEventPosition()[0];
+  int y = this->Interactor->GetEventPosition()[1];
+
+
+  vtkRenderWindowInteractor *rwi = this->Interactor;
+
+  int lx =  rwi->GetLastEventPosition()[0];
+  int ly =  rwi->GetLastEventPosition()[1];
+  int dx = rwi->GetEventPosition()[0] ;
+  int dy = rwi->GetEventPosition()[1] ;
+
+
+  switch (this->State) 
+    {
+    case VTKIS_ROTATE:
+ //     this->FindPokedRenderer(x, y);
+      this->Rotate();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+
+    case VTKIS_PAN:
+ //     this->FindPokedRenderer(x, y);
+      this->Pan();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+
+    case VTKIS_DOLLY:
+ //     this->FindPokedRenderer(x, y);
+      this->Dolly();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+
+    case VTKIS_SPIN:
+ //     this->FindPokedRenderer(x, y);
+      this->Spin();
+ //     this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+      break;
+    }
+
+
+
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnLeftButtonDown ()
+{
+       vtkInteractorStyleBaseView::OnLeftButtonDown();
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
+               } else {
+                       this->vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
+               }
+*/
+
+
+  this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], 
+                          this->Interactor->GetEventPosition()[1]);
+  if (this->CurrentRenderer == NULL)
+    {
+    return;
+    }
+
+  if (this->Interactor->GetControlKey()) {
+      this->StartPan();
+  } else {
+      this->StartRotate();
+  }
+
+ /* 
+  if (this->Interactor->GetShiftKey()) 
+    {
+    if (this->Interactor->GetControlKey()) 
+      {
+      this->StartDolly();
+      }
+    else 
+      {
+      this->StartPan();
+      }
+    } 
+  else 
+    {
+    if (this->Interactor->GetControlKey()) 
+      {
+      this->StartSpin();
+      }
+    else 
+      {
+      this->StartRotate();
+      }
+    }
+*/
+
+
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnLeftButtonUp () 
+{
+       vtkInteractorStyleBaseView::OnLeftButtonUp();
+
+/*
+               if (GetInteractor()->GetControlKey()==1 ){
+                       this->vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
+               } else {
+                       this->vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
+               }
+*/
+  switch (this->State) 
+    {
+
+    case VTKIS_PAN:
+      this->EndPan();
+      break;
+
+    case VTKIS_ROTATE:
+      this->EndRotate();
+      break;
+    }
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnMiddleButtonDown () 
+{
+       vtkInteractorStyleBaseView::OnMiddleButtonDown();
+       //              this->vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
+}
+//---------------------------------------------------------------------------
+void  vtkInteractorStyleBaseView3D::OnMiddleButtonUp () 
+{
+       vtkInteractorStyleBaseView::OnMiddleButtonUp();
+
+       //              this->vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+vtkInfoTextImage::vtkInfoTextImage()
+{
+       _vtkText_WindowLevel    = NULL;
+       _vtkText_ColorLevel             = NULL;
+       _vtkText_position               = NULL;
+       _vtkText_pixelIntensity = NULL;
+       _marimagedata                   = NULL;
+}
+
+//-------------------------------------------------------------------
+
+vtkInfoTextImage::~vtkInfoTextImage()
+{
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::Configure()
+{
+       _vtkText_WindowLevel    = Create_Text_Label( 10 , 55 );
+       _vtkText_ColorLevel             = Create_Text_Label( 10 , 40 );
+       _vtkText_position               = Create_Text_Label( 10 , 25 );
+       _vtkText_pixelIntensity = Create_Text_Label( 10 , 10 );
+}
+
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::SetMarImageData(marImageData *marimagedata)
+{
+       _marimagedata=marimagedata;
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::SetWxVtk2DBaseView(wxVtk2DBaseView *wxvtk2Dbaseview)
+{
+       _wxvtk2Dbaseview=wxvtk2Dbaseview;
+}
+
+//-------------------------------------------------------------------
+
+vtkTextActor *vtkInfoTextImage::Create_Text_Label(int px, int py )
+{
+       // Text Window Level
+       vtkTextActor *textActor = vtkTextActor::New();
+       textActor->SetDisplayPosition(px, py);
+       textActor->SetInput("--");
+
+       // Set coordinates to match the old vtkScaledTextActor default value
+       textActor->GetPosition2Coordinate()->SetCoordinateSystemToNormalizedViewport();
+       textActor->GetPosition2Coordinate()->SetValue( 0.2 , 0.2 );
+
+       vtkTextProperty *tprop = textActor->GetTextProperty();
+       tprop->SetFontSize(14);
+       tprop->SetFontFamilyToArial();
+       tprop->SetColor(1, 1, 0);
+       _wxvtk2Dbaseview->GetRenderer()->AddActor2D(textActor);
+
+       return textActor;
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::PutWindowLevel()
+{
+       int value = (int)( _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->GetWindow() );
+       char zTzxt[20];
+       char resultText[50];
+
+       strcpy(resultText,"w:");
+
+
+       //ltoa ( (long)value , zTzxt , 10 );
+       sprintf(zTzxt,"%d",value);
+
+       strcat(resultText,zTzxt);
+       _vtkText_WindowLevel            -> SetInput(resultText);
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::PutColorLevel()
+{
+       int value = (int)(_wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->GetLevel());
+       char zTzxt[20];
+       char resultText[50];
+
+       strcpy(resultText,"c:");
+
+//     itoa (value,zTzxt,10);
+       sprintf(zTzxt,"%d",value);
+
+       strcat(resultText,zTzxt);
+       _vtkText_ColorLevel             -> SetInput(resultText);
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::PutPosition(int xx,int yy, int zz)
+{
+
+//EEDx7
+//     double spa[3];
+//     _imagedata->GetSpacing(spa);
+//     xx=xx*(1/spa[0]);
+//     yy=yy*(1/spa[1]);
+
+
+       char zTzxt[50];
+       char resultText[50];
+       strcpy(resultText,"p: ");
+//     itoa ((int)xx,zTzxt,10);
+       sprintf(zTzxt,"%d",xx);
+
+       strcat(resultText,zTzxt);
+       strcat(resultText," , ");
+
+//     itoa ((int)yy,zTzxt,10);
+       sprintf(zTzxt,"%d",yy);
+
+       strcat(resultText,zTzxt);
+       strcat(resultText," , ");
+
+//     itoa ((int)zz,zTzxt,10);
+       sprintf(zTzxt,"%d",zz);
+
+       strcat(resultText,zTzxt);
+
+
+       
+       int nX = _marimagedata->GetXOriginal(xx);
+       int nY = _marimagedata->GetYOriginal(yy);
+       int nZ = _marimagedata->GetZOriginal(zz);
+
+       strcat(resultText,"   (");
+//     ltoa ((int)nX,zTzxt,10);
+       sprintf(zTzxt,"%d",nX);
+
+       strcat(resultText,zTzxt);
+       strcat(resultText,",");
+
+//     ltoa ((int)nY,zTzxt,10);
+       sprintf(zTzxt,"%d",nY);
+
+       strcat(resultText,zTzxt);
+       strcat(resultText,",");
+
+//     ltoa ((int)nZ,zTzxt,10);
+       sprintf(zTzxt,"%d",nZ);
+
+       strcat(resultText,zTzxt);
+       strcat(resultText,")");
+
+
+
+
+       _vtkText_position               -> SetInput(resultText);
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImage::PutPixelIntensity(int xx, int yy, int zz)
+{
+
+//EEDx2
+       bool ok=true;
+
+       int dim[3];
+       double spa[3];
+       vtkImageData *imagedata = _marimagedata->GetImageData();
+       imagedata->GetDimensions(dim);
+       imagedata->GetSpacing(spa);
+
+// EEDx7
+//     xx=xx*(1/spa[0]);
+//     yy=yy*(1/spa[1]);
+//     zz=xx*spa[2];
+
+       if ( (xx<0) || (xx>=dim[0]) || (yy<0) || (yy>=dim[1]) || (zz<0) || (zz>=dim[2]) )
+       {
+               ok=false;
+       }
+
+       
+       char zTzxt[20];
+       char resultText[50];
+       strcpy(resultText,"NG: ");
+       if (ok==true) {
+               unsigned short *pOrg=(unsigned short*)imagedata->GetScalarPointer ((int)xx,(int)yy,(int)zz);
+//             itoa (*pOrg,zTzxt,10);
+               int tmp=*pOrg;
+               sprintf(zTzxt,"%d",tmp);
+
+       } else {
+               strcpy(zTzxt,"---");
+       }
+       strcat(resultText,zTzxt);
+       _vtkText_pixelIntensity -> SetInput(resultText);
+}
+
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+vtkInfoTextImageInteractor::vtkInfoTextImageInteractor()
+{
+}
+
+//-------------------------------------------------------------------
+vtkInfoTextImageInteractor::~vtkInfoTextImageInteractor()
+{
+}
+
+//-------------------------------------------------------------------
+
+void vtkInfoTextImageInteractor::SetModelVtkInfoTextImage(vtkInfoTextImage *vtkinfotextimage)
+{
+       _vtkinfotextimage       = vtkinfotextimage;
+}
+
+//-------------------------------------------------------------------
+bool vtkInfoTextImageInteractor::OnMouseMove()
+{
+       int X,Y;
+       wxVTKRenderWindowInteractor *wxVTKiren;
+       wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
+       wxVTKiren->GetEventPosition(X,Y);
+
+       int z = (int)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetVtkBaseData()->GetZ());
+       double xx=X,yy=Y,zz=z;
+       _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->TransfromeCoordScreenToWorld(xx,yy,zz);
+
+       GetVtkInfoTextImage()->PutWindowLevel();
+       GetVtkInfoTextImage()->PutColorLevel();
+       GetVtkInfoTextImage()->PutPosition( (int)xx , (int)yy , (int)zz );
+       GetVtkInfoTextImage()->PutPixelIntensity( (int)xx , (int)yy , (int)zz );
+
+       this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
+       return true;
+}
+
+//-------------------------------------------------------------------
+vtkInfoTextImage *vtkInfoTextImageInteractor::GetVtkInfoTextImage()
+{
+       return _vtkinfotextimage;
+}
+
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+wxVtk2DBaseView::wxVtk2DBaseView(wxWindow *parent)
+:wxVtkBaseView(parent)
+{
+       _imageViewer2XYZ        = NULL;
+       _vtkIinfoTextImage      = NULL;
+}
+
+//-------------------------------------------------------------------
+wxVtk2DBaseView::~wxVtk2DBaseView()
+{
+       if (_imageViewer2XYZ!=NULL) {
+               delete _imageViewer2XYZ; 
+       }
+
+       if (_imageViewer2XYZ!=NULL) {
+               delete _vtkIinfoTextImage; 
+       }
+
+}
+
+//-------------------------------------------------------------------
+void wxVtk2DBaseView::TransformCoordinate_spacing_ViewToModel(double &X,double &Y, double &Z) //       virtual 
+{
+//EEDx5
+       double spc[3];
+//     GetVtkBaseData()->GetImageData()->GetSpacing(spc);
+       this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
+
+       X = X / spc[0];
+       Y = Y / spc[1];
+       Z = Z / spc[2];
+
+}
+
+//-------------------------------------------------------------------
+void wxVtk2DBaseView::TransformCoordinate_spacing_ModelToView(double &X,double &Y, double &Z) //       virtual 
+{
+//EEDx5
+       double spc[3];
+//     GetVtkBaseData()->GetImageData()->GetSpacing(spc);
+       this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
+
+       X=X*spc[0];
+       Y=Y*spc[1];
+       Z=Z*spc[2];
+
+}
+
+//-------------------------------------------------------------------
+void wxVtk2DBaseView::ResetView()
+{
+       double spx,spy,spz;
+       int x1,x2,y1,y2,z1,z2;
+       wxVtkBaseView::Configure();
+       
+       wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
+       vtkImageData *imageData = GetVtkBaseData()->GetImageData();
+       imageData->UpdateInformation();
+       imageData->SetUpdateExtent( imageData->GetWholeExtent());
+       imageData->Update();
+
+       _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
+       imageData->GetSpacing (spx,spy,spz);
+       imageData->GetExtent (x1,x2,y1,y2,z1,z2);
+       _imageViewer2XYZ -> SetExtentDimension(x1,x2,y1,y2,z1,z2);
+       _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
+
+printf("EED wxVtk2DBaseView::ResetView podemos 01\n ");        
+       _imageViewer2XYZ->GetVtkImageViewer2()->Render();
+printf("EED wxVtk2DBaseView::ResetView podemos 02\n ");        
+
+       SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
+       
+}
+
+
+//-------------------------------------------------------------------
+void wxVtk2DBaseView::Configure(bool okimage)
+{
+       double spx,spy,spz;
+       int x1,x2,y1,y2,z1,z2;
+       wxVtkBaseView::Configure();
+
+// EED 17 Oct 2007
+                       if (_imageViewer2XYZ==NULL)
+                       {
+                               _imageViewer2XYZ = new vtkImageViewer2_XYZ();
+                               wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
+                               _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
+                               SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
+                       }
+
+
+       vtkImageData *imageData = GetVtkBaseData()->GetMarImageData()->GetImageData();
+       if (imageData!=NULL){
+               imageData->UpdateInformation();
+               imageData->SetUpdateExtent( imageData->GetWholeExtent());
+               imageData->Update();
+               if (okimage==true){
+                       imageData->GetSpacing (spx,spy,spz);
+                       imageData->GetExtent (x1,x2,y1,y2,z1,z2);
+
+
+                       _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
+                       _imageViewer2XYZ->SetExtentDimension(x1,x2,y1,y2,z1,z2);
+                       double range[2];
+                         imageData->GetScalarRange(range);
+                         if (range[1]<20000){
+                                _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( (range[1]-range[0])/2 );
+                                _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( (range[1]+range[0])/4 );
+                         } else {
+                                _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( 1000 );
+                                _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( 500 );
+                         }
+// EED 31 Janvier 2007
+//vtkImageActor *vtkimageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor ();
+//vtkimageactor->InterpolateOff ();
+//vtkLookupTable * _collookup = vtkLookupTable::New( );
+//_collookup->SetNumberOfColors( 256 );
+//_collookup->SetTableRange( 0 , 255 );
+//_collookup->Build( );
+//_collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
+//_collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
+//_collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
+//_imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel ()->SetLookupTable(_collookup );
+
+
+// EED 17 Oct 2007
+//                     SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
+
+
+                       vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2();
+                       vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera();
+                       camera->SetViewUp               ( spx*0                 , -spy*1                        , spz*0         );
+                       camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , -spz*10000    ); 
+                       camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         ); 
+                       camera->SetClippingRange( 0.01                  , 1000000 );
+                       camera->ComputeViewPlaneNormal();
+                       camera->SetParallelScale( spx*(x2-x1)/3.0 );
+
+                       // text information over the graphic window
+                       _vtkIinfoTextImage                              = new vtkInfoTextImage();
+                       _vtkIinfoTextImageInteractor    = new vtkInfoTextImageInteractor();
+                       _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
+                       _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
+                       _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);     
+                       _vtkIinfoTextImage->Configure();
+                       this->GetInteractorStyleBaseView()->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
+               } // okimage
+       } // imageData
+
+}
+
+//-------------------------------------------------------------------
+
+int    wxVtk2DBaseView::GetActualSlice()  // virtual 
+{
+       return (int)(_vtkbasedata->GetZ());
+}
+
+//-------------------------------------------------------------------
+void wxVtk2DBaseView::SetActualSlice(int slice)  // Virtual
+{
+       _vtkbasedata->SetZ(slice);
+}
+
+//-------------------------------------------------------------------
+
+vtkBaseData *wxVtk2DBaseView::GetVtkBaseData()
+{
+       return _vtkbasedata;
+}
+
+//-------------------------------------------------------------------
+
+void wxVtk2DBaseView::SetVtkBaseData(vtkBaseData *vtkbasedata)
+{
+       _vtkbasedata=vtkbasedata;
+}
+
+//-------------------------------------------------------------------
+
+void wxVtk2DBaseView::Refresh()
+{
+       int z = (int)(GetVtkBaseData()->GetZ());
+       _imageViewer2XYZ->SetZSlice( z ); 
+
+       wxVtkBaseView::Refresh();
+}
+
+//-------------------------------------------------------------------
+
+void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
+{
+       SetInteractorStyleBaseView(interactorstylebaseview);
+
+       wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
+       interactorstylebaseview->SetInteractor ( iren );
+       iren->SetInteractorStyle(interactorstylebaseview);
+       interactorstylebaseview->SetwxVtkBaseView(this);        
+
+       vtkMaracasImageViewer2Callback *cbk = vtkMaracasImageViewer2Callback::New();
+       cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
+       interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
+       interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
+       interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
+       cbk->Delete();
+}
+
+//---------------------------------------------------------------------------
+vtkRenderer* wxVtk2DBaseView::GetRenderer()    // virtual 
+{
+       return  _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
+}
+//---------------------------------------------------------------------------
+vtkRenderWindow* wxVtk2DBaseView::GetRenWin()          // virtual
+{
+       return  _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
+}
+
+//-------------------------------------------------------------------
+
+void wxVtk2DBaseView::GetSpacing(double spc[3])  // virtual
+{
+       vtkImageData *imageData = GetVtkBaseData()->GetImageData();
+       imageData->GetSpacing(spc);
+}
+
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+//-------------------------------------------------------------------
+
+
+
+
+wxVtk3DBaseView::wxVtk3DBaseView(wxWindow *parent)
+:wxVtkBaseView( parent )
+{
+       _configure      = false;
+       _aRenderer      = NULL;
+       _renWin         = NULL;
+       _aCamera        = NULL;
+}
+//-------------------------------------------------------------------
+wxVtk3DBaseView::~wxVtk3DBaseView()
+{
+       if (_aCamera!=NULL)             { _aCamera              -> Delete(); }
+       if (_aRenderer!=NULL)   { _aRenderer    -> Delete(); }
+       if (_renWin!=NULL)              { _renWin               -> Delete(); }
+}
+//-------------------------------------------------------------------
+vtkCamera* wxVtk3DBaseView::GetCamera()
+{
+       return _aCamera;
+}
+//-------------------------------------------------------------------
+vtkRenderer* wxVtk3DBaseView::GetRenderer()  // virtual
+{
+       return _aRenderer;
+}
+//-------------------------------------------------------------------
+vtkRenderWindow* wxVtk3DBaseView::GetRenWin()  // virtual
+{
+       return _renWin;
+}
+//-------------------------------------------------------------------
+void wxVtk3DBaseView::Refresh()
+{
+//     _renWin->Render();
+       vtkRenderWindowInteractor *vri = GetWxVTKRenderWindowInteractor();
+       vri->vtkRenderWindowInteractor::Render();
+}
+//-------------------------------------------------------------------
+void wxVtk3DBaseView::Configure()
+{
+       if (_configure==false)
+       {
+               _configure=true;
+               wxVtkBaseView::Configure();
+               _aRenderer      = vtkRenderer::New();
+               _renWin         = vtkRenderWindow::New();
+               _renWin->AddRenderer(_aRenderer);
+
+
+//       _renWin->SetStereoCapableWindow(1);
+// //      //renderwindow->SetStereoTypeToCrystalEyes();  
+//       _renWin->SetStereoTypeToRedBlue();
+//       _renWin->SetStereoRender(1);
+
+               GetWxVTKRenderWindowInteractor()->SetRenderWindow(_renWin);
+
+
+// EED Borrame
+//             vtkInteractorStyle3DMaracas *interactorStyle3DMaracas = vtkInteractorStyle3DMaracas::New(); 
+               vtkInteractorStyleBaseView3D *interactorStyleBaseView3D = vtkInteractorStyleBaseView3D::New(); 
+
+               SetInteractorStyleBaseView( interactorStyleBaseView3D );
+               interactorStyleBaseView3D->SetInteractor (  GetWxVTKRenderWindowInteractor() );
+               GetWxVTKRenderWindowInteractor()->SetInteractorStyle( interactorStyleBaseView3D );
+               interactorStyleBaseView3D->SetwxVtkBaseView(this);      
+
+
+/* EED Borrame
+  vtkInteractorStyleSwitch *iss = dynamic_cast<vtkInteractorStyleSwitch*>(_iren->GetInteractorStyle());
+  iss->SetCurrentStyleToTrackballCamera();
+*/
+
+               // It is convenient to create an initial view of the data. The
+               // FocalPoint and Position form a vector direction. Later on
+               // (ResetCamera() method) this vector is used to position the camera
+               // to look at the data in this direction.
+               _aCamera = vtkCamera::New();
+               _aCamera->SetViewUp (0, 0, -1);
+               _aCamera->SetPosition (0, 1, 0);
+               _aCamera->SetFocalPoint (0, 0, 0);
+               _aCamera->ComputeViewPlaneNormal();
+       }
+}
+//-------------------------------------------------------------------
+//EED 27 sep 2006
+void wxVtk3DBaseView::GetSpacing(double spc[3])
+{
+       spc[0]=1;
+       spc[1]=1;
+       spc[2]=1;
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkBaseView.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkBaseView.h
new file mode 100644 (file)
index 0000000..cc9046c
--- /dev/null
@@ -0,0 +1,449 @@
+
+
+#ifndef __WX_VTK__BASE__VIEW__H
+#define __WX_VTK__BASE__VIEW__H
+
+
+
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkCamera.h>
+#include <vtkTextActor.h>
+
+//EEDxx include
+#include <vtkProperty.h>
+#include <vtkActor.h>
+
+
+#include <vtkImageViewer2.h> 
+#include <vtkInteractorStyleImage.h> 
+
+#include "wxMPRBaseData.h"
+#include "wxVTKRenderWindowInteractorEditContour.h"
+
+#include <wx/wx.h>
+
+
+
+#include <vector>
+#include "marTypes.h"
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class  MARACASVISULIB_EXPORTS vtkImageViewer2_XYZ{
+public:
+       vtkImageViewer2_XYZ();
+       ~vtkImageViewer2_XYZ();
+
+       void                    SetExtentDimension(int x1,int x2, int y1,int y2, int z1,int z2);
+       void                    SetXSlice(int slice);
+       void                    SetYSlice(int slice);
+       void                    SetZSlice(int slice);
+       int                             GetXSlice();
+       int                             GetYSlice();
+       int                             GetZSlice();
+       vtkImageViewer2 *GetVtkImageViewer2();
+
+private:
+       int     _x1,_x2,_y1,_y2,_z1,_z2;
+       vtkImageViewer2 *_vtkimageviewer2;
+protected:     
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxVtkBaseView;
+
+class MARACASVISULIB_EXPORTS wxVTKRenderWindowInteractorPlus : public wxVTKRenderWindowInteractor
+{
+public:
+       wxVTKRenderWindowInteractorPlus(wxWindow *parent ,wxVtkBaseView *_wxvtkbaseview);
+       ~wxVTKRenderWindowInteractorPlus();
+
+       wxVTKRenderWindowInteractorPlus();
+        void OnLeftDClick( wxMouseEvent& event );   
+        void OnRightDClick( wxMouseEvent& event );   
+        void OnMiddleDClick( wxMouseEvent& event );   
+        void OnMouseWheel( wxMouseEvent& event );
+
+
+ // VTK
+    static wxVTKRenderWindowInteractorPlus * New();
+
+protected:
+private:
+       wxVtkBaseView   *_wxvtkbaseview;
+  DECLARE_EVENT_TABLE( );
+
+
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+class vtkInteractorStyleBaseView;
+
+
+class MARACASVISULIB_EXPORTS wxVtkBaseView{
+public:
+       wxVtkBaseView( );
+       wxVtkBaseView( wxWindow *parent );
+       ~wxVtkBaseView();
+       wxVTKRenderWindowInteractor             *GetWxVTKRenderWindowInteractor();
+       virtual void                                    Configure();
+       virtual void                                    Refresh();
+       virtual void                                    RefreshView();
+       virtual vtkRenderer*                    GetRenderer();
+       virtual vtkRenderWindow*                GetRenWin();
+       virtual void                                    TransfromeCoordScreenToWorld(double &X, double &Y, double &Z, int type=2);
+       void                                                    SetInteractorStyleBaseView( vtkInteractorStyleBaseView* interactorStyle);
+       vtkInteractorStyleBaseView*             GetInteractorStyleBaseView();
+       virtual void                                    GetSpacing(double spc[3]);
+
+private:
+       wxWindow                                                *_parent;
+       wxVTKRenderWindowInteractor             *_iren;
+       vtkInteractorStyleBaseView              *_interactorStyle;
+protected:
+
+};
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInteractorStyleBaseView;
+class manualInteractorWindowLevel;
+class vtkInfoTextImage;
+class vtkInfoTextImageInteractor;
+
+//------------------------------------------------------------------
+
+
+class MARACASVISULIB_EXPORTS wxVtk2DBaseView: public wxVtkBaseView{
+public:
+       wxVtk2DBaseView(wxWindow *parent);
+       ~wxVtk2DBaseView();
+       virtual void                    Configure(bool okimage=true);
+       vtkImageViewer2_XYZ*    _imageViewer2XYZ;
+       vtkBaseData*                    GetVtkBaseData();
+       void                                    SetVtkBaseData(vtkBaseData *vtkbasedata);
+       virtual void                    Refresh();
+       virtual void                    ResetView();
+       virtual int                             GetActualSlice();
+       virtual void                    SetActualSlice(int slice);
+                       void                    SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview);
+
+       virtual vtkRenderer*            GetRenderer();
+       virtual vtkRenderWindow*        GetRenWin();
+       virtual void                    TransformCoordinate_spacing_ViewToModel(double &X,double &Y, double &Z);
+       virtual void                    TransformCoordinate_spacing_ModelToView(double &X,double &Y, double &Z);
+       virtual void                    GetSpacing(double spc[3]);
+
+
+private:
+       vtkBaseData                                                     *_vtkbasedata;
+
+       vtkInfoTextImage                                        *_vtkIinfoTextImage;
+       vtkInfoTextImageInteractor                      *_vtkIinfoTextImageInteractor;
+
+protected:
+
+};
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS InteractorStyleMaracas 
+{
+public:
+       InteractorStyleMaracas();
+       ~InteractorStyleMaracas();
+
+       virtual InteractorStyleMaracas * Clone();
+       void CopyAttributesTo( InteractorStyleMaracas *cloneObject );
+
+
+       virtual bool  OnChar();
+       virtual bool  OnMouseMove();
+       virtual bool  OnLeftButtonDown(); 
+       virtual bool  OnLeftButtonUp();
+       virtual bool  OnMiddleButtonDown(); 
+       virtual bool  OnMiddleButtonUp();
+       virtual bool  OnRightButtonDown();
+       virtual bool  OnRightButtonUp();
+
+       virtual bool  OnLeftDClick();
+       virtual bool  OnRightDClick();   
+       virtual bool  OnMiddleDClick();  
+       virtual bool  OnMouseWheel();    
+
+
+                       void  SetVtkInteractorStyleBaseView(vtkInteractorStyleBaseView* _vtkInteractorStyleBaseView);
+                       void  RemoveVtkInteractorStyleBaseView();
+       void SetActive(bool active);
+       bool GetActive();
+
+protected:
+       vtkInteractorStyleBaseView* _vtkInteractorStyleBaseView;
+private:
+       bool                                            _active;
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+
+
+class MARACASVISULIB_EXPORTS manualInteractorWindowLevel : public InteractorStyleMaracas {
+public:
+       manualInteractorWindowLevel();
+       ~manualInteractorWindowLevel();
+protected:
+
+       bool    _stateWindowLevel;
+       int             _backPx;
+       int             _backPy;
+       int             _backWindow;
+       int             _backLevel;
+
+       virtual bool  OnMouseMove();
+       virtual bool  OnMiddleButtonDown(); 
+       virtual bool  OnMiddleButtonUp();
+};
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInfoTextImage{
+public:
+       vtkInfoTextImage();
+       ~vtkInfoTextImage();
+       void SetWxVtk2DBaseView(wxVtk2DBaseView *wxvtk2Dbaseview);
+       void SetMarImageData(marImageData *marimagedata);
+       void Configure();
+       void PutPixelIntensity(int x, int y, int z);
+       void PutPosition(int x, int y, int z);
+       void PutColorLevel();
+       void PutWindowLevel();
+
+
+protected:
+private:
+
+       marImageData    *_marimagedata;
+       wxVtk2DBaseView *_wxvtk2Dbaseview;
+       vtkTextActor    *_vtkText_WindowLevel;
+       vtkTextActor    *_vtkText_ColorLevel;
+       vtkTextActor    *_vtkText_position;
+       vtkTextActor    *_vtkText_pixelIntensity;
+
+       vtkTextActor    *Create_Text_Label(int px, int py);
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInfoTextImageInteractor : public InteractorStyleMaracas{
+public:
+       vtkInfoTextImageInteractor();
+       ~vtkInfoTextImageInteractor();
+       void SetModelVtkInfoTextImage(vtkInfoTextImage *vtkinfotextimage);
+       vtkInfoTextImage *GetVtkInfoTextImage();
+
+protected:
+
+       virtual bool  OnMouseMove();
+
+private:
+       vtkInfoTextImage        *_vtkinfotextimage; 
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class vtkInteractorScrollZ : public InteractorStyleMaracas {
+public:
+       vtkInteractorScrollZ();
+       ~vtkInteractorScrollZ();
+
+       virtual bool  OnMouseMove();
+       virtual bool  OnRightButtonDown();
+       virtual bool  OnRightButtonUp();
+
+
+
+protected:
+               bool                    _stateFordware;
+           int                         _fordwareX;
+        int                            _fordwareY;
+               int                             _sliceZ;
+
+private:
+
+};
+
+
+
+
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class wxVtk3DBaseView;
+
+class MARACASVISULIB_EXPORTS vtkInteractorStyleBaseView : public vtkInteractorStyleImage{
+public:
+       vtkInteractorStyleBaseView();
+       ~vtkInteractorStyleBaseView();
+       static vtkInteractorStyleBaseView *New();
+       virtual void  OnChar();
+       virtual void  OnMouseMove();
+       virtual void  OnLeftButtonDown(); 
+       virtual void  OnLeftButtonUp();
+       virtual void  OnMiddleButtonDown(); 
+       virtual void  OnMiddleButtonUp();
+       virtual void  OnRightButtonDown();
+       virtual void  OnRightButtonUp();
+
+       virtual void  OnLeftDClick();
+       virtual void  OnRightDClick();
+       virtual void  OnMiddleDClick();
+       virtual void  OnMouseWheel();
+
+       virtual void  TransformCoordinate(double &X, double &Y, double &Z);
+                       void  AddInteractorStyleMaracas(InteractorStyleMaracas* interactorStyleMaracas);
+                       void  RemoveInteractorStyleMaracas(InteractorStyleMaracas* interactorStyleMaracas);
+                       void  InsertInteractorStyleMaracas(int pos, InteractorStyleMaracas* interactorStyleMaracas);
+                       void  CallLstInteractorStyleMaracas(int type);
+
+       wxVtk2DBaseView         *GetWxVtk2DBaseView();
+       wxVtk3DBaseView         *GetWxVtk3DBaseView();
+                       void            SetwxVtkBaseView(wxVtkBaseView *wxvtkbaseview);
+                       void            SetActiveAllInteractors(bool ok);
+
+                       void            SetRefresh_waiting();
+                       void            SetParent_refresh_waiting();
+
+                       bool            GetRefresh_waiting();
+                       bool            GetParent_refresh_waiting();
+
+
+                       void            EvaluateToRefresh();
+                       void            BlockRefresh();
+                       void            UnBlockRefresh();
+
+protected:
+               std::vector< InteractorStyleMaracas* >  _lstInteractorStyleMaracas;
+
+private:
+       bool                            _blockRefresh;
+       bool                            _refresh_waiting;
+       bool                            _parent_refresh_waiting;
+       wxVtkBaseView           *_wxvtkbaseview;
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS vtkInteractorStyleBaseView2D : public vtkInteractorStyleBaseView{
+public:
+       vtkInteractorStyleBaseView2D();
+       ~vtkInteractorStyleBaseView2D();
+       static vtkInteractorStyleBaseView2D *New();
+       virtual void  OnMouseMove();
+       virtual void  OnLeftButtonDown(); 
+       virtual void  OnLeftButtonUp();
+       virtual void  OnMiddleButtonDown(); 
+       virtual void  OnMiddleButtonUp();
+       virtual void  OnRightButtonDown();
+       virtual void  OnRightButtonUp();
+
+
+protected:
+
+private:
+       manualInteractorWindowLevel             *_manualinteractorwindowlevel;
+       vtkInteractorScrollZ                    *_vtkInteractorScrollZ;
+
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS vtkInteractorStyleBaseView3D : public vtkInteractorStyleBaseView {
+public:
+       vtkInteractorStyleBaseView3D();
+       ~vtkInteractorStyleBaseView3D();
+       static vtkInteractorStyleBaseView3D *New();
+
+       virtual void  OnMouseMove () ;
+       virtual void  OnLeftButtonDown (); 
+       virtual void  OnLeftButtonUp () ;
+       virtual void  OnMiddleButtonDown (); 
+       virtual void  OnMiddleButtonUp () ;
+       virtual void  OnRightButtonDown () ;
+       virtual void  OnRightButtonUp () ;
+
+private:
+
+};
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+class MARACASVISULIB_EXPORTS wxVtk3DBaseView: public wxVtkBaseView{
+public:
+       wxVtk3DBaseView( wxWindow *parent );
+       ~wxVtk3DBaseView();
+       vtkCamera*                      GetCamera();
+       virtual vtkRenderer*            GetRenderer();
+       virtual vtkRenderWindow*        GetRenWin();
+       void                            Refresh();
+       void                            Configure();
+       virtual void            GetSpacing(double spc[3]);
+
+private:
+       bool                            _configure;
+       vtkRenderer                     *_aRenderer;
+       vtkRenderWindow         *_renWin;
+       vtkCamera                       *_aCamera;
+protected:
+};
+
+
+
+#endif // __WX_VTK__BASE__VIEW__H
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxILPDwithImage.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxILPDwithImage.cxx
new file mode 100644 (file)
index 0000000..e375775
--- /dev/null
@@ -0,0 +1,452 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxILPDwithImage.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include "wxILPDwithImage.h"
+
+
+#include "ILPD/src/controlerInterface/ILPDViewListPatient.h"
+#include "ILPD/src/wxInterface/ILPDViewWxWindow.h"
+
+#include <gdcm.h> 
+#include <gdcmFile.h> 
+#include "vtkGdcmReader.h"
+
+#include "marImageData.h"
+#include "marGdcmDicom.h"
+
+#include <vtkImageData.h>
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxILPDwithImage , wxPanel)
+      EVT_MENU(20001, wxILPDwithImage::OnSelectPatientStudySerieImage)
+END_EVENT_TABLE()
+
+
+//----------------------------------------------------------------------------
+
+wxILPDwithImage::wxILPDwithImage(wxWindow *parent)
+       : wxPanel(parent, -1)
+{
+
+       _wxvtk2Dbaseview                        = NULL;
+       _vtkbasedata                            = NULL; 
+
+
+       wxPanel *panel=this; 
+       panel->SetAutoLayout(true);
+
+
+       wxBoxSizer                      *topsizer                                       = new wxBoxSizer(wxVERTICAL  );
+    _pnlSplitter_ViewImage_wxILPD                                      = new wxSplitterWindow( panel , -1);
+    _wxILPD                                                                                    = new wxILPD( _pnlSplitter_ViewImage_wxILPD );
+       ILPDViewListPatient*    _ilpdViewListPatient    = new ILPDViewListPatient( new ILPDViewWxWindow(_wxILPD) );
+       wxPanel                                 *viewPanel                              = CreatePanel_ViewImagePanel_WxILPD( _pnlSplitter_ViewImage_wxILPD );
+
+       topsizer -> Add( _pnlSplitter_ViewImage_wxILPD ,1,wxGROW  ,0);
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+       GetSize(&ww,&hh);
+
+//EEDxx2.4
+//     pnlSplitter                     -> SplitHorizontally( viewPanel , _wxILPD, (int)(hh*0.45) );
+       _pnlSplitter_ViewImage_wxILPD                   -> SplitVertically(   _wxILPD , viewPanel,300);
+       _pnlSplitter_ViewImage_wxILPD           -> SetMinimumPaneSize( 10 );
+
+//EEDxx2.4
+//     panel->FitInside();
+
+
+       panel->SetSizer( topsizer );      // use the sizer for layout
+       panel->Layout(); 
+
+}
+
+//----------------------------------------------------------------------------
+wxILPDwithImage::~wxILPDwithImage()
+{
+       if (_vtkbasedata!=NULL)         {       delete  _vtkbasedata;           }
+    if (_wxvtk2Dbaseview!=NULL)        {       delete  _wxvtk2Dbaseview;       }
+}
+
+//----------------------------------------------------------------------------
+wxPanel *wxILPDwithImage::CreatePanel_ViewImagePanel_WxILPD( wxWindow *parent )
+{
+       wxPanel *panel =new wxPanel( parent, -1 ); 
+
+       wxBoxSizer                                              *topsizer               = new wxBoxSizer(wxHORIZONTAL  );
+                                _pnlSplitter_Image_DicomList           = new wxSplitterWindow( panel , -1);
+
+       _panelImage                                                     = new wxPanel(_pnlSplitter_Image_DicomList,-1);
+       _panelImage->SetBackgroundColour( wxColour(0,0,0) );
+       wxBoxSizer *sizer                                       = new wxBoxSizer(wxHORIZONTAL  );
+//     _panelImage->SetAutoLayout(true);
+       _panelImage->SetSizer( sizer );      // use the sizer for layout
+//     _panelImage->Layout(); 
+//     _panelImage->FitInside();
+
+       int ww,hh;
+       wxWindow *pp=this;
+       while (pp->GetParent()!=NULL) pp=pp->GetParent();
+       pp->GetSize(&ww,&hh);
+
+
+       _dicomPanelListView                     =       new wxListView( _pnlSplitter_Image_DicomList, -1  );
+       _pnlSplitter_Image_DicomList->SetMinimumPaneSize( 200 );
+
+//EEDxx2.4
+//     pnlSplitter                     -> SplitVertically( _panelImage, _dicomPanelListView, (int)(ww*0.45) );
+       _pnlSplitter_Image_DicomList                    -> SplitHorizontally( _panelImage, _dicomPanelListView, 300);
+
+       topsizer                        -> Add( _pnlSplitter_Image_DicomList ,1,wxGROW  ,0);
+
+       panel->SetAutoLayout(true);
+       panel->SetSizer( topsizer );      // use the sizer for layout
+       panel->Layout(); 
+
+//EEDxx2.4
+//     panel->FitInside();
+
+
+       return panel;
+}
+
+
+//----------------------------------------------------------------------------
+
+void wxILPDwithImage::SelectedSerie()
+{
+       if (_wxILPD->GetTypeOfSelection() == 3)
+       {
+               vector <string*> lstStringFileName;
+               _wxILPD->GetLstImageFiles(&lstStringFileName);
+
+//EED 4 oct 2006
+//             marGdcmDicomILPD *margdcmdicomILPD = (marGdcmDicomILPD*)_mar->_dicom;
+//             margdcmdicomILPD->SetListImages( &lstStringFileName );
+
+               if (_backStringFirstFile==*(lstStringFileName[0]))
+               {
+//EED 14Avril2008 OJO
+//                     _noteBook->SetPageImage(1, 4);
+               } else {
+//EED 14Avril2008 OJO
+//                     _noteBook->SetPageImage(1, 3);
+               }
+
+               // Show Image
+               int i,sizeLstNameFiles=lstStringFileName.size();
+               i=sizeLstNameFiles/2;
+
+               ShowDicomImage( lstStringFileName[i] );
+
+               // Show Number of Images
+               _dicomPanelListView->InsertColumn(0, _T("Number of Images")              , wxLIST_FORMAT_LEFT, 100);
+               wxString text;
+               text.Printf(_T("%d"),sizeLstNameFiles);
+               SetItem(_dicomPanelListView,0,0, text );
+
+
+       } else {
+//EED 14Avril2008 OJO
+//             _noteBook->SetPageImage(1, 5);
+       }
+
+}
+
+//----------------------------------------------------------------------------
+
+void wxILPDwithImage::ShowDicomInformation(string *fileImageName)
+{
+
+
+       GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New();
+       gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_ALL);
+       gdcmFile->SetFileName( fileImageName->c_str() );
+       bool ok = gdcmFile->Load();
+
+       // Filling lines
+       if (gdcmFile->IsEmpty()==true)
+       {
+               _dicomPanelListView->InsertColumn(0, _T("Error")        , wxLIST_FORMAT_LEFT, 80);
+               SetItem(_dicomPanelListView,0,0, _T("File not found...") );
+       } else {
+
+               // Creating Columns
+               _dicomPanelListView->InsertColumn(0, _T("Tag")          , wxLIST_FORMAT_LEFT, 80);
+               _dicomPanelListView->InsertColumn(1, _T("VR")           , wxLIST_FORMAT_LEFT, 40);
+               _dicomPanelListView->InsertColumn(2, _T("Name")         , wxLIST_FORMAT_LEFT, 150);
+               _dicomPanelListView->InsertColumn(3, _T("Value")        , wxLIST_FORMAT_LEFT, 400);
+
+
+
+               int line=0;
+               GDCM_NAME_SPACE::DataEntry *entry;
+               entry = (GDCM_NAME_SPACE::DataEntry*)gdcmFile->GetFirstEntry();
+               while (entry!=NULL)
+               {
+                       string groupelem = GDCM_NAME_SPACE::Util::Format("%04x | %04x" , entry->GetGroup() , entry->GetElement());
+                       SetItem(_dicomPanelListView,line,0, wxString(groupelem.c_str(), wxConvUTF8) );
+
+                       string vr =entry->GetVR().str();
+                       SetItem(_dicomPanelListView,line,1, wxString(vr.c_str(), wxConvUTF8) );
+                       SetItem(_dicomPanelListView,line,2, wxString(entry->GetName().c_str(), wxConvUTF8) );
+
+                       if (entry->GetBinArea())
+                       {
+                               // Print Value
+                               string value;
+                               if( vr == "US" || vr == "SS" || vr == "UL" || vr == "SL" ||  vr == "FL"  ||  vr == "FD")
+                               {
+                                       value   = entry->GetString();
+                               } else  {
+                                       value   =  GDCM_NAME_SPACE::Util::CreateCleanString( entry->GetBinArea(),entry->GetLength()  );
+                               }
+                               value = "[" + value + "]" ;
+                               SetItem(_dicomPanelListView,line,3, wxString(value.c_str(), wxConvUTF8) );
+                       } else {
+                               SetItem(_dicomPanelListView,line,3, _T("-  NOT LOADED  -") );
+                       }
+                       entry = (GDCM_NAME_SPACE::DataEntry*)gdcmFile->GetNextEntry();
+                       line++;
+               } // while
+       } //IsEmpty
+       gdcmFile->Delete();
+}
+
+//----------------------------------------------------------------------------
+
+void wxILPDwithImage::ShowDicomImage(string *fileImageName)
+{
+
+       bool            reconfigure=false;
+       double          colorwindow;
+       double          colorlevel;
+
+
+       FILE *ff = fopen( fileImageName->c_str(),"r");
+       if (ff==NULL)
+       {
+//             string msgText= "File not found: \n\n";
+//             msgText.append(fileImageName->c_str());
+//             wxMessageDialog msgBox(this, msgText.c_str(),"Read file ERROR", wxOK );
+//             msgBox.ShowModal();
+       } else {
+               fclose(ff);
+               if (_wxvtk2Dbaseview!=NULL)
+               {
+                       reconfigure=true;
+                       colorwindow = _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->GetColorWindow();
+                       colorlevel      = _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->GetColorLevel();
+               }
+
+
+               // Read header file
+               GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New();
+               gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_NOSHADOW);
+               gdcmFile->SetFileName( fileImageName->c_str() );
+               bool ok = gdcmFile->Load();
+               long int offset = gdcmFile->GetPixelOffset(); 
+               int dim[3];
+               dim[0]=gdcmFile->GetXSize();
+               dim[1]=gdcmFile->GetYSize();
+               dim[2]=1; 
+
+
+               // Memory allocation
+               vtkImageData *imageData =       vtkImageData::New();
+               imageData->SetDimensions ( dim );
+               imageData->SetScalarTypeToUnsignedShort();
+               imageData->AllocateScalars();    
+               imageData->Update();  
+
+               marImageData *marimagedata = new marImageData(imageData);
+               
+               // Read Image
+               marGdcmDicom margdcmdicom;
+               void *p_vol = imageData->GetScalarPointer(0,0,0);
+               margdcmdicom.loadFileDicom( p_vol , dim , (char *)fileImageName->c_str() );
+
+// EED 17 Oct 2007 Before
+//             if ( _wxvtk2Dbaseview   )       { delete _wxvtk2Dbaseview;      } 
+//             _wxvtk2Dbaseview        = new wxVtk2DBaseView( _panelImage );
+
+
+// EED 17 Oct 2007 After
+               if ( _wxvtk2Dbaseview==NULL     )       
+               { 
+                       _wxvtk2Dbaseview        = new wxVtk2DBaseView( _panelImage );
+                       wxVTKRenderWindowInteractor *imagePanel = _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor();       
+                       wxSizer *sizer=_panelImage->GetSizer();
+                       sizer-> Add( imagePanel ,1,wxGROW  ,0);
+                       _panelImage->SetAutoLayout(true);
+                       _panelImage->Layout();  
+               } 
+
+
+               if ( _vtkbasedata               )       { delete _vtkbasedata;          } 
+//             if ( _widgetMesure              )       { delete _widgetMesure;         } 
+
+
+//_widgetMesure                                = new wxWidgetMesure2D(_panelImage);
+
+//_wxvtk2Dbaseview                     = new wxVtk2DBaseView( _widgetMesure );
+
+
+
+               _vtkbasedata            = new vtkBaseData(); 
+               _vtkbasedata->SetMarImageData( marimagedata );
+               _wxvtk2Dbaseview->SetVtkBaseData( _vtkbasedata );
+               _wxvtk2Dbaseview->Configure(true);
+
+//_widgetMesure->ConfigureA(_wxvtk2Dbaseview);
+//_widgetMesure        ->      SetMesureScale( gdcmFile->GetXSpacing() );
+
+               gdcmFile->Delete();
+               
+//sizer-> Add( _widgetMesure ,1,wxGROW  ,0);
+
+
+               _wxvtk2Dbaseview->Refresh();
+
+               if (reconfigure==true)
+               {
+                       _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( colorwindow );
+                       _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( colorlevel );
+               }
+
+       }
+
+}
+
+
+//----------------------------------------------------------------------------
+void wxILPDwithImage::ResetwxListView()
+{
+       // Reset wxListView
+       _dicomPanelListView->DeleteAllItems();
+       int i,size=_dicomPanelListView->GetColumnCount();
+       for (i=0;i<size;i++)
+       {
+               _dicomPanelListView->DeleteColumn(0);
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxILPDwithImage::SelectedImage()
+{
+       if (_wxILPD->GetTypeOfSelection() == 4)
+       {
+               string fileImageName;
+               _wxILPD->GetFileImageName( &fileImageName );
+               ShowDicomInformation( &fileImageName );
+               ShowDicomImage(&fileImageName);
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxILPDwithImage::SelectedPatient()
+{
+       if (_wxILPD->GetTypeOfSelection() == 1)
+       {
+               _dicomPanelListView->InsertColumn(0, _T("Number of Series")              , wxLIST_FORMAT_LEFT, 80);
+               int numberOfSeries = _wxILPD->GetNumberOfSeries();
+               wxString text;
+               text.Printf(_T("%d"),numberOfSeries);
+               SetItem(_dicomPanelListView,0,0, text );
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxILPDwithImage::OnSelectPatientStudySerieImage(wxCommandEvent& event)
+{
+       ResetwxListView();
+       SelectedPatient();
+
+       SelectedSerie();
+       SelectedImage();
+
+       // Reset Image if there is no selection
+       if ((_wxILPD->GetTypeOfSelection() == 4) || (_wxILPD->GetTypeOfSelection() == 3))
+       {
+       } else {
+               if (_vtkbasedata)               
+               { 
+                       delete _vtkbasedata;     
+                       _vtkbasedata=NULL;
+               } 
+               if (_wxvtk2Dbaseview)   
+               { 
+//                     delete _wxvtk2Dbaseview; 
+//                     _wxvtk2Dbaseview=NULL;
+               } 
+       }
+}
+
+
+//----------------------------------------------------------------------------
+void wxILPDwithImage::SetItem( wxListView *wxlistview, int line, int col, wxString text )  
+{
+       if (wxlistview->GetItemCount() <= line)
+       {
+               wxlistview->InsertItem(line,_T(" "),1);
+       } 
+       wxListItem item;
+       item.m_itemId = line;
+       item.SetTextColour(*wxBLACK);
+       item.SetFont(*wxNORMAL_FONT);   // or wxNORMAL_FONT, wxSMALL_FONT, wxSWISS_FONT
+       item.SetBackgroundColour(wxColour(255,255,255));
+       wxlistview->SetItem( item );
+       wxlistview->SetItem(line,col,text);
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+
+wxILPD *wxILPDwithImage::GetWxILPD()
+{
+       return _wxILPD;
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void wxILPDwithImage::Configure()
+{
+       _pnlSplitter_ViewImage_wxILPD   -> SetSashPosition(850);
+       _pnlSplitter_Image_DicomList    -> SetSashPosition(400);
+}
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxILPDwithImage.h b/lib/maracasVisuLib/src/interface/wxWindows/wxILPDwithImage.h
new file mode 100644 (file)
index 0000000..a0a4b5b
--- /dev/null
@@ -0,0 +1,63 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxILPDwithImage.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__ILPD__WITH__IMAGE__HXX__
+#define __WX__ILPD__WITH__IMAGE__HXX__
+
+#include <wx/wx.h>
+#include <string>   // pour std::string
+
+#include "widgets/wxMPRWidget.h"
+
+using namespace std;
+#include "ILPD/src/wxInterface/wxILPD.h"
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+class wxILPDwithImage: public wxPanel
+{
+public:
+    wxILPDwithImage(wxWindow *parent);
+    ~wxILPDwithImage();
+       wxPanel *CreatePanel_ViewImagePanel_WxILPD( wxWindow *parent );
+       void    OnSelectPatientStudySerieImage(wxCommandEvent& event);
+       void    Configure();
+
+       wxILPD  *GetWxILPD();
+       DECLARE_EVENT_TABLE();
+private:
+       string                                  _backStringFirstFile;
+       string                                  _backStringFirstFile2;
+       wxILPD                                  *_wxILPD;
+       wxListView                              *_dicomPanelListView;
+       wxVtk2DBaseView                 *_wxvtk2Dbaseview;
+       vtkBaseData                             *_vtkbasedata; 
+       wxPanel                                 *_panelImage;
+       wxSplitterWindow                *_pnlSplitter_ViewImage_wxILPD;
+       wxSplitterWindow                *_pnlSplitter_Image_DicomList;
+       void    SetItem( wxListView *wxlistview, int line, int col, wxString text ) ;
+       void    ResetwxListView();
+       void    SelectedPatient();
+       void    SelectedSerie();
+       void    SelectedImage();
+       void    ShowDicomInformation(string *fileImageName);
+       void    ShowDicomImage(string *fileImageName);
+};
+
+#endif // __WX__ILPD__WITH__IMAGE__HXX__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas3DBrowser.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas3DBrowser.cxx
new file mode 100644 (file)
index 0000000..46e3e49
--- /dev/null
@@ -0,0 +1,76 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas3DBrowser.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracas3DBrowser.h"
+//#include <Crtdbg.h>
+
+
+wxMaracas3DBrowser::wxMaracas3DBrowser( wxWindow* parent, marInterface* mar, wxWindowID id , int id_toolbar_plans  )
+    : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL )
+{
+    _mar = mar;
+
+    _3DSurf = new wxSurfaceWidget( this, -1 );
+       _3DSurf->SetId_toolbar_plans(id_toolbar_plans);
+
+    wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+    szTop->Add( _3DSurf, 1, wxEXPAND | wxALL, 0 );
+
+    this->SetAutoLayout( true );
+    this->SetSizer( szTop );
+
+//    szTop->Fit( this );
+    szTop->SetSizeHints( this );
+
+}
+//----------------------------------------------------------------------------
+void wxMaracas3DBrowser::LoadData( ){
+    _3DSurf->ShowMARACASData( _mar );
+}
+//----------------------------------------------------------------------------
+int wxMaracas3DBrowser::GetIsovalue(){
+       int result=0;
+       if (_3DSurf!=NULL){
+               result=_3DSurf->GetIsovalue();
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+int wxMaracas3DBrowser::GetOpacity(){
+       int result=0;
+       if (_3DSurf!=NULL){
+               result=_3DSurf->GetOpacity();
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+void wxMaracas3DBrowser::RegenerateAll(bool all){
+       if (_3DSurf!=NULL){
+               _3DSurf->Clean3D();
+               if (all==true){
+                       _mar->_experiment->RegenerateAxis();
+               } else {
+                       _mar->_experiment->RecalculateAxis();
+               }
+               _3DSurf->AddAxisActors();       
+               _3DSurf->RefreshAxis(); 
+       }
+}
+//----------------------------------------------------------------------------
+
+// EOF - wxMaracas3DBrowser.cxx
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas3DBrowser.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas3DBrowser.h
new file mode 100644 (file)
index 0000000..64fa208
--- /dev/null
@@ -0,0 +1,48 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas3DBrowser.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__3D__BROWSER__
+#define __WX__3D__BROWSER__
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+#include "widgets/wxSurfaceWidget.h"
+
+#include <kernel/marInterface.h>
+
+/**
+ * \brief panel class containing the 3D widget
+ */
+class wxMaracas3DBrowser : public wxPanel
+{
+public:
+    wxMaracas3DBrowser( wxWindow* parent, marInterface* mar, wxWindowID id = -1, int id_toolbar_plans=-1  );
+    void       LoadData();
+       void    RegenerateAll(bool all=true);
+
+
+
+       int             GetIsovalue();
+       int             GetOpacity();
+private:
+
+    wxSurfaceWidget    *_3DSurf;
+    marInterface       *_mar;
+
+};
+
+#endif // __WX__3D__BROWSER__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp.cxx
new file mode 100644 (file)
index 0000000..ac6979e
--- /dev/null
@@ -0,0 +1,1180 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxMaracasApp.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:09 $
+ Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+/*!
+ \mainpage wxMaracas version wxWindows
+
+ \section intro Introduction
+
+ This is the introduction. 
+
+
+
+
+
+
+
+  \dot
+
+
+digraph example_0 {
+       rankdir=LR
+       graph [ ratio=fill];
+    node [shape=record, fontname=Helvetica, fontsize=10];
+
+       ___wxMaracasFrame03                     [ label="wxMaracasFrame03"      URL="\ref wxMaracasFrame03"];
+       ___wxMaracasApp02                       [ label="wxMaracasApp02"        URL="\ref wxMaracasApp02"];
+       __wxMaracasFrame02                      [ label="wxMaracasFrame02"      URL="\ref wxMaracasFrame02"];
+       __wxMaracasApp02                        [ label="wxMaracasApp02"        URL="\ref wxMaracasApp02"];
+       _wxMaracasFrame                         [ label="wxMaracasFrame"        URL="\ref wxMaracasFrame"];
+       _wxMaracasApp                           [ label="wxMaracasApp"          URL="\ref wxMaracasApp"];
+
+       _wxMaracas3DBrowser                     [ label="wxMaracas3DBrowser"                    URL="\ref wxMaracas3DBrowser"];
+       _wxMaracasQuantification        [ label="wxMaracasQuantification"               URL="\ref wxMaracasQuantification"];
+
+
+       __wxMaracasDataBrowser          [ label="wxMaracasDataBrowser"                  URL="\ref wxMaracasDataBrowser"];
+       __wxMaracasImageBrowser         [ label="wxMaracasImageBrowser"                 URL="\ref wxMaracasImageBrowser"];
+       __wxMaracasImageBrowser02       [ label="wxMaracasImageBrowser02"               URL="\ref wxMaracasImageBrowser02" ];
+       __wxMaracas3DBrowser            [ label="wxMaracas3DBrowser"                    URL="\ref wxMaracas3DBrowser"];
+       __wxMaracasQuantification       [ label="wxMaracasQuantification"               URL="\ref wxMaracasQuantification"];
+       __wxMaracasQuantificationCT     [ label="wxMaracasQuantificationCT"             URL="\ref wxMaracasQuantificationCT"];
+       __wxMaracasMPR                          [ label="wxMaracasMPR"                                  URL="\ref wxMaracasMPR"];
+       __wxMaracasProcessingCT         [ label="wxMaracasProcessingCT"                 URL="\ref wxMaracasProcessingCT"];
+       __wxMaracasEmptyPanel           [ label="wxMaracasEmptyPanel"                   URL="\ref wxMaracasEmptyPanel"];
+       __wxMaracasEmptyPanel_2         [ label="wxMaracasEmptyPanel_2"                 URL="\ref wxMaracasEmptyPanel_2"];
+       __wxSurfaceSTLWidget            [ label="wxSurfaceSTLWidget"                    URL="\ref wxSurfaceSTLWidget"];
+       __wxILPD                                        [ label="wxILPD"                                                URL="\ref wxILPD"];
+
+
+       _wxMaracasApp           -> _wxMaracasFrame                      
+       _wxMaracasFrame         -> _wxMaracas3DBrowser          
+       _wxMaracasFrame         -> _wxMaracasQuantification 
+
+       __wxMaracasApp02        -> __wxMaracasFrame02           
+       __wxMaracasFrame02      -> __wxMaracasDataBrowser       
+       __wxMaracasFrame02      -> __wxMaracasImageBrowser      
+       __wxMaracasFrame02      -> __wxMaracasImageBrowser02 
+       __wxMaracasFrame02      -> __wxMaracas3DBrowser 
+       __wxMaracasFrame02      -> __wxMaracasQuantification
+       __wxMaracasFrame02      -> __wxMaracasQuantificationCT 
+       __wxMaracasFrame02      -> __wxMaracasMPR       
+       __wxMaracasFrame02      -> __wxMaracasProcessingCT 
+       __wxMaracasFrame02      -> __wxMaracasEmptyPanel
+       __wxMaracasFrame02      -> __wxMaracasEmptyPanel_2
+       __wxMaracasFrame02      -> __wxSurfaceSTLWidget 
+       __wxMaracasFrame02      -> __wxILPD 
+
+
+       ___wxMaracasImageBrowser02      [ label="wxMaracasImageBrowser02"               URL="\ref wxMaracasImageBrowser02"];
+       ___wxMaracas3DBrowser           [ label="wxMaracas3DBrowser"                    URL="\ref wxMaracas3DBrowser"];
+       ___wxMaracasQuantification      [ label="wxMaracasQuantification"               URL="\ref wxMaracasQuantification"];
+       ___wxMaracasQuantificationCT[ label="wxMaracasQuantificationCT"         URL="\ref wxMaracasQuantificationCT"];
+       ___wxMaracasMPR                         [ label="wxMaracasMPR"                                  URL="\ref wxMaracasMPR"];
+       ___wxMaracasProcessingCT        [ label="wxMaracasProcessingCT"                 URL="\ref wxMaracasProcessingCT"];
+       ___wxMaracasEmptyPanel_2        [ label="wxMaracasEmptyPanel_2"                 URL="\ref wxMaracasEmptyPanel_2"];
+       ___wxSurfaceSTLWidget           [ label="wxSurfaceSTLWidget"                    URL="\ref wxSurfaceSTLWidget"];
+       ___wxILPDwithImage                      [ label="wxILPDwithImage"                               URL="\ref wxILPDwithImage"];
+       ___wxMaracasEmptyPanel_3        [ label="wxMaracasEmptyPanel_3"                 URL="\ref wxMaracasEmptyPanel_3"];
+
+
+       ___wxMaracasNoteBookPatientLstVoi                       [ label="wxMaracasNoteBookPatientLstVoi"                        URL="\ref wxMaracasNoteBookPatientLstVoi"];
+       ___wxMaracasNoteBookCTQuantification            [ label="wxMaracasNoteBookCTQuantification"                     URL="\ref wxMaracasNoteBookCTQuantification"];
+       ___wxMaracasNoteBookIRMQuantification           [ label="wxMaracasNoteBookIRMQuantification"            URL="\ref wxMaracasNoteBookIRMQuantification"];
+       ___wxMaracasNoteBookSTLFormat                           [ label="wxMaracasNoteBookSTLFormat"                            URL="\ref wxMaracasNoteBookSTLFormat"];
+       ___wxMaracasNoteBookTests                                       [ label="wxMaracasNoteBookTests"                                        URL="\ref wxMaracasNoteBookTests"];
+       ___wxMaracasNoteBookVascularTreeExtraction      [ label="wxMaracasNoteBookVascularTreeExtraction"       URL="\ref wxMaracasNoteBookVascularTreeExtraction"];
+
+
+       ___wxMaracasApp02       -> ___wxMaracasFrame03          
+       ___wxMaracasFrame03     -> ___wxMaracasNoteBookPatientLstVoi            
+       ___wxMaracasFrame03     -> ___wxMaracasNoteBookCTQuantification                 
+       ___wxMaracasFrame03     -> ___wxMaracasNoteBookIRMQuantification                
+       ___wxMaracasFrame03     -> ___wxMaracasNoteBookSTLFormat                
+       ___wxMaracasFrame03     -> ___wxMaracasNoteBookTests            
+       ___wxMaracasFrame03     -> ___wxMaracasNoteBookVascularTreeExtraction           
+
+
+
+       ___wxMaracasNoteBookPatientLstVoi                       -> ___wxILPDwithImage
+       ___wxMaracasNoteBookPatientLstVoi                       -> ___wxMaracasImageBrowser02
+       ___wxMaracasNoteBookPatientLstVoi                       -> ___wxMaracasMPR
+
+       ___wxMaracasNoteBookCTQuantification            -> ___wxMaracasMPR
+       ___wxMaracasNoteBookCTQuantification            -> ___wxMaracasProcessingCT
+       ___wxMaracasNoteBookCTQuantification            -> ___wxMaracasQuantificationCT
+
+       ___wxMaracasNoteBookIRMQuantification           -> ___wxMaracas3DBrowser
+       ___wxMaracasNoteBookIRMQuantification           -> ___wxMaracasQuantification
+
+       ___wxMaracasNoteBookSTLFormat                           -> ___wxMaracas3DBrowser
+       ___wxMaracasNoteBookSTLFormat                           -> ___wxSurfaceSTLWidget
+
+       ___wxMaracasNoteBookTests                                       -> ___wxMaracasEmptyPanel_3
+
+       ___wxMaracasNoteBookVascularTreeExtraction      -> ___wxMaracasEmptyPanel_2
+
+}
+
+\enddot
+
+
+
+
+
+
+
+
+
+\dot
+
+digraph example {
+       graph [ ratio=fill];
+    node [shape=record, fontname=Helvetica, fontsize=10];
+
+       subgraph subgraph_App {
+               rank = same;
+               _wxMaracasApp                   [ label="wxMaracasApp"                          URL="\ref wxMaracasApp"];
+    _wxMaracasApp02                    [ label="wxMaracasApp02"                        URL="\ref wxMaracasApp02"];
+       }
+       subgraph subgraph_Frame {
+               rank = same;
+               _wxMaracasFrame                 [ label="wxMaracasFrame"                        URL="\ref wxMaracasFrame"];
+               _wxMaracasFrame02               [ label="wxMaracasFrame02"                      URL="\ref wxMaracasFrame02"];
+               _wxMaracasFrame03               [ label="wxMaracasFrame03"                      URL="\ref wxMaracasFrame03"];
+       }
+
+       subgraph cluster_000 {
+               label = "Interface Pages"
+               style=filled;
+               color=lightgrey;
+               rank = same;
+               _wxMaracasNoteBookPatientLstVoi                 [ label="wxMaracasNoteBookPatientLstVoi"                        URL="\ref wxMaracasNoteBookPatientLstVoi"];
+               _wxMaracasNoteBookCTQuantification              [ label="wxMaracasNoteBookCTQuantification"                     URL="\ref wxMaracasNoteBookCTQuantification"];
+               _wxMaracasNoteBookIRMQuantification             [ label="wxMaracasNoteBookIRMQuantification"            URL="\ref wxMaracasNoteBookIRMQuantification"];
+               _wxMaracasNoteBookSTLFormat                             [ label="wxMaracasNoteBookSTLFormat"                            URL="\ref wxMaracasNoteBookSTLFormat"];
+               _wxMaracasNoteBookTests                                 [ label="wxMaracasNoteBookTests"                                        URL="\ref wxMaracasNoteBookTests"];
+               _wxMaracasNoteBookVascularTreeExtraction[ label="wxMaracasNoteBookVascularTreeExtraction"       URL="\ref wxMaracasNoteBookVascularTreeExtraction"];
+               _wxMaracasNoteBookManualRegistration    [ label="wxMaracasNoteBookManualRegistration"           URL="\ref wxMaracasNoteBookManualRegistration"];
+       }
+
+       subgraph cluster_PersistanceConfiguration {
+               label = "Persistance Configuration"
+               style=filled;
+               color=lightgrey;
+               rank = same;
+               _wxReadWriteConf                                                [ label="wxReadWriteConf"                       URL="\ref wxReadWriteConf"];
+               _FileInformationModel                                   [ label="FileInformationModel"          URL="\ref FileInformationModel"];
+               _FileInfoNode                                                   [ label="FileInfoNode"                          URL="\ref FileInfoNode"];
+
+
+       }
+
+       subgraph cluster_001 {
+               style=filled;
+               color=lightgrey;
+               rank = same;
+               _wxMaracasDataBrowser           [ label="wxMaracasDataBrowser"                  URL="\ref wxMaracasDataBrowser"];
+               _wxMaracasImageBrowser          [ label="wxMaracasImageBrowser"                 URL="\ref wxMaracasImageBrowser"];
+               _wxMaracasImageBrowser02        [ label="wxMaracasImageBrowser02"               URL="\ref wxMaracasImageBrowser02"];
+               _wxMaracas3DBrowser                     [ label="wxMaracas3DBrowser"                    URL="\ref wxMaracas3DBrowser"];
+               _wxMaracasQuantification        [ label="wxMaracasQuantification"               URL="\ref wxMaracasQuantification"];
+               _wxMaracasMPR                           [ label="wxMaracasMPR"                                  URL="\ref wxMaracasMPR"];
+               _wxMaracasEmptyPanel            [ label="wxMaracasEmptyPanel"                   URL="\ref wxMaracasEmptyPanel"];
+               _wxMaracasEmptyPanel_2          [ label="wxMaracasEmptyPanel_2"                 URL="\ref wxMaracasEmptyPanel_2"];
+               _wxMaracasEmptyPanel_3          [ label="wxMaracasEmptyPanel_3"                 URL="\ref wxMaracasEmptyPanel_3"];
+               _wxILPDwithImage                        [ label="wxILPDwithImage"                               URL="\ref wxILPDwithImage"];
+
+               subgraph cluster_00STL {
+                       rank=same;
+                       _wxSurfaceSTLWidget                     [ label="wxSurfaceSTLWidget"                    URL="\ref wxSurfaceSTLWidget"];
+                       _wxSTLWidget_02                         [ label="wxSTLWidget_02"                                URL="\ref wxSTLWidget_02"];
+                       _wxSTLWidget_03                         [ label="wxSTLWidget_03"                                URL="\ref wxSTLWidget_03"];
+               }
+
+               _wxMaracas_ManualTree_MPR       [ label="wxMaracas_ManualTree_MPR"              URL="\ref wxMaracas_ManualTree_MPR"];
+
+               _wxManualRegistration3D         [ label="wxManualRegistration3D"                URL="\ref wxManualRegistration3D"];
+       
+               subgraph cluster_00NN {
+                       rank=same;
+                       _wxMaracasQuantificationCT      [ label="wxMaracasQuantificationCT"             URL="\ref wxMaracasQuantificationCT"];
+                       _wxMaracasProcessingCT          [ label="wxMaracasProcessingCT"                 URL="\ref wxMaracasProcessingCT"];
+               }
+
+       }
+
+
+       subgraph cluster_Widgets {
+               label = "Imprtant Widgets";
+               style=filled;
+               color=lightgrey;
+               _wxProcessingCTWidget       [ label="wxProcessingCTWidget"              URL="\ref wxProcessingCTWidget" fillcolor=yellow style=filled];
+               _wxEmptyPanelWidget                     [ label="wxEmptyPanelWidget"            URL="\ref wxEmptyPanelWidget"];
+               _wxEmptyPanelWidget_2       [ label="wxEmptyPanelWidget_2"              URL="\ref wxEmptyPanelWidget_2"];
+               _wxManualTree_MPRWidget     [ label="wxManualTree_MPRWidget"    URL="\ref wxManualTree_MPRWidget"];
+               _wxQuantificationWidget         [ label="wxQuantificationWidget"                        URL="\ref wxQuantificationWidget"];
+               _wxQuantificationWidgetCT       [ label="wxQuantificationWidgetCT"                      URL="\ref wxQuantificationWidgetCT"  fillcolor=yellow style=filled];
+               _vtk3DSurfaceSTLWidget          [ label="vtk3DSurfaceSTLWidget"         URL="\ref vtk3DSurfaceSTLWidget"];
+       }
+
+       _wxSurfaceWidget                                                [ label="wxSurfaceWidget"                       URL="\ref wxSurfaceWidget"];
+       _wxVTKRenderWindowInteractor                    [ label=" wxVTKRenderWindowInteractor"  URL="\ref wxVTKRenderWindowInteractor"];
+       _wxVTKRenderWindowInteractorEditContour [ label=" wxVTKRenderWindowInteractorEditContour"       URL="\ref wxVTKRenderWindowInteractorEditContour"];
+       _vtk3DSurfaceWidget                                             [ label="vtk3DSurfaceWidget"            URL="\ref vtk3DSurfaceWidget"];
+       _InterfaceVtkPanelWidgets                               [ label="InterfaceVtkPanelWidgets"      URL="\ref InterfaceVtkPanelWidgets"];
+
+       subgraph cluster_marInterface {
+               label = "marInterface";
+               style=filled;
+               color=lightgrey;
+               _marInterface                           [ label="marInterface"                          URL="\ref marInterface"];
+               _marParameters                          [ label="marParameters"                         URL="\ref marParameters"];
+               _marExperiment                          [ label="marExperiment"                         URL="\ref marExperiment"];
+               _marObject                                      [ label="marObject"                                     URL="\ref marObject"];
+               _marDynData                                     [ label="marDynData"                            URL="\ref marDynData"];
+               _kVolume                                        [ label="kVolume"                                       URL="\ref kVolume"];
+               _marAxis                                        [ label="marAxis"                                       URL="\ref marAxis"];
+       } 
+
+       subgraph cluster_002 {
+               label = "Load Dicom Images";
+               style=filled;
+               color=lightgrey;
+               _LoadRangeImage                 [ label="LoadRangeImage"                        URL="\ref LoadRangeImage"];
+               _marGdcmDicom                   [ label="marGdcmDicom"                          URL="\ref marGdcmDicom"];
+               _marGdcmDicomILPD               [ label="marGdcmDicomILPD"                      URL="\ref marGdcmDicomILPD"];
+               _marSimpleDicom                 [ label="marSimpleDicom"                        URL="\ref marSimpleDicom"];
+               _marRAWFiles                    [ label="marRAWFiles"                           URL="\ref marRAWFiles"];
+               _marRAW2Files                   [ label="marRAW2Files"                          URL="\ref marRAW2Files"];
+               _marFilesBase                   [ label="marFilesBase"                          URL="\ref marFilesBase"];
+       }
+
+       subgraph subgraph_003 {
+               rank = same;
+               node [style=rounded]
+
+               _axisExtractor          [ label="axisExtractor"             URL="\ref axisExtractor"   fillcolor=yellow style=filled];
+               _axisExtractor02                [ label="axisExtractor02"                       URL="\ref axisExtractor02" fillcolor=yellow style=filled];      
+       }
+       _TreeExtraction_MH_JFC          [ label="TreeExtraction_MH_JFC"         URL="\ref TreeExtraction_MH_JFC"                                 ];
+       _carotidaBifurcacion            [ label="carotidaBifurcacion"           URL="\ref carotidaBifurcacion"  fillcolor=yellow style=filled];
+
+subgraph cluster_MPRxxx {
+               _wxMPRWidget                                    [ label="wxMPRWidget"                                   URL="\ref wxMPRWidget"];
+               _wxMPRWidget2                                   [ label="wxMPRWidget2"                                  URL="\ref wxMPRWidget2"];
+               _wxMaracas_ViewerWidget                 [ label="wxMaracas_ViewerWidget"                URL="\ref wxMaracas_ViewerWidget"];
+               _wxMaracas_N_ViewersWidget              [ label="wxMaracas_N_ViewersWidget"             URL="\ref wxMaracas_N_ViewersWidget"];
+
+       subgraph cluster_2D3DBaseViewer {
+               label = "2D 3D Base Viewer (Maracas+VTK+WxWindow)";
+               style=filled;
+               color=lightgrey;
+
+               subgraph cluster_base_base {
+                       label = "base base ";
+                       style=filled;
+                       color=gray71;
+                       _wxVtkBaseView                                  [ label="wxVtkBaseView"                                 URL="\ref wxVtkBaseView"];
+                       _wxVtk2DView_TMP                                [ label="wxVtk2DView_TMP"                               URL="\ref wxVtk2DView_TMP"];
+                       _vtkImageViewer2_XYZ                    [ label="vtkImageViewer2_XYZ"                   URL="\ref vtkImageViewer2_XYZ"];
+                       _wxVtk2DBaseView                                [ label="wxVtk2DBaseView"                               URL="\ref wxVtk2DBaseView"];
+                       _wxVtk3DBaseView                                [ label="wxVtk3DBaseView"                               URL="\ref wxVtk3DBaseView"];
+               } // cluster_base_base
+
+               subgraph cluster_2DViewer {
+                       _wxVtkMPR2DView                                 [ label="wxVtkMPR2DView"                                URL="\ref wxVtkMPR2DView"];
+                       _wxSphereView                                   [ label="wxSphereView"                                  URL="\ref wxSphereView"];
+                       _vtkPlane2DView                                 [ label="vtkPlane2DView"                                URL="\ref vtkPlane2DView"];
+               } // cluster_2DViewer
+
+               subgraph cluster_Clipping3D {
+                       label = "Clipping 3D Viewer ";
+                       style=filled;
+                       color=gray71;
+                       _vtkClipping3DDataViewer                [ label="vtkClipping3DDataViewer"               URL="\ref vtkClipping3DDataViewer"];
+                       _wxVtkClipping3DViewCntrlPanel  [ label="wxVtkClipping3DViewCntrlPanel" URL="\ref wxVtkClipping3DViewCntrlPanel"];
+                       _wxVtkClipping3DView                    [ label="wxVtkClipping3DView"                   URL="\ref wxVtkClipping3DView"];
+               } //cluster_Clipping3D
+
+
+               subgraph cluster_ViewerDATA {
+                       label = "Viewer DATA ";
+                       style=filled;
+                       color=gray71;
+                       _vtkBaseData                            [ label="vtkBaseData"                                   URL="\ref vtkBaseData"];
+                       _vtkMPRBaseData                         [ label="vtkMPRBaseData"                                URL="\ref vtkMPRBaseData"];
+                       _vtkMPR3DDataViewer             [ label="vtkMPR3DDataViewer"                    URL="\ref vtkMPR3DDataViewer"];
+               } // cluster_ViewerDATA
+
+               subgraph cluster_MPR3DView {
+                       label = " MPR3D View ";
+                       style=filled;
+                       color=gray71;
+                       _wxVtkMPR3DView                                 [ label="wxVtkMPR3DView"                                URL="\ref wxVtkMPR3DView"];
+                       _wxVtkMPR3DViewCntrlPanel               [ label="wxVtkMPR3DViewCntrlPanel"              URL="\ref wxVtkMPR3DViewCntrlPanel"]; 
+               } // cluster_MPR3DView
+
+  } // cluster_2D3DBaseViewer
+} // cluster_MPRxxx
+
+
+       subgraph cluster_3DViewer {
+               label = "3D Viewer (Maracas+VTK+WxWindow)";
+               style=filled;
+               color=lightgrey;
+               _boxSurfaceObserver                     [ label="boxSurfaceObserver"                    URL="\ref boxSurfaceObserver"];
+               _boxVolumeObserver                              [ label="boxVolumeObserver"                     URL="\ref boxVolumeObserver"];
+
+               _vtkmyPWCallback_3DPointWidget  [ label="vtkmyPWCallback_3DPointWidget" URL="\ref vtkmyPWCallback_3DPointWidget"];
+       }
+
+
+       _vtkInteractorStyleCutter               [ label="vtkInteractorStyleCutter"      URL="\ref vtkInteractorStyleCutter"];
+       _vtkImagePolyDataSeedConnectivity       [ label="vtkImagePolyDataSeedConnectivity"              URL="\ref vtkImagePolyDataSeedConnectivity"];
+       _wxImageViewerWidgetRoi                 [ label="wxImageViewerWidgetRoi"        URL="\ref wxImageViewerWidgetRoi"];
+
+       subgraph subgraph_005 {
+               _marZoomROIObserver                             [ label="marZoomROIObserver"                            URL="\ref marZoomROIObserver"];
+               _wxImageViewerWidget                            [ label="wxImageViewerWidget"                           URL="\ref wxImageViewerWidget"];
+       }
+
+       _vtk2DQuantSliceWidget                                  [ label="vtk2DQuantSliceWidget"                         URL="\ref vtk2DQuantSliceWidget"];
+
+       subgraph cluster0 {
+               label = "Manual Contour";
+               style=filled;
+               color=lightgrey;
+               _manualContourModel                                     [ label="manualContourModel"                            URL="\ref manualContourModel"];
+
+               _manualViewBaseContour                          [ label="manualViewBaseContour"                         URL="\ref manualViewBaseContour"];
+               _manualViewContour                                      [ label="manualViewContour"                                     URL="\ref manualViewContour"];
+               _manualView3VContour                            [ label="manualView3VContour"                           URL="\ref manualView3VContour"];
+               _manualView3DContour                            [ label="manualView3DContour"                           URL="\ref manualView3DContour"];
+               _manualViewPerpPlaneContour         [ label="manualViewPerpPlaneContour"                URL="\ref manualViewPerpPlaneContour"];
+
+               
+               _manualViewRoi                                          [ label="manualViewRoi"                                         URL="\ref manualViewRoi"];
+                 
+
+               _manualContourBaseControler                     [ label="manualContourBaseControler"            URL="\ref manualContourBaseControler"];
+               _manualContourControler                         [ label="manualContourControler"                        URL="\ref manualContourControler"];
+               _manualContour3VControler                       [ label="manualContour3VControler"                      URL="\ref manualContour3VControler"];
+               _manualContour3DControler                       [ label="manualContour3DControler"                      URL="\ref manualContour3DControler"];
+               _manualContour3V3DControler                     [ label="manualContour3V3DControler"            URL="\ref manualContour3V3DControler"];
+               _manualContourPerpPlaneControler        [ label="manualContourPerpPlaneControler"       URL="\ref manualContourPerpPlaneControler"];
+               _manualRoiControler                                     [ label="manualRoiControler"                            URL="\ref manualRoiControler"];
+
+               _manualViewPoint                                        [ label="manualViewPoint"                                       URL="\ref manualViewPoint"];
+               _manualPoint                                            [ label="manualPoint"                                           URL="\ref manualPoint"];
+
+       }               
+
+       subgraph cluster_interactor {
+               label = "Interactors";
+               style=filled;
+               color=lightgrey;
+               _vtkInteractorStyleBaseView                     [ label="vtkInteractorStyleBaseView"            URL="\ref vtkInteractorStyleBaseView"];
+               _vtkInteractorStyleBaseView2D           [ label="vtkInteractorStyleBaseView2D"          URL="\ref vtkInteractorStyleBaseView2D"];
+               _vtkInteractorStyleBaseView3D           [ label="vtkInteractorStyleBaseView3D"          URL="\ref vtkInteractorStyleBaseView3D"];                                       
+               _vtkInteractorStyle3DView                       [ label="vtkInteractorStyle3DView"                      URL="\ref vtkInteractorStyle3DView"];                   
+               _vtkInfoTextImageInteractor                     [ label="vtkInfoTextImageInteractor"            URL="\ref vtkInfoTextImageInteractor"];
+               _vtkInfoTextImageInteractorPlane2D      [ label="vtkInfoTextImageInteractorPlane2D"     URL="\ref vtkInfoTextImageInteractorPlane2D"];
+               _vtkInfoTextImage                                       [ label="vtkInfoTextImage"                                      URL="\ref vtkInfoTextImage"];
+               _vtkInteractorStyleMPRView                      [ label="vtkInteractorStyleMPRView"                     URL="\ref vtkInteractorStyleMPRView"];
+               _vtkInteractorStylePlane2D                      [ label="vtkInteractorStylePlane2D"                     URL="\ref vtkInteractorStylePlane2D"];
+               _vtkInteractorStyleSphere                       [ label="vtkInteractorStyleSphere"                      URL="\ref vtkInteractorStyleSphere"];
+               _InteractorStyleMaracas                         [ label="InteractorStyleMaracas"                        URL="\ref InteractorStyleMaracas"];     
+               _vtkInteractorScrollZ                           [ label="vtkInteractorScrollZ"                          URL="\ref vtkInteractorScrollZ"];                       
+               _manualInteractorWindowLevel            [ label="manualInteractorWindowLevel"           URL="\ref manualInteractorWindowLevel"];                        
+
+  }
+
+    subgraph cluster_uniandeskernel {
+               label = "Kernel CT (uniandes)";
+               style=filled;
+               color=lightgrey;
+               _marAxisContours                        [ label="marAxisContours"                       URL="\ref marAxisContours"      fillcolor=yellow style=filled];
+               _marAxisCT                                      [ label="marAxisCT"                                     URL="\ref marAxisCT"    fillcolor=yellow style=filled];
+               _marContourVO                           [ label="marContourVO"                                          URL="\ref marContourVO"         fillcolor=yellow style=filled];
+               _marExperimentCT                        [ label="marExperimentCT"                               URL="\ref marExperimentCT"      fillcolor=yellow style=filled];
+               _marInterfaceCT                         [ label="marInterfaceCT"                                        URL="\ref marInterfaceCT"       fillcolor=yellow style=filled];
+               _marIsocontour                          [ label="marIsocontour"                                 URL="\ref marIsocontour"        fillcolor=yellow style=filled];
+               _marPoint                                       [ label="marPoint"                                      URL="\ref marPoint"     fillcolor=yellow style=filled];
+       }
+
+  subgraph cluster_uniandesvisual {
+               label = "Visualization CT (uniandes)";
+               style=filled;
+               color=lightgrey;
+               _ContourView                            [ label="ContourView"                   URL="\ref ContourView"  fillcolor=yellow style=filled];
+               _PointView                                      [ label="PointView"                                     URL="\ref PointView"    fillcolor=yellow style=filled];
+               _LineView                                       [ label="LineView"                                              URL="\ref LineView"     fillcolor=yellow style=filled];
+               _wxPnlContourControl            [ label="wxPnlContourControl"                           URL="\ref wxPnlContourControl"  fillcolor=yellow style=filled];
+               
+       }
+
+subgraph cluster_006 {
+               label = "Thread";
+               style=filled;
+               color=lightgrey;
+               _PriorityLoadImageBar                   [ label="PriorityLoadImageBar"                  URL="\ref PriorityLoadImageBar"];
+               _BarLoading                                             [ label="BarLoading"                                    URL="\ref BarLoading"];
+               _BarRange                                               [ label="BarRange"                                              URL="\ref BarRange"];
+               _MyThread                                               [ label="MyThread"                                              URL="\ref MyThread"];
+               _AdminThreadEED                                 [ label="AdminThreadEED"                                URL="\ref AdminThreadEED"];
+               _PriorityLoop                                   [ label="PriorityLoop"                                  URL="\ref PriorityLoop"];
+}
+
+               _vtkInteractorStyle2DMaracas            [ label="vtkInteractorStyle2DMaracas"           URL="\ref vtkInteractorStyle2DMaracas"];
+               _wxQuantificationWidget_base            [ label="wxQuantificationWidget_base"           URL="\ref wxQuantificationWidget_base"];
+               _wxPanelControlsHealthySickSlice2       [ label="wxPanelControlsHealthySickSlice2"      URL="\ref wxPanelControlsHealthySickSlice2"];
+
+
+               _vtk3DQuantSurfaceWidget                [ label="vtk3DQuantSurfaceWidget"               URL="\ref vtk3DQuantSurfaceWidget"];
+               _RectangleGuideVtk                              [ label="RectangleGuideVtk"                             URL="\ref RectangleGuideVtk"];
+
+
+subgraph cluster_figureCutting {
+               label = "Figure Cutting";
+               style=filled;
+               color=lightgrey;
+
+               _wxPanelCuttingImageData                [ label="wxPanelCuttingImageData"               URL="\ref wxPanelCuttingImageData"];
+               _figureCuttingModel                             [ label="figureCuttingModel"                    URL="\ref figureCuttingModel"];
+
+               _figureCuttingCubeModel                 [ label="figureCuttingCubeModel"                URL="\ref figureCuttingCubeModel"];
+               _figureCuttingCylinderModel             [ label="figureCuttingCylinderModel"    URL="\ref figureCuttingCylinderModel"];
+               _figureCuttingSphereModel               [ label="figureCuttingSphereModel"              URL="\ref figureCuttingSphereModel"];
+}
+               
+
+subgraph cluster_mesure_tools {
+               label = "Mesure tools widgets";
+               style=filled;
+               color=lightgrey;
+
+               _wxWidgetMesure2D                               [ label="wxWidgetMesure2D"                              URL="\ref wxWidgetMesure2D"];
+               _wxWidgetMesure2D_Plane                 [ label="wxWidgetMesure2D_Plane"                URL="\ref wxWidgetMesure2D_Plane"];
+               _wxWidgetMesure2D_Plane_in_MPR  [ label="wxWidgetMesure2D_Plane_in_MPR" URL="\ref wxWidgetMesure2D_Plane_in_MPR"];
+}
+
+               _marImageData   [ label="marImageData"  URL="\ref marImageData"];
+
+
+         _wxMaracasApp         -> _wxMaracasFrame                              [ arrowhead="open", style="dashed" ];
+      _wxMaracasFrame  -> _wxMaracas3DBrowser                  [ arrowhead="open", style="dashed" ];
+      _wxMaracasFrame  -> _wxMaracasQuantification             [ arrowhead="open", style="dashed" ];
+
+      _wxMaracasApp02  -> _wxMaracasFrame02                    [ arrowhead="open", style="dashed" ];
+
+//      _wxMaracasFrame02      -> _wxMaracasDataBrowser                [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasImageBrowser               [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasImageBrowser02             [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracas3DBrowser                  [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasQuantification             [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasQuantificationCT   [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasMPR                                [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasProcessingCT               [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasEmptyPanel                 [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxMaracasEmptyPanel_2               [ arrowhead="open", style="dashed" ];
+//      _wxMaracasFrame02      -> _wxSurfaceSTLWidget                  [ arrowhead="open", style="dashed" ];
+//             _wxMaracasFrame02       -> _ILPDViewListPatient                 [ arrowhead="open", style="dashed" ];
+//             _wxMaracasFrame02       -> _wxILPD                                              [ arrowhead="open", style="dashed" ];
+
+
+
+       _wxMaracasApp02         -> _wxMaracasFrame03                                                    [ arrowhead="open", style="dashed" ];
+       _wxMaracasFrame03       -> _wxMaracasNoteBookPatientLstVoi                              [ arrowhead="open", style="dashed" ];
+       _wxMaracasFrame03       -> _wxMaracasNoteBookCTQuantification                   [ arrowhead="open", style="dashed" ];   
+       _wxMaracasFrame03       -> _wxMaracasNoteBookIRMQuantification                  [ arrowhead="open", style="dashed" ];   
+       _wxMaracasFrame03       -> _wxMaracasNoteBookSTLFormat                                  [ arrowhead="open", style="dashed" ];
+       _wxMaracasFrame03       -> _wxMaracasNoteBookTests                                              [ arrowhead="open", style="dashed" ];
+       _wxMaracasFrame03       -> _wxMaracasNoteBookVascularTreeExtraction             [ arrowhead="open", style="dashed" ];   
+       _wxMaracasFrame03       -> _wxMaracasNoteBookManualRegistration                 [ arrowhead="open", style="dashed" ];   
+
+
+       _wxMaracasNoteBookPatientLstVoi                 -> _wxILPD                                      [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookPatientLstVoi                 -> _wxILPDwithImage                     [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookPatientLstVoi                 -> _wxMaracasImageBrowser02 [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookPatientLstVoi                 -> _wxMaracasMPR                        [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookPatientLstVoi                 -> _wxReadWriteConf                     [ arrowhead="open", style="dashed" ];
+
+       _wxILPDwithImage                                                -> _wxILPD                                      [ arrowhead="open", style="dashed" ];
+       _wxILPDwithImage                                                -> _wxVtk2DBaseView                     [ arrowhead="open", style="dashed" ];
+       _wxILPDwithImage                                                -> _vtkBaseData                         [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookCTQuantification              -> _wxMaracasMPR                        [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookCTQuantification              -> _wxMaracasProcessingCT       [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookCTQuantification              -> _wxMaracasQuantificationCT [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookCTQuantification              -> _wxReadWriteConf                     [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookIRMQuantification             -> _wxMaracas3DBrowser          [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookIRMQuantification             -> _wxMaracasQuantification [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookSTLFormat                             -> _wxMaracas3DBrowser          [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookSTLFormat                             -> _wxSurfaceSTLWidget          [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookSTLFormat                             -> _wxSTLWidget_02                      [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookSTLFormat                             -> _wxSTLWidget_03                      [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookTests                                 -> _wxMaracasEmptyPanel_3       [ arrowhead="open", style="dashed" ];
+       _wxMaracasNoteBookTests                                 -> _wxMaracas_ManualTree_MPR [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookVascularTreeExtraction-> _wxMaracasEmptyPanel_2       [ arrowhead="open", style="dashed" ];
+
+       _wxMaracasNoteBookManualRegistration    -> _wxManualRegistration3D      [ arrowhead="open", style="dashed" ];
+
+       _wxManualRegistration3D -> _wxPanelCuttingImageData     [ arrowhead="open", style="dashed" ];
+       _wxManualRegistration3D -> _vtkMPRBaseData                      [ arrowhead="open", style="dashed" ];
+
+       _wxManualRegistration3D -> _marImageData                        [ arrowhead="open", style="dashed" ];
+       _wxManualRegistration3D -> _wxVtk3DBaseView                     [ arrowhead="open", style="dashed" ];
+       _wxManualRegistration3D -> _wxVtkMPR3DView                      [ arrowhead="open", style="dashed" ];
+       _wxManualRegistration3D -> _wxVtkClipping3DView         [ arrowhead="open", style="dashed" ];
+       _wxManualRegistration3D -> _wxVtkMPR3DView                      [ arrowhead="open", style="dashed" ];
+       _wxManualRegistration3D -> _wxVtkClipping3DView         [ arrowhead="open", style="dashed" ];
+
+         _wxMaracasMPR                         ->_marInterface                                 [ arrowhead="open", style="dashed" ];
+         _wxMaracasEmptyPanel          ->_wxEmptyPanelWidget                   [ arrowhead="open", style="dashed" ];
+         _wxMaracasProcessingCT        ->_wxProcessingCTWidget                 [ arrowhead="open", style="dashed" ];
+         _wxMaracasEmptyPanel_2        ->_wxEmptyPanelWidget_2                 [ arrowhead="open", style="dashed" ];
+         _wxSurfaceSTLWidget           ->_marInterface                                 [ arrowhead="open", style="dashed" ];
+         _wxSurfaceSTLWidget           ->_vtk3DSurfaceSTLWidget                [ arrowhead="open", style="dashed" ];
+
+         _wxMaracas3DBrowser           ->_marInterface                                 [ arrowhead="open", style="dashed" ];
+         _wxMaracas3DBrowser           ->_wxSurfaceWidget                              [ arrowhead="open", style="dashed" ];
+
+         _wxSurfaceWidget                      -> _InterfaceVtkPanelWidgets    [ arrowhead="onormal"                      ];
+         _wxSurfaceWidget                      -> _vtk3DSurfaceWidget                  [ arrowhead="open", style="dashed" ];
+         _wxSurfaceWidget                      -> _marInterface                                [ arrowhead="open", style="dashed" ];
+
+         _vtk3DSurfaceWidget           -> _wxVTKRenderWindowInteractor [ arrowhead="onormal"   ];
+         _vtk3DSurfaceWidget           -> _marInterface                                [ arrowhead="open", style="dashed" ];
+         _vtk3DSurfaceWidget           -> _InterfaceVtkPanelWidgets    [ arrowhead="open", style="dashed" ];
+
+         _wxMaracas_ManualTree_MPR -> _wxManualTree_MPRWidget          [ arrowhead="open", style="dashed" ];
+
+
+         _wxReadWriteConf                      -> _FileInformationModel                [ arrowhead="open", style="dashed" ];
+         _FileInformationModel         -> _FileInfoNode                                [ arrowhead="open", style="dashed" ];
+
+
+         _marInterface         -> _marFilesBase                        [ arrowhead="open", style="dashed" ];
+         _marInterface         -> _marParameters                       [ arrowhead="open", style="dashed" ];
+         _marInterface         -> _marExperiment                       [ arrowhead="open", style="dashed" ];
+
+         _marExperiment        -> _marObject                           [ arrowhead="onormal"                      ];
+         _marExperiment        -> _marDynData                          [ arrowhead="open", style="dashed" ];
+         _marExperiment        -> _marAxis                                     [ arrowhead="open", style="dashed" ];
+
+         _marDynData           -> _marObject                           [ arrowhead="onormal"                      ];
+         _marDynData           -> _kVolume                                     [ arrowhead="open", style="dashed" ];
+
+         _marAxis                      -> _marObject                           [ arrowhead="onormal"                      ];
+         _marAxis                      -> _kVolume                                     [ arrowhead="onormal"                      ];
+
+         _marFilesBase         -> _marObject                           [ arrowhead="onormal"                      ];
+         _marFilesBase         -> _kVolume                                     [ arrowhead="open", style="dashed" ];
+
+         _marSimpleDicom       -> _marFilesBase                        [ arrowhead="onormal"                      ];
+         _marGdcmDicom         -> _marFilesBase                        [ arrowhead="onormal"                      ];
+         _marRAWFiles          -> _marFilesBase                        [ arrowhead="onormal"                      ];
+         _marRAW2Files         -> _marRAWFiles                         [ arrowhead="onormal"                      ];
+         _marGdcmDicomILPD     -> _marGdcmDicom                        [ arrowhead="onormal"                      ];
+
+         _wxMaracasDataBrowser         -> _marInterface                        [ arrowhead="open", style="dashed" ];
+
+         _wxImageViewerWidgetRoi       -> _wxImageViewerWidget         [ arrowhead="onormal"                      ];
+         _wxMaracasImageBrowser        -> _wxImageViewerWidgetRoi      [ arrowhead="open", style="dashed" ];
+
+         _wxMaracasImageBrowser02      -> _LoadRangeImage                      [ arrowhead="open", style="dashed" ];
+         _wxMaracasImageBrowser02      -> _manualViewRoi                       [ arrowhead="open", style="dashed" ];
+         _wxMaracasImageBrowser02      -> _vtkBaseData                         [ arrowhead="open", style="dashed" ];
+         _wxMaracasImageBrowser02      -> _wxVtk2DBaseView                     [ arrowhead="open", style="dashed" ];
+         _wxMaracasImageBrowser02      -> _manualContourModel          [ arrowhead="open", style="dashed" ];
+         _wxMaracasImageBrowser02      -> _manualRoiControler          [ arrowhead="open", style="dashed" ];
+         _wxMaracasImageBrowser02      -> _marInterface                        [ arrowhead="open", style="dashed" ];
+
+
+         _wxEmptyPanelWidget           -> _wxVtk3DBaseView                             [ arrowhead="open", style="dashed" ];
+         _wxEmptyPanelWidget           -> _axisExtractor02                             [ arrowhead="open", style="dashed" color=red];
+
+         _wxProcessingCTWidget         -> _vtkBaseData                                 [ arrowhead="open", style="dashed" ];
+         _wxProcessingCTWidget         -> _wxVtk2DBaseView                             [ arrowhead="open", style="dashed" ];
+         _wxProcessingCTWidget         -> _marInterfaceCT                              [ arrowhead="open", style="dashed" ];
+
+         _wxVtkBaseView                        -> _wxVTKRenderWindowInteractor[ arrowhead="open", style="dashed"       ];
+
+
+         _wxVtk2DBaseView                      -> _wxVtkBaseView                               [ arrowhead="onormal"                           ];
+         _wxVtk2DView_TMP                      -> _wxVtkBaseView                               [ arrowhead="onormal"                           ];
+
+         _wxVtk2DBaseView                      -> _vtkBaseData                                 [ arrowhead="open", style="dashed"      ];
+         _wxVtk2DBaseView                      -> _vtkImageViewer2_XYZ                 [ arrowhead="open", style="dashed"      ];
+
+         _vtkPlane2DView                       -> _wxVtk2DBaseView                             [ arrowhead="onormal"                           ];
+         _vtkPlane2DView                       -> _vtkMPRBaseData                              [ arrowhead="open", style="dashed"      ];
+         _vtkPlane2DView                       -> _vtkInteractorStylePlane2D   [ arrowhead="open", style="dashed" ];
+
+         _wxVtkMPR2DView                       -> _wxVtk2DBaseView                             [ arrowhead="onormal"                           ];
+         _wxVtkMPR2DView                       -> _vtkInteractorStyleMPRView   [ arrowhead="open", style="dashed" ];
+
+         _wxSphereView                         -> _wxVtk2DBaseView                             [ arrowhead="onormal"                           ];
+         _wxSphereView                         -> _vtkMPRBaseData                              [ arrowhead="open", style="dashed"      ];
+         _wxSphereView                         -> _vtkInteractorStyleSphere    [ arrowhead="open", style="dashed"      ];
+
+
+
+               _vtkInteractorStyleBaseView             -> _wxVtkBaseView                               [ arrowhead="open", style="dashed" ];
+               _wxVtkBaseView                                  -> _vtkInteractorStyleBaseView  [ arrowhead="open", style="dashed" ];
+               _vtkInteractorStyleBaseView             -> _manualInteractorWindowLevel [ arrowhead="open", style="dashed" ];
+               _vtkInteractorStyleBaseView             -> _vtkInteractorScrollZ                [ arrowhead="open", style="dashed" ];
+               _vtkInteractorStyleSphere               -> _InteractorStyleMaracas              [ arrowhead="onormal"                      ];
+               _vtkInteractorStyleMPRView              -> _InteractorStyleMaracas              [ arrowhead="onormal"                      ];
+               _vtkInteractorStylePlane2D              -> _InteractorStyleMaracas              [ arrowhead="onormal"                      ];
+               _vtkInteractorStyle3DView               -> _InteractorStyleMaracas              [ arrowhead="onormal"                      ];
+
+
+               _vtkInteractorStyleBaseView2D   -> _vtkInteractorStyleBaseView  [ arrowhead="onormal"                      ];
+               _vtkInteractorStyleBaseView3D   -> _vtkInteractorStyleBaseView  [ arrowhead="onormal"                      ];
+
+
+           _InteractorStyleMaracas             ->  _vtkInteractorStyleBaseView         [ arrowhead="open", style="dashed"      ];
+           _vtkInteractorStyleBaseView ->  _InteractorStyleMaracas                     [ arrowhead="open", style="dashed"      ];
+
+
+               _vtkInteractorScrollZ           -> _InteractorStyleMaracas                      [ arrowhead="onormal"                      ];
+
+
+
+               _wxManualTree_MPRWidget         -> _wxMPRWidget2                                        [ arrowhead="open", style="dashed" ];
+               _wxManualTree_MPRWidget         -> _wxVtkClipping3DView                         [ arrowhead="open", style="dashed" ];
+               _wxManualTree_MPRWidget         -> _wxVtk3DBaseView                             [ arrowhead="open", style="dashed" ];
+               _wxManualTree_MPRWidget         -> _wxVtkMPR3DView                                      [ arrowhead="open", style="dashed" ];
+               _wxManualTree_MPRWidget         -> _manualContourModel                          [ arrowhead="open", style="dashed" ];
+               _wxManualTree_MPRWidget         -> _manualContour3VControler            [ arrowhead="open", style="dashed" ];
+               _wxManualTree_MPRWidget         -> _manualContour3V3DControler          [ arrowhead="open", style="dashed" ];
+
+
+
+               _manualContourBaseControler             ->      _InteractorStyleMaracas                 [ arrowhead="onormal"                           ];
+               _manualContourBaseControler             ->      _manualContourModel                             [ arrowhead="open", style="dashed"      ];
+           _manualContourBaseControler         ->      _manualViewBaseContour                  [ arrowhead="open", style="dashed"      ];
+           _manualContourControler                     ->      _manualContourBaseControler             [ arrowhead="onormal"                           ];
+           _manualContour3VControler           ->      _manualContourControler                 [ arrowhead="onormal"                           ];
+           _manualContour3DControler           ->      _manualContourControler                 [ arrowhead="onormal"                           ];
+           _manualContour3V3DControler         ->      _manualContour3DControler               [ arrowhead="onormal"                           ];
+               _manualContour3V3DControler             ->      _manualContour3VControler               [ arrowhead="open", style="dashed"      ];
+               _manualContourPerpPlaneControler->      _manualContourControler                 [ arrowhead="onormal"                           ];
+               _manualRoiControler                             ->      _manualContourBaseControler             [ arrowhead="onormal"                           ];
+           _manualViewBaseContour                      ->      _manualContourModel                             [ arrowhead="open", style="dashed"      ];
+               _manualViewBaseContour                  ->      _manualViewPoint                                [ arrowhead="open", style="dashed"      ];
+               _manualViewBaseContour                  ->      _wxVtkBaseView                                  [ arrowhead="open", style="dashed"      ];
+
+               _manualContourModel                             ->      _manualPoint                                    [ arrowhead="open", style="dashed"      ];
+               _manualViewContour                              ->      _manualViewBaseContour                  [ arrowhead="onormal"                           ];
+               _manualView3VContour                    ->      _manualViewContour                              [ arrowhead="onormal"                           ];
+               _manualView3DContour                    ->      _manualViewContour                              [ arrowhead="onormal"                           ];
+               _manualViewPerpPlaneContour             ->      _manualViewContour                              [ arrowhead="onormal"                           ];
+               _manualViewRoi                                  ->      _manualViewBaseContour                  [ arrowhead="onormal"                           ];
+               _manualInteractorWindowLevel    ->      _InteractorStyleMaracas                 [ arrowhead="onormal"                           ];
+
+
+         _wxVtkMPR3DView                               -> _wxVtk3DBaseView                                     [ arrowhead="open", style="dashed"      ];
+         _wxVtkMPR3DView                               -> _vtkMPR3DDataViewer                          [ arrowhead="open", style="dashed"      ];
+         _wxVtkMPR3DView                               -> _wxVtkMPR3DViewCntrlPanel            [ arrowhead="open", style="dashed"      ];
+         _wxVtkMPR3DView                               -> _vtkmyPWCallback_3DPointWidget       [ arrowhead="open", style="dashed" ];
+         _vtkmyPWCallback_3DPointWidget-> _wxVtkMPR3DView                                      [ arrowhead="open", style="dashed" ];
+
+         _wxVtk3DBaseView                      -> _wxVtkBaseView                                               [ arrowhead="onormal"                           ];
+
+         _wxEmptyPanelWidget_2         -> _wxVtk3DBaseView                                             [ arrowhead="open", style="dashed"      ];
+         _wxEmptyPanelWidget_2         -> _axisExtractor                                               [ arrowhead="open", style="dashed"      color=red];
+         _wxEmptyPanelWidget_2         -> _axisExtractor02                                             [ arrowhead="open", style="dashed"      color=red];
+         _wxEmptyPanelWidget_2         -> _marInterface                                                [ arrowhead="open", style="dashed"      ];
+         _wxEmptyPanelWidget_2         -> _wxSurfaceWidget                                             [ arrowhead="open", style="dashed"      ];
+         _wxEmptyPanelWidget_2         -> _TreeExtraction_MH_JFC                               [ arrowhead="open", style="dashed"      ];
+         _TreeExtraction_MH_JFC        -> _carotidaBifurcacion                                 [ arrowhead="open", style="dashed"      ];
+
+         _vtk3DSurfaceSTLWidget        -> _wxVTKRenderWindowInteractor                 [ arrowhead="onormal"                      ];
+         _vtk3DSurfaceSTLWidget        -> _marInterface                                                [ arrowhead="open", style="dashed" ];
+         _vtk3DSurfaceSTLWidget        -> _vtkInteractorStyleCutter                    [ arrowhead="open", style="dashed" ];
+         _vtk3DSurfaceSTLWidget        -> _vtkImagePolyDataSeedConnectivity    [ arrowhead="open", style="dashed" ];
+
+         _marZoomROIObserver           ->      _wxImageViewerWidget                    [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _marZoomROIObserver                             [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _manualContourModel                             [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _manualViewContour                              [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _manualContourControler             [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _vtkInteractorStyle2DMaracas    [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _wxVTKRenderWindowInteractorEditContour [ arrowhead="open", style="dashed"  ];
+         _wxImageViewerWidget          ->      _InterfaceVtkPanelWidgets               [ arrowhead="open", style="dashed"  ];
+
+
+         _vtk2DQuantSliceWidget        ->      _wxImageViewerWidget                    [ arrowhead="onormal"                           ];
+
+         _wxVTKRenderWindowInteractorEditContour       ->      _wxVTKRenderWindowInteractor    [ arrowhead="onormal"                           ];
+
+         _wxQuantificationWidget_base  -> _InterfaceVtkPanelWidgets                    [ arrowhead="onormal"                       ];
+         _wxQuantificationWidget               -> _wxQuantificationWidget_base                 [ arrowhead="onormal"                       ];
+         _wxQuantificationWidgetCT             -> _wxQuantificationWidget_base                 [ arrowhead="onormal"                       ];
+
+      _wxMaracasQuantification         -> _marInterface                                                [ arrowhead="open", style="dashed" ];
+      _wxMaracasQuantification         -> _wxQuantificationWidget                              [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidget          -> _vtk2DQuantSliceWidget                               [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidget          -> _marInterface                                                [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidget          -> _wxPanelControlsHealthySickSlice2    [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidget          -> _vtk3DQuantSurfaceWidget                     [ arrowhead="open", style="dashed" ];
+
+      _wxMaracasQuantificationCT       -> _marInterfaceCT                                              [ arrowhead="open", style="dashed" ];
+      _wxMaracasQuantificationCT       -> _wxQuantificationWidgetCT                    [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidgetCT                -> _vtk2DQuantSliceWidget                               [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidgetCT                -> _marInterfaceCT                                              [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidgetCT                -> _wxPanelControlsHealthySickSlice2    [ arrowhead="open", style="dashed" ];
+      _wxQuantificationWidgetCT                -> _vtk3DQuantSurfaceWidget                     [ arrowhead="open", style="dashed" ];
+
+
+  
+          _vtk3DQuantSurfaceWidget             -> _vtk3DSurfaceWidget                                  [ arrowhead="onormal"                      ];
+          _vtk3DQuantSurfaceWidget             -> _RectangleGuideVtk                                   [ arrowhead="open", style="dashed" ];
+       
+
+               _vtkMPRBaseData                         -> _vtkBaseData                                                 [ arrowhead="onormal"                      ];
+
+               _wxMaracasMPR                           ->      _wxMPRWidget                                            [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget2                           ->      _wxMPRWidget                                            [ arrowhead="onormal"                      ];
+               _wxMPRWidget                            ->      _wxWidgetMesure2D_Plane_in_MPR          [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget                            ->      _wxVtkMPR2DView                                         [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget                            ->      _wxSphereView                                           [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget                            ->      _vtkMPRBaseData                                         [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget                            ->      _wxVtkMPR3DView                                         [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget                            ->      _wxVtk3DBaseView                                        [ arrowhead="open", style="dashed" ];
+
+
+               _wxMaracas_N_ViewersWidget      ->      _wxMaracas_ViewerWidget                         [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _vtkMPRBaseData                                         [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxVtk2DBaseView                                        [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxVtkMPR2DView                                         [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxWidgetMesure2D_Plane_in_MPR          [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _vtkPlane2DView                                         [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxVtkClipping3DView                            [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxVtk3DBaseView                                        [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxVtkMPR3DView                                         [ arrowhead="open", style="dashed" ];
+               _wxMaracas_ViewerWidget         ->      _wxSphereView                                           [ arrowhead="open", style="dashed" ];
+
+
+
+               _vtkMPR3DDataViewer                     ->      _vtkMPRBaseData                                         [ arrowhead="open", style="dashed" ];
+               _wxVtkMPR3DViewCntrlPanel       ->      _wxVtkMPR3DView                                         [ arrowhead="open", style="dashed" ];
+               
+
+               _wxVtkClipping3DView                    ->      _wxVtk3DBaseView                                [ arrowhead="open", style="dashed" ];
+               _wxMPRWidget                                    ->      _wxVtkClipping3DView                    [ arrowhead="open", style="dashed" ];
+               _wxVtkClipping3DView                    ->      _vtkClipping3DDataViewer                [ arrowhead="open", style="dashed" ];
+               _vtkClipping3DDataViewer                ->  _boxSurfaceObserver                         [ arrowhead="open", style="dashed" ];
+               _vtkClipping3DDataViewer                ->  _boxVolumeObserver                          [ arrowhead="open", style="dashed" ];
+               _vtkClipping3DDataViewer                ->      _vtkMPRBaseData                                 [ arrowhead="open", style="dashed" ];
+               _wxVtkClipping3DViewCntrlPanel  ->      _wxVtkClipping3DView                    [ arrowhead="open", style="dashed" ];
+               _wxVtkClipping3DView                    ->      _wxVtkClipping3DViewCntrlPanel  [ arrowhead="open", style="dashed" ];
+         
+               _LoadRangeImage                 -> _InterfaceVtkPanelWidgets    [ arrowhead="onormal"                      ];
+               _LoadRangeImage                 -> _wxImageViewerWidget                 [ arrowhead="open", style="dashed" ];
+               _LoadRangeImage                 -> _marFilesBase                                [ arrowhead="open", style="dashed" ];
+               _LoadRangeImage                 -> _PriorityLoadImageBar                [ arrowhead="open", style="dashed" ];
+               _PriorityLoadImageBar   -> _PriorityLoop                                [ arrowhead="onormal"                      ];
+               _PriorityLoadImageBar   -> _marGdcmDicom                                [ arrowhead="open", style="dashed" ];
+               _PriorityLoadImageBar   -> _BarLoading                                  [ arrowhead="open", style="dashed" ];
+               _LoadRangeImage                 -> _BarLoading                                  [ arrowhead="open", style="dashed" ];   
+               _LoadRangeImage                 -> _BarRange                                    [ arrowhead="open", style="dashed" ];
+               _LoadRangeImage                 -> _MyThread                                    [ arrowhead="open", style="dashed" ];
+               _MyThread                               -> _AdminThreadEED                              [ arrowhead="open", style="dashed" ];
+               _LoadRangeImage                 -> _AdminThreadEED                              [ arrowhead="open", style="dashed" ];
+
+
+         _vtkInfoTextImageInteractor           -> _InteractorStyleMaracas                      [ arrowhead="onormal"                      ];
+         _vtkInfoTextImageInteractor           -> _vtkInfoTextImage                            [ arrowhead="open", style="dashed" ];
+         _vtkInfoTextImage                                     -> _wxVtk2DBaseView                                     [ arrowhead="open", style="dashed" ];
+         _wxVtk2DBaseView                                      -> _vtkInfoTextImage                            [ arrowhead="open", style="dashed" ];
+         _wxVtk2DBaseView                                      -> _vtkInfoTextImageInteractor          [ arrowhead="open", style="dashed" ];
+         
+         _vtkInfoTextImageInteractorPlane2D-> _vtkInfoTextImageInteractor              [ arrowhead="onormal"                      ];
+
+
+      _marInterfaceCT                  -> _marExperimentCT                     [ arrowhead="open", style="dashed" ];
+         _marInterfaceCT                       -> _marFilesBase                                [ arrowhead="open", style="dashed" ];
+         _marInterfaceCT                       -> _marParameters                               [ arrowhead="open", style="dashed" ];
+         _marInterfaceCT                       -> _marExperiment                               [ arrowhead="open", style="dashed" ];
+         _marAxisCT                            -> _marIsocontour                               [ arrowhead="open", style="dashed" ];
+         _marIsocontour                        -> _marPoint                                    [ arrowhead="open", style="dashed" ];
+         _marAxis                                      -> _marAxisContours                             [ arrowhead="open", style="dashed" ];
+         _marAxisContours                      -> _marContourVO                                [ arrowhead="open", style="dashed" ];
+         _marExperimentCT                      -> _marExperiment                               [ arrowhead="onormal"                      ];
+         _marAxisCT                            -> _marAxis                                             [ arrowhead="onormal"                      ];
+
+         
+         _vtk3DSurfaceWidget           -> _marInterfaceCT                              [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _ContourView                                 [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _PointView                                   [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _LineView                                    [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _manualViewContour                   [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _manualViewContour                   [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _manualContourModel                  [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _manualContourModel                  [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _manualContourControler              [ arrowhead="open", style="dashed" ];
+         _wxQuantificationWidgetCT     -> _manualContourControler              [ arrowhead="open", style="dashed" ];
+         _ContourView                          -> _wxVtkBaseView                               [ arrowhead="open", style="dashed" ];
+         _PointView                            -> _wxVtkBaseView                               [ arrowhead="open", style="dashed" ];
+         _LineView                                     -> _wxVtkBaseView                               [ arrowhead="open", style="dashed" ];
+  
+
+         _figureCuttingCubeModel                       -> _figureCuttingModel                                  [ arrowhead="onormal"                      ];
+         _figureCuttingCylinderModel           -> _figureCuttingModel                                  [ arrowhead="onormal"                      ];
+         _figureCuttingSphereModel                     -> _figureCuttingModel                                  [ arrowhead="onormal"                      ];
+         _wxPanelCuttingImageData                      -> _wxVtk3DBaseView                                     [ arrowhead="open", style="dashed" ];
+         _wxPanelCuttingImageData                      -> _figureCuttingModel                                  [ arrowhead="open", style="dashed" ];
+         _wxPanelCuttingImageData                      -> _figureCuttingCubeModel                              [ arrowhead="open", style="dashed" ];
+         _wxPanelCuttingImageData                      -> _figureCuttingCylinderModel                  [ arrowhead="open", style="dashed" ];
+         _wxPanelCuttingImageData                      -> _figureCuttingSphereModel                    [ arrowhead="open", style="dashed" ];
+         _wxMPRWidget                                          -> _wxPanelCuttingImageData                             [ arrowhead="open", style="dashed" ];
+
+
+         _wxWidgetMesure2D_Plane                       -> _wxWidgetMesure2D                                    [ arrowhead="onormal"                      ];
+         _wxWidgetMesure2D_Plane_in_MPR        -> _wxWidgetMesure2D_Plane                              [ arrowhead="onormal"                      ];
+         _wxWidgetMesure2D                                     -> _manualContourControler                              [ arrowhead="open", style="dashed" ];
+         _wxWidgetMesure2D                                     -> _manualViewContour                                   [ arrowhead="open", style="dashed" ];
+         _wxWidgetMesure2D                                     -> _manualContourModel                                  [ arrowhead="open", style="dashed" ];
+         _wxWidgetMesure2D                                     -> _wxVtk2DBaseView                                     [ arrowhead="open", style="dashed" ];
+         _wxWidgetMesure2D_Plane_in_MPR        -> _vtkPlane2DView                                              [ arrowhead="open", style="dashed" ];
+                 
+         
+subgraph cluster1 {
+       style=filled;
+       color=lightgrey;
+       label = "ILPD - Interface List Patient Dicom";
+
+       subgraph subgraph_ILPD_003 {
+               rank = "same";
+               _ILPDViewListPatient            [ label="ILPDViewListPatient "          URL="\ref ILPDViewListPatient"];
+               _ILPDViewWxWindow                       [ label="ILPDViewWxWindow "                     URL="\ref ILPDViewWxWindow "];
+               _ILPDViewMFC                            [ label="ILPDViewMFC "                          URL="\ref ILPDViewMFC "];
+       }               
+
+               _ILPDBaseView                           [ label="ILPDBaseView "                         URL="\ref ILPDBaseView "];
+               _wxILPD                                         [ label="wxILPD "                                       URL="\ref wxILPD "];
+               _mfcILPD                                        [ label="mfcILPD "                                      URL="\ref mfcILPD "];
+               _ILPD_MySQL                             [ label="ILPD_MySQL "                           URL="\ref ILPD_MySQL "];
+
+       subgraph subgraph_ILPD_004 {
+               rank = "same";
+               _ILPDBaseModel                          [ label="ILPDBaseModel "                        URL="\ref ILPDBaseModel "];
+               _ILPDBaseDB                             [ label="ILPDBaseDB "                           URL="\ref ILPDBaseDB "];
+       }
+
+               _MySql                                          [ label="MySql "                                        URL="\ref MySql "];
+               _ILPD_Oracle                            [ label="ILPD_Oracle "                          URL="\ref ILPD_Oracle "];
+               _Oracle                                         [ label="Oracle "                                       URL="\ref Oracle "];
+               _ILPDLectureLoic                        [ label="ILPDLectureLoic "                      URL="\ref ILPDLectureLoic "];
+               _ILPDLectureGDCM                        [ label="ILPDLectureGDCM "                      URL="\ref ILPDLectureGDCM "];
+               _GDCM                                           [ label="GDCM "                                         URL="\ref GDCM "];
+               _Loic                                           [ label="Loic "                                         URL="\ref Loic "];
+
+       subgraph subgraph_ILPD_005 {
+               rank = "same";
+               _ILPDModel                                      [ label="ILPDModel "                            URL="\ref ILPDModel "];
+               _ILPDBaseLecture                        [ label="ILPDBaseLecture "                      URL="\ref ILPDBaseLecture "];
+       }
+
+       subgraph subgraph_ILPD_006 {
+               rank    = "same";
+               rankdir = "LR";
+               _ILPDListPatient                        [ label="ILPDListPatient "                      URL="\ref ILPDListPatient "];
+               _ILPDPatient                            [ label="ILPDPatient"                           URL="\ref ILPDPatient "];
+               _ILPDStudy                                      [ label="ILPDStudy "                            URL="\ref ILPDStudy "];
+               _ILPDSeries                                     [ label="ILPDSeries "                           URL="\ref ILPDSeries "];
+               _ILPDImage                                      [ label="ILPDImage "                            URL="\ref ILPDImage "];
+       }
+               _ILPDBase                                       [ label="ILPDBase "                                     URL="\ref ILPDBase "];
+
+       subgraph subgraph_ILPD_007 {
+               rank = "same";
+               _ILPDNode                                       [ label="ILPDNode "                                     URL="\ref ILPDNode "];
+               _ILPDControlNode                        [ label="ILPDControlNode "                      URL="\ref ILPDControlNode "];
+       }
+               _ILPDControler                          [ label="ILPDControler "                        URL="\ref ILPDControler"];      
+
+
+       _ILPD_MySQL                     -> _ILPDBaseDB                          [ arrowhead="onormal"                              ];
+       _ILPDBaseModel                  -> _ILPDBaseDB                          [ arrowhead="open"      style="dashed"     ];
+
+       _ILPD_MySQL                     -> _MySql                                       [ arrowhead="open"      style="dashed"     ];
+       _ILPD_Oracle                    -> _Oracle                                      [ arrowhead="open"      style="dashed"     ];
+       _ILPD_Oracle                    -> _ILPDBaseDB                          [ arrowhead="onormal"                              ];
+       _ILPDLectureGDCM                -> _GDCM                                        [ arrowhead="open"      style="dashed"     ];
+       _ILPDLectureLoic                -> _Loic                                        [ arrowhead="open"      style="dashed"     ];
+       _ILPDLectureGDCM                -> _ILPDBaseLecture                     [ arrowhead="onormal"                              ];
+       _ILPDLectureLoic                -> _ILPDBaseLecture                     [ arrowhead="onormal"                              ];
+       _ILPDModel                              -> _ILPDBaseModel                       [ arrowhead="onormal"                              ];
+       _ILPDModel                              -> _ILPDBaseLecture                     [ arrowhead="open"      style="dashed"     ];
+       
+       _ILPDBaseModel                  -> _ILPDListPatient                     [ arrowhead="open", style="dashed" ];
+       _ILPDListPatient                -> _ILPDBase                            [ arrowhead="onormal"                      ];
+       _ILPDPatient                    -> _ILPDBase                            [ arrowhead="onormal"                      ];
+       _ILPDStudy                              -> _ILPDBase                            [ arrowhead="onormal"                      ];
+       _ILPDSeries                             -> _ILPDBase                            [ arrowhead="onormal"                      ];
+       _ILPDImage                              -> _ILPDBase                            [ arrowhead="onormal"                      ];
+       _ILPDBase                               -> _ILPDBase                            [ arrowhead="open", style="dashed" ];
+       _ILPDNode                               -> _ILPDBase                            [ arrowhead="open", style="dashed" ];
+       _ILPDNode                               -> _ILPDNode                            [ arrowhead="open", style="dashed" ];
+       _ILPDControlNode                -> _ILPDNode                            [ arrowhead="open", style="dashed" ];
+       _ILPDBaseView                   -> _ILPDControlNode                     [ arrowhead="open", style="dashed" ];
+
+       _ILPDControler                  -> _ILPDBaseView                        [ arrowhead="open", style="dashed" ];
+       _ILPDControler                  -> _ILPDModel                           [ arrowhead="open", style="dashed" ];
+       _ILPDBaseView                   -> _ILPDControler                       [ arrowhead="open", style="dashed" ];
+       _ILPDViewWxWindow               -> _ILPDBaseView                        [ arrowhead="onormal"                      ];
+       _ILPDViewMFC                    -> _ILPDBaseView                        [ arrowhead="onormal"                      ];
+       _ILPDViewWxWindow               -> _wxILPD                                      [ arrowhead="open", style="dashed" ];
+       _ILPDViewMFC                    -> _mfcILPD                                     [ arrowhead="open", style="dashed" ];
+       _wxILPD                                 -> _ILPDBaseView                        [ arrowhead="open", style="dashed" ];
+       _mfcILPD                                -> _ILPDBaseView                        [ arrowhead="open", style="dashed" ];
+       _ILPDViewListPatient    -> _ILPDModel                           [ arrowhead="open", style="dashed" ];
+       _ILPDViewListPatient    -> _ILPDControler                       [ arrowhead="open", style="dashed" ];
+       _ILPDViewListPatient    -> _ILPDBaseView                        [ arrowhead="open", style="dashed" ];
+ }
+
+
+}
+  \enddot
+
+
+
+ \section install Installation
+
+ \subsection step1 Step 1: Opening the box
+
+ etc...
+*/
+
+// ----------------------------------------------------------------------------
+// wx headers
+// ----------------------------------------------------------------------------
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#   include <wx/wx.h>
+#endif
+
+// ----------------------------------------------------------------------------
+// Local headers
+// ----------------------------------------------------------------------------
+#include "wxMaracasApp.h"
+#include "wxMaracasFrame.h"
+#include <wx/log.h>
+
+
+#ifdef __WXGTK__
+# include <locale.h>
+#endif
+
+// ----------------------------------------------------------------------------
+// This macro implements the entry point (main function) for the application
+// ----------------------------------------------------------------------------
+IMPLEMENT_APP( wxMaracasApp );
+
+// ----------------------------------------------------------------------------
+// The `main program' equivalent, creating the windows and returning the
+// main frame
+bool wxMaracasApp::OnInit( )
+{
+#ifdef __WXGTK__
+       //See http://www.wxwindows.org/faqgtk.htm#locale
+       setlocale(LC_NUMERIC, "C");
+#endif
+
+
+// PS -> #ifndef DXMM
+// PS ->       // GO !
+// PS ->       SetExitOnFrameDelete(true);
+// PS ->       m_pFrame->Show( true );
+// PS -> #else
+       SetExitOnFrameDelete(false);
+// PS -> #endif
+
+       return( true );
+}
+// ----------------------------------------------------------------------------
+int wxMaracasApp::OnExit(){
+       if (Initialized())
+       {
+               initialized=false;
+//             delete  _mar;
+               m_pFrame->Destroy();
+       }
+       ProcessIdle();
+
+//EEDxx2.4 DEBuG
+//     wxLogDebug("----------- Exiting application");
+//     wxLogDebug("---------------------------------------------------");
+
+       return true;
+}
+
+// ----------------------------------------------------------------------------
+void wxMaracasApp::Run(){
+
+       m_pFrame->Show( true );
+       wxCommandEvent cmdEvt=wxCommandEvent();
+       m_pFrame->OnStartExperiment(cmdEvt);
+       m_pFrame->Maximize(true);
+
+//EEDxx2.4 DEBuG
+//     wxLogDebug("----------- Running application");
+}
+
+// ----------------------------------------------------------------------------
+void wxMaracasApp::Reset(){
+       // TODO : we can make it more nicely
+//EEDxx2.4 DEBuG
+//     wxLogDebug("---------------------------------------------------");
+//     wxLogDebug("----------- Reseting application");
+//     wxLogDebug("---------------------------------------------------");
+       //OnExit();
+//     OnInit();
+       Initialize();
+}
+
+// ----------------------------------------------------------------------------
+void wxMaracasApp::Initialize(){
+#ifdef __WXDEBUG__
+       //static wxLogWindow * myLogWindow=new wxLogWindow(NULL,"Log Window",false,false);
+       static wxLogWindow * myLogWindow=new wxLogWindow(NULL,"Log Window",true,false);
+       wxLog::SetActiveTarget(myLogWindow);
+       myLogWindow->ClearTraceMasks();
+#endif
+//EEDxx2.4 DEBuG
+//     wxLogDebug("---------------------------------------------------");
+//     wxLogDebug("----------- Initialising application");
+
+
+       int nSize=_MAX_PATH;
+       LPTSTR lpFilename=(LPTSTR) (new char[nSize]);
+       GetModuleFileName(NULL,lpFilename,nSize);
+       
+       wxString moduleFileName(lpFilename);
+
+       wxString paramFileName=moduleFileName.BeforeLast('\\')
+               +wxString('\\')
+               +wxString(MAR_DEFAULT_FILE_PARAMETERS);
+
+       wxString dictionaryFileName=moduleFileName.BeforeLast('\\')
+               +wxString('\\')
+               +wxString(MAR_DEFAULT_FILE_DICTIONARY);
+
+       // Initialize MARACAS
+
+
+       _mar = new marInterface();
+       _mar->SetParamFileName(paramFileName.c_str());
+       _mar->loadParameters();
+       _marSimpleDicom = new marSimpleDicom( _mar->_parameters );
+       _mar->SetDicom(_marSimpleDicom);
+
+
+
+       // Create the main frame window
+       m_pFrame = new wxMaracasFrame( ( wxFrame* )NULL,  -1 , _mar , _marSimpleDicom ,(const char*)dictionaryFileName.mb_str());
+
+               
+       m_pFrame->Maximize( );
+       this->SetTopWindow( m_pFrame );
+       _mar->saveParameters( );
+
+       initialized=true;
+       SetExitOnFrameDelete(false);
+}
+
+// ----------------------------------------------------------------------------
+bool wxMaracasApp::Initialized(){
+       return initialized;
+}
+// PS -> #endif
+
+void wxMaracasApp::ShowFrame(int cmdShow)
+{
+//EEDxx2.4 DEBuG
+//     wxLogDebug("----------- Show Frame");
+       if (Initialized())
+       {
+               if ( SHOW_WINDOW_MINIMIZED == cmdShow )
+               {
+                       m_pFrame->Iconize();
+               }
+               else if ( SHOW_WINDOW_RESTORE == cmdShow )
+               {
+                       m_pFrame->Maximize(false);
+                       m_pFrame->Raise();
+               }
+               else if (SW_NORMAL == cmdShow )
+               {
+                       m_pFrame->Raise();
+               }
+               else if ( SHOW_WINDOW_MAXIMIZED == cmdShow )
+               {
+                       m_pFrame->Maximize(true);
+                       m_pFrame->Raise();
+               }
+               else
+               {
+                       m_pFrame->Raise();
+               }
+       }
+}
+
+
+void wxMaracasApp::SetVolumeData(int dimX, int dimY, int dimZ, 
+                                                                float spacingX,float spacingY, float spacingZ, 
+                                                                float rescaleSlope, float rescaleIntercept,
+                                                                unsigned short *pixels)
+{
+       if (Initialized())
+       {
+               _marSimpleDicom->SetInvestSliceOrder( _mar->_parameters->getInvestSliceOrder() );
+               _marSimpleDicom->SetVolumeData(dimX, dimY, dimZ,
+                                                                          spacingX, spacingY, spacingZ,
+                                                                          rescaleSlope, rescaleIntercept,
+                                                                          pixels);
+       }
+}
+
+wxBitmap*      wxMaracasApp::GetSnapshot(){
+       wxWindowDC *wxwindc = new wxWindowDC(m_pFrame);
+       wxCoord w, h;
+       wxwindc->GetSize(&w, &h);
+       wxBitmap *wxbitmap      = new wxBitmap(w, h);
+
+       wxMemoryDC *wxmemorydc = new wxMemoryDC();
+       wxmemorydc->SelectObject(*wxbitmap);
+       wxmemorydc->Blit(0,0,w,h,wxwindc,0,0);
+
+       delete wxwindc;
+       delete wxmemorydc;
+
+       return wxbitmap;
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp.h
new file mode 100644 (file)
index 0000000..927fd29
--- /dev/null
@@ -0,0 +1,69 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasApp.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__APP__H__
+#define __WX__MARACAS__APP__H__
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+#include <kernel/marInterface.h>
+#include "wxMaracasFrame.h"
+
+// 
+#define SHOW_WINDOW_NORMAL 0 
+#define SHOW_WINDOW_RESTORE 1
+#define SHOW_WINDOW_MINIMIZED 2
+#define SHOW_WINDOW_MAXIMIZED 3
+
+
+
+/** 
+ * \brief Maracas main application.
+ */
+class wxMaracasApp : public wxApp
+{
+public:
+       void SetVolumeData(int dimX,int dimY,int dimZ, 
+                              float spacingX, float spacingY, float spacingZ, 
+                                          float rescaleSlope, float rescaleIntercept,
+                                          unsigned short * pixels);
+       void            ShowFrame(int cmdShow);
+       bool            Initialized();
+       void            Reset();
+    bool               OnInit( );
+    int                        OnExit();
+       void            Run();
+       wxBitmap*       GetSnapshot();
+private:
+       bool                    initialized;
+    marInterface       *_mar;
+    marSimpleDicom     *_marSimpleDicom;
+       wxMaracasFrame* m_pFrame;
+       void Initialize();
+
+};
+
+#endif // __WX__MARACAS__APP__H__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp02.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp02.cxx
new file mode 100644 (file)
index 0000000..4504747
--- /dev/null
@@ -0,0 +1,253 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxMaracasApp02.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:09 $
+ Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+/**
+* \mainpage wxMaracas version wxWindows + gdcm
+*
+* \section intro Introduction
+*
+* This is the introduction.
+*
+* \section install Installation
+*
+* \subsection step1 Step 1: Opening the box
+*
+* etc...
+*/
+
+// ----------------------------------------------------------------------------
+// wx headers
+// ----------------------------------------------------------------------------
+#include "wx/wxprec.h"
+#include <wx/datetime.h>
+#ifndef WX_PRECOMP
+#   include <wx/wx.h>
+#endif
+
+#include <wx/log.h>
+
+
+// ----------------------------------------------------------------------------
+// Local headers
+// ----------------------------------------------------------------------------
+
+#include <vtkDebugLeaks.h> 
+
+
+#include "wxMaracasFrame02.h"
+#include "wxMaracasApp02.h"
+#include "marGdcmDicom.h"
+
+
+#ifdef __WXGTK__
+# include <locale.h>
+#endif
+
+
+
+
+//EED
+// http://lists.wxwidgets.org/archive/wx-dev/msg30449.html
+wxString getExecutablePath()
+{
+    char buf[512];
+    char* slash;
+
+#if defined(WIN32)
+    GetModuleFileName(NULL, buf, 511);
+    slash = strrchr(buf, '\\');
+    if (slash)
+    {
+        *slash = 0;
+    }
+#elif defined(__LINUX__)
+    int res;
+    res = readlink("/proc/self/exe", buf, 512);
+    if (res == -1)
+        return _T("");
+    buf[res] = 0;
+    slash = strrchr(buf, '/');
+    if (slash)
+    {
+        *slash = 0;
+    }
+#else
+    return "";
+#endif
+
+    return wxString(buf, wxConvUTF8 );
+}
+
+
+
+
+
+// ----------------------------------------------------------------------------
+// This macro implements the entry point (main function) for the application
+// ----------------------------------------------------------------------------
+IMPLEMENT_APP( wxMaracasApp02 );
+
+
+// ----------------------------------------------------------------------------
+// The `main program' equivalent, creating the windows and returning the
+// main frame
+bool wxMaracasApp02::OnInit( )
+{
+#ifdef __WXGTK__
+       //See http://www.wxwindows.org/faqgtk.htm#locale
+       setlocale(LC_NUMERIC, "C");
+#endif
+/*
+#ifdef __WXDEBUG__
+       //static wxLogWindow * myLogWindow=new wxLogWindow(NULL,"Log Window",false,false);
+       static wxLogWindow * myLogWindow=new wxLogWindow(NULL,"Log Window",true,false);
+       wxLog::SetActiveTarget(myLogWindow);
+       myLogWindow->ClearTraceMasks();
+#endif
+       wxLogDebug("---------------------------------------------------");
+       wxLogDebug("----------- Initialising application");
+*/
+//     int nSize=_MAX_PATH;
+//     LPTSTR lpFilename=(LPTSTR) (new char[nSize]);
+//     GetModuleFileName(NULL,lpFilename,nSize);
+//     wxString moduleFileName( lpFilename );
+
+       wxString moduleFileName = getExecutablePath();
+
+       wxString paramFileName=moduleFileName.BeforeLast( wxChar(92) )   // caracter '\'
+               +wxString( wxChar(92) )
+               +wxString( MAR_DEFAULT_FILE_PARAMETERS , wxConvUTF8 );
+       wxString dictionaryFileName=moduleFileName.BeforeLast( wxChar(92) )
+               +wxString( wxChar(92) )
+               +wxString( MAR_DEFAULT_FILE_DICTIONARY, wxConvUTF8 );
+
+       // Initialize MARACAS
+       _mar = new marInterface();
+
+       _mar->SetParamFileName( (const char*)(paramFileName.mb_str()) );
+       _mar->loadParameters();
+
+/*
+       // Initialize MARACASCT
+       _marCT = new marInterfaceCT();
+       _marCT->SetParamFileName(paramFileName.c_str());
+       _marCT->loadParameters();
+*/
+
+// EED ILPD
+
+//EED 4 oct 2006
+//     _mar->SetDicom( new marGdcmDicomILPD( _mar->_parameters ) );
+
+       //      _marCT->SetDicom( new marGdcmDicomILPD( _marCT->getParameters() ) );
+//     _mar->SetDicom( new marGdcmDicom( _mar->_parameters ) );
+
+/*
+//--
+       // Create the main frame window 
+       wxMaracasFrame02* frame = new wxMaracasFrame02( ( wxFrame* )NULL,  -1 , _mar, _marCT, (const char*)dictionaryFileName.mb_str());
+       frame->Show( true );
+       frame->Maximize( );
+       this->SetTopWindow( frame );
+
+
+       //If no dir was set for DICOM force user to set it !
+       wxString dirHome = _mar->_parameters->getStringParam(
+               marParameters::e_dicom_images_directory );
+       if( dirHome == "NO_DIRECTORY" || dirHome == "")
+       {
+//             _mar->_parameters->setStringParam(
+//                     marParameters::e_dicom_images_directory, "c:\\temp" );
+               
+               wxDirDialog dialog( frame, "Choose a DICOM directory...",
+                       ( !dirHome.IsEmpty( ) )? dirHome: wxGetHomeDir( ) );
+
+               if( dialog.ShowModal( ) == wxID_OK )
+               {
+                       _mar->_parameters->setStringParam(
+                               marParameters::e_dicom_images_directory, dialog.GetPath( ) );
+                       _marCT->getParameters()->setStringParam(
+                               marParameters::e_dicom_images_directory, dialog.GetPath( ) );
+
+                       
+               }
+               
+       }
+       else
+       {
+               _marCT->getParameters()->setStringParam(
+                       marParameters::e_dicom_images_directory, dirHome );
+
+       }
+
+
+       wxCommandEvent cmd;
+       frame->OnLoadPatientData( cmd );
+       _mar->saveParameters( );
+       _marCT->saveParameters( );
+//EED  initialized=true;
+
+
+// PS -> #ifndef DXMM
+// PS ->       // GO !
+// PS ->       SetExitOnFrameDelete(true);
+// PS ->       m_pFrame->Show( true );
+// PS -> #else
+//     SetExitOnFrameDelete(true);
+// PS -> #endif
+//--
+*/
+
+//--   
+
+        string tmpstring = (const char*) (dictionaryFileName.mb_str());
+       wxMaracasFrame03 *frame03 = new wxMaracasFrame03( (wxFrame*) NULL,  -1 , _mar, (char*)tmpstring.c_str() );
+       frame03->SetTitle(_T("Maracas - Evaluation version 1 July 2008 - Use limited to the research team - (Creatis-LRMN,Uniandes)"));
+
+       frame03->Show( true );
+       frame03->Maximize( );
+       this->SetTopWindow( frame03 );
+//--
+
+/*
+       wxDateTime date;
+       int year=date.GetCurrentYear();
+       int month=date.GetCurrentMonth()+1;
+       if (!((year==2006) && (month==01)))     
+       {
+               wxMessageDialog msg(frame03, "ERROR EED:1010", "Message box", wxOK );
+               msg.ShowModal();
+               return  false;
+       }
+*/
+
+       return( true );
+}
+// ----------------------------------------------------------------------------
+int wxMaracasApp02::OnExit(){
+
+
+       if (_mar!=NULL) { delete _mar; }
+
+
+//EED  vtkDebugLeaks::PrintCurrentLeaks  (    ) ;
+
+       return true;
+
+}
+
+// EOF - wxMaracasApp02.cxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp02.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasApp02.h
new file mode 100644 (file)
index 0000000..0f9dc73
--- /dev/null
@@ -0,0 +1,61 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasApp02.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__APP__02__H__
+#define __WX__MARACAS__APP__02__H__
+
+// ----------------------------------------------------------------------------
+// wx headers inclusion.
+// For compilers that support precompilation, includes <wx/wx.h>.
+// ----------------------------------------------------------------------------
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+#include <kernel/marInterface.h>
+
+
+
+
+
+/** 
+ * \brief Maracas main application.
+ */
+class wxMaracasApp02 : public wxApp
+{
+public:
+/*
+       void SetVolumeData(int dimX,int dimY,int dimZ, float spacingX, float spacingY, float spacingZ, unsigned short * pixels);
+       void ShowFrame(int cmdShow);
+       bool Initialized();
+       void Reset();
+       void Run();
+*/
+    bool OnInit( );
+    int  OnExit();
+private:
+    marInterface       *_mar;
+/*
+       bool                    initialized;
+       wxMaracasFrame* m_pFrame;
+*/
+};
+
+#endif // __WX__MARACAS__APP__H__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasDataBrowser.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasDataBrowser.cxx
new file mode 100644 (file)
index 0000000..87669d6
--- /dev/null
@@ -0,0 +1,389 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasDataBrowser.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasFrame02.h"
+#include "wxMaracasDataBrowser.h"
+
+#include "marGdcmDicom.h"
+
+
+#include "gdcmDocument.h"
+#include "gdcmDicomDir.h"
+#include "gdcmDicomDirPatient.h"
+#include "gdcmDicomDirStudy.h"
+#include "gdcmDicomDirSerie.h"
+#include "gdcmDicomDirImage.h"
+#include "gdcmTS.h"
+
+
+
+//-------------------------------------------------------------------------
+
+class wxDlgDefineRegionZ : public wxDialog {
+public :
+       wxDlgDefineRegionZ(wxWindow *parent,int maxSize, wxString title);
+       int  GetIniSlice();
+       int  GetEndSlice();
+       void OnIni(wxScrollEvent& event);
+       void OnEnd(wxScrollEvent& event);
+
+       wxSlider *sldIni;
+       wxSlider *sldEnd;
+private :
+};
+
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+
+wxDlgDefineRegionZ::wxDlgDefineRegionZ(wxWindow *parent,int maxSize, wxString title)
+: wxDialog(parent, -1, title){
+
+                               sldIni          = new wxSlider(this, -1, 0              , 0, maxSize, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );        
+                               sldEnd          = new wxSlider(this, -1, maxSize, 0, maxSize, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS );        
+       wxStaticText *text1             = new wxStaticText(this, -1, _T("Start : "));
+       wxStaticText *text2             = new wxStaticText(this, -1, _T("End : "));
+       wxButton        *btnOk          = new wxButton(this, wxID_OK , _T("OK"));
+       wxButton        *btnCancel      = new wxButton(this, wxID_CANCEL , _T("CANCEL"));
+
+       sldIni->SetSize(300,20);
+       sldEnd->SetSize(300,20);
+
+       wxFlexGridSizer *sizer = new wxFlexGridSizer(2);
+       sizer->Add(text1);
+       sizer->Add(sldIni);
+       sizer->Add(text2);
+       sizer->Add(sldEnd);
+       sizer->Add(btnOk);
+       sizer->Add(btnCancel);
+       this->SetSizer(sizer);
+       this->SetSize(450,200);
+
+       this->Connect(sldIni->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxDlgDefineRegionZ::OnIni );
+       this->Connect(sldEnd->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxDlgDefineRegionZ::OnEnd );
+}
+
+//-------------------------------------------------------------------------
+
+int wxDlgDefineRegionZ::GetIniSlice(){
+       return sldIni->GetValue();
+}
+
+//-------------------------------------------------------------------------
+
+int wxDlgDefineRegionZ::GetEndSlice(){
+       return sldEnd->GetValue();
+}
+
+//-------------------------------------------------------------------------
+
+void wxDlgDefineRegionZ::OnIni(wxScrollEvent& event){
+       if (sldIni->GetValue() > sldEnd->GetValue() ){
+        sldEnd->SetValue(sldIni->GetValue() );
+       }
+}
+
+//-------------------------------------------------------------------------
+
+void wxDlgDefineRegionZ::OnEnd(wxScrollEvent& event){
+       if (sldIni->GetValue() > sldEnd->GetValue() ){
+        sldIni->SetValue(sldEnd->GetValue() );
+       }
+}
+
+
+
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE( wxMaracasDataBrowser, wxPanel )
+    EVT_BUTTON( ID_BUTTON_CHANGEDIR                    , wxMaracasDataBrowser::OnChangeDir                     )
+    EVT_BUTTON( ID_BUTTON_CHANGEDICOMFILE      , wxMaracasDataBrowser::OnChangeDicomFile       )
+    EVT_BUTTON( ID_BUTTON_CREATEDICOMFILE      , wxMaracasDataBrowser::OnCreateDicomFile       )
+
+    EVT_LIST_ITEM_SELECTED(  ID_STUDIES_LIST, wxMaracasDataBrowser::OnStudySelected )
+    EVT_LIST_ITEM_SELECTED(  ID_SERIES_LIST    , wxMaracasDataBrowser::OnSerieSelected )
+    EVT_LIST_ITEM_ACTIVATED( ID_SERIES_LIST    , wxMaracasDataBrowser::OnActivated     )
+END_EVENT_TABLE( );
+
+//-------------------------------------------------------------------------
+wxMaracasDataBrowser::wxMaracasDataBrowser( wxFrame* parent, marInterface* mar, wxWindowID id )
+    : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL )
+{
+    _mar = mar;
+    frame_parent = parent;
+
+    _splitter = new wxSplitterWindow( this, -1, wxDefaultPosition, wxSize( 1200, 800 ), wxSP_3D );
+
+    _studies = new wxListCtrl( _splitter, ID_STUDIES_LIST, wxDefaultPosition, wxSize(100,100), wxLC_REPORT );
+    _studies->InsertColumn( 0, _T("Patient's name"      ));
+    _studies->InsertColumn( 1, _T("Patient's ID"        ));
+    _studies->InsertColumn( 2, _T("Study's name"        ));
+    _studies->InsertColumn( 3, _T("Study's ID"          ));
+    _studies->InsertColumn( 4, _T("Study's date"        ));
+    _studies->InsertColumn( 5, _T("Study's time"        ));
+    _studies->InsertColumn( 6, _T("Study's description" ));
+
+    _series = new wxListCtrl( _splitter, ID_SERIES_LIST, wxDefaultPosition,  wxSize(100,100), wxLC_REPORT );
+    _series->InsertColumn( 0, _T("Serie's name"         ));
+    _series->InsertColumn( 1, _T("Serie's ID"          ));
+    _series->InsertColumn( 2, _T("Serie's date"                ));
+    _series->InsertColumn( 3, _T("Serie's time"                ));
+    _series->InsertColumn( 4, _T("Modality"            ));
+    _series->InsertColumn( 5, _T("Body part examined"  ));
+    _series->InsertColumn( 6, _T("Serie's description"  ));
+    _series->InsertColumn( 7, _T("Serie's diagnostic"  ));
+    _series->InsertColumn( 8, _T("Institution name"    ));
+    _series->InsertColumn( 9, _T("Number of images"    ));
+
+    _splitter->SplitHorizontally( _studies, _series);
+
+       wxFlexGridSizer *szTop  = new wxFlexGridSizer( 1 );
+
+       wxButton *btnChangeDir = new wxButton(this,ID_BUTTON_CHANGEDIR,_T("Change Directory")) ;
+       wxButton *btnChangeDicomFile = new wxButton(this,ID_BUTTON_CHANGEDICOMFILE,_T("Change DICOMDIR file")) ;
+       wxButton *btnCreateDicomFile = new wxButton(this,ID_BUTTON_CREATEDICOMFILE,_T("Create DICOMDIR file")) ;
+
+       btnChangeDir->SetSize(150,25);
+       btnChangeDicomFile->SetSize(150,25);
+       btnCreateDicomFile->SetSize(150,25);
+
+    szTop->Add( btnChangeDicomFile     , 0 , wxALL, 10);
+    szTop->Add( btnCreateDicomFile     , 0 , wxALL, 10);
+    szTop->Add( btnChangeDir           , 0 , wxALL, 10);
+
+
+
+       wxFlexGridSizer *szVertical  = new wxFlexGridSizer( 2 );
+    szVertical->Add( szTop, 1, wxALL|wxEXPAND , 0 );
+    szVertical->Add( _splitter, 1, wxALL|wxEXPAND , 0 );
+
+    this->SetSizer( szVertical );
+    this->SetAutoLayout( true );
+       this->Layout();
+
+    szTop->Fit( this );
+    szTop->SetSizeHints( this );
+//    _splitter->SetMinimumPaneSize( 50 );
+       _splitter->SetSashPosition(500,true);
+
+       _parseDir=false;
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasDataBrowser::CreateDicomFile(){
+       marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom;
+       wxBusyCursor wait;
+       gdcmDicom->CreateDicomFile();
+}
+//-------------------------------------------------------------------------
+void wxMaracasDataBrowser::LoadData( ){
+       wxBusyCursor    wait;
+    long                       tmp;
+    int                                it = 0;
+
+    _studies->Hide( );                         
+       _series->Hide( );
+    _studies->DeleteAllItems( );       
+       _series->DeleteAllItems( );
+
+       marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom;
+       gdcmDicom->FillDicomInfo(_parseDir);
+       GDCM_NAME_SPACE::DicomDir                       *dicomDir = gdcmDicom->getGdcmDicomDir();
+       GDCM_NAME_SPACE::DicomDirPatient        *pa;
+       GDCM_NAME_SPACE::DicomDirStudy          *st;
+
+    pa = dicomDir->GetFirstPatient();
+       while (pa){ // on degouline les PATIENT de ce DICOMDIR
+         st = pa->GetFirstStudy();
+         while ( st ) { // on degouline les STUDY de ce patient
+                       tmp = _studies->InsertItem( it, wxString(pa->GetEntryString (0x0010, 0x0010).c_str(), wxConvUTF8) , 0 ); // Patient's Name
+                       _studies->SetItemData( tmp, it );
+                       _studies->SetItem( it, 1, wxString(pa->GetEntryString (0x0010, 0x0020).c_str(), wxConvUTF8) );  // ID_Patient_ID
+                       _studies->SetItem( it, 2, wxString(st->GetEntryString (0x0020, 0x000d).c_str(), wxConvUTF8) );  // ID_Study_Instance_UID 
+                       _studies->SetItem( it, 3, wxString(st->GetEntryString (0x0020, 0x0010).c_str(), wxConvUTF8) );  // ID_Study_ID
+                       _studies->SetItem( it, 4, wxString(st->GetEntryString (0x0008, 0x0020).c_str(), wxConvUTF8) );  // ID_Study_Date        
+                       _studies->SetItem( it, 5, wxString(st->GetEntryString (0x0008, 0x0030).c_str(), wxConvUTF8) );  // ID_Study_Time
+                       _studies->SetItem( it, 6, wxString(st->GetEntryString (0x0008, 0x1030).c_str(), wxConvUTF8) );  // ID_Study_Description
+                       it++;
+               st = pa->GetNextStudy();
+                }
+                pa = dicomDir->GetNextPatient(); 
+       }
+       
+    _studies->Show( ); _series->Show( );
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasDataBrowser::LoadDicomData(int type, wxString msg){
+       wxString dirHome = _mar->_parameters->getStringParam(
+               marParameters::e_dicom_images_directory );
+       wxDirDialog dialog( this, msg,
+                       ( !dirHome.IsEmpty( ) )? dirHome: wxGetHomeDir( ) );
+
+       if( dialog.ShowModal( ) == wxID_OK ){
+               _mar->_parameters->setStringParam(
+               marParameters::e_dicom_images_directory, dialog.GetPath( ) );
+               _mar->saveParameters( );
+               if (type==1){
+                       _parseDir=true;
+                       this->LoadData();
+               }
+               if (type==2){
+                       _parseDir=false;
+                       this->LoadData();
+               }
+               if (type==3){
+                       this->CreateDicomFile();
+                       _parseDir=false;
+                       this->LoadData();
+               }
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasDataBrowser::OnChangeDir( wxCommandEvent& event ){
+       this->LoadDicomData(1,_T("Choose a directory..."));
+}
+//----------------------------------------------------------------------------
+void wxMaracasDataBrowser::OnChangeDicomFile( wxCommandEvent& event ){
+       this->LoadDicomData(2,_T("Choose a DICOM directory..."));
+}
+//----------------------------------------------------------------------------
+void wxMaracasDataBrowser::OnCreateDicomFile( wxCommandEvent& event ){
+       this->LoadDicomData(3,_T("Create a DICOM file. Choose a directory..."));
+}
+//-------------------------------------------------------------------------
+void wxMaracasDataBrowser::OnStudySelected( wxListEvent& event ){
+    int it=0;
+    int maxCount=event.GetIndex();
+       marGdcmDicom                    *gdcmDicom = (marGdcmDicom*)_mar->_dicom;
+       GDCM_NAME_SPACE::DicomDir                       *dicomDir = gdcmDicom->getGdcmDicomDir();
+       GDCM_NAME_SPACE::DicomDirPatient        *pa;
+       GDCM_NAME_SPACE::DicomDirStudy          *st;
+       GDCM_NAME_SPACE::DicomDirSerie          *se;
+       GDCM_NAME_SPACE::DicomDirImage          *im;
+
+       bool ok=true;
+    pa = dicomDir->GetFirstPatient();
+       while ((pa) && (ok==true)){ // on degouline les PATIENT de ce DICOMDIR
+         st = pa->GetFirstStudy();
+         while ((st) && (ok==true)) { // on degouline les STUDY de ce patient
+                       if (it==maxCount) {
+                               gdcmDicom->setActualPatient( pa );
+                               gdcmDicom->setActualStudy( st );
+                               ok=false;
+                       }
+                       it++;
+                       if (ok==true) { 
+                               st = pa->GetNextStudy(); 
+                       }
+                }
+                pa = dicomDir->GetNextPatient(); 
+       }
+
+    _series->DeleteAllItems( );
+    long tmp;
+    it=0;
+
+       se = st->GetFirstSerie();
+       while ( se ) { // on degouline les SERIES de cette study
+        tmp = _series->InsertItem( it, wxString(se->GetEntryString(0x0020, 0x000e).c_str(), wxConvUTF8) , 0 ); // ID_Series_Instance_UID
+        _series->SetItemData( tmp, it );
+        _series->SetItem( it, 1, wxString(se->GetEntryString(0x0020, 0x0011).c_str(), wxConvUTF8 )); // ID_Series_Number
+        _series->SetItem( it, 2, wxString(se->GetEntryString(0x0008, 0x0021).c_str(), wxConvUTF8 )); // ID_Series_Date
+        _series->SetItem( it, 3, wxString(se->GetEntryString(0x0008, 0x0031).c_str(), wxConvUTF8 )); // ID_Series_Time
+        _series->SetItem( it, 4, wxString(se->GetEntryString(0x0008, 0x0060).c_str(), wxConvUTF8 )); // ID_Modality 
+        _series->SetItem( it, 5, wxString(se->GetEntryString(0x0018, 0x0015).c_str(), wxConvUTF8 )); // ID_Body_Part_Examined 
+        _series->SetItem( it, 6, wxString(se->GetEntryString(0x0008, 0x103e).c_str(), wxConvUTF8 )); // ID_Series_Description 
+//      _series->SetItem( it, 7, wxString(se->GetEntryString(0x0008, 0x1080).c_str(), wxConvUTF8 )); // ID_Admitting_Diagnoses_Description
+//     _series->SetItem( it, 8, wxString(se->GetEntryString(0x0008, 0x0080).c_str(), wxConvUTF8 )); // ID_Institution_Name
+               int numOfImg = 0;
+        im = se->GetFirstImage();
+        while ( im ) { // on degouline les Images de cette serie
+                       numOfImg++;
+                       im = se->GetNextImage();   
+               }
+               wxString strNumOfImg;
+               strNumOfImg.sprintf(_T("%d"),numOfImg);
+               _series->SetItem( it, 9, strNumOfImg ); // number of images in the serie
+
+               it++;
+        se = st->GetNextSerie();   
+       }
+
+  //re-disable
+  frame_parent->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, false);
+
+
+
+}
+//-------------------------------------------------------------------------
+void wxMaracasDataBrowser::OnSerieSelected( wxListEvent& event ){
+       marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom;
+       GDCM_NAME_SPACE::DicomDirStudy *st = gdcmDicom->getActualStudy();
+       GDCM_NAME_SPACE::DicomDirSerie *se;
+
+    int it       = 0;
+       int maxCount = event.GetIndex();
+    se = st->GetFirstSerie();
+       bool ok=true;
+    while ( (se)  && (ok==true) ) { // on degouline les SERIES de cette study
+               if (it==maxCount){
+                       gdcmDicom->setActualSerie(  se  );
+                       ok=false;
+               }
+               it++;
+        se = st->GetNextSerie();   
+       }
+    frame_parent->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, true);
+}
+//-------------------------------------------------------------------------
+void wxMaracasDataBrowser::OnActivated( wxListEvent& event )
+{
+
+       bool ok=false;
+       marGdcmDicom                    *gdcmDicom = (marGdcmDicom*)_mar->_dicom;
+       GDCM_NAME_SPACE::DicomDirSerie          *se;
+       GDCM_NAME_SPACE::DicomDirImage          *im;
+       int                                             numOfImg = 0;
+
+       se = gdcmDicom->getActualSerie();
+    im = se->GetFirstImage();
+    while ( im ) { // on degouline les Images de cette serie
+               numOfImg++;
+               im = se->GetNextImage();   
+       }
+
+       wxDlgDefineRegionZ *wxdlgdefineregionZ = new wxDlgDefineRegionZ(this,numOfImg, _T("Define Z region"));
+       if (wxdlgdefineregionZ->ShowModal() == wxID_OK ){
+               gdcmDicom->setIniSlice( wxdlgdefineregionZ->GetIniSlice() );
+               gdcmDicom->setEndSlice( wxdlgdefineregionZ->GetEndSlice() );
+               ok=true;
+       }
+       wxdlgdefineregionZ->Destroy();
+
+       if (ok==true){
+               wxCommandEvent _evt(  wxEVT_COMMAND_MENU_SELECTED ,ID_TOOLBAR_IMAGE_BROWSER   );
+               ProcessEvent(_evt);
+       }
+
+}
+// EOF - wxDataBrowser.cxx
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasDataBrowser.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasDataBrowser.h
new file mode 100644 (file)
index 0000000..364dea2
--- /dev/null
@@ -0,0 +1,70 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasDataBrowser.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__DATA__BROWSER__
+#define __WX__DATA__BROWSER__
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+#include <wx/listctrl.h>
+#include <wx/splitter.h>
+
+#include <kernel/marInterface.h>
+
+/**
+ * \brief Panel class showing patient name etc...
+ */
+class wxMaracasDataBrowser : public wxPanel
+{
+public:
+    wxMaracasDataBrowser( wxFrame* parent, marInterface* mar, wxWindowID id = -1 );
+
+    void LoadData( );
+       void CreateDicomFile( );
+
+       void LoadDicomData(int type, wxString msg);
+       void OnChangeDir( wxCommandEvent& event );
+       void OnChangeDicomFile( wxCommandEvent& event );
+       void OnCreateDicomFile( wxCommandEvent& event );
+    void OnStudySelected( wxListEvent& event );
+    void OnSerieSelected( wxListEvent& event );
+    void OnActivated( wxListEvent& event );
+
+private:
+
+       bool                            _parseDir;
+
+    wxSplitterWindow   *_splitter;
+    wxListCtrl                 *_studies;
+    wxListCtrl                 *_series;
+    marInterface               *_mar;
+    wxFrame                            *frame_parent;
+
+    DECLARE_EVENT_TABLE( );
+
+};
+
+enum
+{
+    ID_STUDIES_LIST                            = 0x2000,
+    ID_SERIES_LIST                             = 0x2001,
+    ID_BUTTON_CHANGEDIR                        = 0x2002,
+    ID_BUTTON_CHANGEDICOMFILE  = 0x2003,
+    ID_BUTTON_CREATEDICOMFILE  = 0x2004,
+};
+
+#endif // __WX__DATA__BROWSER__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel.cxx
new file mode 100644 (file)
index 0000000..961730f
--- /dev/null
@@ -0,0 +1,50 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasEmptyPanel.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasEmptyPanel.h"
+
+
+wxMaracasEmptyPanel::wxMaracasEmptyPanel( wxFrame* parent )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+  // Create the main frame window
+  _emptyPanel = new wxEmptyPanelWidget( this );
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( _emptyPanel, 1  , wxEXPAND |  wxALL , 0 );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracasEmptyPanel::~wxMaracasEmptyPanel( )
+{
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracasEmptyPanel::ConfigureVTK( vtkImageData *imagedata, int x, int y, int z )
+{
+  _emptyPanel->ConfigureVTK(imagedata,  x,  y,  z );
+}
+//----------------------------------------------------------------------------
+
+// EOF - wxMaracasEmptyPanel.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel.h
new file mode 100644 (file)
index 0000000..0c4d813
--- /dev/null
@@ -0,0 +1,41 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasEmptyPanel.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__EMPTY_PANEL__HXX__
+#define __WX__MARACAS__EMPTY_PANEL__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "widgets/wxEmptyPanelWidget.h"
+
+class wxMaracasEmptyPanel : public wxPanel
+{
+public:
+    wxMaracasEmptyPanel( wxFrame* parent);
+    ~wxMaracasEmptyPanel( );
+       void ConfigureVTK(vtkImageData *imagedata, int x, int y, int z);
+private:
+        wxEmptyPanelWidget* _emptyPanel;
+};
+
+#endif // __WX__MARACAS__MPR__HXX__
+
+// EOF - wxMaracasEmptyPanel.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_2.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_2.cxx
new file mode 100644 (file)
index 0000000..c8ae24b
--- /dev/null
@@ -0,0 +1,47 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasEmptyPanel_2.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasEmptyPanel_2.h"
+
+
+wxMaracasEmptyPanel_2::wxMaracasEmptyPanel_2( wxWindow* parent,marInterface *mar)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+  // Create the main frame window
+  _emptyPanel_2 = new wxEmptyPanelWidget_2( this,mar );
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( _emptyPanel_2, 1  , wxEXPAND |  wxALL , 0 );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracasEmptyPanel_2::~wxMaracasEmptyPanel_2( )
+{
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracasEmptyPanel_2::ConfigureVTK()
+{
+  _emptyPanel_2->ConfigureVTK();
+}
+//----------------------------------------------------------------------------
+
+// EOF - wxMaracasEmptyPanel.cxx
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_2.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_2.h
new file mode 100644 (file)
index 0000000..bae9bb9
--- /dev/null
@@ -0,0 +1,42 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasEmptyPanel_2.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:09 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__EMPTY_PANEL__2__HXX__
+#define __WX__MARACAS__EMPTY_PANEL__2__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "widgets/wxEmptyPanelWidget_2.h"
+
+
+class wxMaracasEmptyPanel_2 : public wxPanel
+{
+public:
+    wxMaracasEmptyPanel_2( wxWindow* parent,marInterface *mar);
+    ~wxMaracasEmptyPanel_2( );
+       void ConfigureVTK();
+private:
+        wxEmptyPanelWidget_2* _emptyPanel_2;
+};
+
+#endif // __WX__MARACAS__EMPTY_PANEL__2__HXX__
+
+// EOF - wxMaracasEmptyPanel.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_3.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_3.cxx
new file mode 100644 (file)
index 0000000..f0feddd
--- /dev/null
@@ -0,0 +1,867 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasEmptyPanel_3.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+
+#include "wxMaracasEmptyPanel_3.h"
+
+#include <gdcm.h> 
+#include <gdcmFile.h> 
+#include "vtkGdcmReader.h"
+#include <vtkTransform.h>
+#include "marGdcmDicom.h"
+#include <vtkMatrix4x4.h>
+
+#define PI 3.14159265358979323846
+
+wxMaracasEmptyPanel_3::wxMaracasEmptyPanel_3( wxWindow* parent  )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+  // Create the main frame window
+  _emptyPanel_3_Widget = new wxEmptyPanel_3_Widget( this);
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( _emptyPanel_3_Widget, 1  , wxEXPAND |  wxALL , 0 );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracasEmptyPanel_3::~wxMaracasEmptyPanel_3( )
+{
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracasEmptyPanel_3::ConfigureVTK( marImageData *marimagedata )
+{
+  _emptyPanel_3_Widget->ConfigureVTK(marimagedata);
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+
+
+
+void GetAng(double &angX,double &angY,double &angZ,double positionVec[])
+{
+//     double PI=3.14159265358979323846;
+       double x,y,z;
+       x = positionVec[0];
+       y = positionVec[1];
+       z = positionVec[2];
+
+       angZ = -atan2( y , x )*180/PI;
+       angY = -atan2( z , sqrt( x*x + y*y ) )*180/PI;
+
+
+       vtkTransform *transform = vtkTransform::New();
+       transform->Identity();
+       transform->RotateY( angY );
+       transform->RotateZ( angZ );
+
+       double in[4],out[4];
+       in[0] = positionVec[3];
+       in[1] = positionVec[4];
+       in[2] = positionVec[5];
+       in[3] = 1;
+
+       transform->MultiplyPoint(in,out);
+
+       transform->Delete();
+
+       x = out[0] ;
+       y = out[1] ;
+       z = out[2] ;
+       
+       angX =  -atan2(z,y)*180/PI;
+
+//--
+FILE *ff=fopen("c:/Temp/PIXEL_EED.txt","a+");
+
+       vtkTransform *transform2 = vtkTransform::New();
+       transform2->Identity();
+       transform2->RotateX( angX );
+       transform2->RotateY( -angY );
+       transform2->RotateZ( angZ );
+       in[0] = (double)positionVec[0];
+       in[1] = (double)positionVec[1];
+       in[2] = (double)positionVec[2];;
+       in[3] = 1;
+       transform2->MultiplyPoint(in,out);
+fprintf(ff,">>>> vx=( %f , %f , %f )  ",out[0],out[1],out[2]);
+
+       in[0] = (double)positionVec[3];
+       in[1] = (double)positionVec[4];
+       in[2] = (double)positionVec[5];
+       in[3] = 1;
+       transform2->MultiplyPoint(in,out);
+fprintf(ff,"vy=( %f , %f , %f )\n",out[0],out[1],out[2]);
+       transform2->Delete();
+fclose(ff);
+
+}
+
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE( wxMaracasEmptyPanel_4, wxPanel )
+       EVT_MENU( 12121, wxMaracasEmptyPanel_4::OnRefreshView )
+       EVT_MENU( 12122, wxMaracasEmptyPanel_4::OnDClickLeft  )
+END_EVENT_TABLE( );
+
+
+wxMaracasEmptyPanel_4::wxMaracasEmptyPanel_4( wxWindow* parent )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+       _vtkbasedata1                                           = NULL;
+       _vtkbasedata2                                           = NULL;
+       _wxvtk2Dbaseview1                                       = NULL;
+       _wxvtk2Dbaseview2                                       = NULL;
+
+       wxSplitterWindow * splitPanel = new wxSplitterWindow(this,-1);
+       wxPanel *imagePanel             = CreateImagePanel(splitPanel);
+       wxPanel *panelControl   = CreateControlPanel_Algo(splitPanel);
+
+       splitPanel->SplitVertically( imagePanel ,  panelControl , 2 );
+//     splitPanel->FitInside();
+
+
+         // Create the main frame window
+       wxBoxSizer* szTop = new wxBoxSizer( wxHORIZONTAL );
+       szTop->Add( splitPanel  , 1  , wxEXPAND |  wxALL , 0 );
+       szTop->Fit( this );
+       szTop->SetSizeHints( this );
+       this->SetAutoLayout( true );
+       this->SetSizer( szTop );
+       this->Layout();
+}
+
+//----------------------------------------------------------------------------
+
+wxMaracasEmptyPanel_4::~wxMaracasEmptyPanel_4()
+{
+       delete  _wxvtk2Dbaseview1;       
+       delete  _wxvtk2Dbaseview2;       
+//     delete  _vtkbasedata1;           
+//     delete  _vtkbasedata2;  
+}
+
+
+
+//----------------------------------------------------------------------------
+
+wxPanel* wxMaracasEmptyPanel_4::CreateImagePanel(wxWindow *parent)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       _panelImage1                                            = new wxPanel(panel,-1);
+       _panelImage2                                            = new wxPanel(panel,-1);
+
+       wxBoxSizer                      *topsizer1              = new wxBoxSizer(wxVERTICAL  );
+       _panelImage1->SetSizer(topsizer1);
+
+       wxBoxSizer                      *topsizer2              = new wxBoxSizer(wxVERTICAL  );
+       _panelImage2->SetSizer(topsizer2);
+
+         // Create the main frame window
+       wxBoxSizer* szTop = new wxBoxSizer( wxHORIZONTAL );
+       szTop->Add( _panelImage1  , 1  , wxEXPAND |  wxALL , 0 );
+       szTop->Add( _panelImage2  , 1  , wxEXPAND |  wxALL , 0 );
+       szTop->Fit( panel );
+       szTop->SetSizeHints( panel );
+       panel->SetAutoLayout( true );
+       panel->SetSizer( szTop );
+       panel->Layout();
+       return panel;
+
+}
+
+
+//----------------------------------------------------------------------------
+
+wxPanel* wxMaracasEmptyPanel_4::CreateControlPanel_Algo(wxWindow *parent)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       wxBoxSizer                      *szTop          = new wxBoxSizer(wxVERTICAL  );
+
+       _rb1 = new wxRadioButton(panel,-1,_T("Algo. 1"));
+       _rb2 = new wxRadioButton(panel,-1,_T("Algo. 2"));
+       _rb3 = new wxRadioButton(panel,-1,_T("Algo. 3"));
+
+       _rb1->SetValue(true);
+
+       szTop->Add( _rb1  , 1  , wxEXPAND |  wxALL , 0 );
+       szTop->Add( _rb2  , 1  , wxEXPAND |  wxALL , 0 );
+       szTop->Add( _rb3  , 1  , wxEXPAND |  wxALL , 0 );
+       szTop->Fit( parent );
+       szTop->SetSizeHints( parent );
+       panel->SetAutoLayout( true );
+       panel->SetSizer( szTop );
+       panel->Layout();
+
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasEmptyPanel_4::OnRefreshView(wxCommandEvent & event) // virtual
+{
+
+       int pIn[4],pOut[4]; 
+       pIn[0] = (int)(_vtkbasedata1->GetX());
+       pIn[1] = (int)(_vtkbasedata1->GetY());
+       pIn[2] = (int)(_vtkbasedata1->GetZ());
+       pIn[2] = 0;
+       pIn[3] = 1;
+
+       if (_rb1->GetValue()==true)
+       {
+               TranformPixel1(pIn,pOut, &_infoImg1,&_infoImg2);
+       }
+       if (_rb2->GetValue()==true)
+       {
+               TranformPixel2(pIn,pOut, &_infoImg1,&_infoImg2);
+       }
+       if (_rb3->GetValue()==true)
+       {
+               TranformPixel3(pIn,pOut, &_infoImg1,&_infoImg2);
+       }
+
+
+FILE *ff=fopen("c:/Temp/PIXEL_EED.txt","a+");
+fprintf(ff,"-) %d %d %d \n"    ,pIn[0] ,pIn[1] ,pIn[2]         );
+fprintf(ff,"1) %d %d %d \n"    ,pOut[0],pOut[1],pOut[2]        );
+//TranformPixel2(pIn,pOut, &_infoImg1,&_infoImg2);
+//fprintf(ff,"2) %d %d %d \n\n"        ,pOut[0],pOut[1],pOut[2]        );
+fclose(ff);
+
+       _vtkbasedata2->SetX( pOut[0] );
+       _vtkbasedata2->SetY( pOut[1] );
+       _vtkbasedata2->SetZ( 0 );
+
+
+
+       if (_wxvtk2Dbaseview1!=NULL) 
+       {
+               _wxvtk2Dbaseview1->RefreshView();
+       }
+       if (_wxvtk2Dbaseview2!=NULL) 
+       {
+               _wxvtk2Dbaseview2->Refresh();
+               _wxvtk2Dbaseview2->RefreshView();
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasEmptyPanel_4::OnDClickLeft(wxCommandEvent & event) // virtual
+{
+}
+//----------------------------------------------------------------------------
+void wxMaracasEmptyPanel_4::ConfigureVTK( )
+{
+       char filename1[255];
+       char filename2[255];
+       FILE *ff=fopen("c:/temp/filename.txt","r");
+       fscanf(ff, "%s ",filename1);
+       fscanf(ff, "%s ",filename2);
+       fclose(ff);
+
+       ConfigureImage(filename1,_panelImage1,1);
+       ConfigureImage(filename2,_panelImage2,2);
+}
+//----------------------------------------------------------------------------
+void wxMaracasEmptyPanel_4::ConfigureImage( char *fileName,wxPanel *panelImage, int ventana)
+{
+       vtkMPRBaseData *vtkbasedata;
+       wxVtkMPR2DView *wxvtk2Dbaseview;
+
+       struct InfoImag * infoImage;
+
+       if (ventana==1)
+       {
+               vtkbasedata             = _vtkbasedata1;
+               wxvtk2Dbaseview = _wxvtk2Dbaseview1;
+               infoImage=&_infoImg1;
+       } else {
+               vtkbasedata             = _vtkbasedata2;
+               wxvtk2Dbaseview = _wxvtk2Dbaseview2;
+               infoImage=&_infoImg2;
+       }
+
+       // Read header file
+       GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New();
+       gdcmFile->SetLoadMode( GDCM_NAME_SPACE::LD_NOSHADOW );
+       gdcmFile->SetFileName( fileName );
+       bool ok = gdcmFile->Load();
+       long int offset = gdcmFile->GetPixelOffset(); 
+       int dim[3];
+       dim[0]=gdcmFile->GetXSize();
+       dim[1]=gdcmFile->GetYSize();
+       dim[2]=1; 
+
+       infoImage->Spacing[0]=gdcmFile->GetXSpacing();
+       infoImage->Spacing[1]=gdcmFile->GetYSpacing();
+       infoImage->ImPoPa[0]=gdcmFile->GetXOrigin();
+       infoImage->ImPoPa[1]=gdcmFile->GetYOrigin();
+       infoImage->ImPoPa[2]=gdcmFile->GetZOrigin();
+
+       float iop[6];
+       gdcmFile->GetImageOrientationPatient(iop);
+       infoImage->ImOrPa[0]=iop[0];
+       infoImage->ImOrPa[1]=iop[1];
+       infoImage->ImOrPa[2]=iop[2];
+       infoImage->ImOrPa[3]=iop[3];
+       infoImage->ImOrPa[4]=iop[4];
+       infoImage->ImOrPa[5]=iop[5];
+       
+
+       gdcmFile->Delete();
+
+       // Memory allocation
+       vtkImageData *imageData =       vtkImageData::New();
+       imageData->SetDimensions ( dim );
+       imageData->SetScalarTypeToUnsignedShort();
+       imageData->AllocateScalars();    
+       imageData->Update();  
+       marImageData *marimagedata = new marImageData(imageData);
+
+       // Read Image
+       marGdcmDicom margdcmdicom;
+       void *p_vol = imageData->GetScalarPointer(0,0,0);
+       margdcmdicom.loadFileDicom( p_vol , dim , fileName );
+       
+       if (vtkbasedata)                { delete vtkbasedata;     } 
+       if (wxvtk2Dbaseview)    { delete wxvtk2Dbaseview; } 
+
+       vtkbasedata             = new vtkMPRBaseData(); 
+
+wxWidgetMesure2D *widgetMesure = new wxWidgetMesure2D(panelImage);
+wxvtk2Dbaseview        = new wxVtkMPR2DView( widgetMesure,2 );
+
+//     wxvtk2Dbaseview = new wxVtkMPR2DView( panelImage,2 );
+
+
+       vtkbasedata->SetMarImageData( marimagedata );
+       wxvtk2Dbaseview->SetVtkBaseData(vtkbasedata);
+       wxvtk2Dbaseview->Configure();
+
+       widgetMesure                                    ->      ConfigureA(wxvtk2Dbaseview);
+       widgetMesure                                    ->      SetMesureScale( infoImage->Spacing[0] );
+
+
+       wxVTKRenderWindowInteractor *imagePanel = wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor();       
+
+       vtkbasedata->SetX( dim[0]/2 );
+       vtkbasedata->SetY( dim[1]/2 );
+       vtkbasedata->SetZ( 0 );
+
+       wxSizer *sizer=panelImage->GetSizer();
+//     sizer-> Add( imagePanel ,1,wxGROW  ,0);
+       sizer-> Add( widgetMesure ,1,wxGROW  ,0);
+
+       panelImage->SetAutoLayout(true);
+       panelImage->Layout();  
+
+       wxvtk2Dbaseview->Refresh();
+
+       if (ventana==1)
+       {
+               _vtkbasedata1           = vtkbasedata;
+               _wxvtk2Dbaseview1       = wxvtk2Dbaseview;
+               _widgetMesure1          = widgetMesure;
+       } else {
+               _vtkbasedata2           = vtkbasedata;
+               _wxvtk2Dbaseview2       = wxvtk2Dbaseview;
+               _widgetMesure2          = widgetMesure;
+       }
+}
+
+
+
+//-----------------------------------------------------------------------------
+
+
+void wxMaracasEmptyPanel_4::TranformPixel1(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2)
+{
+       vtkTransform *transform = vtkTransform::New();
+       transform->Identity();
+
+       double ang1X,ang1Y,ang1Z;
+       double ang2X,ang2Y,ang2Z;
+       double in[4],out[4];
+       
+       GetAng(ang1X,ang1Y,ang1Z,infoImg1->ImOrPa);
+       GetAng(ang2X,ang2Y,ang2Z,infoImg2->ImOrPa);
+
+       // Transformation
+       transform->Scale( 1/infoImg2->Spacing[0] , 1/infoImg2->Spacing[1] , 1 );
+       transform->RotateX( ang2X );
+       transform->RotateY( -ang2Y );
+       transform->RotateZ( ang2Z );
+       transform->Translate( -infoImg2->ImPoPa[0] ,  -infoImg2->ImPoPa[1] ,  -infoImg2->ImPoPa[2] );
+       transform->Translate( infoImg1->ImPoPa[0] ,  infoImg1->ImPoPa[1] ,  infoImg1->ImPoPa[2] );
+       transform->RotateZ( -ang1Z );
+       transform->RotateY( ang1Y );
+       transform->RotateX( -ang1X );
+       transform->Scale(       infoImg1->Spacing[0]    ,       infoImg1->Spacing[1]    ,       1       );
+
+       in[0] = (double)pIn[0];
+       in[1] = (double)pIn[1];
+       in[2] = 0;
+       in[3] = 1;
+
+       transform->MultiplyPoint(in,out);
+
+       transform->Delete();
+
+       pOut[0] = (int)(out[0] + 0.5);
+       pOut[1] = (int)(out[1] + 0.5);
+       pOut[2] = (int)(out[2] + 0.5);
+}
+
+
+
+//-----------------------------------------------------------------------------
+
+void wxMaracasEmptyPanel_4::TranformPixel2(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2)
+{
+       double in[4],out[4];
+
+       //Scale 1
+       double src_pos_x = (double)pIn[0] * infoImg1->Spacing[0];
+       double src_pos_y = (double)pIn[1] * infoImg1->Spacing[1];
+       double src_pos_z = (double)pIn[2] * 1;
+
+
+
+//Rotation 1
+double dst_nrm_dircos_x;
+double dst_nrm_dircos_y;
+double dst_nrm_dircos_z;
+
+double dst_pos_x;
+double dst_pos_y;
+double dst_pos_z;
+
+double dst_row_dircos_x = infoImg1->ImOrPa[0];
+double dst_row_dircos_y = infoImg1->ImOrPa[1];
+double dst_row_dircos_z = infoImg1->ImOrPa[2];
+
+double dst_col_dircos_x = infoImg1->ImOrPa[3];
+double dst_col_dircos_y = infoImg1->ImOrPa[4];
+double dst_col_dircos_z = infoImg1->ImOrPa[5];
+
+dst_nrm_dircos_x = dst_row_dircos_y * dst_col_dircos_z - dst_row_dircos_z * dst_col_dircos_y; 
+dst_nrm_dircos_y = dst_row_dircos_z * dst_col_dircos_x - dst_row_dircos_x * dst_col_dircos_z; 
+dst_nrm_dircos_z = dst_row_dircos_x * dst_col_dircos_y - dst_row_dircos_y * dst_col_dircos_x; 
+
+
+dst_pos_x = dst_row_dircos_x * src_pos_x
+          + dst_row_dircos_y * src_pos_y
+          + dst_row_dircos_z * src_pos_z;
+
+dst_pos_y = dst_col_dircos_x * src_pos_x
+          + dst_col_dircos_y * src_pos_y
+          + dst_col_dircos_z * src_pos_z;
+
+dst_pos_z = dst_nrm_dircos_x * src_pos_x
+          + dst_nrm_dircos_y * src_pos_y
+          + dst_nrm_dircos_z * src_pos_z;
+
+//Translation 1
+dst_pos_x = dst_pos_x + infoImg1->ImPoPa[0];
+dst_pos_y = dst_pos_y + infoImg1->ImPoPa[1];
+dst_pos_z = dst_pos_z + infoImg1->ImPoPa[2];
+
+//Tranalacion  - 2
+dst_pos_x = dst_pos_x - infoImg2->ImPoPa[0];
+dst_pos_y = dst_pos_y - infoImg2->ImPoPa[1];
+dst_pos_z = dst_pos_z - infoImg2->ImPoPa[2];
+
+
+//Rotation - 2
+dst_row_dircos_x = infoImg2->ImOrPa[0];
+dst_row_dircos_y = infoImg2->ImOrPa[1];
+dst_row_dircos_z = infoImg2->ImOrPa[2];
+
+dst_col_dircos_x = infoImg2->ImOrPa[3];
+dst_col_dircos_y = infoImg2->ImOrPa[4];
+dst_col_dircos_z = infoImg2->ImOrPa[5];
+
+dst_nrm_dircos_x = dst_row_dircos_y * dst_col_dircos_z - dst_row_dircos_z * dst_col_dircos_y; 
+dst_nrm_dircos_y = dst_row_dircos_z * dst_col_dircos_x - dst_row_dircos_x * dst_col_dircos_z; 
+dst_nrm_dircos_z = dst_row_dircos_x * dst_col_dircos_y - dst_row_dircos_y * dst_col_dircos_x; 
+
+
+in[0] = dst_pos_x;
+in[1] = dst_pos_y;
+in[2] = dst_pos_z;
+in[3] = 1;
+vtkMatrix4x4 *mat=vtkMatrix4x4::New();
+mat->Identity ();
+
+/*
+mat->SetElement(0,0,dst_row_dircos_x);
+mat->SetElement(0,1,dst_row_dircos_y);
+mat->SetElement(0,2,dst_row_dircos_z);
+mat->SetElement(0,3,0);
+
+mat->SetElement(1,0,dst_col_dircos_x);
+mat->SetElement(1,1,dst_col_dircos_y);
+mat->SetElement(1,2,dst_col_dircos_z);
+mat->SetElement(1,3,0);
+
+mat->SetElement(2,0,dst_nrm_dircos_x);
+mat->SetElement(2,1,dst_nrm_dircos_y);
+mat->SetElement(2,2,dst_nrm_dircos_z);
+mat->SetElement(2,3,0);
+
+mat->SetElement(3,0,0);
+mat->SetElement(3,1,0);
+mat->SetElement(3,2,0);
+mat->SetElement(3,3,1);
+
+*/
+
+mat->SetElement(0,0,dst_row_dircos_x);
+mat->SetElement(1,0,dst_row_dircos_y);
+mat->SetElement(2,0,dst_row_dircos_z);
+mat->SetElement(3,0,0);
+
+mat->SetElement(0,1,dst_col_dircos_x);
+mat->SetElement(1,1,dst_col_dircos_y);
+mat->SetElement(2,1,dst_col_dircos_z);
+mat->SetElement(3,1,0);
+
+mat->SetElement(0,2,dst_nrm_dircos_x);
+mat->SetElement(1,2,dst_nrm_dircos_y);
+mat->SetElement(2,2,dst_nrm_dircos_z);
+mat->SetElement(3,2,0);
+
+mat->SetElement(0,3,0);
+mat->SetElement(1,3,0);
+mat->SetElement(2,3,0);
+mat->SetElement(3,3,1);
+
+
+
+
+/*
+vtkTransform *transform2 = vtkTransform::New();
+transform2->Identity();
+transform2->SetMatrix(mat);
+transform2->Update();
+*/
+
+
+vtkMatrix4x4 *matB                     = vtkMatrix4x4::New();
+vtkTransform *transform3       = vtkTransform::New();
+matB->Identity ();
+mat->Invert(mat,matB);
+//transform2->GetInverse(matB);
+transform3->SetMatrix(matB);
+transform3->Update();
+
+double res=0;
+FILE *hh=fopen("c:/Temp/Matrix.txt","w");
+for (int i=0; i<4; i++)
+{
+       for (int j=0; j<4; j++)
+       {
+               res=0;
+               for (int ii=0;ii<4;ii++)
+               {
+                       res = res + mat->GetElement(ii,j) * matB->GetElement(i,ii);
+               }
+       fprintf(hh,"%f ",res);
+       }
+}
+fclose(hh);
+
+transform3->MultiplyPoint(in,out);
+transform3->Delete();
+mat->Delete();
+matB->Delete();
+
+       //Scale 1/2
+out[0] = out[0] / infoImg2->Spacing[0];
+out[1] = out[1] / infoImg2->Spacing[1];
+out[2] = out[2] / 1.0;
+
+//--
+
+pOut[0] = (int)(out[0] + 0.5);
+pOut[1] = (int)(out[1] + 0.5);
+pOut[2] = (int)(out[2] + 0.5);
+}
+
+
+
+//-----------------------------------------------------------------------------
+
+void wxMaracasEmptyPanel_4::TranformPixel2a(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2)
+{
+       double in[4],out[4];
+
+       //Scale 1
+       double src_pos_x = (double)pIn[0] * infoImg1->Spacing[0];
+       double src_pos_y = (double)pIn[1] * infoImg1->Spacing[1];
+       double src_pos_z = (double)pIn[2] * 1;
+
+
+
+//Rotation 1
+double dst_nrm_dircos_x;
+double dst_nrm_dircos_y;
+double dst_nrm_dircos_z;
+
+double dst_pos_x;
+double dst_pos_y;
+double dst_pos_z;
+
+double dst_row_dircos_x = infoImg1->ImOrPa[0];
+double dst_row_dircos_y = infoImg1->ImOrPa[1];
+double dst_row_dircos_z = infoImg1->ImOrPa[2];
+
+double dst_col_dircos_x = infoImg1->ImOrPa[3];
+double dst_col_dircos_y = infoImg1->ImOrPa[4];
+double dst_col_dircos_z = infoImg1->ImOrPa[5];
+
+dst_nrm_dircos_x = dst_row_dircos_y * dst_col_dircos_z - dst_row_dircos_z * dst_col_dircos_y; 
+dst_nrm_dircos_y = dst_row_dircos_z * dst_col_dircos_x - dst_row_dircos_x * dst_col_dircos_z; 
+dst_nrm_dircos_z = dst_row_dircos_x * dst_col_dircos_y - dst_row_dircos_y * dst_col_dircos_x; 
+
+in[0] = src_pos_x;
+in[1] = src_pos_y;
+in[2] = src_pos_z;
+in[3] = 0;
+vtkMatrix4x4 *mat=vtkMatrix4x4::New();
+
+mat->SetElement(0,0,dst_row_dircos_x);
+mat->SetElement(0,1,dst_row_dircos_y);
+mat->SetElement(0,2,dst_row_dircos_z);
+mat->SetElement(0,3,0);
+
+mat->SetElement(1,0,dst_col_dircos_x);
+mat->SetElement(1,1,dst_col_dircos_y);
+mat->SetElement(1,2,dst_col_dircos_z);
+mat->SetElement(1,3,0);
+
+mat->SetElement(2,0,dst_nrm_dircos_x);
+mat->SetElement(2,1,dst_nrm_dircos_y);
+mat->SetElement(2,2,dst_nrm_dircos_z);
+mat->SetElement(2,3,0);
+
+mat->SetElement(3,0,0);
+mat->SetElement(3,1,0);
+mat->SetElement(3,2,0);
+mat->SetElement(3,3,1);
+
+/*
+
+mat->SetElement(0,0,dst_row_dircos_x);
+mat->SetElement(1,0,dst_row_dircos_y);
+mat->SetElement(2,0,dst_row_dircos_z);
+mat->SetElement(3,0,0);
+
+mat->SetElement(0,1,dst_col_dircos_x);
+mat->SetElement(1,1,dst_col_dircos_y);
+mat->SetElement(2,1,dst_col_dircos_z);
+mat->SetElement(3,1,0);
+
+mat->SetElement(0,2,dst_nrm_dircos_x);
+mat->SetElement(1,2,dst_nrm_dircos_y);
+mat->SetElement(2,2,dst_nrm_dircos_z);
+mat->SetElement(3,2,0);
+
+mat->SetElement(0,3,0);
+mat->SetElement(1,3,0);
+mat->SetElement(2,3,0);
+mat->SetElement(3,3,1);
+*/
+
+vtkMatrix4x4 *matB                     = vtkMatrix4x4::New();
+vtkTransform *transform3       = vtkTransform::New();
+mat->Invert(mat,matB);
+transform3->SetMatrix(matB);
+transform3->Update();
+
+double res=0;
+FILE *hh=fopen("c:/Temp/Matrix.txt","w");
+for (int i=0; i<4; i++)
+{
+       for (int j=0; j<4; j++)
+       {
+               res=0;
+               for (int ii=0;ii<4;ii++)
+               {
+                       res = res + mat->GetElement(ii,j) * matB->GetElement(i,ii);
+               }
+       fprintf(hh,"%f ",res);
+       }
+}
+fclose(hh);
+
+transform3->MultiplyPoint(in,out);
+transform3->Delete();
+mat->Delete();
+matB->Delete();
+
+
+//Translation 1
+dst_pos_x = out[0] + infoImg1->ImPoPa[0];
+dst_pos_y = out[0] + infoImg1->ImPoPa[1];
+dst_pos_z = out[0] + infoImg1->ImPoPa[2];
+
+//Tranalacion  - 2
+src_pos_x = dst_pos_x - infoImg2->ImPoPa[0];
+src_pos_y = dst_pos_y - infoImg2->ImPoPa[1];
+src_pos_z = dst_pos_z - infoImg2->ImPoPa[2];
+
+
+
+
+//Rotation - 2
+dst_row_dircos_x = infoImg2->ImOrPa[0];
+dst_row_dircos_y = infoImg2->ImOrPa[1];
+dst_row_dircos_z = infoImg2->ImOrPa[2];
+
+dst_col_dircos_x = infoImg2->ImOrPa[3];
+dst_col_dircos_y = infoImg2->ImOrPa[4];
+dst_col_dircos_z = infoImg2->ImOrPa[5];
+
+dst_nrm_dircos_x = dst_row_dircos_y * dst_col_dircos_z - dst_row_dircos_z * dst_col_dircos_y; 
+dst_nrm_dircos_y = dst_row_dircos_z * dst_col_dircos_x - dst_row_dircos_x * dst_col_dircos_z; 
+dst_nrm_dircos_z = dst_row_dircos_x * dst_col_dircos_y - dst_row_dircos_y * dst_col_dircos_x; 
+
+
+dst_pos_x = dst_row_dircos_x * src_pos_x
+          + dst_row_dircos_y * src_pos_y
+          + dst_row_dircos_z * src_pos_z;
+
+dst_pos_y = dst_col_dircos_x * src_pos_x
+          + dst_col_dircos_y * src_pos_y
+          + dst_col_dircos_z * src_pos_z;
+
+dst_pos_z = dst_nrm_dircos_x * src_pos_x
+          + dst_nrm_dircos_y * src_pos_y
+          + dst_nrm_dircos_z * src_pos_z;
+
+
+
+       //Scale 1/2
+out[0]=dst_pos_x / infoImg2->Spacing[0];
+out[1]=dst_pos_y / infoImg2->Spacing[1];
+out[2]=dst_pos_z / 1.0;
+
+//--
+
+pOut[0] = (int)(out[0] + 0.5);
+pOut[1] = (int)(out[1] + 0.5);
+pOut[2] = (int)(out[2] + 0.5);
+}
+
+
+//----------------------------------------------------------------------------
+
+
+void wxMaracasEmptyPanel_4::TranformPixel3(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2)
+{
+
+       manualPoint *p1a = _widgetMesure1->GetManualContourModel()->GetManualPoint(0);  
+       manualPoint *p1b = _widgetMesure1->GetManualContourModel()->GetManualPoint(1);  
+
+       manualPoint *p2a = _widgetMesure2->GetManualContourModel()->GetManualPoint(0);  
+       manualPoint *p2b = _widgetMesure2->GetManualContourModel()->GetManualPoint(1);  
+
+    double pp1aX = p1a->GetX() * infoImg1->Spacing[0];
+    double pp1aY = p1a->GetY() * infoImg1->Spacing[1];
+    double pp1bX = p1b->GetX() * infoImg1->Spacing[0];
+    double pp1bY = p1b->GetY() * infoImg1->Spacing[1];
+
+    double pp2aX = p2a->GetX() * infoImg2->Spacing[0];
+    double pp2aY = p2a->GetY() * infoImg2->Spacing[1];
+    double pp2bX = p2b->GetX() * infoImg2->Spacing[0];
+    double pp2bY = p2b->GetY() * infoImg2->Spacing[1];
+
+       double ang1= atan2( pp1bY-pp1aY , pp1bX-pp1aX )*180/PI;
+       double ang2= atan2( pp2bY-pp2aY , pp2bX-pp2aX )*180/PI;
+
+       double in[4],inB[4],out[4];
+       in[0] = (double)pIn[0] * infoImg1->Spacing[0];
+       in[1] = (double)pIn[1] * infoImg1->Spacing[1];
+       in[2] = 0;
+       in[3] = 1;
+
+       in[0]=in[0]-pp1aX;
+       in[1]=in[1]-pp1aY;
+
+       vtkTransform *transform; 
+       transform = vtkTransform::New();
+       transform->Identity();
+//     transform->RotateZ( ang2 );
+       transform->RotateZ( -ang1 );
+       transform->MultiplyPoint(in,out);
+       transform->Delete();
+
+       inB[0] = out[0];
+       inB[1] = out[1];
+       inB[2] = out[2];
+       inB[3] = out[3];
+       vtkTransform *transform2; 
+       transform2 = vtkTransform::New();
+       transform2->Identity();
+       transform2->RotateZ( ang2 );
+//     transform2->RotateZ( ang1 );
+       transform2->MultiplyPoint(inB,out);
+       transform2->Delete();
+
+       out[0] = out[0] + pp2aX;
+       out[1] = out[1] + pp2aY;
+
+       out[0] = out[0] / infoImg2->Spacing[0];
+       out[1] = out[1] / infoImg2->Spacing[1];
+
+       pOut[0]= (int)(out[0] + 0.5);   
+       pOut[1]= (int)(out[1] + 0.5);   
+       pOut[2]= 0;     
+
+
+
+}
+
+
+// EOF - wxMaracasEmptyPanel_3.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_3.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasEmptyPanel_3.h
new file mode 100644 (file)
index 0000000..d174efd
--- /dev/null
@@ -0,0 +1,106 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasEmptyPanel_3.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__EmptyPanel__3__HXX__
+#define __WX__MARACAS__EmptyPanel__3__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "widgets/wxEmptyPanel_3_Widget.h"
+
+#include "widgets/wxMPRBaseData.h"
+#include "widgets/wxVtkBaseView.h"
+
+
+class wxMaracasEmptyPanel_3 : public wxPanel
+{
+public:
+    wxMaracasEmptyPanel_3( wxWindow* parent );
+    ~wxMaracasEmptyPanel_3( );
+       void ConfigureVTK(marImageData *marimagedata);
+private:
+        wxEmptyPanel_3_Widget* _emptyPanel_3_Widget;
+};
+
+
+
+struct InfoImag {
+
+       int             RowCol[2];
+       double  ImPoPa[3];
+       double  ImOrPa[6];
+       double  Spacing[2];
+
+};
+
+
+
+class wxMaracasEmptyPanel_4: public wxPanel
+{
+public:
+    wxMaracasEmptyPanel_4( wxWindow* parent);
+    ~wxMaracasEmptyPanel_4( );
+       void ConfigureVTK();
+private:
+
+       wxWidgetMesure2D        *_widgetMesure1;
+       wxWidgetMesure2D        *_widgetMesure2;
+
+
+       wxRadioButton           *_rb1;
+       wxRadioButton           *_rb2;
+       wxRadioButton           *_rb3;
+
+       struct InfoImag         _infoImg1;
+       struct InfoImag         _infoImg2;
+
+       wxPanel                         *_panelImage1;
+       wxPanel                         *_panelImage2;
+
+       vtkMPRBaseData          *_vtkbasedata1;          
+       vtkMPRBaseData          *_vtkbasedata2; 
+       
+       wxVtkMPR2DView          *_wxvtk2Dbaseview1;      
+       wxVtkMPR2DView          *_wxvtk2Dbaseview2;      
+       void ConfigureImage( char *fileName, wxPanel *panelImage, int ventana);
+       virtual void OnRefreshView(wxCommandEvent & event);
+       virtual void OnDClickLeft(wxCommandEvent & event);
+
+       wxPanel* CreateControlPanel_Algo(wxWindow *parent);
+       wxPanel* CreateImagePanel(wxWindow *parent);
+
+
+       void TranformPixel1(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2);
+       void TranformPixel2(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2);
+       void TranformPixel3(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2);
+       void TranformPixel2a(int pIn[], int pOut[], struct InfoImag *infoImg1, struct InfoImag *infoImg2);
+
+
+
+DECLARE_EVENT_TABLE( );
+
+};
+
+
+
+#endif // __WX__MARACAS__EmptyPanel__3__HXX__
+
+// EOF - wxMaracasEmptyPanel_3.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame.cxx
new file mode 100644 (file)
index 0000000..374426b
--- /dev/null
@@ -0,0 +1,476 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxMaracasFrame.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:10 $
+ Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+// PS -> #include "wxMaracasDataBrowser.h"
+#include "wxMaracasParametersDialog.h"
+#include "wxMaracasImageBrowser.h"
+#include "wxMaracasHelpDialog.h"
+#include "wxMaracasFrame.h"
+#include "marDictionary.h"
+
+#include <wx/panel.h>
+#include <wx/toolbar.h>
+#include <wx/dialog.h>
+#include <wx/colordlg.h>
+// ----------------------------------------------------------------------------
+// Maracas "logic world" headers
+// ----------------------------------------------------------------------------
+
+
+//#ifndef __WXMSW__
+#   include "res/bitmaps/connect.xpm"
+#   include "res/bitmaps/params.xpm"
+#   include "res/bitmaps/imagebrowser.xpm"
+#   include "res/bitmaps/3D.xpm"
+#   include "res/bitmaps/plans.xpm"
+#   include "res/bitmaps/quant.xpm"
+#   include "res/bitmaps/rotate.xpm"
+#   include "res/bitmaps/bright.xpm"
+#   include "res/bitmaps/pan.xpm"
+#   include "res/bitmaps/zoom.xpm"
+#   include "res/bitmaps/clear.xpm"
+#   include "res/bitmaps/intensity.xpm"
+#   include "res/bitmaps/help.xpm"
+#   include "res/bitmaps/creatis_logo.xpm"
+#   include "res/icons/maracas.xpm"
+//#endif
+
+BEGIN_EVENT_TABLE( wxMaracasFrame, wxFrame )
+       // PS -> EVT_MENU( ID_TOOLBAR_DATA_BROWSER, wxMaracasFrame::OnLoadPatientData )
+       EVT_MENU( ID_TOOLBAR_PARAMETERS, wxMaracasFrame::OnParameters )
+       // PS -> EVT_MENU( ID_TOOLBAR_IMAGE_BROWSER, wxMaracasFrame::OnLoadImageData )
+       EVT_MENU( ID_TOOLBAR_3D_BROWSER, wxMaracasFrame::OnStartExperiment )
+       // PS -> EVT_MENU( ID_TOOLBAR_HELP, wxMaracasFrame::OnHelp )
+       EVT_MENU( ID_TOOLBAR_PLANS, wxMaracasFrame::OnQuant )
+
+// EED : This is not top  !!!!!!!!!!!
+       EVT_TOOL( 19999, wxMaracasFrame::OnRegenerateAll                )
+       EVT_TOOL( 19998, wxMaracasFrame::OnRegenerateSplineAxe  )
+       EVT_TOOL( 19997, wxMaracasFrame::OnCleanContours                )
+       EVT_TOOL( 19996, wxMaracasFrame::OnRegenerateSignal             )
+
+
+       EVT_CLOSE( wxMaracasFrame::OnQuit )
+
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS, wxMaracasFrame::OnNewAxis )
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS, wxMaracasFrame::OnDeleteAxis )
+END_EVENT_TABLE( );
+
+//----------------------------------------------------------------------------
+wxMaracasFrame::wxMaracasFrame( wxFrame *parent, wxWindowID id,
+                                                          marInterface *mar,marSimpleDicom *simpleDicom, char *dictionaryFileName,
+                                                          const wxString& title, const wxPoint& pos,
+                                                          const wxSize& size, long style)
+                                                          : wxFrame( parent, id, title, pos, size, style)
+{
+    _mar                                               = mar;
+       _marSimpleDicom                         = simpleDicom;
+       _wxmaracasquantification        = NULL;
+       _wxmaracas3dbrowser                     = NULL;
+
+       marDictionary marDict;
+//     marDict.LoadDictionary_French();
+       marDict.LoadDictionary_English();
+//     marDict.LoadDictionary_Japanese();
+       
+
+/*
+       if (!marDict.LoadDictionaryFile(dictionaryFileName)){
+                       wxMessageBox( "Error: File(s) marDict.txt not found...",
+                                         "DxMM : MARACAS", wxOK | wxCENTRE | wxICON_ERROR , this);
+       }
+*/
+
+    //good luck !
+    vtkObject *a = vtkObject::New();
+    a->GlobalWarningDisplayOff();
+    a->Delete();
+
+    // At the begining, there were nothing, just a window...
+    _actual_panel = NULL;
+
+    // And the programmer said: let there be a status bar
+    this->CreateStatusBar( );
+
+    this->GetStatusBar()->SetFieldsCount( 2 );
+    wxRect rect;
+    this->GetStatusBar()->GetFieldRect(1, rect);
+    //wxPoint pos;
+    //wxSize size;
+    //_progressGauge = new wxGauge( this->GetStatusBar(), -1, 100);
+       //    _progressGauge = new wxGauge( this->GetStatusBar(), -1, 50,
+       //    rect.GetPosition(), rect.GetSize());
+    this->GetStatusBar()->Show();
+    this->PositionStatusBar();
+
+    // And an icon (to be unique)
+    //TODO change the icon to the real one!
+    this->SetIcon( wxICON( maracas_icon ) );
+
+    // And a toolbar (for dummy users)
+    this->RecreateToolbar( );
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::RecreateToolbar( )
+{
+    wxToolBar* toolBar = this->GetToolBar( );
+    delete toolBar;
+    this->SetToolBar( NULL );
+
+    toolBar = this->CreateToolBar( TOOLBAR_STYLE, ID_TOOLBAR );
+
+    // Set up toolbar
+    wxBitmap toolBarBitmaps[ 22+1 ];
+
+       /**
+       * wxBitmap vs. wxBITMAP -> add _xpm at the end of the file
+       */
+    toolBarBitmaps[  0 ] = wxBITMAP( toolbar_connect );
+    toolBarBitmaps[  4 ] = wxBITMAP( toolbar_params );
+    toolBarBitmaps[  7 ] = wxBITMAP( toolbar_imagebrowser );
+    toolBarBitmaps[  9 ] = wxBITMAP( toolbar_triD );
+
+    toolBarBitmaps[ 10 ] = wxBITMAP( toolbar_plans );
+    toolBarBitmaps[ 11 ] = wxBITMAP( toolbar_quant );
+    toolBarBitmaps[ 12 ] = wxBITMAP( toolbar_rotate );
+    toolBarBitmaps[ 13 ] = wxBITMAP( toolbar_bright );
+    toolBarBitmaps[ 14 ] = wxBITMAP( toolbar_pan );
+    toolBarBitmaps[ 15 ] = wxBITMAP( toolbar_zoom );
+    toolBarBitmaps[ 16 ] = wxBITMAP( toolbar_clear );
+    toolBarBitmaps[ 17 ] = wxBITMAP( toolbar_intensity );
+    toolBarBitmaps[ 20 ] = wxBITMAP( toolbar_help );
+    toolBarBitmaps[ 22 ] = wxBITMAP( creatis_logo );
+
+    /*
+       toolBarBitmaps[  1 ] = wxBitmap( toolbar_loadexp );
+       toolBarBitmaps[  2 ] = wxBitmap( toolbar_save );
+       toolBarBitmaps[  3 ] = wxBitmap( toolbar_excel );
+       toolBarBitmaps[  5 ] = wxBitmap( toolbar_wizard );
+       toolBarBitmaps[  6 ] = wxBitmap( toolbar_back );
+       toolBarBitmaps[  8 ] = wxBitmap( toolbar_subtract );
+
+        toolBarBitmaps[ 18 ] = wxBitmap( toolbar_linear );
+        toolBarBitmaps[ 19 ] = wxBitmap( toolbar_area );
+    */
+    // Set size & margins
+    toolBar->SetMargins( 4, 4 );
+// PS -> #ifdef DXMM
+    toolBar->SetToolBitmapSize( wxSize( toolBarBitmaps[ 4 ].GetWidth( ), toolBarBitmaps[ 4 ].GetHeight( ) ) );
+// PS -> #else
+// PS ->     toolBar->SetToolBitmapSize( wxSize( toolBarBitmaps[ 0 ].GetWidth( ), toolBarBitmaps[ 0 ].GetHeight( ) ) );
+// PS -> #endif
+
+    // Adding tools
+// PS -> #ifndef DXMM
+// PS ->     toolBar->AddTool( ID_TOOLBAR_DATA_BROWSER, toolBarBitmaps[ 0 ], "Patient data", "Load patient data: studies & series" );
+// PS ->     toolBar->AddSeparator( );
+// PS ->     toolBar->AddTool( ID_TOOLBAR_IMAGE_BROWSER, toolBarBitmaps[ 7 ], "Load image data", "Load DICOM images from disk" );
+// PS ->     toolBar->AddSeparator( );
+// PS -> #endif
+    toolBar->AddTool( ID_TOOLBAR_3D_BROWSER, toolBarBitmaps[ 9 ], _T("Start 3D"), _T("Load 3D representation") );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_PLANS, toolBarBitmaps[ 10 ], _T("Plan"), _T("Planes") );
+    toolBar->AddSeparator( );
+//    toolBar->AddTool( ID_TOOLBAR_QUANT, toolBarBitmaps[ 11 ], "Quant", "Quant" );
+//    toolBar->AddSeparator( );
+    //The following has been commented out temporarlily
+    /*
+    toolBar->AddTool( ID_TOOLBAR_ROTATE, toolBarBitmaps[ 12 ], "Rotate", "Rotate" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_BRIGHT, toolBarBitmaps[ 13 ], "Bright", "Bright" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_PAN, toolBarBitmaps[ 14 ], "Pan", "Pan" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_ZOOM, toolBarBitmaps[ 15 ], "Zoom", "Zoom" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_CLEAR, toolBarBitmaps[ 16 ], "Clear", "Clear" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_INTENSITY, toolBarBitmaps[ 17 ], "Intensity", "Intensity" );
+    toolBar->AddSeparator( );*/
+    toolBar->AddTool( ID_TOOLBAR_PARAMETERS, toolBarBitmaps[ 4 ], _T("Parameters"), _T("Load parameters for modifying") );
+    //toolBar->AddTool( ID_TOOLBAR_HELP, toolBarBitmaps[ 20 ], "Help", "Help" );
+    toolBar->AddSeparator( );
+
+       wxBitmapButton *btnCreatisLogo = new wxBitmapButton(toolBar,-1,toolBarBitmaps[ 22 ] );
+       btnCreatisLogo->SetSize(81+10,20+10);
+       btnCreatisLogo->SetBackgroundColour(wxColour(0,0,153));
+       Connect(btnCreatisLogo->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame::OnAboutCreatis );
+
+       toolBar->AddControl(btnCreatisLogo);
+
+
+
+    toolBar->Realize( );
+    toolBar->SetRows( 1 );
+    toolBar->EnableTool(ID_TOOLBAR_3D_BROWSER, true);
+    toolBar->EnableTool(ID_TOOLBAR_PLANS, false);
+    toolBar->EnableTool(ID_TOOLBAR_QUANT, false);
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnAboutCreatis( wxCommandEvent& event ){
+       wxMaracasHelpDialog *dlg = new wxMaracasHelpDialog(this, -1, "Creatis", wxPoint(200,200), wxDefaultSize, wxDEFAULT_DIALOG_STYLE);
+       dlg->ShowModal();
+       dlg->Close();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnQuit( wxCloseEvent& event ){
+
+       DeletePanels();
+       if (_mar!=NULL) { delete _mar; }
+       _mar=NULL;
+       marDictionary marDict;
+       marDict.FreeDictionary();
+
+
+//     this->Show(FALSE);
+       this->Destroy();
+       delete this;
+}
+//----------------------------------------------------------------------------
+// PS -> void wxMaracasFrame::OnLoadPatientData( wxCommandEvent& event )
+// PS -> {
+// PS ->       wxBusyCursor wait;
+// PS ->     wxToolBar* toolBar = this->GetToolBar( );
+// PS ->     //Disabling tool
+// PS ->     //wxToolBar::EnableTool This function should only be called after Realize.
+// PS ->     toolBar->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, false);
+// PS ->     toolBar->EnableTool(ID_TOOLBAR_3D_BROWSER, true);
+// PS ->     toolBar->EnableTool(ID_TOOLBAR_PLANS, true);
+// PS ->     toolBar->EnableTool(ID_TOOLBAR_QUANT, false);
+// PS -> 
+// PS ->       //  Create panel
+// PS ->       if( _actual_panel != NULL ) delete _actual_panel;
+// PS ->       wxMaracasDataBrowser* pnl = new wxMaracasDataBrowser( this, _mar, -1 );
+// PS -> 
+// PS ->       _actual_panel = pnl;
+// PS -> 
+// PS ->       // cf.: http://www.wxwindows.org/manuals/2.4.0/wx490.htm
+// PS ->       // Force a resize. This should probably be replaced by a call to a wxFrame
+// PS ->       // function that lays out default decorations and the remaining content window.
+// PS ->       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+// PS ->       this->OnSize(myevent);
+// PS ->       this->Show(true);
+// PS -> 
+// PS ->       // Load panel data
+// PS ->       pnl->LoadData( );
+// PS ->       //this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+// PS -> }
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnParameters( wxCommandEvent& event )
+{
+/* EED Photo Maracas
+  //-- 
+       wxWindowDC *wxwindc =new wxWindowDC(this);
+       wxCoord w, h;
+       wxwindc->GetSize(&w, &h);
+       wxBitmap *wxbitmap =new wxBitmap(w, h);
+       wxMemoryDC *wxmemorydc = new wxMemoryDC();
+
+       wxmemorydc->SelectObject(*wxbitmap);
+       wxmemorydc->Blit(0,0,w,h,wxwindc,0,0);
+
+       wxbitmap->SaveFile("c:/tmp/MaracasPlamavic.bmp", wxBITMAP_TYPE_BMP  );
+       delete wxwindc;
+       delete wxbitmap;
+       delete wxmemorydc;
+  //-- 
+*/
+       wxMaracasParametersDialog *d = new wxMaracasParametersDialog( this, _mar );
+       d->ShowModal( );
+       d->Close(true);
+/*
+       if (d->IfInitContour()==true){
+       } else {
+       }
+       if (d->GetInitContour()==true){
+       }
+       wxmaracasquantification;
+       if (wxmaracas3dbrowser!=NULL){ 
+       }
+*/
+}
+//----------------------------------------------------------------------------
+// PS -> void wxMaracasFrame::OnLoadImageData( wxCommandEvent& event )
+// PS -> {
+// PS ->       wxBusyCursor wait;
+// PS -> 
+// PS ->       //  Create panel
+// PS ->       if( _actual_panel != NULL ) delete _actual_panel;
+// PS ->       wxMaracasImageBrowser* pnl = new wxMaracasImageBrowser( this, _mar, -1 );
+// PS -> 
+// PS ->       // Resize
+// PS ->       _actual_panel = pnl;
+// PS -> 
+// PS ->       // Load panel data
+// PS ->       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+// PS ->       this->OnSize(myevent);
+// PS ->       //this->Show(true);
+// PS -> 
+// PS ->       //wxDialog dialog(this, -1, "coucou");
+// PS ->       //dialog.ShowModal();
+// PS ->       //dialog.Show(true);
+// PS ->       //wxGauge gauge( this, -1, 50);
+// PS -> 
+// PS ->     /**
+// PS ->       AS a first step I'll pass a wxGauge as parameter this doesn't
+// PS ->       sound very good, should use EVT_TIMER instead...
+// PS ->     */
+// PS ->     _mar->_dicom->loadActualSerie( this->_progressGauge );
+// PS ->     vtkImageData *dummy = _mar->_dicom->getVolume( )->castVtk();
+// PS ->     //float range[2];
+// PS ->     //dummy->GetScalarRange( range );
+// PS -> 
+// PS ->     pnl->LoadData( dummy );
+// PS ->     //_view_image->ConstructVTK(  (vtkImageData *)_mar->_dicom->getVolume( ));
+// PS ->     //^ this is not working ??? I don't understand why, some VTK pipeline mystery
+// PS -> 
+// PS ->     this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, false);
+// PS ->     this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, true);
+// PS ->       //Add patient name to the frame title
+// PS ->     this->SetTitle( "Patient Name : " + _mar->_dicom->GetPatientName() );
+// PS -> }
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnStartExperiment( wxCommandEvent& event )
+{
+       
+       wxBusyCursor wait;
+
+       int voi[ 6 ];
+// PS -> #ifndef DXMM
+// PS ->     ((wxMaracasImageBrowser*)_actual_panel )->GetROI( voi );
+// PS -> #else
+
+       _marSimpleDicom->loadActualSerie( this->_progressGauge );
+       _mar->_dicom->SetVolume( _marSimpleDicom->getVolume() );
+
+
+       voi[0] = 0;
+       voi[1] = (_mar->_dicom->getVolume( )->getXdim( ))-1;
+       voi[2] = 0;
+       voi[3] = (_mar->_dicom->getVolume( )->getYdim( ))-1;
+       voi[4] = 0;
+       voi[5] = (_mar->_dicom->getVolume( )->getZdim( ))-1;
+// PS -> #endif
+
+       _mar->_experiment->setVOI( voi );
+       _mar->initExperiment( );
+
+       //  Create panel
+    DeletePanels();
+       _wxmaracas3dbrowser = new wxMaracas3DBrowser( this, _mar, -1 ,ID_TOOLBAR_PLANS);
+
+       // Resize
+       _actual_panel = _wxmaracas3dbrowser;
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       //this->Show(true);
+
+       // Load panel data
+       _wxmaracas3dbrowser->LoadData( );
+
+// PS -> #ifndef DXMM
+// PS ->       this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, true);
+// PS ->       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+// PS -> #else
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_QUANT, false);
+// PS -> #endif
+}
+//----------------------------------------------------------------------------
+// PS -> void wxMaracasFrame::OnHelp (wxCommandEvent& event )
+// PS -> {
+// PS ->       wxMaracasHelpDialog* help = new wxMaracasHelpDialog(this, -1);
+// PS -> 
+// PS ->       help->ShowModal();
+// PS -> }
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame::DeletePanels ( ){
+       if (_wxmaracasquantification!=NULL){ 
+               delete _wxmaracasquantification;
+               _wxmaracasquantification=NULL;
+       }
+       if (_wxmaracas3dbrowser!=NULL){ 
+               delete _wxmaracas3dbrowser;
+               _wxmaracas3dbrowser=NULL;
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnQuant (wxCommandEvent& event ){
+       int isovalue = 50;
+       int opacity  = 50;
+
+       if (_wxmaracas3dbrowser!=NULL){ 
+               isovalue = _wxmaracas3dbrowser->GetIsovalue();
+               opacity  = _wxmaracas3dbrowser->GetOpacity();
+       }
+
+    DeletePanels();
+       _wxmaracasquantification = new wxMaracasQuantification( this, _mar, -1 );
+       _actual_panel = _wxmaracasquantification;
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       this->Show(true);
+
+       // Load panel data
+       _wxmaracasquantification->LoadData( );
+       _wxmaracasquantification->SetSlider_Isovalue_Opacity(isovalue,opacity);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, true);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnNewAxis(wxCommandEvent &WXUNUSED(event))
+{
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, true);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_QUANT, true);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnDeleteAxis(wxCommandEvent &WXUNUSED(event))
+{
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_QUANT, false);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnRegenerateAll(  wxCommandEvent& event  ){
+       if (_wxmaracas3dbrowser!=NULL)          { _wxmaracas3dbrowser->RegenerateAll(true);             }
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->RegenerateAll(true);}
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnRegenerateSplineAxe(  wxCommandEvent& event  ){
+       if (_wxmaracas3dbrowser!=NULL)          { _wxmaracas3dbrowser->RegenerateAll(false);            }
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->RegenerateAll(false);   }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnCleanContours(  wxCommandEvent& event  ){
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->CleanContours();        }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame::OnRegenerateSignal(  wxCommandEvent& event  ){
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->RegenerateSignal();     }
+}
+//----------------------------------------------------------------------------
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame.h
new file mode 100644 (file)
index 0000000..ef4520e
--- /dev/null
@@ -0,0 +1,106 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasFrame.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__FRAME__HXX__
+#define __WX__MARACAS__FRAME__HXX__
+
+#include <wx/wx.h>
+#include <wx/frame.h>
+#include "marTypes.h"
+#include "wxMaracas3DBrowser.h"
+#include "wxMaracasQuantification.h"
+#include <kernel/marSimpleDicom.h>
+
+class marInterface;
+
+/**
+ * \brief Principal Frame of the application 
+ * MARACAS: MAgnetic Resonance Angiography Computer ASsisted analysis
+ *
+ */
+
+class MAR_INTERFACEWX_EXPORT wxMaracasFrame: public wxFrame
+{
+public:
+
+    wxMaracasFrame( wxFrame *parent, wxWindowID id = -1,
+            marInterface* mar = NULL, marSimpleDicom *simpleDicom=NULL, char *dictionaryFileName=NULL,
+            const wxString& title = wxT("MARACAS: MAgnetic Resonance Angiography Computer ASsisted analysis"),
+            const wxPoint& pos = wxDefaultPosition,
+            const wxSize& size = wxDefaultSize,
+            long style = wxDEFAULT_FRAME_STYLE);
+       
+       void OnDeleteAxis(wxCommandEvent &event);
+       void OnNewAxis(wxCommandEvent &event);
+       
+    void RecreateToolbar( );
+
+       void OnAboutCreatis( wxCommandEvent& event );
+    void OnQuit( wxCloseEvent& event );
+// PS ->     void OnLoadPatientData( wxCommandEvent& event );
+    void OnParameters( wxCommandEvent& event );
+// PS ->     void OnLoadImageData( wxCommandEvent& event );
+    void OnStartExperiment( wxCommandEvent& event );
+// PS ->     void OnHelp (wxCommandEvent& event );
+    void OnQuant (wxCommandEvent& event );
+
+       void OnRegenerateAll( wxCommandEvent& event );
+       void OnRegenerateSplineAxe(     wxCommandEvent& event );
+       void OnCleanContours( wxCommandEvent& event );
+       void OnRegenerateSignal( wxCommandEvent& event );
+
+
+
+       wxMaracas3DBrowser*                     Getwxmaracas3dbrowser()                 { return _wxmaracas3dbrowser;           }
+       wxMaracasQuantification*        Getwxmaracasquantification()    { return _wxmaracasquantification;      }
+
+private:
+    wxPanel                                    *_actual_panel;
+    wxGauge                                    *_progressGauge;
+    marInterface                       *_mar;
+       marSimpleDicom                  *_marSimpleDicom;
+
+       wxMaracas3DBrowser              *_wxmaracas3dbrowser;
+       wxMaracasQuantification *_wxmaracasquantification;
+
+    DECLARE_EVENT_TABLE( );
+
+       void DeletePanels();
+};
+
+static const long TOOLBAR_STYLE = wxNO_BORDER | wxTB_FLAT | wxTB_DOCKABLE | wxTB_HORIZONTAL;
+
+enum
+{
+    //! Toolbar & menu buttons
+    ID_TOOLBAR = 200,
+    ID_TOOLBAR_DATA_BROWSER,
+    ID_TOOLBAR_PARAMETERS,
+    ID_TOOLBAR_IMAGE_BROWSER,
+    ID_TOOLBAR_3D_BROWSER,
+    ID_TOOLBAR_PLANS,
+    ID_TOOLBAR_QUANT,
+    ID_TOOLBAR_ROTATE,
+    ID_TOOLBAR_BRIGHT,
+    ID_TOOLBAR_PAN,
+    ID_TOOLBAR_ZOOM,
+    ID_TOOLBAR_CLEAR,
+    ID_TOOLBAR_INTENSITY,
+    ID_TOOLBAR_HELP,
+};
+
+#endif // __WX__MARACAS__FRAME__HXX__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame02.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame02.cxx
new file mode 100644 (file)
index 0000000..debef6a
--- /dev/null
@@ -0,0 +1,4241 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasFrame02.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include <wx/wx.h>
+#include <wx/frame.h>
+#include <wx/dir.h>
+#include <wx/arrstr.h>
+
+#include <vtkCommand.h>
+#include <vtkImageChangeInformation.h>
+#include <vtkImageCast.h>
+#include <vtkImageData.h>
+#include <vtkImageViewer2.h>
+#include <vtkCamera.h>
+#include <vtkRenderer.h>
+
+
+#include <gdcm.h> 
+#include <gdcmFile.h> 
+#include "vtkGdcmReader.h"
+
+
+#include "wxMaracasParametersDialog.h"
+#include "wxMaracasDataBrowser.h"
+#include "widgets/wxSTLWidget_02.h"
+#include "widgets/wxSTLWidget_03.h"
+#include "widgets/wxMPRWidget.h"
+
+
+#include <wx/panel.h>
+#include <wx/toolbar.h>
+#include <wx/dialog.h>
+#include <wx/colordlg.h>
+#include <wx/listctrl.h>
+#include <wx/textctrl.h>
+
+// EED Borrame not used
+#include "wxMaracasImageBrowser.h"
+
+#include "wxMaracasHelpDialog.h"
+#include "marDictionary.h"
+#include "kernel/marImageData.h"
+
+
+
+//using namespace std;
+#include "wxMaracasFrame02.h"
+
+#include "ILPD/src/controlerInterface/ILPDViewListPatient.h"
+#include "ILPD/src/wxInterface/ILPDViewWxWindow.h"
+
+
+// ----------------------------------------------------------------------------
+// Maracas "logic world" headers
+// ----------------------------------------------------------------------------
+//#include <kernel/marInterface.h>
+
+#ifndef __WXMSW__
+  #include "res/bitmaps/connect.xpm"
+  #include "res/bitmaps/params.xpm"
+  #include "res/bitmaps/imagebrowser.xpm"
+  #include "res/bitmaps/3D.xpm"
+  #include "res/bitmaps/plans.xpm"
+  #include "res/bitmaps/quant.xpm"
+  #include "res/bitmaps/rotate.xpm"
+  #include "res/bitmaps/bright.xpm"
+  #include "res/bitmaps/pan.xpm"
+  #include "res/bitmaps/zoom.xpm"
+  #include "res/bitmaps/clear.xpm"
+  #include "res/bitmaps/intensity.xpm"
+  #include "res/bitmaps/help.xpm"
+  #include "res/bitmaps/stl.xpm"
+  #include "res/bitmaps/creatis_logo.xpm"
+  #include "res/bitmaps/MPR.xpm"
+  #include "res/bitmaps/Axis_JF.xpm"
+  #include "res/bitmaps/Axis_JF_MH1.xpm"
+  #include "res/bitmaps/Axis_JF_MH2.xpm"
+  #include "res/bitmaps/ProcessingCT.xpm"
+  #include "res/bitmaps/QuantificationCT.xpm"
+  #include "res/icons/maracas.xpm"
+
+
+  #include "res/bitmaps2/v2_bi_bl_CTQuantification.xpm"
+  #include "res/bitmaps2/v2_bi_bl_Information.xpm"
+  #include "res/bitmaps2/v2_bi_bl_IRMQuantification.xpm"
+  #include "res/bitmaps2/v2_bi_bl_ListPatient_Voi.xpm"
+  #include "res/bitmaps2/v2_bi_bl_Logo.xpm"
+  #include "res/bitmaps2/v2_bi_bl_ManualRegistration.xpm"
+  #include "res/bitmaps2/v2_bi_bl_Params.xpm"
+  #include "res/bitmaps2/v2_bi_bl_Processing.xpm"
+  #include "res/bitmaps2/v2_bi_bl_STLFormat.xpm"
+  #include "res/bitmaps2/v2_bi_bl_Tests.xpm"
+  #include "res/bitmaps2/v2_bi_bl_VascularTree.xpm"
+  #include "res/bitmaps2/v2_bi_mask.xpm"
+  #include "res/bitmaps2/v2_bi_re_CTQuantification.xpm"
+  #include "res/bitmaps2/v2_bi_re_IRMQuantification.xpm"
+  #include "res/bitmaps2/v2_bi_re_ListPatient_Voi.xpm"
+  #include "res/bitmaps2/v2_bi_re_Logo.xpm"
+  #include "res/bitmaps2/v2_bi_re_ManualRegistration.xpm"
+  #include "res/bitmaps2/v2_bi_re_Params.xpm"
+  #include "res/bitmaps2/v2_bi_re_Processing.xpm"
+  #include "res/bitmaps2/v2_bi_re_STLFormat.xpm"
+  #include "res/bitmaps2/v2_bi_re_Tests.xpm"
+  #include "res/bitmaps2/v2_bi_re_VascularTree.xpm"
+  #include "res/bitmaps2/v2_sm_bl_AddAllPatients.xpm"
+  #include "res/bitmaps2/v2_sm_bl_AddPatient.xpm"
+  #include "res/bitmaps2/v2_sm_bl_AxisExtraction.xpm"
+  #include "res/bitmaps2/v2_sm_bl_CreateDICOMDIR.xpm"
+  #include "res/bitmaps2/v2_sm_bl_ListPatient.xpm"
+  #include "res/bitmaps2/v2_sm_bl_MPR.xpm"
+  #include "res/bitmaps2/v2_sm_bl_OpenDICOMDIR.xpm"
+  #include "res/bitmaps2/v2_sm_bl_OpenDirectory.xpm"
+  #include "res/bitmaps2/v2_sm_bl_ProcessingCT.xpm"
+  #include "res/bitmaps2/v2_sm_bl_Processing.xpm"
+  #include "res/bitmaps2/v2_sm_bl_Quantification.xpm"
+  #include "res/bitmaps2/v2_sm_bl_STLFormat.xpm"
+  #include "res/bitmaps2/v2_sm_bl_TreeExtraction_JF_MH.xpm"
+  #include "res/bitmaps2/v2_sm_bl_voi.xpm"
+  #include "res/bitmaps2/v2_sm_mask.xpm"
+  #include "res/bitmaps2/v2_sm_re_ListPatient.xpm"
+  #include "res/bitmaps2/v2_sm_re_voi.xpm"
+  #include "res/bitmaps2/v2_sm_tr_MPR.xpm"
+  #include "res/bitmaps2/v2_sm_tr_Processing.xpm"
+  #include "res/bitmaps2/v2_sm_tr_Quantification.xpm"
+  #include "res/bitmaps2/v2_sm_tr_STLFormat.xpm"
+  #include "res/bitmaps2/v2_sm_tr_VOI.xpm"
+#endif
+
+
+
+
+
+
+BEGIN_EVENT_TABLE( wxMaracasFrame02, wxFrame )
+    EVT_MENU( ID_TOOLBAR_DATA_BROWSER   , wxMaracasFrame02::OnLoadPatientData                  )
+
+    EVT_MENU(  ID_TOOLBAR_PARAMETERS           , wxMaracasFrame02::OnParameters                        )
+    EVT_MENU(  ID_TOOLBAR_IMAGE_BROWSER        , wxMaracasFrame02::OnLoadImageData02           )
+    EVT_MENU(  ID_TOOLBAR_3D_BROWSER           , wxMaracasFrame02::OnStartExperiment           )
+    EVT_MENU(  ID_TOOLBAR_HELP                         , wxMaracasFrame02::OnHelp                                      )
+    EVT_MENU(  ID_TOOLBAR_PLANS                        , wxMaracasFrame02::OnQuant                                     )
+
+    EVT_MENU(  ID_TOOLBAR_MPR                          , wxMaracasFrame02::OnMPR                                       )
+    EVT_MENU(  ID_TOOLBAR_PROCESSING_CT        , wxMaracasFrame02::OnProcessingCT                      )
+    EVT_MENU(  ID_TOOLBAR_QUANTIFICATION_CT, wxMaracasFrame02::OnQuantificationCT              )
+
+    EVT_MENU(  ID_TOOLBAR_EMPTY_PANEL          , wxMaracasFrame02::OnEmptyPanel                        )
+    EVT_MENU(  ID_TOOLBAR_EMPTY_PANEL_2        , wxMaracasFrame02::OnEmptyPanel_2                      )
+
+    EVT_MENU(  ID_TOOLBAR_STL                          , wxMaracasFrame02::OnStl                                       )
+    EVT_CLOSE(                                                       wxMaracasFrame02::OnQuit                                  )
+
+       // EED : This is not top  !!!!!!!!!!!
+       EVT_TOOL( 19999                                                  , wxMaracasFrame02::OnRegenerateAll            )
+       EVT_TOOL( 19998                                                  , wxMaracasFrame02::OnRegenerateSplineAxe      )
+       EVT_TOOL( 19997                                                  , wxMaracasFrame02::OnCleanContours            )
+       EVT_TOOL( 19996                                                  , wxMaracasFrame02::OnRegenerateSignal         )
+
+    EVT_LIST_ITEM_ACTIVATED( ID_SERIES_LIST,           wxMaracasFrame02::OnLoadImageData       )
+
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS,   wxMaracasFrame02::OnNewAxis                     )
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS,wxMaracasFrame02::OnDeleteAxis          )
+END_EVENT_TABLE( );
+
+//----------------------------------------------------------------------------
+wxMaracasFrame02::wxMaracasFrame02( wxFrame *parent, wxWindowID id, 
+                                marInterface *mar, marInterfaceCT *marCT, 
+                                                               char *dictionaryFileName, 
+                                                               const wxString& title, const wxPoint& pos, 
+                                                               const wxSize& size, long style) 
+              : wxFrame( parent, id, title, pos, size, style)
+{
+       marDictionary marDict;
+//     marDict.LoadDictionary_French();
+       marDict.LoadDictionary_English();
+//     marDict.LoadDictionary_Japanese();
+       
+
+/*
+       if (!marDict.LoadDictionaryFile(dictionaryFileName)){
+                       wxMessageBox( _T("Error: File(s) marDict.txt not found..."),
+                                         _T("DxMM : MARACAS"), wxOK | wxCENTRE | wxICON_ERROR , this);
+       }
+
+*/
+    _mar = mar;
+       _marCT = marCT;
+    
+    //good luck !
+    vtkObject *a = vtkObject::New();
+    a->GlobalWarningDisplayOff();
+    a->Delete();
+
+    // At the begining, there were nothing, just a window...
+    _actual_panel = NULL;
+
+    // And the programmer said: let there be a status bar
+    this->CreateStatusBar( );
+    
+    this->GetStatusBar()->SetFieldsCount( 2 );
+    wxRect rect;
+    this->GetStatusBar()->GetFieldRect(1, rect);
+    //wxPoint pos;
+    //wxSize size;
+    //_progressGauge = new wxGauge( this->GetStatusBar(), -1, 100);
+//    _progressGauge = new wxGauge( this->GetStatusBar(), -1, 50,
+//    rect.GetPosition(), rect.GetSize());
+    this->GetStatusBar()->Show();
+    this->PositionStatusBar();
+
+    // And an icon (to be unique)
+    //TODO change the icon to the real one!
+    this->SetIcon( wxICON( maracas_icon ) );
+
+    // And a toolbar (for dummy users)
+    this->RecreateToolbar( );
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::RecreateToolbar( )
+{
+    wxToolBar* toolBar = this->GetToolBar( );
+    delete toolBar;
+    this->SetToolBar( NULL );
+
+    toolBar = this->CreateToolBar( TOOLBAR_STYLE, ID_TOOLBAR );
+
+    // Set up toolbar
+    wxBitmap toolBarBitmaps[ 28+1 ];
+
+ /**
+  * wxBitmap vs. wxBITMAP -> add _xpm at the end of the file
+  */
+    toolBarBitmaps[  0 ] = wxBITMAP( toolbar_connect                   );
+    toolBarBitmaps[  4 ] = wxBITMAP( toolbar_params                            );
+    toolBarBitmaps[  7 ] = wxBITMAP( toolbar_imagebrowser              );
+    toolBarBitmaps[  9 ] = wxBITMAP( toolbar_triD                              );
+    toolBarBitmaps[ 10 ] = wxBITMAP( toolbar_plans                             );
+    toolBarBitmaps[ 11 ] = wxBITMAP( toolbar_quant                             );
+    toolBarBitmaps[ 12 ] = wxBITMAP( toolbar_rotate                            );
+    toolBarBitmaps[ 13 ] = wxBITMAP( toolbar_bright                            );
+    toolBarBitmaps[ 14 ] = wxBITMAP( toolbar_pan                               );
+    toolBarBitmaps[ 15 ] = wxBITMAP( toolbar_zoom                              );
+    toolBarBitmaps[ 16 ] = wxBITMAP( toolbar_clear                             );
+    toolBarBitmaps[ 17 ] = wxBITMAP( toolbar_intensity                         );
+    toolBarBitmaps[ 20 ] = wxBITMAP( toolbar_help                              );
+
+    toolBarBitmaps[ 21 ] = wxBITMAP( vesselstoolbar_stl                        );
+
+    toolBarBitmaps[ 22 ] = wxBITMAP( creatis_logo                              );
+    toolBarBitmaps[ 23 ] = wxBITMAP( TOOLBAR_MPR                               );
+    toolBarBitmaps[ 24 ] = wxBITMAP( TOOLBAR_AXIS_JF                   );
+    toolBarBitmaps[ 25 ] = wxBITMAP( TOOLBAR_AXIS_JF_MH1               );
+    toolBarBitmaps[ 26 ] = wxBITMAP( TOOLBAR_AXIS_JF_MH2               );
+    toolBarBitmaps[ 27 ] = wxBITMAP( TOOLBAR_PROCESSINGCT              );
+    toolBarBitmaps[ 28 ] = wxBITMAP( TOOLBAR_QUANTIFICATIONCT  );
+
+    /*
+      toolBarBitmaps[  1 ] = wxBitmap( toolbar_loadexp );
+      toolBarBitmaps[  2 ] = wxBitmap( toolbar_save );
+      toolBarBitmaps[  3 ] = wxBitmap( toolbar_excel );
+      toolBarBitmaps[  5 ] = wxBitmap( toolbar_wizard );
+      toolBarBitmaps[  6 ] = wxBitmap( toolbar_back );
+      toolBarBitmaps[  8 ] = wxBitmap( toolbar_subtract );
+
+      toolBarBitmaps[ 18 ] = wxBitmap( toolbar_linear );
+      toolBarBitmaps[ 19 ] = wxBitmap( toolbar_area );
+    */
+    // Set size & margins
+    toolBar->SetMargins( 4, 4 );
+    toolBar->SetToolBitmapSize( wxSize( toolBarBitmaps[ 0 ].GetWidth( ), toolBarBitmaps[ 0 ].GetHeight( ) ) );
+
+    // Adding tools
+    toolBar->AddTool( ID_TOOLBAR_DATA_BROWSER, toolBarBitmaps[ 0 ], _T("Patient data"), _T("Load patient data: studies & series") );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_IMAGE_BROWSER, toolBarBitmaps[ 7 ], _T("Load image data"), _T("Load DICOM images from disk") );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_3D_BROWSER, toolBarBitmaps[ 9 ], _T("Start 3D"), _T("Load 3D representation") );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_PLANS, toolBarBitmaps[ 10 ], _T("Plan"), _T("Planes") );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_STL, toolBarBitmaps[ 21 ], _T("STL"), _T("Stl") );
+    toolBar->AddSeparator( );
+
+
+
+//EED    toolBar->AddTool( ID_TOOLBAR_QUANT, toolBarBitmaps[ 11 ], "Quant", "Quant" );
+//EED    toolBar->AddSeparator( );
+    //The following has been commented out temporarlily
+    /*
+    toolBar->AddTool( ID_TOOLBAR_ROTATE, toolBarBitmaps[ 12 ], "Rotate", "Rotate" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_BRIGHT, toolBarBitmaps[ 13 ], "Bright", "Bright" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_PAN, toolBarBitmaps[ 14 ], "Pan", "Pan" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_ZOOM, toolBarBitmaps[ 15 ], "Zoom", "Zoom" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_CLEAR, toolBarBitmaps[ 16 ], "Clear", "Clear" );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_INTENSITY, toolBarBitmaps[ 17 ], "Intensity", "Intensity" );
+    toolBar->AddSeparator( );*/
+    toolBar->AddTool( ID_TOOLBAR_PARAMETERS    , toolBarBitmaps[ 4 ]   , _T("Parameters"), _T("Load parameters for modifying") );
+    toolBar->AddTool( ID_TOOLBAR_HELP          , toolBarBitmaps[ 20 ]  , _T("Help"), _T("Help") );
+
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_MPR           , toolBarBitmaps[ 23 ], _T("MPR"), _T("MPR") );
+    toolBar->AddTool( ID_TOOLBAR_PROCESSING_CT         , toolBarBitmaps[ 27 ], _T("ProcessingCT"), _T("ProcessingCT") );
+    toolBar->AddTool( ID_TOOLBAR_QUANTIFICATION_CT     , toolBarBitmaps[ 28 ], _T("QuantificationCT"), _T("QuantificationCT") );
+    toolBar->AddSeparator( );
+    toolBar->AddTool( ID_TOOLBAR_EMPTY_PANEL           , toolBarBitmaps[ 24 ], _T("EmptyPanel"), _T("EmptyPanel") );
+    toolBar->AddTool( ID_TOOLBAR_EMPTY_PANEL_2         , toolBarBitmaps[ 26 ], _T("EmptyPanel_2"), _T("EmptyPanel_2") );
+    toolBar->AddSeparator( );
+
+
+       wxBitmapButton *btnCreatisLogo = new wxBitmapButton(toolBar,-1/*ID_BUTTON_ABOUTCREATIS*/,toolBarBitmaps[ 22 ] );
+       btnCreatisLogo->SetSize(81+10,20+10);
+       btnCreatisLogo->SetBackgroundColour(wxColour(0,0,153));
+       Connect(btnCreatisLogo->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame02::OnAboutCreatis       );
+
+       toolBar->AddControl(btnCreatisLogo);
+
+    toolBar->Realize( );
+    toolBar->SetRows( 1 );
+    
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnAboutCreatis( wxCommandEvent& event ){
+
+       wxMaracasHelpDialog *dlg = new wxMaracasHelpDialog(this, -1, "Creatis", wxPoint(200,200), wxDefaultSize, wxDEFAULT_DIALOG_STYLE);
+       dlg->ShowModal();
+       dlg->Close();
+
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnQuit( wxCloseEvent& event ){
+
+    if( _actual_panel != NULL ) delete _actual_panel;
+
+
+       this->Destroy();
+
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnLoadPatientData( wxCommandEvent& event )
+{
+  wxBusyCursor wait;
+    wxToolBar* toolBar = this->GetToolBar( );
+    //Disabling tool
+    //wxToolBar::EnableTool This function should only be called after Realize.
+    toolBar->EnableTool(ID_TOOLBAR_IMAGE_BROWSER        , true);
+    toolBar->EnableTool(ID_TOOLBAR_3D_BROWSER           , false);
+    toolBar->EnableTool(ID_TOOLBAR_PLANS                        , false);
+    toolBar->EnableTool(ID_TOOLBAR_QUANT                        , false);
+       toolBar->EnableTool(ID_TOOLBAR_STL                               , false);
+
+       toolBar->EnableTool(ID_TOOLBAR_MPR                               , false);
+       toolBar->EnableTool(ID_TOOLBAR_PROCESSING_CT     , false);
+       toolBar->EnableTool(ID_TOOLBAR_QUANTIFICATION_CT , false);
+       toolBar->EnableTool(ID_TOOLBAR_EMPTY_PANEL               , false);
+       toolBar->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2     , false        );
+
+
+  //  Create panel
+  if( _actual_panel != NULL ) delete _actual_panel;
+
+
+
+/*
+ver esto para reconectar ILPD
+wxMaracasFrame02::OnLoadPatientData
+wxMaracasFrame02::OnLoadImageData02
+wxMaracasApp02::OnInit
+*/
+
+// EED ILPD
+  wxILPD* pnl = new wxILPD( this );
+  ILPDViewListPatient* _ilpdViewListPatient    = new ILPDViewListPatient( new ILPDViewWxWindow(pnl) );
+
+//  wxMaracasDataBrowser* pnl = new wxMaracasDataBrowser( this, _mar, -1 );
+
+
+  _actual_panel = pnl;
+
+  // cf.: http://www.wxwindows.org/manuals/2.4.0/wx490.htm
+  // Force a resize. This should probably be replaced by a call to a wxFrame
+  // function that lays out default decorations and the remaining content window.
+  wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+  this->OnSize(myevent);
+  this->Show(true);
+
+  // Load panel data
+//  pnl->LoadData( );
+
+
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnParameters( wxCommandEvent& event )
+{
+  wxMaracasParametersDialog *d = new wxMaracasParametersDialog( this, _mar );
+  d->ShowModal( );
+  d->Close( true );
+}
+
+// EED Borrme not used
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnLoadImageData( wxListEvent& event ){
+  wxBusyCursor wait;
+
+  //  Create panel
+  if( _actual_panel != NULL ) delete _actual_panel;
+  wxMaracasImageBrowser* pnl = new wxMaracasImageBrowser( this, _mar, -1 );
+
+  // Resize
+  _actual_panel = pnl;
+
+  // Load panel data
+  wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+  this->OnSize(myevent);
+  //this->Show(true);
+
+  //wxDialog dialog(this, -1, "coucou");
+  //dialog.ShowModal();
+  //dialog.Show(true);
+  //wxGauge gauge( this, -1, 50);
+
+    /**
+      AS a first step I'll pass a wxGauge as parameter this doesn't 
+      sound very good, should use EVT_TIMER instead...
+    */
+    _mar->_dicom->loadActualSerie( this->_progressGauge );
+    vtkImageData *dummy = _mar->_dicom->getVolume( )->castVtk();
+    //float range[2];
+    //dummy->GetScalarRange( range );
+
+    pnl->LoadData( dummy );
+    //_view_image->ConstructVTK(  (vtkImageData *)_mar->_dicom->getVolume( ));
+    //^ this is not working ??? I don't understand why, some VTK pipeline mystery
+
+    this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, false);
+    this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, true);
+
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_STL, false);
+
+       //Add patient name to the frame title
+    this->SetTitle( _T("Patient Name : ") + _mar->_dicom->GetPatientName() );
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnLoadImageData02( wxCommandEvent& event ){
+  wxBusyCursor wait;
+
+
+// EED ILPD
+  wxILPD *wxilpd=(wxILPD*)_actual_panel;
+  vector <string*> lstStringFileName;
+  wxilpd->GetLstImageFiles(&lstStringFileName);
+  if (lstStringFileName.size()!=0)
+  {
+               marGdcmDicomILPD *margdcmdicomILPD = (marGdcmDicomILPD*)_mar->_dicom;
+               marGdcmDicomILPD *margdcmdicomILPD2 = (marGdcmDicomILPD*)_marCT->_dicom;
+//             margdcmdicomILPD->SetListImages( &lstStringFileName );
+//             margdcmdicomILPD2->SetListImages( &lstStringFileName );
+
+
+         //  Create panel
+       if( _actual_panel != NULL ) delete _actual_panel;
+       wxMaracasImageBrowser02* pnl = new wxMaracasImageBrowser02( this, _mar->_dicom, _mar->_parameters );
+
+         // Resize
+       _actual_panel = pnl;
+
+         // Load panel data
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+
+       _mar->_dicom->loadActualSerie( this->_progressGauge );
+       _marCT->_dicom->loadActualSerie( this->_progressGauge);
+       vtkImageData *dummy = _mar->_dicom->getVolume( )->castVtk();
+       pnl->LoadData( new marImageData(dummy) );
+       pnl->Start();
+
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER    , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS         , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_STL           , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR           , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL   , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2 , true  );
+
+  } // if lstStringFileName.size
+
+
+
+//Add patient name to the frame title
+// EED attention 
+//    this->SetTitle( "Patient Name : " + _mar->_dicom->GetPatientName() );
+
+}
+
+
+//----------------------------------------------------------------------------
+
+void wxMaracasFrame02::OnStartExperiment( wxCommandEvent& event )
+{
+       wxBusyCursor wait;
+       int voi[ 6 ];
+       if (((wxMaracasImageBrowser02*)_actual_panel )->GetRoiSelected()){
+               ((wxMaracasImageBrowser02*)_actual_panel )->ForceToFinisReadActiveImages( );
+               ((wxMaracasImageBrowser02*)_actual_panel )->GetROI( voi );
+
+               _mar->_experiment->setVOI( voi );
+               _mar->initExperiment( );
+
+               //  Create panel
+               if( _actual_panel != NULL ) { delete _actual_panel; }
+               _wxmaracas3dbrowser = new wxMaracas3DBrowser( this, _mar, -1,ID_TOOLBAR_PLANS );
+               _actual_panel = _wxmaracas3dbrowser;
+
+               wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+               this->OnSize(myevent);
+               //this->Show(true);
+
+               // Load panel data
+               _wxmaracas3dbrowser->LoadData( );
+  
+               //this->GetToolBar()->EnableTool(ID_TOOLBAR_DATA_BROWSER, false);
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true);
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false);
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                   , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+       } else {
+               wxMessageDialog *msg =new wxMessageDialog(this, _T("VOI not selected"), _T("Warning"), wxOK );
+               msg->ShowModal();
+               msg->Destroy();
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnHelp (wxCommandEvent& event )
+{
+  wxMaracasHelpDialog* help = new wxMaracasHelpDialog(this, -1);
+  help->ShowModal();
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnStl(wxCommandEvent& event ){
+
+       DeletePanels();
+
+       _wxmaracassurfaceSTLwidget = new wxSurfaceSTLWidget(this);
+       _wxmaracassurfaceSTLwidget->ShowMARACASData( _mar );
+       _actual_panel = _wxmaracassurfaceSTLwidget;
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       this->Show(true);
+
+       // Load panel data
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS                 , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_STL                   , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                   , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnQuant (wxCommandEvent& event )
+{
+       DeletePanels();
+       _wxmaracasquantification = new wxMaracasQuantification( this, _mar, -1 );
+       _actual_panel = _wxmaracasquantification;
+
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       this->Show(true);
+
+       // Load panel data
+       _wxmaracasquantification->LoadData( );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnQuantificationCT (wxCommandEvent& event )
+{
+       DeletePanels();
+       _wxmaracasquantification_ct = new wxMaracasQuantificationCT( this, _marCT, -1 );
+       _actual_panel = _wxmaracasquantification;
+
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       this->Show(true);
+
+       // Load panel data
+       _wxmaracasquantification_ct->LoadData( );
+//     this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, false);
+//     this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, false);
+}
+
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnMPR(wxCommandEvent& event ){
+printf("EED wxMaracasFrame02::OnMPR A\n");
+       wxBusyCursor wait;
+
+       int voi[ 6 ];
+       if (((wxMaracasImageBrowser02*)_actual_panel )->GetRoiSelected()){
+               ((wxMaracasImageBrowser02*)_actual_panel )->ForceToFinisReadActiveImages( );
+               ((wxMaracasImageBrowser02*)_actual_panel )->GetROI( voi );
+
+               _mar->_experiment->setVOI( voi );
+               _mar->initExperiment( );
+               _marCT->setVOI(voi);
+               _marCT->SetDicom(_mar->_dicom);
+               _marCT->initExperiment();
+
+
+               vtkImageData    *imagedata;
+               imagedata               = _marCT->getDynData( )->getVolume( )->castVtk();
+               marImageData    *marimagedata = new marImageData(imagedata);
+                       
+               //  Create panel
+               if( _actual_panel != NULL ) { delete _actual_panel; }
+               _wxMaracasMPR = new wxMaracasMPR( this, marimagedata ,_mar->_parameters->getVoxelSize() );
+               _wxMaracasMPR->ConfigureVTK();
+               // Resize
+               _actual_panel = _wxMaracasMPR;
+
+               wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+               this->OnSize(myevent);
+               //this->Show(true);
+  
+               //this->GetToolBar()->EnableTool(ID_TOOLBAR_DATA_BROWSER, false);
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true  );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                   , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_PROCESSING_CT         , true  );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , true  );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+       } else {
+               wxMessageDialog *msg =new wxMessageDialog(this, _T("VOI not selected"), _T("Warning"), wxOK );
+               msg->ShowModal();
+               msg->Destroy();
+       }
+
+
+printf("EED wxMaracasFrame02::OnMPR B\n");
+       
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnEmptyPanel(wxCommandEvent& event )
+{
+
+       wxBusyCursor wait;
+
+       vtkMPRBaseData *vtkmpr2DData = ((wxMaracasMPR*)_actual_panel )->GetVtkMPRBaseData();
+       vtkImageData *imagedata = vtkmpr2DData->GetImageData();
+
+       int     x = (int)vtkmpr2DData->GetX();
+       int     y = (int)vtkmpr2DData->GetY();
+       int     z = (int)vtkmpr2DData->GetZ();
+       //  Create panel
+       if( _actual_panel != NULL ) { delete _actual_panel; }
+       _wxMaracasEmptyPanel = new wxMaracasEmptyPanel(this);
+       _wxMaracasEmptyPanel->ConfigureVTK(imagedata, x , y , z );
+
+       _actual_panel = _wxMaracasEmptyPanel;
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       //this->Show(true);
+  
+       //this->GetToolBar()->EnableTool(ID_TOOLBAR_DATA_BROWSER, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                   , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+
+
+/*
+       wxBusyCursor wait;
+       vtkMPRBaseData *vtkmprbaseData = ((wxMaracasMPR*)_actual_panel )->GetVtkMPRBaseData();
+
+       vtkImageData *imagedata = vtkmprbaseData->GetImageData();
+
+       _mar->initExperiment( );
+
+       int     x = vtkmprbaseData->GetX();
+       int     y = vtkmprbaseData->GetY();
+       int     z = vtkmprbaseData->GetZ();
+       //  Create panel
+       if( _actual_panel != NULL ) { delete _actual_panel; }
+       _wxMaracasEmptyPanel = new wxMaracasEmptyPanel(this, _mar);
+       _wxMaracasEmptyPanel->ConfigureVTK(imagedata, x , y , z );
+
+       _actual_panel = _wxMaracasEmptyPanel;
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       //this->Show(true);
+
+       //this->GetToolBar()->EnableTool(ID_TOOLBAR_DATA_BROWSER, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                   , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS                 , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+*/
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnProcessingCT(wxCommandEvent& event )
+{
+printf("EED  wxMaracasFrame02::OnProcessingCT \n");
+       wxBusyCursor wait;
+       vtkMPRBaseData *vtkmprbaseData = ((wxMaracasMPR*)_actual_panel )->GetVtkMPRBaseData();
+
+       marImageData *marimagedata = vtkmprbaseData->GetMarImageData();
+
+       _marCT->initExperiment( );
+
+       int     x = (int)vtkmprbaseData->GetX();
+       int     y = (int)vtkmprbaseData->GetY();
+       int     z = (int)vtkmprbaseData->GetZ();
+       //  Create panel
+       if( _actual_panel != NULL ) { delete _actual_panel; }
+       _wxMaracasProcessingCT = new wxMaracasProcessingCT(this, _marCT);
+       _wxMaracasProcessingCT->ConfigureVTK(marimagedata, x , y , z );
+
+       _actual_panel = _wxMaracasProcessingCT;
+
+       wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+       this->OnSize(myevent);
+       //this->Show(true);
+
+       //this->GetToolBar()->EnableTool(ID_TOOLBAR_DATA_BROWSER, false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                   , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS                 , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_QUANTIFICATION_CT     , true  );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+}
+
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnEmptyPanel_2(wxCommandEvent& event )
+{
+       wxBusyCursor wait;
+       int voi[ 6 ];
+
+       if (((wxMaracasImageBrowser02*)_actual_panel )->GetRoiSelected()){
+               ((wxMaracasImageBrowser02*)_actual_panel )->ForceToFinisReadActiveImages( );
+               ((wxMaracasImageBrowser02*)_actual_panel )->GetROI( voi );
+
+               _mar->_experiment->setVOI( voi );
+               _mar->initExperiment( );
+
+               //  Create panel
+               if( _actual_panel != NULL ) { delete _actual_panel; }
+               _wxMaracasEmptyPanel_2 = new wxMaracasEmptyPanel_2(this,_mar);
+               _wxMaracasEmptyPanel_2->ConfigureVTK();
+
+               _actual_panel = _wxMaracasEmptyPanel_2;
+
+               wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
+               this->OnSize(myevent);
+               //this->Show(true);
+  
+               //this->GetToolBar()->EnableTool(ID_TOOLBAR_DATA_BROWSER, false);
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER         , true  );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER            , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_MPR                           , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL           , false );
+               this->GetToolBar()->EnableTool(ID_TOOLBAR_EMPTY_PANEL_2         , false );
+       } else {
+               wxMessageDialog *msg =new wxMessageDialog(this, _T("VOI not selected"), _T("Warning"), wxOK );
+               msg->ShowModal();
+               msg->Destroy();
+       }
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnNewAxis(wxCommandEvent &WXUNUSED(event))
+{
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS, true);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_STL, true);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnDeleteAxis(wxCommandEvent &WXUNUSED(event)){
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_PLANS , false);
+       this->GetToolBar()->EnableTool(ID_TOOLBAR_STL   , false);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnRegenerateAll(  wxCommandEvent& event  ){
+       if (_wxmaracas3dbrowser!=NULL)          { _wxmaracas3dbrowser->RegenerateAll(true);              }
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->RegenerateAll(true); }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnRegenerateSplineAxe(  wxCommandEvent& event  ){
+       if (_wxmaracas3dbrowser!=NULL)          { _wxmaracas3dbrowser->RegenerateAll(false);            }
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->RegenerateAll(false);   }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnCleanContours(  wxCommandEvent& event  ){
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->CleanContours();        }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::OnRegenerateSignal(  wxCommandEvent& event  ){
+       if (_wxmaracasquantification!=NULL) { _wxmaracasquantification->RegenerateSignal();     }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame02::DeletePanels ( ){
+       delete _actual_panel;
+       _wxmaracasquantification        =       NULL;
+       _wxmaracas3dbrowser                     =       NULL;
+}
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+wxProcessingImagesControl::wxProcessingImagesControl(wxWindow *parent)
+: wxPanel (parent,-1)
+{
+       wxBitmapButton *btnIRMQuant;
+       wxBitmapButton *btnCTQuant;
+       wxBitmapButton *btnSTL;
+       wxBitmapButton *btnManualRegistration;
+       wxBitmapButton *btnVascularTree;
+       wxBitmapButton *btnTests;
+
+       wxBitmap bitmapMask =wxBITMAP( TOOLBAR_V2_bi_mask );
+
+    wxBitmap toolBarBitmapsA[ 5+1 ];
+    wxBitmap toolBarBitmapsB[ 5+1 ];
+
+    toolBarBitmapsA[  0 ] = wxBITMAP( TOOLBAR_V2_bi_bl_IRMQuantification );
+    toolBarBitmapsA[  1 ] = wxBITMAP( TOOLBAR_V2_bi_bl_CTQuantification  );
+    toolBarBitmapsA[  2 ] = wxBITMAP( TOOLBAR_V2_bi_bl_VascularTree             );
+    toolBarBitmapsA[  3 ] = wxBITMAP( TOOLBAR_V2_bi_bl_STLFormat                );
+    toolBarBitmapsA[  4 ] = wxBITMAP( TOOLBAR_V2_bi_bl_Tests                    );
+    toolBarBitmapsA[  5 ] = wxBITMAP( TOOLBAR_V2_bi_bl_ManualRegistration);
+
+       toolBarBitmapsA[0].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsA[1].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsA[2].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsA[3].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsA[4].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsA[5].SetMask( new wxMask(bitmapMask) );
+
+
+    toolBarBitmapsB[  0 ] = wxBITMAP( TOOLBAR_V2_bi_re_IRMQuantification );
+    toolBarBitmapsB[  1 ] = wxBITMAP( TOOLBAR_V2_bi_re_CTQuantification  );
+    toolBarBitmapsB[  2 ] = wxBITMAP( TOOLBAR_V2_bi_re_VascularTree             );
+    toolBarBitmapsB[  3 ] = wxBITMAP( TOOLBAR_V2_bi_re_STLFormat                );
+    toolBarBitmapsB[  4 ] = wxBITMAP( TOOLBAR_V2_bi_re_Tests                    );
+    toolBarBitmapsB[  5 ] = wxBITMAP( TOOLBAR_V2_bi_re_ManualRegistration);
+
+       toolBarBitmapsB[0].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsB[1].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsB[2].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsB[3].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsB[4].SetMask( new wxMask(bitmapMask) );
+       toolBarBitmapsB[5].SetMask( new wxMask(bitmapMask) );
+
+
+       // IRM Quantification
+    btnIRMQuant = new wxBitmapButton( this, -1, toolBarBitmapsA[ 0 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       btnIRMQuant->SetBitmapSelected(toolBarBitmapsB[ 0 ]);
+
+       // CT Quantification
+    btnCTQuant = new wxBitmapButton( this, -1, toolBarBitmapsA[ 1 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );     
+       btnCTQuant->SetBitmapSelected(toolBarBitmapsB[ 1 ]);
+
+       // Vascular Tree
+    btnVascularTree = new wxBitmapButton( this, -1, toolBarBitmapsA[ 2 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );        
+       btnVascularTree->SetBitmapSelected(toolBarBitmapsB[ 2 ]);
+
+       // STL
+    btnSTL = new wxBitmapButton( this, -1, toolBarBitmapsA[ 3 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM ); 
+       btnSTL->SetBitmapSelected(toolBarBitmapsB[ 3 ]);
+
+       // Tests
+    btnTests = new wxBitmapButton( this, -1, toolBarBitmapsA[ 4 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );       
+       btnTests->SetBitmapSelected(toolBarBitmapsB[ 4 ]);
+
+       // Tests2
+    btnManualRegistration = new wxBitmapButton( this, -1, toolBarBitmapsA[ 5 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );  
+       btnManualRegistration->SetBitmapSelected(toolBarBitmapsB[ 5 ]);
+
+       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+       sizer->Add( btnIRMQuant                         , 1, wxALL, 0);
+       sizer->Add( btnCTQuant                          , 1, wxALL, 0);
+       sizer->Add( btnVascularTree                     , 1, wxALL, 0);
+       sizer->Add( btnSTL                                      , 1, wxALL, 0);
+       sizer->Add( btnManualRegistration       , 1, wxALL, 0);
+       sizer->Add( btnTests                            , 1, wxALL, 0);
+
+       this->SetAutoLayout(true);
+       this->SetSizer(sizer);
+       this->Layout(); 
+
+       Connect(btnIRMQuant->GetId()                    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxProcessingImagesControl::OnActiveIRMQuantificationFrame                     );
+       Connect(btnCTQuant->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxProcessingImagesControl::OnActiveCTQuantificationFrame                      );
+       Connect(btnVascularTree->GetId()                , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxProcessingImagesControl::OnActiveVascularTreeExtractionFrame        );
+       Connect(btnSTL->GetId()                                 , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxProcessingImagesControl::OnActiveSTLFormatFrame                                     );
+       Connect(btnManualRegistration->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxProcessingImagesControl::OnActiveTests2Frame                                        );
+       Connect(btnTests->GetId()                               , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxProcessingImagesControl::OnActiveTestsFrame                                         );
+}
+
+//----------------------------------------------------------------------------
+
+wxProcessingImagesControl::~wxProcessingImagesControl()
+{
+}
+
+//----------------------------------------------------------------------------
+void wxProcessingImagesControl::OnActiveIRMQuantificationFrame(wxCommandEvent& event)
+{
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,11112);
+       this->GetParent()->ProcessEvent(newevent);
+//     _wxmaracasframe03->CreateWindowMDI(20);
+}
+//----------------------------------------------------------------------------
+void wxProcessingImagesControl::OnActiveCTQuantificationFrame(wxCommandEvent& event)
+{
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,11113);
+       this->GetParent()->ProcessEvent(newevent);
+//     _wxmaracasframe03->CreateWindowMDI(30);
+}
+//----------------------------------------------------------------------------
+void wxProcessingImagesControl::OnActiveVascularTreeExtractionFrame(wxCommandEvent& event)
+{
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,11114);
+       this->GetParent()->ProcessEvent(newevent);
+//     _wxmaracasframe03->CreateWindowMDI(40);
+}
+//----------------------------------------------------------------------------
+void wxProcessingImagesControl::OnActiveSTLFormatFrame(wxCommandEvent& event)
+{
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,11115);
+       this->GetParent()->ProcessEvent(newevent);
+//     _wxmaracasframe03->CreateWindowMDI(50);
+}
+//----------------------------------------------------------------------------
+void wxProcessingImagesControl::OnActiveTestsFrame(wxCommandEvent& event)
+{
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,11116);
+       this->GetParent()->ProcessEvent(newevent);
+//     _wxmaracasframe03->CreateWindowMDI(60);
+}
+//----------------------------------------------------------------------------
+void wxProcessingImagesControl::OnActiveTests2Frame(wxCommandEvent& event)
+{
+       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,11117);
+       this->GetParent()->ProcessEvent(newevent);
+//     _wxmaracasframe03->CreateWindowMDI(60);
+}
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+wxProcessingImagesTabControl::wxProcessingImagesTabControl(wxWindow *parent,marInterface *mar,wxMaracasNoteBookPatientLstVoi  *patientlstvoi)
+: wxPanel (parent,-1)
+{
+
+       _mar                            =       mar;
+       _patientlstvoi                  =       patientlstvoi;
+       _irmQuantification              =       NULL;
+       _ctQuantification               =       NULL;
+       _vascularTreeExtraction         =       NULL;
+       _stlFormat                      =       NULL;
+
+       _noteBook = new wxNotebook(this, -1);
+       _noteBook->SetSize(750,300);
+
+       wxBitmap bitmapMask = wxBITMAP( TOOLBAR_V2_bi_mask );
+
+       wxBitmap bitmap0 = wxBITMAP( TOOLBAR_V2_bi_bl_Information);
+       wxBitmap bitmap1 = wxBITMAP( TOOLBAR_V2_bi_bl_IRMQuantification);
+       wxBitmap bitmap2 = wxBITMAP( TOOLBAR_V2_bi_bl_CTQuantification);
+       wxBitmap bitmap3 = wxBITMAP( TOOLBAR_V2_bi_bl_VascularTree);
+       wxBitmap bitmap4 = wxBITMAP( TOOLBAR_V2_bi_bl_STLFormat);
+
+       bitmap0.SetMask( new wxMask(bitmapMask) );
+       bitmap1.SetMask( new wxMask(bitmapMask) );
+       bitmap2.SetMask( new wxMask(bitmapMask) );
+       bitmap3.SetMask( new wxMask(bitmapMask) );
+       bitmap4.SetMask( new wxMask(bitmapMask) );
+
+       wxImageList *imageList = new wxImageList(100,100);
+       imageList->Add( bitmap0 );  // 0
+       imageList->Add( bitmap1 );  // 1
+       imageList->Add( bitmap2 );  // 2
+       imageList->Add( bitmap3 );  // 3
+       imageList->Add( bitmap4 );  // 4
+       _noteBook->SetImageList(imageList);
+
+       _noteBook->AddPage(new wxPanel(this,-1),_T("Information  ")             , true, 0 );
+       _noteBook->AddPage(new wxPanel(this,-1),_T("IRM Quantification")        , true, 1 );
+       _noteBook->AddPage(new wxPanel(this,-1),_T("CT Quantification")         , true, 2 );
+       _noteBook->AddPage(new wxPanel(this,-1),_T("Vascular Tree")             , true, 3 );
+       _noteBook->AddPage(new wxPanel(this,-1),_T("STL Format")                , true, 4 );
+       _noteBook->SetSelection(0);
+
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxProcessingImagesTabControl::OnChangingPage );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxProcessingImagesTabControl::OnChangePage );
+
+       wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _noteBook           , 1, wxALL|wxEXPAND, 0);
+
+       this->SetAutoLayout(true);
+       this->SetSizer(sizer);
+       this->Layout(); 
+}
+
+//----------------------------------------------------------------------------
+
+wxProcessingImagesTabControl::~wxProcessingImagesTabControl()
+{
+}
+
+//----------------------------------------------------------------------------
+void wxProcessingImagesTabControl::OnChangingPage(wxNotebookEvent& event)
+{
+}
+//----------------------------------------------------------------------------
+void wxProcessingImagesTabControl::OnChangePage(wxNotebookEvent& event)
+{
+       wxBusyCursor wait;
+       if (_noteBook->GetSelection()==1)
+       {
+               if (_irmQuantification==NULL){
+                       int page=1;
+                       int voi[ 6 ];
+                       wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+                       imageBrowser->ForceToFinisReadActiveImages( );
+                       imageBrowser->GetROI( voi );
+                       _mar->_experiment->setVOI( voi );
+                       _irmQuantification = new wxMaracasNoteBookIRMQuantification(_noteBook->GetPage(page),_mar);
+                       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+                       sizer->Add( _irmQuantification , 1, wxALL|wxEXPAND, 0); 
+                       _noteBook->GetPage(page)->SetAutoLayout(true);
+                       _noteBook->GetPage(page)->SetSizer(sizer);
+                       _noteBook->GetPage(page)->Layout();             
+               }
+       }
+       if (_noteBook->GetSelection()==2)
+       {
+               if (_ctQuantification==NULL){
+                       int page=2;
+                       int voi[ 6 ];
+                       wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+                       imageBrowser->ForceToFinisReadActiveImages( );
+                       imageBrowser->GetROI( voi );
+                       _mar->_experiment->setVOI( voi );
+                       string namefileParent=_patientlstvoi->GetRWCM_namefileVOI();
+                       _ctQuantification = new wxMaracasNoteBookCTQuantification(_noteBook->GetPage(page),_mar,namefileParent);
+                       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+                       sizer->Add( _ctQuantification , 1, wxALL|wxGROW, 0);    
+                       _noteBook->GetPage(page)->SetAutoLayout(true);
+                       _noteBook->GetPage(page)->SetSizer(sizer);
+                       _noteBook->GetPage(page)->Layout();             
+               }
+       }
+
+       if (_noteBook->GetSelection()==3)
+       {
+               if (_vascularTreeExtraction==NULL){
+                       int page=3;
+                       int voi[ 6 ];
+                       wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+                       imageBrowser->ForceToFinisReadActiveImages( );
+                       imageBrowser->GetROI( voi );
+                       _mar->_experiment->setVOI( voi );
+                       _vascularTreeExtraction = new wxMaracasNoteBookVascularTreeExtraction(_noteBook->GetPage(page),_mar);
+                       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+                       sizer->Add( _vascularTreeExtraction , 1, wxALL|wxGROW, 0);      
+                       _noteBook->GetPage(page)->SetAutoLayout(true);
+                       _noteBook->GetPage(page)->SetSizer(sizer);
+                       _noteBook->GetPage(page)->Layout();             
+               }
+       }
+
+       if (_noteBook->GetSelection()==4)
+       {
+               if (_stlFormat==NULL){
+                       int page=4;
+                       int voi[ 6 ];
+                       wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+                       imageBrowser->ForceToFinisReadActiveImages( );
+                       imageBrowser->GetROI( voi );
+                       _mar->_experiment->setVOI( voi );
+                       _stlFormat = new wxMaracasNoteBookSTLFormat(_noteBook->GetPage(page),_mar);
+                       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+                       sizer->Add( _stlFormat , 1, wxALL|wxGROW, 0);   
+                       _noteBook->GetPage(page)->SetAutoLayout(true);
+                       _noteBook->GetPage(page)->SetSizer(sizer);
+                       _noteBook->GetPage(page)->Layout();             
+               }
+       }
+       Refresh();
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasFrame03, wxMDIParentFrame)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+      EVT_MENU(20002, wxMaracasFrame03::OnActiveProcessingModules)
+
+         EVT_MENU(ID_WXILPD_BUTTON_DELETE_ALL_DB                       , wxMaracasFrame03::eventMenuDeleteAllPatientInDB)
+         EVT_MENU(ID_WXILPD_BUTTON_DELETE_DB                           , wxMaracasFrame03::eventMenuDeletePatientInDB)
+
+         EVT_MENU(ID_WXILPD_BUTTON_FILTER_DB                           , wxMaracasFrame03::OnFilterInDB)
+         EVT_MENU(ID_WXILPD_BUTTON_ORDERING_DB                         , wxMaracasFrame03::OnOrderingInDB)
+         EVT_MENU(ID_WXILPD_BUTTON_EDIT_COLUMN                         , wxMaracasFrame03::OnEditColumnsInDB)
+
+
+//      EVT_SIZE(wxMaracasFrame03::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+
+
+      EVT_MENU(11110                   , wxMaracasFrame03::OnActivePatientListVoiFrame                 )
+      EVT_MENU(11111                   , wxMaracasFrame03::OnActiveProcessingFrame                             )
+      EVT_MENU(11112                   , wxMaracasFrame03::OnActiveIRMQuantificationFrame              )
+      EVT_MENU(11113                   , wxMaracasFrame03::OnActiveCTQuantificationFrame               )
+      EVT_MENU(11114                   , wxMaracasFrame03::OnActiveVascularTreeExtractionFrame )
+      EVT_MENU(11115                   , wxMaracasFrame03::OnActiveSTLFormatFrame                              )
+      EVT_MENU(11116                   , wxMaracasFrame03::OnActiveTestsFrame                                  )
+      EVT_MENU(11117                   , wxMaracasFrame03::OnActiveTests2Frame                                 )
+
+      EVT_MENU(MDI_PARAMETERS  , wxMaracasFrame03::OnActiveParams                                              )
+      EVT_MENU(MDI_ABOUT               , wxMaracasFrame03::OnActiveAbout                                               )
+      EVT_MENU(MDI_QUIT                        , wxMaracasFrame03::OnActiveQuit                                                )
+END_EVENT_TABLE()
+
+
+
+
+wxMaracasFrame03::wxMaracasFrame03( wxFrame *parent, wxWindowID id, 
+                                marInterface *mar, char *dictionaryFileName,
+                                const wxString& title, const wxPoint& pos, 
+                                const wxSize& size, long style) 
+       : wxMDIParentFrame(parent, id, title, pos, size,
+                          style | wxNO_FULL_REPAINT_ON_RESIZE)
+{
+
+       wxFont font=wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT );
+
+       _mar                            = mar;
+       _option_menu                    = NULL;
+       _manualRegistrationPanel        = NULL;
+
+       marDictionary marDict;
+//     marDict.LoadDictionary_French();
+       marDict.LoadDictionary_English();
+//     marDict.LoadDictionary_Japanese();
+
+//    CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL);
+//    InitToolBar(GetToolBar());
+
+       CreateWindowMDI(0);
+       Configure_WindowMDI(0);
+}
+//----------------------------------------------------------------------------
+wxMaracasFrame03::~wxMaracasFrame03()
+{
+}
+
+
+//----------------------------------------------------------------------------
+
+void wxMaracasFrame03::eventMenuDeleteAllPatientInDB(wxCommandEvent& event)
+{
+       if (_patientlstvoi->GetNoteBook()->GetSelection()==0)
+       {
+               if (_patientlstvoi->GetWxILPD()->GetNotebook()->GetSelection()==0)
+               {
+                       _patientlstvoi->GetWxILPD()->eventBtnDeleteAllPatientInDB(event);
+               }
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasFrame03::eventMenuDeletePatientInDB(wxCommandEvent& event)
+{
+       if (_patientlstvoi->GetNoteBook()->GetSelection()==0)
+       {
+               if (_patientlstvoi->GetWxILPD()->GetNotebook()->GetSelection()==0)
+               {
+                       _patientlstvoi->GetWxILPD()->eventBtnDeletePatientInDB(event);
+               }
+       }
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasFrame03::OnFilterInDB(wxCommandEvent& event)
+{
+       if (_patientlstvoi->GetNoteBook()->GetSelection()==0)
+       {
+               if (_patientlstvoi->GetWxILPD()->GetNotebook()->GetSelection()==0)
+               {
+                       _patientlstvoi->GetWxILPD()->OnFilter(event);
+               }
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnOrderingInDB(wxCommandEvent& event)
+{
+       if (_patientlstvoi->GetNoteBook()->GetSelection()==0)
+       {
+               if (_patientlstvoi->GetWxILPD()->GetNotebook()->GetSelection()==0)
+               {
+                       _patientlstvoi->GetWxILPD()->OnOrdering(event);
+               }
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnEditColumnsInDB(wxCommandEvent& event)
+{
+       if (_patientlstvoi->GetNoteBook()->GetSelection()==0)
+       {
+               if (_patientlstvoi->GetWxILPD()->GetNotebook()->GetSelection()==0)
+               {
+                       _patientlstvoi->GetWxILPD()->OnEditColumns(event);
+               }
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveProcessingModules(wxCommandEvent& event)
+{
+/*
+       _btnProcessingData      -> Enable();
+       _btnCTQuant                     -> Enable();
+       _btnIRMQuant            -> Enable();
+       _btnTreeExtrac          -> Enable();
+       _btnSTLFormat           -> Enable();
+*/
+       if (_option_menu!=NULL)
+       {
+               _option_menu->Enable(11111, true );
+               _option_menu->Enable(11112, true );
+               _option_menu->Enable(11113, true );
+               _option_menu->Enable(11114, true );
+               _option_menu->Enable(11115, true );
+               _option_menu->Enable(11116, true );
+       }
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::InitToolBar(wxToolBar* toolBar)
+{
+
+    // Set up toolbar
+    wxBitmap toolBarBitmapsA[ 8+1 ];
+    wxBitmap toolBarBitmapsB[ 8+1 ];
+
+    toolBarBitmapsA[  0 ] = wxBITMAP( TOOLBAR_V2_bi_bl_ListPatient_Voi  );
+    toolBarBitmapsA[  1 ] = wxBITMAP( TOOLBAR_V2_bi_bl_Processing        );
+    toolBarBitmapsA[  2 ] = wxBITMAP( TOOLBAR_V2_bi_bl_Params                   );
+    toolBarBitmapsA[  3 ] = wxBITMAP( TOOLBAR_V2_bi_bl_Logo                     );
+    toolBarBitmapsA[  4 ] = wxBITMAP( TOOLBAR_V2_bi_bl_IRMQuantification );
+    toolBarBitmapsA[  5 ] = wxBITMAP( TOOLBAR_V2_bi_bl_CTQuantification  );
+    toolBarBitmapsA[  6 ] = wxBITMAP( TOOLBAR_V2_bi_bl_VascularTree             );
+    toolBarBitmapsA[  7 ] = wxBITMAP( TOOLBAR_V2_bi_bl_STLFormat                );
+    toolBarBitmapsA[  8 ] = wxBITMAP( TOOLBAR_V2_bi_bl_ManualRegistration);
+
+    toolBarBitmapsB[  0 ] = wxBITMAP( TOOLBAR_V2_bi_re_ListPatient_Voi  );
+    toolBarBitmapsB[  1 ] = wxBITMAP( TOOLBAR_V2_bi_re_Processing        );
+    toolBarBitmapsB[  2 ] = wxBITMAP( TOOLBAR_V2_bi_re_Params            );
+    toolBarBitmapsB[  3 ] = wxBITMAP( TOOLBAR_V2_bi_re_Logo              );
+    toolBarBitmapsB[  4 ] = wxBITMAP( TOOLBAR_V2_bi_re_IRMQuantification );
+    toolBarBitmapsB[  5 ] = wxBITMAP( TOOLBAR_V2_bi_re_CTQuantification  );
+    toolBarBitmapsB[  6 ] = wxBITMAP( TOOLBAR_V2_bi_re_VascularTree             );
+    toolBarBitmapsB[  7 ] = wxBITMAP( TOOLBAR_V2_bi_re_STLFormat                );
+    toolBarBitmapsB[  8 ] = wxBITMAP( TOOLBAR_V2_bi_re_ManualRegistration);
+
+    // Set size & margins
+    toolBar->SetMargins( 5, 5 );
+    toolBar->SetToolBitmapSize( wxSize( toolBarBitmapsA[0].GetWidth()+20, toolBarBitmapsA[0].GetHeight()+20 ) );
+
+    // List Patient
+    wxBitmapButton *btn0 = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 0 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       btn0->SetBitmapSelected(toolBarBitmapsB[ 0 ]);
+
+    // Processing data
+    _btnProcessingData = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 1 ]);
+       _btnProcessingData->SetBitmapSelected(toolBarBitmapsB[ 1 ]);
+       _btnProcessingData->Disable();
+
+       // Params
+    wxBitmapButton *btn2 = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 2 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       btn2->SetBitmapSelected(toolBarBitmapsB[ 2 ]);
+
+       // Logo Creatis
+    wxBitmapButton *btn3 = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 3 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       btn3->SetBitmapSelected(toolBarBitmapsB[ 3 ]);
+
+       // IRM Quantification
+    _btnIRMQuant = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 4 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       _btnIRMQuant->SetBitmapSelected(toolBarBitmapsB[ 4 ]);
+       _btnIRMQuant->Disable();
+
+       // CT Quantification
+    _btnCTQuant = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 5 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       _btnCTQuant->SetBitmapSelected(toolBarBitmapsB[ 5 ]);
+       _btnCTQuant->Disable();
+
+       // Vascular Tree Extraction
+    _btnTreeExtrac = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 6 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       _btnTreeExtrac->SetBitmapSelected(toolBarBitmapsB[ 6 ]);
+       _btnTreeExtrac->Disable();
+
+       // STL Format
+    _btnSTLFormat = new wxBitmapButton( toolBar, -1, toolBarBitmapsA[ 7 ],wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|wxBU_BOTTOM );
+       _btnSTLFormat->SetBitmapSelected(toolBarBitmapsB[ 7 ]);
+       _btnSTLFormat->Disable();
+
+    toolBar->AddControl( btn0                          );
+    toolBar->AddControl( _btnProcessingData );
+    toolBar->AddSeparator( );
+    toolBar->AddControl( _btnIRMQuant          );
+    toolBar->AddControl( _btnCTQuant           );
+    toolBar->AddControl( _btnTreeExtrac                );
+    toolBar->AddControl( _btnSTLFormat         );
+    toolBar->AddSeparator( );
+    toolBar->AddControl( btn2                          );
+    toolBar->AddControl( btn3                          );
+
+       toolBar->Realize();
+//     toolBar->SetBackgroundColour( wxColour(130,130,130) );
+
+       Connect(btn0->GetId()                           , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActivePatientListVoiFrame                 );
+       Connect(_btnProcessingData->GetId()     , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveProcessingFrame                             );
+       Connect(btn2->GetId()                           , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveParams                                              );
+       Connect(btn3->GetId()                           , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveAbout                                               );
+       Connect(_btnIRMQuant->GetId()           , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveIRMQuantificationFrame              );
+       Connect(_btnCTQuant->GetId()            , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveCTQuantificationFrame               );
+       Connect(_btnTreeExtrac->GetId()         , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveVascularTreeExtractionFrame );
+       Connect(_btnSTLFormat->GetId()          , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasFrame03::OnActiveSTLFormatFrame                              );
+
+
+
+}
+//----------------------------------------------------------------------------
+
+wxMenuBar *wxMaracasFrame03::CreateMenuBarBase(){
+    // Make a menubar
+    wxMenu *file_menu = new wxMenu;
+
+    file_menu->Append(MDI_QUIT, _T("&Exit"));
+
+    wxMenu *help_menu = new wxMenu;
+    help_menu->Append(MDI_PARAMETERS   , _T("Pa&rameters"));
+    help_menu->Append(MDI_ABOUT                        , _T("&About"));
+
+    wxMenuBar *menu_bar = new wxMenuBar;
+    menu_bar->Append(file_menu   , _T("&File"));
+    menu_bar->Append(help_menu   , _T("&Help"));
+
+       return menu_bar;   
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActivePatientListVoiFrame(wxCommandEvent& event)
+{
+       _frame_ListPatieint_Voi->Maximize();
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveProcessingFrame(wxCommandEvent& event)
+{
+       CreateWindowMDI(10);
+       CreateWindowMDI(11);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveParams(wxCommandEvent& event)
+{
+  wxMaracasParametersDialog *d = new wxMaracasParametersDialog( this, _mar );
+  d->ShowModal( );
+  d->Close( true );
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveAbout(wxCommandEvent& event)
+{
+  wxMaracasHelpDialog* help = new wxMaracasHelpDialog(this, -1);
+  help->ShowModal();
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveQuit(wxCommandEvent& event)
+{
+       this->Close();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveIRMQuantificationFrame(wxCommandEvent& event)
+{
+       CreateWindowMDI(20);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveCTQuantificationFrame(wxCommandEvent& event)
+{
+       CreateWindowMDI(30);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveVascularTreeExtractionFrame(wxCommandEvent& event)
+{
+       CreateWindowMDI(40);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveSTLFormatFrame(wxCommandEvent& event)
+{
+       CreateWindowMDI(50);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveTestsFrame(wxCommandEvent& event)
+{
+       CreateWindowMDI(60);
+}
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::OnActiveTests2Frame(wxCommandEvent& event)
+{
+       CreateWindowMDI(70);
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasFrame03::CreateWindowMDI( int type)
+{
+//    wxMaracasGenericChiFra *subframe=NULL;
+    wxFrame               *subframe=NULL;
+       wxString title_sf;
+
+       // Patient List
+       if (type==0){
+                wxMaracasGenericChiFra *subframeTMP=NULL;
+               subframeTMP = new wxMaracasGenericChiFra(this, _T("..."),
+                                                       wxPoint(50, 50), wxSize(300, 300),wxDEFAULT_FRAME_STYLE  );
+               subframeTMP->SetBlockCloseEvent(true);
+               subframe=subframeTMP;
+               subframe->Maximize();
+               _patientlstvoi = new wxMaracasNoteBookPatientLstVoi(subframe);
+               _patientlstvoi->SetMarInterface(_mar);
+               _frame_ListPatieint_Voi=subframe;
+           title_sf=_T("Patient List");
+
+               wxMenu *database_menu = new wxMenu();
+               database_menu->Append( ID_WXILPD_BUTTON_DELETE_ALL_DB   , _T("Delete all patients"));
+               database_menu->Append( ID_WXILPD_BUTTON_DELETE_DB               , _T("Delete Patient"));
+               database_menu->AppendSeparator();
+               database_menu->Append( ID_WXILPD_BUTTON_FILTER_DB               , _T("Filter"));
+               database_menu->Append( ID_WXILPD_BUTTON_ORDERING_DB             , _T("Ordering"));
+               database_menu->Append( ID_WXILPD_BUTTON_EDIT_COLUMN             , _T("Edit Column"));
+
+
+               _option_menu = new wxMenu;
+               _option_menu->Append(11110, _T("Patient &List - Voi"));
+               _option_menu->Append(11111, _T("&Processing"));
+               _option_menu->AppendSeparator();
+               _option_menu->Append(11112, _T("&IRM Quantification"));
+               _option_menu->Append(11113, _T("&CT Quantification"));
+               _option_menu->AppendSeparator();
+               _option_menu->Append(11114, _T("&Vascular Tree Extraction"));
+               _option_menu->AppendSeparator();
+               _option_menu->Append(11115, _T("&STL"));
+               _option_menu->AppendSeparator();
+               _option_menu->Append(11116, _T("&Tests"));
+
+               _option_menu->Enable(11111, false );
+               _option_menu->Enable(11112, false );
+               _option_menu->Enable(11113, false );
+               _option_menu->Enable(11114, false );
+               _option_menu->Enable(11115, false );
+               _option_menu->Enable(11116, false );
+
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+
+               subframe->SetMenuBar(menu_bar);
+               menu_bar->Insert(2,database_menu,_T("Data Base") );
+               menu_bar->Insert(2,_option_menu,_T("Options") );
+       }
+
+       // Processing 1
+       if (type==10){
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(225, 260),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+               new wxProcessingImagesControl(subframe);
+               title_sf=_T("Processing Images");
+       }
+
+       // Processing 2
+       if (type==11){
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+               subframe->Maximize();
+               new wxProcessingImagesTabControl(subframe,_mar,_patientlstvoi);
+               title_sf=_T("Processing Images");
+       }
+
+       // IRM Quantification 
+       if (type==20){
+               wxBusyCursor wait;
+               int voi[ 6 ];
+               wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+               imageBrowser->ForceToFinisReadActiveImages( );
+               imageBrowser->GetROI( voi );
+               _mar->_experiment->setVOI( voi );
+
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+
+               subframe->Maximize();
+               wxMaracasNoteBookIRMQuantification *irmQuantification = new wxMaracasNoteBookIRMQuantification(subframe,_mar);
+               title_sf=_T("IRM Quantification");
+       }
+
+       // CT Quantification 
+       if (type==30){
+               wxBusyCursor wait;
+               int voi[ 6 ];
+
+//EEDx11
+               wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+               imageBrowser->ForceToFinisReadActiveImages( );
+               imageBrowser->GetROI( voi );
+               _mar->_experiment->setVOI( voi );
+
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+
+               subframe->Maximize();
+
+//EEDx11
+               string namefileParent=_patientlstvoi->GetRWCM_namefileVOI();
+               wxMaracasNoteBookCTQuantification *ctQuantification = new wxMaracasNoteBookCTQuantification(subframe,_mar,namefileParent);
+               title_sf=_T("CT Quantification");
+       }
+
+       // Vascular Tree Extraction 
+       if (type==40){
+               wxBusyCursor wait;
+               int voi[ 6 ];
+//EEDx11
+               wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+               imageBrowser->ForceToFinisReadActiveImages( );
+               imageBrowser->GetROI( voi );
+               _mar->_experiment->setVOI( voi );
+
+
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+               subframe->Maximize();
+//EEDx11
+               wxMaracasNoteBookVascularTreeExtraction *vascularTreeExtraction = new wxMaracasNoteBookVascularTreeExtraction(subframe,_mar);
+               title_sf=_T("Vascular Tree Extraction");
+
+       }
+       
+       // STL Format  
+       if (type==50){
+               wxBusyCursor wait;
+               int voi[ 6 ];
+
+//EEDx11
+               wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+               imageBrowser->ForceToFinisReadActiveImages( );
+               imageBrowser->GetROI( voi );
+               _mar->_experiment->setVOI( voi );
+
+
+
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+
+               subframe->Maximize();
+//EEDx11
+               wxMaracasNoteBookSTLFormat *stlFormat = new wxMaracasNoteBookSTLFormat(subframe,_mar);
+
+               title_sf=_T("STL Format");
+       }
+
+       
+       // Test Format  
+       if (type==60){
+               wxBusyCursor wait;
+               int voi[ 6 ];
+               wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+               imageBrowser->ForceToFinisReadActiveImages( );
+               imageBrowser->GetROI( voi );
+               _mar->_experiment->setVOI( voi );
+
+#ifdef WIN32
+               subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+               wxMenuBar *menu_bar = CreateMenuBarBase();
+               subframe->SetMenuBar(menu_bar);
+#else
+               subframe = new wxFrame(this, -1, _T("..."));
+#endif
+
+               subframe->Maximize();
+               wxMaracasNoteBookTests *testsPanel = new wxMaracasNoteBookTests(subframe,_mar);
+               title_sf=_T("Tests");
+       }
+
+// EED 7 Nov 2006
+       // Test2 Format  
+       if (type==70){
+               bool ok=false;
+
+               if (_manualRegistrationPanel==NULL)
+               {
+                       ok=true;
+               } else {
+                       if ( _manualRegistrationPanel->GetIfSecondVolumeExist()==true )
+                       {
+                               ok=true;
+                       } else {
+                               _manualRegistrationPanel->GenerateSecondVolume(_mar);
+                               _manualRegistrationPanel=NULL;
+                       }
+               }
+
+               if (ok==true){
+                       wxBusyCursor wait;
+                       int voi[ 6 ];
+                       wxMaracasImageBrowser02 *imageBrowser= _patientlstvoi->GetWxMaracasImageBrowser02();
+                       imageBrowser->ForceToFinisReadActiveImages( );
+                       imageBrowser->GetROI( voi );
+                       _mar->_experiment->setVOI( voi );
+
+#ifdef WIN32
+                       subframe = new wxMaracasGenericChiFra(this, _T("..."),wxPoint(-1, -1),wxSize(750, 600),wxDEFAULT_FRAME_STYLE);
+                       wxMenuBar *menu_bar = CreateMenuBarBase();
+                       subframe->SetMenuBar(menu_bar);
+#else
+                       subframe = new wxFrame(this, -1, _T("..."));
+#endif
+
+                       subframe->Maximize();
+                       _manualRegistrationPanel = new wxMaracasNoteBookManualRegistration(subframe,_mar);
+                       title_sf=_T("Manual registration");
+               }
+       }
+
+
+
+       if (subframe!=NULL)
+       {
+               subframe->SetTitle(title_sf);
+               subframe->CreateStatusBar();
+               subframe->SetStatusText(title_sf);
+               subframe->Show(TRUE);
+       }
+
+
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasFrame03::Configure_WindowMDI( int type)
+{
+       if (type==0)
+       {
+//             _patientlstvoi->Configure();
+       }
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasGenericChiFra, wxMDIChildFrame)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+    EVT_CLOSE(wxMaracasGenericChiFra::OnClose)
+END_EVENT_TABLE()
+
+
+wxMaracasGenericChiFra::wxMaracasGenericChiFra(wxMDIParentFrame *parent, const wxString& title,
+                 const wxPoint& pos, const wxSize& size,
+                 const long style)
+       : wxMDIChildFrame(parent, -1, title, pos, size,
+                         style | wxNO_FULL_REPAINT_ON_RESIZE)
+{
+       _blockClose=false;
+}
+//----------------------------------------------------------------------------
+wxMaracasGenericChiFra::~wxMaracasGenericChiFra()
+{
+       wxMDIParentFrame *parent = (wxMDIParentFrame*)GetParent();
+       parent->ActivateNext();
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasGenericChiFra::OnClose(wxCloseEvent& event)
+{
+       if (_blockClose==true){
+               wxMessageDialog msg(this, _T("You can't close this window.."), _T("Message box"), wxOK );
+               msg.ShowModal();
+               event.Veto();
+               return;
+       } else {
+               event.Skip();
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasGenericChiFra::SetBlockCloseEvent(bool blockClose)
+{
+       _blockClose=blockClose;
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+// EED 3 Nov 2006
+
+
+FileInfoNode::FileInfoNode(string filename, string dirfile)
+{
+       _filename               = filename;
+       _filenameParent = "";
+       _dirfile                = dirfile;
+}
+//----------------------------------------------------------------------------
+FileInfoNode::~FileInfoNode()
+{
+}
+//----------------------------------------------------------------------------
+string FileInfoNode::GetFileName()
+{
+       return _filename;
+}
+//----------------------------------------------------------------------------
+string FileInfoNode::GetFileNameParent()
+{
+       return _filenameParent;
+}
+//----------------------------------------------------------------------------
+void FileInfoNode::SetFileNameParent(string parent)
+{
+       _filenameParent=parent;
+}
+//----------------------------------------------------------------------------
+string FileInfoNode::GetDirFile()
+{
+       return _dirfile;
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+FileInformationModel::FileInformationModel()
+{
+}
+//----------------------------------------------------------------------------
+FileInformationModel::~FileInformationModel()
+{
+}
+//----------------------------------------------------------------------------
+int    FileInformationModel::GetSizeLstFile_filter()
+{
+       int count=0;
+       int i,size = _lstFileInfoNodes.size();
+       for ( i=0 ; i<size ; i++ )
+       {
+               if (_lstFileInfoNodes[i]->GetFileNameParent()==_filtre_1)
+               {
+                       count++;
+               }
+       }
+       return count;
+}
+//----------------------------------------------------------------------------
+string FileInformationModel::GetFileName_filter(int i)
+{
+       string result;
+       int count=0;
+       int ii,size = _lstFileInfoNodes.size();
+       for ( ii=0 ; ii<size ; ii++ )
+       {
+               if ( (_lstFileInfoNodes[ii]->GetFileNameParent()==_filtre_1) && (count==i) )
+               {
+                       result=_lstFileInfoNodes[ii]->GetFileName();
+                       break;
+               }
+
+               if (_lstFileInfoNodes[ii]->GetFileNameParent()==_filtre_1)
+               {
+                       count++;
+               }
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+int    FileInformationModel::GetSizeLstFile()
+{
+       return _lstFileInfoNodes.size();
+}
+//----------------------------------------------------------------------------
+string FileInformationModel::GetFileName(int i)
+{
+       return _lstFileInfoNodes[i]->GetFileName();
+}
+//----------------------------------------------------------------------------
+void FileInformationModel::ResetModel()
+{
+       int i,size=_lstFileInfoNodes.size();
+       for(i=0;i<size;i++)
+       {
+               delete _lstFileInfoNodes[i];
+       }
+       _lstFileInfoNodes.clear();
+}
+//----------------------------------------------------------------------------
+void FileInformationModel::ReadModel(string dirFile)
+{
+       ResetModel();
+
+       wxString wxdirfile( wxString(dirFile.c_str() , wxConvUTF8) );
+       wxDir dir(wxdirfile);
+    if ( !dir.IsOpened() )
+    {
+        // deal with the error here - wxDir would already log an error message
+        // explaining the exact reason of the failure
+        return;
+    }
+       wxString filename=_T("");
+    bool cont = dir.GetFirst(&filename, _T("*.MaracasInfo"));
+    while ( cont )
+    {
+               _lstFileInfoNodes.push_back( new FileInfoNode( (const char*)(filename.mb_str()) , dirFile) );
+               filename=_T("");
+        cont = dir.GetNext( &filename );
+    }
+       LinkRelations();
+}
+//----------------------------------------------------------------------------
+void FileInformationModel::Filtre_1(string filtre)
+{
+       _filtre_1=filtre;
+}
+
+//----------------------------------------------------------------------------
+void FileInformationModel::LinkRelations()
+{
+       char tmp[255];
+       FILE *ff;
+       string filename;
+       string dirfile;
+       string name;
+       int i,size=_lstFileInfoNodes.size();
+       for(i=0;i<size;i++)
+       {
+               filename        = _lstFileInfoNodes[i]->GetFileName();
+               dirfile         = _lstFileInfoNodes[i]->GetDirFile();
+               name=dirfile+"/";
+               name=name+filename;
+               ff=fopen(name.c_str(),"r+");
+               fscanf(ff,"%s",tmp);
+               fscanf(ff,"%s",tmp);
+               fscanf(ff,"%s",tmp);
+               _lstFileInfoNodes[i]->SetFileNameParent(tmp);
+               fclose(ff);
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+string wxReadWriteConf::_workDirectory =       "c:/Maracas_configuration/";
+
+
+wxReadWriteConf::wxReadWriteConf(wxWindow *parent,string parentFile)
+: wxDialog(parent, -1, wxString(_T("Read-Write Configuration")) ,wxDefaultPosition,wxSize(800,400), wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE  )
+{
+       _parentFile = parentFile;
+       wxButton *btnDirectory = new wxButton(this,-1,_T("Directory"));
+       _directoryTXT = new wxStaticText(this , -1 , wxString(_workDirectory.c_str(), wxConvUTF8) );
+
+       wxString tempTXT(_T("Parent File:  "));
+       tempTXT=tempTXT +  wxString(_parentFile.c_str(), wxConvUTF8);
+       wxStaticText *parentFileTXT = new wxStaticText(this , -1 , tempTXT );
+       Connect(btnDirectory->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &wxReadWriteConf::eventBtnWorkDirectory);
+       wxWindow *wxwindow = CreateReadModule(this);    
+       wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);
+       sizerA->Add(parentFileTXT,1,wxALL,5);
+       wxBoxSizer *sizerB = new wxBoxSizer(wxHORIZONTAL);
+       sizerB->Add(btnDirectory,1,wxALL,5);
+       sizerB->Add(_directoryTXT,1,wxALL,10);
+
+       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add(sizerA,0,wxALL,0);
+       sizer->Add(sizerB,0,wxALL,5);
+       sizer->Add(wxwindow,1,wxGROW|wxEXPAND,0);
+       this->SetSizer(sizer);
+       this->Layout(); 
+
+       _nameReadFile="";
+       _fim = new FileInformationModel();
+       ResetView();
+}
+//----------------------------------------------------------------------------
+wxReadWriteConf::~wxReadWriteConf()
+{
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::ResetView()
+{
+       _fim->Filtre_1(_parentFile);
+       _fim->ReadModel(_workDirectory);
+       RefreshReadFilesList();
+       RefreshAllFilesList();
+}
+//----------------------------------------------------------------------------
+wxWindow *wxReadWriteConf::CreateReadModule(wxWindow *parent)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       _wxviewinfo= new wxTextCtrl(panel,-1,_T(""),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE|wxHSCROLL  );
+
+       wxBoxSizer * sizer = new wxBoxSizer(wxHORIZONTAL);
+       sizer->Add( CreateListFilesModule(panel), 1,wxGROW|wxEXPAND,0 );
+       sizer->Add( _wxviewinfo , 1,wxEXPAND,0 );
+
+       panel->SetSizer(sizer);
+       panel->Layout();        
+
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+wxWindow *wxReadWriteConf::CreateListFilesModule(wxWindow *parent)
+{
+       wxPanel *panel                  = new wxPanel(parent,-1);
+       wxNotebook *notebook    = new wxNotebook(panel,-1); 
+       notebook->AddPage( CreateReadFileModule(notebook) ,wxString(_T("Read File")));
+       notebook->AddPage( CreateListAllFilesModule(notebook) ,wxString(_T("All files")));
+       notebook->AddPage( new wxPanel(notebook,-1) ,wxString(_T("Files Relation")));
+       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+       sizer->Add(notebook,1,wxEXPAND|wxGROW,0);
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+//----------------------------------------------------------------------------
+wxWindow *wxReadWriteConf::CreateReadFileModule(wxWindow *parent)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+                                _wxlstFiles    =       new wxListBox( panel ,  -1 , wxDefaultPosition , wxSize(900,900) );
+       wxButton        *btnReadFile    =       new wxButton(panel, -1, _T("    Read \n information file") );
+       wxButton        *btnWriteFile   =       new wxButton(panel, -1, _T("    Create \n new file information"));
+       wxButton        *btnReWriteFile =       new wxButton(panel, -1, _T("    ReWrite \n file information"));
+
+
+       Connect(_wxlstFiles->GetId(),wxEVT_COMMAND_LISTBOX_SELECTED ,(wxObjectEventFunction) &wxReadWriteConf::OnShowFile01);
+       Connect(_wxlstFiles->GetId(),wxEVT_COMMAND_LISTBOX_DOUBLECLICKED ,(wxObjectEventFunction) &wxReadWriteConf::eventBtnReadFile);
+        
+       Connect(btnReadFile->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &wxReadWriteConf::eventBtnReadFile);
+       Connect(btnWriteFile->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &wxReadWriteConf::eventBtnWriteFile);
+       Connect(btnReWriteFile->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &wxReadWriteConf::eventBtnReWriteFile);
+
+       wxBoxSizer *sizerB                      =       new wxBoxSizer(wxHORIZONTAL);
+       sizerB->Add( btnReadFile , 1 , wxALL|wxALIGN_CENTER|wxEXPAND , 5 );
+       sizerB->Add( btnWriteFile , 1 , wxALL|wxALIGN_CENTER|wxEXPAND , 5 );
+       sizerB->Add( btnReWriteFile , 1 , wxALL|wxALIGN_CENTER|wxEXPAND , 5 );
+       wxBoxSizer *sizer                       =       new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _wxlstFiles , 1 , wxGROW | wxEXPAND , 0 );
+       sizer->Add( sizerB , 0 , wxALIGN_CENTER , 5 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+wxWindow *wxReadWriteConf::CreateListAllFilesModule(wxWindow *parent)
+{
+       wxPanel *panel                  =       new wxPanel(parent,-1);
+                       _wxlstAllFiles  =       new wxListBox( panel ,  -1 , wxDefaultPosition , wxSize(900,900) );
+
+       Connect(_wxlstAllFiles->GetId(),wxEVT_COMMAND_LISTBOX_SELECTED ,(wxObjectEventFunction) &wxReadWriteConf::OnShowFile02);
+
+       wxBoxSizer *sizer                       =       new wxBoxSizer(wxVERTICAL);
+       sizer->Add( _wxlstAllFiles , 1 , wxGROW | wxEXPAND , 0 );
+       panel->SetSizer(sizer);
+       panel->Layout();        
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+void wxReadWriteConf::eventBtnReadFile(wxCommandEvent &event)
+{
+       if (_nameReadFile!="")
+       {
+               wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,30002);
+               this->GetParent()->ProcessEvent(newevent);
+               this->Close();
+       }
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::eventBtnReWriteFile(wxCommandEvent &event)
+{      
+       _nameWriteFile=_nameReadFile;
+       int sizeStr=_nameWriteFile.length() - string(".MaracasInfo").length();
+    _nameWriteFile = _nameWriteFile.substr(0,sizeStr);
+
+       if (_nameWriteFile!="")
+       {
+               wxString msg(_nameReadFile.c_str(), wxConvUTF8);
+               msg = msg+_T("\n\n\nYou really want to modify this file ?");
+               int result = wxMessageDialog(this,msg,_T("Warning.."),wxOK | wxCANCEL).ShowModal();
+               if (result==wxID_OK){
+                       wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,30001);
+                       this->GetParent()->ProcessEvent(newevent);
+                       this->ResetView();
+                       this->Close();
+               }
+       } else {
+               wxMessageDialog(this,_T("First, you have to select a file."),_T("Warning.."), wxOK).ShowModal();
+       }
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::eventBtnWriteFile(wxCommandEvent &event)
+{
+       wxTextEntryDialog *filedlg = new wxTextEntryDialog(this, _T("Write MaracaInfo"));
+       if(filedlg->ShowModal() == wxID_OK)
+    {  
+               wxBusyCursor wait;
+               string nameFile( (const char*)(filedlg->GetValue().mb_str()) );
+               if (nameFile!=""){
+
+                       string name = _workDirectory+"/"+nameFile+".MaracasInfo";
+                       FILE *ff=fopen( name.c_str() , "r+" );
+                       if (ff!=NULL)
+                       {
+                               fclose(ff);
+                               wxMessageDialog(this,_T("...Error... \n\nThis file already exists."),_T("Error.."), wxOK).ShowModal();
+                       } else {
+                               _nameWriteFile=nameFile;
+                               wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,30001);
+                               this->GetParent()->ProcessEvent(newevent);
+                               this->ResetView();
+                               this->Close();
+                       } 
+               }
+    }
+
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::OnShowFile01(wxCommandEvent &event)
+{
+       int id=_wxlstFiles->GetSelection();
+       if (id!=-1){
+               _nameReadFile = (const char*)(_wxlstFiles->GetString(id).mb_str());
+               ShowInformation(_wxlstFiles,_wxviewinfo);
+       }
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::OnShowFile02(wxCommandEvent &event)
+{
+       ShowInformation(_wxlstAllFiles,_wxviewinfo);
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::ShowInformation(wxListBox *wxlistbox , wxTextCtrl* wxtextctrl )
+{
+       int id=wxlistbox->GetSelection();
+       if (id!=-1){
+               string namefile = (const char*)(wxlistbox->GetString(id).mb_str());
+               if (namefile!=""){
+                       wxString text;
+                       char tmp[255];
+                       FILE *ff;
+                       string nf(this->_workDirectory);
+                       nf=nf+"/";
+                       nf=nf+namefile.c_str();
+
+                       text = wxString(nf.c_str(), wxConvUTF8);
+                       text = text + _T("\n--------------------------------------------\n");
+
+                       ff=fopen(nf.c_str(),"r+");
+                       while (!feof(ff)){
+                               strcpy(tmp,"");
+                               fgets(tmp,255,ff);
+                               text = text + wxString(tmp, wxConvUTF8);
+                       }
+                       fclose(ff);
+
+                       wxtextctrl->SetValue(text);
+               }
+       }
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::eventBtnWorkDirectory(wxCommandEvent &event)
+{
+
+
+       wxDirDialog *filedlg = new wxDirDialog(this, _T("Work Directory"), wxString(_workDirectory.c_str(), wxConvUTF8) );
+       if(filedlg->ShowModal() == wxID_OK)
+    {  
+               wxBusyCursor wait;
+               _workDirectory = (const char*)(filedlg->GetPath().mb_str());
+               _directoryTXT->SetLabel( wxString(_workDirectory.c_str(), wxConvUTF8) );
+               ResetView();
+       }
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::RefreshReadFilesList()
+{
+       _wxlstFiles->Clear();
+       wxString wxfilename;
+       int i,size = _fim->GetSizeLstFile_filter();
+       for (i=0; i<size; i++)
+       {
+               _wxlstFiles->Append( wxString(_fim->GetFileName_filter(i).c_str(), wxConvUTF8) );
+       }
+}
+//----------------------------------------------------------------------------
+void wxReadWriteConf::RefreshAllFilesList()
+{
+       _wxlstAllFiles->Clear();
+       wxString wxfilename;
+       int i,size = _fim->GetSizeLstFile();
+       for (i=0; i<size; i++)
+       {
+               _wxlstAllFiles->Append( wxString(_fim->GetFileName(i).c_str(), wxConvUTF8) );
+       }
+}
+//----------------------------------------------------------------------------
+string wxReadWriteConf::GetNameWriteFile()
+{
+       return _nameWriteFile;
+}
+//----------------------------------------------------------------------------
+string wxReadWriteConf::GetNameReadFile()
+{
+       return _nameReadFile;
+}
+
+//----------------------------------------------------------------------------
+string wxReadWriteConf::GetWorkDirectory()
+{
+       return _workDirectory;
+}
+
+string wxReadWriteConf::GetParentFile()
+{
+       return _parentFile;
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookPatientLstVoi , wxPanel)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+//      EVT_MENU(20001, wxMaracasNoteBookPatientLstVoi::OnSelectPatientStudySerieImage)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+
+      EVT_MENU(30001, wxMaracasNoteBookPatientLstVoi::OnPersistence_Write)
+      EVT_MENU(30002, wxMaracasNoteBookPatientLstVoi::OnPersistence_Read)
+
+
+END_EVENT_TABLE()
+
+
+wxMaracasNoteBookPatientLstVoi::wxMaracasNoteBookPatientLstVoi(wxWindow *parent)
+       : wxPanel(parent, -1)
+{
+
+       this->SetAutoLayout(true);
+
+
+//EED 4 oct 2006
+       _marRAWFiles                            = NULL;
+       _marRAW2Files                           = NULL;
+       _marRAW2AsciiFiles                      = NULL;
+       _marGdcmDicomILPD                       = NULL;
+
+
+// EED 14 Nov 2006
+       _wxreadwriteconf=NULL;
+
+
+       _wxMaracasMPR                           = NULL;
+       _wxMaracasImageBrowser02        = NULL;
+       _mar2                                           = NULL;
+
+       _widgetMesure                           = NULL;
+//EED 15Avril2008              _wxvtk2Dbaseview                        = NULL;
+//EED 15Avril2008              _vtkbasedata                            = NULL; 
+
+       _backStringFirstFile                    = "";
+       _backStringFirstFile2                   = "";
+
+       _voiBack[0]=_voiBack[1]=_voiBack[2]=_voiBack[3]=_voiBack[4]=_voiBack[5]=-1;
+       
+       _noteBook = new wxNotebook(this, -1);
+
+       _noteBook->SetSize(750,300);
+       wxImageList *imageList = new wxImageList(50,50);
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_ListPatient );
+       wxBitmap bitmap1        = wxBITMAP( TOOLBAR_V2_sm_re_ListPatient );
+       wxBitmap bitmap2        = wxBITMAP( TOOLBAR_V2_sm_re_ListPatient );
+       wxBitmap bitmap3        = wxBITMAP( TOOLBAR_V2_sm_bl_voi );
+       wxBitmap bitmap4        = wxBITMAP( TOOLBAR_V2_sm_re_voi );
+       wxBitmap bitmap5        = wxBITMAP( TOOLBAR_V2_sm_tr_VOI );
+       wxBitmap bitmap6        = wxBITMAP( TOOLBAR_V2_sm_bl_Processing );
+       wxBitmap bitmap7        = wxBITMAP( TOOLBAR_V2_sm_bl_Processing );
+       wxBitmap bitmap8        = wxBITMAP( TOOLBAR_V2_sm_tr_Processing );
+       wxBitmap bitmap9        = wxBITMAP( TOOLBAR_V2_sm_bl_MPR );
+       wxBitmap bitmap10       = wxBITMAP( TOOLBAR_V2_sm_bl_MPR );
+       wxBitmap bitmap11       = wxBITMAP( TOOLBAR_V2_sm_tr_MPR );
+
+       bitmap0.SetMask(new wxMask( mask ));
+       bitmap1.SetMask(new wxMask( mask ));
+       bitmap2.SetMask(new wxMask( mask ));
+       bitmap3.SetMask(new wxMask( mask ));
+       bitmap4.SetMask(new wxMask( mask ));
+       bitmap5.SetMask(new wxMask( mask ));
+       bitmap6.SetMask(new wxMask( mask ));
+       bitmap7.SetMask(new wxMask( mask ));
+       bitmap8.SetMask(new wxMask( mask ));
+       bitmap9.SetMask(new wxMask( mask ));
+       bitmap10.SetMask(new wxMask( mask ));
+       bitmap11.SetMask(new wxMask( mask ));
+
+       imageList->Add(  bitmap0        );      // 0
+       imageList->Add(  bitmap1        );      // 1
+       imageList->Add(  bitmap2        );      // 2
+       imageList->Add(  bitmap3        );      // 3
+       imageList->Add(  bitmap4        );      // 4
+       imageList->Add(  bitmap4        );      // 5
+       imageList->Add(  bitmap6        );      // 6
+       imageList->Add(  bitmap7        );      // 7
+       imageList->Add(  bitmap8        );      // 8
+       imageList->Add(  bitmap9        );      // 9
+       imageList->Add(  bitmap10       );      // 10
+       imageList->Add(  bitmap11       );      // 11
+       _noteBook->SetImageList(imageList);
+
+
+//EED 15Avril2008      wxPanel *panel_with_wxILPD = CreatePanel_WxILPD( _noteBook );
+//EED 15Avril2008    ILPDViewListPatient*      _ilpdViewListPatient    = new ILPDViewListPatient( new ILPDViewWxWindow(_wxILPD) );
+
+       wxILPDwithImage *panel_with_wxILPD = new wxILPDwithImage( _noteBook );
+       panel_with_wxILPD->Configure();
+       _wxILPD = panel_with_wxILPD->GetWxILPD();
+
+       wxProcessingImagesControl *processingCtrl               = new wxProcessingImagesControl(_noteBook);
+
+       _noteBook->AddPage( panel_with_wxILPD           , _T("Patient List  >>   ") , true, 0 );
+       _noteBook->AddPage(new wxPanel(_noteBook,-1)    , _T("   View Image  >>  ") , true, 5 );
+       _noteBook->AddPage(new wxPanel(_noteBook,-1)    , _T("   MPR      ")             , true, 11 );
+       _noteBook->AddPage(processingCtrl               , _T("   Processing      ") , true, 8 );
+       _noteBook->SetSelection(0);
+
+
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookPatientLstVoi::OnChangePageToVOI );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookPatientLstVoi::OnChangePage );
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("Load Patient Image "));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+//EEDxx2.6
+//     wxNotebookSizer *nbs = new wxNotebookSizer( _noteBook );
+
+// --
+       wxButton *btnReadWriteConfig    = new wxButton(this,-1,_T("Read-Write Config"));
+       Connect(btnReadWriteConfig->GetId() ,  wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasNoteBookPatientLstVoi::OnReadWriteConf_Maracas );
+       wxButton *btnHelp                               = new wxButton(this,-1,_T("Help"));
+       wxButton *btnClose                              = new wxButton(this,-1,_T("Close"))
+               ;
+    wxBoxSizer *sizerB                         = new wxBoxSizer(wxHORIZONTAL);
+       sizerB->Add( btnReadWriteConfig , 0, wxALIGN_RIGHT, 10);
+       sizerB->Add( btnHelp                    , 0, wxALIGN_RIGHT, 10);
+       sizerB->Add( btnClose                   , 0, wxALIGN_RIGHT, 10);
+       
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( sizerB              , 0, wxALIGN_RIGHT, 10);
+       sizer->Add( title               , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+
+       sizer->Add( _noteBook   , 3, wxGROW|wxALL, 10 );
+
+       this->SetSizer(sizer);
+       this->Layout(); 
+
+//EEDxx2.6
+//     FitInside();
+
+
+//     ConfigureVTK();
+}
+//----------------------------------------------------------------------------
+wxMaracasNoteBookPatientLstVoi::~wxMaracasNoteBookPatientLstVoi()
+{
+
+//EED 15Avril2008              if (_vtkbasedata!=NULL)         {       delete  _vtkbasedata;           }
+//EED 15Avril2008          if (_wxvtk2Dbaseview!=NULL) {       delete  _wxvtk2Dbaseview;       }
+
+       if (_mar2!=NULL) 
+       {
+//             delete _mar2;
+       }
+
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::SetMarInterface(marInterface *mar)
+{
+       _mar=mar;
+}
+
+
+
+//----------------------------------------------------------------------------
+
+void wxMaracasNoteBookPatientLstVoi::CreateMPRPanel()
+{
+       wxBusyCursor wait;
+       //  Create panel
+       if (_wxMaracasMPR!=NULL)
+       {
+               delete _wxMaracasMPR;
+//             delete _mar2;
+       }
+
+       int voi[ 6 ];
+       _wxMaracasImageBrowser02->ForceToFinisReadActiveImages( );
+       _wxMaracasImageBrowser02->GetROI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar2=new marInterface();
+
+       _mar2->_parameters->setRescaleSlope( _mar->_parameters->getRescaleSlope() );
+       _mar2->_parameters->setRescaleIntercept( _mar->_parameters->getRescaleIntercept() );
+
+
+       double spcOriginalImage[3];
+       spcOriginalImage[0]=_mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension);
+       spcOriginalImage[1]=_mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension);
+       spcOriginalImage[2]=_mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension);
+
+//EEDx1
+//     _mar2->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, _mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar2->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar2->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, spcOriginalImage[0] );
+       _mar2->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, spcOriginalImage[1] );
+       _mar2->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, spcOriginalImage[2] );
+
+       _mar->_experiment->getVOI( voi );
+       _mar2->_experiment->setVOI( voi );
+       _mar2->SetDicom(_mar->_dicom);
+       _mar2->initExperiment( );
+
+       vtkImageData *imagedata;
+       imagedata = _mar2->_experiment->getDynData( )->getVolume( )->castVtk();
+       imagedata->Update(); 
+
+       marImageData *marimagedata =  new marImageData(imagedata);
+       marimagedata->SetSpcOriginal(spcOriginalImage);
+       marimagedata->SetVoiOriginal(voi);
+
+       _wxMaracasMPR = new wxMaracasMPR( _noteBook->GetPage(2), marimagedata , _mar2->_parameters->getVoxelSize( ) );
+       _wxMaracasMPR->ConfigureVTK();
+
+       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+       sizer->Add( _wxMaracasMPR , 1, wxALL|wxGROW, 0);        
+       _noteBook->GetPage(2)->SetAutoLayout(true);
+       _noteBook->GetPage(2)->SetSizer(sizer);
+       _noteBook->GetPage(2)->Layout();        
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::OnChangePage(wxNotebookEvent& event)
+{
+       vector <string*> lstStringFileName;
+       if ( (_noteBook->GetSelection()==2) && event.GetOldSelection()==1 )
+       {
+               _wxILPD->GetLstImageFiles(&lstStringFileName);
+               if (lstStringFileName.size()!=0)
+               {
+                       int voi[6];
+                       _wxMaracasImageBrowser02->GetROI( voi );
+                       if ( (_backStringFirstFile2!=*(lstStringFileName[0])) || 
+                                ( _voiBack[0]!=voi[0]) ||  ( _voiBack[1]!=voi[1]) || ( _voiBack[2]!=voi[2]) || 
+                                ( _voiBack[3]!=voi[3]) ||  ( _voiBack[4]!=voi[4]) || ( _voiBack[5]!=voi[5])   )
+                       {
+                               _backStringFirstFile2=*(lstStringFileName[0]);
+                               _wxMaracasImageBrowser02->GetROI( _voiBack );
+                               CreateMPRPanel();
+                       }
+               }
+
+       } else {
+               if ( (_noteBook->GetSelection()==2) && event.GetOldSelection()!=1 )
+               {
+                       wxMessageDialog msg(this, _T("Before this, you have to select the VOI in View image module.."), _T("Message box"), wxOK );
+                       msg.ShowModal();
+                       _noteBook->SetSelection(1);
+               }
+
+       }
+
+//     Refresh();
+       _wxILPD->Refresh();
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::OnChangePageToVOI(wxNotebookEvent& event)
+{
+       //event.Skip();
+
+       if (_noteBook->GetSelection()==0){
+
+               FILE *ff;
+               bool okFirst=true;
+       //      bool okAllFileExists = true;
+       //      int i;
+               string msgLstFile="";
+
+
+               //
+       //EED 4 Oct 2006
+               if (_wxILPD->GetTypeOfReadFiles()==0)
+               {
+                       if (_marGdcmDicomILPD==NULL)
+                       {
+                               _marGdcmDicomILPD = new marGdcmDicomILPD( _mar->_parameters );
+                       }
+                       _mar->SetDicom(_marGdcmDicomILPD);
+               }
+
+               //
+       //EED 4 Oct 2006
+               if (_wxILPD->GetTypeOfReadFiles()==2)
+               {
+
+                       if ((_wxILPD->GetSubTypeOfReadFiles()==0) &&(_marRAWFiles==NULL))
+                       {
+                               _marRAWFiles = new marRAWFiles( _mar->_parameters );
+                               _mar->SetDicom(_marRAWFiles);
+                       }
+
+                       if ((_wxILPD->GetSubTypeOfReadFiles()==100) &&(_marGdcmDicomILPD==NULL))
+                       {
+                               _marGdcmDicomILPD = new marGdcmDicomILPD( _mar->_parameters );
+                               _mar->SetDicom(_marGdcmDicomILPD);
+                       }
+
+                       if ((_wxILPD->GetSubTypeOfReadFiles()==200) &&(_marRAW2Files==NULL))
+                       {
+                               _marRAW2Files = new marRAW2Files( _mar->_parameters );
+                               _mar->SetDicom(_marRAW2Files);
+                       }
+                       if ((_wxILPD->GetSubTypeOfReadFiles()==300) &&(_marRAW2AsciiFiles==NULL))
+                       {
+                               _marRAW2AsciiFiles = new marRAW2AsciiFiles( _mar->_parameters );
+                               _mar->SetDicom(_marRAW2AsciiFiles);
+                       }
+
+               }
+
+               //
+
+               if (_wxILPD->GetTypeOfSelection() == 3)
+               {
+                       wxBusyCursor wait;
+                       vector <string*> *lstStringFileName;
+                       _mar->_dicom->CleanListImages();
+                       lstStringFileName = _mar->_dicom->GetListImages( );
+                       _wxILPD->GetLstImageFiles(lstStringFileName);
+                       if (lstStringFileName->size()!=0)
+                       {
+
+       //EED 9 oct 2006
+       //                      marGdcmDicomILPD *margdcmdicomILPD = (marGdcmDicomILPD*)_mar->_dicom;
+       //                      margdcmdicomILPD->SetListImages( &lstStringFileName );
+
+
+                               std::string *tmpStr=(*lstStringFileName)[0];
+                               if ( _backStringFirstFile!=*tmpStr )  
+                               {
+                                       if (_wxILPD->GetTypeOfReadFiles()==0)
+                                       {
+                                               _backStringFirstFile=*tmpStr;
+                                       } else {
+                                               _backStringFirstFile="-1";
+                                       }
+                                       _noteBook->SetPageImage(1, 4);  // VOI Button Blue
+                                       _noteBook->SetPageImage(2, 9);  // MPR Button Blue
+                                       _noteBook->SetPageImage(3, 6);  // Processing Button Blue
+
+       /*
+                                       // Verifying that the list of files exist
+                                       for( i=0 ; i<lstStringFileName.size() ; i++ )
+                                       {
+                                               ff = fopen(lstStringFileName[i]->c_str(),"r");  
+                                               if (ff!=NULL)
+                                               {
+                                                       fclose(ff);
+                                               } else {
+                                                       if (i==0)
+                                                       {
+                                                               okFirst=false;
+                                                               break;
+                                                       }
+                                                       okAllFileExists = false;
+                                                       msgLstFile = msgLstFile + lstStringFileName[i]->c_str()+ "\n";
+                                               }
+                                       }
+                                       if ((okAllFileExists == false) && (okFirst==true))
+                                       {
+                                               wxDialog *dialog = new wxDialog( this , -1, wxString("The following files doesn't exist:"), wxDefaultPosition, wxSize(550,300),  wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );
+                                               
+                                               wxTextCtrl *textCtrl = new wxTextCtrl(dialog, -1, msgLstFile.c_str() ,wxDefaultPosition , wxSize(100,100) , wxTE_MULTILINE | wxTE_READONLY );
+                                               textCtrl->SetSelection(0,0);
+
+                                               wxBoxSizer *sizer       = new wxBoxSizer(wxVERTICAL  );
+                                               sizer->Add( textCtrl , 1, wxALL|wxEXPAND, 0);
+                                               dialog->SetAutoLayout(true);
+                                               dialog->SetSizer( sizer );      // use the sizer for layout
+                                               dialog->Layout(); 
+                                               dialog->FitInside();
+                                               dialog->ShowModal();
+                                       }
+       */
+
+                                       ff = fopen((*lstStringFileName)[0]->c_str(),"r");       
+                                       if (ff!=NULL)
+                                       {
+                                               fclose(ff);
+                                       } else {
+                                               okFirst=false;
+                                               msgLstFile = msgLstFile + (*lstStringFileName)[0]->c_str()+ "\n";
+                                       }
+
+                                       if (okFirst == false)
+                                       {
+                                               msgLstFile = "The series is incomplete or does not exists.";
+                                               wxMessageDialog msgBox(this, wxString(msgLstFile.c_str(), wxConvUTF8), _T("Read file ERROR"), wxOK);
+                                               msgBox.ShowModal();
+                                               _backStringFirstFile="";
+                                               event.Veto();
+                                       } else {
+
+                                               //  Create panel
+                                               if (_wxMaracasImageBrowser02!=NULL)
+                                               {
+                                                       delete _wxMaracasImageBrowser02;
+                                               }
+                                               _wxMaracasImageBrowser02 = new wxMaracasImageBrowser02( _noteBook->GetPage(1), _mar->_dicom, _mar->_parameters );
+       //                                      _wxMaracasImageBrowser02->SetSize(600,600);     
+
+
+                                               _mar->_dicom->loadActualSerie( NULL/*this->_progressGauge*/ );
+                                               vtkImageData *dummy = _mar->_dicom->getVolume( )->castVtk();
+                                               _wxMaracasImageBrowser02->LoadData( new marImageData(dummy) );
+                                               _wxMaracasImageBrowser02->Start();
+
+                                               wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+                                               sizer->Add( _wxMaracasImageBrowser02 , 1, wxALL|wxGROW, 0);     
+       //                                      _noteBook->GetPage(1)->SetAutoLayout(true);
+                                               _noteBook->GetPage(1)->SetSizer(sizer);
+                                               _noteBook->GetPage(1)->Layout();
+       //                                      _wxMaracasImageBrowser02->Refresh();
+       //                                      _wxMaracasImageBrowser02->Update();
+       //EEDxx2.4
+       //                                      _noteBook->GetPage(1)->FitInside();     
+
+                                               
+                                               wxCommandEvent ev(wxEVT_COMMAND_MENU_SELECTED,20002);
+                                               this->ProcessEvent( ev );
+
+                                       }
+
+                               }  // _backStringFirstFile
+
+                       } // if lstStringFileName.size
+               } else {
+                       if (_wxMaracasImageBrowser02==NULL)
+                       {
+                               wxMessageDialog msg(this, _T("You have to select a serie befor run this option.."), _T("Message box"), wxOK );
+                               msg.ShowModal();
+                               event.Veto();
+                       }
+               }
+       } //_noteBook->GetSelection()==0
+}
+
+//----------------------------------------------------------------------------
+wxMaracasImageBrowser02* wxMaracasNoteBookPatientLstVoi::GetWxMaracasImageBrowser02()
+{
+       return _wxMaracasImageBrowser02;
+}
+
+//----------------------------------------------------------------------------
+
+wxILPD *wxMaracasNoteBookPatientLstVoi::GetWxILPD()
+{
+       return _wxILPD;
+}
+
+//----------------------------------------------------------------------------
+wxNotebook *wxMaracasNoteBookPatientLstVoi::GetNoteBook()
+{
+       return this->_noteBook;
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasNoteBookPatientLstVoi::OnReadWriteConf_Maracas(wxCommandEvent& event)
+{
+       string parentFile;
+       if (this->_noteBook->GetSelection()==0) // Read DICOM images
+       {
+               parentFile="NULL";
+       }
+       if (this->_noteBook->GetSelection()==1)  // VOI
+       {
+               parentFile=_RWCM_namefileReadImages;
+       }
+       if (parentFile!="")
+       {
+               _wxreadwriteconf = new wxReadWriteConf(this,parentFile);
+               _wxreadwriteconf->ShowModal();
+               _wxreadwriteconf=NULL;
+       } else {
+               wxMessageDialog(this,_T("No parent file defined..."),_T("Warning.."), wxOK).ShowModal();
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::Persistence_Read_Images()
+{
+       string name; 
+       char tmp[255];
+       _RWCM_namefileReadImages        = _wxreadwriteconf->GetNameReadFile();
+       string directory        = _wxreadwriteconf->GetWorkDirectory();
+       string file=directory + "/" + _RWCM_namefileReadImages;
+       if (_RWCM_namefileReadImages!=""){
+               FILE *ff;
+               ff=fopen(file.c_str(),"r");
+               fscanf(ff,"%s ",tmp); // MaracasInfo
+               fscanf(ff,"%s ",tmp); // NameFileParent
+               fscanf(ff,"%s ",tmp); // xxxxxxxx
+               fscanf(ff,"%s ",tmp); // TypeOfReadFile
+               fscanf(ff,"%s ",tmp); // xxxx
+               int typeOfReadFile = atoi(tmp);
+               fscanf(ff,"%s ",tmp); // SubTypeOfReadFile
+               fscanf(ff,"%s ",tmp); // xxxx
+               int subTypeOfReadFile = atoi(tmp);
+               fscanf(ff,"%s ",tmp); // DirectoryManualFiles
+               fscanf(ff,"%s ",tmp); // xxxx
+               string  directory= tmp;
+               fscanf(ff,"%s ",tmp); // NameManualFileList
+               fscanf(ff,"%s ",tmp); // xxxx
+               string  namefilelist= tmp;
+                       
+               _wxILPD->SetTypeOfReadFiles(typeOfReadFile);
+               _wxILPD->SetSubTypeOfReadFiles(subTypeOfReadFile);
+               _wxILPD->SetNameManualFileList(namefilelist);
+               _wxILPD->SetDirectoryManualFileList(directory);
+
+               _wxILPD->RefreshManualListFile(true);
+               _noteBook->SetSelection(0);
+       }
+}
+
+//----------------------------------------------------------------------------
+
+string wxMaracasNoteBookPatientLstVoi::GetRWCM_namefileVOI()
+{
+       return _RWCM_namefileVOI;
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::Persistence_Read_VOI()
+{
+       int voi[6];
+       string name; 
+       char tmp[255];
+       _RWCM_namefileVOI       = _wxreadwriteconf->GetNameReadFile();
+       string directory        = _wxreadwriteconf->GetWorkDirectory();
+       string file=directory + "/" + _RWCM_namefileVOI;
+       if (_RWCM_namefileVOI!=""){
+               FILE *ff;
+               ff=fopen(file.c_str(),"r");
+               fscanf(ff,"%s ",tmp); // MaracasInfo
+               fscanf(ff,"%s ",tmp); // NameFileParent
+               fscanf(ff,"%s ",tmp); // xxxxxxxx
+
+               fscanf(ff,"%s ",tmp); // voi_x 
+               fscanf(ff,"%s ",tmp); // xMin
+               voi[0] = atoi(tmp);
+               fscanf(ff,"%s ",tmp); // xMax
+               voi[1] = atoi(tmp);
+
+               fscanf(ff,"%s ",tmp); // voi_y 
+               fscanf(ff,"%s ",tmp); // yMin
+               voi[2] = atoi(tmp);
+               fscanf(ff,"%s ",tmp); // yMax
+               voi[3] = atoi(tmp);
+
+               fscanf(ff,"%s ",tmp); // voi_z 
+               fscanf(ff,"%s ",tmp); // zMin
+               voi[4] = atoi(tmp);
+               fscanf(ff,"%s ",tmp); // zMax
+               voi[5] = atoi(tmp);
+               fclose(ff);
+
+               _wxMaracasImageBrowser02->SetROI(voi);
+               _wxMaracasImageBrowser02->Refresh();
+
+
+       }
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::OnPersistence_Read(wxCommandEvent& event)
+{
+       if (_wxreadwriteconf!=NULL)
+       {
+               if (this->_noteBook->GetSelection()==0)  // Read Configuration Images
+               {
+                       Persistence_Read_Images();
+               }
+               if (this->_noteBook->GetSelection()==1)  // Read Configuration Images
+               {
+                       Persistence_Read_VOI();
+               }
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::Persistence_Write_Images_ManualReadFileList()
+{
+       if (_wxreadwriteconf!=NULL)
+       {
+               _RWCM_namefileReadImages        = _wxreadwriteconf->GetNameWriteFile();
+               if (_RWCM_namefileReadImages!=""){
+                       string name,namedir; 
+                       _RWCM_namefileReadImages        = _RWCM_namefileReadImages + ".MaracasInfo";
+                       namedir         = _wxreadwriteconf->GetWorkDirectory();
+                       name            = namedir + "/" + _RWCM_namefileReadImages   ;
+                       FILE *ff=fopen(name.c_str(),"w");
+                       fprintf(ff,"MaracasInfo \n");
+                       fprintf(ff,"NameFileParent %s \n",_wxreadwriteconf->GetParentFile().c_str() );
+
+                       int typefile;
+                       int subtypefile;
+                       string directory;
+                       string namefilelist;
+
+                       typefile                = _wxILPD->GetTypeOfReadFiles();
+                       subtypefile             = _wxILPD->GetSubTypeOfReadFiles();
+                       namefilelist    = _wxILPD->GetNameManualFileList();
+                       directory               = _wxILPD->GetDirectoryManualFileList();
+
+                       if (namefilelist=="")
+                       {
+                               namefilelist="<void>";
+                       }
+                       if (directory=="")
+                       {
+                               directory="<void>";
+                       }
+
+                       fprintf(ff,"TypeOfReadFiles %d\n", typefile );
+                       fprintf(ff,"SubTypeOfReadFiles %d\n", subtypefile );
+                       fprintf(ff,"DirectoryManualFileList %s\n", directory.c_str() );
+                       fprintf(ff,"NameManualFileList %s\n", namefilelist.c_str() );
+
+                       fclose(ff);
+               }
+       }
+}
+
+
+void wxMaracasNoteBookPatientLstVoi::Persistence_Write_Images_Database()
+{
+       std::string nameDirectory       = _wxreadwriteconf->GetWorkDirectory();
+       std::string nameFile            = _wxreadwriteconf->GetNameWriteFile();
+       if (_wxreadwriteconf!=NULL)
+       {
+               // Create .maracas file (list of DICOM files)
+               std::string nameFileMaracas = nameDirectory+"/"+nameFile+".maracas";
+               FILE *ff =fopen(nameFileMaracas.c_str(),"w+");
+               fprintf(ff,"MaracasType 100\n");
+               fprintf(ff,"Directory --\n");
+               std::vector <string *> lst;
+               this->_wxILPD->GetLstImageFiles( &lst );
+               int i,size=lst.size();
+               for (i=0;i<size;i++)
+               {
+                       fprintf(ff,"%s\n",lst[i]->c_str());
+               }
+               fclose(ff);
+
+               // Creating .MaracasInfo
+               std::string nameFileMaracasInfo = nameDirectory+"/"+nameFile+".MaracasInfo";
+               FILE *fileInfo =fopen(nameFileMaracasInfo.c_str(),"w+");
+                       fprintf(fileInfo,"MaracasInfo\n");
+                       fprintf(fileInfo,"NameFileParent NULL\n");
+                       fprintf(fileInfo,"TypeOfReadFiles 2\n");
+                       fprintf(fileInfo,"SubTypeOfReadFiles 100\n");
+                       fprintf(fileInfo,"DirectoryManualFileList %s\n",nameDirectory.c_str());
+                       fprintf(fileInfo,"NameManualFileList %s\n",nameFileMaracas.c_str());
+               fclose(fileInfo);
+
+       }
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::Persistence_Write_VOI()
+{
+       if (_wxreadwriteconf!=NULL)
+       {
+               string name,namedir; 
+               _RWCM_namefileVOI       = _wxreadwriteconf->GetNameWriteFile();
+               if (_RWCM_namefileVOI!=""){
+                       _RWCM_namefileVOI = _RWCM_namefileVOI + ".MaracasInfo" ;
+                       namedir         = _wxreadwriteconf->GetWorkDirectory();
+                       name            = namedir + "/" + _RWCM_namefileVOI ;
+                       FILE *ff=fopen(name.c_str(),"w");
+                       fprintf(ff,"MaracasInfo \n");
+                       fprintf(ff,"NameFileParent %s \n",_wxreadwriteconf->GetParentFile().c_str() );
+
+                       int voi[6];
+                       _wxMaracasImageBrowser02->GetROI(voi);
+
+                       fprintf(ff,"VOI_X %d %d\n", voi[0],voi[1] );
+                       fprintf(ff,"VOI_Y %d %d\n", voi[2],voi[3] );
+                       fprintf(ff,"VOI_Z %d %d\n", voi[4],voi[5] );
+                       fclose(ff);
+               }
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookPatientLstVoi::OnPersistence_Write(wxCommandEvent& event)
+{
+       if (_wxreadwriteconf!=NULL)
+       {
+               if (this->_noteBook->GetSelection()==0)  // Write Configuration Images
+               {
+// EED 09 nov 2007
+                       if (this->_wxILPD->GetNotebook()->GetSelection()==0)
+                       {
+                               Persistence_Write_Images_Database();
+                       } 
+                       if (this->_wxILPD->GetNotebook()->GetSelection()==1)
+                       {
+                               Persistence_Write_Images_Database();
+                       } 
+                       if (this->_wxILPD->GetNotebook()->GetSelection()==2)
+                       {
+                               Persistence_Write_Images_ManualReadFileList();
+                       } 
+               }
+               if (this->_noteBook->GetSelection()==1)  // Write ConfigurationImages
+               {
+                       Persistence_Write_VOI();
+               }
+       }
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookIRMQuantification , wxPanel)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+//      EVT_MENU(20001, wxMaracasNoteBookIRMQuantification::OnSelectPatientStudySerieImage)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS    , wxMaracasNoteBookIRMQuantification::OnNewAxis                 )
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS , wxMaracasNoteBookIRMQuantification::OnDeleteAxis              )
+       EVT_TOOL(ID_TOOLBAR_PLANS                                               , wxMaracasNoteBookIRMQuantification::OnQuantification  )
+END_EVENT_TABLE()
+
+wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification(wxWindow *parent,marInterface *mar)
+       : wxPanel(parent, -1)
+{
+printf("EED wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification  1 \n");
+       _existAxis                                      = false;
+       _wxmaracasquantification        = NULL;
+
+       _noteBook = new wxNotebook(this, -1);
+       _noteBook->SetSize(750,300);
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_AxisExtraction );
+       wxBitmap bitmap1        = wxBITMAP( TOOLBAR_V2_sm_bl_Quantification );
+       wxBitmap bitmap2        = wxBITMAP( TOOLBAR_V2_sm_tr_Quantification );
+       
+       bitmap0.SetMask(new wxMask( mask ));
+       bitmap1.SetMask(new wxMask( mask ));
+       bitmap2.SetMask(new wxMask( mask ));
+
+
+       wxImageList *imageList = new wxImageList(50,50);
+       imageList->Add( bitmap0 );  // 0
+       imageList->Add( bitmap1 );  // 1
+       imageList->Add( bitmap2 );  // 2
+       _noteBook->SetImageList(imageList);
+
+printf("EED wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification  2 \n");
+
+//     _mar=mar
+//     _mar->initExperiment( );
+
+       _mar=new marInterface();
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+       _mar->initExperiment( );
+
+printf("EED wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification  2.1 \n");
+       _wxmaracas3dbrowser = new wxMaracas3DBrowser( _noteBook, _mar, -1,ID_TOOLBAR_PLANS );
+printf("EED wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification  2.2 \n");
+       _wxmaracas3dbrowser->LoadData( );
+
+//     _wxmaracasquantification = new wxMaracasQuantification( _noteBook , _mar , -1 );
+
+       wxPanel *ttt = new wxPanel(_noteBook,-1);
+//     _wxmaracasquantification = new wxMaracasQuantification( ttt , _mar , -1 );
+
+
+printf("EED wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification  3 \n");
+
+       _noteBook->AddPage(_wxmaracas3dbrowser,_T("Axis Extraction IRM >>   ")  , true , 0 );
+       _noteBook->AddPage(ttt,_T("Quantification IRM   ")                      , true , 2 );
+
+
+       _noteBook->SetSelection(0);
+
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookIRMQuantification::OnChangePageQuantification );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookIRMQuantification::OnChangePage );
+
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("IRM Quantification"));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( title               , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook   , 1, wxGROW, 10 );
+
+       sizer->SetSizeHints( this );   // set size hints to honour minimum size
+       this->SetAutoLayout(true);
+       this->SetSizer(sizer);
+       this->Layout(); 
+
+//EEDxx2.4
+//     FitInside();
+printf("EED wxMaracasNoteBookIRMQuantification::wxMaracasNoteBookIRMQuantification  4 \n");
+
+}
+//----------------------------------------------------------------------------
+wxMaracasNoteBookIRMQuantification::~wxMaracasNoteBookIRMQuantification()
+{
+//EEDx15
+//     delete _wxmaracas3dbrowser;
+//     delete _wxmaracasquantification;
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookIRMQuantification::OnQuantification(wxCommandEvent & event)
+{
+       _noteBook->SetSelection(1);
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookIRMQuantification::OnChangePage(wxNotebookEvent& event)
+{
+       if (_noteBook->GetSelection()==1){
+               if (_wxmaracasquantification!=NULL)
+               {
+//EEDx12
+                       delete _wxmaracasquantification;
+//                     _wxmaracasquantification->Close();
+               }
+               _wxmaracasquantification = new wxMaracasQuantification( _noteBook->GetPage(1) , _mar , -1 );
+               _wxmaracasquantification->LoadData( );
+               wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+               sizer->Add( _wxmaracasquantification , 1, wxALL|wxEXPAND, 0);   
+               _noteBook->GetPage(1)->SetAutoLayout(true);
+               _noteBook->GetPage(1)->SetSizer(sizer);
+               _noteBook->GetPage(1)->Layout();                
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookIRMQuantification::OnChangePageQuantification(wxNotebookEvent& event)
+{
+       if (_noteBook->GetSelection()==0){
+               if (_existAxis == false )
+               {
+                       wxMessageDialog msg(this, _T("You have to extract the axis befor run this option.."), _T("Message box"), wxOK );
+                       msg.ShowModal();
+                       event.Veto();
+               }
+       }
+       Refresh();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookIRMQuantification::OnNewAxis(wxCommandEvent &WXUNUSED(event))
+{
+       _existAxis=true;
+       _noteBook->SetPageImage(1, 1);
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookIRMQuantification::OnDeleteAxis(wxCommandEvent &WXUNUSED(event))
+{
+       _existAxis=false;
+       _noteBook->SetPageImage(1, 2);
+}
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookCTQuantification , wxPanel)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+//      EVT_MENU(20001, wxMaracasNoteBookIRMQuantification::OnSelectPatientStudySerieImage)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+//     EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS,   wxMaracasNoteBookIRMQuantification::OnNewAxis                   )
+//     EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS,wxMaracasNoteBookIRMQuantification::OnDeleteAxis                )
+       EVT_TOOL(20005,wxMaracasNoteBookCTQuantification::OnQuantification)
+
+       EVT_MENU(30001, wxMaracasNoteBookCTQuantification::OnPersistence_Write)
+       EVT_MENU(30002, wxMaracasNoteBookCTQuantification::OnPersistence_Read)
+
+
+END_EVENT_TABLE()
+
+
+wxMaracasNoteBookCTQuantification::wxMaracasNoteBookCTQuantification(wxWindow *parent,
+                                                                                                                                        marInterface *mar,
+                                                                                                                                        string namefileParentRWCM)
+       : wxPanel(parent, -1)
+{
+printf(" EED wxMaracasNoteBookCTQuantification::wxMaracasNoteBookCTQuantification 01\n ");
+       _namefileParentRWCM = namefileParentRWCM;
+       _readyQuantification=false;
+       _wxMaracasProcessingCT=NULL;
+       _wxmaracasquantification_ct=NULL;
+
+       _noteBook = new wxNotebook(this, -1);
+//     _noteBook->SetSize(550,300);
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_MPR );
+       wxBitmap bitmap1        = wxBITMAP( TOOLBAR_V2_sm_bl_ProcessingCT );
+       wxBitmap bitmap2        = wxBITMAP( TOOLBAR_V2_sm_bl_Quantification );
+       wxBitmap bitmap3        = wxBITMAP( TOOLBAR_V2_sm_tr_Quantification );
+
+       bitmap0.SetMask(new wxMask( mask ));
+       bitmap1.SetMask(new wxMask( mask ));
+       bitmap2.SetMask(new wxMask( mask ));
+       bitmap3.SetMask(new wxMask( mask ));
+
+       wxImageList *imageList = new wxImageList(50,50);
+       imageList->Add( bitmap0 );  // 0
+       imageList->Add( bitmap1 );  // 1
+       imageList->Add( bitmap2 );  // 2
+       imageList->Add( bitmap3 );  // 3
+       _noteBook->SetImageList(imageList);
+
+
+       double spcOriginalImage[3];
+       spcOriginalImage[0]=mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension);
+       spcOriginalImage[1]=mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension);
+       spcOriginalImage[2]=mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension);
+
+
+//     _mar=mar;
+       _mar=new marInterfaceCT();
+
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+
+
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, spcOriginalImage[0] );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, spcOriginalImage[1] );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, spcOriginalImage[2] );
+//EEDx4
+
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+
+       _mar->initExperiment( );
+
+       vtkImageData *imagedata;
+       imagedata = _mar->GetExperiment()->getDynData( )->getVolume( )->castVtk();
+       imagedata->Update(); 
+       marImageData *marimagedata = new marImageData(imagedata);
+       marimagedata->SetSpcOriginal(spcOriginalImage);
+       marimagedata->SetVoiOriginal(voi);
+
+       _wxMaracasMPR = new wxMaracasMPR( _noteBook, marimagedata ,_mar->_parameters->getVoxelSize() );
+       _wxMaracasMPR->ConfigureVTK();
+
+       _noteBook->AddPage(_wxMaracasMPR,_T("Choose a position  >>   "), true, 0 );
+
+       _noteBook->AddPage(new wxPanel(_noteBook,-1),_T("Processing CT >>  "), true, 1 );
+       _noteBook->AddPage(new wxPanel(_noteBook,-1),_T("Quantification  CT  "), true, 3 );
+       _noteBook->SetSelection(0);
+
+
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookCTQuantification::OnChangePageQuantification );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookCTQuantification::OnChangePage );
+
+       wxButton *btnReadWriteConfig    = new wxButton(this,-1,_T("Read-Write Config"));
+       Connect(btnReadWriteConfig->GetId() ,  wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasNoteBookCTQuantification::OnReadWriteConf_Maracas );
+       wxButton *btnHelp                               = new wxButton(this,-1,_T("Help"));
+       wxButton *btnClose                              = new wxButton(this,-1,_T("Close"));
+
+    wxBoxSizer *sizerB                         = new wxBoxSizer(wxHORIZONTAL);
+       sizerB->Add( btnReadWriteConfig , 0, wxALIGN_RIGHT, 10);
+       sizerB->Add( btnHelp                    , 0, wxALIGN_RIGHT, 10);
+       sizerB->Add( btnClose                   , 0, wxALIGN_RIGHT, 10);
+
+
+
+
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("CT Quantification"));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( sizerB              , 0, wxALIGN_RIGHT, 10);
+       sizer->Add( title               , 0, wxGROW | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook   , 1, wxALL | wxGROW, 10 );
+
+//EEDxx2.4
+//     FitInside();
+
+//     sizer->SetSizeHints( this );   // set size hints to honour minimum size
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout(); 
+// EED 29 Juin 2007
+/*
+*/
+printf(" EED wxMaracasNoteBookCTQuantification::wxMaracasNoteBookCTQuantification 02\n ");
+}
+
+//----------------------------------------------------------------------------
+
+wxMaracasNoteBookCTQuantification::~wxMaracasNoteBookCTQuantification()
+{
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::OnChangePage(wxNotebookEvent& event)
+{
+       if (_noteBook->GetSelection()==1){
+               wxBusyCursor wait;
+               if (_wxMaracasProcessingCT!=NULL)
+               {
+                       delete _wxMaracasProcessingCT;
+               }
+               vtkMPRBaseData *vtkmprbaseData = _wxMaracasMPR->GetVtkMPRBaseData();
+               marImageData *marimagedata = vtkmprbaseData->GetMarImageData();
+       //      _mar->initExperiment( );
+               int     x = (int)vtkmprbaseData->GetX();
+               int     y = (int)vtkmprbaseData->GetY();
+               int     z = (int)vtkmprbaseData->GetZ();
+printf("EED wxMaracasNoteBookCTQuantification::OnChangePage \n ");
+               _wxMaracasProcessingCT = new wxMaracasProcessingCT(_noteBook->GetPage(1), _mar);
+               _wxMaracasProcessingCT->ConfigureVTK(marimagedata, x , y , z );
+               wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+               sizer->Add( _wxMaracasProcessingCT , 1, wxALL|wxGROW, 0);       
+               _noteBook->GetPage(1)->SetAutoLayout(true);
+               _noteBook->GetPage(1)->SetSizer(sizer);
+               _noteBook->GetPage(1)->Layout();        
+       }
+       if (_noteBook->GetSelection()==2) {
+               if (_readyQuantification==true)
+               {
+                       if (_wxmaracasquantification_ct!=NULL)
+                       {
+                               delete _wxmaracasquantification_ct;
+                       }
+                       _wxmaracasquantification_ct = new wxMaracasQuantificationCT(_noteBook->GetPage(2), _mar, -1 );
+                       _wxmaracasquantification_ct->LoadData( );
+                       wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+                       sizer->Add( _wxmaracasquantification_ct , 1, wxALL|wxGROW, 0);  
+                       _noteBook->GetPage(2)->SetAutoLayout(true);
+                       _noteBook->GetPage(2)->SetSizer(sizer);
+                       _noteBook->GetPage(2)->Layout();        
+               } else {
+                       wxMessageDialog msg(this, _T("You have to extract the axis befor run this option.."), _T("Message box"), wxOK );
+                       msg.ShowModal();
+               }
+       }
+
+       if ((_noteBook->GetSelection()==0) || (_noteBook->GetSelection()==1) ) {
+               _readyQuantification=false;
+               _noteBook->SetPageImage(2, 3);
+       }
+
+       Refresh();
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::OnChangePageQuantification(wxNotebookEvent& event)
+{
+/*
+       if (event.GetSelection()==1) {
+               if (_readyQuantification==false)
+               {
+                       wxMessageDialog msg(this, "You have to extract the axis befor run this option..", "Message box", wxOK );
+                       msg.ShowModal();
+                       event.Veto();
+               }
+       }
+*/
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::OnQuantification(wxCommandEvent& event)
+{
+       _readyQuantification=true;
+       _noteBook->SetPageImage(2, 2);
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasNoteBookCTQuantification::OnReadWriteConf_Maracas(wxCommandEvent& event)
+{
+       string parentFile;
+       if (this->_noteBook->GetSelection()==0)  // Read 3D Point MPR
+       {
+               parentFile=_namefileParentRWCM;
+       }
+       if (this->_noteBook->GetSelection()==1)  // Read Preprocessing
+       {
+               parentFile=_RWCM_namefileMPR;
+       }
+       if (this->_noteBook->GetSelection()==2)  // Read Contour Quantification
+       {
+               parentFile=_RWCM_namefileProcessingCT;
+       }
+
+
+       if (parentFile!="")
+       {
+               _wxreadwriteconf = new wxReadWriteConf(this,parentFile);
+               _wxreadwriteconf->ShowModal();
+               _wxreadwriteconf=NULL;
+       } else {
+               wxMessageDialog(this,_T("No parent file defined..."),_T("Warning.."), wxOK).ShowModal();
+       }
+
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::Persistence_Read_MPR()
+{
+       _RWCM_namefileMPR       = _wxreadwriteconf->GetNameReadFile();
+       if (_RWCM_namefileMPR!=""){
+               double x,y,z;
+               string name; 
+               char tmp[255];
+               string directory        = _wxreadwriteconf->GetWorkDirectory();
+               string file=directory + "/" + _RWCM_namefileMPR;
+               FILE *ff;
+               ff=fopen(file.c_str(),"r");
+               fscanf(ff,"%s ",tmp); // MaracasInfo
+               fscanf(ff,"%s ",tmp); // NameFileParent
+               fscanf(ff,"%s ",tmp); // xxxxxxxx
+
+               fscanf(ff,"%s ",tmp); // positionX 
+               fscanf(ff,"%s ",tmp); // x
+               x = atof(tmp);
+
+               fscanf(ff,"%s ",tmp); // positionY 
+               fscanf(ff,"%s ",tmp); // y
+               y = atof(tmp);
+
+               fscanf(ff,"%s ",tmp); // positionZ 
+               fscanf(ff,"%s ",tmp); // z
+               z = atof(tmp);
+
+               fclose(ff);
+
+               _wxMaracasMPR->GetVtkMPRBaseData()->SetX(x);
+               _wxMaracasMPR->GetVtkMPRBaseData()->SetY(y);
+               _wxMaracasMPR->GetVtkMPRBaseData()->SetZ(z);
+               _wxMaracasMPR->RefreshView();
+       }
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::Persistence_Read_ProcessingCT()
+{
+       _RWCM_namefileProcessingCT      = _wxreadwriteconf->GetNameReadFile();
+       if (_RWCM_namefileProcessingCT!=""){
+               int min,max;
+               string name; 
+               char tmp[255];
+               string directory        = _wxreadwriteconf->GetWorkDirectory();
+               string file=directory + "/" + _RWCM_namefileProcessingCT;
+               FILE *ff;
+               ff=fopen(file.c_str(),"r");
+               fscanf(ff,"%s ",tmp); // MaracasInfo
+               fscanf(ff,"%s ",tmp); // NameFileParent
+               fscanf(ff,"%s ",tmp); // xxxxxxxx
+
+               fscanf(ff,"%s ",tmp); // Threshold_min 
+               fscanf(ff,"%s ",tmp); // min
+               min = atoi(tmp);
+
+               fscanf(ff,"%s ",tmp); // Threshold_max 
+               fscanf(ff,"%s ",tmp); // max
+               max = atoi(tmp);
+
+               _wxMaracasProcessingCT->SetThreshold(min,max);
+               _wxMaracasProcessingCT->Refresh();
+
+               fclose(ff);
+
+       }
+
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::Persistence_Read_ContourQauntificationCT()
+{
+       _RWCM_namefileContourQuantificationCT   = _wxreadwriteconf->GetNameReadFile();
+       if (_RWCM_namefileContourQuantificationCT!=""){
+               string name; 
+               char tmp[255];
+               string directory        = _wxreadwriteconf->GetWorkDirectory();
+               string file=directory + "/" + _RWCM_namefileContourQuantificationCT;
+               FILE *ff;
+               ff=fopen(file.c_str(),"r");
+               fscanf(ff,"%s ",tmp); // MaracasInfo
+               fscanf(ff,"%s ",tmp); // NameFileParent
+               fscanf(ff,"%s ",tmp); // xxxxxxxx
+
+
+       // Read Data
+    // Set Data
+               fscanf(ff,"%s ",tmp); // Slice
+               fscanf(ff,"%s ",tmp); // xxxxxxxx
+               int slice = atoi(tmp);
+               this->_wxmaracasquantification_ct->SetActualSlice(slice);
+    // Refresh
+
+               fclose(ff);
+
+       }
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::OnPersistence_Read(wxCommandEvent& event)
+{
+       if (this->_noteBook->GetSelection()==0)  // Read 3D Point MPR
+       {
+               Persistence_Read_MPR();
+       }
+       if (this->_noteBook->GetSelection()==1)  // Read Preprocessing
+       {
+               Persistence_Read_ProcessingCT();
+       }
+       if (this->_noteBook->GetSelection()==2)  // Read Contour quantification
+       {
+               Persistence_Read_ContourQauntificationCT();
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::Persistence_Write_MPR()
+{
+
+       if (_wxreadwriteconf!=NULL)
+       {
+               _RWCM_namefileMPR       = _wxreadwriteconf->GetNameWriteFile();
+               if (_RWCM_namefileMPR!=""){
+                       string name,namedir; 
+                       _RWCM_namefileMPR       =_RWCM_namefileMPR + ".MaracasInfo";
+                       namedir         = _wxreadwriteconf->GetWorkDirectory();
+                       name            = namedir + "/" + _RWCM_namefileMPR  ;
+                       FILE *ff=fopen(name.c_str(),"w");
+                       fprintf(ff,"MaracasInfo \n");
+                       fprintf(ff,"NameFileParent %s \n",_wxreadwriteconf->GetParentFile().c_str() );
+
+
+                       double x = _wxMaracasMPR->GetVtkMPRBaseData()->GetX();
+                       double y = _wxMaracasMPR->GetVtkMPRBaseData()->GetY();
+                       double z = _wxMaracasMPR->GetVtkMPRBaseData()->GetZ();
+
+                       fprintf(ff,"positionX %f\n", x);
+                       fprintf(ff,"positionY %f\n", y);
+                       fprintf(ff,"positionZ %f\n", z);
+                       fclose(ff);
+               }
+       }
+
+
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::Persistence_Write_ProcessingCT()
+{
+       if (_wxreadwriteconf!=NULL)
+       {
+               _RWCM_namefileProcessingCT      = _wxreadwriteconf->GetNameWriteFile();
+               if (_RWCM_namefileProcessingCT!=""){
+                       string name,namedir; 
+                       _RWCM_namefileProcessingCT = _RWCM_namefileProcessingCT + ".MaracasInfo";
+                       namedir         = _wxreadwriteconf->GetWorkDirectory();
+                       name            = namedir + "/" + _RWCM_namefileProcessingCT ;
+                       FILE *ff=fopen(name.c_str(),"w");
+                       fprintf(ff,"MaracasInfo \n");
+                       fprintf(ff,"NameFileParent %s \n",_wxreadwriteconf->GetParentFile().c_str() );
+
+                       int min,max;
+                       _wxMaracasProcessingCT->GetThreshold(&min,&max);
+
+                       fprintf(ff,"Threshold_Min %d\n", min);
+                       fprintf(ff,"Threshold_Max %d\n", max);
+
+                       fclose(ff);
+               }
+       }
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::Persistence_Write_ContourQuantificationCT()
+{
+       if (_wxreadwriteconf!=NULL)
+       {
+               _RWCM_namefileContourQuantificationCT   = _wxreadwriteconf->GetNameWriteFile();
+               if (_RWCM_namefileContourQuantificationCT!=""){
+                       string name,namedir; 
+                       _RWCM_namefileContourQuantificationCT = _RWCM_namefileContourQuantificationCT + ".MaracasInfo";
+                       namedir         = _wxreadwriteconf->GetWorkDirectory();
+                       name            = namedir + "/" + _RWCM_namefileContourQuantificationCT ;
+                       FILE *ff=fopen(name.c_str(),"w");
+                       fprintf(ff,"MaracasInfo \n");
+                       fprintf(ff,"NameFileParent %s \n",_wxreadwriteconf->GetParentFile().c_str() );
+       
+               // Get Data information 
+               // Write Data 
+                       fprintf(ff,"Slice %d\n", this->_wxmaracasquantification_ct->GetActualSlice() );
+
+                       fclose(ff);
+               }
+       }
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookCTQuantification::OnPersistence_Write(wxCommandEvent& event)
+{
+       if (this->_noteBook->GetSelection()==0)  // Write 3D Point MPR
+       {
+               Persistence_Write_MPR();
+       }
+       if (this->_noteBook->GetSelection()==1)  // Write Preprocessing
+       {
+               Persistence_Write_ProcessingCT();
+       }
+       if (this->_noteBook->GetSelection()==2)  // Write Contour Quantification
+       {
+               Persistence_Write_ContourQuantificationCT();
+       }
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookVascularTreeExtraction , wxPanel)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+//      EVT_MENU(20001, wxMaracasNoteBookIRMQuantification::OnSelectPatientStudySerieImage)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+//     EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS,   wxMaracasNoteBookIRMQuantification::OnNewAxis                   )
+//     EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS,wxMaracasNoteBookIRMQuantification::OnDeleteAxis                )
+//     EVT_TOOL(20005,wxMaracasNoteBookVascularTreeExtraction::OnQuantification)
+
+END_EVENT_TABLE()
+
+
+wxMaracasNoteBookVascularTreeExtraction::wxMaracasNoteBookVascularTreeExtraction(wxWindow *parent,marInterface *mar)
+       : wxPanel(parent, -1)
+{
+
+       _noteBook = new wxNotebook(this, -1);
+       _noteBook->SetSize(550,300);
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_TreeExtraction_JF_MH );
+       bitmap0.SetMask(new wxMask( mask ));
+
+
+       wxImageList *imageList = new wxImageList(50,50);
+       imageList->Add( bitmap0 );  // 0
+       _noteBook->SetImageList(imageList);
+
+//     _mar=mar;
+
+       _mar=new marInterface();
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+
+       _mar->initExperiment( );
+
+       vtkImageData *marImageData;
+       marImageData = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       marImageData->Update(); 
+
+       _wxMaracasEmptyPanel_2 = new wxMaracasEmptyPanel_2(_noteBook,_mar);
+       _wxMaracasEmptyPanel_2->ConfigureVTK();
+
+
+       _wxMaracasPathology_01 = new wxMaracasPathology_01(_noteBook,_mar);
+       _wxMaracasPathology_01->ConfigureVTK();
+
+
+       _noteBook->AddPage(_wxMaracasEmptyPanel_2,_T("Tree Extraction  "), true, 0 );
+       _noteBook->AddPage(_wxMaracasPathology_01,_T("Pathology  "), true, 0 );
+       _noteBook->SetSelection(0);
+
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookVascularTreeExtraction::OnChangePageQuantification );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookVascularTreeExtraction::OnChangePage );
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("Vascular Tree Extraction"));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( title               , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook   , 1, wxGROW, 10 );
+
+//EEDxx2.4
+//     FitInside();
+
+       sizer->SetSizeHints( this );   // set size hints to honour minimum size
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout(); 
+
+}
+//----------------------------------------------------------------------------
+wxMaracasNoteBookVascularTreeExtraction::~wxMaracasNoteBookVascularTreeExtraction()
+{
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookVascularTreeExtraction::OnChangePage(wxNotebookEvent& event)
+{
+       Refresh();
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookVascularTreeExtraction::OnChangePageQuantification(wxNotebookEvent& event)
+{
+}
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookSTLFormat , wxPanel)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+//      EVT_MENU(20001, wxMaracasNoteBookIRMQuantification::OnSelectPatientStudySerieImage)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS,   wxMaracasNoteBookSTLFormat::OnNewAxis                   )
+       EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS,wxMaracasNoteBookSTLFormat::OnDeleteAxis                )
+//     EVT_TOOL(20005,wxMaracasNoteBookVascularTreeExtraction::OnQuantification)
+
+
+
+END_EVENT_TABLE()
+
+
+wxMaracasNoteBookSTLFormat::wxMaracasNoteBookSTLFormat(wxWindow *parent,marInterface *mar)
+       : wxPanel(parent, -1)
+{
+printf("EED wxMaracasNoteBookSTLFormat::wxMaracasNoteBookSTLFormat 01 \n");
+       _noteBook_general = new wxNotebook(this, -1);
+       _noteBook_general->SetSize(550,300);
+       wxImageList *imageList = new wxImageList(50,50);
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_STLFormat );
+       bitmap0.SetMask(new wxMask( mask ));
+
+
+       imageList->Add(  bitmap0 );  // 0
+       _noteBook_general->SetImageList(imageList);
+
+//     wxPanel *panel01 = CreateSTLFormat_01( _noteBook_general , mar );
+//     wxPanel *panel02 = CreateSTLFormat_02( _noteBook_general , mar );
+       wxPanel *panel03 = CreateSTLFormat_03( _noteBook_general , mar );
+
+//     _noteBook_general->AddPage( panel01 , _T("STL Format 01  "), true, 0 );
+//     _noteBook_general->AddPage( panel02 , _T("STL Format 02 " ), true, 0 );
+       _noteBook_general->AddPage( panel03 , _T("STL Format 03 ") , true, 0 );
+       _noteBook_general->SetSelection(0);
+
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("STL Format"));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( title               , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook_general   , 1, wxGROW, 10 );
+
+//EEDxx2.4
+//     FitInside();
+
+       sizer->SetSizeHints( this );   // set size hints to honour minimum size
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout(); 
+printf("EED wxMaracasNoteBookSTLFormat::wxMaracasNoteBookSTLFormat 02 \n");
+}
+
+
+//----------------------------------------------------------------------------
+
+wxMaracasNoteBookSTLFormat::~wxMaracasNoteBookSTLFormat()
+{
+}
+
+
+//----------------------------------------------------------------------------
+
+wxPanel *wxMaracasNoteBookSTLFormat::CreateSTLFormat_01(wxWindow *parent,marInterface *mar)
+{
+
+       wxSTLWidget_02 *stlWidget = new wxSTLWidget_02(parent,mar);
+       stlWidget->ConfigureVTK();
+
+       return stlWidget;
+}
+
+
+//----------------------------------------------------------------------------
+
+wxPanel *wxMaracasNoteBookSTLFormat::CreateSTLFormat_02(wxWindow *parent,marInterface *mar)
+{
+       wxPanel *panel = new wxPanel(parent,-1);
+
+       _existAxis=false;
+       _wxmaracassurfaceSTLwidget=NULL;
+
+       _noteBook_01 = new wxNotebook(panel, -1);
+       _noteBook_01->SetSize(550,300);
+
+       wxImageList *imageList = new wxImageList(50,50);
+       imageList->Add(  wxBITMAP( TOOLBAR_V2_sm_bl_AxisExtraction      ) );  // 0
+       imageList->Add(  wxBITMAP( TOOLBAR_V2_sm_bl_STLFormat           ) );  // 1
+       imageList->Add(  wxBITMAP( TOOLBAR_V2_sm_tr_STLFormat           ) );  // 2
+       _noteBook_01->SetImageList(imageList);
+
+//     _mar=mar;
+
+       _mar=new marInterface();
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+
+       _mar->initExperiment( );
+
+       vtkImageData *marImageData;
+       marImageData = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       marImageData->Update(); 
+
+       _wxmaracas3dbrowser = new wxMaracas3DBrowser( _noteBook_01, _mar, -1,ID_TOOLBAR_PLANS );
+       _wxmaracas3dbrowser->LoadData( );
+
+       _noteBook_01->AddPage(_wxmaracas3dbrowser,_T("Axis Extraction  >>  "), true, 0 );
+       _noteBook_01->AddPage(new wxPanel(_noteBook_01,-1),_T("STL"), true, 2 );
+       _noteBook_01->SetSelection(0);
+
+       Connect(_noteBook_01->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookSTLFormat::OnChangePageSTLFormat );
+       Connect(_noteBook_01->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookSTLFormat::OnChangePage );
+
+       wxStaticText *title=new wxStaticText(panel,-1,_T(" STL - 01 (MATHIEU)   "));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( title                       , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook_01        , 1, wxGROW , 10 );
+
+//EEDxx2.4
+//     FitInside();
+
+       sizer->SetSizeHints( panel );   // set size hints to honour minimum size
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->Layout();        
+
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+
+wxPanel *wxMaracasNoteBookSTLFormat::CreateSTLFormat_03(wxWindow *parent,marInterface *mar)
+{
+
+       wxSTLWidget_03 *stlWidget = new wxSTLWidget_03(parent,mar);
+       stlWidget->ConfigureVTK();
+
+       return stlWidget;
+}
+
+
+//----------------------------------------------------------------------------
+
+void wxMaracasNoteBookSTLFormat::OnChangePage(wxNotebookEvent& event)
+{
+       if (_noteBook_01->GetSelection()==1){
+               if (_wxmaracassurfaceSTLwidget!=NULL)
+               {
+                       delete _wxmaracassurfaceSTLwidget;
+               }
+               _wxmaracassurfaceSTLwidget = new wxSurfaceSTLWidget( _noteBook_01->GetPage(1) );
+               _wxmaracassurfaceSTLwidget->ShowMARACASData( _mar );
+               wxBoxSizer *sizer= new wxBoxSizer(wxHORIZONTAL);
+               sizer->Add( _wxmaracassurfaceSTLwidget , 1, wxALL|wxEXPAND, 0); 
+               _noteBook_01->GetPage(1)->SetAutoLayout(true);
+               _noteBook_01->GetPage(1)->SetSizer(sizer);
+               _noteBook_01->GetPage(1)->Layout();             
+       }
+       Refresh();
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasNoteBookSTLFormat::OnChangePageSTLFormat(wxNotebookEvent& event)
+{
+       if (_noteBook_01->GetSelection()==0){
+               if (_existAxis == false )
+               {
+                       wxMessageDialog msg(this, _T("You have to extract the axis befor run this option.."), _T("Message box"), wxOK );
+                       msg.ShowModal();
+                       event.Veto();
+               }
+       }
+       Refresh();
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracasNoteBookSTLFormat::OnNewAxis(wxCommandEvent &WXUNUSED(event))
+{
+       _existAxis=true;
+       _noteBook_01->SetPageImage(1, 1);
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookSTLFormat::OnDeleteAxis(wxCommandEvent &WXUNUSED(event))
+{
+       _existAxis=false;
+       _noteBook_01->SetPageImage(1, 2);
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookTests , wxPanel)
+// Borrame
+//    EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
+//    EVT_MENU(MDI_REFRESH, MyChild::OnRefresh)
+//    EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle)
+//    EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition)
+//    EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize)
+//      EVT_MENU(20001, wxMaracasNoteBookIRMQuantification::OnSelectPatientStudySerieImage)
+
+//    EVT_SIZE(MyChild::OnSize)
+//    EVT_MOVE(MyChild::OnMove)
+
+//    EVT_CLOSE(wxMaracasPatientLstVoiChiFra::OnClose)
+//     EVT_TOOL(wxSurfaceWidget::ID_BUTTON_NEW_AXIS,   wxMaracasNoteBookTests::OnNewAxis                       )
+//     EVT_TOOL(wxSurfaceWidget::ID_BUTTON_DELETE_AXIS,wxMaracasNoteBookTests::OnDeleteAxis            )
+//     EVT_TOOL(20005,wxMaracasNoteBookVascularTreeExtraction::OnQuantification)
+
+
+
+END_EVENT_TABLE()
+
+
+wxMaracasNoteBookTests::wxMaracasNoteBookTests(wxWindow *parent,marInterface *mar)
+       : wxPanel(parent, -1)
+{
+       wxBusyCursor wait;
+
+       _noteBook = new wxNotebook(this, -1);
+       _noteBook->SetSize(550,300);
+
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_Processing );
+       wxBitmap bitmap1        = wxBITMAP( TOOLBAR_V2_sm_bl_Processing );
+
+       bitmap0.SetMask(new wxMask( mask ));
+       bitmap1.SetMask(new wxMask( mask ));
+
+       wxImageList *imageList = new wxImageList(50,50);
+       imageList->Add( bitmap0 );  // 0
+       imageList->Add( bitmap1 );  // 1
+       _noteBook->SetImageList(imageList);
+
+
+       _mar=new marInterface();
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+
+       _mar->initExperiment( );
+
+       vtkImageData *vtkimagedata;
+       vtkimagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       vtkimagedata->Update(); 
+       marImageData *marimagedata = new marImageData(vtkimagedata);
+
+       // --
+//     _wxmanualcontourpanel = new wxMaracas_ManualContour_Panel( _noteBook  );
+//     _wxmanualcontourpanel->ConfigureVTK( marimagedata );
+//     _noteBook->AddPage(_wxmanualcontourpanel,_T(" Manual Contour "), true, 0 );
+
+
+       // --
+       _wxMaracasEmptyPanel_3 = new wxMaracasEmptyPanel_3( _noteBook  );
+       _wxMaracasEmptyPanel_3->ConfigureVTK( marimagedata );
+       _noteBook->AddPage(_wxMaracasEmptyPanel_3,_T(" 2 contornos Maria Alejandra "), true, 0 );
+
+       // --
+       _noteBook->AddPage(new wxPanel(_noteBook,-1),_T("?? "), true, 1 );
+
+       // --
+       _wxMaracas_ManualTree_MPR = new wxMaracas_ManualTree_MPR( _noteBook, marimagedata , _mar->_parameters->getVoxelSize());
+       _wxMaracas_ManualTree_MPR->ConfigureVTK();
+       _noteBook->AddPage(_wxMaracas_ManualTree_MPR,_T("Manual Tree  E.Davila  "), true, 1 );
+
+
+       // --
+       _wxMaracas_ManualSegmentation_MPR = new wxMaracas_ManualSegmentation_MPR( _noteBook, marimagedata , _mar->_parameters->getVoxelSize());
+       _wxMaracas_ManualSegmentation_MPR->ConfigureVTK();
+       _noteBook->AddPage(_wxMaracas_ManualSegmentation_MPR,_T("Manual Segmentation Diego  "), true, 1 );
+
+       // --
+       _wxMaracas_SegmentationFM3D = new wxMaracas_SegmentationFM3D( _noteBook, marimagedata , _mar->_parameters->getVoxelSize());
+       _wxMaracas_SegmentationFM3D->ConfigureVTK();
+       _noteBook->AddPage(_wxMaracas_SegmentationFM3D,_T("Segmentation FM3D Diego  "), true, 1 );
+
+
+
+       // --
+//EED 4 oct 2006 information pour Loic
+//     _wxMaracasEmptyPanel_4 = new wxMaracasEmptyPanel_4( _noteBook );
+//     _wxMaracasEmptyPanel_4->ConfigureVTK(  );
+//     _noteBook->AddPage(_wxMaracasEmptyPanel_4,"Loic", true, 1 );
+
+       _noteBook->SetSelection(0);
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookTests::OnChangePageTests );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookTests::OnChangePage );
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("Tests..."));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( title               , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook   , 1, wxGROW, 10 );
+
+//EEDxx2.4
+//     FitInside();
+
+       sizer->SetSizeHints( this );   // set size hints to honour minimum size
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout(); 
+
+}
+//----------------------------------------------------------------------------
+wxMaracasNoteBookTests::~wxMaracasNoteBookTests()
+{
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookTests::OnChangePage(wxNotebookEvent& event)
+{
+       Refresh();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookTests::OnChangePageTests(wxNotebookEvent& event)
+{
+       Refresh();
+}
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+BEGIN_EVENT_TABLE(wxMaracasNoteBookManualRegistration , wxPanel)
+//
+END_EVENT_TABLE()
+
+
+wxMaracasNoteBookManualRegistration::wxMaracasNoteBookManualRegistration(wxWindow *parent,marInterface *mar)
+       : wxPanel(parent, -1)
+{
+       wxBusyCursor wait;
+
+       _noteBook = new wxNotebook(this, -1);
+       _noteBook->SetSize(550,300);
+
+
+       wxBitmap mask= wxBITMAP( TOOLBAR_V2_sm_mask );
+
+       wxBitmap bitmap0        = wxBITMAP( TOOLBAR_V2_sm_bl_Processing );
+       wxBitmap bitmap1        = wxBITMAP( TOOLBAR_V2_sm_bl_Processing );
+
+       bitmap0.SetMask(new wxMask( mask ));
+       bitmap1.SetMask(new wxMask( mask ));
+
+       wxImageList *imageList = new wxImageList(50,50);
+       imageList->Add( bitmap0 );  // 0
+       imageList->Add( bitmap1 );  // 1
+       _noteBook->SetImageList(imageList);
+
+
+       _mar=new marInterface();
+       _mar->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _mar->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _mar->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _mar->_experiment->setVOI( voi );
+       _mar->SetDicom(mar->_dicom);
+
+       _mar->initExperiment( );
+
+       vtkImageData *imagedata;
+       imagedata = _mar->_experiment->getDynData( )->getVolume( )->castVtk();
+       imagedata->Update(); 
+       marImageData *marimagedata=new marImageData(imagedata);
+
+       _wxmanualregistration3D = new wxManualRegistration3D(_noteBook,marimagedata);
+       _wxmanualregistration3D->ConfigureVTK();
+       _noteBook->AddPage( _wxmanualregistration3D , _T("Manual registration 3D") , true, 0 );
+
+       _noteBook->SetSelection(0);
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING  , (wxObjectEventFunction) &wxMaracasNoteBookTests::OnChangePageTests );
+       Connect(_noteBook->GetId() , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED   , (wxObjectEventFunction) &wxMaracasNoteBookTests::OnChangePage );
+
+       wxStaticText *title=new wxStaticText(this,-1,_T("Manual registration"));
+
+// It doesn't works in linux
+//     wxFont font(18,wxDEFAULT  , wxITALIC, wxBOLD);
+//     title->SetFont(font);
+
+    wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( title               , 0, wxEXPAND | wxALIGN_RIGHT, 10);
+       sizer->Add( _noteBook   , 1, wxGROW, 10 );
+
+       sizer->SetSizeHints( this );   // set size hints to honour minimum size
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       this->Layout(); 
+
+}
+//----------------------------------------------------------------------------
+wxMaracasNoteBookManualRegistration::~wxMaracasNoteBookManualRegistration()
+{
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookManualRegistration::OnChangePage(wxNotebookEvent& event)
+{
+       Refresh();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookManualRegistration::OnChangePageTests(wxNotebookEvent& event)
+{
+       Refresh();
+}
+
+//----------------------------------------------------------------------------
+bool wxMaracasNoteBookManualRegistration::GetIfSecondVolumeExist()
+{
+       return _wxmanualregistration3D->GetIfSecondVolumeExist();
+}
+//----------------------------------------------------------------------------
+void wxMaracasNoteBookManualRegistration::GenerateSecondVolume(marInterface *mar)
+{
+       _marB=new marInterface();
+       _marB->_parameters->setRescaleSlope( mar->_parameters->getRescaleSlope() );
+       _marB->_parameters->setRescaleIntercept( mar->_parameters->getRescaleIntercept() );
+       _marB->_parameters->setIntParam( marParameters::e_voxel_type, marParameters::VOX_TYPE_MINIMUM );
+       _marB->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_x_dimension) );
+       _marB->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_y_dimension) );
+       _marB->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, mar->_parameters->getDoubleParam(marParameters::e_voxel_z_dimension) );
+       int voi[6];
+       mar->_experiment->getVOI( voi );
+       _marB->_experiment->setVOI( voi );
+       _marB->SetDicom(mar->_dicom);
+
+       _marB->initExperiment( );
+
+       vtkImageData *vtkimagedata;
+       vtkimagedata = _marB->_experiment->getDynData( )->getVolume( )->castVtk();
+       vtkimagedata->Update(); 
+       _wxmanualregistration3D->AddSecondVolume(new marImageData(vtkimagedata));
+}
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame02.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasFrame02.h
new file mode 100644 (file)
index 0000000..fc867c8
--- /dev/null
@@ -0,0 +1,661 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasFrame02.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__FRAME02__HXX__
+#define __WX__MARACAS__FRAME02__HXX__
+
+
+//#include <wx/dialog.h>
+//#include <vtkCamera.h>
+
+#include "wxMaracasPathology_01.h"
+#include "marTypes.h"
+#include "wxMaracas3DBrowser.h"
+#include "wxMaracasQuantification.h"
+#include "widgets/wxSurfaceSTLWidget.h"
+#include "wxMaracasMPR.h"
+#include "wxMaracasProcessingCT.h"
+#include "wxMaracasEmptyPanel.h"
+#include "wxMaracasEmptyPanel_2.h"
+#include "wxMaracasEmptyPanel_3.h"
+#include "wxMaracasQuantificationCT.h"
+#include "wxMaracasImageBrowser02.h"
+#include "wxMaracas_ManualTree_MPR.h"
+#include "wxMaracas_ManualContour_Panel.h"
+#include "widgets/wxManualRegistration3D.h"
+
+#include "widgets/wxManualRegistration3D.h"
+#include "wxMaracas_SegmentationFM3D.h"
+#include "wxMaracas_ManualSegmentation_MPR.h"
+
+//EED 15Avril2008      using namespace std;
+//EED 15Avril2008      #include "ILPD/src/wxInterface/wxILPD.h"
+#include "wxILPDwithImage.h"
+
+
+
+class marInterface;
+class marInterfaceCT;
+
+
+// EED 3 nov 2006
+
+class FileInfoNode
+{
+public:
+       FileInfoNode(string filename, string dirfile);
+       ~FileInfoNode();
+
+       string GetFileName();
+       string GetFileNameParent();
+       void   SetFileNameParent(string parent);
+       string GetDirFile();
+
+private:
+       std::string _dirfile;
+       std::string _filename;
+       std::string _filenameParent;
+       FileInfoNode *_parentNode;
+       std::vector <FileInfoNode *> _lstFileInfoNodeChildrens;
+protected:
+};
+
+
+
+class FileInformationModel
+{
+public:
+       FileInformationModel();
+       ~FileInformationModel();
+
+       void    ResetModel();
+       void    ReadModel(string dirFile);
+
+       int             GetSizeLstFile();
+       string  GetFileName(int i);
+
+       int             GetSizeLstFile_filter();
+       string  GetFileName_filter(int i);
+
+
+
+       void    Filtre_1(string filtre);
+       void    LinkRelations();
+
+private:
+       string  _filtre_1;
+       std::vector <FileInfoNode *> _lstFileInfoNodes;
+protected:
+};
+
+
+class wxReadWriteConf: public wxDialog
+{
+public:
+       wxReadWriteConf(wxWindow *parent,string parentFile);
+       ~wxReadWriteConf();
+
+       void    eventBtnWorkDirectory(wxCommandEvent &event);
+       void    eventBtnReadFile(wxCommandEvent &event);
+       void    eventBtnWriteFile(wxCommandEvent &event);
+       void    eventBtnReWriteFile(wxCommandEvent &event);
+
+       void    OnShowFile01(wxCommandEvent &event);
+       void    OnShowFile02(wxCommandEvent &event);
+
+       string  GetNameWriteFile();
+       string  GetNameReadFile();
+       string  GetWorkDirectory();
+       string  GetParentFile();
+
+protected:
+
+private:
+
+       static string                   _workDirectory;
+       string                                  _nameWriteFile;
+       string                                  _nameReadFile;
+       string                                  _parentFile;
+       wxStaticText                    *_directoryTXT;
+       FileInformationModel    *_fim;
+
+       wxListBox                               *_wxlstFiles;
+       wxListBox                               *_wxlstAllFiles;
+       wxTextCtrl                              *_wxviewinfo;
+
+       wxWindow *CreateReadModule(wxWindow *parent);
+       wxWindow *CreateListFilesModule(wxWindow *parent);
+       wxWindow *CreateReadFileModule(wxWindow *parent);
+       wxWindow *CreateListAllFilesModule(wxWindow *parent);
+
+
+
+       void    RefreshReadFilesList();
+       void    RefreshAllFilesList();
+       void    ShowInformation(wxListBox *wxlistbox , wxTextCtrl* wxtextctrl );
+       void    ResetView();
+
+
+};
+
+
+
+
+/**
+ * \brief Principal Frame of the application 
+ * MARACAS: MAgnetic Resonance Angiography Computer ASsisted analysis
+ *
+ */
+
+
+class MAR_INTERFACEWX_EXPORT wxMaracasFrame02: public wxFrame
+{
+public:
+    wxMaracasFrame02( wxFrame *parent, wxWindowID id = -1,
+            marInterface* mar = NULL, marInterfaceCT* marCT = NULL, char *dictionaryFileName=NULL,
+            const wxString& title = wxT("MARACAS: MAgnetic Resonance Angiography Computer ASsisted analysis"),
+            const wxPoint& pos = wxDefaultPosition,
+            const wxSize& size = wxDefaultSize,
+            long style = wxDEFAULT_FRAME_STYLE);
+    void RecreateToolbar( );
+    void OnQuit( wxCloseEvent& event );
+    void OnLoadPatientData( wxCommandEvent& event );
+    void OnParameters( wxCommandEvent& event );
+
+// EED Borrme not used
+    void OnLoadImageData( wxListEvent& event );
+
+    void OnLoadImageData02( wxCommandEvent& event );
+    void OnStartExperiment( wxCommandEvent& event );
+    void OnHelp (wxCommandEvent& event );
+    void OnQuant (wxCommandEvent& event );
+    void OnQuantificationCT (wxCommandEvent& event );
+       void OnAboutCreatis( wxCommandEvent& event );
+
+    void OnStl (wxCommandEvent& event );
+       void OnNewAxis(wxCommandEvent &WXUNUSED(event));
+       void OnDeleteAxis(wxCommandEvent &WXUNUSED(event));
+
+       void OnRegenerateAll( wxCommandEvent& event );
+       void OnRegenerateSplineAxe(     wxCommandEvent& event );
+       void OnCleanContours( wxCommandEvent& event );
+       void OnRegenerateSignal( wxCommandEvent& event );
+       
+       void OnMPR(wxCommandEvent& event );
+       void OnProcessingCT(wxCommandEvent& event );
+
+       void OnEmptyPanel(wxCommandEvent& event );
+       void OnEmptyPanel_2(wxCommandEvent& event );
+
+
+
+private:
+       wxMaracas3DBrowser              *_wxmaracas3dbrowser;
+       wxMaracasQuantification         *_wxmaracasquantification;
+       wxMaracasQuantificationCT       *_wxmaracasquantification_ct;
+       wxSurfaceSTLWidget              *_wxmaracassurfaceSTLwidget;
+       wxMaracasMPR                    *_wxMaracasMPR;
+       wxMaracasProcessingCT           *_wxMaracasProcessingCT;
+
+       wxMaracasEmptyPanel             *_wxMaracasEmptyPanel; 
+       wxMaracasEmptyPanel_2           *_wxMaracasEmptyPanel_2; 
+
+       wxPanel*                        _actual_panel;
+       wxGauge*                        _progressGauge;
+       marInterface*                   _mar;
+       marInterfaceCT*                 _marCT;
+
+    DECLARE_EVENT_TABLE( );
+
+       void DeletePanels();
+
+};
+
+static const long TOOLBAR_STYLE = wxNO_BORDER | wxTB_FLAT | wxTB_DOCKABLE | wxTB_HORIZONTAL;
+
+enum
+{
+    //! Toolbar & menu buttons
+    ID_TOOLBAR = 200,
+    ID_TOOLBAR_DATA_BROWSER,
+    ID_TOOLBAR_PARAMETERS,
+    ID_TOOLBAR_IMAGE_BROWSER,
+    ID_TOOLBAR_3D_BROWSER,
+    ID_TOOLBAR_PLANS,
+    ID_TOOLBAR_QUANT,
+    ID_TOOLBAR_MPR,
+    ID_TOOLBAR_PROCESSING_CT,
+    ID_TOOLBAR_QUANTIFICATION_CT,
+       ID_TOOLBAR_EMPTY_PANEL,
+       ID_TOOLBAR_EMPTY_PANEL_2,
+    ID_TOOLBAR_ROTATE,
+    ID_TOOLBAR_BRIGHT,
+    ID_TOOLBAR_PAN,
+    ID_TOOLBAR_ZOOM,
+    ID_TOOLBAR_CLEAR,
+    ID_TOOLBAR_INTENSITY,
+    ID_TOOLBAR_HELP,
+    ID_TOOLBAR_STL,
+};
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasNoteBookPatientLstVoi: public wxPanel
+{
+public:
+    wxMaracasNoteBookPatientLstVoi(wxWindow *parent);
+    ~wxMaracasNoteBookPatientLstVoi();
+
+       void    OnChangePageToVOI(wxNotebookEvent& event);
+       void    OnChangePage(wxNotebookEvent& event);
+       void    OnSelectPatientStudySerieImage(wxCommandEvent& event);
+       void    OnReadWriteConf_Maracas(wxCommandEvent& event);
+
+       void    SetMarInterface(marInterface *mar);
+       wxMaracasImageBrowser02* GetWxMaracasImageBrowser02();
+       wxILPD  *GetWxILPD();
+
+       void    OnPersistence_Read(wxCommandEvent& event);
+       void    OnPersistence_Write(wxCommandEvent& event);
+       void    Persistence_Read_Images();
+       void    Persistence_Read_VOI();
+
+       void    Persistence_Write_Images_Database();
+       void    Persistence_Write_Images_ManualReadFileList();
+
+       void    Persistence_Write_VOI();
+
+       string  GetRWCM_namefileVOI();
+
+       wxNotebook *GetNoteBook();
+
+       DECLARE_EVENT_TABLE();
+
+private:
+
+//EED 4 oct 2006
+       marRAWFiles                             *_marRAWFiles;
+       marRAW2Files                    *_marRAW2Files;
+       marRAW2AsciiFiles       *_marRAW2AsciiFiles;
+    marGdcmDicomILPD           *_marGdcmDicomILPD;
+
+// EED 14 Nov 2006
+       wxReadWriteConf                 *_wxreadwriteconf;
+
+// EED 26 Nov 2006
+       string                                  _RWCM_namefileReadImages;
+       string                                  _RWCM_namefileVOI;
+
+
+       marInterface                    *_mar;
+       marInterface                    *_mar2;
+       wxNotebook                              *_noteBook;
+       string                                  _backStringFirstFile;
+       string                                  _backStringFirstFile2;
+       int                                             _voiBack[ 6 ];
+
+       wxILPD                                  *_wxILPD;
+       wxMaracasImageBrowser02 *_wxMaracasImageBrowser02;
+       wxMaracasMPR                    *_wxMaracasMPR;
+
+       wxListView                              *_dicomPanelListView;
+
+       wxWidgetMesure2D                *_widgetMesure;
+
+//EED 15Avril2008              wxVtk2DBaseView                 *_wxvtk2Dbaseview;
+//EED 15Avril2008              vtkBaseData                             *_vtkbasedata; 
+//EED 15Avril2008              wxPanel                                 *_panelImage;
+
+//EED 15Avril2008              wxSplitterWindow    *_pnlSplitter_ViewImage_wxILPD;
+//EED 15Avril2008              wxSplitterWindow    *_pnlSplitter_Image_DicomList;
+
+//EED 15Avril2008              void    SetItem( wxListView *wxlistview, int line, int col, wxString text ) ;
+
+//EED 15Avril2008              void    ResetwxListView();
+//EED 15Avril2008              void    SelectedPatient();
+//EED 15Avril2008              void    SelectedSerie();
+//EED 15Avril2008              void    SelectedImage();
+//EED 15Avril2008              void    ShowDicomInformation(string *fileImageName);
+//EED 15Avril2008              void    ShowDicomImage(string *fileImageName);
+
+       void    CreateMPRPanel();
+
+
+};
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasNoteBookIRMQuantification: public wxPanel
+{
+public:
+    wxMaracasNoteBookIRMQuantification(wxWindow *parent, marInterface *mar);
+    ~wxMaracasNoteBookIRMQuantification();
+       void OnChangePageQuantification(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+       void OnNewAxis(wxCommandEvent &WXUNUSED(event));
+       void OnDeleteAxis(wxCommandEvent &WXUNUSED(event));
+       void OnQuantification(wxCommandEvent & event);
+
+       DECLARE_EVENT_TABLE();
+private:
+       bool                                    _existAxis;
+       marInterface                    *_mar;
+       wxMaracas3DBrowser              *_wxmaracas3dbrowser;
+       wxMaracasQuantification *_wxmaracasquantification;
+       wxNotebook                              *_noteBook;
+};
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasNoteBookCTQuantification: public wxPanel
+{
+public:
+    wxMaracasNoteBookCTQuantification(wxWindow *parent, marInterface *mar, string _namefileParentRWCM);
+    ~wxMaracasNoteBookCTQuantification();
+       void OnChangePageQuantification(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+       void OnQuantification(wxCommandEvent& event);
+
+       void OnReadWriteConf_Maracas(wxCommandEvent& event);
+       void OnPersistence_Read(wxCommandEvent& event);
+       void OnPersistence_Write(wxCommandEvent& event);
+       void Persistence_Read_MPR();
+       void Persistence_Read_ProcessingCT();
+       void Persistence_Read_ContourQauntificationCT();
+       void Persistence_Write_MPR();
+       void Persistence_Write_ProcessingCT();
+       void Persistence_Write_ContourQuantificationCT();
+         
+
+       DECLARE_EVENT_TABLE();
+private:
+
+       string                                          _namefileParentRWCM;
+       string                                          _RWCM_namefileMPR;
+       string                                          _RWCM_namefileProcessingCT;
+       string                                          _RWCM_namefileContourQuantificationCT;
+       wxReadWriteConf                         *_wxreadwriteconf;
+
+       bool                                            _readyQuantification;
+       marInterfaceCT                          *_mar;
+       wxMaracasMPR                            *_wxMaracasMPR;
+       wxMaracasProcessingCT           *_wxMaracasProcessingCT;
+       wxMaracasQuantificationCT       *_wxmaracasquantification_ct;
+       wxNotebook                                      *_noteBook;
+};
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasNoteBookVascularTreeExtraction: public wxPanel
+{
+public:
+    wxMaracasNoteBookVascularTreeExtraction(wxWindow *parent, marInterface *mar);
+    ~wxMaracasNoteBookVascularTreeExtraction();
+       void OnChangePageQuantification(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+
+       DECLARE_EVENT_TABLE();
+private:
+       marInterface                            *_mar;
+       wxMaracasEmptyPanel_2           *_wxMaracasEmptyPanel_2;
+       wxMaracasPathology_01           *_wxMaracasPathology_01;
+       wxNotebook                                      *_noteBook;
+};
+
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasNoteBookSTLFormat: public wxPanel
+{
+public:
+    wxMaracasNoteBookSTLFormat(wxWindow *parent, marInterface *mar);
+    ~wxMaracasNoteBookSTLFormat();
+       void OnChangePageSTLFormat(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+       void OnNewAxis(wxCommandEvent &WXUNUSED(event));
+       void OnDeleteAxis(wxCommandEvent &WXUNUSED(event));
+
+       wxPanel *CreateSTLFormat_01(wxWindow *parent,marInterface *mar);
+       wxPanel *CreateSTLFormat_02(wxWindow *parent,marInterface *mar);
+       wxPanel *CreateSTLFormat_03(wxWindow *parent,marInterface *mar);
+
+       DECLARE_EVENT_TABLE();
+private:
+
+
+       // STL 01
+       bool                                    _existAxis;
+       marInterface                    *_mar;
+       wxMaracas3DBrowser              *_wxmaracas3dbrowser;
+       wxSurfaceSTLWidget              *_wxmaracassurfaceSTLwidget; 
+       wxNotebook                              *_noteBook_01;
+
+       // STL 02
+       wxMaracasMPR                    *_wxMaracasMPR; 
+
+       // General
+       wxNotebook                              *_noteBook_general;
+};
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasNoteBookTests: public wxPanel
+{
+public:
+    wxMaracasNoteBookTests(wxWindow *parent, marInterface *mar);
+    ~wxMaracasNoteBookTests();
+       void OnChangePageTests(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+
+       DECLARE_EVENT_TABLE();
+private:
+       marInterface                                            *_mar;
+       wxMaracasEmptyPanel_3                           *_wxMaracasEmptyPanel_3; 
+       wxMaracasEmptyPanel_4                           *_wxMaracasEmptyPanel_4;
+
+       wxMaracas_ManualContour_Panel           *_wxmanualcontourpanel;
+       wxMaracas_ManualTree_MPR                        *_wxMaracas_ManualTree_MPR;
+       wxMaracas_ManualSegmentation_MPR        *_wxMaracas_ManualSegmentation_MPR;
+       wxMaracas_SegmentationFM3D                      *_wxMaracas_SegmentationFM3D; 
+
+       wxNotebook                                                      *_noteBook;
+};
+
+class wxMaracasNoteBookManualRegistration: public wxPanel
+{
+public:
+    wxMaracasNoteBookManualRegistration(wxWindow *parent, marInterface *mar);
+    ~wxMaracasNoteBookManualRegistration();
+       void OnChangePageTests(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+
+       bool GetIfSecondVolumeExist();
+       void GenerateSecondVolume(marInterface *mar);
+
+
+
+       DECLARE_EVENT_TABLE();
+private:
+       marInterface                            *_mar;
+       marInterface                            *_marB;
+       wxNotebook                                      *_noteBook;
+
+       wxManualRegistration3D          *_wxmanualregistration3D;
+
+};
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+class wxMaracasGenericChiFra: public wxMDIChildFrame
+{
+public:
+    wxMaracasGenericChiFra(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style);
+    ~wxMaracasGenericChiFra();
+    void OnClose(wxCloseEvent& event);
+       void SetBlockCloseEvent(bool blockClose);
+       DECLARE_EVENT_TABLE();
+private:
+       bool                                    _blockClose;
+};
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+class wxProcessingImagesControl: public wxPanel
+{
+public:
+       wxProcessingImagesControl(wxWindow *parent);
+       void OnActiveIRMQuantificationFrame(wxCommandEvent& event);
+       void OnActiveCTQuantificationFrame(wxCommandEvent& event);
+       void OnActiveVascularTreeExtractionFrame(wxCommandEvent& event);
+       void OnActiveSTLFormatFrame(wxCommandEvent& event);
+       void OnActiveTestsFrame(wxCommandEvent& event);
+       void OnActiveTests2Frame(wxCommandEvent& event);
+
+       ~wxProcessingImagesControl();
+private:
+};
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+class wxProcessingImagesTabControl: public wxPanel
+{
+public:
+       wxProcessingImagesTabControl(wxWindow *parent,marInterface *mar,wxMaracasNoteBookPatientLstVoi  *patientlstvoi);
+       ~wxProcessingImagesTabControl();
+       void OnChangingPage(wxNotebookEvent& event);
+       void OnChangePage(wxNotebookEvent& event);
+
+private:
+    marInterface                                                       *_mar;
+       wxMaracasNoteBookPatientLstVoi                  *_patientlstvoi;
+       wxMaracasNoteBookIRMQuantification              *_irmQuantification;
+       wxMaracasNoteBookCTQuantification               *_ctQuantification;
+       wxMaracasNoteBookVascularTreeExtraction *_vascularTreeExtraction;
+       wxMaracasNoteBookSTLFormat                              *_stlFormat;
+
+       wxNotebook      *_noteBook;
+
+};
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+class MAR_INTERFACEWX_EXPORT wxMaracasFrame03: public wxMDIParentFrame
+{
+public:
+    wxMaracasFrame03( wxFrame *parent, wxWindowID id = -1,
+            marInterface* mar = NULL, char *dictionaryFileName=NULL,
+            const wxString& title = wxT("MARACAS: MAgnetic Resonance Angiography Computer ASsisted analysis"),
+            const wxPoint& pos = wxDefaultPosition,
+            const wxSize& size = wxDefaultSize,
+            long style = wxDEFAULT_FRAME_STYLE);
+       ~wxMaracasFrame03();
+       void OnActivePatientListVoiFrame(wxCommandEvent& event);
+       void OnActiveProcessingFrame(wxCommandEvent& event);
+       void OnActiveParams(wxCommandEvent& event);
+       void OnActiveAbout(wxCommandEvent& event);
+       void OnActiveProcessingModules(wxCommandEvent& event);
+       void OnActiveIRMQuantificationFrame(wxCommandEvent& event);
+       void OnActiveCTQuantificationFrame(wxCommandEvent& event);
+       void OnActiveVascularTreeExtractionFrame(wxCommandEvent& event);
+       void OnActiveSTLFormatFrame(wxCommandEvent& event);
+       void OnActiveTestsFrame(wxCommandEvent& event);
+       void OnActiveTests2Frame(wxCommandEvent& event);
+       void OnActiveQuit(wxCommandEvent& event);
+       void CreateWindowMDI( int type );
+       void Configure_WindowMDI( int type );
+
+       void eventMenuDeleteAllPatientInDB(wxCommandEvent& event);
+       void eventMenuDeletePatientInDB(wxCommandEvent& event);
+       void OnFilterInDB(wxCommandEvent& event);
+       void OnOrderingInDB(wxCommandEvent& event);
+       void OnEditColumnsInDB(wxCommandEvent& event);
+
+       DECLARE_EVENT_TABLE();
+
+private:
+    marInterface                                               *_mar;
+//     wxMaracasGenericChiFra                          *_frame_ListPatieint_Voi;
+       wxFrame                                         *_frame_ListPatieint_Voi;
+       wxMaracasNoteBookPatientLstVoi          *_patientlstvoi;
+       wxMaracasNoteBookManualRegistration     *_manualRegistrationPanel;
+
+
+    wxBitmapButton                                     *_btnProcessingData;
+    wxBitmapButton                                     *_btnCTQuant;
+    wxBitmapButton                                     *_btnIRMQuant;
+    wxBitmapButton                                     *_btnTreeExtrac;
+    wxBitmapButton                                     *_btnSTLFormat;
+
+       wxMenu                                                  *_option_menu;
+
+       wxMenuBar *CreateMenuBarBase();
+       void InitToolBar(wxToolBar* toolBar);
+};
+
+
+// menu items ids
+enum
+{
+    MDI_QUIT = 100,
+    MDI_NEW_WINDOW,
+    MDI_REFRESH,
+    MDI_CHANGE_TITLE,
+    MDI_CHANGE_POSITION,
+    MDI_CHANGE_SIZE,
+    MDI_CHILD_QUIT,
+    MDI_PARAMETERS,
+    MDI_ABOUT
+};
+
+
+
+
+#endif // __WX__MARACAS__FRAME02__HXX__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasHelpDialog.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasHelpDialog.cxx
new file mode 100644 (file)
index 0000000..3b5951b
--- /dev/null
@@ -0,0 +1,197 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasHelpDialog.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasHelpDialog.h"
+
+#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
+#include "res/bitmaps/authors.xpm"
+#endif
+
+
+
+wxMaracasHelpDialog::wxMaracasHelpDialog(wxWindow* parent, int id, const char* title, const wxPoint& pos, const wxSize& size, long style):
+    wxDialog(parent, id, wxString(title, wxConvUTF8), pos, size, style)
+{
+
+
+       wxPanel                 *logoPanel      = new wxPanel(this,-1);
+       logoPanel->SetBackgroundColour(wxColour(0,0,153));
+    wxStaticBitmap     *logo           = new wxStaticBitmap(logoPanel, -1, wxBITMAP( authors ),wxPoint(0,0));
+       wxBoxSizer              *logoSizer      = new wxBoxSizer(wxVERTICAL );
+       int wx=logo->GetBitmap().GetWidth();
+       int wy=logo->GetBitmap().GetHeight();
+       logoPanel->SetSize(wx,wy);
+       logoSizer->Add(logo);
+       logoPanel->SetSizer(logoSizer);
+       logoPanel->SetAutoLayout(true);
+
+       wxBoxSizer              *sizer          = new wxBoxSizer(wxVERTICAL );
+       sizer->Add(logoPanel,   0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+       SetSize(wx,wy+20);
+       
+
+}
+
+/*
+
+wxMaracasHelpDialog::wxMaracasHelpDialog(wxWindow* parent, int id, const char* title, const wxPoint& pos, const wxSize& size, long style):
+    wxDialog(parent, id, title, pos, size, style)
+{
+
+       SetSize(350,350);
+       SetBackgroundColour(wxColour(0,0,153));
+
+  
+       wxStaticText    *text0          = new wxStaticText(this, -1,"");
+       wxStaticText    *text1          = new wxStaticText(this, -1,"System created by");
+       wxStaticText    *text2          = new wxStaticText(this, -1,"Research and Applications Center \n for Image and Signal Processing");
+       wxStaticText    *text3          = new wxStaticText(this, -1,"www.creatis.insa-lyon.fr");
+
+       wxPanel                 *logoPanel      = new wxPanel(this,-1);
+       logoPanel->SetBackgroundColour(wxColour(0,0,153));
+    wxStaticBitmap     *logo           = new wxStaticBitmap(logoPanel, -1, wxBITMAP( creatis_logo2 ),wxPoint(0,0));
+       wxBoxSizer              *logoSizer              = new wxBoxSizer(wxVERTICAL );
+       logoPanel->SetSize(logo->GetBitmap().GetWidth(),logo->GetBitmap().GetHeight());
+       logoSizer->Add(logo);
+       logoPanel->SetSizer(logoSizer);
+       logoPanel->SetAutoLayout(true);
+
+       text0->SetForegroundColour(wxColour(255,255,255));
+       text1->SetForegroundColour(wxColour(255,255,255));
+       text2->SetForegroundColour(wxColour(255,255,255));
+       text3->SetForegroundColour(wxColour(255,255,255));
+
+
+
+       wxFont font1(12, wxDEFAULT    , wxNORMAL, wxBOLD);
+       wxFont font2(11, wxDEFAULT    , wxNORMAL, wxBOLD);
+       text0->SetFont( font1 );
+       text1->SetFont( font1 );
+       text2->SetFont( font1 );
+       text3->SetFont( font2 );
+
+
+       wxBoxSizer              *sizer          = new wxBoxSizer(wxVERTICAL );
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text1        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(logoPanel,   0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text2        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text3        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+
+
+
+
+//        staticBitmap1->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL, false, ""));
+}
+
+
+
+
+
+
+wxMaracasHelpDialog2::wxMaracasHelpDialog2(wxWindow* parent, int id, const char* title, const wxPoint& pos, const wxSize& size, long style):
+    wxDialog(parent, id, title, pos, size, style)
+{
+
+       SetSize(550,460);
+       SetBackgroundColour(wxColour(0,0,153));
+
+  
+       wxStaticText    *text0          = new wxStaticText(this, -1,"");
+       wxStaticText    *text1          = new wxStaticText(this, -1,"System created by");
+       wxStaticText    *text2          = new wxStaticText(this, -1,"Research and Applications Center \n for Image and Signal Processing");
+       wxStaticText    *text3          = new wxStaticText(this, -1,"CREATIS, UMR CNRS 5515, INSA 502, 69621 Villurbanne cedex, France");
+       wxStaticText    *text4  = new wxStaticText(this, -1,"www.creatis.insa-lyon.fr");
+       wxString authors;
+       authors="AUTHORS : Marcela Hernandez-Hoyos, Maciej Orkisz, Catherine Mansard,\n";
+       authors=authors+ "                   Alfred AnwanderBruno Neyran, Jean-Pierre Roux,Eric Boix,  \n";
+       authors=authors+ "                   Isabelle E. Magnin, Phillippe Douek \n";
+       wxStaticText    *text5          = new wxStaticText(this, -1,authors);
+
+       wxPanel                 *logoPanel      = new wxPanel(this,-1);
+       logoPanel->SetBackgroundColour(wxColour(0,0,153));
+    wxStaticBitmap     *logo           = new wxStaticBitmap(logoPanel, -1, wxBITMAP( creatis_logo2 ),wxPoint(0,0));
+       wxBoxSizer              *logoSizer              = new wxBoxSizer(wxVERTICAL );
+       logoPanel->SetSize(logo->GetBitmap().GetWidth(),logo->GetBitmap().GetHeight());
+       logoSizer->Add(logo);
+       logoPanel->SetSizer(logoSizer);
+       logoPanel->SetAutoLayout(true);
+
+       text0->SetForegroundColour(wxColour(255,255,255));
+       text1->SetForegroundColour(wxColour(255,255,255));
+       text2->SetForegroundColour(wxColour(255,255,255));
+       text3->SetForegroundColour(wxColour(255,255,255));
+       text4->SetForegroundColour(wxColour(255,255,255));
+       text5->SetForegroundColour(wxColour(255,255,255));
+
+
+
+       wxFont font1(12, wxDEFAULT    , wxNORMAL, wxBOLD);
+       wxFont font2(10, wxDEFAULT    , wxNORMAL, wxBOLD);
+       wxFont font3(8, wxDEFAULT    , wxNORMAL, wxBOLD);
+       text0->SetFont( font1 );
+       text1->SetFont( font1 );
+       text2->SetFont( font1 );
+       text3->SetFont( font2 );
+       text4->SetFont( font2 );
+       text5->SetFont( font3 );
+
+       wxBoxSizer              *sizer          = new wxBoxSizer(wxVERTICAL );
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text1        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(logoPanel,   0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text2        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text3        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text4        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text5        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+       sizer->Add(text0        ,       0, wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 0);
+
+       this->SetSizer(sizer);
+       this->SetAutoLayout(true);
+
+}
+
+
+*/
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasHelpDialog.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasHelpDialog.h
new file mode 100644 (file)
index 0000000..c4260f2
--- /dev/null
@@ -0,0 +1,44 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasHelpDialog.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__HELP__DIALOG__
+#define __WX__HELP__DIALOG__
+
+#include <wx/wx.h>
+#include <wx/dialog.h>
+
+/**
+ * \brief Dialog class that show authors ...
+ */
+class wxMaracasHelpDialog : public wxDialog
+{
+  public:
+    wxMaracasHelpDialog(wxWindow* parent, int id, const char* title="Maracas Help", 
+                 const wxPoint& pos=wxPoint(400, 275),
+                 const wxSize& size=wxSize(1000, 600), 
+                 long style=wxDEFAULT_DIALOG_STYLE);
+
+  private:
+
+};
+
+
+
+
+#endif // __WX__HELP__DIALOG__
+
+// EOF - 
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser.cxx
new file mode 100644 (file)
index 0000000..4c11e33
--- /dev/null
@@ -0,0 +1,62 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasImageBrowser.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include <wx/image.h>
+#include "wxMaracasImageBrowser.h"
+//----------------------------------------------------------------------------
+wxMaracasImageBrowser::wxMaracasImageBrowser( wxFrame* parent, marInterface* mar, wxWindowID id )
+    : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL )
+{
+//    _mar = mar;
+
+    _view_image = new wxImageViewerWidgetRoi( this, -1 );
+    //parent->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, _view_image->_bboxEnabled);
+
+    wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+    szTop->Add( _view_image, 1, wxEXPAND | wxALL, 10 );
+    SetAutoLayout( true );
+    SetSizer( szTop );
+    szTop->Fit( this );
+    szTop->SetSizeHints( this );
+
+}
+//----------------------------------------------------------------------------
+wxMaracasImageBrowser::~wxMaracasImageBrowser()
+{
+  delete _view_image;
+//  delete szTop
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser::LoadData( vtkImageData *imagedata )
+{
+
+//    _mar->_dicom->loadActualSerie();
+//    vtkImageData *dummy = _mar->_dicom->getVolume( )->castVtk();
+    //float range[2];
+    //dummy->GetScalarRange( range );
+
+    _view_image->ConstructVTK( imagedata );
+    //_view_image->ConstructVTK(  (vtkImageData *)_mar->_dicom->getVolume( ));
+    //^ this is not working ??? I don't understand why, some VTK pipeline mystery
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser::GetROI( int ext[6] )
+{
+    _view_image->GetROI( ext );
+}
+
+// EOF - wxImageBrowser.cxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser.h
new file mode 100644 (file)
index 0000000..ee818f6
--- /dev/null
@@ -0,0 +1,50 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasImageBrowser.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__IMAGE__BROWSER__
+#define __WX__IMAGE__BROWSER__
+
+#include <wx/wx.h>
+#include <wx/imaglist.h>
+#include <wx/panel.h>
+#include <wx/listctrl.h>
+#include <wx/splitter.h>
+
+#include "widgets/wxImageViewerWidget.h"
+
+#include <kernel/marInterface.h>
+
+/**
+ * \brief Panel class that show thumbnails images
+ */
+class wxMaracasImageBrowser : public wxPanel
+{
+public:
+    wxMaracasImageBrowser( wxFrame* parent, marInterface* mar, wxWindowID id = -1 );
+    ~wxMaracasImageBrowser();
+
+    void LoadData( vtkImageData *imagedata);
+    void GetROI( int ext[6] );
+
+private:
+
+    wxImageViewerWidgetRoi* _view_image;
+    //marInterface* _mar;
+};
+
+#endif // __WX__IMAGE__BROWSER__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser02.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser02.cxx
new file mode 100644 (file)
index 0000000..2d61646
--- /dev/null
@@ -0,0 +1,291 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasImageBrowser02.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include <wx/image.h>
+#include <wx/filedlg.h>
+
+#include "wxMaracasImageBrowser02.h"
+#include "kernel/marDicomBase.h"
+
+DEFINE_EVENT_TYPE(wxEVT_MARACASIMAGEBROWSERCUTIMAGE)
+
+BEGIN_EVENT_TABLE( wxMaracasImageBrowser02, wxPanel )
+       EVT_MENU( 12121, wxMaracasImageBrowser02::OnRefreshView  )
+       EVT_MENU( 12122, wxMaracasImageBrowser02::OnRefreshView2 )
+END_EVENT_TABLE( );
+
+
+
+//----------------------------------------------------------------------------
+
+//EED 15Avril2008
+//wxMaracasImageBrowser02::wxMaracasImageBrowser02( wxWindow* parent, marInterface* mar, wxWindowID id )
+//    : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ){
+
+wxMaracasImageBrowser02::wxMaracasImageBrowser02( wxWindow* parent, marFilesBase *dicom ,marParameters* parameters )
+    : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ){
+
+       this->SetSize(100,100);
+
+    //parent->GetToolBar()->EnableTool(ID_TOOLBAR_3D_BROWSER, _view_image->_bboxEnabled);
+       _parameters = parameters;
+
+    wxPanel *panel1=new wxPanel(this,-1);
+       _btnRestRoi     = new wxButton (panel1,-1,_T("Set VOI"),wxDefaultPosition ,wxSize(100,80)  );
+       _loadRangeImage = new LoadRangeImage(panel1,dicom);
+       _loadRangeImage->SetSize(100,100);
+       wxButton *bt_SavePerpSlice      = new wxButton(panel1,-1,_T("Save VOI image"));
+       wxButton *bt_CutVolume  = new wxButton(panel1,-1,_T("Cut Volume"));
+       Connect(bt_SavePerpSlice->GetId()       , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasImageBrowser02::OnBtSaveVOIData );
+       Connect(bt_CutVolume->GetId()           , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasImageBrowser02::OnBtnCutVolume );
+       Connect(_btnRestRoi->GetId()            , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) (wxCommandEventFunction) &wxMaracasImageBrowser02::OnBtnResetRoi      );
+
+
+    wxPanel *panel2=new wxPanel(this,-1);
+       _imageviewer2D_1 = new wxVtk2DBaseView(panel2);
+       wxVTKRenderWindowInteractor *iren = _imageviewer2D_1->GetWxVTKRenderWindowInteractor();
+    wxBoxSizer *sizerDown= new wxBoxSizer(wxVERTICAL);
+       sizerDown->Add( iren            , 1,  wxEXPAND , 0 );
+    panel2->SetSizer( sizerDown );
+    panel2->SetAutoLayout( true );
+    panel2->SetSize( 100,100 );
+    panel2->Layout();
+
+
+
+//    wxBoxSizer *sizer1= new wxBoxSizer(wxHORIZONTAL);
+    wxFlexGridSizer *sizer1= new wxFlexGridSizer(10);
+    panel1->SetSizer( sizer1 );
+       sizer1->AddGrowableCol(1);
+       sizer1->Add( _btnRestRoi        );
+       sizer1->Add( _loadRangeImage,1,wxEXPAND,0               );
+       sizer1->Add( bt_SavePerpSlice);
+       sizer1->Add( bt_CutVolume);
+
+
+    wxFlexGridSizer *sizer= new wxFlexGridSizer(1);
+       sizer->AddGrowableCol(0);
+       sizer->AddGrowableRow(1);
+
+
+       sizer->Add(     panel1  ,1,wxEXPAND,0 );
+       sizer->Add(     panel2          , 1,  wxGROW , 0 );
+
+    this->SetSizer( sizer );
+    this->SetAutoLayout( true );
+    this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracasImageBrowser02::~wxMaracasImageBrowser02()
+{
+  delete _imageviewer2D_1;
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::OnBtnCutVolume( wxCommandEvent &  event )
+{
+               wxCommandEvent cevent( wxEVT_MARACASIMAGEBROWSERCUTIMAGE, GetId() );
+               cevent.SetEventObject( this );
+               GetEventHandler()->ProcessEvent( cevent );
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::OnBtnResetRoi( wxCommandEvent &  event )
+{
+       if (_loadRangeImage!=NULL) {_loadRangeImage->Reset();}
+
+       vtkImageData *imagedata = _vtkbasedata_1->GetImageData();
+       int dim[3];
+       imagedata->GetDimensions(dim);
+
+
+       vtkImageViewer2         *IV2= this->_imageviewer2D_1->_imageViewer2XYZ->GetVtkImageViewer2();
+       vtkCamera               *camera = IV2->GetRenderer()->GetActiveCamera();
+       double pos[3];
+       camera->GetPosition(pos);
+
+
+// EED 27 sep 2006
+//     double spc[3];
+//     imagedata->GetSpacing(spc);
+//     _manRoiControl->InitRoi( dim[0]*spc[0] , dim[1]*spc[1] , 0.2 );
+
+       _manRoiControl->InitRoi( dim[0]  , dim[1] , 0.2);
+       _manRoiControl->SetActive(true);
+
+       _btnRestRoi->SetLabel( _T("Reset VOI") );
+
+       _imageviewer2D_1->Refresh();
+
+}
+
+
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::LoadData( marImageData *marimagedata )
+{
+       vtkImageData *imagedata = marimagedata->GetImageData();
+       imagedata->UpdateInformation();
+       imagedata->SetUpdateExtent(imagedata->GetWholeExtent());
+       imagedata->Update();
+
+       _vtkbasedata_1 = new vtkBaseData();
+       _vtkbasedata_1->SetMarImageData( marimagedata );
+       _imageviewer2D_1->SetVtkBaseData( _vtkbasedata_1 );
+       _imageviewer2D_1->Configure(true);
+
+//     vtkImageViewer2 *_imageViewer=_imageviewer2D_1->_imageViewer2XYZ->GetVtkImageViewer2();
+
+       _manRoiControl  = new manualRoiControler();
+
+//JSTG 25-02-08 -------------------------------------
+       //_mContourModel  = new manualContourModel();
+       _mContourModel  = new manualContourModelRoi();
+//---------------------------------------------------
+       _mViewRoi               = new manualViewRoi();
+       _mViewRoi->SetModel( _mContourModel );
+       _mViewRoi->SetWxVtkBaseView( _imageviewer2D_1 );
+       _mViewRoi->SetRange( (int)1.5 );
+
+
+// EED 3 oct 2006
+       double spc[3];
+       imagedata->GetSpacing(spc);
+       _mViewRoi->SetSpacing(spc);
+
+       _manRoiControl->SetModelView( _mContourModel , _mViewRoi );
+       _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manRoiControl );
+       _manRoiControl->CreateNewManualContour();
+       _manRoiControl->SetState(0);
+       _manRoiControl->SetActive(false);
+       _mViewRoi->RefreshContour();
+
+       _imageviewer2D_1->GetWxVTKRenderWindowInteractor()->Render();
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::SetROI( int voi[6] )
+{      
+       _loadRangeImage->Reset();
+       _loadRangeImage->SetStartEnd( voi[4],voi[5]);
+       _manRoiControl->SetRoi( voi[0],voi[2], voi[1],voi[3] );
+       _manRoiControl->SetActive(true);
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::GetROI( int ext[6] )
+{      
+       double minX,minY,maxX,maxY;
+       _mViewRoi->GetMinMax(minX,minY,maxX,maxY);
+       ext[0]=(int)minX;
+       ext[1]=(int)maxX;
+       ext[2]=(int)minY;
+       ext[3]=(int)maxY;
+
+
+
+// EED 27 sep 206
+//     double spacing[3];
+//     _vtkbasedata_1->GetImageData ()->GetSpacing( spacing );
+//     ext[0] /= spacing[0];
+//     ext[1] /= spacing[0];
+//     ext[2] /= spacing[1];
+//     ext[3] /= spacing[1];
+
+       _loadRangeImage->GetROI( ext ); // ext[4..5]
+
+       if ( (ext[0]==ext[1]) || (ext[2]==ext[3]) || (ext[4]==ext[5]) )
+       {
+               int border[6];
+               _vtkbasedata_1->GetImageData ()->GetExtent( border );
+               ext[0] = border[0];
+               ext[1] = border[1];
+               ext[2] = border[2];
+               ext[3] = border[3];
+               ext[4] = border[4];
+               ext[5] = border[5];
+       }
+
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::Start( ){
+       _loadRangeImage->Start();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::ForceToFinisReadActiveImages(){
+       _loadRangeImage->ForceToFinisReadActiveImages();
+}
+//----------------------------------------------------------------------------
+bool wxMaracasImageBrowser02::GetRoiSelected()
+{
+       double minX,minY,maxX,maxY;
+       _mViewRoi->GetMinMax(minX,minY,maxX,maxY);
+
+       bool result=true;
+       if ( (minX==maxX) || (minY==maxY) )
+       {
+               result=false;
+       }
+       return result;
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::Refresh()
+{
+       int z = (int)_vtkbasedata_1->GetZ( ); 
+       _loadRangeImage->SetActualSlice( z );
+       _loadRangeImage->RefreshSlice();
+       z = _loadRangeImage->GetActualSlice(  );
+       _vtkbasedata_1->SetZ( z );
+
+//     _imageviewer2D_1->Refresh();
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::OnRefreshView(wxCommandEvent & event)
+{
+       Refresh();
+}
+//----------------------------------------------------------------------------
+void wxMaracasImageBrowser02::OnRefreshView2(wxCommandEvent & event)
+{
+       _loadRangeImage -> ResetActualSlice();//SIL//
+       int z = _loadRangeImage->GetActualSlice();      
+       _vtkbasedata_1->SetZ( z );
+       _imageviewer2D_1->Refresh();
+}
+
+
+
+// EED 04Janvier2007
+//------------------------------------------------------------------------
+void wxMaracasImageBrowser02::OnBtSaveVOIData(wxCommandEvent& event)
+{
+       wxFileDialog dialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.maracas"), wxSAVE );
+       if (dialog.ShowModal() == wxID_OK)
+       {
+               ForceToFinisReadActiveImages();
+               std::string directory           = (const char *)(dialog.GetDirectory().mb_str());
+               std::string filename            = (const char *)(dialog.GetFilename().mb_str());
+               float rescalaSlope          =  _parameters->getRescaleSlope();
+               float rescalaIntercept      =  _parameters->getRescaleIntercept();
+               vtkImageData *vtkimagedata      = this->_vtkbasedata_1->GetMarImageData()->GetImageData();
+               int voi[6];
+               this->GetROI(voi);
+               marRAW2Files marraw2;
+               marraw2.saveVolume(directory,filename,vtkimagedata,voi,rescalaSlope,rescalaIntercept);
+       }
+}
+
+
+// EOF - wxImageBrowser.cxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser02.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasImageBrowser02.h
new file mode 100644 (file)
index 0000000..09a650a
--- /dev/null
@@ -0,0 +1,96 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasImageBrowser02.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__IMAGE__BROWSER02__
+#define __WX__IMAGE__BROWSER02__
+
+#include "wx/wxprec.h"
+#ifdef __BORLANDC__
+#  pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+
+
+#include <wx/window.h>
+#include <wx/imaglist.h>
+#include <wx/panel.h>
+#include <wx/listctrl.h>
+#include <wx/splitter.h>
+
+#include "marParameters.h" 
+#include "widgets/wxVtkBaseView.h" 
+//#include "widgets/wxImageViewerWidget.h"
+#include "widgets/wxReadingPriorityPanel.h"
+
+#include "manualContour.h"
+
+
+BEGIN_DECLARE_EVENT_TYPES()
+ DECLARE_EVENT_TYPE(wxEVT_MARACASIMAGEBROWSERCUTIMAGE, -1)
+END_DECLARE_EVENT_TYPES()
+
+
+/**
+ * \brief Panel class that show thumbnails images
+ */
+class wxMaracasImageBrowser02 : public wxPanel
+{
+public:
+    wxMaracasImageBrowser02( wxWindow* parent, marFilesBase *dicom ,marParameters* parameters );
+    //wxMaracasImageBrowser02( wxWindow* parent, marInterface* mar, wxWindowID id = -1 );
+    ~wxMaracasImageBrowser02();
+
+    void LoadData( marImageData *marimagedata);
+    void GetROI( int ext[6] );
+    void SetROI( int voi[6] );
+       bool GetRoiSelected();
+       
+
+       void Start();
+       void ForceToFinisReadActiveImages();
+
+       void Refresh();
+       void OnRefreshView(wxCommandEvent & event);
+       void OnRefreshView2(wxCommandEvent & event);
+       void OnBtnResetRoi( wxCommandEvent &  event );
+       void OnBtSaveVOIData(wxCommandEvent& event);
+       void OnBtnCutVolume( wxCommandEvent &  event );
+
+private:
+
+       wxButton                        *_btnRestRoi;
+
+       marParameters                   *_parameters;
+       LoadRangeImage                  *_loadRangeImage;
+
+       vtkBaseData                             *_vtkbasedata_1;
+       wxVtk2DBaseView                 *_imageviewer2D_1;
+
+       manualRoiControler              *_manRoiControl;
+       manualContourModel              *_mContourModel;
+
+       manualViewRoi                   *_mViewRoi;
+
+
+
+       DECLARE_EVENT_TABLE( );
+};
+
+#endif // __WX__IMAGE__BROWSER02__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasMPR.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasMPR.cxx
new file mode 100644 (file)
index 0000000..756395a
--- /dev/null
@@ -0,0 +1,71 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasMPR.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasMPR.h"
+
+
+wxMaracasMPR::wxMaracasMPR( wxWindow* parent,
+                            marImageData* marimagedata , double voxelSize)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+       _MPR=NULL;
+       wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+       _MPR = new wxMPRWidget( this, marimagedata , voxelSize);
+       szTop->Add( _MPR, 1  , wxGROW |  wxALL , 0 );
+       this->SetAutoLayout( true );
+       this->SetSizer( szTop );
+       szTop->Fit( this );
+//     szTop->SetSizeHints( this );
+}
+//----------------------------------------------------------------------------
+wxMaracasMPR::~wxMaracasMPR( )
+{
+       if (_MPR!=NULL) { delete _MPR; }
+}
+//----------------------------------------------------------------------------
+void wxMaracasMPR::ConfigureVTK( )
+{
+       if (_MPR!=NULL ) {_MPR->ConfigureVTK(); }
+}
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxMaracasMPR::GetVtkMPRBaseData()
+{
+       return _MPR->GetVtkMPRBaseData();
+}
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxMaracasMPR::GetVtkPlane2DView()
+{
+       return _MPR->GetVtkPlane2DView();
+}
+//----------------------------------------------------------------------------
+wxVtkMPR3DView  *wxMaracasMPR::GetWxvtkmpr3Dview_BB()
+{ 
+       return _MPR->GetWxvtkmpr3Dview_BB();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracasMPR::RefreshView()
+{ 
+       _MPR->RefreshView();
+}
+
+
+// EOF - wxMaracasMPR.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasMPR.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasMPR.h
new file mode 100644 (file)
index 0000000..1f888d6
--- /dev/null
@@ -0,0 +1,47 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasMPR.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__MPR__HXX__
+#define __WX__MARACAS__MPR__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "marTypes.h"
+#include "vtkImageData.h"
+#include "widgets/wxMPRWidget.h"
+
+
+class  MAR_INTERFACEWX_EXPORT  wxMaracasMPR : public wxPanel
+{
+public:
+    wxMaracasMPR( wxWindow* parent, marImageData* marimagedata,double voxelSize);
+    ~wxMaracasMPR( );
+       void ConfigureVTK();
+       vtkMPRBaseData  *GetVtkMPRBaseData();
+       vtkPlane2DView  *GetVtkPlane2DView();
+       wxVtkMPR3DView  *GetWxvtkmpr3Dview_BB();
+       void                    RefreshView();
+
+private:
+        wxMPRWidget* _MPR;
+};
+
+#endif // __WX__MARACAS__MPR__HXX__
+
+// EOF - wxMaracasMPR.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasParametersDialog.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasParametersDialog.cxx
new file mode 100644 (file)
index 0000000..51f194f
--- /dev/null
@@ -0,0 +1,578 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: wxMaracasParametersDialog.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:10 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "wxMaracasParametersDialog.h"
+#include "marDictionary.h"
+
+// ----------------------------------------------------------------------------
+BEGIN_EVENT_TABLE( wxMaracasParametersDialog, wxDialog )
+       EVT_BUTTON( wxID_OK, wxMaracasParametersDialog::OnOk )
+       EVT_BUTTON( wxID_CANCEL, wxMaracasParametersDialog::OnCancel )
+       EVT_BUTTON( ID_BTN_DEFAULT, wxMaracasParametersDialog::OnDefault )
+       EVT_BUTTON( ID_BTN_RESET, wxMaracasParametersDialog::OnReset )
+       EVT_BUTTON( ID_BTN_APPLY, wxMaracasParametersDialog::OnApply )
+       // PS ->        EVT_BUTTON( ID_BTN_BROWSE_WORK_DIR, wxMaracasParametersDialog::OnBrowseWorkDir )
+       // PS ->        EVT_BUTTON( ID_BTN_BROWSE_DICOM_DIR, wxMaracasParametersDialog::OnBrowseDICOMDir )
+       // PS ->        EVT_BUTTON( ID_BTN_3D_BACK_COLOR, wxMaracasParametersDialog::OnChoose3DColor )
+       // PS ->        EVT_BUTTON( ID_BTN_AXIS_COLOR, wxMaracasParametersDialog::OnChooseAxisColor )
+END_EVENT_TABLE( );
+
+// ----------------------------------------------------------------------------
+wxMaracasParametersDialog::wxMaracasParametersDialog( wxWindow* parent, marInterface* mar )
+: wxParametersDialog( parent, -1, _T(""))
+{
+       _parent=parent;
+    _mar = mar;
+    Reset( );
+
+       SetBakEdit();
+}
+
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::Reset( )
+{
+       // PS -> //    wxColour col, col2;
+    int qt, st;
+       
+    // General parameters
+       // PS -> //    edtWorkDir->SetValue( _mar->_parameters->getStringParam( marParameters::e_installation_directory ) );
+       // PS ->     edtDICOMDir->SetValue( _mar->_parameters->getStringParam( marParameters::e_dicom_images_directory ) );
+       // PS ->     chkMIP->SetValue( _mar->_parameters->getBoolParam( marParameters::e_calculate_mip_default ) );
+       // PS ->     chkSlices->SetValue( _mar->_parameters->getBoolParam( marParameters::e_choose_all_slices_default ) );
+       // PS ->     chkDebugWindow->SetValue( _mar->_parameters->getBoolParam( marParameters::e_debug_window_visible ) );
+       // PS ->     chkConsole->SetValue( _mar->_parameters->getBoolParam( marParameters::e_debug_console_visible ) );
+       // PS -> //    col.Set(
+       // PS -> //        _mar->_parameters->getDoubleParam( marParameters::e_back_color_3D_r ),
+       // PS -> //        _mar->_parameters->getDoubleParam( marParameters::e_back_color_3D_g ),
+       // PS -> //        _mar->_parameters->getDoubleParam( marParameters::e_back_color_3D_b )
+       // PS -> //        );
+       // PS -> //    btn3DBackColor->SetBackgroundColour( col );
+    
+    // Contour parameters
+    edtThresholdIsoContours->SetValue( wxString::Format( _T("%.2f"), 
+               _mar->_parameters->getDoubleParam( marParameters::e_threshold_isocontour ) ) );
+       // PS -> //    edtThresholdSnake->SetValue( wxString::Format( "%.4f", 
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_threshold_snake_isocontour ) ) );
+       // PS -> //    edtIterationsSnake->SetValue( wxString::Format( "%d", 
+       // PS -> //             _mar->_parameters->getIntParam( marParameters::e_number_of_iterations_snake_isocontour ) ) );
+       // PS -> //    edtExternCoefSnake->SetValue( wxString::Format( "%.4f", 
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_extern_coeficient ) ) );
+       // PS -> //    edtIterationsDeriche->SetValue( wxString::Format( "%d", 
+       // PS -> //             _mar->_parameters->getIntParam( marParameters::e_number_of_iterations_snake_deriche ) ) );
+       // PS -> //    edtBallonCoefDeriche->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_ballon_coeficient ) ) );
+       // PS -> //    edtGradientCoefDeriche->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_gradient_coeficient ) ) );
+       // PS -> //    edtSigmaDeriche->SetValue( wxString::Format( "%.4f", 
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_sigma ) ) );
+       // PS -> //    edtScale->SetValue( wxString::Format( "%.4f", 
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_scale ) ) );
+       // PS -> //    edtSample->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_sampling ) ) );
+//EED    chkIsoContoursVis->SetValue( _mar->_parameters->getBoolParam( marParameters::e_debug_isocontour ) );
+//EED    chkDiametersVis->SetValue( _mar->_parameters->getBoolParam( marParameters::e_debug_diameters ) );
+//EED    chkInvertSliceOrder->SetValue( _mar->_parameters->getBoolParam( marParameters::e_invest_slice_order ) );
+       // PS -> //    chkFillContours->SetValue( _mar->_parameters->getBoolParam( marParameters::e_debug_fill_area ) );
+       // PS -> //    radIsoContours->SetValue( _mar->_parameters->getIntParam( marParameters::e_algorithm_type ) == marParameters::ISOCONTOURS );
+       // PS -> //    radSnake->SetValue( _mar->_parameters->getIntParam( marParameters::e_algorithm_type ) == marParameters::SNAKE );
+       // PS -> //    radDeriche->SetValue( _mar->_parameters->getIntParam( marParameters::e_algorithm_type ) == marParameters::DERICHE );
+       
+       
+    // Axis parameters
+       // PS -> //    edtDistanceCdg->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_gravity_distance ) ) );
+    edtFlexionCoef->SetValue( wxString::Format( _T("%g"), 
+               _mar->_parameters->getDoubleParam( marParameters::e_flexion_coeficient ) ) );
+   edtTensionCoef->SetValue( wxString::Format( _T("%g"), 
+               _mar->_parameters->getDoubleParam( marParameters::e_tension_coeficient ) ) );
+    int sizemask = _mar->_parameters->getIntParam( marParameters::e_mask_size );
+       sizemask=(sizemask-1)/2;
+    edtMaskSize->SetValue( wxString::Format( _T("%d"), sizemask ) );
+    edtDiscreetStep->SetValue( wxString::Format( _T("%#.2f"), 
+               _mar->_parameters->getDoubleParam( marParameters::e_axis_discret_step ) ) );
+       // PS -> //    edtVoxelX->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_voxel_x_dimension ) ) );
+       // PS -> //    edtVoxelY->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_voxel_y_dimension ) ) );
+       // PS -> //    edtVoxelZ->SetValue( wxString::Format( "%.4f",
+       // PS -> //             _mar->_parameters->getDoubleParam( marParameters::e_voxel_z_dimension ) ) );
+       // PS ->     edtDistanceInt->SetValue( wxString::Format( "%.4f",
+       // PS ->                _mar->_parameters->getDoubleParam( marParameters::e_distance_to_maximum_intensity ) ) );
+       // PS ->     edtCellMaxIntCoef->SetValue( wxString::Format( "%d",
+       // PS ->                _mar->_parameters->getIntParam( marParameters::e_coef_cell_max_int ) ) );
+       // PS ->     edtCellCoef->SetValue( wxString::Format( "%.4f",
+       // PS ->                _mar->_parameters->getDoubleParam( marParameters::e_cell_coeficient ) ) );
+       // PS ->     edtStepCoef->SetValue( wxString::Format( "%d",
+       // PS ->                _mar->_parameters->getIntParam( marParameters::e_step_coeficient ) ) );
+       // PS ->     edtMassPower->SetValue( wxString::Format( "%d", 
+       // PS ->                _mar->_parameters->getIntParam( marParameters::e_mass_power ) ) );
+       // PS ->     edtROIDimension->SetValue( wxString::Format( "%d", 
+       // PS ->                _mar->_parameters->getIntParam( marParameters::e_roi_dimension ) ) );
+       // PS ->     edtStep->SetValue( wxString::Format( "%d", 
+       // PS ->                _mar->_parameters->getIntParam( marParameters::e_step ) ) );
+       // PS -> //    chkShowCell->SetValue( _mar->_parameters->getBoolParam( marParameters::e_show_cell ) );
+       // PS -> //    chkShowIntCell->SetValue( _mar->_parameters->getBoolParam( marParameters::e_show_int_cell ) );
+       // PS -> //    radMinimum->SetValue( _mar->_parameters->getIntParam( marParameters::e_voxel_type ) == marParameters::VOX_TYPE_MINIMUM );
+       // PS -> //    radNormal->SetValue( _mar->_parameters->getIntParam( marParameters::e_voxel_type ) == marParameters::VOX_TYPE_NORMAL );
+       // PS -> //    col2.Set(
+       // PS -> //        _mar->_parameters->getDoubleParam( marParameters::e_axis_color_r ),
+       // PS -> //        _mar->_parameters->getDoubleParam( marParameters::e_axis_color_g ),
+       // PS -> //        _mar->_parameters->getDoubleParam( marParameters::e_axis_color_b )
+       // PS -> //        );
+       // PS -> //    btnAxisColor->SetBackgroundColour( col2 );
+       
+       
+    // Quantification parameters
+    qt = _mar->_parameters->getIntParam( marParameters::e_quantification_type );
+    st = _mar->_parameters->getIntParam( marParameters::e_stenosis_type );
+
+/* // EED borrame
+    chkArea->SetValue( ( qt & marParameters::TYPE_AREA ) == marParameters::TYPE_AREA );
+    chkPerimeter->SetValue( ( qt & marParameters::TYPE_PERIMETER ) == marParameters::TYPE_PERIMETER );
+    chkDiameterFromArea->SetValue( ( qt & marParameters::TYPE_DIAMETER_FROM_AREA ) == marParameters::TYPE_DIAMETER_FROM_AREA );
+    chkDiameterFromPerimeter->SetValue( ( qt & marParameters::TYPE_DIAMETER_FROM_PERIMETER ) == marParameters::TYPE_DIAMETER_FROM_PERIMETER );
+    chkMinimumDiameter->SetValue( ( qt & marParameters::TYPE_MINIMUM_DIAMETER ) == marParameters::TYPE_MINIMUM_DIAMETER );
+    chkMaximumDiameter->SetValue( ( qt & marParameters::TYPE_MAXIMUM_DIAMETER ) == marParameters::TYPE_MAXIMUM_DIAMETER );
+    chkAverageDiameter->SetValue( ( qt & marParameters::TYPE_AVERAGE_DIAMETER ) == marParameters::TYPE_AVERAGE_DIAMETER );
+    radArea->SetValue( st == marParameters::TYPE_AREA );
+    radPerimeter->SetValue( st == marParameters::TYPE_PERIMETER );
+    radDiameterFromArea->SetValue( st == marParameters::TYPE_DIAMETER_FROM_AREA );
+    radDiameterFromPerimeter->SetValue( st == marParameters::TYPE_DIAMETER_FROM_PERIMETER );
+    radMinimumDiameter->SetValue( st == marParameters::TYPE_MINIMUM_DIAMETER );
+    radMaximumDiameter->SetValue( st == marParameters::TYPE_MAXIMUM_DIAMETER );
+    radAverageDiameter->SetValue( st == marParameters::TYPE_AVERAGE_DIAMETER );
+*/     
+}
+// ----------------------------------------------------------------------------
+bool wxMaracasParametersDialog::Apply( )
+{
+       marDictionary marDict;
+       char tmp[256];
+
+       bool alertRegenerateAll         = false;
+       bool alertRegenerateSignal      = false;
+       bool alertClearContours         = false;
+       bool alertRegenerateSplineAxe   = false;
+
+       wxMessageDialog *wxdiag;
+       wxString wxtext;
+
+       if ( _bak_edtMaskSize_String.CompareTo( edtMaskSize->GetValue().GetData() )!=0  ) {
+               alertRegenerateSignal=true;
+               strcpy(tmp , marDict.GetString(605) ); strcat(tmp,"\n");
+               wxtext=wxString(tmp, wxConvUTF8); //"The mask size was modified. \n"
+       }
+       if ( _bak_edtThresholdIsoContours_String.CompareTo( edtThresholdIsoContours->GetValue().GetData() )!=0  ) {
+               alertClearContours=true;
+               strcpy(tmp , marDict.GetString(610) ); strcat(tmp,"\n");
+               wxtext=wxString(tmp, wxConvUTF8); //"The threshold was modified. \n"
+       }
+       if ( _bak_edtFlexionCoef_String.CompareTo( edtFlexionCoef->GetValue().GetData() )!=0  ) {
+               alertRegenerateAll=true;
+               strcpy(tmp , marDict.GetString(615) ); strcat(tmp,"\n");
+               wxtext=wxtext+wxString(tmp, wxConvUTF8);//"The flexion coeficient was modified.\n"
+       }
+       if ( _bak_edtTensionCoef_String.CompareTo( edtTensionCoef->GetValue().GetData() )!=0  ) {
+               alertRegenerateAll=true;
+               strcpy(tmp , marDict.GetString(620) ); strcat(tmp,"\n");
+               wxtext=wxtext+wxString(tmp, wxConvUTF8);//"The tension coeficient was modified.\n"
+       }       
+       if ( _bak_edtDiscreetStep_String.CompareTo( edtDiscreetStep->GetValue().GetData() )!=0  ) {
+               alertRegenerateSplineAxe=true;
+               strcpy(tmp , marDict.GetString(625) ); strcat(tmp,"\n");
+               wxtext=wxtext+wxString(tmp, wxConvUTF8);//"The discret step of the axis was modified.\n"
+       }       
+
+       if ((alertRegenerateAll==true) ||(alertRegenerateSplineAxe==true) ) {           
+               strcpy(tmp,"\n"); strcat(tmp , marDict.GetString(630) ); strcat(tmp,"\n");
+               wxtext=wxtext+wxString(tmp, wxConvUTF8);//"\n The axe will be regenereted and the contours will be eresed. \n"
+       } else {
+               if ((alertRegenerateAll==true) ||(alertRegenerateSplineAxe==true) ) {   
+                       strcpy(tmp,"\n"); strcat(tmp , marDict.GetString(635) ); strcat(tmp,"\n");
+                       wxtext=wxtext+wxString(tmp, wxConvUTF8); //"\n All contours will be erase. \n"
+               }
+       }
+
+       if ( (alertRegenerateAll==true) || 
+                (alertClearContours==true) || 
+                (alertRegenerateSignal==true) || 
+                (alertRegenerateSplineAxe==true) ) {
+               strcpy(tmp,"\n"); strcat(tmp , marDict.GetString(640) ); 
+               wxdiag= new wxMessageDialog(this, wxtext + wxString(tmp, wxConvUTF8), wxString(marDict.GetString(645), wxConvUTF8), wxOK | wxCANCEL);//"\n Do you want to continue?"   "Alert" 
+               if ( wxdiag->ShowModal() != wxID_OK ) {
+                       return true; 
+               }
+               wxdiag->Destroy();
+       }
+
+
+       // PS -> //    wxColour col;
+    double td;
+       long tl;
+    int ti;
+       
+    // General parameters
+       
+       // PS -> //    _mar->_parameters->setStringParam( marParameters::e_installation_directory, edtWorkDir->GetValue( ) );
+       // PS ->     _mar->_parameters->setStringParam( marParameters::e_dicom_images_directory, edtDICOMDir->GetValue( ) );
+               
+       // PS ->     _mar->_parameters->setBoolParam( marParameters::e_calculate_mip_default, chkMIP->GetValue( ) );
+       // PS ->     _mar->_parameters->setBoolParam( marParameters::e_choose_all_slices_default, chkSlices->GetValue( ) );
+       // PS ->     _mar->_parameters->setBoolParam( marParameters::e_debug_window_visible, chkDebugWindow->GetValue( ) );
+       // PS ->     _mar->_parameters->setBoolParam( marParameters::e_debug_console_visible, chkConsole->GetValue( ) );
+       
+       // PS -> //     col = btn3DBackColor->GetBackgroundColour( );
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_back_color_3D_r, col.Red( ) );
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_back_color_3D_g, col.Green( ) );
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_back_color_3D_b, col.Blue( ) );
+       // PS ->        
+       // PS ->     // Axis parameters
+       // PS -> //     if (!edtDistanceCdg->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //     _mar->_parameters->setDoubleParam( marParameters::e_gravity_distance, td );
+       
+    if (!edtFlexionCoef->GetValue( ).ToDouble( &td ))
+               return false;
+    _mar->_parameters->setDoubleParam( marParameters::e_flexion_coeficient, td );
+       
+    if (!edtTensionCoef->GetValue( ).ToDouble( &td ))
+               return false;
+    _mar->_parameters->setDoubleParam( marParameters::e_tension_coeficient, td );
+       
+    if (!edtDiscreetStep->GetValue( ).ToDouble( &td ))
+               return false;
+    _mar->_parameters->setDoubleParam( marParameters::e_axis_discret_step, td );
+       
+       // PS -> //    if (!edtVoxelX->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_voxel_x_dimension, td );
+       // PS -> 
+       // PS -> //    if (!edtVoxelY->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_voxel_y_dimension, td );
+       // PS -> 
+       // PS -> //    if (!edtVoxelZ->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_voxel_z_dimension, td );
+       // PS -> 
+       // PS ->     if (!edtDistanceInt->GetValue( ).ToDouble( &td ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setDoubleParam( marParameters::e_distance_to_maximum_intensity, td );
+       // PS -> 
+       // PS ->     if (!edtCellCoef->GetValue( ).ToDouble( &td ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setDoubleParam( marParameters::e_cell_coeficient, td );
+       // PS -> 
+       if (!edtMaskSize->GetValue( ).ToLong( &tl ))
+         return false;
+       _mar->_parameters->setIntParam( marParameters::e_mask_size, ( int )tl * 2 +1);
+        
+       // PS ->     if (!edtCellMaxIntCoef->GetValue( ).ToLong( &tl ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setIntParam( marParameters::e_coef_cell_max_int, ( int )tl );
+       // PS -> 
+       // PS ->     if (!edtStepCoef->GetValue( ).ToLong( &tl ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setIntParam( marParameters::e_step_coeficient, ( int )tl );
+       // PS -> 
+       // PS ->     if (!edtMassPower->GetValue( ).ToLong( &tl ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setIntParam( marParameters::e_mass_power, ( int )tl );
+       // PS -> 
+       // PS ->     if (!edtROIDimension->GetValue( ).ToLong( &tl ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setIntParam( marParameters::e_roi_dimension, ( int )tl );
+       // PS -> 
+       // PS ->     if (!edtStep->GetValue( ).ToLong( &tl ))
+       // PS ->                return false;
+       // PS ->     _mar->_parameters->setIntParam( marParameters::e_step, ( int )tl );
+       // PS -> 
+       // PS -> //    _mar->_parameters->setBoolParam( marParameters::e_show_cell, chkShowCell->GetValue( ) );
+       // PS -> //    _mar->_parameters->setBoolParam( marParameters::e_show_int_cell, chkShowIntCell->GetValue( ) );
+       // PS -> 
+       // PS -> //    _mar->_parameters->setIntParam( marParameters::e_voxel_type, radNormal->GetValue( ) ? marParameters::VOX_TYPE_NORMAL: marParameters::VOX_TYPE_MINIMUM );
+       // PS ->     
+       // PS -> //     wxColour col2 = btnAxisColor->GetBackgroundColour( );
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_axis_color_r, col2.Red( ) );
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_axis_color_g, col2.Green( ) );
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_axis_color_b, col2.Blue( ) );
+       
+    // Contour parameters
+    if (!edtThresholdIsoContours->GetValue( ).ToDouble( &td ))
+               return false;
+    _mar->_parameters->setDoubleParam( marParameters::e_threshold_isocontour, td );
+       
+       // PS -> //    if (!edtThresholdSnake->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_threshold_snake_isocontour, td );
+       // PS -> 
+       // PS -> //    if (!edtExternCoefSnake->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_extern_coeficient, td );
+       // PS -> 
+       // PS -> //    if (!edtBallonCoefDeriche->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_ballon_coeficient, td );
+       // PS -> 
+       // PS -> //    if (!edtGradientCoefDeriche->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_gradient_coeficient, td );
+       // PS -> 
+       // PS -> //    if (!edtSigmaDeriche->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_sigma, td );
+       // PS -> 
+       // PS -> //    if (!edtScale->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_scale, td );
+       // PS -> 
+       // PS -> //   if (!edtSample->GetValue( ).ToDouble( &td ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setDoubleParam( marParameters::e_sampling, td );
+       // PS -> 
+       // PS -> //    if (!edtIterationsSnake->GetValue( ).ToLong( &tl ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setIntParam( marParameters::e_number_of_iterations_snake_isocontour, ( int )tl );
+       // PS -> 
+       // PS -> //    if (!edtIterationsDeriche->GetValue( ).ToLong( &tl ))
+       // PS -> //             return false;
+       // PS -> //    _mar->_parameters->setIntParam( marParameters::e_number_of_iterations_snake_deriche, ( int )tl );
+       
+//EED    _mar->_parameters->setBoolParam( marParameters::e_debug_isocontour, chkIsoContoursVis->GetValue( ) );
+//EED    _mar->_parameters->setBoolParam( marParameters::e_debug_diameters, chkDiametersVis->GetValue( ) );
+//EED    _mar->_parameters->setBoolParam( marParameters::e_invest_slice_order, chkInvertSliceOrder->GetValue( ) );
+       // PS -> //    _mar->_parameters->setBoolParam( marParameters::e_debug_fill_area, chkFillContours->GetValue( ) );
+       // PS -> //    ti = 0;
+       // PS -> //    ti = radIsoContours->GetValue( ) ? marParameters::ISOCONTOURS: ti;
+       // PS -> //    ti = radSnake->GetValue( ) ? marParameters::SNAKE: ti;
+       // PS -> //    ti = radDeriche->GetValue( ) ? marParameters::DERICHE: ti;
+    ti = marParameters::ISOCONTOURS;
+       _mar->_parameters->setIntParam( marParameters::e_algorithm_type, ti );
+       
+/* // EED borrame
+    // Quantification parameters
+    ti = 0;
+    ti |= chkArea->GetValue( ) ? marParameters::TYPE_AREA: 0;
+    ti |= chkPerimeter->GetValue( ) ? marParameters::TYPE_PERIMETER: 0;
+    ti |= chkDiameterFromArea->GetValue( ) ? marParameters::TYPE_DIAMETER_FROM_AREA: 0;
+    ti |= chkDiameterFromPerimeter->GetValue( ) ? marParameters::TYPE_DIAMETER_FROM_PERIMETER: 0;
+    ti |= chkMinimumDiameter->GetValue( ) ? marParameters::TYPE_MINIMUM_DIAMETER: 0;
+    ti |= chkMaximumDiameter->GetValue( ) ? marParameters::TYPE_MAXIMUM_DIAMETER: 0;
+    ti |= chkAverageDiameter->GetValue( ) ? marParameters::TYPE_AVERAGE_DIAMETER: 0;
+    _mar->_parameters->setIntParam( marParameters::e_quantification_type, ti );
+    ti = 0;
+    ti = radArea->GetValue( ) ? marParameters::TYPE_AREA: ti;
+    ti = radPerimeter->GetValue( ) ? marParameters::TYPE_PERIMETER: ti;
+    ti = radDiameterFromArea->GetValue( ) ? marParameters::TYPE_DIAMETER_FROM_AREA: ti;
+    ti = radDiameterFromPerimeter->GetValue( )? marParameters::TYPE_DIAMETER_FROM_PERIMETER: ti;
+    ti = radMinimumDiameter->GetValue( ) ? marParameters::TYPE_MINIMUM_DIAMETER: ti;
+    ti = radMaximumDiameter->GetValue( ) ? marParameters::TYPE_MAXIMUM_DIAMETER: ti;
+    ti = radAverageDiameter->GetValue( ) ? marParameters::TYPE_AVERAGE_DIAMETER: ti;
+    _mar->_parameters->setIntParam( marParameters::e_stenosis_type, ti );
+*/
+
+       SetBakEdit();
+
+       if (alertRegenerateAll==true){
+                wxCommandEvent ev19999(wxEVT_COMMAND_MENU_SELECTED,19999);
+               _parent->ProcessEvent( ev19999 );
+
+/* EED Borrame
+               // Clear Interface
+               if ( wxwinquan!=NULL            ) { wxwinquan->Clean3D(true);   }
+               if ( wxwin3DBrowser!=NULL   ) { wxwin3DBrowser->Clean3D();      }
+               // Model Regeneration
+               _mar->_experiment->RegenerateAxis();
+               // Refresh Interface
+               if ( wxwinquan!=NULL            ) { 
+                       wxwinquan->AddAxisActors();
+                       wxwinquan->RefreshAxis();                               
+               }
+               if ( wxwin3DBrowser!=NULL       ) { 
+                       wxwin3DBrowser->AddAxisActors();
+                       wxwin3DBrowser->RefreshAxis();
+               }
+*/
+       }
+
+       if (alertRegenerateSplineAxe==true){
+               wxCommandEvent ev19998(wxEVT_COMMAND_MENU_SELECTED,19998);
+               _parent->ProcessEvent( ev19998 );
+/* EED Borrame
+               // Clear Interface
+               if ( wxwinquan!=NULL            ) { wxwinquan->Clean3D(true);   }
+               if ( wxwin3DBrowser!=NULL   ) { wxwin3DBrowser->Clean3D();      }
+               // Model Regeneration
+               _mar->_experiment->RecalculateAxis();
+               // Refresh Interface
+               if ( wxwinquan!=NULL            ) { 
+                       wxwinquan->AddAxisActors();
+                       wxwinquan->RefreshAxis();                               
+               }
+               if ( wxwin3DBrowser!=NULL       ) { 
+                       wxwin3DBrowser->AddAxisActors();
+                       wxwin3DBrowser->RefreshAxis();
+               }
+*/
+       }
+
+
+       if (alertClearContours==true) {
+               wxCommandEvent ev19997(wxEVT_COMMAND_MENU_SELECTED,19997);
+               _parent->ProcessEvent( ev19997 );
+/* EED Borrame
+               // Update Interface
+               if ( wxwinquan!=NULL   ) { wxwinquan->Clean3D(false);           }
+               // Model Regeneration
+               _mar->_experiment->ClearContours();
+               // Refresh Interface
+               if ( wxwinquan!=NULL   ) { wxwinquan->RefreshAxis();    }
+*/
+       }
+
+       if (alertRegenerateSignal==true) {
+               wxCommandEvent ev19996(wxEVT_COMMAND_MENU_SELECTED,19996);
+               _parent->ProcessEvent( ev19996 );
+/* EED Borrame
+               // Update Interface
+               if ( wxwinquan!=NULL   ) { wxwinquan->Clean3D(false);           }
+               // Model Regeneration
+               _mar->_experiment->RegenerateSignal();
+               // Refresh Interface
+               if ( wxwinquan!=NULL   ) { wxwinquan->RefreshAxis();    }
+*/
+       }
+
+       
+
+
+    
+       if (!_mar->saveParameters( ))
+               return false;
+
+
+       return true;
+       
+}
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::SetBakEdit(){
+       _bak_edtThresholdIsoContours_String = edtThresholdIsoContours->GetValue(); 
+       _bak_edtFlexionCoef_String                      = edtFlexionCoef->GetValue(); 
+       _bak_edtTensionCoef_String                      = edtTensionCoef->GetValue(); 
+       _bak_edtMaskSize_String                         = edtMaskSize->GetValue(); 
+       _bak_edtDiscreetStep_String                     = edtDiscreetStep->GetValue(); 
+}
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::OnOk( wxCommandEvent& WXUNUSED( event ) )
+{
+    if (Apply( )) {
+               EndModal( wxID_OK );
+       } else {
+               wxMessageDialog(this,_T("Error : Bad Parameters"),_T("Error"),wxOK|wxICON_ERROR).ShowModal();
+       }
+}
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::OnCancel( wxCommandEvent& WXUNUSED( event ) )
+{
+    EndModal( wxID_CANCEL );
+}
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::OnReset( wxCommandEvent& WXUNUSED( event ) )
+{
+    Reset( );
+       
+}
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::OnDefault( wxCommandEvent& WXUNUSED( event ) )
+{
+       _mar->_parameters->reset();
+    Reset( );
+       
+}
+// ----------------------------------------------------------------------------
+void wxMaracasParametersDialog::OnApply( wxCommandEvent& WXUNUSED( event ) )
+{
+    if (!Apply( ))
+       {
+               wxMessageDialog(this,_T("Error : Bad Parameters"),_T("Error"),wxOK|wxICON_ERROR).ShowModal();
+       }
+       
+}
+// ----------------------------------------------------------------------------
+// PS -> void wxMaracasParametersDialog::OnBrowseWorkDir( wxCommandEvent& WXUNUSED( event ) )
+// PS -> {
+// PS -> //    wxString dirHome = edtWorkDir->GetValue( );
+// PS -> //    wxDirDialog dialog( this, "Choose a work directory...", ( !dirHome.IsEmpty( ) )? dirHome: wxGetHomeDir( ) );
+// PS ->       
+// PS -> //    if( dialog.ShowModal( ) == wxID_OK ) {
+// PS -> //        edtWorkDir->SetValue( dialog.GetPath( ) );
+// PS ->         //! \todo if dir has change ... should update marGdcm
+// PS -> //    }
+// PS ->       
+// PS -> }
+// ----------------------------------------------------------------------------
+// PS -> void wxMaracasParametersDialog::OnBrowseDICOMDir( wxCommandEvent& WXUNUSED( event ) )
+// PS -> {
+// PS ->     wxString dirHome = edtDICOMDir->GetValue( );
+// PS ->     wxDirDialog dialog( this, "Choose a DICOM directory...", ( !dirHome.IsEmpty( ) )? dirHome: wxGetHomeDir( ) );
+// PS ->       
+// PS ->     if( dialog.ShowModal( ) == wxID_OK ) 
+// PS ->         edtDICOMDir->SetValue( dialog.GetPath( ) );
+// PS -> }
+// ----------------------------------------------------------------------------
+// PS -> void wxMaracasParametersDialog::OnChoose3DColor( wxCommandEvent& WXUNUSED( event ) )
+// PS -> {
+// PS -> //    wxColourData data;
+// PS -> //    data.SetChooseFull( true );
+// PS -> //    for( int i = 0; i < 16; i++ )
+// PS -> //    {
+// PS -> //        wxColour colour( i * 16, i * 16, i * 16 );
+// PS -> //        data.SetCustomColour( i, colour );
+// PS -> //    } // rof
+// PS -> //    
+// PS -> //    wxColourDialog dialog ( this, &data );
+// PS -> //    dialog.SetTitle( "Choose a 3D background color" );
+// PS -> //    if( dialog.ShowModal( ) == wxID_OK )
+// PS -> //    {
+// PS -> //        wxColourData retData = dialog.GetColourData( );
+// PS -> //        wxColour col = retData.GetColour( );
+// PS -> //        btn3DBackColor->SetBackgroundColour( col );
+// PS -> //    } // fi
+// PS ->       
+// PS -> }
+// ----------------------------------------------------------------------------
+// PS -> void wxMaracasParametersDialog::OnChooseAxisColor( wxCommandEvent& WXUNUSED( event ) )
+// PS -> {
+// PS -> //    wxColourData data;
+// PS -> //    data.SetChooseFull( true );
+// PS -> //    for( int i = 0; i < 16; i++ )
+// PS -> //   {
+// PS -> //        wxColour colour( i * 16, i * 16, i * 16 );
+// PS -> //        data.SetCustomColour( i, colour );
+// PS -> //    } // rof
+// PS ->       
+// PS -> //    wxColourDialog dialog ( this, &data );
+// PS -> //    dialog.SetTitle( "Choose an axis color" );
+// PS -> //    if( dialog.ShowModal( ) == wxID_OK )
+// PS -> //    {
+// PS -> //            wxColourData retData = dialog.GetColourData( );
+// PS -> //            wxColour col = retData.GetColour( );
+// PS -> //            btnAxisColor->SetBackgroundColour( col );
+// PS -> //    } // fi
+// PS -> }
+
+// EOF - wxGeneralParametersDialog.cxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasParametersDialog.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasParametersDialog.h
new file mode 100644 (file)
index 0000000..57f9895
--- /dev/null
@@ -0,0 +1,69 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasParametersDialog.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__GENERAL__PARAMETERS__DIALOG__
+#define __WX__GENERAL__PARAMETERS__DIALOG__
+
+#include <wx/wx.h>
+#include <wx/dialog.h>
+#include <wx/colordlg.h>
+#include <wx/dirdlg.h>
+
+#include <kernel/marInterface.h>
+//XRC generated file:
+#include "widgets/wxParametersDialog.h"
+
+/**
+ *  \brief Dialog class to select parameters
+ */
+class wxMaracasParametersDialog : public wxParametersDialog
+{
+public:
+
+    wxMaracasParametersDialog( wxWindow* parent, marInterface* mar );
+
+    void Reset( );
+    bool Apply( );
+
+    void OnOk( wxCommandEvent& event );
+    void OnCancel( wxCommandEvent& event );
+       void OnDefault( wxCommandEvent& event );
+    void OnReset( wxCommandEvent& event );
+    void OnApply( wxCommandEvent& event );
+
+
+// PS ->     void OnBrowseWorkDir( wxCommandEvent& event );
+// PS ->     void OnBrowseDICOMDir( wxCommandEvent& event );
+
+// PS ->     void OnChoose3DColor( wxCommandEvent& event );
+// PS ->     void OnChooseAxisColor( wxCommandEvent& event );
+
+private:
+    DECLARE_EVENT_TABLE( );
+    marInterface*      _mar;
+       wxString                _bak_edtThresholdIsoContours_String;
+       wxString                _bak_edtFlexionCoef_String;
+       wxString                _bak_edtTensionCoef_String;
+       wxString                _bak_edtMaskSize_String;
+       wxString                _bak_edtDiscreetStep_String;
+       wxWindow*               _parent;
+
+       void SetBakEdit();
+
+};
+
+#endif // __WX__GENERAL__PARAMETERS__DIALOG__
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasPathology_01.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasPathology_01.cxx
new file mode 100644 (file)
index 0000000..e07946e
--- /dev/null
@@ -0,0 +1,53 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasPathology_01.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasPathology_01.h"
+
+
+wxMaracasPathology_01::wxMaracasPathology_01( wxWindow* parent,marInterface *mar)
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+  // Create the main frame window
+  _pathologywidget = new wxPathologyWidget_01( this,mar );
+
+
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( _pathologywidget, 1  , wxEXPAND |  wxALL , 0 );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracasPathology_01::~wxMaracasPathology_01( )
+{
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracasPathology_01::ConfigureVTK()
+{
+  _pathologywidget->ConfigureVTK();
+}
+//----------------------------------------------------------------------------
+void wxMaracasPathology_01::ConfigureVTK(vtkImageData *imagedata, int x, int y, int z, double param){
+       _pathologywidget->ConfigureVTK(imagedata,  x,  y,  z, param );
+}
+//----------------------------------------------------------------------------
+
+// EOF - wxMaracasPathology_01.cxx
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasPathology_01.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasPathology_01.h
new file mode 100644 (file)
index 0000000..fc347fc
--- /dev/null
@@ -0,0 +1,42 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasPathology_01.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:10 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__PATHOLOGY__01__HXX__
+#define __WX__MARACAS__PATHOLOGY__01__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+#include "widgets/wxPathologyWidget_01.h"
+
+
+
+class wxMaracasPathology_01 : public wxPanel
+{
+public:
+    wxMaracasPathology_01( wxWindow* parent,marInterface *mar);
+    ~wxMaracasPathology_01( );
+       void ConfigureVTK();
+       void ConfigureVTK(vtkImageData *imagedata, int x, int y, int z, double param);
+private:
+        wxPathologyWidget_01* _pathologywidget;
+};
+
+#endif // __WX__MARACAS__PATHOLOGY__01__HXX__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasProcessingCT.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasProcessingCT.cxx
new file mode 100644 (file)
index 0000000..35b6bf4
--- /dev/null
@@ -0,0 +1,66 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasProcessingCT.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasProcessingCT.h"
+
+
+wxMaracasProcessingCT::wxMaracasProcessingCT( wxWindow* parent, marInterfaceCT *mar )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+  // Create the main frame window
+  _processingCTWidget = new wxProcessingCTWidget( this, mar );
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( _processingCTWidget, 1  , wxALL|wxGROW , 0 );
+//  szTop->Fit( this );
+//  szTop->SetSizeHints( this );
+  this->SetSizer( szTop );
+  this->SetAutoLayout( true );
+  this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracasProcessingCT::~wxMaracasProcessingCT( )
+{
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracasProcessingCT::ConfigureVTK( marImageData *marimagedata, int x, int y, int z )
+{
+  _processingCTWidget->ConfigureVTK(marimagedata,  x,  y,  z );
+}
+//----------------------------------------------------------------------------
+void wxMaracasProcessingCT::SetThreshold(int min,int max)
+{
+       _processingCTWidget->SetThreshold(min,max);
+}
+//----------------------------------------------------------------------------
+void wxMaracasProcessingCT::GetThreshold(int *min,int *max)
+{
+       _processingCTWidget->GetThreshold(min,max);
+}
+//----------------------------------------------------------------------------
+void wxMaracasProcessingCT::Refresh()
+{
+       _processingCTWidget->Refresh();
+}
+//----------------------------------------------------------------------------
+
+
+// EOF - wxMaracasProcessingCT.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasProcessingCT.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasProcessingCT.h
new file mode 100644 (file)
index 0000000..cdc29ed
--- /dev/null
@@ -0,0 +1,47 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasProcessingCT.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__PROCESSING__CT__HXX__
+#define __WX__MARACAS__PROCESSING__CT__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "widgets/wxProcessingCTWidget.h"
+
+class wxMaracasProcessingCT : public wxPanel
+{
+public:
+    wxMaracasProcessingCT( wxWindow* parent, marInterfaceCT *mar);
+    ~wxMaracasProcessingCT( );
+       void ConfigureVTK(marImageData *marimagedata, int x, int y, int z);
+
+       void SetThreshold(int min       ,int max);
+       void GetThreshold(int *min      ,int *max);
+
+       void Refresh();
+
+private:
+        wxProcessingCTWidget* _processingCTWidget;
+};
+
+#endif // __WX__MARACAS__PROCESSING__CT__HXX__
+
+// EOF - wxMaracasProcessingCT.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantification.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantification.cxx
new file mode 100644 (file)
index 0000000..2bbc8c3
--- /dev/null
@@ -0,0 +1,92 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasQuantification.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasFrame.h"
+#include "wxMaracasQuantification.h"
+
+
+wxMaracasQuantification::wxMaracasQuantification( wxWindow* parent,
+                                                  marInterface* mar, wxWindowID id )
+                                                 : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+  _mar = mar;
+
+  // Create the main frame window
+  _3DQuantif = new wxQuantificationWidget( this, -1 );
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( _3DQuantif, 1  , wxEXPAND |  wxALL , 0 );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+}
+//----------------------------------------------------------------------------
+wxMaracasQuantification::~wxMaracasQuantification( )
+{
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantification::LoadData( ){
+  _3DQuantif->ShowMARACASData( _mar );
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantification::Do_Quant( ){
+  // _3DQuantif->Do_Quant( );
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantification::SetSlider_Isovalue_Opacity(int isovalue,int opacity){
+       _3DQuantif->SetSlider_Isovalue_Opacity(isovalue,opacity);
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantification::RegenerateAll(bool all){
+       if (_3DQuantif!=NULL){
+               _3DQuantif->Clean3D(true);
+               if (all==true){
+                       _mar->_experiment->RegenerateAxis();
+               } else {
+                       _mar->_experiment->RecalculateAxis();
+               }
+               _3DQuantif->AddAxisActors();    
+               _3DQuantif->ResetAxis();        
+               _3DQuantif->RefreshAxis();      
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantification::CleanContours(){
+       if (_3DQuantif!=NULL){
+               _3DQuantif->Clean3D(false);
+               _mar->_experiment->ClearContours();
+               _3DQuantif->ResetAxis();        
+               _3DQuantif->RefreshAxis();      
+       }
+}      
+//----------------------------------------------------------------------------
+void wxMaracasQuantification::RegenerateSignal(){
+       if (_3DQuantif!=NULL){
+               _3DQuantif->Clean3D(false);
+               _mar->_experiment->RegenerateSignal();
+               _3DQuantif->ResetAxis();        
+               _3DQuantif->RefreshAxis();      
+       }
+}
+//----------------------------------------------------------------------------
+
+// EOF - wxMaracasQuantification.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantification.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantification.h
new file mode 100644 (file)
index 0000000..b54c73f
--- /dev/null
@@ -0,0 +1,47 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasQuantification.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__QUANTIF__HXX__
+#define __WX__MARACAS__QUANTIF__HXX__
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+#include "widgets/wxQuantificationWidget.h"
+#include "kernel/marInterface.h"
+
+class wxMaracasQuantification : public wxPanel
+{
+public:
+    wxMaracasQuantification( wxWindow* parent, marInterface* mar, wxWindowID id = -1 );
+    ~wxMaracasQuantification( );
+    void LoadData( );
+    void Do_Quant( );
+       void RegenerateAll(bool all=true);
+       void CleanContours();
+       void RegenerateSignal();
+       void SetSlider_Isovalue_Opacity(int isovalue,int opacity);
+
+private:
+
+    marInterface                       *_mar;
+    wxQuantificationWidget     *_3DQuantif;
+
+};
+
+#endif // __WX__MARACAS__QUANTIF__HXX__
+
+// EOF - wxMaracasQuantification.hxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantificationCT.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantificationCT.cxx
new file mode 100644 (file)
index 0000000..5c944ef
--- /dev/null
@@ -0,0 +1,106 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasQuantificationCT.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracasFrame.h"
+#include "wxMaracasQuantificationCT.h"
+
+
+wxMaracasQuantificationCT::wxMaracasQuantificationCT( wxWindow* parent,
+                                                  marInterfaceCT* mar, wxWindowID id )
+: wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+  _mar = mar;
+
+  // Create the main frame window
+  _3DQuantif = new wxQuantificationWidgetCT( this, -1 );
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+
+
+  
+  szTop->Add( _3DQuantif, 1  , wxEXPAND |  wxALL , 0 );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+}
+//----------------------------------------------------------------------------
+wxMaracasQuantificationCT::~wxMaracasQuantificationCT( ){
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::LoadData( ){
+  _3DQuantif->ShowMARACASData( _mar );
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::Do_Quant( ){
+  // _3DQuantif->Do_Quant( );
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::SetSlider_Isovalue_Opacity(int isovalue,int opacity){
+       _3DQuantif->SetSlider_Isovalue_Opacity(isovalue,opacity);
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::RegenerateAll(bool all){
+       if (_3DQuantif!=NULL){
+               _3DQuantif->Clean3D(true);
+               if (all==true){
+                       _mar->RegenerateAxis();
+               } else {
+                       _mar->RecalculateAxis();
+               }
+               _3DQuantif->AddAxisActors();    
+               _3DQuantif->ResetAxis();        
+               _3DQuantif->RefreshAxis();      
+       }
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::CleanContours(){
+       if (_3DQuantif!=NULL){
+               _3DQuantif->Clean3D(false);
+               _mar->ClearContours();
+               _3DQuantif->ResetAxis();        
+               _3DQuantif->RefreshAxis();      
+       }
+}      
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::RegenerateSignal(){
+       if (_3DQuantif!=NULL){
+               _3DQuantif->Clean3D(false);
+               _mar->RegenerateSignal();
+               _3DQuantif->ResetAxis();        
+               _3DQuantif->RefreshAxis();      
+       }
+}
+//----------------------------------------------------------------------------
+int wxMaracasQuantificationCT::GetActualSlice()
+{
+       return this->_3DQuantif->GetActualSlice();
+}
+//----------------------------------------------------------------------------
+void wxMaracasQuantificationCT::SetActualSlice(int slice)
+{
+       this->_3DQuantif->SetActualSlice(slice);
+}
+//----------------------------------------------------------------------------
+
+
+// EOF - wxMaracasQuantification.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantificationCT.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracasQuantificationCT.h
new file mode 100644 (file)
index 0000000..eb368d7
--- /dev/null
@@ -0,0 +1,49 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracasQuantificationCT.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__QUANTIF__CT__HXX__
+#define __WX__MARACAS__QUANTIF__CT__HXX__
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+#include "widgets/wxQuantificationWidgetCT.h"
+#include "kernel/marInterface.h"
+
+class wxMaracasQuantificationCT : public wxPanel
+{
+public:
+    wxMaracasQuantificationCT( wxWindow* parent, marInterfaceCT* mar, wxWindowID id = -1 );
+    ~wxMaracasQuantificationCT( );
+    void LoadData( );
+    void Do_Quant( );
+       void RegenerateAll(bool all=true);
+       void CleanContours();
+       void RegenerateSignal();
+       void SetSlider_Isovalue_Opacity(int isovalue,int opacity);
+       int  GetActualSlice();
+       void SetActualSlice(int slice);
+
+private:
+
+    marInterfaceCT                             *_mar;
+    wxQuantificationWidgetCT   *_3DQuantif;
+
+};
+
+#endif // __WX__MARACAS__QUANTIF__CT__HXX__
+
+// EOF - wxMaracasQuantification.hxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualContour_Panel.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualContour_Panel.cxx
new file mode 100644 (file)
index 0000000..7cee607
--- /dev/null
@@ -0,0 +1,175 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualContour_Panel.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include <wx/splitter.h>
+#include "widgets/pPlotter/mBarRange.h"
+#include "wxMaracas_ManualContour_Panel.h"
+
+
+BEGIN_EVENT_TABLE( wxMaracas_ManualContour_Panel, wxPanel )
+       EVT_MENU( 12121, wxMaracas_ManualContour_Panel::OnRefreshView )
+END_EVENT_TABLE( );
+
+
+wxMaracas_ManualContour_Panel::wxMaracas_ManualContour_Panel( wxWindow* parent  )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+  // Create the main frame window
+
+  wxWindow *wxwindow = CreateViewerPanel(this);
+  wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+  szTop->Add( wxwindow, 1  , wxEXPAND |  wxALL , 0 );
+  szTop->Fit( this );
+  szTop->SetSizeHints( this );
+  this->SetAutoLayout( true );
+  this->SetSizer( szTop );
+  this->Layout();
+}
+//----------------------------------------------------------------------------
+wxMaracas_ManualContour_Panel::~wxMaracas_ManualContour_Panel( )
+{
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracas_ManualContour_Panel::ConfigureVTK( marImageData *marimagedata )
+{
+       vtkMPRBaseData  *vtkmprbasedata  = new vtkMPRBaseData();
+       vtkmprbasedata->SetMarImageData(marimagedata);
+       vtkmprbasedata->SetX(5);
+       vtkmprbasedata->SetY(5);
+       vtkmprbasedata->SetZ(5);
+//     _vtkplane2Dview->SetVtkBaseData( vtkmprbasedata );
+//     _vtkplane2Dview->Configure();
+}
+
+//----------------------------------------------------------------------------
+void wxMaracas_ManualContour_Panel::OnRefreshView( wxCommandEvent & event)
+{
+       _vtkplane2Dview->Refresh();
+       _vtkplane2Dview->RefreshView();
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracas_ManualContour_Panel::OnActualChange(wxCommandEvent& event)
+{
+//     wxMessageDialog(this, _T("EED: OnActualChange")).ShowModal();
+}
+
+
+//----------------------------------------------------------------------------
+wxWindow* wxMaracas_ManualContour_Panel::CreateViewerPanel(wxWindow* parent)
+{
+       wxPanel *panel =  new wxPanel(parent,-1);
+/*
+       // Panel Up Bar
+       wxPanel *panelUpBar = new wxPanel(panel,-1);
+
+               int Tmin=0,Tmax=34;
+               mBarRange *time_barrange = new mBarRange(panelUpBar,400,10);
+               time_barrange -> setVisibleLabels(true);
+               time_barrange -> setRepresentedValues (Tmin,Tmax);
+               time_barrange -> setDeviceBlitStart (0,0);
+               time_barrange -> SetActual((Tmin+Tmax)/2);
+               time_barrange -> setActiveStateTo(true);
+               time_barrange -> SetInRangeProperty(false);
+               Connect(time_barrange->GetId(),wxEVT_TSBAR_ACTUAL  , (wxObjectEventFunction) &wxMaracas_ManualContour_Panel::OnActualChange,NULL,this);
+
+       wxBoxSizer *sizerUpBar= new wxBoxSizer(wxHORIZONTAL);
+       wxPanel *tmpPanel = new wxPanel(panel,-1, wxDefaultPosition , wxSize(50,50) );
+       sizerUpBar->Add( tmpPanel);
+       sizerUpBar->Add( time_barrange  , 1, wxEXPAND, 10 );
+       sizerUpBar->SetSizeHints( panelUpBar );   // set size hints to honour minimum size
+       panelUpBar->SetSizer(sizerUpBar);
+       panelUpBar->SetAutoLayout(true);
+       panelUpBar->Layout(); 
+
+
+// Down
+       // Panel Down Bar
+       wxPanel *panelDownBar = new wxPanel(panel,-1);
+
+               //z bar
+               int Zmin = 0 , Zmax = 34;
+               mBarRange *z_barrange = new mBarRange(panelDownBar,50,400);
+               z_barrange -> SetBackgroundColour( wxColour(100,100,0) );
+               z_barrange -> SetOrientation(false);
+               z_barrange -> setVisibleLabels(true);
+               z_barrange -> setRepresentedValues (Zmin,Zmax);
+       //      z_barrange -> SetActual((min+max)/2);
+               z_barrange -> setDeviceBlitStart (0,0);
+               z_barrange -> setActiveStateTo(true);
+               z_barrange -> SetInRangeProperty(false);
+               Connect(z_barrange->GetId(),wxEVT_TSBAR_ACTUAL  , (wxObjectEventFunction) &wxMaracas_ManualContour_Panel::OnActualChange,NULL,this);
+
+
+       wxFlexGridSizer *sizerDownBar   = new wxFlexGridSizer(5);
+       sizerDownBar->AddGrowableCol(2);
+       sizerDownBar->AddGrowableRow(0);
+
+       //tmp slider
+       wxSlider *tmpSlider                             = new wxSlider(panelDownBar,-1,0,0,100,wxDefaultPosition,wxSize(50,50),wxSL_VERTICAL);
+       sizerDownBar->Add( tmpSlider    , 1     , wxEXPAND|wxALIGN_BOTTOM , 10 );
+
+       sizerDownBar->Add( z_barrange   , 1     , wxEXPAND| wxALIGN_BOTTOM, 10 );
+
+       sizerDownBar->Add( CreateSplitePanel(panelDownBar)      , 1 , wxGROW , 10 );
+       sizerDownBar->SetSizeHints( panelDownBar );   // set size hints to honour minimum size
+       panelDownBar->SetSizer(sizerDownBar);
+       panelDownBar->SetAutoLayout(true);
+       panelDownBar->Layout(); 
+
+       wxBoxSizer *sizer= new wxBoxSizer(wxVERTICAL);
+       sizer->Add( panelUpBar          , 0 , wxEXPAND , 10);
+       sizer->Add( panelDownBar        , 1 , wxEXPAND, 10 );
+
+       sizer->SetSizeHints( panel );   // set size hints to honour minimum size
+       panel->SetSizer(sizer);
+       panel->SetAutoLayout(true);
+       panel->Layout(); 
+*/
+       return panel;
+}
+
+//----------------------------------------------------------------------------
+wxWindow* wxMaracas_ManualContour_Panel::CreateSplitePanel(wxWindow *parent)
+{
+       // Spliter
+       wxSplitterWindow *splitter      = new wxSplitterWindow(parent,-1);
+
+       // Plane Widget
+       _vtkplane2Dview                         = new vtkPlane2DView( splitter );
+       _vtkplane2Dview->SetImgSize( 350 );
+       wxWindow *pA = _vtkplane2Dview->GetWxVTKRenderWindowInteractor ();
+
+       wxPanel *pB = new wxPanel(splitter,-1);
+       pA->SetBackgroundColour( wxColour(255,0,0) );
+       pB->SetBackgroundColour( wxColour(0,0,255) );
+       splitter->SplitVertically( pA , pB );
+       return splitter;
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+
+
+
+
+// EOF - wxMaracas_ManualContour_Panel.cxx
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualContour_Panel.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualContour_Panel.h
new file mode 100644 (file)
index 0000000..106a814
--- /dev/null
@@ -0,0 +1,64 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualContour_Panel.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__MANUALCONTOUR__PANEL__HXX__
+#define __WX__MARACAS__MANUALCONTOUR__PANEL__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+//#include "widgets/wxEmptyPanel_3_Widget.h"
+
+//#include "widgets/wxMPRBaseData.h"
+//#include "widgets/wxVtkBaseView.h"
+#include "widgets/wxMPRWidget.h"
+
+
+class wxMaracas_ManualContour_Panel : public wxPanel
+{
+public:
+    wxMaracas_ManualContour_Panel( wxWindow* parent );
+    ~wxMaracas_ManualContour_Panel( );
+       void ConfigureVTK(marImageData *marimagedata);
+
+       void OnActualChange(wxCommandEvent& event);
+       void OnRefreshView( wxCommandEvent & event);
+
+
+private:
+
+       vtkPlane2DView *_vtkplane2Dview;
+
+       wxWindow* CreateViewerPanel(wxWindow* parent);
+       wxWindow* CreateSplitePanel(wxWindow *parent);
+
+       DECLARE_EVENT_TABLE();
+};
+
+
+
+
+
+
+
+
+#endif // __WX__MARACAS__MANUALCONTOUR__PANEL__HXX__
+
+// EOF - wxMaracas_ManualContour_Panel.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualSegmentation_MPR.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualSegmentation_MPR.cxx
new file mode 100644 (file)
index 0000000..21d2f0d
--- /dev/null
@@ -0,0 +1,72 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualSegmentation_MPR.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracas_ManualSegmentation_MPR.h"
+#include <wx/splitter.h>
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+wxMaracas_ManualSegmentation_MPR::wxMaracas_ManualSegmentation_MPR( wxWindow* parent, marImageData* marimagedata,double voxelSize )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+  // Create the main frame window
+       _MPR = new wxManualSegmentation_MPRWidget( this, marimagedata , voxelSize);
+       wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+       szTop->Add( _MPR, 1  , wxEXPAND |  wxALL , 0 );
+       this->SetAutoLayout( true );
+       this->SetSizer( szTop );
+       szTop->Fit( this );
+       szTop->SetSizeHints( this );
+//EEDxx2.4
+//     FitInside();
+
+}
+//----------------------------------------------------------------------------
+wxMaracas_ManualSegmentation_MPR::~wxMaracas_ManualSegmentation_MPR( )
+{
+//EEDxx2.4 DELETE
+//     delete _MPR;
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracas_ManualSegmentation_MPR::ConfigureVTK( )
+{
+  _MPR->ConfigureVTK();
+}
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxMaracas_ManualSegmentation_MPR::GetVtkMPRBaseData()
+{
+       return _MPR->GetVtkMPRBaseData();
+}
+
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxMaracas_ManualSegmentation_MPR::GetVtkPlane2DView()
+{
+       return _MPR->GetVtkPlane2DView();
+}
+
+
+
+
+// EOF 
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualSegmentation_MPR.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualSegmentation_MPR.h
new file mode 100644 (file)
index 0000000..d50cca5
--- /dev/null
@@ -0,0 +1,48 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualSegmentation_MPR.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__MANUAL__SEGMENTATION__MPR__HXX__
+#define __WX__MARACAS__MANUAL__SEGMENTATION__MPR__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "widgets/wxManualSegmentation_MPRWidget.h"
+#include "kernel/marAxis.h"
+
+class wxMaracas_ManualSegmentation_MPR : public wxPanel
+{
+public:
+    wxMaracas_ManualSegmentation_MPR( wxWindow* parent, marImageData* marimagedata,double voxelSize);
+    ~wxMaracas_ManualSegmentation_MPR( );
+       void ConfigureVTK();
+       vtkMPRBaseData          *GetVtkMPRBaseData();
+       vtkPlane2DView          *GetVtkPlane2DView();
+
+private:
+        wxManualSegmentation_MPRWidget* _MPR;   
+};
+
+
+
+
+#endif // __WX__MARACAS__MANUAL__SEGMENTATION__MPR__HXX__
+
+// EOF - wxMaracasMPR.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPR.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPR.cxx
new file mode 100644 (file)
index 0000000..ff6c255
--- /dev/null
@@ -0,0 +1,78 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualTree_MPR.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracas_ManualTree_MPR.h"
+#include <wx/splitter.h>
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+wxMaracas_ManualTree_MPR::wxMaracas_ManualTree_MPR( wxWindow* parent, marImageData* marimagedata,double voxelSize )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+  // Create the main frame window
+       _MPR = new wxManualTree_MPRWidget( this, marimagedata , voxelSize);
+       wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+       szTop->Add( _MPR, 1  , wxEXPAND |  wxALL , 0 );
+       this->SetAutoLayout( true );
+       this->SetSizer( szTop );
+       szTop->Fit( this );
+       szTop->SetSizeHints( this );
+//EEDxx2.4
+//     FitInside();
+
+}
+//----------------------------------------------------------------------------
+wxMaracas_ManualTree_MPR::~wxMaracas_ManualTree_MPR( )
+{
+//EEDxx2.4 DELETE
+//     delete _MPR;
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracas_ManualTree_MPR::ConfigureVTK( )
+{
+  _MPR->ConfigureVTK();
+}
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxMaracas_ManualTree_MPR::GetVtkMPRBaseData()
+{
+       return _MPR->GetVtkMPRBaseData();
+}
+
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxMaracas_ManualTree_MPR::GetVtkPlane2DView()
+{
+       return _MPR->GetVtkPlane2DView();
+}
+
+//----------------------------------------------------------------------------
+manualContourModel *wxMaracas_ManualTree_MPR::GetManualContourModel()
+{
+       return _MPR->GetManualContourModel();
+}
+
+
+
+
+// EOF - wxMaracasMPR.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPR.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPR.h
new file mode 100644 (file)
index 0000000..1ae01f4
--- /dev/null
@@ -0,0 +1,49 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualTree_MPR.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__MANUAL__TREE__MPR__HXX__
+#define __WX__MARACAS__MANUAL__TREE__MPR__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "widgets/wxManualTree_MPRWidget.h"
+
+class wxMaracas_ManualTree_MPR : public wxPanel
+{
+public:
+    wxMaracas_ManualTree_MPR( wxWindow* parent, marImageData* marimagedata,double voxelSize);
+    ~wxMaracas_ManualTree_MPR( );
+       void ConfigureVTK();
+       vtkMPRBaseData          *GetVtkMPRBaseData();
+       vtkPlane2DView          *GetVtkPlane2DView();
+       manualContourModel      *GetManualContourModel();
+
+private:
+        wxManualTree_MPRWidget* _MPR;
+};
+
+
+
+
+
+#endif // __WX__MARACAS__MANUAL__TREE__MPR__HXX__
+
+// EOF - wxMaracasMPR.h
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPRDlg.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPRDlg.cxx
new file mode 100644 (file)
index 0000000..53ab434
--- /dev/null
@@ -0,0 +1,121 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualTree_MPRDlg.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "wxMaracas_ManualTree_MPRDlg.h"
+#include <wx/splitter.h>
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+wxMaracas_ManualTree_MPRDlg::wxMaracas_ManualTree_MPRDlg( wxWindow* parent, marImageData* marimagedata,double voxelSize)
+ : wxDialog( parent, -1,_T("Manual Axis"),wxDefaultPosition,wxDefaultSize,wxCAPTION|wxRESIZE_BORDER  | wxMAXIMIZE_BOX )
+{      
+//     SetSize(700,700);
+       Maximize(true);
+       _parent=parent;
+       wxSplitterWindow *splitPanel = new wxSplitterWindow(this ,-1);
+       _manualTreeMPR = new wxMaracas_ManualTree_MPR(splitPanel,marimagedata,voxelSize);
+       wxPanel *panel = new wxPanel (splitPanel, -1);
+
+       wxButton *btnAccept = new wxButton (panel, wxID_OK, _T("Accept"));
+       wxButton *btnCancel = new wxButton (panel, wxID_CANCEL, _T("Cancel"));
+
+       wxBoxSizer* sizerH1 = new wxBoxSizer( wxHORIZONTAL );
+       sizerH1->Add(btnAccept , 1, wxALL|wxEXPAND, 0);
+       sizerH1->Add(btnCancel , 1, wxALL|wxEXPAND, 0);
+       panel->SetAutoLayout(true);
+       panel->SetSizer(sizerH1);
+       Layout();
+//EEDxx2.4
+//     FitInside();
+
+
+       splitPanel->SplitHorizontally(_manualTreeMPR,panel );
+       splitPanel->SetMinimumPaneSize(50);
+
+       wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
+       sizer->Add(splitPanel , 1, wxALL|wxEXPAND, 0);
+       SetAutoLayout(true);
+       SetSizer(sizer);
+       Layout();
+//EEDxx2.4
+//     FitInside();
+}
+
+//----------------------------------------------------------------------------
+
+wxMaracas_ManualTree_MPRDlg::~wxMaracas_ManualTree_MPRDlg()
+{
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracas_ManualTree_MPRDlg::ConfigureVTK()
+{
+       wxBusyCursor wait;
+       _manualTreeMPR->ConfigureVTK();
+}
+
+//----------------------------------------------------------------------------
+
+void wxMaracas_ManualTree_MPRDlg::SetMarAxis( marAxis *maraxis  )
+{
+       _maraxis=maraxis;
+}
+
+//----------------------------------------------------------------------------
+bool wxMaracas_ManualTree_MPRDlg::ExportPoints()
+{
+       bool ok=false;
+       double t,x,y,z;
+       manualContourModel *manualcontourmodel = _manualTreeMPR->GetManualContourModel();
+
+       double spc[3];
+       _manualTreeMPR->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
+
+       int sizeLstPoints = manualcontourmodel->GetSizeLstPoints(); 
+
+       if ( sizeLstPoints>=2 ){ 
+               manualcontourmodel->UpdateSpline();
+               int i,max=200;
+//JSTG 25-02-08 ---------------------------------------------------
+               //double delta = ((double)sizeLstPoints-1) / (double)max;
+               for (i=0;i<max;i++)
+               {       
+                       //t=delta*(double)i;
+                       //manualcontourmodel->GetSplinePoint(t,x,y,z);
+                       manualcontourmodel->GetSpline_i_Point(i,&x,&y,&z);
+//-----------------------------------------------------------------
+                       x=x*spc[0];
+                       y=y*spc[1];
+                       z=z*spc[2];
+                       _maraxis->AddPointToList(x, y, z,100);          
+               }
+               ok=true;
+       }
+       return ok;
+}
+
+
+
+// EOF - wxMaracas_ManualTree_MPRDlg.cxx
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPRDlg.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_ManualTree_MPRDlg.h
new file mode 100644 (file)
index 0000000..4b077c1
--- /dev/null
@@ -0,0 +1,51 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_ManualTree_MPRDlg.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__MANUAL__TREE__MPRDLG__HXX__
+#define __WX__MARACAS__MANUAL__TREE__MPRDLG__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+
+#include "wxMaracas_ManualTree_MPR.h"
+#include "kernel/marAxis.h"
+
+
+class wxMaracas_ManualTree_MPRDlg : public wxDialog
+{
+public:
+    wxMaracas_ManualTree_MPRDlg(wxWindow* parent,marImageData *marimageData,double voxelSize);
+       ~wxMaracas_ManualTree_MPRDlg( );
+       void ConfigureVTK();
+       void SetMarAxis( marAxis *maraxis  );
+       bool ExportPoints();
+private:
+       wxWindow                                        *_parent;
+       wxMaracas_ManualTree_MPR        *_manualTreeMPR;
+       marAxis                                         *_maraxis;
+
+protected:
+};
+
+
+
+
+#endif // __WX__MARACAS__MANUAL__TREE__MPRDLG__HXX__
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_SegmentationFM3D.cxx b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_SegmentationFM3D.cxx
new file mode 100644 (file)
index 0000000..bb766c2
--- /dev/null
@@ -0,0 +1,73 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_SegmentationFM3D.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include <wx/splitter.h>
+#include "wxMaracas_SegmentationFM3D.h"
+
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+wxMaracas_SegmentationFM3D::wxMaracas_SegmentationFM3D( wxWindow* parent, marImageData* marimagedata,double voxelSize )
+: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+
+  // Create the main frame window
+       _MPR = new wxSegmentationFM3DWidget( this, marimagedata , voxelSize);
+       wxBoxSizer* szTop = new wxBoxSizer( wxVERTICAL );
+       szTop->Add( _MPR, 1  , wxEXPAND |  wxALL , 0 );
+       this->SetAutoLayout( true );
+       this->SetSizer( szTop );
+       szTop->Fit( this );
+       szTop->SetSizeHints( this );
+//EEDxx2.4
+//     FitInside();
+
+}
+//----------------------------------------------------------------------------
+wxMaracas_SegmentationFM3D::~wxMaracas_SegmentationFM3D( )
+{
+//EEDxx2.4 DELETE
+//     delete _MPR;
+  // Nothing
+}
+//----------------------------------------------------------------------------
+void wxMaracas_SegmentationFM3D::ConfigureVTK( )
+{
+  _MPR->ConfigureVTK();
+}
+//----------------------------------------------------------------------------
+vtkMPRBaseData  *wxMaracas_SegmentationFM3D::GetVtkMPRBaseData()
+{
+       return _MPR->GetVtkMPRBaseData();
+}
+
+//----------------------------------------------------------------------------
+vtkPlane2DView *wxMaracas_SegmentationFM3D::GetVtkPlane2DView()
+{
+       return _MPR->GetVtkPlane2DView();
+}
+
+
+
+
+// EOF 
+
+
+
+
diff --git a/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_SegmentationFM3D.h b/lib/maracasVisuLib/src/interface/wxWindows/wxMaracas_SegmentationFM3D.h
new file mode 100644 (file)
index 0000000..1a484be
--- /dev/null
@@ -0,0 +1,48 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: wxMaracas_SegmentationFM3D.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:11 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __WX__MARACAS__SEGMENTATION__FM3D__MPR__HXX__
+#define __WX__MARACAS__SEGMENTATION__FM3D__MPR__HXX__
+
+
+#include <wx/wx.h>
+#include <wx/panel.h>
+
+#include "vtkImageData.h"
+#include "kernel/marAxis.h"
+
+#include "widgets/wxSegmentationFM3DWidget.h"
+
+class wxMaracas_SegmentationFM3D : public wxPanel
+{
+public:
+    wxMaracas_SegmentationFM3D( wxWindow* parent, marImageData* marimagedata,double voxelSize);
+    ~wxMaracas_SegmentationFM3D( );
+       void ConfigureVTK();
+       vtkMPRBaseData          *GetVtkMPRBaseData();
+       vtkPlane2DView          *GetVtkPlane2DView();
+
+private:
+        wxSegmentationFM3DWidget* _MPR;         
+};
+
+
+
+
+#endif // __WX__MARACAS__SEGMENTATION__FM3D__MPR__HXX__
+
+// EOF - wxMaracasMPR.h
diff --git a/lib/maracasVisuLib/src/kernel/CMakeLists.txt b/lib/maracasVisuLib/src/kernel/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b03fbeb
--- /dev/null
@@ -0,0 +1,96 @@
+# This directory should only be build if wxWindows and VTK can be found
+
+SET(MaracasKernel_SRCS
+curve.cxx
+curve.hxx
+volume.cxx
+volume.hxx
+marVector.cpp
+marVector.h
+marMatrix.cpp
+marMatrix.h
+marMathConst.h
+marTypes.h
+marAxis.cpp
+marAxis.h
+marContour.cpp
+marContour.h
+marKVolume.cpp
+marKVolume.h
+marDynData.cpp
+marDynData.h
+marExperiment.cpp
+marExperiment.h
+marInterface.cpp
+marInterface.h
+marObject.cpp
+marObject.h
+marParameters.cpp
+marParameters.h
+marDicomBase.cpp
+marDicomBase.h
+axisExtractor.cxx
+axisExtractor.h
+axisExtractor02.cxx
+axisExtractor02.h
+carotidaBifurcacion.cxx
+carotidaBifurcacion.h
+marAxisCT.cpp
+marAxisCT.h
+marInterfaceCT.cpp
+marInterfaceCT.h
+marExperimentCT.cpp
+marExperimentCT.h
+marAxisContours.cpp
+marAxisContours.h
+marContourVO.cpp
+marContourVO.h
+marIsocontour.cpp
+marIsocontour.h
+marPoint.cpp
+marPoint.h
+marLine.cpp
+marLine.h
+vtkDijkstraImageData.cxx
+vtkDijkstraImageData.h
+vtkOtsuImageData.cxx
+vtkOtsuImageData.h
+vtkOtsuSphereSource.cxx
+vtkOtsuSphereSource.h
+itkFM3D.h
+itkFM3D.cxx
+itkVTKImageToImageFilter.h
+itkVTKImageToImageFilter.txx
+itkImageToVTKImageFilter.h
+itkImageToVTKImageFilter.txx 
+vtkJoiner.cxx
+vtkJoiner.h
+vtkSTLExtractor.cpp
+vtkSTLExtractor.h
+marUtils.h
+marUtils.cpp
+marImageData.cpp
+marImageData.h
+)
+
+ADD_LIBRARY(MaracasKernel ${MaracasKernel_SRCS})
+IF(CYGWIN)
+TARGET_LINK_LIBRARIES(MaracasKernel
+       MaracasAlgorithm
+       MaracasSnakeContour
+       ${GDCM_LIBRARIES}
+       ${WXWIDGETS_LIBRARIES}
+        ${MARACAS_ITK_LIBRARIES}
+)
+ELSE(CYGWIN)
+TARGET_LINK_LIBRARIES(MaracasKernel
+       MaracasAlgorithm
+       MaracasSnakeContour
+       ${GDCM_LIBRARIES}
+       ${WXWIDGETS_LIBRARIES}
+       vtkCommon vtkGraphics vtkImaging
+        ${MARACAS_ITK_LIBRARIES}
+)
+ENDIF(CYGWIN)
+#SET_TARGET_PROPERTIES(MaracasKernel PROPERTIES LINK_FLAGS "/nodefaultlib:msvcrt")  
+
diff --git a/lib/maracasVisuLib/src/kernel/README b/lib/maracasVisuLib/src/kernel/README
new file mode 100644 (file)
index 0000000..8983d13
--- /dev/null
@@ -0,0 +1,8 @@
+All *.cxx files comes from gslobj and kgfo,
+since we broke compatibilites with those project it was too hard to maintain.
+
+Therefore source has been merge into maracas directly. As of 08/10/2003, if was
+plan to remove depencies to these lib, and also GSL as it is not in the CREATIS
+dogma.
+
+mathieu
diff --git a/lib/maracasVisuLib/src/kernel/axisExtractor.cxx b/lib/maracasVisuLib/src/kernel/axisExtractor.cxx
new file mode 100644 (file)
index 0000000..58cf0e5
--- /dev/null
@@ -0,0 +1,1143 @@
+/*=========================================================================
+
+
+=========================================================================*/
+
+
+#include "vtkPolyData.h"
+#include "vtkObjectFactory.h"
+
+//#include "vtkimagethreshold.h"
+//#include "vtkImageCast.h"
+//#include "vtkImageSeedConnectivity.h"
+//#include "vtkImageData.h"
+//#include "vtkMarchingCubes.h"
+//#include "vtkDoubleArray.h"
+//#include "vtkPointData.h"
+//#include "vtkextractvoi.h"
+
+#include "vtkMath.h"
+
+
+#include "axisExtractor.h"
+
+#define min(a,b) (((a)<(b))?(a):(b)) 
+
+
+vtkStandardNewMacro(axisExtractor);
+
+
+axisExtractor::axisExtractor() {
+       
+       this->NumberOfRequiredInputs = 1;
+
+       this->humbral=0.45 ;
+       this->maxpropradio=100;
+       this->maxpropmasa=10;
+       this->minpropmasa=0;
+       
+       this->resample= vtkImageResample::New();
+       this->resample->SetDimensionality (3);
+       
+       this->extrac = vtkExtractVOI::New();
+       this->extrac->SetInput(this->resample->GetOutput());
+       this->extrac->SetSampleRate(1, 1, 1);
+       
+       this->thresh = vtkImageThreshold::New();
+       this->thresh->SetInput(this->extrac->GetOutput());
+       this->thresh->SetInValue(255);
+       this->thresh->SetOutValue(0);
+       this->thresh->ReleaseDataFlagOff();
+
+       this->cast = vtkImageCast::New();
+       this->cast->SetInput(this->thresh->GetOutput());
+       this->cast->SetOutputScalarTypeToUnsignedChar();
+
+       this->connect = vtkImageSeedConnectivity::New();
+       this->connect->SetInput(this->cast->GetOutput());
+       this->connect->SetInputConnectValue(255);
+       this->connect->SetOutputConnectedValue(255);
+       this->connect->SetOutputUnconnectedValue(0);
+
+       this->dataprov=vtkImageData::New();
+       this->dataprov->SetScalarTypeToChar();
+
+       this->datatotal=vtkImageData::New();
+       this->datatotal->SetScalarTypeToChar();
+
+       
+                       
+
+}
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+void axisExtractor::SetInput(vtkImageData *input)
+{
+       double minspac;
+       double espprin[3];
+       
+       
+       this->vtkProcessObject::SetNthInput(0, input);
+       this->resample->SetInput(input);
+       input->GetSpacing(espprin);
+       
+
+       minspac=min(espprin[0],min(espprin[1],espprin[2]));
+  
+
+       this->resample->SetAxisOutputSpacing( 0, minspac);
+       this->resample->SetAxisOutputSpacing( 1, minspac);
+       this->resample->SetAxisOutputSpacing( 2, minspac);
+       this->resample->Update();
+
+       
+}
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+
+void axisExtractor::Execute()
+{
+       this->points = vtkPoints::New();
+       this->lineas = vtkCellArray::New();
+       this->buenos=0;
+       this->iter=0;
+       this->flagg=0;
+
+       this->datatotal->Delete();
+       this->datatotal=vtkImageData::New();
+       this->datatotal->SetScalarTypeToUnsignedChar();
+
+       this->datatotal->SetExtent(this->resample->GetOutput()->GetExtent());
+       this->datatotal->SetSpacing(this->resample->GetOutput()->GetSpacing());
+
+       this->blanquear2();
+
+       
+       while( !m_Stack0.empty()){
+               this->avanzar();
+               this->iter++;
+       }
+
+
+       this->GetOutput()->SetPoints (this->points);
+       this->GetOutput()->SetLines(this->lineas);
+       this->GetOutput()->Modified();
+                       
+       // this->GetOutput()->GetPointData()->SetVectors(this->salidas);
+}
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+vtkImageData *axisExtractor::GetInput()
+{
+       if (this->NumberOfInputs < 1){
+               return NULL;
+    }
+  
+       return (vtkImageData *)(this->Inputs[0]);
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+vtkImageData *axisExtractor::GetVolumen()
+{
+
+       return this->datatotal;
+}
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::PrintSelf(ostream& os, vtkIndent indent)
+{
+       this->Superclass::PrintSelf(os,indent);
+}
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::SetMaxPropRadio(double value)
+{
+       this->maxpropradio=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor::GetMaxPropRadio()
+{
+       return this->maxpropradio;
+}
+
+
+  
+//----------------------------------------------------------------------------
+
+void axisExtractor::SetHumbral(double value)
+{
+       this->humbral=value;
+}
+
+  
+  
+  //----------------------------------------------------------------------------
+
+double axisExtractor::GetHumbral()
+{
+       return this->humbral;
+}
+
+
+//----------------------------------------------------------------------------
+
+void axisExtractor::SetMaxPropMasa(double value)
+{
+       this->maxpropmasa=value;
+}
+
+  
+  
+  //----------------------------------------------------------------------------
+
+double axisExtractor::GetMaxPropMasa()
+{
+       return this->maxpropmasa;
+}
+
+
+//----------------------------------------------------------------------------
+
+void axisExtractor::SetMinPropMasa(double value)
+{
+       this->minpropmasa=value;
+}
+
+  
+  
+  //----------------------------------------------------------------------------
+
+double axisExtractor::GetMinPropMasa()
+{
+       return this->minpropmasa;
+}
+
+
+
+
+
+
+
+       //----------------------------------------------------------------------------
+void axisExtractor::SetPoint(double puntoactualprov[3] )
+{
+
+       realtoreal(puntoactualprov,puntoactualprov);
+
+               
+       m_Stack0.push(puntoactualprov[0]);
+       m_Stack1.push(puntoactualprov[1]);
+       m_Stack2.push(puntoactualprov[2]);
+       m_Stack3.push(puntoactualprov[0]);
+       m_Stack4.push(puntoactualprov[1]);
+       m_Stack5.push(puntoactualprov[2]);
+       m_Stack.push(0);
+
+}
+
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::realtoreal(double a[3], double b[3] )
+{
+               
+       double espprin[3];
+       int extprin[6];                         
+       
+       this->resample->GetOutput()->GetSpacing(espprin);
+       this->resample->GetOutput()->GetExtent(extprin);
+
+       b[0]=a[0]+(espprin[0]*extprin[0]);
+       b[1]=a[1]+(espprin[1]*extprin[2]);
+       b[2]=a[2];
+
+       
+
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::realtoreal2(double a[3], double b[3] )
+{
+               
+       double espprin[3];
+       int extprin[6];                         
+       
+       this->resample->GetOutput()->GetSpacing(espprin);
+       this->resample->GetOutput()->GetExtent(extprin);
+
+       b[0]=a[0]-(espprin[0]*extprin[0]);
+       b[1]=a[1]-(espprin[1]*extprin[2]);
+       b[2]=a[2];
+
+       
+
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::realtoindex(double a[3], int b[3] )
+{
+       double c[3];
+
+       double minspac;
+
+       double espprin[3];
+       int extprin[6];                         
+       
+       this->resample->GetOutput()->GetSpacing(espprin);
+       this->resample->GetOutput()->GetExtent(extprin);
+
+       minspac=min(espprin[0],min(espprin[1],espprin[2]));
+               
+       c[0]=(a[0]/minspac);
+       c[1]=(a[1]/minspac);
+       c[2]=(a[2]/minspac);
+
+       b[0]=(int)(a[0]/minspac);
+       b[1]=(int)(a[1]/minspac);
+       b[2]=(int)(a[2]/minspac);
+
+       if(c[0]-b[0]>0.5){
+               b[0]+=1;
+       }
+       if(c[1]-b[1]>0.5){
+               b[1]+=1;
+       }
+       if(c[2]-b[2]>0.5){
+               b[2]+=1;
+       }
+       
+
+}      
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::indextoreal(int a[3], double b[3] )
+{      
+       double minspac;
+
+       double espprin[3];
+       int extprin[6];                         
+       
+       this->resample->GetOutput()->GetSpacing(espprin);
+       this->resample->GetOutput()->GetExtent(extprin);
+
+       minspac=min(espprin[0],min(espprin[1],espprin[2]));
+       
+       b[0]=(a[0])*minspac;
+       b[1]=(a[1])*minspac;
+       b[2]=a[2]*minspac;
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::indextoreal(double a[3], double b[3] )
+{      
+       double minspac;
+
+       double espprin[3];
+       int extprin[6];                         
+       
+       this->resample->GetOutput()->GetSpacing(espprin);
+       this->resample->GetOutput()->GetExtent(extprin);
+
+       minspac=min(espprin[0],min(espprin[1],espprin[2]));
+       
+       b[0]=(a[0])*minspac;
+       b[1]=(a[1])*minspac;
+       b[2]=a[2]*minspac;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::searc(int i, int j, int k)
+{
+
+       unsigned char *ptr;
+       unsigned char   ptri;
+       char *ptr2;
+       
+       int radio;
+
+       int i2, j2, k2;
+       int i3, j3, k3;
+               
+       ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i,j,k);
+       ptr2=(char *)   this->dataprov->GetScalarPointer(i,j,k);
+
+       ptri=*ptr;
+
+       int ext[6];
+       
+       this->connect->GetOutput()->GetExtent(ext);
+
+       radio=(ext[1]-ext[0])/2;
+
+       i2=i-ext[0]-radio;
+       j2=j-ext[2]-radio;
+       k2=k-ext[4]-radio;
+
+
+       if(ptri==255){
+               *ptr2=this->label;
+               this->vector[this->label-1][0]+=1;
+               this->vector[this->label-1][1]+=i;
+               this->vector[this->label-1][2]+=j;
+               this->vector[this->label-1][3]+=k;
+       }
+       else if(ptri==0){
+               *ptr2=-this->label2;
+               this->vectorb[this->label2-1][0]+=1;
+               this->vectorb[this->label2-1][1]+=i;
+               this->vectorb[this->label2-1][2]+=j;
+               this->vectorb[this->label2-1][3]+=k;
+       }
+
+
+       for(i3=-1;i3<=1;i3++){
+                       for(j3=-1;j3<=1;j3++){
+                               for(k3=-1;k3<=1;k3++){
+                                       if(i+i3>=ext[0] && i+i3<=ext[1] && j+j3>=ext[2] && j+j3<=ext[3] && k+k3>=ext[4] &&  k+k3<=ext[5] ){
+                                               ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               ptr2=(char *)   this->dataprov->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               if(ptri==255 && *ptr==255 && *ptr2==0 && (radio*radio)>=((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3)) && ((radio-1)*(radio-1))<=((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3))){
+                                                       this->searc(i+i3, j+j3, k+k3);
+                                               }
+                                               else if(ptri==0 && *ptr==0 && *ptr2==0 && (radio*radio)>=((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3)) && ((radio-1)*(radio-1))<=((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3))){
+                                                       this->searc(i+i3, j+j3, k+k3);
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+
+       
+
+       
+}
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::find_components( )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       
+       unsigned char *ptr;
+       char *ptr2;
+
+       this->connect->GetOutput()->GetExtent(ext);
+
+
+       radio=(ext[1]-ext[0])/2;
+
+       this->label=0;
+       this->label2=0;
+               
+
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i,j,k);
+                                       ptr2=(char *)   this->dataprov->GetScalarPointer(i,j,k);
+
+                                       if(*ptr==255 && *ptr2==0 && (radio*radio)>=(i2*i2)+(j2*j2)+(k2*k2) && ((radio-1)*(radio-1))<=(i2*i2)+(j2*j2)+(k2*k2)  ){
+                                               this->label=this->label+1;
+                                               this->vector[this->label-1][0]=0;
+                                               this->vector[this->label-1][1]=0;
+                                               this->vector[this->label-1][2]=0;
+                                               this->vector[this->label-1][3]=0;
+                                               this->searc(i, j, k);
+                                               
+                                       }
+                                       else if(*ptr==0 && *ptr2==0 && (radio*radio)>=(i2*i2)+(j2*j2)+(k2*k2) && ((radio-1)*(radio-1))<=(i2*i2)+(j2*j2)+(k2*k2)  ){
+                                               this->label2=this->label2+1;
+                                               this->vectorb[this->label2-1][0]=0;
+                                               this->vectorb[this->label2-1][1]=0;
+                                               this->vectorb[this->label2-1][2]=0;
+                                               this->vectorb[this->label2-1][3]=0;
+                                               this->searc(i, j, k);
+                                               
+                                       }
+                               }
+                       }
+               }
+
+
+
+       
+
+       
+       
+}
+
+
+
+
+//----------------------------------------------------------------------------
+unsigned short axisExtractor::maximo( )
+{
+       int ext[6];
+       int i, j, k;
+       unsigned short max=0;
+
+       this->extrac->GetOutput()->GetExtent(ext);
+
+       unsigned short *ptr;
+       
+
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(unsigned short *)this->extrac->GetOutput()->GetScalarPointer(i,j,k);
+                                       if(*ptr>max){
+                                               max=*ptr;
+                                               
+                                       }
+                               }
+                       }
+               }
+
+               return max;
+
+
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::blanquear()
+{
+       int ext[6];
+       int i, j, k;
+       
+       this->dataprov->GetExtent(ext);
+
+       char *ptr;
+
+
+
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(char *)    this->dataprov->GetScalarPointer(i,j,k);
+                                       *ptr=0;
+                               }
+                       }
+               }
+}
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::blanquear2()
+{
+       int ext[6];
+       int i, j, k;
+       
+       this->datatotal->GetExtent(ext);
+
+       unsigned char *ptr;
+
+
+
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(unsigned char *)   this->datatotal->GetScalarPointer(i,j,k);
+                                       *ptr=0;
+                               }
+                       }
+               }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::copiar(vtkImageData *data, vtkImageData *data2 )
+{
+       int ext[6];
+       int i, j, k;
+       
+       data->GetExtent(ext);
+
+       unsigned char *ptr, *ptr2;
+
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                       ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+                                       if(*ptr!=0 && *ptr2==0){
+                                               *ptr2=*ptr;
+                                       }
+                               }
+                       }
+               }
+
+       data2->Modified();
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor::distancia(double a[3], double b[3] )
+{
+       
+       
+       return sqrt(((a[0]-b[0])*(a[0]-b[0]))+((a[1]-b[1])*(a[1]-b[1]))+((a[2]-b[2])*(a[2]-b[2])));
+}
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor::envolumen(int a[3], vtkImageData *datae )
+{
+       
+       int res;
+
+
+       unsigned char *ptr;
+
+       
+       ptr=(unsigned char *)   datae->GetScalarPointer(a);
+
+       if(*ptr==0){
+               res=0;
+       }
+       else{
+               res=1;
+       }
+       
+       
+       return res;
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::corte(double punto1[3], double punto2[3], double punto3[3], double centro[3],  double radio )
+{
+       
+       double m1, m2, m3;
+       double b1, b2, b3;
+       double c0, c1, c2;
+       double* roots;
+       double root;
+       
+
+       m1=punto2[0]-punto1[0];
+       m2=punto2[1]-punto1[1];
+       m3=punto2[2]-punto1[2];
+
+       b1=punto1[0]-centro[0];
+       b2=punto1[1]-centro[1];
+       b3=punto1[2]-centro[2];
+
+       c0=m1*m1+m2*m2+m3*m3;
+       c1=2*m1*b1+2*m2*b2+2*m3*b3;
+       c2=b1*b1+b2*b2+b3*b3-radio*radio;
+
+       roots=vtkMath::SolveQuadratic  (c0, c1, c2);
+
+       if(roots[1]>=0 && roots[1]<=1){
+               root=roots[1];
+       }
+       else{
+               root=roots[2];
+       }
+
+       punto3[0]=punto1[0]+root*(punto2[0]-punto1[0]);
+       punto3[1]=punto1[1]+root*(punto2[1]-punto1[1]);
+       punto3[2]=punto1[2]+root*(punto2[2]-punto1[2]);
+               
+}
+
+
+
+
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::redondear(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+
+       double tmpsqrt;
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                       tmpsqrt =       (i2*i2)+(j2*j2)+(k2*k2);
+                                       if( radio<sqrt(tmpsqrt) ){
+                                               *ptr=0;
+                                               
+                                       }
+                               }
+                       }
+               }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor::avanzar()
+{
+
+
+
+       
+       double puntoactual[3];
+       double puntoanterior[3];
+       double puntoactualdis[3];
+       double puntoactualcorre[3];
+       int puntoactualarr[3];
+       double radioactual;
+       double dirant[3];
+       double vector2[50][3];
+       double vector2b[3];
+       unsigned long vectortemp[4];
+       double vector2temp[3];
+       double maxmasa;
+       int extint[6];
+       int extintreal[6];
+       int indesxdis[3];
+       int indexp;
+       double norvec;
+       double provvc[3];
+       double proprov;
+       double puntoactualcorre2[3]; 
+       int radiotrabajo=1;
+       int radiocorte=0;
+       int radiocorte2=0;
+       int radiocorte3=0;
+       int radiocorte4=0;
+       int radiocorte5=0;
+       int radiocorte6=0;
+       int radiocorte7=0;
+       int radiocorte8=0;
+       int radiocorte9=0;
+       int radiocorte10=0;
+       int radiocorte11=0;
+       int cantidadanterior=0;
+       int cantidadanteriorb=0;
+       int flag =0;
+       int flag2 =0;
+       int flag3 =0;
+       int flag4 =0;
+       int flag5 =0;
+       int flag6 =0;
+       int flag7 =0;
+       int i, j;
+
+                               
+               
+       if(!m_Stack0.empty()){
+       
+               indexp=m_Stack.top();
+
+               puntoactual[0]=m_Stack0.top();
+               puntoactual[1]=m_Stack1.top();
+               puntoactual[2]=m_Stack2.top();
+
+               puntoanterior[0]=m_Stack3.top();
+               puntoanterior[1]=m_Stack4.top();
+               puntoanterior[2]=m_Stack5.top();
+
+               m_Stack0.pop();
+               m_Stack1.pop();
+               m_Stack2.pop();
+               m_Stack3.pop();
+               m_Stack4.pop();
+               m_Stack5.pop();
+               m_Stack.pop();
+
+               dirant[0]=puntoanterior[0]-puntoactual[0];
+               dirant[1]=puntoanterior[1]-puntoactual[1];
+               dirant[2]=puntoanterior[2]-puntoactual[2];
+               
+               radioactual=distancia(puntoactual, puntoanterior);
+
+               realtoindex(puntoactual, puntoactualarr);
+               
+               for(this->label=1, this->label2=0;flag4==0  &&(this->label>0) && (this->label==1 && ( radiocorte==0 || radiotrabajo<=radiocorte4 ) ) ||  (this->label>1 && radiotrabajo<=radiocorte4) ;radiotrabajo++){
+                                       
+                       extint[0]=puntoactualarr[0]-radiotrabajo;
+                       extint[1]=puntoactualarr[0]+radiotrabajo;
+                       extint[2]=puntoactualarr[1]-radiotrabajo;
+                       extint[3]=puntoactualarr[1]+radiotrabajo;
+                       extint[4]=puntoactualarr[2]-radiotrabajo;
+                       extint[5]=puntoactualarr[2]+radiotrabajo;
+
+                       extrac->SetVOI(extint);
+                       extrac->UpdateWholeExtent();
+                       extrac->Update();
+                       extrac->GetOutput()->GetExtent(extintreal);
+
+                       if(extint[0]!=extintreal[0] || extint[1]!=extintreal[1] || extint[2]!=extintreal[2] || extint[3]!=extintreal[3] || extint[4]!=extintreal[4] || extint[5]!=extintreal[5]){
+                               flag4 =1;
+                               radiotrabajo++;
+                               break;
+                       }
+                       
+                       if(puntoactualarr[0]>=extintreal[0] && puntoactualarr[0]<=extintreal[1] && puntoactualarr[1]>=extintreal[2] && puntoactualarr[1]<=extintreal[3] && puntoactualarr[2]>=extintreal[4] && puntoactualarr[2]<=extintreal[5]  ){
+
+                               thresh->ThresholdByUpper(this->maximo()*this->humbral);
+                               thresh->UpdateWholeExtent();
+                               thresh->Update();
+
+                               redondear(thresh->GetOutput());
+
+                               cast->UpdateWholeExtent();
+                               cast->Update();
+
+                               connect->RemoveAllSeeds();
+                               connect->AddSeed(puntoactualarr[0],puntoactualarr[1],puntoactualarr[2]);
+                               connect->UpdateWholeExtent();
+                               connect->Update();
+
+                               this->dataprov->Delete();
+
+                               this->dataprov=vtkImageData::New();
+                               this->dataprov->SetScalarTypeToChar();
+
+                               this->dataprov->SetExtent(this->connect->GetOutput()->GetExtent());
+                               this->dataprov->SetSpacing(this->connect->GetOutput()->GetSpacing());
+                       
+                               this->blanquear();
+
+                               this->find_components();
+
+                               if(this->label2>0 && flag==0){
+                                       radiocorte=radiotrabajo;
+                                       vector2b[0]=((double)vectorb[0][1]/(double)vectorb[0][0])-(double)puntoactualarr[0];
+                                       vector2b[1]=((double)vectorb[0][2]/(double)vectorb[0][0])-(double)puntoactualarr[1];
+                                       vector2b[2]=((double)vectorb[0][3]/(double)vectorb[0][0])-(double)puntoactualarr[2];
+                                       flag =1;
+                               }
+                               if(this->label2>1 && flag5==0){
+                                       radiocorte5=radiotrabajo;
+                                       flag5 =1;
+                               }
+
+                               if( this->label>1 && flag2==0){
+                                       radiocorte2=radiotrabajo;
+                                       flag2 =1;
+                               }
+
+                               if(radiocorte5==0){
+                                       radiocorte6=radiocorte2;
+                               }
+                               else{
+                                       radiocorte6=min(radiocorte2, radiocorte5);
+                               }
+
+                               if((radiocorte6-radiocorte)>1 && flagg<=4){
+                                       flag4 =1;
+                                       radiotrabajo++;
+                                       flag7 =0;
+                                       break;
+                               }
+                               else{
+                                       flag7 =1;
+                               }
+                               
+                               if(this->label>2 && flag3==0){
+                                       radiocorte3=radiotrabajo;
+                                       flag3 =1;
+                               }
+                               if( this->label==2 && cantidadanterior!=this->label){
+                                       radiocorte7=radiotrabajo;
+
+                               }
+                               if( this->label==3 && cantidadanterior!=this->label){
+                                       radiocorte8=radiotrabajo;
+                               }
+                               if( cantidadanterior!=this->label || cantidadanteriorb!=this->label2){
+                                       if(radiocorte2==0){
+                                               radiocorte4=radiotrabajo+10*(radiotrabajo-radiocorte9);
+                                       }
+                                       else{
+                                               radiocorte4=radiotrabajo+(radiotrabajo-radiocorte9);
+                                       }
+                                       radiocorte9=radiotrabajo;
+                               }
+                               
+                               cantidadanterior=this->label;
+                               cantidadanteriorb=this->label2;
+                               
+                       }
+                       
+               }
+               radiotrabajo--;
+               radiocorte10=radiotrabajo;
+
+               if(flag7==1){
+                       if(this->label>=2 && radiocorte10!=radiocorte9+1){
+                               radiotrabajo=radiocorte9+1;
+                               
+                               extint[0]=puntoactualarr[0]-radiotrabajo;
+                               extint[1]=puntoactualarr[0]+radiotrabajo;
+                               extint[2]=puntoactualarr[1]-radiotrabajo;
+                               extint[3]=puntoactualarr[1]+radiotrabajo;
+                               extint[4]=puntoactualarr[2]-radiotrabajo;
+                               extint[5]=puntoactualarr[2]+radiotrabajo;
+
+                               extrac->SetVOI(extint);
+                               extrac->UpdateWholeExtent();
+                               extrac->Update();
+                               extrac->GetOutput()->GetExtent(extintreal);
+       
+                               thresh->ThresholdByUpper(this->maximo()*this->humbral);
+                               thresh->UpdateWholeExtent();
+                               thresh->Update();
+
+                               redondear(thresh->GetOutput());
+
+                               cast->UpdateWholeExtent();
+                               cast->Update();
+
+                               connect->RemoveAllSeeds();
+                               connect->AddSeed(puntoactualarr[0],puntoactualarr[1],puntoactualarr[2]);
+                               connect->UpdateWholeExtent();
+                               connect->Update();
+
+                               this->dataprov->Delete();
+
+                               this->dataprov=vtkImageData::New();
+                               this->dataprov->SetScalarTypeToChar();
+
+                               this->dataprov->SetExtent(this->connect->GetOutput()->GetExtent());
+                               this->dataprov->SetSpacing(this->connect->GetOutput()->GetSpacing());
+
+                       
+                               this->blanquear();
+
+                               this->find_components();
+                       }
+               }
+
+               if(flag7==1){
+                       flagg=0;
+                       if(this->label>1){
+                               //printf("no corrigio\n");
+                               
+                               realtoreal2(puntoactual, provvc);
+                               points->InsertPoint(buenos,provvc);
+                                                                               
+                               if(buenos>0){
+                                       lineas->InsertNextCell(2);
+                                       lineas->InsertCellPoint(indexp);
+                                       lineas->InsertCellPoint(buenos);
+                               }
+
+                               buenos++;
+                       }
+               }
+               else{
+                       flagg++;
+                       //printf("corrigio\n");
+                       
+                       provvc[0]=0;
+                       provvc[1]=0;
+                       provvc[2]=0;
+
+                       norvec=distancia(provvc, vector2b);
+
+                       proprov=(radiocorte6-radiocorte)/(2*norvec);
+                               
+                       puntoactualcorre[0]=(puntoactualarr[0]-(vector2b[0]*proprov));
+                       puntoactualcorre[1]=(puntoactualarr[1]-(vector2b[1]*proprov));
+                       puntoactualcorre[2]=(puntoactualarr[2]-(vector2b[2]*proprov));
+
+                       indextoreal(puntoactualcorre, puntoactualcorre2);
+                                               
+                       m_Stack0.push(puntoactualcorre2[0]);
+                       m_Stack1.push(puntoactualcorre2[1]);
+                       m_Stack2.push(puntoactualcorre2[2]);
+                       m_Stack3.push(puntoanterior[0]);
+                       m_Stack4.push(puntoanterior[1]);
+                       m_Stack5.push(puntoanterior[2]);
+                       m_Stack.push(indexp);
+
+                       
+               }
+
+               if(flag7==1){
+                               
+                       if(this->label>1){
+                               
+                               maxmasa=0;
+                               for(i=0;i<this->label;i++){
+                                       vector2[i][0]=((double)vector[i][1]/(double)vector[i][0])-(double)puntoactualarr[0];
+                                       vector2[i][1]=((double)vector[i][2]/(double)vector[i][0])-(double)puntoactualarr[1];
+                                       vector2[i][2]=((double)vector[i][3]/(double)vector[i][0])-(double)puntoactualarr[2];
+                                       if(maxmasa<vector[i][0]){
+                                               maxmasa=vector[i][0];
+                                       }       
+                               }
+
+                               for(i=0;i<this->label;i++){
+                                       for(j=i;j<this->label;j++){
+                                               if(vector[j][0]<vector[i][0]){
+                                                       vectortemp[0]=vector[i][0];
+                                                       vectortemp[1]=vector[i][1];
+                                                       vectortemp[2]=vector[i][2];
+                                                       vectortemp[3]=vector[i][3];
+                                                       vector2temp[0]=vector2[i][0];
+                                                       vector2temp[1]=vector2[i][1];
+                                                       vector2temp[2]=vector2[i][2];
+                                                       
+                                                       vector[i][0]=vector[j][0];
+                                                       vector[i][1]=vector[j][1];
+                                                       vector[i][2]=vector[j][2];
+                                                       vector[i][3]=vector[j][3];
+                                                       vector2[i][0]=vector2[j][0];
+                                                       vector2[i][1]=vector2[j][1];
+                                                       vector2[i][2]=vector2[j][2];
+                                               
+                                                       vector[j][0]=vectortemp[0];
+                                                       vector[j][1]=vectortemp[1];
+                                                       vector[j][2]=vectortemp[2];
+                                                       vector[j][3]=vectortemp[3];
+                                                       vector2[j][0]=vector2temp[0];
+                                                       vector2[j][1]=vector2temp[1];
+                                                       vector2[j][2]=vector2temp[2];
+                                               }
+                                       }
+                                       
+                               }
+
+                               
+                               for(i=0;i<this->label;i++){
+                                       if(maxmasa*this->minpropmasa<vector[i][0]){
+
+                                               indesxdis[0]=(int) (puntoactualarr[0]+vector2[i][0]);
+                                               indesxdis[1]=(int) (puntoactualarr[1]+vector2[i][1]);
+                                               indesxdis[2]=(int) (puntoactualarr[2]+vector2[i][2]);
+       
+                                               indextoreal(indesxdis, puntoactualdis);
+               
+                                               if(envolumen(indesxdis, datatotal)==0){
+                                                       m_Stack0.push(puntoactualdis[0]);
+                                                       m_Stack1.push(puntoactualdis[1]);
+                                                       m_Stack2.push(puntoactualdis[2]);
+                                                       m_Stack3.push(puntoactual[0]);
+                                                       m_Stack4.push(puntoactual[1]);
+                                                       m_Stack5.push(puntoactual[2]);
+                                                       m_Stack.push(buenos-1);
+                                               }
+                                       
+                                       }
+                                       
+                               }
+
+                               if(this->label>1 ){
+                                       copiar(this->connect->GetOutput(),  datatotal );
+                               }
+
+                       }
+               }
+               
+       }
+       
+
+}
diff --git a/lib/maracasVisuLib/src/kernel/axisExtractor.h b/lib/maracasVisuLib/src/kernel/axisExtractor.h
new file mode 100644 (file)
index 0000000..b06a57d
--- /dev/null
@@ -0,0 +1,166 @@
+/*=========================================================================
+
+  */
+
+#ifndef __axisExtractor_h
+#define __axisExtractor_h
+
+
+
+#include <list>
+#include <stack>
+#include <time.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/timeb.h>
+#include <string.h>
+
+
+
+#include <vtkPolyDataSource.h>
+#include <vtkImageThreshold.h>
+#include <vtkImageCast.h>
+#include <vtkImageSeedConnectivity.h>
+#include <vtkImageData.h>
+#include <vtkMarchingCubes.h>
+#include <vtkDoubleArray.h>
+#include <vtkPointData.h>
+#include <vtkExtractVOI.h>
+#include <vtkPoints.h>
+#include <vtkCellArray.h>
+#include <vtkImageResample.h>
+
+
+
+
+
+class  axisExtractor : public vtkPolyDataSource
+{
+public:
+       static axisExtractor *New();
+       void PrintSelf(ostream& os, vtkIndent indent);
+
+       virtual void SetInput(vtkImageData *input);
+       vtkImageData *GetInput();
+
+       void SetMaxPropRadio(double value);
+       double GetMaxPropRadio();
+
+       void SetHumbral(double value);
+       double GetHumbral();
+
+       void SetMaxPropMasa(double value);
+       double GetMaxPropMasa();
+
+       void SetMinPropMasa(double value);
+       double GetMinPropMasa();
+
+       void SetPoint(double puntoactualprov[3] );
+
+       vtkImageData *GetVolumen();
+
+  
+  
+protected:  
+       axisExtractor();
+       
+       ~axisExtractor() {};
+
+       void Execute();
+  
+
+private:
+       axisExtractor(const axisExtractor&);  // Not implemented.
+
+       void operator=(const axisExtractor&);  // Not implemented.
+  
+       void searc(int i, int j, int k );
+
+       void find_components( );
+
+       unsigned short maximo();
+
+       void blanquear();
+
+       void blanquear2();
+
+       
+       
+       void corte(double punto1[3], double punto2[3], double punto3[3], double centro[3],  double radio );
+
+       void avanzar();
+
+       
+       void redondear(vtkImageData *data );
+
+       
+       
+       void copiar(vtkImageData *data, vtkImageData *data2 );
+
+       double distancia(double a[3], double b[3] );    
+       
+       int envolumen(int a[3], vtkImageData *datae );
+
+       void realtoreal(double a[3], double b[3] );
+
+
+       void realtoreal2(double a[3], double b[3] );
+
+       void realtoindex(double a[3], int b[3] );
+
+
+
+       void indextoreal(int a[3], double b[3] );
+
+
+       void indextoreal(double a[3], double b[3] );
+
+       
+
+
+
+       vtkImageData *dataprov;
+       vtkImageData *datatotal;
+       
+       unsigned char label;
+       unsigned char label2;
+
+       unsigned long vector[50][4] ;
+       unsigned long vectorb[50][4] ;
+
+       vtkExtractVOI *extrac;
+       vtkImageThreshold *thresh;
+       vtkImageCast *cast;
+       vtkImageSeedConnectivity *connect;
+
+       vtkImageResample *resample;
+       
+       int iter;
+
+       vtkPoints *points;
+
+       vtkCellArray *lineas; 
+
+       double humbral;
+       double maxpropradio;
+       double maxpropmasa;
+       double minpropmasa; 
+
+       int buenos;
+
+       std::stack< double  >                                           m_Stack0;
+       std::stack< double  >                                           m_Stack1;
+       std::stack< double  >                                           m_Stack2;
+       std::stack< double  >                                           m_Stack3;
+       std::stack< double  >                                           m_Stack4;
+       std::stack< double  >                                           m_Stack5;
+       std::stack< int  >                                              m_Stack;
+
+       int flagg;
+       
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/kernel/axisExtractor02.cxx b/lib/maracasVisuLib/src/kernel/axisExtractor02.cxx
new file mode 100644 (file)
index 0000000..431d0b4
--- /dev/null
@@ -0,0 +1,4026 @@
+/*=========================================================================
+
+
+=========================================================================*/
+#include "axisExtractor02.h"
+#include "vtkPolyData.h"
+#include "vtkObjectFactory.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkExtractVOI.h"
+#include "vtkImageConstantPad.h"
+#include "vtkImageTranslateExtent.h"
+#include "vtkMath.h"
+#include "vtkTransformPolyDataFilter.h"
+#include "vtkTransform.h"
+#include <time.h>
+
+
+
+
+
+vtkStandardNewMacro(axisExtractor02);
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetParam(double value)
+{
+       this->param=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::GetParam()
+{
+       return this->param;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetParam2(double value)
+{
+       this->param2=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::GetParam2()
+{
+       return this->param2;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetParam3(double value)
+{
+       this->param3=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::GetParam3()
+{
+       return this->param3;
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetMaxant(int value)
+{
+       this->maxant=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::GetMaxant()
+{
+       return this->maxant;
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetMinant(int value)
+{
+       this->minant=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::GetMinant()
+{
+       return this->minant;
+}
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetPoint(double value[3])
+{
+
+
+       double spa[3];
+
+       this->GetInput()->GetSpacing (spa);
+
+       value[0]=value[0]+maxant*spa[0];
+       value[1]=value[1]+maxant*spa[1];
+       value[2]=value[2]+maxant*spa[2];
+
+       this->m_Stack0.push_front(value[0]);
+       this->m_Stack1.push_front(value[1]);
+       this->m_Stack2.push_front(value[2]);
+       this->m_Stack3.push_front(value[0]);
+       this->m_Stack4.push_front(value[1]);
+       this->m_Stack5.push_front(value[2]);
+       this->m_Stack6.push_front(value[0]);
+       this->m_Stack7.push_front(value[1]);
+       this->m_Stack8.push_front(value[2]);
+       this->m_Stack.push_front(0);
+       this->m_Stackr.push_front(0);
+       this->m_Stackra.push_front(0);
+       this->m_Stackrp.push_front(0);
+}
+
+
+
+//----------------------------------------------------------------------------
+vtkImageData *axisExtractor02::GetVolumen()
+{
+
+       vtkImageTranslateExtent *trans;
+
+       trans = vtkImageTranslateExtent::New();
+
+       trans->SetInput(this->data4);
+       
+       trans->SetTranslation (maxant, maxant, maxant);
+
+       trans->Update();
+
+       return trans->GetOutput();
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+vtkPolyData  *axisExtractor02::GetOutput ()
+{
+
+               
+
+       
+       vtkTransform *transL1;
+       vtkTransformPolyDataFilter *trans;
+
+       transL1 = vtkTransform::New();
+       trans = vtkTransformPolyDataFilter::New();
+
+// EED 30 Oct 2006
+       double spa[3];
+       this->GetInput()->GetSpacing (spa);
+       transL1->Translate(-maxant*spa[0], -maxant*spa[1], -maxant*spa[2]);
+//     transL1->Translate(-maxant, -maxant, -maxant);
+
+       
+       trans->SetInput((vtkPolyData *)(this->Outputs[0]));
+
+       trans->SetTransform (transL1);
+
+       trans->Update();
+
+       return trans->GetOutput();
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+axisExtractor02::axisExtractor02() {
+
+
+       this->NumberOfRequiredInputs = 1;
+       this->param=1;
+       this->param2=1;
+       this->param3=0.5;
+       this->param4=0;
+       
+       /*this->resample= vtkImageResample::New();
+       this->resample->SetDimensionality (3);*/
+
+       this->data4=vtkImageData::New();        
+
+       this->data1=vtkImageData::New();
+       this->data2=vtkImageData::New();
+       this->data3=vtkImageData::New();
+       this->data6=vtkImageData::New();
+               
+       this->extrac = vtkExtractVOI::New();
+//     this->extrac->SetInput(resample->GetOutput());
+       this->extrac->SetSampleRate(1, 1, 1);
+       
+       this->connect = vtkImageSeedConnectivity::New();
+       this->connect->SetInput(this->data1);
+       this->connect->SetInputConnectValue(255);
+       this->connect->SetOutputConnectedValue(255);
+       this->connect->SetOutputUnconnectedValue(0);
+
+       this->distance= vtkImageEuclideanDistance::New();
+       this->distance->SetInput(this->connect->GetOutput());
+       this->distance->InitializeOn();
+       this->distance->ConsiderAnisotropyOff();
+                       
+
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::SetInput(vtkImageData *input)
+{
+
+       vtkImageConstantPad *pad;
+       vtkImageTranslateExtent *trans;
+
+       pad = vtkImageConstantPad::New();
+       trans = vtkImageTranslateExtent::New();
+
+       pad->SetInput(input);
+       trans->SetInput(pad->GetOutput());
+       
+       
+       pad->SetConstant(0);
+
+       pad->SetInput(input);
+
+       int ext[6];
+
+       input->GetExtent(ext);
+
+       ext[0]=ext[0]-maxant;
+       ext[1]=ext[1]+maxant;
+       ext[2]=ext[2]-maxant;
+       ext[3]=ext[3]+maxant;
+       ext[4]=ext[4]-maxant;
+       ext[5]=ext[5]+maxant;
+
+       pad->SetOutputWholeExtent(ext);
+
+       trans->SetTranslation (maxant, maxant, maxant);
+
+       trans->Update();
+
+
+       //this->vtkProcessObject::SetNthInput(0, input);
+       this->vtkProcessObject::SetNthInput(0, trans->GetOutput());
+
+       //this->GetInput()->SetOrigin(0,0,0);
+       //this->resample->SetInput(this->GetInput());
+       this->extrac->SetInput(this->GetInput());
+  
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::distanciaejes(vtkPolyData *eje1,  vtkPolyData *eje2)
+{
+       vtkIdType totalpuntos1=eje1->GetNumberOfPoints();
+       vtkIdType totalpuntos2=eje2->GetNumberOfPoints();
+       vtkIdType totallineas=eje2->GetNumberOfLines();
+
+       vtkCell * lineas;
+
+       int i, j;
+
+       double point[3], point2[3], point3[3], point4[3];
+
+       double v[3], v2[3];
+
+       double x, dist, min, y;
+       FILE *ff;
+
+       ff=fopen("comparacion.txt","w");
+
+       
+
+       for(i=0;i<totalpuntos1;i++){
+               eje1->GetPoint(i, point);
+               min =5000;
+               for(j=0;j<totallineas;j++){
+                       lineas=eje2->GetCell(j);
+                                       
+                                       lineas->GetPoints()->GetPoint(0, point3);
+                                       lineas->GetPoints()->GetPoint(1, point2);
+                                       v[0]=point3[0]-point2[0];
+                                       v[1]=point3[1]-point2[1];
+                                       v[2]=point3[2]-point2[2];
+                                       
+                                       x=((v[0]*point[0])+(v[1]*point[1])+(v[2]*point[2])-(v[0]*point2[0])-(v[1]*point2[1])-(v[2]*point2[2]))/((v[0]*v[0])+(v[1]*v[1])+(v[2]*v[2]));
+                                       
+                                       
+                                       point4[0]=point2[0]+(x*v[0]);
+                                       point4[1]=point2[1]+(x*v[1]);
+                                       point4[2]=point2[2]+(x*v[2]);
+
+                                       v2[0]=point4[0]-point[0];
+                                       v2[1]=point4[1]-point[1];
+                                       v2[2]=point4[2]-point[2];
+
+                                       y=(v[0]*v2[0])+(v[1]*v2[1])+(v[2]*v2[2]);
+
+                                       if(x>=0 && x<=1){
+                                               dist=sqrt(((point4[0]-point[0])*(point4[0]-point[0]))+((point4[1]-point[1])*(point4[1]-point[1]))+((point4[2]-point[2])*(point4[2]-point[2])));
+                                               if(dist<min){
+                                                       min=dist;
+
+
+                                                       /*printf("punto: %f %f %f\n", point[0], point[1], point[2]);
+                                                       printf("punto2: %f %f %f\n", point2[0], point2[1], point2[2]);
+                                                       printf("punto3: %f %f %f\n", point3[0], point3[1], point3[2]);
+                                                       printf("punto4: %f %f %f\n", point4[0], point4[1], point4[2]);
+                                                       printf("v: %f %f %f\n", v[0], v[1], v[2]);
+                                                       printf("v2: %f %f %f\n", v2[0], v2[1], v2[2]);
+                                                       printf("%f\n", min);
+                                                       printf("%f\n", x);
+                                                       printf("%f\n", y);*/
+
+
+
+                                               }
+                                       }
+                               
+                       /*}*/
+               }
+               if(min<5){
+                       fprintf(ff,"%f\n", min);
+               }
+
+                       
+
+       }
+
+       fclose(ff);
+
+       
+       
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::Execute()
+{
+       flagg=0;
+       flagg2=0;
+       frama=0;
+       fseg=0;
+       mejordst=0;
+       mejorrad=0;
+       mejorcant=0;
+       
+       //double minspac;
+
+       time_t start,end;
+       double dif;
+//     FILE *ff;
+       
+       this->GetInput()->GetExtent(extprin0);
+       this->GetInput()->GetExtent(extprin);
+       this->GetInput()->GetSpacing(espprin);
+
+// EED
+//     stream  = fopen( "resultado.txt", "w" );
+//     fprintf(stream, "accion\tindexp\tbuenos\tradiotrabajo\tradioactual\tradiopred\tradioanterior\tmejordst\tmejorrad\tmejorcant\tflag2\tflag3\tflag4\tflag5\tflag6\tflag7\tflag8\tflag9\tflag10\tflag11\tflag12\tflag13\tflag14\tflag15\tflag16\tflag17\tflag18\tflag19\tflag20\tflagg\tflagg2\tcantidad\tcantidadb\tburned\tpuntoactual\tpuntoanterior\tpuntopre\tmejor\n");
+
+       /*minspac=min(espprin[0],min(espprin[1],espprin[2]));
+
+       this->resample->SetAxisOutputSpacing( 0, minspac);
+       this->resample->SetAxisOutputSpacing( 1, minspac);
+       this->resample->SetAxisOutputSpacing( 2, minspac);
+       resample->Update();*/
+       
+
+       this->data4->SetScalarTypeToUnsignedChar();
+       this->data4->SetExtent(this->GetInput()->GetExtent());
+       this->data4->SetSpacing(this->GetInput()->GetSpacing());
+
+       this->blanquear(this->data4);
+
+       this->points = vtkPoints::New();
+       this->buenos=0;
+       this->lineas = vtkCellArray::New();
+
+
+       time (&start);
+       this->todo();
+
+// EED
+//     fclose( stream );
+       
+       ((vtkPolyData *)this->Outputs[0])->SetPoints (this->points);
+       ((vtkPolyData *)this->Outputs[0])->SetLines(this->lineas);
+       time (&end);
+       dif = difftime (end,start);
+
+//     ff=fopen("time.txt","w");
+//     fprintf(ff,"%d \n",this->buenos);
+//     fprintf(ff,"%.2lf \n",dif);
+//     fprintf(ff,"%.2lf \n",(double)this->buenos/dif);
+//     fclose(ff);
+       
+}
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+vtkImageData *axisExtractor02::GetInput()
+{
+       if (this->NumberOfInputs < 1){
+               return NULL;
+    }
+  
+       return (vtkImageData *)(this->Inputs[0]);
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::PrintSelf(ostream& os, vtkIndent indent)
+{
+       this->Superclass::PrintSelf(os,indent);
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::realtoreal(double a[3], double b[3] )
+{
+               
+       b[0]=a[0]+(espprin[0]*extprin[0]);
+       b[1]=a[1]+(espprin[1]*extprin[2]);
+       b[2]=a[2];
+
+       
+
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::realtoreal2(double a[3], double b[3] )
+{
+               
+       b[0]=a[0]-(espprin[0]*extprin[0]);
+       b[1]=a[1]-(espprin[1]*extprin[2]);
+       b[2]=a[2];
+
+}
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::realtoindex(double a[3], int b[3] )
+{
+       double c[3];
+
+       double minspac;
+
+// EED 15 Mai 2007 .NET 
+//     minspac=min(espprin[0],min(espprin[1],espprin[2]));
+
+       minspac=espprin[0];
+       if (espprin[1]<minspac) { minspac=espprin[1]; }
+       if (espprin[2]<minspac) { minspac=espprin[2]; }
+
+
+       c[0]=(a[0]/minspac);
+       c[1]=(a[1]/minspac);
+       c[2]=(a[2]/minspac);
+
+       b[0]=(int)(a[0]/minspac);
+       b[1]=(int)(a[1]/minspac);
+       b[2]=(int)(a[2]/minspac);
+
+       if(c[0]-b[0]>0.5){
+               b[0]+=1;
+       }
+       if(c[1]-b[1]>0.5){
+               b[1]+=1;
+       }
+       if(c[2]-b[2]>0.5){
+               b[2]+=1;
+       }
+       
+
+}      
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::indextoreal(int a[3], double b[3] )
+{      
+       double minspac;
+
+// EED 15 Mai 2007 .NET 
+//     minspac=min(espprin[0],min(espprin[1],espprin[2]));
+       minspac=espprin[0];
+       if (espprin[1]<minspac) { minspac=espprin[1]; }
+       if (espprin[2]<minspac) { minspac=espprin[2]; }
+       
+       b[0]=(a[0])*minspac;
+       b[1]=(a[1])*minspac;
+       b[2]=a[2]*minspac;
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::indextoreal(double a[3], double b[3] )
+{      
+       double minspac;
+
+// EED 15 Mai 2007 .NET 
+//     minspac=min(espprin[0],min(espprin[1],espprin[2]));
+
+       minspac=espprin[0];
+       if (espprin[1]<minspac) { minspac=espprin[1]; }
+       if (espprin[2]<minspac) { minspac=espprin[2]; }
+
+       b[0]=(a[0])*minspac;
+       b[1]=(a[1])*minspac;
+       b[2]=a[2]*minspac;
+}
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::distanciaejepunto(double point[3], double point2[3], double point3[3])
+{
+       
+       
+       double point4[3];
+
+       double v[3], v2[3], v3[3];
+
+       double x, dist=0,  y;
+
+               
+       v[0]=point3[0]-point2[0];
+       v[1]=point3[1]-point2[1];
+       v[2]=point3[2]-point2[2];
+
+       v3[0]=point[0]-point2[0];
+       v3[1]=point[1]-point2[1];
+       v3[2]=point[2]-point2[2];
+                                       
+       x=((v[0]*v3[0])+(v[1]*v3[1])+(v[2]*v3[2]))/((v[0]*v[0])+(v[1]*v[1])+(v[2]*v[2]));
+                                       
+                                       
+       point4[0]=point2[0]+(x*v[0]);
+       point4[1]=point2[1]+(x*v[1]);
+       point4[2]=point2[2]+(x*v[2]);
+
+       v2[0]=point4[0]-point[0];
+       v2[1]=point4[1]-point[1];
+       v2[2]=point4[2]-point[2];
+
+       y=(v[0]*v2[0])+(v[1]*v2[1])+(v[2]*v2[2]);
+
+       dist=sqrt((v2[0]*v2[0])+(v2[1]*v2[1])+(v2[2]*v2[2]));
+                                       
+       return dist;
+       
+}
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::proporcioejepunto(double point[3], double point2[3], double point3[3])
+{
+       
+       
+       double v[3], v3[3];
+
+       double x;
+
+       v[0]=point3[0]-point2[0];
+       v[1]=point3[1]-point2[1];
+       v[2]=point3[2]-point2[2];
+
+       v3[0]=point[0]-point2[0];
+       v3[1]=point[1]-point2[1];
+       v3[2]=point[2]-point2[2];
+                                       
+       x=((v[0]*v3[0])+(v[1]*v3[1])+(v[2]*v3[2]))/((v[0]*v[0])+(v[1]*v[1])+(v[2]*v[2]));
+                                       
+       return x;
+                               
+                       
+       
+       
+}
+
+
+
+
+
+
+       
+
+//----------------------------------------------------------------------------
+void axisExtractor02::searc(int i, int j, int k, vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] )
+{
+
+       unsigned char *ptr;
+       unsigned char *ptr2;    
+
+       int radio;
+       
+       int i2, j2, k2;
+       int i3, j3, k3;
+               
+       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+       ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+
+       int ext[6];
+
+       data->GetExtent(ext);
+
+       radio=(ext[1]-ext[0])/2;
+
+       i2=i-ext[0]-radio;
+       j2=j-ext[2]-radio;
+       k2=k-ext[4]-radio;
+
+       *ptr2=label;
+       vector[label-1][0]+=1;
+       vector[label-1][1]+=i;
+       vector[label-1][2]+=j;
+       vector[label-1][3]+=k;
+
+       for(i3=-1;i3<=1;i3++){
+                       for(j3=-1;j3<=1;j3++){
+                               for(k3=-1;k3<=1;k3++){
+                                       if(i+i3>=ext[0] && i+i3<=ext[1] && j+j3>=ext[2] && j+j3<=ext[3] && k+k3>=ext[4] &&  k+k3<=ext[5] ){
+                                               ptr=(unsigned char *)   data->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               ptr2=(unsigned char *)  data2->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               if(*ptr==255 && *ptr2==0 && (radio*radio)>=(((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3))) && ((radio-1)*(radio-1))<=(((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3)))){
+                                                       searc(i+i3, j+j3, k+k3, data, data2, label, vector);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::searcb(int i, int j, int k, vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] )
+{
+
+       unsigned char *ptr;
+       unsigned char *ptr2;    
+
+       int radio;
+
+       int i2, j2, k2;
+       int i3, j3, k3;
+               
+       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+       ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+
+       int ext[6];
+
+       data->GetExtent(ext);
+
+       radio=(ext[1]-ext[0])/2;
+
+       i2=i-ext[0]-radio;
+       j2=j-ext[2]-radio;
+       k2=k-ext[4]-radio;
+
+       *ptr2=label;
+       vector[label-1][0]+=1;
+       vector[label-1][1]+=i;
+       vector[label-1][2]+=j;
+       vector[label-1][3]+=k;
+
+       for(i3=-1;i3<=1;i3++){
+                       for(j3=-1;j3<=1;j3++){
+                               for(k3=-1;k3<=1;k3++){
+                                       if(i+i3>=ext[0] && i+i3<=ext[1] && j+j3>=ext[2] && j+j3<=ext[3] && k+k3>=ext[4] &&  k+k3<=ext[5] ){
+                                               ptr=(unsigned char *)   data->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               ptr2=(unsigned char *)  data2->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               if(*ptr==0 && *ptr2==0 && (radio*radio)>=(((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3))) && ((radio-1)*(radio-1))<=(((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3)))){
+                                                       searcb(i+i3, j+j3, k+k3, data, data2, label, vector);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+}
+
+
+
+
+//----------------------------------------------------------------------------
+unsigned char axisExtractor02::find_components(vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+       double *ff=  data->GetOrigin();
+
+
+       unsigned char *ptr;
+       unsigned char *ptr2;
+
+       radio=(ext[1]-ext[0])/2;
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                       ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+
+                                       if(*ptr==255 && *ptr2==0 && (radio*radio)>=((i2*i2)+(j2*j2)+(k2*k2)) && ((radio-1)*(radio-1))<=((i2*i2)+(j2*j2)+(k2*k2))  ){
+                                               label=label+1;
+                                               vector[label-1][0]=0;
+                                               vector[label-1][1]=0;
+                                               vector[label-1][2]=0;
+                                               vector[label-1][3]=0;
+                                               searc(i, j, k, data, data2, label, vector);
+                                               
+                                       }
+                               }
+                       }
+               }
+
+               return label;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+unsigned char axisExtractor02::find_componentsb(vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+       unsigned char *ptr2;
+
+       radio=(ext[1]-ext[0])/2;
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                       ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+
+                                       if(*ptr==0 && *ptr2==0 && (radio*radio)>=((i2*i2)+(j2*j2)+(k2*k2)) && ((radio-1)*(radio-1))<=((i2*i2)+(j2*j2)+(k2*k2))  ){
+                                               label=label+1;
+                                               vector[label-1][0]=0;
+                                               vector[label-1][1]=0;
+                                               vector[label-1][2]=0;
+                                               vector[label-1][3]=0;
+                                               searcb(i, j, k, data, data2, label, vector);
+                                               
+                                       }
+                               }
+                       }
+               }
+
+               return label;
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::proporcion(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k;
+       int max=0;
+       int total=0;
+
+       data->GetExtent(ext);
+
+       unsigned short *ptr;
+       
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
+                               if(*ptr!=0){
+                                       max++;
+                               }
+                               total++;
+                       }
+               }
+       }
+
+       return (max*100)/total;
+}
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+bool axisExtractor02::border(vtkImageData *data, int p1[3] )
+{
+       int ext[6];
+       int i, j, k;
+       short val;
+       int total1, total2;
+       int centro[3];
+
+
+       int p2[3];
+       
+       data->GetExtent(ext);
+
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+
+       unsigned char *ptr;
+
+       ptr=(unsigned char *)   data->GetScalarPointer(p1);
+       
+       val=*ptr;
+
+       bool res=false;
+       total1=0;
+       total2=0;
+
+       for(i=-1;i<=1;i++){
+               for(j=-1;j<=1;j++){
+                       for(k=-1;k<=1;k++){
+                               p2[0]=p1[0]+i;
+                               p2[1]=p1[1]+j;
+                               p2[2]=p1[2]+k;
+                               if(ext[0]<=p2[0] && ext[1]>=p2[0] && ext[2]<=p2[1] && ext[3]>=p2[1] && ext[4]<=p2[2] && ext[5]>=p2[2] ){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(p2);
+                                       if(*ptr!=val){
+                                               total1++;
+                                       }
+                                       else{
+                                               total2++;
+                                       }                                               
+                               }
+                       }
+               }
+       }
+
+       if(total1>0){
+               res=true;
+       }
+       /*if(p1[0]==centro[0] && p1[1]==centro[1] && p1[2]==centro[2]){
+               res=false;
+       }*/
+                       
+       return res;
+}
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::optim(vtkImageData *data, vtkImageData *data2 )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int centro[3];
+
+       double w0, w1;
+
+       double w0p, w1p;
+
+       double inerciaxx, inerciayy, inerciazz, inerciaxy, inerciayz, inerciazx;
+       double sumx, sumy, sumz;
+       double sumxx, sumyy, sumzz, sumxy, sumyz, sumzx;
+
+       double sumix, sumiy, sumiz;
+       double sumixx, sumiyy, sumizz, sumixy, sumiyz, sumizx;
+
+       double inerciaixx, inerciaiyy, inerciaizz, inerciaixy, inerciaiyz, inerciaizx;
+
+       double inerciaxx2, inerciayy2, inerciazz2, inerciaxy2, inerciayz2, inerciazx2;
+       double sumx2, sumy2, sumz2;
+       double sumxx2, sumyy2, sumzz2, sumxy2, sumyz2, sumzx2;
+
+       double sumix2, sumiy2, sumiz2;
+       double sumixx2, sumiyy2, sumizz2, sumixy2, sumiyz2, sumizx2;
+
+       //double sumixp, sumiyp, sumizp;
+       //double sumix2p, sumiy2p, sumiz2p;
+
+       double inerciaxxp, inerciayyp, inerciazzp, inerciaxyp, inerciayzp, inerciazxp;
+       double sumxp, sumyp, sumzp;
+       double sumxxp, sumyyp, sumzzp, sumxyp, sumyzp, sumzxp;
+
+       double inerciaxx2p, inerciayy2p, inerciazz2p, inerciaxy2p, inerciayz2p, inerciazx2p;
+       double sumx2p, sumy2p, sumz2p;
+       double sumxx2p, sumyy2p, sumzz2p, sumxy2p, sumyz2p, sumzx2p;
+
+       //double inerciaixx2p, inerciaiyy2p, inerciaizz2p, inerciaixy2p, inerciaiyz2p, inerciaizx2p;
+       
+       unsigned long cantp;
+       double sumip;
+       double sumiip;
+       double inerciaiip;
+       double centip;
+       
+       unsigned long cant2p;
+       double sumi2p;
+       double sumii2p;
+       double inerciaii2p;
+       double centi2p;
+       
+       int point[3];
+
+       
+       double sumitotal=0;
+       double distcent=0;
+
+       double im, jm, km, lm;
+       
+
+       max2=0;
+       cant=0;
+       sumi=0;
+       sumii=0;
+       des2=0;
+       min2=3200;
+       centi=0;
+
+       max3=0;
+       cant2=0;
+       sumi2=0;
+       sumii2=0;
+       des3=0;
+       min3=3200;
+       centi2=0;
+
+       sumx=0;
+       sumy=0;
+       sumz=0;
+
+       sumxx=0;
+       sumyy=0;
+       sumzz=0;
+
+       sumxy=0;
+       sumyz=0;
+       sumzx=0;
+
+       sumix=0;
+       sumiy=0;
+       sumiz=0;
+
+       sumixx=0;
+       sumiyy=0;
+       sumizz=0;
+
+       sumixy=0;
+       sumiyz=0;
+       sumizx=0;
+
+       sumx2=0;
+       sumy2=0;
+       sumz2=0;
+
+       sumxx2=0;
+       sumyy2=0;
+       sumzz2=0;
+
+       sumxy2=0;
+       sumyz2=0;
+       sumzx2=0;
+
+       sumix2=0;
+       sumiy2=0;
+       sumiz2=0;
+
+       sumixx2=0;
+       sumiyy2=0;
+       sumizz2=0;
+
+       sumixy2=0;
+       sumiyz2=0;
+       sumizx2=0;
+
+       max=0;
+       min=3200;
+               
+
+       data->GetExtent(ext);
+
+       unsigned short *ptr;
+       unsigned char *ptr2;
+
+       radio=(ext[1]-ext[0])/2;
+
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+       
+       double tmpsqrt;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               tmpsqrt=((i-centro[0])*(i-centro[0]))+((j-centro[1])*(j-centro[1]))+((k-centro[2])*(k-centro[2]));
+                               if( radio>=sqrt( tmpsqrt) ){
+                                       ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
+                                       if(*ptr>max){
+                                               max=*ptr;
+                                                       
+                                       }
+                                       if(*ptr<min){
+                                               min=*ptr;
+                                                       
+                                       }
+                               }
+                       }
+               }
+       }
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               tmpsqrt=((i-centro[0])*(i-centro[0]))+((j-centro[1])*(j-centro[1]))+((k-centro[2])*(k-centro[2]));
+                               if( radio>=sqrt(tmpsqrt) ){
+                                       ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
+                                       ptr2=(unsigned char *)data2->GetScalarPointer(i,j,k);
+                                       point[0]=i;
+                                       point[1]=j;
+                                       point[2]=k;
+                                               
+                                       im=2*((((double)i-(double)ext[0])/((double)ext[1]-(double)ext[0]))-0.5);
+                                       jm=2*((((double)j-(double)ext[2])/((double)ext[3]-(double)ext[2]))-0.5);
+                                       km=2*((((double)k-(double)ext[4])/((double)ext[5]-(double)ext[4]))-0.5);
+                                       lm=2*(((double)*ptr-(double)min)/((double)max-(double)min));
+                                                       
+                                       if(*ptr2!=0){
+                                               sumi+=lm;
+                                               sumii+=lm*lm;
+                                               cant+=1;
+
+                                               sumx+=im;
+                                               sumy+=jm;
+                                               sumz+=km;
+
+                                               sumxx+=im*im;
+                                               sumyy+=jm*jm;
+                                               sumzz+=km*km;
+                                               sumxy+=im*jm;
+                                               sumyz+=jm*km;
+                                               sumzx+=km*im;
+
+                                               sumix+=lm*im;
+                                               sumiy+=lm*jm;
+                                               sumiz+=lm*km;
+
+                                               sumixx+=lm*im*im;
+                                               sumiyy+=lm*jm*jm;
+                                               sumizz+=lm*km*km;
+                                               sumixy+=lm*im*jm;
+                                               sumiyz+=lm*jm*km;
+                                               sumizx+=lm*km*im;
+                                       }
+                                       else{
+                                               sumi2+=lm;
+                                               sumii2+=lm*lm;
+                                               cant2+=1;
+                                       
+                                               sumx2+=im;
+                                               sumy2+=jm;
+                                               sumz2+=km;
+
+                                               sumxx2+=im*im;
+                                               sumyy2+=jm*jm;
+                                               sumzz2+=km*km;
+                                               sumxy2+=im*jm;
+                                               sumyz2+=jm*km;
+                                               sumzx2+=km*im;
+
+                                               sumix2+=lm*im;
+                                               sumiy2+=lm*jm;
+                                               sumiz2+=lm*km;
+
+                                               sumixx2+=lm*im*im;
+                                               sumiyy2+=lm*jm*jm;
+                                               sumizz2+=lm*km*km;
+                                               sumixy2+=lm*im*jm;
+                                               sumiyz2+=lm*jm*km;
+                                               sumizx2+=lm*km*im;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       centi=(double)sumi/(double)cant;
+       inerciaii= ((double)sumii/(double)cant)-(centi*centi);
+                                               
+       centi2=(double)sumi2/(double)cant2;
+       inerciaii2= ((double)sumii2/(double)cant2)-(centi2*centi2);
+
+       centx=(double)sumx/(double)cant;
+       centy=(double)sumy/(double)cant;
+       centz=(double)sumz/(double)cant;
+
+       centx2=(double)sumx2/(double)cant2;
+       centy2=(double)sumy2/(double)cant2;
+       centz2=(double)sumz2/(double)cant2;
+       
+       inerciaxx= ((double)sumxx/(double)cant)-centx*centx;
+       inerciayy= ((double)sumyy/(double)cant)-centy*centy;
+       inerciazz= ((double)sumzz/(double)cant)-centz*centz;
+
+       inerciaxx2= ((double)sumxx2/(double)cant2)-centx2*centx2;
+       inerciayy2= ((double)sumyy2/(double)cant2)-centy2*centy2;
+       inerciazz2= ((double)sumzz2/(double)cant2)-centz2*centz2;
+
+       inerciaxy= ((double)sumxy/(double)cant)-centx*centy;
+       inerciayz= ((double)sumyz/(double)cant)-centy*centz;
+       inerciazx= ((double)sumzx/(double)cant)-centz*centx;
+
+       inerciaxy2= ((double)sumxy2/(double)cant2)-centx2*centy2;
+       inerciayz2= ((double)sumyz2/(double)cant2)-centy2*centz2;
+       inerciazx2= ((double)sumzx2/(double)cant2)-centz2*centx2;
+
+
+       centix=((double)sumix+(double)sumix2)/((double)sumi+(double)sumi2);
+       centiy=((double)sumiy+(double)sumiy2)/((double)sumi+(double)sumi2);
+       centiz=((double)sumiz+(double)sumiz2)/((double)sumi+(double)sumi2);
+               
+       inerciaixx= ( ((double)sumixx+(double)sumixx2) / ((double)sumi+(double)sumi2)  )-(centix*centix);
+       inerciaiyy= ( ((double)sumiyy+(double)sumiyy2) / ((double)sumi+(double)sumi2)  )-(centiy*centiy);
+       inerciaizz= ( ((double)sumizz+(double)sumizz2) / ((double)sumi+(double)sumi2)  )-(centiz*centiz);
+
+
+       inerciaixy= ( ((double)sumixy+(double)sumixy2) / ((double)sumi+(double)sumi2)  )-(centix*centiy);
+       inerciaiyz= ( ((double)sumiyz+(double)sumiyz2) / ((double)sumi+(double)sumi2)  )-(centiy*centiz);
+       inerciaizx= ( ((double)sumizx+(double)sumizx2) / ((double)sumi+(double)sumi2)  )-(centiz*centix);
+
+
+       A[0][0]=inerciaxx;
+       A[1][1]=inerciayy;
+       A[2][2]=inerciazz;
+       A[0][1]=A[1][0]=inerciaxy;
+       A[0][2]=A[2][0]=inerciazx;
+       A[1][2]=A[2][1]=inerciayz;
+
+       A2[0][0]=inerciaxx2;
+       A2[1][1]=inerciayy2;
+       A2[2][2]=inerciazz2;
+       A2[0][1]=A2[1][0]=inerciaxy2;
+       A2[0][2]=A2[2][0]=inerciazx2;
+       A2[1][2]=A2[2][1]=inerciayz2;
+
+       Ai[0][0]=inerciaixx;
+       Ai[1][1]=inerciaiyy;
+       Ai[2][2]=inerciaizz;
+       Ai[0][1]=Ai[1][0]=inerciaixy;
+       Ai[0][2]=Ai[2][0]=inerciaizx;
+       Ai[1][2]=Ai[2][1]=inerciaiyz;
+
+       vtkMath::Diagonalize3x3  (A, w, V);
+       vtkMath::Diagonalize3x3  (A2, w2, V2);
+       vtkMath::Diagonalize3x3  (Ai, wi, Vi);
+
+       
+       if(w[0]>w[1]){
+               if(w[0]>w[2]){
+                       ejemin=0;
+                       inerciar=w[1]+w[2];
+                       if(w[1]>w[2]){
+                               inerciary=w[0]+w[2];
+                               inerciarz=w[0]+w[1];
+                       }
+                       else{
+                               inerciary=w[0]+w[1];
+                               inerciarz=w[0]+w[2];
+                       }
+               }
+               else{
+                       ejemin=2;
+                       inerciar=w[0]+w[1];
+                       if(w[1]>w[0]){
+                               inerciary=w[0]+w[2];
+                               inerciarz=w[1]+w[2];
+                       }
+                       else{
+                               inerciary=w[1]+w[2];
+                               inerciarz=w[0]+w[2];
+                       }
+               }
+       }
+       else{
+               if(w[1]>w[2]){
+                       ejemin=1;
+                       inerciar=w[2]+w[0];
+                       if(w[2]>w[0]){
+                               inerciary=w[1]+w[0];
+                               inerciarz=w[1]+w[2];
+                       }
+                       else{
+                               inerciary=w[1]+w[2];
+                               inerciarz=w[1]+w[0];
+                       }
+               }
+               else{
+                       ejemin=2;
+                       inerciar=w[1]+w[0];
+                       if(w[1]>w[0]){
+                               inerciary=w[0]+w[2];
+                               inerciarz=w[1]+w[2];
+                       }
+                       else{
+                               inerciary=w[1]+w[2];
+                               inerciarz=w[0]+w[2];
+                       }
+               }
+       }
+
+
+       if(w2[0]>w2[1]){
+               if(w2[0]>w2[2]){
+                       ejemin2=0;
+                       inercia2r=w2[1]+w2[2];
+               }
+               else{
+                       ejemin2=2;
+                       inercia2r=w2[1]+w2[0];
+               }
+       }
+       else{
+               if(w2[1]>w2[2]){
+                       ejemin2=1;
+                       inercia2r=w2[2]+w2[0];
+               }
+               else{
+                       ejemin2=2;
+                       inercia2r=w2[1]+w2[0];
+               }
+       }
+
+
+       if(wi[0]>wi[1]){
+               if(wi[0]>wi[2]){
+                       ejemini=0;
+                       inerciari=wi[1]+wi[2];
+                       if(wi[1]>wi[2]){
+                               inerciariy=wi[0]+wi[2];
+                               inerciariz=wi[0]+wi[1];
+                       }
+                       else{
+                               inerciariy=wi[0]+wi[1];
+                               inerciariz=wi[0]+wi[2];
+                       }
+               }
+               else{
+                       ejemini=2;
+                       inerciari=wi[1]+wi[0];
+                       if(wi[1]>wi[0]){
+                               inerciariy=wi[0]+wi[2];
+                               inerciariz=wi[1]+wi[2];
+                       }
+                       else{
+                               inerciariy=wi[1]+wi[2];
+                               inerciariz=wi[0]+wi[2];
+                       }
+
+               }
+       }
+       else{
+               if(wi[1]>wi[2]){
+                       ejemini=1;
+                       inerciari=wi[2]+wi[0];
+                       if(wi[2]>wi[0]){
+                               inerciariy=wi[1]+wi[0];
+                               inerciariz=wi[1]+wi[2];
+                       }
+                       else{
+                               inerciariy=wi[1]+wi[2];
+                               inerciariz=wi[1]+wi[0];
+                       }
+               }
+               else{
+                       ejemini=2;
+                       inerciari=wi[1]+wi[0];
+                       if(wi[1]>wi[0]){
+                               inerciariy=wi[0]+wi[2];
+                               inerciariz=wi[1]+wi[2];
+                       }
+                       else{
+                               inerciariy=wi[1]+wi[2];
+                               inerciariz=wi[0]+wi[2];
+                       }
+               }
+       }
+
+               
+       /*
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               if( radio>=sqrt(((i-centro[0])*(i-centro[0]))+((j-centro[1])*(j-centro[1]))+((k-centro[2])*(k-centro[2]))) ){
+                                       ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
+                                       ptr2=(unsigned char *)data2->GetScalarPointer(i,j,k);
+                                       
+                                       
+                                       im=2*((((double)i-(double)ext[0])/((double)ext[1]-(double)ext[0]))-0.5);
+                                       jm=2*((((double)j-(double)ext[2])/((double)ext[3]-(double)ext[2]))-0.5);
+                                       km=2*((((double)k-(double)ext[4])/((double)ext[5]-(double)ext[4]))-0.5);
+
+                                       point1[0]=im;
+                                       point1[1]=jm;
+                                       point1[2]=km;
+
+                                       point2[0]=centx+V[0][ejemin];
+                                       point2[1]=centy+V[1][ejemin];
+                                       point2[2]=centz+V[2][ejemin];
+
+                                       point3[0]=centx-V[0][ejemin];
+                                       point3[1]=centy-V[1][ejemin];
+                                       point3[2]=centz-V[2][ejemin];
+
+                                       //distcent=1+sqrt(centx*centx+centy*centy+centz*centz);
+                                       distcent=1;
+                                               
+                                       if(*ptr2==0){                           
+                                               
+                                               sumitotal+=(distcent-fabs(distanciaejepunto(point1, point2, point3)))*(distcent-fabs(distanciaejepunto(point1, point2, point3)));
+                                               
+                                       }
+                               }
+                       }
+               }
+       }
+
+       inercia2r=sumitotal/cant2;
+       */
+
+
+
+
+       /*printf("centx: %f\n", centx);
+       printf("centy: %f\n", centy);
+       printf("centz: %f\n", centz);
+
+       printf("w[0]: %f\n", w[0]);
+       printf("w[1]: %f\n", w[1]);
+       printf("w[2]: %f\n", w[2]);
+       printf("inerciar: %f\n", inerciar);
+
+       printf("w[ejemin]: %f\n", w[ejemin]);
+
+       printf("w[ejemin]/inerciar: %f\n", w[ejemin]/inerciar);
+
+       printf("V[0][0]: %f\n", V[0][0]);
+       printf("V[1][0]: %f\n", V[1][0]);
+       printf("V[2][0]: %f\n", V[2][0]);
+       
+       printf("V[0][1]: %f\n", V[0][1]);
+       printf("V[1][1]: %f\n", V[1][1]);
+       printf("V[2][1]: %f\n", V[2][1]);
+       
+       printf("V[0][2]: %f\n", V[0][2]);
+       printf("V[1][2]: %f\n", V[1][2]);
+       printf("V[2][2]: %f\n", V[2][2]);*/
+
+       w0=(double)cant/((double)cant+(double)cant2);
+       w1=(double)cant2/((double)cant+(double)cant2);
+
+       
+       /*
+       ut=w0*centi+w1*centi2;
+       intervar=w0*inerciaii+w1*inerciaii2;
+       */
+
+       //w0=1;
+       //w1=1;
+
+       
+
+       //costo=w0*inerciaii+w1*inerciaii2+param*inerciar;
+       //costo=param*(w0*param3*inerciaii+w1*(1-param3)*inerciaii2)+(1-param)*(w0*param2*inerciar+w1*(1-param2)*inercia2r);
+       costo=param*w0*inerciaii+w1*param2*inerciaii2+w0*param3*inerciar+w1*param4*inercia2r;
+
+       int changes=4;
+
+       int total=0;
+       
+       while(changes>3 && total<500){
+               changes=0;
+               total++;
+               for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       tmpsqrt = ((i-centro[0])*(i-centro[0]))+((j-centro[1])*(j-centro[1]))+((k-centro[2])*(k-centro[2]));
+                                       if( radio>=sqrt(tmpsqrt) ){
+                                               ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
+                                               ptr2=(unsigned char *)data2->GetScalarPointer(i,j,k);
+                                               point[0]=i;
+                                               point[1]=j;
+                                               point[2]=k;
+
+                                               im=2*((((double)i-(double)ext[0])/((double)ext[1]-(double)ext[0]))-0.5);
+                                               jm=2*((((double)j-(double)ext[2])/((double)ext[3]-(double)ext[2]))-0.5);
+                                               km=2*((((double)k-(double)ext[4])/((double)ext[5]-(double)ext[4]))-0.5);
+                                               lm=2*(((double)*ptr-(double)min)/((double)max-(double)min));
+                                               
+                                               if(border(data2, point)){
+                                                       if(*ptr2!=0){
+                                                               
+                                                               sumip=sumi-lm;
+                                                               sumiip=sumii-lm*lm;
+                                                       
+                                                               cantp=cant-1;
+
+                                                               sumi2p=sumi2+lm;
+                                                               sumii2p=sumii2+lm*lm;
+                                                               
+                                                               cant2p=cant2+1;
+
+                                                               sumxp=sumx-im;
+                                                               sumyp=sumy-jm;
+                                                               sumzp=sumz-km;
+                                                               sumxxp=sumxx-im*im;
+                                                               sumyyp=sumyy-jm*jm;
+                                                               sumzzp=sumzz-km*km;
+                                                               sumxyp=sumxy-im*jm;
+                                                               sumyzp=sumyz-jm*km;
+                                                               sumzxp=sumzx-km*im;
+
+                                                               sumx2p=sumx2+im;
+                                                               sumy2p=sumy2+jm;
+                                                               sumz2p=sumz2+km;
+                                                               sumxx2p=sumxx2+im*im;
+                                                               sumyy2p=sumyy2+jm*jm;
+                                                               sumzz2p=sumzz2+km*km;
+                                                               sumxy2p=sumxy2+im*jm;
+                                                               sumyz2p=sumyz2+jm*km;
+                                                               sumzx2p=sumzx2+km*im;
+
+                                                               centip=(double)sumip/(double)cantp;
+                                                               inerciaiip= ((double)sumiip/(double)cantp)-(centip*centip);
+                                                               
+                                                               centi2p=(double)sumi2p/(double)cant2p;
+                                                               inerciaii2p= ((double)sumii2p/(double)cant2p)-(centi2p*centi2p);
+                                                               
+                                                               centxp=(double)sumxp/(double)cantp;
+                                                               centyp=(double)sumyp/(double)cantp;
+                                                               centzp=(double)sumzp/(double)cantp;
+
+                                                               centx2p=(double)sumx2p/(double)cant2p;
+                                                               centy2p=(double)sumy2p/(double)cant2p;
+                                                               centz2p=(double)sumz2p/(double)cant2p;
+                                                                                                                               
+                                                               inerciaxxp= ((double)sumxxp/(double)cantp)-centxp*centxp;
+                                                               inerciayyp= ((double)sumyyp/(double)cantp)-centyp*centyp;
+                                                               inerciazzp= ((double)sumzzp/(double)cantp)-centzp*centzp;
+
+                                                               inerciaxx2p= ((double)sumxx2p/(double)cant2p)-centx2p*centx2p;
+                                                               inerciayy2p= ((double)sumyy2p/(double)cant2p)-centy2p*centy2p;
+                                                               inerciazz2p= ((double)sumzz2p/(double)cant2p)-centz2p*centz2p;
+
+                                                               inerciaxyp= ((double)sumxyp/(double)cantp)-centxp*centyp;
+                                                               inerciayzp= ((double)sumyzp/(double)cantp)-centyp*centzp;
+                                                               inerciazxp= ((double)sumzxp/(double)cantp)-centzp*centxp;
+
+                                                               inerciaxy2p= ((double)sumxy2p/(double)cant2p)-centx2p*centy2p;
+                                                               inerciayz2p= ((double)sumyz2p/(double)cant2p)-centy2p*centz2p;
+                                                               inerciazx2p= ((double)sumzx2p/(double)cant2p)-centz2p*centx2p;
+
+                                                               Ap[0][0]=inerciaxxp;
+                                                               Ap[1][1]=inerciayyp;
+                                                               Ap[2][2]=inerciazzp;
+                                                               Ap[0][1]=Ap[1][0]=inerciaxyp;
+                                                               Ap[0][2]=Ap[2][0]=inerciazxp;
+                                                               Ap[1][2]=Ap[2][1]=inerciayzp;
+
+
+                                                               A2p[0][0]=inerciaxx2p;
+                                                               A2p[1][1]=inerciayy2p;
+                                                               A2p[2][2]=inerciazz2p;
+                                                               A2p[0][1]=A2p[1][0]=inerciaxy2p;
+                                                               A2p[0][2]=A2p[2][0]=inerciazx2p;
+                                                               A2p[1][2]=A2p[2][1]=inerciayz2p;
+
+                                                               
+
+                                                               w0p=(double)cantp/((double)cantp+(double)cant2p);
+                                                               w1p=(double)cant2p/((double)cantp+(double)cant2p);
+
+                                                               //w0p=1;
+                                                               //w1p=1;
+                                                               
+                                                               vtkMath::Diagonalize3x3  (Ap, wp, Vp);
+                                                               vtkMath::Diagonalize3x3  (A2p, w2p, V2p);
+
+                                                       
+                                                               if(wp[0]>wp[1]){
+                                                                       if(wp[0]>wp[2]){
+                                                                               ejeminp=0;
+                                                                               inerciarp=wp[2]+wp[1];
+                                                                               if(wp[1]>wp[2]){
+                                                                                       inerciarpy=wp[0]+wp[2];
+                                                                                       inerciarpz=wp[0]+wp[1];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[0]+wp[1];
+                                                                                       inerciarpz=wp[0]+wp[2];
+                                                                               }
+                                                                       }
+                                                                       else{
+                                                                               ejeminp=2;
+                                                                               inerciarp=wp[1]+wp[0];
+                                                                               if(wp[1]>wp[0]){
+                                                                                       inerciarpy=wp[0]+wp[2];
+                                                                                       inerciarpz=wp[1]+wp[2];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[1]+wp[2];
+                                                                                       inerciarpz=wp[0]+wp[2];
+                                                                               }
+                                                                       }
+                                                               }
+                                                               else{
+                                                                       if(wp[1]>wp[2]){
+                                                                               ejeminp=1;
+                                                                               inerciarp=wp[2]+wp[0];
+                                                                               if(wp[2]>wp[0]){
+                                                                                       inerciarpy=wp[1]+wp[0];
+                                                                                       inerciarpz=wp[1]+wp[2];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[1]+wp[2];
+                                                                                       inerciarpz=wp[1]+wp[0];
+                                                                               }
+                                                                       }
+                                                                       else{
+                                                                               ejeminp=2;
+                                                                               inerciarp=wp[1]+wp[0];
+                                                                               if(wp[1]>wp[0]){
+                                                                                       inerciarpy=wp[0]+wp[2];
+                                                                                       inerciarpz=wp[1]+wp[2];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[1]+wp[2];
+                                                                                       inerciarpz=wp[0]+wp[2];
+                                                                               }
+                                                                       }
+                                                               }
+
+
+                                                               if(w2p[0]>w2p[1]){
+                                                                       if(w2p[0]>w2p[2]){
+                                                                               ejemin2p=0;
+                                                                               inercia2rp=w2p[2]+w2p[1];
+                                                                       }
+                                                                       else{
+                                                                               ejemin2p=2;
+                                                                               inercia2rp=w2p[1]+w2p[0];
+                                                                       }
+                                                               }
+                                                               else{
+                                                                       if(w2p[1]>w2p[2]){
+                                                                               ejemin2p=1;
+                                                                               inercia2rp=w2p[2]+w2p[0];
+                                                                       }
+                                                                       else{
+                                                                               ejemin2p=2;
+                                                                               inercia2rp=w2p[1]+w2p[0];
+                                                                       }
+                                                               }
+
+                                                       /*      point1[0]=im;
+                                                               point1[1]=jm;
+                                                               point1[2]=km;
+
+                                                               point2[0]=centxp+Vp[0][ejeminp];
+                                                               point2[1]=centyp+Vp[1][ejeminp];
+                                                               point2[2]=centzp+Vp[2][ejeminp];
+
+                                                               point3[0]=centxp-Vp[0][ejeminp];
+                                                               point3[1]=centyp-Vp[1][ejeminp];
+                                                               point3[2]=centzp-Vp[2][ejeminp];*/
+
+                                                               //distcent=1+sqrt(centx*centx+centy*centy+centz*centz);
+                                                       /*      distcent=1;
+
+                                                               sumitotalp=sumitotal+(distcent-fabs(distanciaejepunto(point1, point2, point3)))*(distcent-fabs(distanciaejepunto(point1, point2, point3)));
+                                                       
+                                                               inercia2rp=sumitotalp/cant2p;*/
+
+                                                               //costop=w0p*inerciaiip+w1p*inerciaii2p+param*inerciarp;
+
+                                                               //costop=param*(w0p*param3*inerciaiip+w1p*(1-param3)*inerciaii2p)+(1-param)*(w0p*param2*inerciarp+w1p*(1-param2)*inercia2rp);
+                                                               
+                                                               
+                                                               costop=param*w0p*inerciaiip+w1p*param2*inerciaii2p+w0p*param3*inerciarp+w1p*param4*inercia2rp;
+
+                                                               if(costop<costo  && centip>centi2p){
+                                                                                                                                               
+                                                                       *ptr2=0;
+                                                                       changes++;
+
+                                                                       sumi=sumip;
+                                                                       sumii=sumiip;
+                                                                       cant=cantp;
+
+                                                                       sumi2=sumi2p;
+                                                                       sumii2=sumii2p;
+                                                                       cant2=cant2p;
+
+                                                                       sumx=sumxp;
+                                                                       sumy=sumyp;
+                                                                       sumz=sumzp;
+                                                                       sumxx=sumxxp;
+                                                                       sumyy=sumyyp;
+                                                                       sumzz=sumzzp;
+                                                                       sumxy=sumxyp;
+                                                                       sumyz=sumyzp;
+                                                                       sumzx=sumzxp;
+
+                                                                       sumx2=sumx2p;
+                                                                       sumy2=sumy2p;
+                                                                       sumz2=sumz2p;
+                                                                       sumxx2=sumxx2p;
+                                                                       sumyy2=sumyy2p;
+                                                                       sumzz2=sumzz2p;
+                                                                       sumxy2=sumxy2p;
+                                                                       sumyz2=sumyz2p;
+                                                                       sumzx2=sumzx2p;
+
+                                                                       centi=centip;
+                                                                       inerciaii= inerciaiip;
+                                                                       
+                                                                       centi2=centi2p;
+                                                                       inerciaii2p= inerciaii2p;
+                                                                       
+                                                                       centx=centxp;
+                                                                       centy=centyp;
+                                                                       centz=centzp;
+
+                                                                       centx2=centx2p;
+                                                                       centy2=centy2p;
+                                                                       centz2=centz2p;
+                                                                                                                                               
+                                                                       inerciaxx= inerciaxxp;
+                                                                       inerciayy= inerciayyp;
+                                                                       inerciazz= inerciazzp;
+
+                                                                       inerciaxx2= inerciaxx2p;
+                                                                       inerciayy2= inerciayy2p;
+                                                                       inerciazz2= inerciazz2p;
+
+                                                                       inerciaxy= inerciaxyp;
+                                                                       inerciayz= inerciayzp;
+                                                                       inerciazx= inerciazxp;
+
+                                                                       inerciaxy2= inerciaxy2p;
+                                                                       inerciayz2= inerciayz2p;
+                                                                       inerciazx2= inerciazx2p;
+
+                                                               //      sumitotal=sumitotalp;
+
+                                                                       costo=costop;
+
+                                                               }
+                                                       }
+                                                       else{
+                                                               sumip=sumi+lm;
+                                                               sumiip=sumii+lm*lm;
+                                                       
+                                                               cantp=cant+1;
+
+                                                               sumi2p=sumi2-lm;
+                                                               sumii2p=sumii2-lm*lm;
+                                                               
+                                                               cant2p=cant2-1;
+
+                                                               sumxp=sumx+im;
+                                                               sumyp=sumy+jm;
+                                                               sumzp=sumz+km;
+                                                               sumxxp=sumxx+im*im;
+                                                               sumyyp=sumyy+jm*jm;
+                                                               sumzzp=sumzz+km*km;
+                                                               sumxyp=sumxy+im*jm;
+                                                               sumyzp=sumyz+jm*km;
+                                                               sumzxp=sumzx+km*im;
+
+                                                               sumx2p=sumx2-im;
+                                                               sumy2p=sumy2-jm;
+                                                               sumz2p=sumz2-km;
+                                                               sumxx2p=sumxx2-im*im;
+                                                               sumyy2p=sumyy2-jm*jm;
+                                                               sumzz2p=sumzz2-km*km;
+                                                               sumxy2p=sumxy2-im*jm;
+                                                               sumyz2p=sumyz2-jm*km;
+                                                               sumzx2p=sumzx2-km*im;
+
+                                                               centip=(double)sumip/(double)cantp;
+                                                               inerciaiip= ((double)sumiip/(double)cantp)-(centip*centip);
+                                                               
+                                                               centi2p=(double)sumi2p/(double)cant2p;
+                                                               inerciaii2p= ((double)sumii2p/(double)cant2p)-(centi2p*centi2p);
+                                                               
+                                                               centxp=(double)sumxp/(double)cantp;
+                                                               centyp=(double)sumyp/(double)cantp;
+                                                               centzp=(double)sumzp/(double)cantp;
+
+                                                               centx2p=(double)sumx2p/(double)cant2p;
+                                                               centy2p=(double)sumy2p/(double)cant2p;
+                                                               centz2p=(double)sumz2p/(double)cant2p;
+                                                               
+                                                               
+                                                               inerciaxxp= ((double)sumxxp/(double)cantp)-centxp*centxp;
+                                                               inerciayyp= ((double)sumyyp/(double)cantp)-centyp*centyp;
+                                                               inerciazzp= ((double)sumzzp/(double)cantp)-centzp*centzp;
+
+                                                               inerciaxx2p= ((double)sumxx2p/(double)cant2p)-centx2p*centx2p;
+                                                               inerciayy2p= ((double)sumyy2p/(double)cant2p)-centy2p*centy2p;
+                                                               inerciazz2p= ((double)sumzz2p/(double)cant2p)-centz2p*centz2p;
+
+                                                               inerciaxyp= ((double)sumxyp/(double)cantp)-centxp*centyp;
+                                                               inerciayzp= ((double)sumyzp/(double)cantp)-centyp*centzp;
+                                                               inerciazxp= ((double)sumzxp/(double)cantp)-centzp*centxp;
+
+                                                               inerciaxy2p= ((double)sumxy2p/(double)cant2p)-centx2p*centy2p;
+                                                               inerciayz2p= ((double)sumyz2p/(double)cant2p)-centy2p*centz2p;
+                                                               inerciazx2p= ((double)sumzx2p/(double)cant2p)-centz2p*centx2p;
+
+                                                               Ap[0][0]=inerciaxxp;
+                                                               Ap[1][1]=inerciayyp;
+                                                               Ap[2][2]=inerciazzp;
+                                                               Ap[0][1]=Ap[1][0]=inerciaxyp;
+                                                               Ap[0][2]=Ap[2][0]=inerciazxp;
+                                                               Ap[1][2]=Ap[2][1]=inerciayzp;
+
+                                                               A2p[0][0]=inerciaxx2p;
+                                                               A2p[1][1]=inerciayy2p;
+                                                               A2p[2][2]=inerciazz2p;
+                                                               A2p[0][1]=A2p[1][0]=inerciaxy2p;
+                                                               A2p[0][2]=A2p[2][0]=inerciazx2p;
+                                                               A2p[1][2]=A2p[2][1]=inerciayz2p;
+
+                                                               w0p=(double)cantp/((double)cantp+(double)cant2p);
+                                                               w1p=(double)cant2p/((double)cantp+(double)cant2p);
+
+                                                               //w0p=1;
+                                                               //w1p=1;
+                                                               
+                                                               vtkMath::Diagonalize3x3  (Ap, wp, Vp);
+                                                               vtkMath::Diagonalize3x3  (A2p, w2p, V2p);
+                                                       
+                                                               if(wp[0]>wp[1]){
+                                                                       if(wp[0]>wp[2]){
+                                                                               ejeminp=0;
+                                                                               inerciarp=wp[2]+wp[1];
+                                                                               if(wp[1]>wp[2]){
+                                                                                       inerciarpy=wp[0]+wp[2];
+                                                                                       inerciarpz=wp[0]+wp[1];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[0]+wp[1];
+                                                                                       inerciarpz=wp[0]+wp[2];
+                                                                               }
+                                                                       }
+                                                                       else{
+                                                                               ejeminp=2;
+                                                                               inerciarp=wp[1]+wp[0];
+                                                                               if(wp[1]>wp[0]){
+                                                                                       inerciarpy=wp[0]+wp[2];
+                                                                                       inerciarpz=wp[1]+wp[2];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[1]+wp[2];
+                                                                                       inerciarpz=wp[0]+wp[2];
+                                                                               }
+                                                                       }
+                                                               }
+                                                               else{
+                                                                       if(wp[1]>wp[2]){
+                                                                               ejeminp=1;
+                                                                               inerciarp=wp[2]+wp[0];
+                                                                               if(wp[2]>wp[0]){
+                                                                                       inerciarpy=wp[1]+wp[0];
+                                                                                       inerciarpz=wp[1]+wp[2];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[1]+wp[2];
+                                                                                       inerciarpz=wp[1]+wp[0];
+                                                                               }
+                                                                       }
+                                                                       else{
+                                                                               ejeminp=2;
+                                                                               inerciarp=wp[1]+wp[0];
+                                                                               if(wp[1]>wp[0]){
+                                                                                       inerciarpy=wp[0]+wp[2];
+                                                                                       inerciarpz=wp[1]+wp[2];
+                                                                               }
+                                                                               else{
+                                                                                       inerciarpy=wp[1]+wp[2];
+                                                                                       inerciarpz=wp[0]+wp[2];
+                                                                               }
+                                                                       }
+                                                               }
+
+
+                                                               if(w2p[0]>w2p[1]){
+                                                                       if(w2p[0]>w2p[2]){
+                                                                               ejemin2p=0;
+                                                                               inercia2rp=w2p[2]+w2p[1];
+                                                                       }
+                                                                       else{
+                                                                               ejemin2p=2;
+                                                                               inercia2rp=w2p[1]+w2p[0];
+                                                                       }
+                                                               }
+                                                               else{
+                                                                       if(w2p[1]>w2p[2]){
+                                                                               ejemin2p=1;
+                                                                               inercia2rp=w2p[2]+w2p[0];
+                                                                       }
+                                                                       else{
+                                                                               ejemin2p=2;
+                                                                               inercia2rp=w2p[1]+w2p[0];
+                                                                       }
+                                                               }
+
+
+                                                       /*      point1[0]=im;
+                                                               point1[1]=jm;
+                                                               point1[2]=km;
+
+                                                               point2[0]=centxp+Vp[0][ejeminp];
+                                                               point2[1]=centyp+Vp[1][ejeminp];
+                                                               point2[2]=centzp+Vp[2][ejeminp];
+
+                                                               point3[0]=centxp-Vp[0][ejeminp];
+                                                               point3[1]=centyp-Vp[1][ejeminp];
+                                                               point3[2]=centzp-Vp[2][ejeminp];*/
+
+                                                               //distcent=1+sqrt(centx*centx+centy*centy+centz*centz);
+                                                       /*      distcent=1;
+                                                       
+                                                               sumitotalp=sumitotal-(distcent-fabs(distanciaejepunto(point1, point2, point3)))*(distcent-fabs(distanciaejepunto(point1, point2, point3)));
+                                                               
+                                                               inercia2rp=sumitotalp/cant2p;*/
+
+
+                                                               //costop=w0p*inerciaiip+w1p*inerciaii2p+param*inerciarp;
+                                                               //costop=param*(w0p*param3*inerciaiip+w1p*(1-param3)*inerciaii2p)+(1-param)*(w0p*param2*inerciarp+w1p*(1-param2)*inercia2rp);
+                                                               
+                                                               
+                                                               costop=param*w0p*inerciaiip+w1p*param2*inerciaii2p+w0p*param3*inerciarp+w1p*param4*inercia2rp;
+
+                                                               if(costop<costo && centip>centi2p){
+                                                                                                                                               
+                                                                       *ptr2=255;
+                                                                       changes++;
+
+                                                                       sumi=sumip;
+                                                                       sumii=sumiip;
+                                                                       cant=cantp;
+
+                                                                       sumi2=sumi2p;
+                                                                       sumii2=sumii2p;
+                                                                       cant2=cant2p;
+
+                                                                       sumx=sumxp;
+                                                                       sumy=sumyp;
+                                                                       sumz=sumzp;
+                                                                       sumxx=sumxxp;
+                                                                       sumyy=sumyyp;
+                                                                       sumzz=sumzzp;
+                                                                       sumxy=sumxyp;
+                                                                       sumyz=sumyzp;
+                                                                       sumzx=sumzxp;
+
+                                                                       sumx2=sumx2p;
+                                                                       sumy2=sumy2p;
+                                                                       sumz2=sumz2p;
+                                                                       sumxx2=sumxx2p;
+                                                                       sumyy2=sumyy2p;
+                                                                       sumzz2=sumzz2p;
+                                                                       sumxy2=sumxy2p;
+                                                                       sumyz2=sumyz2p;
+                                                                       sumzx2=sumzx2p;
+
+                                                                       centi=centip;
+                                                                       inerciaii= inerciaiip;
+                                                                       
+                                                                       centi2=centi2p;
+                                                                       inerciaii2p= inerciaii2p;
+                                                                       
+                                                                       centx=centxp;
+                                                                       centy=centyp;
+                                                                       centz=centzp;
+
+                                                                       centx2=centx2p;
+                                                                       centy2=centy2p;
+                                                                       centz2=centz2p;
+                                                                                                                                               
+                                                                       inerciaxx= inerciaxxp;
+                                                                       inerciayy= inerciayyp;
+                                                                       inerciazz= inerciazzp;
+
+                                                                       inerciaxx2= inerciaxx2p;
+                                                                       inerciayy2= inerciayy2p;
+                                                                       inerciazz2= inerciazz2p;
+
+                                                                       inerciaxy= inerciaxyp;
+                                                                       inerciayz= inerciayzp;
+                                                                       inerciazx= inerciazxp;
+
+                                                                       inerciaxy2= inerciaxy2p;
+                                                                       inerciayz2= inerciayz2p;
+                                                                       inerciazx2= inerciazx2p;
+
+                                                               //      sumitotal=sumitotalp;
+
+                                                                       costo=costop;
+
+                                                               }
+                                                               
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+       //      printf("changes: %d\n", changes);
+               
+
+       }
+
+       //printf("total: %d\n", total);
+
+               
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::costominimo(vtkImageData *data,  vtkImageData *data2 )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int centro[3];
+       
+       
+       data->GetExtent(ext);
+
+       double *ptr;
+       unsigned char *ptr2;
+
+       int ind;
+
+       radio=(ext[1]-ext[0])/2;
+
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+       
+
+       for(i=0;i<=10;i++){
+               minis[i]=0;
+       }
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(double *)data->GetScalarPointer(i,j,k);
+                               ptr2=(unsigned char *)data2->GetScalarPointer(i,j,k);
+
+                               ind=(int)*ptr2;
+
+                               if(*ptr2!=0){   
+                                       if(minis[ind-1]<=*ptr && *ptr!=0 && ind<11){
+                                               minis[ind-1]=*ptr;
+                                               candit[ind-1][0]=i;
+                                               candit[ind-1][1]=j;
+                                               candit[ind-1][2]=k;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::costominimo2(vtkImageData *data,  vtkImageData *data3, int p1[3], int p2[3], int p3[3])
+{
+       int ext[6];
+       int i, j, k, radio;
+       int punto[3];
+       int puntob[3];
+       int punto2[3];
+       int puntob2[3];         
+       int puntomin[3];
+       int puntobmin[3];
+       
+       double *ptr;
+       double *ptr2; 
+       unsigned char *ptr3; 
+       unsigned char *ptr4; 
+       double *ptr5; 
+       unsigned char *ptr6; 
+       double *ptr7; 
+       double *ptr8;
+
+       vtkImageData *data4;
+               
+       data4=vtkImageData::New();
+       data4->SetScalarTypeToUnsignedChar();
+       data4->SetExtent(data->GetExtent());
+       data4->SetSpacing(data->GetSpacing());
+
+       vtkImageData *data6;
+               
+       data6=vtkImageData::New();
+       data6->SetScalarTypeToUnsignedChar();
+       data6->SetExtent(data->GetExtent());
+       data6->SetSpacing(data->GetSpacing());
+       
+
+       vtkImageData *data2;
+
+       data2=vtkImageData::New();
+       data2->SetScalarTypeToDouble();
+       data2->SetExtent(data->GetExtent());
+       data2->SetSpacing(data->GetSpacing());
+
+       vtkImageData *data8;
+
+       data8=vtkImageData::New();
+       data8->SetScalarTypeToDouble();
+       data8->SetExtent(data->GetExtent());
+       data8->SetSpacing(data->GetSpacing());
+
+       
+       double mincst, mincstb;
+       
+       bool flag=true;
+
+       double costoactual;
+
+       data->GetExtent(ext);
+
+       radio=(ext[1]-ext[0])/2;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr2=(double *)data2->GetScalarPointer(i,j,k);
+                               ptr4=(unsigned char *)data4->GetScalarPointer(i,j,k);
+                               ptr6=(unsigned char *)data6->GetScalarPointer(i,j,k);
+                               ptr8=(double *)data8->GetScalarPointer(i,j,k);
+                               
+                               *ptr2 = 1000000000;
+                               *ptr4 = 0;
+                               *ptr6 = 0;
+                               *ptr8 = 1000000000;
+                       }
+               }
+       }
+
+
+
+       punto[0]=p1[0];
+       punto[1]=p1[1];
+       punto[2]=p1[2];
+       puntob[0]=p2[0];
+       puntob[1]=p2[1];
+       puntob[2]=p2[2];
+       
+       
+       ptr2=(double *)data2->GetScalarPointer(p1[0],p1[1],p1[2]);
+       *ptr2=0;
+
+       ptr4=(unsigned char *)data4->GetScalarPointer(p1[0],p1[1],p1[2]);
+       *ptr4=1;
+
+       ptr8=(double *)data8->GetScalarPointer(p2[0],p2[1],p2[2]);
+       *ptr8=0;
+
+       ptr6=(unsigned char *)data6->GetScalarPointer(p2[0],p2[1],p2[2]);
+       *ptr6=1;
+
+       
+
+
+               
+
+       while(flag){
+               
+               ptr5=(double *)data2->GetScalarPointer(punto[0],punto[1],punto[2]);
+               ptr7=(double *)data8->GetScalarPointer(puntob[0],puntob[1],puntob[2]);
+                       
+                       for(i=-1;i<=1;i++){
+                               for(j=-1;j<=1;j++){
+                                       for(k=-1;k<=1;k++){
+                                               if(i!=0 || j!=0 || k!=0){
+                                                       punto2[0]=punto[0]+i;
+                                                       punto2[1]=punto[1]+j;
+                                                       punto2[2]=punto[2]+k;
+
+                                                       puntob2[0]=puntob[0]+i;
+                                                       puntob2[1]=puntob[1]+j;
+                                                       puntob2[2]=puntob[2]+k;
+
+                                                       if(punto2[0]>=ext[0] && punto2[0]<=ext[1] && punto2[1]>=ext[2] && punto2[1]<=ext[3] && punto2[2]>=ext[4] &&  punto2[2]<=ext[5] ){
+
+                                                               ptr=(double *)data->GetScalarPointer(punto2[0],punto2[1],punto2[2]);
+                                                               ptr2=(double *)data2->GetScalarPointer(punto2[0],punto2[1],punto2[2]);
+                                                               ptr3=(unsigned char *)data3->GetScalarPointer(punto2[0],punto2[1],punto2[2]);
+                                                               ptr4=(unsigned char *)data4->GetScalarPointer(punto2[0],punto2[1],punto2[2]);
+                                                               
+
+                                                               if(*ptr3!=0 && *ptr4!=2){
+                                                                       costoactual=*ptr5+(1/(*ptr));
+                                                                       if(*ptr2>costoactual){
+                                                                               *ptr2=costoactual;                                                                      
+                                                                               *ptr4=1;
+                                                                       }                                                                       
+                                                               }
+                                                       }
+
+                                                       if(puntob2[0]>=ext[0] && puntob2[0]<=ext[1] && puntob2[1]>=ext[2] && puntob2[1]<=ext[3] && puntob2[2]>=ext[4] &&  puntob2[2]<=ext[5] ){
+
+                                                               ptr=(double *)data->GetScalarPointer(puntob2[0],puntob2[1],puntob2[2]);
+                                                               ptr8=(double *)data8->GetScalarPointer(puntob2[0],puntob2[1],puntob2[2]);
+                                                               ptr3=(unsigned char *)data3->GetScalarPointer(puntob2[0],puntob2[1],puntob2[2]);
+                                                               ptr6=(unsigned char *)data6->GetScalarPointer(puntob2[0],puntob2[1],puntob2[2]);
+
+                                                               if(*ptr3!=0 && *ptr6!=2){
+                                                                       costoactual=*ptr7+(1/(*ptr));
+                                                                       if(*ptr8>costoactual){
+                                                                               *ptr8=costoactual;                                                                      
+                                                                               *ptr6=1;
+                                                                       }                                                                       
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+
+                       ptr4=(unsigned char *)data4->GetScalarPointer(punto[0],punto[1],punto[2]);
+                       *ptr4=2;
+
+                       ptr6=(unsigned char *)data6->GetScalarPointer(puntob[0],puntob[1],puntob[2]);
+                       *ptr6=2;
+
+                       mincst=1000000000;
+                       mincstb=1000000000;
+                       
+                       for(i=ext[0];i<=ext[1];i++){
+                               for(j=ext[2];j<=ext[3];j++){
+                                       for(k=ext[4];k<=ext[5];k++){
+                                               ptr2=(double *)data2->GetScalarPointer(i,j,k);
+                                               ptr8=(double *)data8->GetScalarPointer(i,j,k);
+                                               ptr4=(unsigned char *)data4->GetScalarPointer(i,j,k);
+                                               ptr6=(unsigned char *)data6->GetScalarPointer(i,j,k);
+                                                       
+                                               if(*ptr4==1){
+                                                       if(mincst>=*ptr2){
+                                                               mincst=*ptr2;
+                                                               puntomin[0]=i;
+                                                               puntomin[1]=j;
+                                                               puntomin[2]=k;
+                                                       }
+                                               }
+                                               
+                                               if(*ptr6==1){
+                                                       if(mincstb>=*ptr8){
+                                                               mincstb=*ptr8;
+                                                               puntobmin[0]=i;
+                                                               puntobmin[1]=j;
+                                                               puntobmin[2]=k;
+                                                       }
+                                               }       
+                                       }
+                               }
+                       }
+
+                       punto[0]=puntomin[0];
+                       punto[1]=puntomin[1];
+                       punto[2]=puntomin[2];
+
+                       puntob[0]=puntobmin[0];
+                       puntob[1]=puntobmin[1];
+                       puntob[2]=puntobmin[2];
+
+                       ptr4=(unsigned char *)data4->GetScalarPointer(puntob[0],puntob[1],puntob[2]);
+                       ptr6=(unsigned char *)data6->GetScalarPointer(punto[0],punto[1],punto[2]);
+               
+
+                       if(*ptr4==2){
+                               p3[0]=puntob[0];
+                               p3[1]=puntob[1];
+                               p3[2]=puntob[2];
+                               flag=false;
+                       }
+
+                       if(*ptr6==2){
+                               p3[0]=punto[0];
+                               p3[1]=punto[1];
+                               p3[2]=punto[2];
+                               flag=false;
+                       }
+               }
+
+               data2->Delete();
+               data4->Delete();
+               data6->Delete();
+               data8->Delete();
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::invertir(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+
+       double tmpsqrt;
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+               for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                       for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               tmpsqrt=(i2*i2)+(j2*j2)+(k2*k2);                
+                               if( radio<sqrt(tmpsqrt) ){
+                                       if(*ptr==0){
+                                               *ptr=255;
+                                       }
+                                       else{
+                                               *ptr=0;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::redondear(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+
+       double tmpsqrt;
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+               for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                       for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               tmpsqrt=(i2*i2)+(j2*j2)+(k2*k2);                        
+                               if( radio<sqrt(tmpsqrt) ){
+                                       *ptr=0;
+                               }
+                               /*if( i2==0 && j2==0 && k2==0 ){
+                                       *ptr=255;
+                               }*/
+                       }
+               }
+       }
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::redondear2(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       double *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+
+       double tmpsqrt;
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+               for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                       for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                               ptr=(double *)  data->GetScalarPointer(i,j,k);
+                               tmpsqrt=(i2*i2)+(j2*j2)+(k2*k2);        
+                               if( radio<sqrt(tmpsqrt) ){
+                                       *ptr=0;
+                                       
+                               }
+                               
+                       }
+               }
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::redondear3(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+
+       double tmpsqrt;
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+               for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                       for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               tmpsqrt=(i2*i2)+(j2*j2)+(k2*k2);
+                               if( radio<sqrt(tmpsqrt) ){
+                                       *ptr=255;
+                                       
+                               }
+                               
+                       }
+               }
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::distancia(double a[3], double b[3] )
+{
+       double tmpsqrt=((a[0]-b[0])*(a[0]-b[0]))+((a[1]-b[1])*(a[1]-b[1]))+((a[2]-b[2])*(a[2]-b[2]));
+       return sqrt(tmpsqrt);
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::distancia(int a[3], int b[3] )
+{
+       double tmpsqrt=((a[0]-b[0])*(a[0]-b[0]))+((a[1]-b[1])*(a[1]-b[1]))+((a[2]-b[2])*(a[2]-b[2]));
+       return sqrt(tmpsqrt);
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::blanquear(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k;
+       
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               *ptr=0;
+                       }
+               }
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::blanquear3(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k;
+       
+       data->GetExtent(ext);
+
+       double *ptr;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(double *)  data->GetScalarPointer(i,j,k);
+                               *ptr=0;
+                       }
+               }
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::blanquear2(vtkImageData *data )
+{
+       int ext[6];
+       int centro[3];
+       int i, j, k;
+       
+       data->GetExtent(ext);
+
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+
+       unsigned char *ptr;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               if(i==centro[0] && j==centro[1] && k==centro[2]){
+                                       *ptr=255;
+                               }
+                               else{
+                                       *ptr=0;
+                               }
+                       }
+               }
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::cilindro(vtkImageData *data, double vector[3] )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+       int centro[3];
+       int punto[3];   
+       double centrof[3];
+       double puntof[3];
+       double radiof;
+       double puntof2[3];
+       
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+       radiof=espprin[0]*(((double)ext[1]-(double)ext[0])/4);
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+
+       indextoreal(centro, centrof );
+       
+       if(vector[0]==0 && vector[1]==0 && vector[2]==0){
+               blanquear2(data);
+       }
+       else{
+               puntof2[0]=centrof[0]+vector[0];
+               puntof2[1]=centrof[1]+vector[1];
+               puntof2[2]=centrof[2]+vector[2];
+
+               double tmpsqrt;
+               for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                       punto[0]=i;
+                                       punto[1]=j;
+                                       punto[2]=k;
+                                       indextoreal(punto, puntof );
+                                       tmpsqrt = (i2*i2)+(j2*j2)+(k2*k2);
+                                       if( radio<sqrt(tmpsqrt) ){
+                                               *ptr=0;
+                                               
+                                       }
+                                       else if(radiof<distanciaejepunto(puntof, centrof, puntof2)){
+                                               *ptr=0;
+                                       }
+                                       else{
+                                               *ptr=255;
+                                       }                                       
+                               }
+                       }
+               }
+       }
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::modelo(vtkImageData *data, unsigned char cantidad,  unsigned long vector[50][4], int candit[10][3], double radioactual, double minis[10])
+{
+       int ext[6];
+       int i, j, k, radio, radio2;
+       int i2, j2, k2;
+       int t;
+       int centro[3];
+       int punto[3];
+       int punto2[3];
+       double centrof[3];
+       double puntof[3];
+       double radiof;
+       double puntof2[3];
+
+       double dist, prop, rest;
+       
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+       radio2=(int)radioactual;
+       
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+
+       indextoreal(centro, centrof );
+       
+       double tmpsqrt;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               punto[0]=i;
+                               punto[1]=j;
+                               punto[2]=k;
+                               
+                               if( radioactual<distancia(punto, centro) ){
+                                       *ptr=0;                                         
+                               }
+                               else{
+                                       *ptr=255;
+                                       
+                               }
+                       }
+               }
+       }
+
+       for(t=0;t<cantidad;t++){
+               radiof=sqrt(minis[t]);
+
+               punto2[0]=candit[t][0];
+               punto2[1]=candit[t][1];
+               punto2[2]=candit[t][2];
+
+               indextoreal(punto2, puntof2 );
+       
+
+               for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                       punto[0]=i;
+                                       punto[1]=j;
+                                       punto[2]=k;
+                                       indextoreal(punto, puntof );
+
+                                       dist=distanciaejepunto(puntof, centrof, puntof2);
+                                       prop=proporcioejepunto(puntof, centrof, puntof2);
+
+                                       if(prop>=0 && prop<=1){
+                                               rest=(radiof-radioactual)*prop+radioactual;
+                                               rest=rest+0.25;
+                                               rest=rest*espprin[0];
+                                       }
+                                       else{
+                                               rest=dist-1;
+                                       }
+                                       tmpsqrt = (i2*i2)+(j2*j2)+(k2*k2);
+                                       if( radio>sqrt(tmpsqrt) && rest>dist){
+                                               *ptr=255;
+                                       }                                       
+                               }
+                       }
+               }
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::comparacion(vtkImageData *data, vtkImageData *data2, unsigned long minis[4])
+{
+       int ext[6];
+       int i, j, k;
+       double radio;
+       
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+       unsigned char *ptr2;
+
+       
+       minis[0]=0;
+       minis[1]=0;
+       minis[2]=0;
+       minis[3]=0;
+
+       int centro[3];
+       int punto[3];
+       
+       radio=((double)ext[1]-(double)ext[0])/2;
+       
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+       
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+
+                               punto[0]=i;
+                               punto[1]=j;
+                               punto[2]=k;
+                               
+                               if( radio>distancia(punto, centro) ){
+                                                                       
+                                       if( *ptr==0 && *ptr2==0 ){
+                                               minis[0]++;                                             
+                                       }
+                                       else if( *ptr!=0 && *ptr2!=0 ){
+                                               minis[1]++;                                             
+                                       }
+                                       else if(*ptr==0 && *ptr2!=0){
+                                               minis[2]++;                                             
+                                       }
+                                       else{
+                                               minis[3]++;                                             
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::copiar(vtkImageData *data, vtkImageData *data2 )
+{
+       int ext[6];
+       int i, j, k;
+       
+       data->GetExtent(ext);
+
+       unsigned char *ptr, *ptr2;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                               ptr2=(unsigned char *)  data2->GetScalarPointer(i,j,k);
+                               if(*ptr!=0 && *ptr2==0){
+                                       *ptr2=*ptr;
+                               }
+                       }
+               }
+       }
+
+       data2->Modified();
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::copiar2(vtkImageData *data, vtkImageData *data2 )
+{
+       int ext[6];
+       int i, j, k;
+       
+       data->GetExtent(ext);
+
+       double *ptr, *ptr2;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(double *)  data->GetScalarPointer(i,j,k);
+                               ptr2=(double *) data2->GetScalarPointer(i,j,k);
+                               if(*ptr!=0 && *ptr2==0){
+                                       *ptr2=*ptr;
+                               }
+                       }
+               }
+       }
+
+       data2->Modified();
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::angulo(double a[3], double b[3] )
+{
+       double m1=sqrt((a[0]*a[0])+(a[1]*a[1])+(a[2]*a[2]));
+       double m2=sqrt((b[0]*b[0])+(b[1]*b[1])+(b[2]*b[2]));
+       double res=(acos(((a[0]*b[0])+(a[1]*b[1])+(a[2]*b[2]))/(m1*m2))*180)/3.1415;
+
+       if(res<0){
+               res=-res;
+       }
+
+       if(res>=0 && res<90){
+               res=res;
+       }
+       else if(res>=90 && res<180){
+               res=180-res;
+       }
+       else if(res>=180 && res<270){
+               res=res-180;
+       }
+       else{
+               res=360-res;
+       }
+       
+       return res;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::angulo(double i1, double j1, double k1, double i2, double j2, double k2 )
+{
+       double m1=sqrt((i1*i1)+(j1*j1)+(k1*k1));
+       double m2=sqrt((i2*i2)+(j2*j2)+(k2*k2));
+       double res=(acos(((i1*i2)+(j1*j2)+(k1*k2))/(m1*m2))*180)/3.1415;
+
+       if(res<0){
+               res=-res;
+       }
+
+       if(res>=0 && res<90){
+               res=res;
+       }
+       else if(res>=90 && res<180){
+               res=180-res;
+       }
+       else if(res>=180 && res<270){
+               res=res-180;
+       }
+       else{
+               res=360-res;
+       }
+       
+       return res;
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::envolumen(int a[3], vtkImageData *datae )
+{
+       
+       int res;
+
+       unsigned short *ptr;
+
+       ptr=(unsigned short *)  datae->GetScalarPointer(a);
+
+       if(*ptr==0){
+               res=0;
+       }
+       else{
+               res=1;
+       }
+       
+       return res;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::mincandit(int candit[10][3], int cantidad, double puntoanterior[3])
+{
+       double distentpu;
+       double distmientrp;
+       int     inminenpu=0;
+
+       double canditreal[3];
+       int i;
+       
+
+       distmientrp=64000;
+       inminenpu=0;
+
+       for(i=0;i<cantidad && i<10;i++){
+               indextoreal(candit[i], canditreal);
+               distentpu=distancia(canditreal, puntoanterior);
+               if(distentpu<distmientrp){
+                       distmientrp=distentpu;
+                       inminenpu=i;
+               }
+       }
+
+       return inminenpu;
+
+}
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::maxareacandit(unsigned long vector[50][4], int cantidad)
+{
+       
+       unsigned long max;
+       int i;
+       int indmax=0;
+       
+
+       max=0;
+
+       for(i=0;i<cantidad && i<10;i++){
+               if(max<vector[i][0]){
+                       max=vector[i][0];
+                       indmax=i;
+               }
+       }
+
+       return indmax;
+
+}
+
+
+
+
+//----------------------------------------------------------------------------
+unsigned long axisExtractor02::totalarea(unsigned long vector[50][4], unsigned long vectorb[50][4], int cantidad, int cantidadb)
+{
+       
+       unsigned long area;
+       int i;
+       
+       area=0;
+
+       for(i=0;i<cantidad && i<10;i++){
+               area+=vector[i][0];
+       }
+
+       for(i=0;i<cantidadb;i++){
+               area+=vectorb[i][0];
+       }
+
+       return area;
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+unsigned long axisExtractor02::conecarea(unsigned long vector[50][4], int cantidad)
+{
+       
+       unsigned long area;
+       int i;
+       
+       area=0;
+
+       for(i=0;i<cantidad && i<10;i++){
+               area+=vector[i][0];
+       }
+
+       return area;
+}
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+int axisExtractor02::bruled(int candit[10][3], int cantidad, vtkImageData *data4)
+{
+       int i;
+       int burned;
+       
+       burned=0;
+       for(i=0;i<cantidad && i<10;i++){
+               if(envolumen(candit[i], data4)!=0){
+                       burned++;
+               }
+       }
+
+       return burned;
+}
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::correction(int candit[10][3], int cantidad, vtkImageData *data, int indicecorregido[3], double puntocorregido[3], int indiceanterior[3], double radioanterior, int indicepre[3], double radiopre)
+{
+       
+       
+       int rap;
+       int punto[3];
+       double puntof[3];
+       double puntof2[3];
+       double centrof[3];
+       double radiof;
+       double maxcent;
+       double mincent;
+       double distcorr;
+       double distcorr2;
+       double distcorr3;
+       double dist;
+       double prop;
+       double rest;
+       double *ptr;
+       int ext[6];
+       int i, j, k, radio;
+       int centro[3];
+       
+       data->GetExtent(ext);
+       
+       radio=(ext[1]-ext[0])/2;
+       radiof=((double)ext[1]-(double)ext[0])/2;
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+
+       indicecorregido[0]=centro[0];
+       indicecorregido[1]=centro[1];
+       indicecorregido[2]=centro[2];
+       indextoreal(indicecorregido, puntocorregido);
+       indextoreal(indiceanterior, centrof);
+       indextoreal(indicepre, puntof2);
+               
+       rap= (int)( (double)radio/2 );
+       maxcent=0;
+       mincent=64000;
+
+       for(i=ext[0];i<=ext[1];i++){
+               for(j=ext[2];j<=ext[3];j++){
+                       for(k=ext[4];k<=ext[5];k++){
+                               ptr=(double *)  data->GetScalarPointer(i,j,k);
+                               punto[0]=i;
+                               punto[1]=j;
+                               punto[2]=k;
+                               indextoreal(punto, puntof );
+
+                               distcorr3=distancia(indiceanterior, indicepre);
+                               distcorr2=distancia(punto, indicepre);
+                               distcorr=distancia(punto, indiceanterior);
+
+                               dist=distanciaejepunto(puntof, centrof, puntof2);
+                               prop=proporcioejepunto(puntof, centrof, puntof2);
+
+                               if(prop>=0 && prop<=1){
+                                       rest=(radiopre-radioanterior)*prop+radioanterior;
+                                       rest=rest*espprin[0];
+                               }
+                               else{
+                                       rest=dist-1;
+                               }
+                                                       
+                               if( radioanterior<distcorr && distcorr3>=distcorr && distcorr2<distcorr3 && distcorr+radio>distcorr3+1 && distcorr-radio<distcorr3-1 && rest>dist){
+                               //if( radioanterior<distcorr && distcorr3>=distcorr && distcorr2<distcorr3 && distcorr+radio>distcorr3+1 && distcorr-radio<distcorr3-1 && rest>dist){
+                               //if( radioanterior<distcorr && distcorr3>=distcorr && distcorr2<distcorr3 && distcorr+radio>distcorr3+1 && distcorr-radio<distcorr3-1 && distcorr2<=distcorr3-radioanterior){
+                                       if( maxcent<*ptr){
+                                                       mincent=distcorr;
+                                                       maxcent=*ptr;
+                                                       indicecorregido[0]=i;
+                                                       indicecorregido[1]=j;
+                                                       indicecorregido[2]=k;
+                                                       indextoreal(indicecorregido, puntocorregido);
+                                       }
+                                       else if( maxcent==*ptr){
+                                               if( mincent>distcorr){
+                                                       mincent=distcorr;
+                                                       maxcent=*ptr;
+                                                       indicecorregido[0]=i;
+                                                       indicecorregido[1]=j;
+                                                       indicecorregido[2]=k;
+                                                       indextoreal(indicecorregido, puntocorregido);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       ptr=(double *)  data->GetScalarPointer(centro[0],centro[1],centro[2]);
+
+       return sqrt(*ptr);
+}
+
+
+
+
+//----------------------------------------------------------------------------
+double axisExtractor02::correction2(int candit[10][3], int cantidad, vtkImageData *data, int indicecorregido[3], double puntocorregido[3], int indiceanterior[3], double radioanterior)
+{
+       
+       
+       int rap;
+       int punto[3];
+       double maxcent;
+       double mincent;
+       double distcorr;
+       double distcorr2;
+       double *ptr;
+       int ext[6];
+       int i, j, k, radio;
+       int centro[3];
+       
+       data->GetExtent(ext);
+       
+       radio=(ext[1]-ext[0])/2;
+       centro[0]=(ext[1]+ext[0])/2;
+       centro[1]=(ext[3]+ext[2])/2;
+       centro[2]=(ext[5]+ext[4])/2;
+
+       indicecorregido[0]=centro[0];
+       indicecorregido[1]=centro[1];
+       indicecorregido[2]=centro[2];
+       indextoreal(indicecorregido, puntocorregido);
+               
+       rap= (int)((double)radio/2);
+       maxcent=0;
+       mincent=64000;
+
+       for(i=centro[0]-rap;i<=centro[0]+rap;i++){
+               for(j=centro[1]-rap;j<=centro[1]+rap;j++){
+                       for(k=centro[2]-rap;k<=centro[2]+rap;k++){
+                               ptr=(double *)  data->GetScalarPointer(i,j,k);
+                               punto[0]=i;
+                               punto[1]=j;
+                               punto[2]=k;
+
+                               distcorr2=distancia(punto, centro);
+                               distcorr=distancia(punto, indiceanterior);
+                               
+                               if( rap>distcorr2 ){
+                                       if( maxcent<*ptr){
+                                                       mincent=distcorr;
+                                                       maxcent=*ptr;
+                                                       indicecorregido[0]=i;
+                                                       indicecorregido[1]=j;
+                                                       indicecorregido[2]=k;
+                                                       indextoreal(indicecorregido, puntocorregido);
+                                       }
+                                       else if( maxcent==*ptr){
+                                               if( mincent>distcorr){
+                                                       mincent=distcorr;
+                                                       maxcent=*ptr;
+                                                       indicecorregido[0]=i;
+                                                       indicecorregido[1]=j;
+                                                       indicecorregido[2]=k;
+                                                       indextoreal(indicecorregido, puntocorregido);
+                                               }
+                                               
+                                       }
+                               }
+                               
+                       }
+               }
+       }
+
+       return sqrt(maxcent);
+}
+
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::avanzar()
+{
+       
+       double puntoactual[3];
+       double puntocorregido[3];       
+       double puntoanterior[3];        
+       double puntosiguiente[3];
+       //double puntointer[3];
+       double puntopre[3];
+
+       int indiceactual[3];
+       int indiceanterior[3];
+       int indicecorregido[3];
+       //int indiceinter[3];
+       int indicepre[3];
+       double radioactual;
+       double dirant[3];
+               
+       unsigned char cantidad;
+       unsigned char cantidadb;
+
+       unsigned long vector[50][4];
+       unsigned long vectorb[50][4];
+
+       int vectortemp[3];
+       double tempc;
+       
+       int extint[6];
+       
+       int extintreal[6];
+               
+       int indexp;
+       
+       double provvc[3];
+       
+       int radiotrabajo;
+       
+       int flag =0;
+       int flag2 =0;
+       int flag3 =0;
+       int flag4 =0;
+       int flag5 =0;
+       int flag6 =0;
+       int flag7 =0;
+       int flag8 =0;
+       int flag9 =0;
+       int flag10 =0;
+       int flag11 =0;
+       int flag12 =0;
+       int flag13 =0;
+       int flag14 =0;
+       int flag15 =0;
+       int flag16 =0;
+       int flag17 =0;
+       int flag18 =0;
+       int flag19 =0;
+       int flag20 =0;
+       int flag21 =0;
+       int flag22 =0;
+
+       int i, j;
+       
+       double radiotrabajof;
+
+       double proprad=2;
+       
+       double radiopred;
+       double radioanterior;
+       double radioprinc;
+
+       int burned;
+       
+       int indant;
+       double canditreal[3];
+       int indmaxarea;
+       unsigned long totalsurf;
+       unsigned long conecsurf;
+
+       indmaxarea=0;
+       unsigned long caf[4];
+
+       double rel1;
+       double rel2;
+       double rel3;
+       double rel4;
+       double rel5;
+       double rel6;
+
+       if(!m_Stack0.empty()){
+
+       
+       /*      indexp=m_Stack.top();
+
+               puntoactual[0]=m_Stack0.top();
+               puntoactual[1]=m_Stack1.top();
+               puntoactual[2]=m_Stack2.top();
+
+               puntoanterior[0]=m_Stack3.top();
+               puntoanterior[1]=m_Stack4.top();
+               puntoanterior[2]=m_Stack5.top();
+
+               puntopre[0]=m_Stack6.top();
+               puntopre[1]=m_Stack7.top();
+               puntopre[2]=m_Stack8.top();
+
+               
+
+               radiopred=m_Stackr.top();
+               radioanterior=m_Stackra.top();
+               radioprinc=m_Stackrp.top();*/
+
+               indexp=m_Stack.front();
+
+               puntoactual[0]=m_Stack0.front();
+               puntoactual[1]=m_Stack1.front();
+               puntoactual[2]=m_Stack2.front();
+
+               puntoanterior[0]=m_Stack3.front();
+               puntoanterior[1]=m_Stack4.front();
+               puntoanterior[2]=m_Stack5.front();
+
+               puntopre[0]=m_Stack6.front();
+               puntopre[1]=m_Stack7.front();
+               puntopre[2]=m_Stack8.front();
+
+               radiopred=m_Stackr.front();
+               radioanterior=m_Stackra.front();
+               radioprinc=m_Stackrp.front();
+                               
+               radiotrabajo= (int) (proprad*radiopred);
+               radiotrabajof=proprad*radiopred;
+
+               if(radiotrabajof-radiotrabajo>0.5){
+                       radiotrabajo=radiotrabajo+1;
+               }
+
+// EED 15 Mai 2007 .NET 
+//             radiotrabajo=max(minant,radiotrabajo);
+               if (minant>radiotrabajo)
+               {
+                       radiotrabajo=minant;
+               }
+
+               /*m_Stack0.pop();
+               m_Stack1.pop();
+               m_Stack2.pop();
+               m_Stack3.pop();
+               m_Stack4.pop();
+               m_Stack5.pop();
+               m_Stack6.pop();
+               m_Stack7.pop();
+               m_Stack8.pop();
+               
+               m_Stack.pop();
+               m_Stackr.pop();
+               m_Stackra.pop();
+               m_Stackrp.pop();*/
+
+               m_Stack0.pop_front();
+               m_Stack1.pop_front();
+               m_Stack2.pop_front();
+               m_Stack3.pop_front();
+               m_Stack4.pop_front();
+               m_Stack5.pop_front();
+               m_Stack6.pop_front();
+               m_Stack7.pop_front();
+               m_Stack8.pop_front();
+               
+               m_Stack.pop_front();
+               m_Stackr.pop_front();
+               m_Stackra.pop_front();
+               m_Stackrp.pop_front();
+
+               dirant[0]=puntoanterior[0]-puntoactual[0];
+               dirant[1]=puntoanterior[1]-puntoactual[1];
+               dirant[2]=puntoanterior[2]-puntoactual[2];
+
+               
+               realtoindex(puntoactual, indiceactual);
+               realtoindex(puntoanterior, indiceanterior);
+               realtoindex(puntopre, indicepre);
+
+               radioactual=radiopred;
+               
+               if(radiotrabajo<=maxant){
+                       
+                       extint[0]=indiceactual[0]-radiotrabajo;
+                       extint[1]=indiceactual[0]+radiotrabajo;
+                       extint[2]=indiceactual[1]-radiotrabajo;
+                       extint[3]=indiceactual[1]+radiotrabajo;
+                       extint[4]=indiceactual[2]-radiotrabajo;
+                       extint[5]=indiceactual[2]+radiotrabajo;
+
+                       extrac->SetVOI(extint);
+                       extrac->UpdateWholeExtent();
+                       extrac->Update();
+                       extrac->GetOutput()->GetExtent(extintreal);
+
+                       if(extint[0]!=extintreal[0] || extint[1]!=extintreal[1] || extint[2]!=extintreal[2] || extint[3]!=extintreal[3] || extint[4]!=extintreal[4] || extint[5]!=extintreal[5]){
+                               fprintf(stream, "salio\t");
+                               flag4 =1;       
+                       }
+                       else{
+                               
+                               data1->Delete();
+                               data1=vtkImageData::New();
+                               data1->SetScalarTypeToUnsignedChar();
+                               data1->SetExtent(extrac->GetOutput()->GetExtent());
+                               data1->SetSpacing(extrac->GetOutput()->GetSpacing());
+
+                               cilindro(data1, dirant );
+                               
+                               optim(extrac->GetOutput(), data1 );
+
+                               connect->SetInput(data1);
+                               connect->RemoveAllSeeds();
+                               connect->AddSeed(indiceactual[0],indiceactual[1],indiceactual[2]);
+                               connect->UpdateWholeExtent();
+                               connect->Update();
+                                                       
+                               data2->Delete();
+                               data2=vtkImageData::New();
+                               data2->SetScalarTypeToUnsignedChar();
+                               data2->SetExtent(connect->GetOutput()->GetExtent());
+                               data2->SetSpacing(connect->GetOutput()->GetSpacing());
+
+                               blanquear(data2);
+                               
+                               cantidad=find_components(connect->GetOutput(), data2, 0, vector);
+
+                               data3->Delete();
+                               data3=vtkImageData::New();
+                               data3->SetScalarTypeToUnsignedChar();
+                               data3->SetExtent(connect->GetOutput()->GetExtent());
+                               data3->SetSpacing(connect->GetOutput()->GetSpacing());
+                               
+                               blanquear(data3);
+
+                               cantidadb=find_componentsb(connect->GetOutput(), data3, 0, vectorb);
+
+                               redondear3(connect->GetOutput());
+
+                               distance->Update();
+
+                               redondear2(distance->GetOutput());
+
+                               redondear(connect->GetOutput());
+                       
+                               costominimo(distance->GetOutput(), data2);
+                               
+                               
+                               if(buenos==0){
+                                       radioactual=correction2(candit, cantidad, distance->GetOutput(),  indicecorregido,  puntocorregido, indiceanterior, radioanterior);
+                               }
+                               else{
+                                       radioactual=correction(candit, cantidad, distance->GetOutput(),  indicecorregido,  puntocorregido, indiceanterior, radioanterior, indicepre, radioprinc);
+                               }
+
+
+                               //inpeq(extrac->GetOutput(), indicecorregido, radioactual);
+                                                               
+                               indant=mincandit(candit, cantidad, puntoanterior);
+
+                               indmaxarea=maxareacandit(vector, cantidad);
+                               totalsurf=totalarea(vector, vectorb, cantidad, cantidadb);
+                               conecsurf=conecarea(vector, cantidad);
+                               
+                               indextoreal(candit[indant], canditreal);
+
+                               burned=bruled(candit, cantidad, data4);
+                                                               
+                               data6->Delete();
+                               data6=vtkImageData::New();
+                               data6->SetScalarTypeToUnsignedChar();
+                               data6->SetExtent(extrac->GetOutput()->GetExtent());
+                               data6->SetSpacing(extrac->GetOutput()->GetSpacing());
+
+                               modelo(data6, cantidad,  vector, candit, radioactual, minis);
+                               comparacion(connect->GetOutput(), data6, caf);
+
+                               rel1=((double)caf[0]+(double)caf[1])/((double)caf[0]+(double)caf[1]+(double)caf[2]+(double)caf[3]);
+                               rel2=((double)caf[1])/((double)caf[1]+(double)caf[3]);
+                               rel3=((double)caf[1])/((double)caf[1]+(double)caf[2]);
+                               rel4=(double)conecsurf/(double)totalsurf;
+                               rel5=(double)vector[indmaxarea][0]/(double)totalsurf;
+                               rel6=(double)cant/((double)cant+(double)cant2);
+                                                                               
+                                       
+                               if(rel1<0.5 || rel2<0.5 || rel3<0.5 || (rel1<0.75 && rel2<0.75) || (rel2<0.75 && rel3<0.75)|| (rel1<0.75 && rel3<0.75)){
+                                       flag5=1;
+                               }                                                                       
+                               
+                               if(indicecorregido[0]!=indiceactual[0] || indicecorregido[1]!=indiceactual[1] || indicecorregido[2]!=indiceactual[2]){
+                                       flag7=1;
+                               }
+
+                               if(burned>=cantidad ){
+                                       flag15=1;
+                               }
+
+                               if(burned==0 ){
+                                       flag16=1;
+                               }
+
+                               if(cantidad<2 ){
+                                       flag17=1;
+                               }
+
+                               if(flag7==1 && flagg>4){
+                                       flag7=0;
+                               }
+
+                               if(buenos==0){
+                                       flag19=1;
+                               }
+
+                               if(mejordst!=0){
+                                       flag18=1;
+                               }
+
+                               if(flag7==1 && flag18==1){
+                                       for(i=0;i<flagg;i++){
+                                               if(visited[i][0]==indiceactual[0] && visited[i][1]==indiceactual[1] && visited[i][2]==indiceactual[2] && visitedrad[i]==radiopred){
+                                                       flag2=1;
+                                               }
+                                       }
+                               }
+                               
+                               if((flag19==1 && flagg2<5) || (flag19==1 && flagg2<10 && ( rel4>0.25 || rel5>0.13 || rel6>0.4 || flag17==1  || flag15==1 || flag5==1) ) || (flagg2<10 && ( ((rel4>0.25 || rel5>0.25 || rel6>0.4) && cantidad<3) || flag17==1  || flag15==1 || flag5==1) )){
+                                               flag8=1;
+                               }
+
+                               if(centi<centi2){
+                                       flag3=1;
+                               }
+
+                               if(angulo(dirant[0], dirant[1], dirant[2], canditreal[0]-puntoactual[0], canditreal[1]-puntoactual[1], canditreal[2]-puntoactual[2] )>65){
+                                       flag11=1;
+                               }
+
+                               if(angulo(Vp[0][ejeminp], Vp[1][ejeminp], Vp[2][ejeminp], Vi[0][ejemini], Vi[1][ejemini], Vi[2][ejemini] )>60){
+                                       flag6=1;
+                               }
+
+                               if((flag3==1 || flag5==1 || (flag16==1 && flag11==1 && flag19==0)  ) && (flag7==0 && flag8==0)){
+                                       flag9=1;
+                                       //fprintf(stream, "malo\t");
+                               }
+
+                               if(flag3==1 || flag5==1 || (flag16==1 && flag11==1 && flag19==0)  ){
+                                       flag20=1;
+                               }
+                       
+                               if((mejordst<radioactual || (mejordst==radioactual && mejorrad>radiopred) || (mejordst==radioactual && mejorrad<=radiopred && mejorcant<cantidad )) && flag17==0 && flag20==0 && flag4==0 && flag12==0 && flag15==0 ){
+                                       mejordst=radioactual;
+                                       mejor[0]=puntoactual[0];
+                                       mejor[1]=puntoactual[1];
+                                       mejor[2]=puntoactual[2];
+                                       mejorrad=radiopred;
+                                       mejorcant=cantidad;
+                               }
+                       }
+               }
+               else{
+                       fprintf(stream, "grande\t");
+                       flag12 =1;      
+               }
+
+               if(mejordst!=0){
+                       flag18=1;
+               }
+
+               if(flagg>4){
+                       flag13=1;
+               }
+
+               if(flagg2>4){
+                       flag14=1;
+               }
+
+               if( flag9==1 || flag4==1 || flag12==1 || ((cantidad<2 || burned==cantidad) && (flag7==0 && flag8==0)) ){
+                       frama=1;
+               }
+               else{
+                       frama=0;
+               }
+
+               if( cantidad>2 && (flag7==0 && flag8==0) ){
+                       fseg=1;
+               }
+               else{
+                       fseg=0;
+               }
+               
+               if((flag7==0 && flag8==0 && (mejordst>radioactual || (mejordst==radioactual && mejorrad<radiopred)) && flag19==0) || flag2==1){
+                       
+                       flagg=10;
+                       flagg2=10;
+                       mejordst=0;
+                       
+                       fprintf(stream, "mejor\t");
+                                                                                                                       
+                       m_Stack0.push_front(mejor[0]);
+                       m_Stack1.push_front(mejor[1]);
+                       m_Stack2.push_front(mejor[2]);
+                       m_Stack3.push_front(puntoanterior[0]);
+                       m_Stack4.push_front(puntoanterior[1]);
+                       m_Stack5.push_front(puntoanterior[2]);
+                       m_Stack6.push_front(puntopre[0]);
+                       m_Stack7.push_front(puntopre[1]);
+                       m_Stack8.push_front(puntopre[2]);
+                       m_Stack.push_front(indexp);
+                       m_Stackr.push_front(mejorrad);
+                       m_Stackra.push_front(radioanterior);
+                       m_Stackrp.push_front(radioprinc);
+
+                       mejorrad=0;
+                       mejorcant=0;
+
+               }
+               
+               else if((flag17==1 || flag9==1 || flag4==1 || flag12==1 || flag15==1) && flag18==1){
+                       flagg=10;
+                       flagg2=10;
+                       mejordst=0;
+                       
+                       fprintf(stream, "descorrigio\t");
+                                                                                                                       
+                       m_Stack0.push_front(mejor[0]);
+                       m_Stack1.push_front(mejor[1]);
+                       m_Stack2.push_front(mejor[2]);
+                       m_Stack3.push_front(puntoanterior[0]);
+                       m_Stack4.push_front(puntoanterior[1]);
+                       m_Stack5.push_front(puntoanterior[2]);
+                       m_Stack6.push_front(puntopre[0]);
+                       m_Stack7.push_front(puntopre[1]);
+                       m_Stack8.push_front(puntopre[2]);
+                       m_Stack.push_front(indexp);
+                       m_Stackr.push_front(mejorrad);
+                       m_Stackra.push_front(radioanterior);
+                       m_Stackrp.push_front(radioprinc);
+
+                       mejorrad=0;
+                       mejorcant=0;
+
+               }
+
+               else if(flag12==0 && flag4==0 && flag9==0){
+                       if(flag7==0 && flag8==0){
+
+                               if(flag17==0 && flag15==0){
+                                       flagg=0;
+                                       flagg2=0;
+                                       mejordst=0;
+                                       mejorrad=0;
+                                       mejorcant=0;
+
+                                       fprintf(stream, "inserto\t");
+                               
+                                       if(flag19==0){
+                                               /*costominimo2(distance->GetOutput(), connect->GetOutput(), indiceactual, candit[indant], indiceinter);
+                                               indextoreal(indiceinter, puntointer);
+                                               realtoreal2(puntointer, provvc);
+                                               points->InsertPoint(buenos,provvc);
+
+                                               lineas->InsertNextCell(2);
+                                               lineas->InsertCellPoint(indexp);
+                                               lineas->InsertCellPoint(buenos);
+                                               
+                                               buenos++;
+
+                                               realtoreal2(puntoactual, provvc);
+                                               points->InsertPoint(buenos,provvc);
+                       
+                                               lineas->InsertNextCell(2);
+                                               lineas->InsertCellPoint(buenos-1);
+                                               lineas->InsertCellPoint(buenos);
+                                               
+                                               buenos++;*/
+
+                                               realtoreal2(puntoactual, provvc);
+                                               points->InsertPoint(buenos,provvc);
+                       
+                                               lineas->InsertNextCell(2);
+                                               lineas->InsertCellPoint(indexp);
+                                               lineas->InsertCellPoint(buenos);
+
+                                               buenos++;
+                                       
+                                       }
+                                       else{
+                                               realtoreal2(puntoactual, provvc);
+                                               points->InsertPoint(buenos,provvc);
+                                                                               
+                                               buenos++;
+                                       }
+
+                                       
+                               }
+                               else{
+                                       flagg=0;
+                                       flagg2=0;
+                                       mejordst=0;
+                                       mejorrad=0;
+                                       mejorcant=0;
+                                       fprintf(stream, "para\t");
+                               }
+                       }
+                       else if(flag7==0 && flag8==1){
+                               flagg2++;
+                               
+                               fprintf(stream, "agrando\t");
+
+                               m_Stack0.push_front(puntoactual[0]);
+                               m_Stack1.push_front(puntoactual[1]);
+                               m_Stack2.push_front(puntoactual[2]);
+                               m_Stack3.push_front(puntoanterior[0]);
+                               m_Stack4.push_front(puntoanterior[1]);
+                               m_Stack5.push_front(puntoanterior[2]);
+                               m_Stack6.push_front(puntopre[0]);
+                               m_Stack7.push_front(puntopre[1]);
+                               m_Stack8.push_front(puntopre[2]);
+
+                               m_Stack.push_front(indexp);
+                               m_Stackr.push_front(((double)radiotrabajo+1)/2);
+                               m_Stackra.push_front(radioanterior);
+                               m_Stackrp.push_front(radioprinc);
+               
+                       }
+                       else if(flag7==1 && flag8==1){
+                               visited[flagg][0]=indiceactual[0];
+                               visited[flagg][1]=indiceactual[1];
+                               visited[flagg][2]=indiceactual[2];
+                               visitedrad[flagg]=radiopred;
+                               flagg++;
+                               flagg2++;
+                               
+                               fprintf(stream, "agrando y corrigiendo\t");
+
+                               m_Stack0.push_front(puntocorregido[0]);
+                               m_Stack1.push_front(puntocorregido[1]);
+                               m_Stack2.push_front(puntocorregido[2]);
+                               m_Stack3.push_front(puntoanterior[0]);
+                               m_Stack4.push_front(puntoanterior[1]);
+                               m_Stack5.push_front(puntoanterior[2]);
+                               m_Stack6.push_front(puntopre[0]);
+                               m_Stack7.push_front(puntopre[1]);
+                               m_Stack8.push_front(puntopre[2]);
+
+                               m_Stack.push_front(indexp);
+                               m_Stackr.push_front(((double)radiotrabajo+1)/2);
+                               m_Stackra.push_front(radioanterior);
+                               m_Stackrp.push_front(radioprinc);
+                       }
+                       else{
+                               visited[flagg][0]=indiceactual[0];
+                               visited[flagg][1]=indiceactual[1];
+                               visited[flagg][2]=indiceactual[2];
+                               visitedrad[flagg]=radiopred;
+                               flagg++;
+                               
+                               if(flag19==1){
+                                       flagg=10;
+                               }
+
+                               fprintf(stream, "corrigio\t");
+                                                                                                                       
+                               m_Stack0.push_front(puntocorregido[0]);
+                               m_Stack1.push_front(puntocorregido[1]);
+                               m_Stack2.push_front(puntocorregido[2]);
+                               m_Stack3.push_front(puntoanterior[0]);
+                               m_Stack4.push_front(puntoanterior[1]);
+                               m_Stack5.push_front(puntoanterior[2]);
+
+                               m_Stack6.push_front(puntopre[0]);
+                               m_Stack7.push_front(puntopre[1]);
+                               m_Stack8.push_front(puntopre[2]);
+
+                               m_Stack.push_front(indexp);
+                               m_Stackr.push_front(radiopred);
+                               m_Stackra.push_front(radioanterior);
+                               m_Stackrp.push_front(radioprinc);
+
+                               
+                       }
+                               
+                       if(flag7==0 && flag8==0){
+                                       
+                               if(flag17==0 && flag15==0){
+                               
+                                       for(i=0;i<cantidad && i<10;i++){
+                                               for(j=i;j<cantidad && i<10;j++){
+                                                       if(minis[j]>minis[i]){
+                                                               vectortemp[0]=candit[i][0];
+                                                               vectortemp[1]=candit[i][1];
+                                                               vectortemp[2]=candit[i][2];
+                                                               tempc=minis[i];
+                                                               
+                                                               candit[i][0]=candit[j][0];
+                                                               candit[i][1]=candit[j][1];
+                                                               candit[i][2]=candit[j][2];
+                                                               minis[i]=minis[j];
+                                                               
+                                                               candit[j][0]=vectortemp[0];
+                                                               candit[j][1]=vectortemp[1];
+                                                               candit[j][2]=vectortemp[2];
+                                                               minis[j]=tempc;
+                                                       }
+                                               }
+                                       }
+                                       
+       
+                                       if(flag16==1){
+                                               for(i=0;i<cantidad && i<10;i++){
+                                                       if(i!=indant || buenos<2){
+                                                               indextoreal(candit[i], puntosiguiente);
+                                                                               
+                                                               m_Stack0.push_front(puntosiguiente[0]);
+                                                               m_Stack1.push_front(puntosiguiente[1]);
+                                                               m_Stack2.push_front(puntosiguiente[2]);
+                                                               m_Stack3.push_front(puntoactual[0]);
+                                                               m_Stack4.push_front(puntoactual[1]);
+                                                               m_Stack5.push_front(puntoactual[2]);
+                                                               
+                                                               m_Stack6.push_front(puntosiguiente[0]);
+                                                               m_Stack7.push_front(puntosiguiente[1]);
+                                                               m_Stack8.push_front(puntosiguiente[2]);
+                               
+                                                               double prov1a=sqrt(minis[i]);
+                                                               
+                                                               m_Stack.push_front(buenos-1);
+                                                               m_Stackr.push_front(prov1a);
+                                                               m_Stackra.push_front(radioactual);
+                                                               m_Stackrp.push_front(prov1a);
+                                                               
+                                                       }
+                                               }
+                                       }
+                                       else{
+                                               for(i=0;i<cantidad && i<10;i++){
+                                                       indextoreal(candit[i], puntosiguiente);
+                               
+                                                       if(envolumen(candit[i], data4)==0){
+                                                               m_Stack0.push_front(puntosiguiente[0]);
+                                                               m_Stack1.push_front(puntosiguiente[1]);
+                                                               m_Stack2.push_front(puntosiguiente[2]);
+                                                               m_Stack3.push_front(puntoactual[0]);
+                                                               m_Stack4.push_front(puntoactual[1]);
+                                                               m_Stack5.push_front(puntoactual[2]);
+                                                               
+                                                               m_Stack6.push_front(puntosiguiente[0]);
+                                                               m_Stack7.push_front(puntosiguiente[1]);
+                                                               m_Stack8.push_front(puntosiguiente[2]);
+                                                       
+                                                               double prov1b=sqrt(minis[i]);
+                                                               
+                                                               m_Stack.push_front(buenos-1);
+                                                               m_Stackr.push_front(prov1b);
+                                                               m_Stackra.push_front(radioactual);
+                                                               m_Stackrp.push_front(prov1b);
+                                                       }
+                                               }
+                                       }
+                               
+                                       copiar(connect->GetOutput(),  data4 );
+                                       //copiar2(distance->GetOutput(),  data5 );
+                               }                                               
+                       }
+               }
+               else{
+               //      fprintf(stream, "algo");
+                       mejordst=0;
+                       mejorrad=0;
+                       mejorcant=0;
+                       flagg=0;
+                       flagg2=0;
+                               
+               }
+
+               
+               
+               
+               /*
+               printf("wi[0]: %f\n", wi[0]);
+               printf("wi[1]: %f\n", wi[1]);
+               printf("wi[2]: %f\n", wi[2]);
+               
+               printf("inerciari: %f\n", inerciari);
+               printf("inerciariy: %f\n", inerciariy);
+               printf("inerciariz: %f\n", inerciariz);
+
+               printf("ri1: %f\n", inerciari/inerciariy);
+               printf("ri2: %f\n", inerciariy/inerciariz);
+               printf("ri3: %f\n", inerciari/inerciariz);
+
+               printf("inerciarp: %f\n", inerciarp);
+               printf("inerciarpy: %f\n", inerciarpy);
+               printf("inerciarpz: %f\n", inerciarpz);
+
+               printf("rp1: %f\n", inerciarp/inerciarpy);
+               printf("rp2: %f\n", inerciarpy/inerciarpz);
+               printf("rp3: %f\n", inerciarp/inerciarpz);
+
+               printf("angulo: %f\n",angulo(dirant[0], dirant[1], dirant[2], canditreal[0]-puntoactual[0], canditreal[1]-puntoactual[1], canditreal[2]-puntoactual[2] ));
+               printf("angulo2: %f\n", angulo(Vp[0][ejeminp], Vp[1][ejeminp], Vp[2][ejeminp], Vi[0][ejemini], Vi[1][ejemini], Vi[2][ejemini]));
+
+               printf("centi: %f\n", centi);
+               printf("centi2: %f\n", centi2);
+               */
+               
+
+
+               fprintf(stream, "%d\t", indexp);
+               fprintf(stream, "%d\t", buenos);
+               fprintf(stream, "%d\t", radiotrabajo);
+               fprintf(stream, "%f\t", radioactual);
+               fprintf(stream, "%f\t", radiopred);
+               fprintf(stream, "%f\t", radioanterior);
+               fprintf(stream, "%f\t", mejordst);
+               fprintf(stream, "%f\t", mejorrad);      
+               fprintf(stream, "%d\t", mejorcant);     
+               
+       
+               /*
+               fprintf(stream, "%d\t", cant);
+               fprintf(stream, "%d\t", cant2);
+               fprintf(stream, "%f\t", (double)cant/((double)cant+(double)cant2));
+               */      
+               
+               fprintf(stream, "%d\t", flag2);
+               fprintf(stream, "%d\t", flag3);
+               fprintf(stream, "%d\t", flag4);
+               fprintf(stream, "%d\t", flag5);
+               fprintf(stream, "%d\t", flag6);
+               fprintf(stream, "%d\t", flag7);
+               fprintf(stream, "%d\t", flag8);
+               fprintf(stream, "%d\t", flag9);
+               fprintf(stream, "%d\t", flag10);
+               fprintf(stream, "%d\t", flag11);
+               fprintf(stream, "%d\t", flag12);
+               fprintf(stream, "%d\t", flag13);
+               fprintf(stream, "%d\t", flag14);
+               fprintf(stream, "%d\t", flag15);
+               fprintf(stream, "%d\t", flag16);
+               fprintf(stream, "%d\t", flag17);
+               fprintf(stream, "%d\t", flag18);
+               fprintf(stream, "%d\t", flag19);
+               fprintf(stream, "%d\t", flag20);
+               fprintf(stream, "%d\t", flagg);
+               fprintf(stream, "%d\t", flagg2);
+               fprintf(stream, "%d\t", cantidad);
+               fprintf(stream, "%d\t", cantidadb);
+               fprintf(stream, "%d\t", burned);
+
+       
+               /*
+               fprintf(stream, "caf[0] %d\t", caf[0]);
+               fprintf(stream, "caf[1] %d\t", caf[1]);
+               fprintf(stream, "caf[2] %d\t", caf[2]);
+               fprintf(stream, "caf[3] %d\t", caf[3]);
+               fprintf(stream, "REL%f\t", ((double)caf[0]+(double)caf[1])/((double)caf[0]+(double)caf[1]+(double)caf[2]+(double)caf[3]));
+               fprintf(stream, "REL2%f\t", ((double)caf[1])/((double)caf[3]+(double)caf[1]));
+               fprintf(stream, "REL3%f\t", ((double)caf[1])/((double)caf[1]+(double)caf[2]));
+
+               fprintf(stream, "maxareacandit%d\t", vector[indmaxarea][0]);
+               fprintf(stream, "totalsurf%d\t", totalsurf);
+               fprintf(stream, "conecsurf%d\t", conecsurf);
+               fprintf(stream, "ratio%f\t", (double)conecsurf/(double)totalsurf);
+               fprintf(stream, "ratio2%f\t", (double)vector[indmaxarea][0]/(double)totalsurf);
+               */
+                       
+
+               fprintf(stream, "[%f, %f, %f]\t", puntoactual[0], puntoactual[1], puntoactual[2]);
+               fprintf(stream, "[%f, %f, %f]\t", puntoanterior[0], puntoanterior[1], puntoanterior[2]);
+               fprintf(stream, "[%f, %f, %f]\t", puntopre[0], puntopre[1], puntopre[2]);
+               fprintf(stream, "[%f, %f, %f]\t", mejor[0], mejor[1], mejor[2]);
+
+               fprintf(stream, "\n");
+
+       }
+       
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::todo()
+{
+       int i=0;
+
+       while( !m_Stack0.empty() && i<5000){
+               avanzar();
+               i++;
+       }
+}
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::paso()
+{
+
+       int i=0;
+       int inicio=buenos;
+
+       while( !m_Stack0.empty() && inicio==buenos && i<5000){
+               avanzar();
+               i++;
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::rama()
+{
+
+       int i=0;
+       frama=0;
+       
+       while( !m_Stack0.empty() && frama==0 && i<5000){
+               avanzar();
+               i++;
+       }
+}
+
+
+
+
+//----------------------------------------------------------------------------
+void axisExtractor02::segmento()
+{
+
+       int i=0;
+       fseg=0;
+       frama=0;
+       
+       while( !m_Stack0.empty() && frama==0 && fseg==0 && i<5000){
+               avanzar();
+               i++;
+       }
+}
+
+
diff --git a/lib/maracasVisuLib/src/kernel/axisExtractor02.h b/lib/maracasVisuLib/src/kernel/axisExtractor02.h
new file mode 100644 (file)
index 0000000..2eb0755
--- /dev/null
@@ -0,0 +1,385 @@
+/*=========================================================================
+
+  */
+
+#ifndef __axisExtractor02_h
+#define __axisExtractor02_h
+
+
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+#include "vtkPolyData.h"
+#include "vtkImageToStructuredPoints.h"
+#include "vtkImageEuclideanDistance.h"
+#include "vtkExtractVOI.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkImageReslice.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkImageResample.h"
+#include "vtkMath.h"
+#include "vtkPolyDataSource.h"
+#include "vtkImageConstantPad.h"
+
+
+#include <stack>
+#include <deque>
+#include <stdio.h>
+
+
+
+
+class  axisExtractor02 : public vtkPolyDataSource
+{
+public:
+       static axisExtractor02 *New();
+       void PrintSelf(ostream& os, vtkIndent indent);
+
+       virtual void SetInput(vtkImageData *input);
+       vtkImageData *GetInput();
+       vtkPolyData  *GetOutput();
+
+       void SetParam(double value);
+       double GetParam();
+
+       void SetParam2(double value);
+       double GetParam2();
+
+       void SetParam3(double value);
+       double GetParam3();
+
+
+       void SetMaxant(int value);
+       int GetMaxant();
+
+       void SetMinant(int value);
+       int GetMinant();
+
+       void SetPoint(double value[3]);
+       
+       vtkImageData *GetVolumen();
+
+       void distanciaejes(vtkPolyData *eje1,  vtkPolyData *eje2);
+
+       void blanquear(vtkImageData *data );
+
+       void copiar(vtkImageData *data, vtkImageData *data2 );
+
+       
+
+       
+
+
+
+
+       
+  
+  
+protected:  
+       axisExtractor02();
+       
+       ~axisExtractor02() {};
+
+       void Execute();
+  
+
+private:
+       axisExtractor02(const axisExtractor02&);  // Not implemented.
+
+       void operator=(const axisExtractor02&);  // Not implemented.
+
+       void realtoreal(double a[3], double b[3] );
+
+       void realtoreal2(double a[3], double b[3] );
+
+       void realtoindex(double a[3], int b[3] );
+
+       void indextoreal(int a[3], double b[3] );
+
+       void indextoreal(double a[3], double b[3] );
+
+       double distanciaejepunto(double point[3], double point2[3], double point3[3]);
+
+       double proporcioejepunto(double point[3], double point2[3], double point3[3]);
+
+       void searc(int i, int j, int k, vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] );
+
+       void searcb(int i, int j, int k, vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] );
+
+       unsigned char find_components(vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] );
+
+       unsigned char find_componentsb(vtkImageData *data, vtkImageData *data2, unsigned char label, unsigned long vector[50][4] );
+
+       int proporcion(vtkImageData *data );
+
+       bool border(vtkImageData *data, int p1[3] );
+
+       void optim(vtkImageData *data, vtkImageData *data2 );
+
+       void costominimo(vtkImageData *data,  vtkImageData *data2 );
+
+       void costominimo2(vtkImageData *data,  vtkImageData *data3, int p1[3], int p2[3], int p3[3]);
+
+       void invertir(vtkImageData *data );
+
+       void redondear(vtkImageData *data );
+
+       void redondear2(vtkImageData *data );
+
+       void redondear3(vtkImageData *data );
+
+       double distancia(double a[3], double b[3] );
+
+       double distancia(int a[3], int b[3] );
+
+       void blanquear3(vtkImageData *data );
+
+       void blanquear2(vtkImageData *data );
+
+       void cilindro(vtkImageData *data, double vector[3] );
+
+       void modelo(vtkImageData *data, unsigned char cantidad,  unsigned long vector[50][4], int candit[10][3], double radioactual, double minis[10]);
+
+       void comparacion(vtkImageData *data, vtkImageData *data2, unsigned long minis[4]);
+
+       void copiar2(vtkImageData *data, vtkImageData *data2 );
+
+       double angulo(double a[3], double b[3] );
+
+       double angulo(double i1, double j1, double k1, double i2, double j2, double k2 );
+
+       int envolumen(int a[3], vtkImageData *datae );
+
+       int mincandit(int candit[10][3], int cantidad, double puntoanterior[3]);
+
+       int maxareacandit(unsigned long vector[50][4], int cantidad);
+
+       unsigned long totalarea(unsigned long vector[50][4], unsigned long vectorb[50][4], int cantidad, int cantidadb);
+
+       unsigned long conecarea(unsigned long vector[50][4], int cantidad);
+
+       int bruled(int candit[10][3], int cantidad, vtkImageData *data4);
+
+       double correction(int candit[10][3], int cantidad, vtkImageData *data, int indicecorregido[3], double puntocorregido[3], int indiceanterior[3], double radioanterior, int indicepre[3], double radiopre);
+
+       double correction2(int candit[10][3], int cantidad, vtkImageData *data, int indicecorregido[3], double puntocorregido[3], int indiceanterior[3], double radioanterior);
+
+       void avanzar();
+
+       void todo();
+
+       void paso();
+
+       void rama();
+
+       void segmento();
+
+       
+
+       int extprin0[6];
+       double espprin[3];
+       int extprin[6];
+       
+
+               
+       
+       vtkImageEuclideanDistance *distance;
+       vtkExtractVOI *extrac;
+       vtkImageSeedConnectivity *connect;
+       vtkImageResample *resample;
+       
+
+       vtkImageData *data1;
+       vtkImageData *data2;
+       vtkImageData *data3;
+       vtkImageData *data4;
+       vtkImageData *data6;
+       
+               
+
+       int flagg;
+       int flagg2;
+
+       vtkPoints *points;
+       vtkCellArray *lineas; 
+       int buenos;
+
+/*     std::stack< double  >                                           m_Stack0;
+       std::stack< double  >                                           m_Stack1;
+       std::stack< double  >                                           m_Stack2;
+       std::stack< double  >                                           m_Stack3;
+       std::stack< double  >                                           m_Stack4;
+       std::stack< double  >                                           m_Stack5;
+       std::stack< double  >                                           m_Stack6;
+       std::stack< double  >                                           m_Stack7;
+       std::stack< double  >                                           m_Stack8;
+       std::stack< int  >                                              m_Stack;
+       std::stack< double  >                                           m_Stackr;
+       std::stack< double  >                                           m_Stackra;
+       std::stack< double  >                                           m_Stackrp;*/
+
+
+       std::deque< double  >                                           m_Stack0;
+       std::deque< double  >                                           m_Stack1;
+       std::deque< double  >                                           m_Stack2;
+       std::deque< double  >                                           m_Stack3;
+       std::deque< double  >                                           m_Stack4;
+       std::deque< double  >                                           m_Stack5;
+       std::deque< double  >                                           m_Stack6;
+       std::deque< double  >                                           m_Stack7;
+       std::deque< double  >                                           m_Stack8;
+       std::deque< int  >                                              m_Stack;
+       std::deque< double  >                                           m_Stackr;
+       std::deque< double  >                                           m_Stackra;
+       std::deque< double  >                                           m_Stackrp;
+
+
+
+       double puntoanteriorr[3];
+
+
+
+       unsigned short max;
+       unsigned long cantt;
+       double sum;
+       double sumc;
+       double sums;
+       double sumk;
+       double kurt;
+       double slew;
+       double des;
+       double prom;
+       unsigned short min;
+
+       double kurt1;
+       double slew1;
+
+
+       unsigned short max2;
+       unsigned long cant;
+       double sumi;
+       double sumii;
+       double kurt2;
+       double slew2;
+       double des2;
+       double inerciaii;
+       double centi;
+       unsigned short min2;
+
+       unsigned short max3;
+       unsigned long cant2;
+       double sumi2;
+       double sumii2;
+       double kurt3;
+       double slew3;
+       double des3;
+       double inerciaii2;
+       double centi2;
+       unsigned short min3;
+
+       float tmin, tmax;
+
+       unsigned int hist[2000];
+
+       int maxant;
+       int minant;
+       double totalMean ;
+       double variance, maxVariance, zerothCumuMoment, firstCumuMoment ;
+       double variance2, maxVariance2, zerothCumuMoment2, firstCumuMoment2 ;
+       double variance3, maxVariance3, zerothCumuMoment3, firstCumuMoment3 ;
+       double firstCumuMomentb, firstCumuMomentb2, firstCumuMomentb3 ;
+
+       double kurtt;
+       double slewt;
+       
+       int thresholdPoint, thresholdPoint1, thresholdPoint2;
+
+       double    w[3];
+       double    V[3][3];
+       int ejemin;
+
+       double    w2[3];
+       double    V2[3][3];
+       int ejemin2;
+
+       double    wi[3];
+       double    Vi[3][3];
+       int ejemini;
+
+       double centx, centy, centz;
+       double centx2, centy2, centz2;
+
+       double centix, centiy, centiz;
+
+       double    A[3][3];
+       double    A2[3][3];
+       double    Ai[3][3];
+
+       double    wp[3];
+       double    Vp[3][3];
+       int ejeminp;
+
+       double    w2p[3];
+       double    V2p[3][3];
+       int ejemin2p;
+
+       double centxp, centyp, centzp;
+       double centx2p, centy2p, centz2p;
+
+       double centixp, centiyp, centizp;
+       
+       double costo, costop;
+
+       double    Ap[3][3];
+       double    A2p[3][3];
+
+       int candit[10][3];
+
+       double minis[10];
+
+       double inerciar, inerciarp, inerciari, inerciary, inerciarz, inerciariy, inerciariz, inerciarpy, inerciarpz;
+
+       double inercia2r, inercia2rp;
+
+       double mejor[3];
+
+       
+       
+
+       int visited[10][3];
+
+       double visitedrad[10];
+
+       int frama;
+       int fseg;
+       double mejordst;
+
+       double mejorrad;
+
+       int mejorcant;
+
+       
+
+       double param;
+       double param2;
+       double param3;
+       double param4;
+
+       FILE *stream;
+
+
+       
+       
+       
+
+
+       
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/kernel/carotidaBifurcacion.cxx b/lib/maracasVisuLib/src/kernel/carotidaBifurcacion.cxx
new file mode 100644 (file)
index 0000000..28a6d2e
--- /dev/null
@@ -0,0 +1,1054 @@
+/*=========================================================================
+
+
+=========================================================================*/
+#include "carotidaBifurcacion.h"
+
+#include "vtkPolyData.h"
+#include "vtkObjectFactory.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkExtractVOI.h"
+#include "vtkMath.h"
+
+
+
+vtkStandardNewMacro(carotidaBifurcacion);
+
+
+carotidaBifurcacion::carotidaBifurcacion() {
+       
+       this->NumberOfRequiredInputs = 2;
+
+       this->humbral=0.45 ;
+       this->maxpropradio=5;
+       this->maxpropmasa=10;
+       this->minpropmasa=0.001;
+       
+       this->extrac = vtkExtractVOI::New();
+       this->extrac->SetSampleRate(1, 1, 1);
+       
+       this->thresh = vtkImageThreshold::New();
+       this->thresh->SetInput(this->extrac->GetOutput());
+       this->thresh->SetInValue(255);
+       this->thresh->SetOutValue(0);
+       this->thresh->ReleaseDataFlagOff();
+
+       this->cast = vtkImageCast::New();
+       this->cast->SetInput(this->thresh->GetOutput());
+       this->cast->SetOutputScalarTypeToUnsignedChar();
+
+       this->connect = vtkImageSeedConnectivity::New();
+       this->connect->SetInput(this->cast->GetOutput());
+       this->connect->SetInputConnectValue(255);
+       this->connect->SetOutputConnectedValue(255);
+       this->connect->SetOutputUnconnectedValue(0);
+
+       this->dataprov=vtkImageData::New();
+       this->dataprov->SetScalarTypeToUnsignedChar();
+
+       
+                       
+
+}
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+void carotidaBifurcacion::SetInput(vtkPolyData *input)
+{
+       this->vtkProcessObject::SetNthInput(0, input);
+}
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+void carotidaBifurcacion::SetInput2(vtkImageData *input)
+{
+       this->vtkProcessObject::SetNthInput(1, input);
+       this->extrac->SetInput(this->GetInput2());
+  
+}
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+
+void carotidaBifurcacion::Execute()
+{
+       vtkIdType totalpuntos=this->GetInput()->GetNumberOfPoints();
+       this->points = vtkPoints::New();
+       this->points2 = vtkPoints::New();
+       this->points3 = vtkPoints::New();
+       this->points4 = vtkPoints::New();
+       this->buenos2=0;
+       this->iter=0;
+       /*this->lineas = vtkCellArray::New();
+       this->salidas= vtkDoubleArray::New();
+       this->salidas->SetNumberOfComponents(3);*/
+
+       for(this->iter=0;this->iter<totalpuntos;this->iter++){
+               this->avanzar(this->iter);
+       }
+
+       this->limpiar(points, points2, points3, points4 );
+   
+       this->GetOutput()->SetPoints (this->points);
+       /*this->GetOutput()->SetLines(this->lineas);
+       this->GetOutput()->GetPointData()->SetVectors(this->salidas);*/
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+vtkPolyData *carotidaBifurcacion::GetInput(){
+       if (this->NumberOfInputs < 1){
+               return NULL;
+       }
+  
+       return (vtkPolyData *)(this->Inputs[0]);
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+// Specify the input data or filter.
+vtkImageData *carotidaBifurcacion::GetInput2()
+{
+       if (this->NumberOfInputs < 2){
+               return NULL;
+    }
+  
+       return (vtkImageData *)(this->Inputs[1]);
+}
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void carotidaBifurcacion::PrintSelf(ostream& os, vtkIndent indent)
+{
+       this->Superclass::PrintSelf(os,indent);
+}
+
+
+
+
+
+
+
+
+//----------------------------------------------------------------------------
+void carotidaBifurcacion::SetMaxPropRadio(double value)
+{
+       this->maxpropradio=value;
+}
+
+
+
+//----------------------------------------------------------------------------
+double carotidaBifurcacion::GetMaxPropRadio()
+{
+       return this->maxpropradio;
+}
+
+
+  
+//----------------------------------------------------------------------------
+
+void carotidaBifurcacion::SetHumbral(double value)
+{
+       this->humbral=value;
+}
+
+  
+  
+  //----------------------------------------------------------------------------
+
+double carotidaBifurcacion::GetHumbral()
+{
+       return this->humbral;
+}
+
+
+//----------------------------------------------------------------------------
+
+void carotidaBifurcacion::SetMaxPropMasa(double value)
+{
+       this->maxpropmasa=value;
+}
+
+  
+  
+  //----------------------------------------------------------------------------
+
+double carotidaBifurcacion::GetMaxPropMasa()
+{
+       return this->maxpropmasa;
+}
+
+
+//----------------------------------------------------------------------------
+
+void carotidaBifurcacion::SetMinPropMasa(double value)
+{
+       this->minpropmasa=value;
+}
+
+  
+  
+  //----------------------------------------------------------------------------
+
+double carotidaBifurcacion::GetMinPropMasa()
+{
+       return this->minpropmasa;
+}
+
+
+
+
+
+
+
+void carotidaBifurcacion::searc(int i, int j, int k)
+{
+
+       unsigned char *ptr;
+       unsigned char *ptr2;
+       
+       int radio;
+
+       int i2, j2, k2;
+       int i3, j3, k3;
+               
+       ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i,j,k);
+       ptr2=(unsigned char *)  this->dataprov->GetScalarPointer(i,j,k);
+
+       int ext[6];
+       
+       this->connect->GetOutput()->GetExtent(ext);
+
+       radio=(ext[1]-ext[0])/2;
+
+       i2=i-ext[0]-radio;
+       j2=j-ext[2]-radio;
+       k2=k-ext[4]-radio;
+
+
+       *ptr2=this->label;
+       this->vector[this->label-1][0]+=1;
+       this->vector[this->label-1][1]+=i;
+       this->vector[this->label-1][2]+=j;
+       this->vector[this->label-1][3]+=k;
+
+
+       for(i3=-1;i3<=1;i3++){
+                       for(j3=-1;j3<=1;j3++){
+                               for(k3=-1;k3<=1;k3++){
+                                       if(i+i3>=ext[0] && i+i3<=ext[1] && j+j3>=ext[2] && j+j3<=ext[3] && k+k3>=ext[4] &&  k+k3<=ext[5] ){
+                                               ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               ptr2=(unsigned char *)  this->dataprov->GetScalarPointer(i+i3,j+j3,k+k3);
+                                               if(*ptr==255 && *ptr2==0 && (radio*radio)>((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3)) && ((radio-2)*(radio-2))<((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3))){
+                                                       this->searc(i+i3, j+j3, k+k3);
+                                               }
+                                       }
+                               }
+                       }
+               }
+}
+
+
+
+void carotidaBifurcacion::find_components( )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       
+       unsigned char *ptr;
+       unsigned char *ptr2;
+
+       this->connect->GetOutput()->GetExtent(ext);
+
+
+       radio=(ext[1]-ext[0])/2;
+
+       this->label=0;
+               
+
+
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i,j,k);
+                                       ptr2=(unsigned char *)  this->dataprov->GetScalarPointer(i,j,k);
+
+                                       if(*ptr==255 && *ptr2==0 && (radio*radio)>(i2*i2)+(j2*j2)+(k2*k2) && ((radio-2)*(radio-2))<(i2*i2)+(j2*j2)+(k2*k2)  ){
+                                               this->label=this->label+1;
+                                               this->vector[this->label-1][0]=0;
+                                               this->vector[this->label-1][1]=0;
+                                               this->vector[this->label-1][2]=0;
+                                               this->vector[this->label-1][3]=0;
+                                               this->searc(i, j, k);
+                                               
+                                       }
+                               }
+                       }
+               }
+       
+}
+
+
+
+
+
+unsigned short carotidaBifurcacion::maximo( )
+{
+       int ext[6];
+       int i, j, k;
+       unsigned short max=0;
+
+       this->extrac->GetOutput()->GetExtent(ext);
+
+       unsigned short *ptr;
+       
+
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(unsigned short *)this->extrac->GetOutput()->GetScalarPointer(i,j,k);
+                                       if(*ptr>max){
+                                               max=*ptr;
+                                               
+                                       }
+                               }
+                       }
+               }
+
+               return max;
+}
+
+
+
+
+
+void carotidaBifurcacion::blanquear()
+{
+       int ext[6];
+       int i, j, k;
+       
+       this->dataprov->GetExtent(ext);
+
+       unsigned char *ptr;
+
+
+
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(unsigned char *)   this->dataprov->GetScalarPointer(i,j,k);
+                                       *ptr=0;
+                               }
+                       }
+               }
+}
+
+
+
+
+
+double carotidaBifurcacion::angulo(double i1, double j1, double k1, double i2, double j2, double k2 )
+{
+       double m1=sqrt((i1*i1)+(j1*j1)+(k1*k1));
+       double m2=sqrt((i2*i2)+(j2*j2)+(k2*k2));
+       double res=(acos(((i1*i2)+(j1*j2)+(k1*k2))/(m1*m2))*180)/3.1415;
+
+       if(res<0){
+               res=-res;
+       }
+
+       if(res>=0 && res<180){
+               res=res;
+       }
+       else{
+               res=360-res;
+       }
+       
+       return res;
+}
+
+
+
+void carotidaBifurcacion::corte(double punto1[3], double punto2[3], double punto3[3], double centro[3],  double radio )
+{
+       
+       double m1, m2, m3;
+       double b1, b2, b3;
+       double c0, c1, c2;
+       double* roots;
+       double root;
+       
+
+       m1=punto2[0]-punto1[0];
+       m2=punto2[1]-punto1[1];
+       m3=punto2[2]-punto1[2];
+
+       b1=punto1[0]-centro[0];
+       b2=punto1[1]-centro[1];
+       b3=punto1[2]-centro[2];
+
+       c0=m1*m1+m2*m2+m3*m3;
+       c1=2*m1*b1+2*m2*b2+2*m3*b3;
+       c2=b1*b1+b2*b2+b3*b3-radio*radio;
+
+       roots=vtkMath::SolveQuadratic  (c0, c1, c2);
+
+       if(roots[1]>=0 && roots[1]<=1){
+               root=roots[1];
+       }
+       else{
+               root=roots[2];
+       }
+
+       punto3[0]=punto1[0]+root*(punto2[0]-punto1[0]);
+       punto3[1]=punto1[1]+root*(punto2[1]-punto1[1]);
+       punto3[2]=punto1[2]+root*(punto2[2]-punto1[2]);
+               
+}
+
+
+
+
+
+void carotidaBifurcacion::direcciones(vtkPolyData *profile, int iter, double radio, double puntocortea[3], double puntocortes[3] )
+{
+       double puntoactual[3];
+       double puntoant[3];
+       double puntosig[3];
+       double puntoant2[3];
+       double puntosig2[3];
+       double dist;
+       int i,j;
+       
+       vtkIdType totalpuntos=profile->GetNumberOfPoints();
+
+       if(iter<totalpuntos){
+
+               profile->GetPoint(iter, puntoactual);
+       
+               if(iter==0){
+                       profile->GetPoint(iter+1, puntosig);
+                       profile->GetPoint(iter, puntosig2);
+                       i=1;
+
+                       dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
+
+                       while(dist< radio){
+                       
+                               profile->GetPoint(iter+1+i, puntosig);
+                               profile->GetPoint(iter+i, puntosig2);
+                               dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
+                               i++;
+
+                       }
+
+                       this->corte(puntosig, puntosig2, puntocortes, puntoactual,  radio );
+
+                       puntocortea[0]=2*puntoactual[0]-puntocortes[0];
+                       puntocortea[1]=2*puntoactual[1]-puntocortes[1];
+                       puntocortea[2]=2*puntoactual[2]-puntocortes[2];
+                       
+               }
+               else if(iter==totalpuntos-1){
+                       profile->GetPoint(iter-1, puntoant);
+                       profile->GetPoint(iter, puntoant2);
+                       j=1;
+
+                       dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
+
+                       while(dist< radio){
+                       
+                               profile->GetPoint(iter-1-j, puntoant);
+                               profile->GetPoint(iter-j, puntoant2);
+                               dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
+                               j++;
+
+                       }
+
+                       this->corte(puntoant, puntoant2, puntocortea, puntoactual,  radio );
+
+                       puntocortes[0]=2*puntoactual[0]-puntocortea[0];
+                       puntocortes[1]=2*puntoactual[1]-puntocortea[1];
+                       puntocortes[2]=2*puntoactual[2]-puntocortea[2];
+               }
+               else{
+                       profile->GetPoint(iter+1, puntosig);
+                       profile->GetPoint(iter, puntosig2);
+                       i=1;
+
+                       dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
+
+                       while(dist< radio && iter+1+i<totalpuntos){
+                       
+                               profile->GetPoint(iter+1+i, puntosig);
+                               profile->GetPoint(iter+i, puntosig2);
+                               dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
+                               i++;
+
+                       }
+
+                       profile->GetPoint(iter-1, puntoant);
+                       profile->GetPoint(iter, puntoant2);
+                       j=1;
+
+                       dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
+
+                       while(dist< radio && iter-1-j>=0){
+                       
+                               profile->GetPoint(iter-1-j, puntoant);
+                               profile->GetPoint(iter-j, puntoant2);
+                               dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
+                               j++;
+                       }
+
+
+                       if(iter+1+i<totalpuntos){
+                               this->corte(puntosig, puntosig2, puntocortes, puntoactual,  radio );                            
+                       }
+
+                       if(iter-1-j>=0){
+                               this->corte(puntoant, puntoant2, puntocortea, puntoactual,  radio );    
+                       }
+
+                       if(iter+1+i>=totalpuntos){
+                               puntocortes[0]=2*puntoactual[0]-puntocortea[0];
+                               puntocortes[1]=2*puntoactual[1]-puntocortea[1];
+                               puntocortes[2]=2*puntoactual[2]-puntocortea[2];
+                       }
+                       
+                       if(iter-1-j<0){
+                               puntocortea[0]=2*puntoactual[0]-puntocortes[0];
+                               puntocortea[1]=2*puntoactual[1]-puntocortes[1];
+                               puntocortea[2]=2*puntoactual[2]-puntocortes[2];
+                       }
+               }
+       }
+       
+}
+
+int carotidaBifurcacion::igual(double puntoactual[3], double puntoactualdis[3], double puntoantguar[3], double puntoantguardis[3] )
+{
+       int res=0;
+       double mat[3][3];
+       double matinv[3][3];
+                               
+       double t[3];
+       double b[3];
+
+       double disact;
+       double disant;
+       double discru;
+
+                                                               
+
+       disact=sqrt(vtkMath::Distance2BetweenPoints (puntoactual,puntoactualdis));
+       disant=sqrt(vtkMath::Distance2BetweenPoints (puntoantguar,puntoantguardis));
+       discru=sqrt(vtkMath::Distance2BetweenPoints (puntoactual,puntoantguar));
+
+                                                       
+       if(discru<disact+disant){
+               mat[0][0]=puntoantguardis[0]-puntoantguar[0];
+               mat[0][1]=-(puntoactualdis[0]-puntoactual[0]);
+               mat[0][2]=0;
+                                                                               
+               mat[1][0]=puntoantguardis[1]-puntoantguar[1];
+               mat[1][1]=-(puntoactualdis[1]-puntoactual[1]);
+               mat[1][2]=0;
+
+               mat[2][0]=0;
+               mat[2][1]=0;
+               mat[2][2]=1;
+
+               b[0]=puntoactual[0]-puntoantguar[0];
+               b[1]=puntoactual[1]-puntoantguar[1];
+               b[2]=0;
+
+                                                                       
+               vtkMath::Invert3x3(mat,matinv);
+               vtkMath::Multiply3x3 (matinv, b, t);
+
+
+                                                               
+               if(t[0]>0 && t[1]>0 ){
+                       res=1;
+               }
+
+                                                                       
+       }
+
+       return res;
+}
+
+
+
+int carotidaBifurcacion::proporcion(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k;
+       int max=0;
+       int total=0;
+
+       data->GetExtent(ext);
+
+       unsigned short *ptr;
+       
+       for(i=ext[0];i<=ext[1];i++){
+                       for(j=ext[2];j<=ext[3];j++){
+                               for(k=ext[4];k<=ext[5];k++){
+                                       ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
+                                       if(*ptr!=0){
+                                               max++;
+                                               
+                                       }
+                                       total++;
+                               }
+                       }
+               }
+
+               return (max*100)/total;
+}
+
+
+
+
+
+void carotidaBifurcacion::redondear(vtkImageData *data )
+{
+       int ext[6];
+       int i, j, k, radio;
+       int i2, j2, k2;
+
+       data->GetExtent(ext);
+
+       unsigned char *ptr;
+
+       radio=(ext[1]-ext[0])/2;
+
+       double tmpsqrt;
+       for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
+                       for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
+                               for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
+                                       ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
+                                   tmpsqrt = (i2*i2)+(j2*j2)+(k2*k2) ;                                 
+                                       if( radio<sqrt(tmpsqrt) ){
+                                               *ptr=0;
+                                               
+                                       }
+                               }
+                       }
+               }
+}
+
+
+
+
+void carotidaBifurcacion::limpiar(vtkPoints *profile, vtkPoints *profile2, vtkPoints *profile3, vtkPoints *profile4 )
+{
+       int i,j,k,l,m, n, p;
+       double puntoactual[3];
+       double puntoactualdis[3];
+       double puntoantguar[3];
+       double puntoantguardis[3];
+       double promedio[3];
+       int cant;
+       int total[100][10];
+       int pairs[100][2];
+       int flag;
+       
+       vtkIdType totalpuntos=profile2->GetNumberOfPoints();
+
+       k=0;
+
+       for(i=0;i<totalpuntos;i++){
+               flag=0;
+               profile2->GetPoint(i, puntoactual);
+               profile3->GetPoint(i, puntoactualdis);
+                       
+               for(j=i+1;j<totalpuntos;j++){
+                       profile2->GetPoint(j, puntoantguar);
+                       profile3->GetPoint(j, puntoantguardis);
+                       if(puntoactual[0]!=puntoantguar[0] && puntoactual[1]!=puntoantguar[1] && puntoactual[2]!=puntoantguar[2] && 1==this->igual(puntoactual, puntoactualdis, puntoantguar, puntoantguardis)){
+                               pairs[k][0]=i;
+                               pairs[k][1]=j;
+                               k++;
+                               flag=1;
+                       }
+
+               }
+               for(n=0;n<k;n++){
+                       if(pairs[n][1]==i){
+                               flag=1;
+                       }
+
+               }
+               if(flag==0){
+                       pairs[k][0]=i;
+                       pairs[k][1]=-1;
+                       k++;
+               }
+       }
+
+       for(i=0;i<10;i++){
+               for(j=0;j<100;j++){
+                       total[j][i]=-1;
+               }
+       }
+
+
+       l=0;
+
+       for(i=0;i<k;i++){
+               m=0;
+               if(pairs[i][0]!=-1){
+                       total[l][m]=pairs[i][0];
+                       m++;
+               }
+               if(pairs[i][1]!=-1){
+                       total[l][m]=pairs[i][1];
+                       m++;
+               }
+               if(pairs[i][0]!=-1 || pairs[i][1]!=-1){
+                       pairs[i][0]=-1;
+                       pairs[i][1]=-1;
+                       l++;
+                       
+               
+                       for(j=i+1;j<k;j++){
+
+                               for(n=0;n<m;n++){
+                               
+                                       if(total[l-1][n]==pairs[j][0]){
+                                               flag=0;
+                                               for(p=0;p<m;p++){
+                                                       if(total[l-1][p]==pairs[j][1]){
+                                                               flag=1;
+                                                       }
+                                               }
+                                               if(flag==0){
+                                                       total[l-1][m]=pairs[j][1];
+                                                       m++;
+                                               }
+                                               pairs[j][0]=-1;
+                                               pairs[j][1]=-1;
+                                                       
+
+                                       }
+                                       else if(total[l-1][n]==pairs[j][1]){
+                                               flag=0;
+                                               for(p=0;p<m;p++){
+                                                       if(total[l-1][p]==pairs[j][0]){
+                                                               flag=1;
+                                                       }
+                                               }
+                                               if(flag==0){
+                                                       total[l-1][m]=pairs[j][0];
+                                                       m++;
+                                               }
+                                               pairs[j][0]=-1;
+                                               pairs[j][1]=-1;
+                                       }
+                                       
+                               }
+                       }
+               }
+       
+       }
+
+       for(i=0;i<l;i++){
+               promedio[0]=0;
+               promedio[1]=0;
+               promedio[2]=0;
+               cant=0;
+               flag=0;
+               m=0;
+
+               while(flag==0){
+                       if(total[i][m]!=-1){
+                               profile4->GetPoint(total[i][m], puntoactual);
+                               promedio[0]+=puntoactual[0];
+                               promedio[1]+=puntoactual[1];
+                               promedio[2]+=puntoactual[2];
+                               cant++;
+                       }
+                       else{
+                               flag=1;
+                       }
+                       m++;
+               }
+               promedio[0]=promedio[0]/cant;
+               promedio[1]=promedio[1]/cant;
+               promedio[2]=promedio[2]/cant;
+               
+               profile->InsertPoint(i,promedio);
+
+
+       }
+
+
+}
+
+
+void carotidaBifurcacion::avanzar(vtkIdType iter)
+{
+
+
+       double espprin[3];
+       int extprin[6];
+       double puntoactual[3];
+       double puntoactualdis[3];
+       int puntoactualarr[3];
+       double radioactual;
+       double dirant[3];
+       double dirsig[3];
+       
+       
+       
+       double vector2[50][3];
+       double angulos[50];
+
+       unsigned long vectortemp[4];
+       double vector2temp[3];
+       double angulostemp;
+
+       double maxmasa;
+               
+       int extint[6];
+       int extintreal[6];
+       int prop;
+
+       int i, j;
+       int radiotrabajo;
+
+       
+                               
+       
+       this->GetInput2()->GetExtent(extprin);
+       this->GetInput2()->GetSpacing(espprin);
+
+       vtkIdType totalpuntos=this->GetInput()->GetNumberOfPoints();
+
+       if(iter<totalpuntos){
+
+               vtkDoubleArray *radio = (vtkDoubleArray *)this->GetInput()->GetPointData()->GetScalars("radio");
+               //vtkDoubleArray *dir = (vtkDoubleArray *)this->GetInput()->GetPointData()->GetVectors("norm");
+               this->GetInput()->GetPoint(iter, puntoactual);
+               radioactual=radio->GetValue(iter);
+               radiotrabajo=1;
+
+               for(this->label=0, prop=100;radiotrabajo<radioactual*this->maxpropradio && (this->label<2 || prop>this->maxpropmasa);radiotrabajo++){
+
+                       puntoactualarr[0]= (int) ( (puntoactual[0]/espprin[0])+extprin[0] );
+                       puntoactualarr[1]= (int) ( (puntoactual[1]/espprin[1])+extprin[2] );
+                       puntoactualarr[2]= (int) ( (puntoactual[2]/espprin[2])            );
+
+                       extint[0]=puntoactualarr[0]-radiotrabajo;
+                       extint[1]=puntoactualarr[0]+radiotrabajo;
+                       extint[2]=puntoactualarr[1]-radiotrabajo;
+                       extint[3]=puntoactualarr[1]+radiotrabajo;
+                       extint[4]=puntoactualarr[2]-radiotrabajo;
+                       extint[5]=puntoactualarr[2]+radiotrabajo;
+
+                       extrac->SetVOI(extint);
+                       extrac->UpdateWholeExtent();
+                       extrac->Update();
+                       extrac->GetOutput()->GetExtent(extintreal);
+                       
+                       if(puntoactualarr[0]>=extintreal[0] && puntoactualarr[0]<=extintreal[1] && puntoactualarr[1]>=extintreal[2] && puntoactualarr[1]<=extintreal[3] && puntoactualarr[2]>=extintreal[4] && puntoactualarr[2]<=extintreal[5]  ){
+
+                               
+                               
+                               
+                       this->thresh->ThresholdByUpper(this->maximo()*this->humbral);
+                       this->thresh->UpdateWholeExtent();
+                       this->thresh->Update();
+
+                       prop=this->proporcion(this->thresh->GetOutput());
+                       this->redondear(this->thresh->GetOutput());
+
+
+                       this->cast->UpdateWholeExtent();
+                       this->cast->Update();
+
+
+                       this->connect->RemoveAllSeeds();
+                       this->connect->AddSeed(puntoactualarr[0],puntoactualarr[1],puntoactualarr[2]);
+                       this->connect->UpdateWholeExtent();
+                       this->connect->Update();
+
+                       this->dataprov->Delete();
+
+                       this->dataprov=vtkImageData::New();
+                       this->dataprov->SetScalarTypeToUnsignedChar();
+
+                       this->dataprov->SetExtent(this->connect->GetOutput()->GetExtent());
+               
+                       this->blanquear();
+
+                       this->find_components();
+                       
+                               
+
+                               
+                               
+                       }
+               }
+
+
+               this->direcciones(this->GetInput(), this->iter, radiotrabajo-1, dirant, dirsig);
+
+                       
+
+               dirant[0]=dirant[0]-puntoactual[0];
+               dirant[1]=dirant[1]-puntoactual[1];
+               dirant[2]=dirant[2]-puntoactual[2];
+               dirsig[0]=dirsig[0]-puntoactual[0];
+               dirsig[1]=dirsig[1]-puntoactual[1];
+               dirsig[2]=dirsig[2]-puntoactual[2];
+
+
+
+
+                       
+                       
+                       maxmasa=0;
+                       if(this->label>2){
+                               for(i=0;i<this->label;i++){
+                                       vector2[i][0]=((double)this->vector[i][1]/(double)this->vector[i][0])-(double)puntoactualarr[0];
+                                       vector2[i][1]=((double)this->vector[i][2]/(double)this->vector[i][0])-(double)puntoactualarr[1];
+                                       vector2[i][2]=((double)this->vector[i][3]/(double)this->vector[i][0])-(double)puntoactualarr[2];
+                                       double tmp_EED_A = this->angulo(dirsig[0], dirsig[1], dirsig[2], vector2[i][0], vector2[i][1], vector2[i][2]);
+                                       double tmp_EED_B = this->angulo(dirant[0], dirant[1], dirant[2], vector2[i][0], vector2[i][1], vector2[i][2]);
+//                                     angulos[i] =min( tmp_EED_A , tmp_EED_B );
+                                       angulos[i] = tmp_EED_A ;
+                                       if (tmp_EED_B<angulos[i] ) 
+                                       {
+                                               angulos[i]=tmp_EED_B;
+                                       }
+                                       if(maxmasa<this->vector[i][0]){
+                                               maxmasa=this->vector[i][0];
+                                       }
+                                       
+                               }
+
+                               for(i=0;i<this->label;i++){
+                                       for(j=i;j<this->label;j++){
+                                               if(angulos[j]>angulos[i]){
+                                                       vectortemp[0]=this->vector[i][0];
+                                                       vectortemp[1]=this->vector[i][1];
+                                                       vectortemp[2]=this->vector[i][2];
+                                                       vectortemp[3]=this->vector[i][3];
+                                                       vector2temp[0]=vector2[i][0];
+                                                       vector2temp[1]=vector2[i][1];
+                                                       vector2temp[2]=vector2[i][2];
+                                                       angulostemp=angulos[i];
+
+                                                       this->vector[i][0]=this->vector[j][0];
+                                                       this->vector[i][1]=this->vector[j][1];
+                                                       this->vector[i][2]=this->vector[j][2];
+                                                       this->vector[i][3]=this->vector[j][3];
+                                                       vector2[i][0]=vector2[j][0];
+                                                       vector2[i][1]=vector2[j][1];
+                                                       vector2[i][2]=vector2[j][2];
+                                                       angulos[i]=angulos[j];
+
+                                                       this->vector[j][0]=vectortemp[0];
+                                                       this->vector[j][1]=vectortemp[1];
+                                                       this->vector[j][2]=vectortemp[2];
+                                                       this->vector[j][3]=vectortemp[3];
+                                                       vector2[j][0]=vector2temp[0];
+                                                       vector2[j][1]=vector2temp[1];
+                                                       vector2[j][2]=vector2temp[2];
+                                                       angulos[j]=angulostemp;
+                                               }
+                                       }
+                                       
+                               }
+
+
+                               for(i=this->label-2;i<this->label;i++){
+                                       this->vector[i][0]=0;
+                               }
+
+
+
+                               for(i=0;i<this->label;i++){
+                                       for(j=i;j<this->label;j++){
+                                               if(this->vector[j][0]>this->vector[i][0]){
+                                                       vectortemp[0]=this->vector[i][0];
+                                                       vectortemp[1]=this->vector[i][1];
+                                                       vectortemp[2]=this->vector[i][2];
+                                                       vectortemp[3]=this->vector[i][3];
+                                                       vector2temp[0]=vector2[i][0];
+                                                       vector2temp[1]=vector2[i][1];
+                                                       vector2temp[2]=vector2[i][2];
+                                                       angulostemp=angulos[i];
+
+                                                       this->vector[i][0]=this->vector[j][0];
+                                                       this->vector[i][1]=this->vector[j][1];
+                                                       this->vector[i][2]=this->vector[j][2];
+                                                       this->vector[i][3]=this->vector[j][3];
+                                                       vector2[i][0]=vector2[j][0];
+                                                       vector2[i][1]=vector2[j][1];
+                                                       vector2[i][2]=vector2[j][2];
+                                                       angulos[i]=angulos[j];
+
+                                                       this->vector[j][0]=vectortemp[0];
+                                                       this->vector[j][1]=vectortemp[1];
+                                                       this->vector[j][2]=vectortemp[2];
+                                                       this->vector[j][3]=vectortemp[3];
+                                                       vector2[j][0]=vector2temp[0];
+                                                       vector2[j][1]=vector2temp[1];
+                                                       vector2[j][2]=vector2temp[2];
+                                                       angulos[j]=angulostemp;
+                                               }
+                                       }
+                                       
+                               }
+
+                               
+                               for(i=0;i<this->label;i++){
+                                       if(maxmasa*this->minpropmasa<this->vector[i][0]){
+                                               puntoactualdis[0]=(puntoactualarr[0]+vector2[i][0]-extprin[0])*espprin[0];
+                                               puntoactualdis[1]=(puntoactualarr[1]+vector2[i][1]-extprin[2])*espprin[1];
+                                               puntoactualdis[2]=(puntoactualarr[2]+vector2[i][2])*espprin[2];
+
+                                               points2->InsertPoint(buenos2,puntoactual);
+                                               points3->InsertPoint(buenos2,puntoactualdis);
+                                               points4->InsertPoint(buenos2,puntoactual[0]+(radioactual/radiotrabajo)*(puntoactualdis[0]-puntoactual[0]), puntoactual[1]+(radioactual/radiotrabajo)*(puntoactualdis[1]-puntoactual[1]), puntoactual[2]+(radioactual/radiotrabajo)*(puntoactualdis[2]-puntoactual[2]));
+                                               buenos2++;
+                                       }
+                                       
+                               }
+                                       
+                       }
+       
+       }
+
+
+}
diff --git a/lib/maracasVisuLib/src/kernel/carotidaBifurcacion.h b/lib/maracasVisuLib/src/kernel/carotidaBifurcacion.h
new file mode 100644 (file)
index 0000000..2a69f53
--- /dev/null
@@ -0,0 +1,123 @@
+/*=========================================================================
+
+  */
+
+#ifndef __carotidaBifurcacion_h
+#define __carotidaBifurcacion_h
+
+#include "vtkPolyDataSource.h"
+#include "vtkImageThreshold.h"
+#include "vtkImageCast.h"
+#include "vtkImageSeedConnectivity.h"
+#include "vtkImageData.h"
+#include "vtkMarchingCubes.h"
+#include "vtkDoubleArray.h"
+#include "vtkPointData.h"
+#include "vtkExtractVOI.h"
+#include "vtkPoints.h"
+#include "vtkCellArray.h"
+
+
+class vtkPolyData;
+
+class  carotidaBifurcacion : public vtkPolyDataSource
+{
+public:
+       static carotidaBifurcacion *New();
+       void PrintSelf(ostream& os, vtkIndent indent);
+
+       virtual void SetInput(vtkPolyData *input);
+       vtkPolyData *GetInput();
+
+       virtual void SetInput2(vtkImageData *input);
+       vtkImageData *GetInput2();
+
+       void SetMaxPropRadio(double value);
+       double GetMaxPropRadio();
+
+       void SetHumbral(double value);
+       double GetHumbral();
+
+       void SetMaxPropMasa(double value);
+       double GetMaxPropMasa();
+
+       void SetMinPropMasa(double value);
+       double GetMinPropMasa();
+  
+  
+protected:  
+       carotidaBifurcacion();
+       
+       ~carotidaBifurcacion() {};
+
+       void Execute();
+  
+
+private:
+       carotidaBifurcacion(const carotidaBifurcacion&);  // Not implemented.
+
+       void operator=(const carotidaBifurcacion&);  // Not implemented.
+  
+       void searc(int i, int j, int k );
+
+       void find_components( );
+
+       unsigned short maximo();
+
+       void blanquear();
+
+       double angulo(double i1, double j1, double k1, double i2, double j2, double k2 );
+
+       void direcciones(vtkPolyData *points, int iter, double radio, double puntocortea[3], double puntocortes[3] );
+
+       void corte(double punto1[3], double punto2[3], double punto3[3], double centro[3],  double radio );
+
+       void avanzar(vtkIdType iter);
+
+       int proporcion(vtkImageData *data );
+
+       void redondear(vtkImageData *data );
+
+       void limpiar(vtkPoints *profile, vtkPoints *profile2, vtkPoints *profile3, vtkPoints *profile4 );
+
+       int igual(double puntoactual[3], double puntoactualdis[3], double puntoantguar[3], double puntoantguardis[3] );
+
+
+
+       vtkImageData *dataprov;
+       unsigned char label;
+       unsigned long vector[50][4] ;
+       vtkExtractVOI *extrac;
+       vtkImageThreshold *thresh;
+       vtkImageCast *cast;
+       vtkImageSeedConnectivity *connect;
+       vtkIdType iter;
+
+       vtkPoints *points;
+
+       vtkCellArray *lineas; 
+
+       
+       vtkDoubleArray *salidas;
+
+       double humbral;
+       double maxpropradio;
+       double maxpropmasa;
+       double minpropmasa;
+
+
+       vtkPoints *points2;
+
+       vtkPoints *points3;
+       vtkPoints *points4;
+
+
+       int buenos2;
+       
+};
+
+#endif
+
+
diff --git a/lib/maracasVisuLib/src/kernel/curve.cxx b/lib/maracasVisuLib/src/kernel/curve.cxx
new file mode 100644 (file)
index 0000000..5d0a9c4
--- /dev/null
@@ -0,0 +1,580 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: curve.cxx,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:54 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+// PS -> #include "gslobj.hxx" //PS
+#include "marMatrix.h"
+#include <math.h> //PS
+#include "marMathConst.h" //PS
+
+#include "curve.hxx"
+
+
+int kCurve::MAX_DIMENSION = 0;
+int kCurve::MAX_STATE_DIMENSION = 0;
+
+#define KCURVE_CHANGE_DIMENSIONS( ) \
+    kCurve::MAX_DIMENSION = ( kCurve::MAX_DIMENSION > _dimension )?\
+       kCurve::MAX_DIMENSION: _dimension;\
+    kCurve::MAX_STATE_DIMENSION = ( kCurve::MAX_STATE_DIMENSION > _stateDim )?\
+kCurve::MAX_STATE_DIMENSION: _stateDim;
+
+// Catmull-Rom basic functions and their derivatives.
+
+// -------------------------------------------------------------------------
+void f_catmull( double* N, double t )
+{
+    double t2 = t * t;
+    double t3 = t2 * t;
+       
+    N[ 0 ] = -t3 + ( 2 * t2 ) - t;
+    N[ 1 ] = ( 3 * t3 ) - ( 5 * t2 ) + 2;
+    N[ 2 ] = -( 3 * t3 ) + ( 4 * t2 ) + t;
+    N[ 3 ] = t3 - t2;
+}
+
+// -------------------------------------------------------------------------
+void f_d1_catmull( double* N, double t )
+{
+    double t2 = t * t;
+       
+    N[ 0 ] = -( 3 * t2 ) + ( 4 * t ) - 1;
+    N[ 1 ] = ( 9 * t2 ) - ( 10 * t );
+    N[ 2 ] = -( 9 * t2 ) + ( 8 * t ) + 1;
+    N[ 3 ] = ( 3 * t2 ) - ( 2 * t );
+}
+
+// -------------------------------------------------------------------------
+void f_d2_catmull( double* N, double t )
+{
+    N[ 0 ] = -( 6 * t ) + 4;
+    N[ 1 ] = ( 18 * t ) - 10;
+    N[ 2 ] = -( 18 * t ) + 8;
+    N[ 3 ] = ( 6 * t ) - 2;
+}
+
+// -------------------------------------------------------------------------
+kCurve::kCurve( size_t dim, size_t sdim )
+: _dimension( dim ), _stateDim( sdim )
+{
+    _mC = new double[ _dimension * 4 ];
+    _mS = new double[ _stateDim * 4 ];
+    KCURVE_CHANGE_DIMENSIONS( );
+}
+
+// -------------------------------------------------------------------------
+kCurve::~kCurve( )
+{
+    reset( );
+    delete[] _mC;
+    delete[] _mS;
+}
+
+// -------------------------------------------------------------------------
+kCurve& kCurve::operator=( const kCurve& r )
+{
+    reset( );
+    delete[] _mC;
+    delete[] _mS;
+       
+    _dimension = r._dimension;
+    _stateDim = r._stateDim;
+       
+    _mC = new double[ _dimension * 4 ];
+    _mS = new double[ _stateDim * 4 ];
+       
+    for( int i = 0; i < r._controlPoints.size( ); i++ )
+               addControlPoint( r._controlPoints[ i ],
+               r._controlState[ i ] );
+    return( *this );
+}
+
+// -------------------------------------------------------------------------
+uint kCurve::getClosestControlPoint( double* p )
+{
+    int res;
+// PS ->     gslobj_vector vp( p, _dimension ), cp( _dimension ); //PS
+       marVector vp (p,_dimension),cp(_dimension);
+    double dist, min;
+       
+    cp = _controlPoints[ 0 ];
+    min = ( cp - vp ).norm2( );
+    res = 0;
+       
+    for( int i = 1; i < _controlPoints.size( ); i++ )
+    {
+               cp = _controlPoints[ i ];
+               dist = ( cp - vp ).norm2( );
+               if( min > dist )
+               {
+                       min = dist;
+                       res = i;
+               } // fi
+    } // rof
+       
+    return( res );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::getPoint( double* p, double s )
+{
+    double t;
+    int i;
+       
+    calculeSplineArguments( s, i, t );
+    evaluate( p, i, t );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::getState( double* st, double s )
+{
+    double t;
+    int i;
+       
+    calculeSplineArguments( s, i, t );
+    evalState( st, i, t );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::getTangent( double* tg, double s )
+{
+    double t;
+    int i;
+       
+    calculeSplineArguments( s, i, t );
+    derivative1( tg, i, t );
+       
+// PS ->     gslobj_vector tmp( tg, _dimension ); //PS
+       marVector tmp( tg, _dimension );
+    memcpy( tg,
+               ( double* )( tmp.normalize( ) ),
+               _dimension * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::getNormal( double* n, double s )
+{
+    double t;
+    int i;
+       
+    calculeSplineArguments( s, i, t );
+    derivative2( n, i, t );
+       
+// PS ->     gslobj_vector tmp( n, _dimension ); //PS
+       marVector tmp( n, _dimension );
+    memcpy( n,
+               ( double* )( tmp.normalize( ) ),
+               _dimension * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::getBinormal( double* b, double s )
+{
+// PS ->     //gslobj_vector tg( _dimension ), n( _dimension ); //PS
+       marVector tg( _dimension ), n( _dimension );
+    double t;
+    int i;
+       
+    calculeSplineArguments( s, i, t );
+    derivative1( ( double* )tg, i, t );
+    derivative2( ( double* )n, i, t );
+       
+    memcpy( b,
+               ( double* )( tg.cross( n ).normalize( ) ),
+               _dimension * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::addControlPoint( double* cp, double* sp )
+{
+    double* tmp = new double[ _dimension ];
+    memcpy( tmp, cp, _dimension * sizeof( double ) );
+    _controlPoints.push_back( tmp );
+    if( sp != NULL && _stateDim > 0 ) {
+               
+               double *tmp1 = new double[ _stateDim ];
+               memcpy( tmp1, sp, _stateDim * sizeof( double ) );
+               _controlState.push_back( tmp1 );
+               
+    } else
+               _controlState.push_back( NULL );
+       
+    if( _controlPoints.size( ) == 1 ) {
+               
+               _controlT.push_back( 0.0 );
+               _controlL.push_back( 0.0 );
+               
+    } else {
+               
+               // Here we maintain some extra info about the control points.
+               // These data will allow the high level programmer to think
+               // (if so ;-) just in terms of an arclength parameter "s".
+// PS ->               //gslobj_vector v1( _dimension ), v0( _dimension ); //PS
+               marVector v1( _dimension ), v0( _dimension );
+               double len;
+               int p;
+               
+               p = _controlPoints.size( ) - 1;
+               v1 = _controlPoints[ p ];
+               v0 = _controlPoints[ p - 1 ];
+               len = ( v1 - v0 ).norm2( ) + _controlL[ p - 1 ];
+               _controlL.push_back( len );
+               _controlT.push_back( 0.0 );
+               for( int i = 0; i < _controlT.size( ); i++ )
+                       _controlT[ i ] = _controlL[ i ] / len;
+               
+    }// fi
+}
+
+// -------------------------------------------------------------------------
+void kCurve::getControlPoint( int i, double* cp, double* sp )
+{
+    memcpy( cp, _controlPoints[ i ], _dimension * sizeof( double ) );
+    if( sp != NULL && _controlState[ i ] != NULL && _stateDim > 0 )
+               memcpy( sp, _controlState[ i ], _stateDim * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::setControlPoint( int i, double* cp, double* sp )
+{
+    memcpy( _controlPoints[ i ], cp, _dimension * sizeof( double ) );
+    if( sp != NULL && _stateDim > 0 )
+               memcpy( _controlState[ i ], sp, _stateDim * sizeof( double ) );
+       
+    if( _controlPoints.size( ) > 1 ) {
+// PS ->               //gslobj_vector v1( _dimension ), v0( _dimension ); //PS
+               marVector v1( _dimension ), v0( _dimension );
+               double len;
+               int it;
+               
+               for( it = i; it < _controlT.size( ); it++ ) {
+                       
+                       v1 = _controlPoints[ it ];
+                       v0 = _controlPoints[ it - 1 ];
+                       len = ( v1 - v0 ).norm2( ) + _controlL[ it - 1 ];
+                       _controlL[ i ] = len;
+                       
+               } // rof
+               
+               for( it = 0; it < _controlT.size( ); it++ )
+                       _controlT[ it ] = _controlL[ it ] / len;
+               
+    }// fi
+}
+
+// -------------------------------------------------------------------------
+double kCurve::length( double step )
+{
+// PS ->     //gslobj_vector nV( 4 ), q( _dimension ), p( _dimension ); //PS
+       marVector nV( 4 ), q( _dimension ), p( _dimension );
+// PS ->     //gslobj_matrix mC( _mC, _dimension, 4 ); //PS
+       marMatrix mC( _mC, _dimension, 4 );
+    double l = 0;
+       
+    loadCatmullControlMatrix( 0 );
+    f_catmull( ( double* )nV, 0 );
+    p = ( mC * nV ) * 0.5;
+       
+    for( int i = 0; i < _controlPoints.size( ); i++ ) {
+               
+               loadCatmullControlMatrix( i );
+               for( double t = 0.0; t <= 1.0; t += step ) {
+                       
+                       f_catmull( ( double* )nV, t );
+                       q = ( mC * nV ) * 0.5;
+                       l += ( q - p ).norm2( );
+                       p = q;
+                       
+               } // rof
+               
+    } // rof
+    return( l );
+}
+
+// -------------------------------------------------------------------------
+double kCurve::projectOverControlPoints( double* pr, double* pt )
+{
+// PS ->     //gslobj_vector xpc( 3 ), xpo( pt, 3 ); //PS
+       marVector xpc( 3 ), xpo( pt, 3 );
+// PS ->     //gslobj_vector xpa( 3 ), xpn( 3 ); //PS
+       marVector xpa( 3 ), xpn( 3 ); 
+// PS ->     //gslobj_vector xpr( pr, 3 ); //PS
+       marVector xpr( pr, 3 ); 
+    double sina, sinn, cosa, cosn, tha, thn;
+    double d, e, t, l, tca, tcn, lca, lcn;
+    uint icp = getClosestControlPoint( pt );
+       
+    getControlPoint( icp, ( double* )xpc, NULL );
+       
+    if( icp == 0 ) {
+               
+               getControlPoint( icp + 1, ( double* )xpn, NULL );
+               
+               sinn = ( ( xpo - xpc ).cross( xpn - xpc ) ).norm2( ) /
+                       ( ( xpo - xpc ).norm2( ) * ( xpn - xpc ).norm2( ) );
+               cosn = ( xpo - xpc ).dot( xpn - xpc ) /
+                       ( ( xpo - xpc ).norm2( ) * ( xpn - xpc ).norm2( ) );
+
+// PS ->               //thn = acos( cosn ) + ( ( sinn >= 0 )? M_PI: 0 ); //PS
+               thn = acos( cosn ) + ( ( sinn >= 0 )? PI: 0 );
+// PS ->               //if( 0 <= thn && thn <= M_PI_2 ) { //PS
+               if( 0 <= thn && thn <= (PI/2) ) {
+                       
+                       tca = _controlT[ icp ];
+                       lca = _controlL[ icp ];
+                       tcn = _controlT[ icp + 1 ];
+                       lcn = _controlL[ icp + 1 ];
+                       xpa = xpc;
+                       
+                       d = ( ( xpn - xpa ).cross( xpa - xpo ) ).norm2( ) /
+                               ( xpn - xpa ).norm2( );
+                       e = ( xpo - xpa ).norm2( );
+                       e = ( e * e ) - ( d * d );
+                       e = sqrt( e );
+                       xpr = ( ( xpn - xpa ).normalize( ) * e ) + xpa;
+                       l = ( xpr - xpa ).norm2( ) + lca;
+                       t = ( ( ( tcn - tca ) / ( lcn - lca ) ) * ( l - lca ) ) + tca;
+                       
+               } else {
+                       
+                       xpr = xpc;
+                       t = 0;
+                       
+               } // fi
+               
+    } else if( icp == _controlPoints.size( ) - 1 ) {
+               
+               getControlPoint( icp - 1, ( double* )xpa, NULL );
+               
+               sina = ( ( xpa - xpc ).cross( xpo - xpc ) ).norm2( ) /
+                       ( ( xpa - xpc ).norm2( ) * ( xpo - xpc ).norm2( ) );
+               cosa = ( xpa - xpc ).dot( xpo - xpc ) /
+                       ( ( xpa - xpc ).norm2( ) * ( xpo - xpc ).norm2( ) );
+               
+// PS ->               //tha = acos( cosa ) + ( ( sina >= 0 )? M_PI: 0 ); //PS
+               tha = acos( cosa ) + ( ( sina >= 0 )? PI: 0 );
+               
+// PS ->               //if( 0 <= tha && tha <= M_PI_2 ) { //PS
+               if( 0 <= tha && tha <= (PI/2) ) {
+                       
+                       tca = _controlT[ icp - 1 ];
+                       lca = _controlL[ icp - 1 ];
+                       tcn = _controlT[ icp ];
+                       lcn = _controlL[ icp ];
+                       xpn = xpc;
+                       
+                       d = ( ( xpn - xpa ).cross( xpa - xpo ) ).norm2( ) /
+                               ( xpn - xpa ).norm2( );
+                       e = ( xpo - xpa ).norm2( );
+                       e = ( e * e ) - ( d * d );
+                       e = sqrt( e );
+                       xpr = ( ( xpn - xpa ).normalize( ) * e ) + xpa;
+                       l = ( xpr - xpa ).norm2( ) + lca;
+                       t = ( ( ( tcn - tca ) / ( lcn - lca ) ) * ( l - lca ) ) + tca;
+                       
+               } else {
+                       
+                       xpr = xpc;
+                       t = _controlT[ _controlPoints.size( ) - 1 ];
+                       
+               } // fi
+               
+    } else {
+               
+               getControlPoint( icp - 1, ( double* )xpa, NULL );
+               getControlPoint( icp + 1, ( double* )xpn, NULL );
+               
+               sina = ( ( xpa - xpc ).cross( xpo - xpc ) ).norm2( ) /
+                       ( ( xpa - xpc ).norm2( ) * ( xpo - xpc ).norm2( ) );
+               sinn = ( ( xpo - xpc ).cross( xpn - xpc ) ).norm2( ) /
+                       ( ( xpo - xpc ).norm2( ) * ( xpn - xpc ).norm2( ) );
+               cosa = ( xpa - xpc ).dot( xpo - xpc ) /
+                       ( ( xpa - xpc ).norm2( ) * ( xpo - xpc ).norm2( ) );
+               cosn = ( xpo - xpc ).dot( xpn - xpc ) /
+                       ( ( xpo - xpc ).norm2( ) * ( xpn - xpc ).norm2( ) );
+               
+// PS ->               //tha = acos( cosa ) + ( ( sina >= 0 )? M_PI: 0 );//PS
+               tha = acos( cosa ) + ( ( sina >= 0 )? PI: 0 );
+// PS ->               //thn = acos( cosn ) + ( ( sinn >= 0 )? M_PI: 0 );//PS
+               thn = acos( cosn ) + ( ( sinn >= 0 )? PI: 0 );
+               
+               if( tha < thn ) {
+                       
+                       tca = _controlT[ icp - 1 ];
+                       lca = _controlL[ icp - 1 ];
+                       tcn = _controlT[ icp ];
+                       lcn = _controlL[ icp ];
+                       xpn = xpc;
+                       
+               } else {
+                       
+                       tca = _controlT[ icp ];
+                       lca = _controlL[ icp ];
+                       tcn = _controlT[ icp + 1 ];
+                       lcn = _controlL[ icp + 1 ];
+                       xpa = xpc;
+                       
+               } // fi
+               
+               d = ( ( xpn - xpa ).cross( xpa - xpo ) ).norm2( ) /
+                       ( xpn - xpa ).norm2( );
+               e = ( xpo - xpa ).norm2( );
+               e = ( e * e ) - ( d * d );
+               e = sqrt( e );
+               xpr = ( ( xpn - xpa ).normalize( ) * e ) + xpa;
+               l = ( xpr - xpa ).norm2( ) + lca;
+               t = ( ( ( tcn - tca ) / ( lcn - lca ) ) * ( l - lca ) ) + tca;
+               
+    } // fi
+       
+    return( t );
+}
+
+// -------------------------------------------------------------------------
+double kCurve::projectOverCurve( double* pr, double* pt )
+{ // TODO
+    return( 0 );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::evaluate( double* p, int i, double t )
+{
+// PS ->     //gslobj_vector nV( 4 ), q( _dimension ); //PS
+       marVector nV( 4 ), q( _dimension ); 
+// PS ->     //gslobj_matrix mC( _mC, _dimension, 4 ); //PS
+       marMatrix mC( _mC, _dimension, 4 ); 
+       
+    loadCatmullControlMatrix( i );
+    f_catmull( ( double* )nV, t );
+    q = ( mC * nV ) * 0.5;
+    memcpy( p, ( double* )q, _dimension * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::evalState( double* s, int i, double t )
+{
+// PS ->     //gslobj_vector nV( 4 ), q( _stateDim ); //PS
+       marVector nV( 4 ), q( _stateDim ); 
+// PS ->     //gslobj_matrix mS( _mS, _stateDim, 4 ); //PS
+       marMatrix mS( _mS, _stateDim, 4 ); 
+       
+    loadCatmullStateMatrix( i );
+    f_catmull( ( double* )nV, t );
+    q = ( mS * nV ) * 0.5;
+    memcpy( s, ( double* )q, _stateDim * sizeof( double ) );
+}
+
+// ---------------------------------------------------------------------------
+void kCurve::derivative1( double* d, int i, double t )
+{
+// PS ->     //gslobj_vector nV( 4 ), q( _dimension ); //PS
+       marVector nV( 4 ), q( _dimension ); 
+// PS ->     //gslobj_matrix mC( _mC, _dimension, 4 ); //PS
+       marMatrix mC( _mC, _dimension, 4 );
+       
+    loadCatmullControlMatrix( i );
+    f_d1_catmull( ( double* )nV, t );
+    q = ( mC * nV ) * 0.5;
+    memcpy( d, ( double* )q, _dimension * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::derivative2( double* d, int i, double t )
+{
+// PS ->     //gslobj_vector nV( 4 ), q( _dimension ); //PS
+       marVector nV( 4 ), q( _dimension ); 
+// PS ->     //gslobj_matrix mC( _mC, _dimension, 4 ); //PS
+       marMatrix mC( _mC, _dimension, 4 ); 
+       
+    loadCatmullControlMatrix( i );
+    f_d2_catmull( ( double* )nV, t );
+    q = ( mC * nV ) * 0.5;
+    memcpy( d, ( double* )q, _dimension * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::reset( )
+{
+    int i;
+       
+    for( i = 0; i < _controlPoints.size( ); i++ )
+               delete[] _controlPoints[ i ];
+    _controlPoints.clear( );
+       
+    for( i = 0; i < _controlState.size( ); i++ )
+               if( _controlState[ i ] != NULL ) delete[] _controlState[ i ];
+               _controlState.clear( );
+               
+               _controlT.clear( );
+               _controlL.clear( );
+}
+
+// -------------------------------------------------------------------------
+void kCurve::loadCatmullControlMatrix( int i )
+{
+// PS ->     //gslobj_matrix mC( _mC, _dimension, 4 ); //PS
+       marMatrix mC( _mC, _dimension, 4 ); 
+    int l;
+       
+    for( int j = i - 1; j <= i + 2; j++ ) {
+               
+               for( int k = 0; k < _dimension; k++ ) {
+                       
+                       l = ( j >= 0 )? j: 0;
+                       l = ( l >= _controlPoints.size( ) )?
+                               _controlPoints.size( ) - 1: l;
+                       mC( k, j - i + 1 ) = _controlPoints[ l ][ k ];
+                       
+               } // rof
+               
+    } // rof
+}
+
+// -------------------------------------------------------------------------
+void kCurve::loadCatmullStateMatrix( int i )
+{
+// PS ->     //gslobj_matrix mS( _mS, _stateDim, 4 ); //PS
+       marMatrix mS( _mS, _stateDim, 4 ); 
+    int l;
+       
+    for( int j = i - 1; j <= i + 2; j++ ) {
+               
+               for( int k = 0; k < _stateDim; k++ ) {
+                       
+                       l = ( j >= 0 )? j: 0;
+                       l = ( l >= _controlState.size( ) )?
+                               _controlState.size( ) - 1: l;
+                       mS( k, j - i + 1 ) = _controlState[ l ][ k ];
+                       
+               } // rof
+               
+    } // rof
+}
+
+// -------------------------------------------------------------------------
+void kCurve::calculeSplineArguments( double s, int& i, double& t )
+{
+    for( i = 0; i < _controlT.size( ) && _controlT[ i ] <= s; i++ );
+       
+    if( s < 1.0 ) i--;
+       
+    t = ( ( _controlL[ _controlL.size( ) - 1 ] * s ) - _controlL[ i ] ) /
+               ( _controlL[ i + 1 ] - _controlL[ i ] );
+    t = ( s < 1.0 )? t: 1.0;
+    i = ( s < 1.0 )? i: _controlT.size( ) - 1;
+}
+
+// eof - curve.cxx
diff --git a/lib/maracasVisuLib/src/kernel/curve.hxx b/lib/maracasVisuLib/src/kernel/curve.hxx
new file mode 100644 (file)
index 0000000..767cc21
--- /dev/null
@@ -0,0 +1,104 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: curve.hxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef KGFO__CURVE__HXX
+#define KGFO__CURVE__HXX
+
+#include <vector>
+#include "marTypes.h"
+
+/*! \brief Parametrized n-dimensional curve.
+ *
+ *  This class realizes a parametric curve model, given some control points.
+ */
+class MAR_KERNEL_EXPORT kCurve
+{
+    public:
+
+    kCurve( size_t dim = 3, size_t sdim = 0 );
+    ~kCurve( );
+
+    kCurve& operator=( const kCurve& r );
+
+    uint getDimension( ) const
+    {
+      return( _dimension );
+    }
+
+    uint getStateDimension( ) const
+    {
+      return( _stateDim );
+    }
+
+    uint getClosestControlPoint( double* p );
+
+    void getPoint( double* p, double s );
+    void getState( double* st, double s );
+    void getTangent( double* tg, double s );
+    void getNormal( double* n, double s );
+    void getBinormal( double* b, double s );
+
+    void addControlPoint( double* cp, double* sp );
+    void getControlPoint( int i, double* cp, double* sp );
+    void setControlPoint( int i, double* cp, double* sp );
+    uint getNumberOfControlPoints( )
+    {
+      return( _controlPoints.size( ) );
+    }
+
+    double length( double step = 0.01 );
+
+    double projectOverControlPoints( double* pr, double* pt );
+    double projectOverCurve( double* pr, double* pt );
+
+    void evaluate( double* p, int i, double t );
+    void evalState( double* s, int i, double t );
+
+    void derivative1( double* d, int i, double t );
+    void derivative2( double* d, int i, double t );
+
+    void reset( );
+
+    public:
+
+    static int MAX_DIMENSION;
+    static int MAX_STATE_DIMENSION;
+
+    protected:
+    
+    std::vector< double* > _controlPoints;
+    std::vector< double* > _controlState;
+    uint _dimension;
+    uint _stateDim;
+
+    private:
+
+    void loadCatmullControlMatrix( int i );
+    void loadCatmullStateMatrix( int i );
+    void calculeSplineArguments( double s, int& i, double& t );
+
+    std::vector< double > _controlT;
+    std::vector< double > _controlL;
+
+    double* _mC;
+    double* _mS;
+
+};
+
+#endif // KGFO__CURVE__HXX
+
+// eof - curve.hxx
diff --git a/lib/maracasVisuLib/src/kernel/gslobj.hxx b/lib/maracasVisuLib/src/kernel/gslobj.hxx
new file mode 100644 (file)
index 0000000..1bc749e
--- /dev/null
@@ -0,0 +1,261 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: gslobj.hxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __GSL__OBJ__HXX__
+#define __GSL__OBJ__HXX__
+
+#include <iostream>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+
+/*======================================================================================*/
+/*=================================gslobj_vector========================================*/
+/*======================================================================================*/
+class gslobj_vector {
+
+    public:
+/*==Constructeurs========================================*/
+    gslobj_vector( size_t s = 3 );
+    gslobj_vector( const gslobj_vector& v );
+    gslobj_vector( double* v, size_t s );
+    gslobj_vector( gsl_vector* v );
+/*==Destructeur========================================*/
+       ~gslobj_vector( ) { if( _copy ) gsl_vector_free( _gsl ); }
+
+/*==Operateurs========================================*/
+    
+       /* Affectation */
+       gslobj_vector& operator=( const gslobj_vector& o );
+    gslobj_vector& operator=( double o );
+    gslobj_vector& operator=( double* o );
+    gslobj_vector& operator=( gsl_vector* o );
+
+       /* Affichage */
+    friend std::ostream& operator<<( std::ostream& os, const gslobj_vector& v );
+
+    operator double*( ) const { return( _gsl->data ); }
+    operator gsl_vector*( ) const { return( _gsl ); }
+
+       double& operator()( size_t i ) { return( _gsl->data[ i ] ); }
+    const double& operator()( size_t i ) const
+    {
+      return( _gsl->data[ i ] );
+    }
+
+       /* Comparaison */
+    bool operator==( const gslobj_vector& o ) const;
+    bool operator!=( const gslobj_vector& o ) const
+    {
+      return( !( ( *this ) == o ) );
+    }
+
+       /* Ajout */
+    gslobj_vector operator+( const gslobj_vector& o );
+    gslobj_vector operator+( double o );
+    gslobj_vector operator+( double* o );
+    gslobj_vector operator+( gsl_vector* o );
+    gslobj_vector& operator+=( const gslobj_vector& o );
+    gslobj_vector& operator+=( double o );
+    gslobj_vector& operator+=( double* o );
+    gslobj_vector& operator+=( gsl_vector* o );
+
+       /* Suppression */
+    gslobj_vector operator-( const gslobj_vector& o );
+    gslobj_vector operator-( double o );
+    gslobj_vector operator-( double* o );
+    gslobj_vector operator-( gsl_vector* o );
+    gslobj_vector& operator-=( const gslobj_vector& o );
+    gslobj_vector& operator-=( double o );
+    gslobj_vector& operator-=( double* o );
+    gslobj_vector& operator-=( gsl_vector* o );
+
+       /* Multiplication (produit scalaire) */
+    gslobj_vector operator*( double o );
+    gslobj_vector& operator*=( double o );
+
+       /* Division (produit scalaire) */
+    gslobj_vector operator/( double o );
+    gslobj_vector& operator/=( double o );
+
+
+/*==Methodes========================================*/
+
+/*==PS========================================*/
+//    /* Redimenssionnement */
+//     void resize( size_t s );
+//
+//     /* cree un vecteur unitaire pour une base */
+//    int basis( size_t i )
+//    {
+//      *this = ( double )0;
+//      ( *this )( i ) = 1;
+//      return( i );
+//    }
+/*==PS========================================*/
+       
+       /* Renvoie la taille du vecteur */
+    size_t size( ) const { return( _gsl->size ); }
+
+/*==PS========================================*/    
+//     /* Affecte  */
+//    void setValue( size_t i, double val ) { _gsl->data[ i ] = val; }
+//
+//     /* Permutation d'elements */
+//    int swap( size_t i, size_t j )
+//    {
+//      return( gsl_vector_swap_elements( _gsl, i, j ) );
+//    }
+//
+//     /* le vecteur est "retourné" */
+//    int reverse( ) { return( gsl_vector_reverse( _gsl ) ); }
+/*==PS========================================*/
+
+       /* produit scalaire */
+    double dot( const gslobj_vector& o );
+    double dot( double* o );
+    double dot( gsl_vector* o );
+       
+       /* produit vectoriel : le resultat est renvoye */
+    gslobj_vector cross( const gslobj_vector& o );
+    gslobj_vector cross( double* o );
+    gslobj_vector cross( gsl_vector* o );
+       /* produit vectoriel : le resultat est stocké dans this*/
+    int scross( const gslobj_vector& o );
+    int scross( double* o );
+    int scross( gsl_vector* o );
+
+
+       /* norme */
+
+/*==PS========================================*/
+//    double norm1( ); /* somme des valeurs absolues de chaque 
+//                                      composantes du vecteur (norme discrete)*/
+/*==PS========================================*/
+
+    double norm2( ); /* norme "normale" */
+
+       /* normalisation */
+    gslobj_vector normalize( ); /* resultat renvoyé */
+    int snormalize( ); /* resultat stocké dans this */ 
+
+    private:
+
+    gsl_vector* _gsl;
+    bool _copy;
+    gsl_vector_view _view;
+};
+
+
+
+/*======================================================================================*/
+/*=================================gslobj_matrix========================================*/
+/*======================================================================================*/
+class gslobj_matrix {
+
+    friend std::ostream& operator<<( std::ostream& os, const gslobj_matrix& m );
+
+    public:
+
+    gslobj_matrix( size_t r = 3, size_t c = 3 );
+    gslobj_matrix( const gslobj_matrix& m );
+    gslobj_matrix( double* m, size_t r, size_t c );
+    gslobj_matrix( double* m[], size_t r, size_t c );
+    gslobj_matrix( gsl_matrix* m );
+
+/*==PS========================================*/
+//    void resize( size_t r, size_t c );
+/*==PS========================================*/
+
+    ~gslobj_matrix( ) { if( _copy ) gsl_matrix_free( _gsl ); }
+
+    gslobj_matrix& operator=( const gslobj_matrix& o );
+    gslobj_matrix& operator=( double o );
+    gslobj_matrix& operator=( double* o );
+    gslobj_matrix& operator=( double* o[] );
+    gslobj_matrix& operator=( gsl_matrix* o );
+
+    operator gsl_matrix*( ) const { return( _gsl ); }
+    operator double*( ) const { return( _gsl->data ); }
+               
+    size_t size1( ) const { return( _gsl->size1 ); }
+    size_t size2( ) const { return( _gsl->size2 ); }
+    size_t rows( ) const { return( _gsl->size1 ); }
+    size_t columns( ) const { return( _gsl->size2 ); }
+    double& operator()( size_t i, size_t j );
+    const double& operator()( size_t i, size_t j ) const;
+
+/*==PS========================================*/
+//    void setValue( size_t i, size_t j, double val );
+/*==PS========================================*/
+
+    bool operator==( const gslobj_matrix& o ) const;
+    bool operator!=( const gslobj_matrix& o ) const 
+    {
+      return( !( ( *this ) == o ) );
+    }
+
+    gslobj_matrix operator+( const gslobj_matrix& o );
+    gslobj_matrix operator+( double o );
+    gslobj_matrix operator+( double* o );
+    gslobj_matrix operator+( double* o[] );
+    gslobj_matrix operator+( gsl_matrix* o );
+    gslobj_matrix& operator+=( const gslobj_matrix& o );
+    gslobj_matrix& operator+=( double o );
+    gslobj_matrix& operator+=( double* o );
+    gslobj_matrix& operator+=( double* o[] );
+    gslobj_matrix& operator+=( gsl_matrix* o );
+
+    gslobj_matrix operator-( const gslobj_matrix& o );
+    gslobj_matrix operator-( double o );
+    gslobj_matrix operator-( double* o );
+    gslobj_matrix operator-( double* o[] );
+    gslobj_matrix operator-( gsl_matrix* o );
+    gslobj_matrix& operator-=( const gslobj_matrix& o );
+    gslobj_matrix& operator-=( double o );
+    gslobj_matrix& operator-=( double* o );
+    gslobj_matrix& operator-=( double* o[] );
+    gslobj_matrix& operator-=( gsl_matrix* o );
+
+    gslobj_matrix operator*( const gslobj_matrix& o );
+    gslobj_matrix operator*( double o );
+    gslobj_matrix operator*( double* o );
+    gslobj_matrix operator*( double* o[] );
+    gslobj_matrix operator*( gsl_matrix* o );
+    gslobj_vector operator*( const gslobj_vector& o );
+    gslobj_matrix& operator*=( const gslobj_matrix& o );
+    gslobj_matrix& operator*=( double o );
+    gslobj_matrix& operator*=( double* o );
+    gslobj_matrix& operator*=( double* o[] );
+    gslobj_matrix& operator*=( gsl_matrix* o );
+
+/*==PS========================================*/
+//    gslobj_matrix transpose( );
+//    gslobj_matrix invertLU( );
+//    double determinant( );
+
+//    bool isSquare( ) { return( _gsl->size1 == _gsl->size2 ); }
+//    void identity( );
+/*==PS========================================*/
+
+    private:
+
+    gsl_matrix* _gsl;
+    bool _copy;
+    gsl_matrix_view _view;
+};
+
+#endif // __GSL__OBJ__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/itkFM3D.cxx b/lib/maracasVisuLib/src/kernel/itkFM3D.cxx
new file mode 100644 (file)
index 0000000..5e200d9
--- /dev/null
@@ -0,0 +1,416 @@
+//--------------------------------------------------------------------------------------------
+// INCLUDES
+//--------------------------------------------------------------------------------------------
+#include "itkFM3D.h"
+
+
+#include "itkImage.h"
+#include "itkImageFileReader.h"
+#include "itkImageFileWriter.h"
+#include "itkSigmoidImageFilter.h"
+#include "itkFastMarchingImageFilter.h"
+#include "itkCurvatureAnisotropicDiffusionImageFilter.h"
+#include "itkBinaryThresholdImageFilter.h"
+#include "itkVTKImageToImageFilter.h"
+#include "itkImageToVTKImageFilter.h"
+#include "itkVTKImageIO.h"
+
+#include "vtkOtsuImageData.h"
+#include "vtkImageCast.h"
+#include "vtkMetaImageWriter.h"
+
+#include "vtkDataSetWriter.h"
+
+
+#include <wx/arrstr.h>
+#include <wx/process.h>
+
+
+itkFM3D::itkFM3D(){
+       usefilter       = 1; // Por defecto hacer el filtrado de ruido con la curvatura anisotropica.
+       alpha           = 0.5;
+       beta            = 128.0;
+       stopTime        = 10; // Valor por defecto;
+       x = 0;
+       y = 0;
+       z = 0;
+}
+       
+itkFM3D::~itkFM3D(){
+
+}
+       
+void itkFM3D::AddSeed(int x, int y, int z){
+       this->x = x;
+       this->y = y;
+       this->z = z;
+}
+
+void itkFM3D::SetAlpha(double alpha){
+
+       this->alpha = alpha;
+}
+
+void itkFM3D::SetBeta(double beta){
+       this->beta = beta;
+}
+
+
+void itkFM3D::SetStopTime(double stopTime){
+       this->stopTime = stopTime;
+}
+
+void itkFM3D::CurvatureAnisotropicFiltertOn(){
+       usefilter = 1;
+}
+
+void itkFM3D::CurvatureAnisotropicFilterOff(){
+       usefilter = 0;
+}
+
+
+vtkImageData* itkFM3D::segment(vtkImageData *volume){
+
+       volume->SetSpacing(1,1,1);
+
+
+       double spc[3];
+       volume->GetSpacing(spc);
+       
+
+       double xx = x; // * spc[0];
+       double yy = y; // * spc[1];
+       double zz = z; // * spc[2];
+
+
+       /*FILE *ff;
+       ff=fopen("programa/Ups.bat","w");
+       fprintf(ff,"vtkViewer imagen.vtk %d %d %d %f %f %f \n",(int)xx,(int)yy,(int)zz,(float)alpha,(float)beta,(float)stopTime);
+       fclose(ff);
+    int code = wxExecute("programa/Ups.bat", wxEXEC_SYNC);*/
+
+       
+
+
+
+
+  //DEFINICION IMAGEN ENTRADA
+  //--------------------------------------------------------------------------------------------
+  typedef   double           InternalPixelType;
+  const     unsigned int    DIMENSION_IMAGEN = 3;
+  typedef itk::Image< InternalPixelType, DIMENSION_IMAGEN >  InternalImageType;
+  
+
+
+  // CONVERTIR LA IMAGEN DE ENTRADA A ITK PARA SER PROCESADA
+  //--------------------------------------------------------------------------------------------
+
+  vtkImageCast *ic = vtkImageCast::New();
+  ic->SetInput(volume);
+  ic->SetOutputScalarTypeToDouble();
+  ic->Update();
+  typedef itk::VTKImageToImageFilter<InternalImageType> VtkToItkFilterType;
+  VtkToItkFilterType::Pointer toItk = VtkToItkFilterType::New();
+  toItk->SetInput( ic->GetOutput() );
+  toItk->Update();
+   const InternalImageType* itkImageData = toItk->GetOutput();
+  itkImageData->Register();
+
+  //typedef itk::ImageFileReader<InternalImageType> ReaderType;
+  //ReaderType::Pointer reader = ReaderType::New();
+  //reader->SetFileName("imagen.vtk");
+
+  //reader->Update();
+
+  //InternalImageType* itkImageData = null; //reader->GetOutput();
+        
+  
+
+
+  //DEFINICION WRITER 
+  //--------------------------------------------------------------------------------------------
+ // typedef itk::ImageFileWriter<InternalImageType> WriterType;
+
+
+  //DEFINICION DEL FILTRADO ANISOTROPICO
+  //--------------------------------------------------------------------------------------------
+  typedef itk::CurvatureAnisotropicDiffusionImageFilter<
+                                InternalImageType,
+                                InternalImageType > SmoothingFilterType;
+
+  SmoothingFilterType::Pointer filtroAnisotropico = SmoothingFilterType::New();
+
+  
+   
+  //DEFINICION DEL FILTRO SIGMOIDE 
+  //--------------------------------------------------------------------------------------------
+  typedef   itk::SigmoidImageFilter<                               
+                               InternalImageType, 
+                               InternalImageType >  SigmoidFilterType;
+
+  SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
+
+  sigmoid->SetOutputMinimum(  0.0  );
+  sigmoid->SetOutputMaximum(  255  );
+  sigmoid->SetAlpha(this->alpha);
+  sigmoid->SetBeta(this->beta);
+
+  
+
+  //DECLARACION DEL FILTRO DE FAST MARCHING
+  //--------------------------------------------------------------------------------------------
+  typedef  itk::FastMarchingImageFilter< InternalImageType, 
+                              InternalImageType >    FastMarchingFilterType;
+  FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
+
+  //DECLARACION DEL FILTRO THRESHOLDING BINARIO
+  //--------------------------------------------------------------------------------------------
+  typedef itk::BinaryThresholdImageFilter<InternalImageType, InternalImageType > ThresholdingFilterType;
+  ThresholdingFilterType::Pointer thresholdFilter = ThresholdingFilterType::New();
+
+  //--------------------------------------------------------------------------------------------   
+  // ESTABLECIMIENTO DE LA SEMILLA DEL FAST MARCHING
+  //--------------------------------------------------------------------------------------------
+  typedef FastMarchingFilterType::NodeContainer           NodeContainer;
+  typedef FastMarchingFilterType::NodeType                NodeType;
+  NodeContainer::Pointer seeds = NodeContainer::New();  
+
+  InternalImageType::IndexType  seedPosition;
+  seedPosition[0] = this->x; // POSICION X DE LA SEMILLA
+  seedPosition[1] = this->y; // POSICION Y DE LA SEMILLA
+  seedPosition[2] = this->z; // POSICION Z DE LA SEMILLA
+
+  NodeType node;
+  const double seedValue = 0.0;
+  
+  node.SetValue( seedValue );
+  node.SetIndex( seedPosition );
+
+  seeds->Initialize();
+  seeds->InsertElement( 0, node );
+
+
+  //COLOCAR VARIAS SEMILLAS
+  fastMarching->SetTrialPoints(  seeds  );
+  fastMarching->SetOutputSize(itkImageData->GetBufferedRegion().GetSize() );
+  fastMarching->SetStoppingValue(this->stopTime);
+
+
+  //DEFINICION WRITER FILTRADO ANISOTROPICO
+  //WriterType::Pointer writerFiltroRuido = WriterType::New();
+  //writerFiltroRuido->SetFileName("filtrado.vtk");
+
+  
+  //DEFINICION WRITER SIGMOIDE
+  //--------------------------------------------------------------------------------------------
+  //WriterType::Pointer writerSigmoide = WriterType::New();
+  //writerSigmoide->SetFileName("sigmoid.vtk");
+
+
+
+  //DEFINICION WRITER FAST MARCHING MAPA DE TIEMPOS
+  //--------------------------------------------------------------------------------------------
+  /*typedef itk::VTKImageIO ImageIOType;
+  ImageIOType::Pointer vtkIO = ImageIOType::New();
+  vtkIO->SetFileTypeToASCII();
+
+  WriterType::Pointer writerMapaTiempos = WriterType::New();
+  writerMapaTiempos->SetFileName("fastmarch.vtk");
+  writerMapaTiempos->SetImageIO(vtkIO);*/
+
+
+  //DEFINICION WRITER THRESHOLD BINARIO
+  //--------------------------------------------------------------------------------------------
+//  WriterType::Pointer writerThreshold = WriterType::New();
+ // writerThreshold->SetFileName("binario.vtk");
+  //writerThreshold->SetImageIO(vtkIO);
+  
+
+  //--------------------------------------------------------------------------------------------
+  // CONSTRUCCION DEL PIPELINE DE PROCESAMIENTO
+  //--------------------------------------------------------------------------------------------
+  // READER -> FILTRO ANISOTROPICO
+  //FILTRO ANISOTROPICO -> SIGMOIDE
+  if (usefilter == 1){
+       //filtroAnisotropico->SetInput(itkImageData);
+       //sigmoid->SetInput(filtroAnisotropico->GetOutput());
+         sigmoid->SetInput(itkImageData);
+  }
+  else {
+         sigmoid->SetInput(itkImageData);
+  }
+
+  // SIGMOIDE -> FAST MARCHING
+  fastMarching->SetInput(sigmoid->GetOutput());
+  
+    
+  // FAST MARCHING -> WRITER
+  //writerFiltroRuido->SetInput(filtroAnisotropico->GetOutput());
+  //writerSigmoide->SetInput(sigmoid->GetOutput());
+  //writerMapaTiempos->SetInput(fastMarching->GetOutput());
+  //writerFiltroRuido->Update();
+
+  
+  //----------------------------------------------------------------------------------------
+  //Ejecucion de OTSU
+  //----------------------------------------------------------------------------------------
+
+  //DEFINICION DE IMAGEN VTK FILTRADA CON ANISOTROPICO
+  //--------------------------------------------------------------------------------------------
+  typedef itk::ImageToVTKImageFilter<InternalImageType> ItkToVtkFilterType;
+  
+  
+  /*vtkOtsuImageData* otsu = new vtkOtsuImageData();
+
+  if(this->usefilter){
+       printf("Calculando Th Otsu sobre la imagen filtrada\n");
+        ItkToVtkFilterType::Pointer toVtk = ItkToVtkFilterType::New();
+       toVtk->SetInput(filtroAnisotropico->GetOutput());
+       toVtk->Update();
+       vtkImageData* imagenFiltrada = toVtk->GetOutput();
+       estimatedOtsuThreshold = otsu->calculateOptimalThreshold(imagenFiltrada);
+  }
+  else{
+    printf("Calculando Th Otsu sobre la imagen original\n");
+       estimatedOtsuThreshold = otsu->calculateOptimalThreshold(volume);
+  }
+  
+  printf("BETA = %.0f, OTSU = %d\n",beta,estimatedOtsuThreshold);*/
+
+  //sigmoid->SetBeta((double)ThresholdOtsu);
+  
+  //----------------------------------------------------------------------------------------
+  
+  
+  //--------------------------------------------------------------------------------------------  
+  // EJECUCION DEL PIPELINE
+  //--------------------------------------------------------------------------------------------
+  try
+  {
+         fastMarching->Update();
+         //writerFiltroRuido->Update();
+         //writerSigmoide->Update();
+         //writerMapaTiempos->Update();
+      printf("Writers (ruido,sigmoide, mapatiempos) procesados \n");
+  }
+  catch( itk::ExceptionObject & excep )
+  {
+    std::cerr << "Ocurrio un problema" << std::endl;
+    std::cerr << excep << std::endl;
+  }
+
+  
+  //---------------------------------------------------------
+  // LEYENDO MAPA DE TIEMPOS
+  //---------------------------------------------------------
+  // En esta parte escribimos el mapa de tiempos a un archivo plano para
+  // poder estudiarlo en Excel.
+
+    printf("Procesando el mapa de tiempos....");
+
+       //ACTIVAR PARA DEBUG
+       //-----------------------------
+       //FILE *logger = NULL;
+       //      if ((logger = freopen("mapatiempos.txt","w", stdout)) == NULL)
+       //              exit(-1);
+
+       
+               
+       InternalImageType::Pointer mapa = fastMarching->GetOutput();  
+
+       typedef itk::ImageRegionConstIterator< InternalImageType > ConstIteratorType;
+
+       ConstIteratorType constIterator( mapa, mapa->GetLargestPossibleRegion() );
+
+       
+       // inicializar histogramas
+       double valor = 0.0;
+       int indice = 0;
+
+       int histoTiempos[1000];
+       int histoAcumulado[1000];
+
+       for (indice = 0; indice <= 1000; indice++){
+               histoTiempos[indice] = 0;
+               histoAcumulado[indice] = 0;
+       }
+
+       
+       // calcular histograma
+       for (constIterator.GoToBegin(); !constIterator.IsAtEnd(); ++ constIterator){
+               valor = constIterator.Get();
+               if (valor <= 10){
+                       indice = (int)(valor * 100);
+                       histoTiempos[indice]++;
+
+               }
+       }
+
+       //calcular histograma acumulado
+       for (indice = 1 ; indice <= 1000; indice++){
+               histoAcumulado[indice]= histoAcumulado[indice-1]+ histoTiempos[indice];
+       }
+
+       //buscar la frecuencia minima = derivada de la funcion de frecuencia acumulada
+       int frecuenciaMinima = 1000000000;
+       int indiceBuscado = -1;
+       for (indice = 0; indice <= 1000; indice++){
+               if (histoTiempos[indice] < frecuenciaMinima){
+                       frecuenciaMinima = histoTiempos[indice];
+                       indiceBuscado = indice;
+               }
+               
+       }
+
+    
+       double valorThreshold = (double)indiceBuscado / 100.0;
+       
+       printf("VALOR DE SEGMENTACION: %.2f\n\n",valorThreshold);
+       
+
+       //for (indice = 0; indice <= 1000; indice++){
+       //      printf("%.2f:%d:%d\n",(double)indice/100.0, histoTiempos[indice], histoAcumulado[indice]);
+       //}
+
+       
+       //fclose(logger);
+       //logger = NULL;
+
+       printf("Mapa de tiempos OK");
+
+
+       thresholdFilter->SetOutsideValue( 0 );
+       thresholdFilter->SetInsideValue( 255 );
+       thresholdFilter->SetLowerThreshold(0);
+       thresholdFilter->SetUpperThreshold(valorThreshold);
+
+       thresholdFilter->SetInput(fastMarching->GetOutput());
+//     writerThreshold->SetInput(thresholdFilter->GetOutput());
+
+       try{
+               thresholdFilter->Update();
+               //writerThreshold->Update();
+       }
+       catch( itk::ExceptionObject & excep )
+       {
+               std::cerr << "Ocurrio un problema" << std::endl;
+               std::cerr << excep << std::endl;
+       }
+
+       ItkToVtkFilterType::Pointer resultado = ItkToVtkFilterType::New();
+       resultado->SetInput(thresholdFilter->GetOutput());
+       vtkImageData* salida = resultado->GetOutput();
+       resultado->Register();
+       salida->Update();
+       salida->ReleaseDataFlagOff();
+
+
+
+
+       return salida;
+}
diff --git a/lib/maracasVisuLib/src/kernel/itkFM3D.h b/lib/maracasVisuLib/src/kernel/itkFM3D.h
new file mode 100644 (file)
index 0000000..5fb664b
--- /dev/null
@@ -0,0 +1,36 @@
+#include "vtkImageData.h"
+/**
+* Clase para segmentar una imagen usando fast marching
+*
+* La imagen de velocidad se obtiene aplicando una transformacion sigmoide a cada voxel.
+* Dicha transformacion esta regida por los parámetros alfa (pendiente) y beta(centro de pivotaje)
+*/
+
+class itkFM3D
+{
+public:
+       itkFM3D();
+       virtual ~itkFM3D();
+       void AddSeed(int x, int y, int z);
+       void SetAlpha(double alpha);
+       void SetBeta(double beta);
+       void SetStopTime(double stopTime);
+       void CurvatureAnisotropicFiltertOn();
+       void CurvatureAnisotropicFilterOff();
+       vtkImageData* segment(vtkImageData *volume);
+       double GetEstimatedOtsuTreshold();
+       
+protected:
+
+        FILE *logger;
+
+private:
+       double alpha;
+       double beta;
+       double stopTime;
+       int usefilter;
+       int x;
+       int y;
+       int z;
+       double estimatedOtsuThreshold;
+};
diff --git a/lib/maracasVisuLib/src/kernel/itkImageToVTKImageFilter.h b/lib/maracasVisuLib/src/kernel/itkImageToVTKImageFilter.h
new file mode 100644 (file)
index 0000000..0f4dd20
--- /dev/null
@@ -0,0 +1,103 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkImageToVTKImageFilter.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __itkImageToVTKImageFilter_h
+#define __itkImageToVTKImageFilter_h
+
+#include "itkVTKImageExport.h"
+#include "vtkImageImport.h"
+#include "vtkImageData.h"
+
+namespace itk
+{
+  
+/** \class ImageToVTKImageFilter
+ * \brief Converts an ITK image into a VTK image and plugs a 
+ *  itk data pipeline to a VTK datapipeline.   
+ *
+ *  This class puts together an itkVTKImageExporter and a vtkImageImporter.
+ *  It takes care of the details related to the connection of ITK and VTK
+ *  pipelines. The User will perceive this filter as an adaptor to which
+ *  an itk::Image can be plugged as input and a vtkImage is produced as 
+ *  output.
+ * 
+ * \ingroup   ImageFilters     
+ */
+template <class TInputImage >
+class ITK_EXPORT ImageToVTKImageFilter : public ProcessObject
+{
+public:
+  /** Standard class typedefs. */
+  typedef ImageToVTKImageFilter       Self;
+  typedef ProcessObject             Superclass;
+  typedef SmartPointer<Self>        Pointer;
+  typedef SmartPointer<const Self>  ConstPointer;
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(ImageToVTKImageFilter, ProcessObject);
+
+  /** Some typedefs. */
+  typedef TInputImage InputImageType;
+  typedef typename    InputImageType::ConstPointer    InputImagePointer;
+  typedef VTKImageExport< InputImageType>            ExporterFilterType; 
+  typedef typename ExporterFilterType::Pointer        ExporterFilterPointer;
+  /** Get the output in the form of a vtkImage. 
+      This call is delegated to the internal vtkImageImporter filter  */
+  vtkImageData *  GetOutput() const;
+
+  /** Set the input in the form of an itk::Image */
+  void SetInput( const InputImageType * );
+
+  /** Return the internal VTK image importer filter.
+      This is intended to facilitate users the access 
+      to methods in the importer */
+  vtkImageImport * GetImporter() const;
+
+  /** Return the internal ITK image exporter filter.
+      This is intended to facilitate users the access 
+      to methods in the exporter */
+  ExporterFilterType * GetExporter() const;
+  
+  /** This call delegate the update to the importer */
+  void Update();
+  
+protected:
+  ImageToVTKImageFilter(); 
+  virtual ~ImageToVTKImageFilter(); 
+
+private:
+  ImageToVTKImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  ExporterFilterPointer       m_Exporter;
+  vtkImageImport            * m_Importer;
+
+};
+
+} // end namespace itk
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "itkImageToVTKImageFilter.txx"
+#endif
+
+#endif
+
+
+
diff --git a/lib/maracasVisuLib/src/kernel/itkImageToVTKImageFilter.txx b/lib/maracasVisuLib/src/kernel/itkImageToVTKImageFilter.txx
new file mode 100644 (file)
index 0000000..ac38b77
--- /dev/null
@@ -0,0 +1,144 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkImageToVTKImageFilter.txx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef _itkImageToVTKImageFilter_txx
+#define _itkImageToVTKImageFilter_txx
+
+#include "itkImageToVTKImageFilter.h"
+
+namespace itk
+{
+
+
+
+/**
+ * Constructor
+ */
+template <class TInputImage>
+ImageToVTKImageFilter<TInputImage>
+::ImageToVTKImageFilter()
+{
+
+  m_Importer = vtkImageImport::New();
+
+  m_Exporter = ExporterFilterType::New();
+
+  m_Importer->SetUpdateInformationCallback(m_Exporter->GetUpdateInformationCallback());
+  m_Importer->SetPipelineModifiedCallback(m_Exporter->GetPipelineModifiedCallback());
+  m_Importer->SetWholeExtentCallback(m_Exporter->GetWholeExtentCallback());
+  m_Importer->SetSpacingCallback(m_Exporter->GetSpacingCallback());
+  m_Importer->SetOriginCallback(m_Exporter->GetOriginCallback());
+  m_Importer->SetScalarTypeCallback(m_Exporter->GetScalarTypeCallback());
+  m_Importer->SetNumberOfComponentsCallback(m_Exporter->GetNumberOfComponentsCallback());
+  m_Importer->SetPropagateUpdateExtentCallback(m_Exporter->GetPropagateUpdateExtentCallback());
+  m_Importer->SetUpdateDataCallback(m_Exporter->GetUpdateDataCallback());
+  m_Importer->SetDataExtentCallback(m_Exporter->GetDataExtentCallback());
+  m_Importer->SetBufferPointerCallback(m_Exporter->GetBufferPointerCallback());
+  m_Importer->SetCallbackUserData(m_Exporter->GetCallbackUserData());
+
+}
+
+
+
+
+/**
+ * Destructor
+ */
+template <class TInputImage>
+ImageToVTKImageFilter<TInputImage>
+::~ImageToVTKImageFilter()
+{
+  if( m_Importer )
+    {
+    m_Importer->Delete();
+    m_Importer = 0;
+    }
+}
+
+
+
+/**
+ * Set an itk::Image as input 
+ */
+template <class TInputImage>
+void
+ImageToVTKImageFilter<TInputImage>
+::SetInput( const InputImageType * inputImage )
+{
+  m_Exporter->SetInput( inputImage );
+}
+
+
+
+/**
+ * Get a vtkImage as output
+ */
+template <class TInputImage>
+vtkImageData *
+ImageToVTKImageFilter<TInputImage>
+::GetOutput() const
+{
+  return m_Importer->GetOutput();
+}
+
+
+
+
+/**
+ * Get the importer filter
+ */
+template <class TInputImage>
+vtkImageImport *
+ImageToVTKImageFilter<TInputImage>
+::GetImporter() const
+{
+  return m_Importer;
+}
+
+
+
+/**
+ * Get the exporter filter
+ */
+template <class TInputImage>
+typename ImageToVTKImageFilter<TInputImage>::ExporterFilterType *
+ImageToVTKImageFilter<TInputImage>
+::GetExporter() const
+{
+  return m_Exporter.GetPointer();
+}
+
+
+
+/**
+ * Delegate the Update to the importer
+ */
+template <class TInputImage>
+void
+ImageToVTKImageFilter<TInputImage>
+::Update()
+{
+  m_Importer->Update();
+}
+
+
+
+
+
+} // end namespace itk
+
+#endif
+
diff --git a/lib/maracasVisuLib/src/kernel/itkVTKImageToImageFilter.h b/lib/maracasVisuLib/src/kernel/itkVTKImageToImageFilter.h
new file mode 100644 (file)
index 0000000..194dff8
--- /dev/null
@@ -0,0 +1,107 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkVTKImageToImageFilter.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __itkVTKImageToImageFilter_h
+#define __itkVTKImageToImageFilter_h
+
+#include "itkVTKImageImport.h"
+#include "vtkImageExport.h"
+#include "vtkImageData.h"
+
+#ifndef vtkFloatingPointType
+#define vtkFloatingPointType float
+#endif
+
+namespace itk
+{
+  
+/** \class VTKImageToImageFilter
+ * \brief Converts a VTK image into an ITK image and plugs a 
+ *  vtk data pipeline to an ITK datapipeline.   
+ *
+ *  This class puts together an itkVTKImageImporter and a vtkImageExporter.
+ *  It takes care of the details related to the connection of ITK and VTK
+ *  pipelines. The User will perceive this filter as an adaptor to which
+ *  a vtkImage can be plugged as input and an itk::Image is produced as 
+ *  output.
+ * 
+ * \ingroup   ImageFilters     
+ */
+template <class TOutputImage >
+class ITK_EXPORT VTKImageToImageFilter : public ProcessObject
+{
+public:
+  /** Standard class typedefs. */
+  typedef VTKImageToImageFilter       Self;
+  typedef ProcessObject             Superclass;
+  typedef SmartPointer<Self>        Pointer;
+  typedef SmartPointer<const Self>  ConstPointer;
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(VTKImageToImageFilter, ProcessObject);
+
+  /** Some typedefs. */
+  typedef TOutputImage OutputImageType;
+  typedef typename    OutputImageType::ConstPointer    OutputImagePointer;
+  typedef VTKImageImport< OutputImageType >   ImporterFilterType; 
+  typedef typename ImporterFilterType::Pointer         ImporterFilterPointer;
+  /** Get the output in the form of a vtkImage. 
+      This call is delegated to the internal vtkImageImporter filter  */
+  const OutputImageType *  GetOutput() const;
+
+  /** Set the input in the form of a vtkImageData */
+  void SetInput( vtkImageData * );
+
+  /** Return the internal VTK image exporter filter.
+      This is intended to facilitate users the access 
+      to methods in the exporter */
+  vtkImageExport * GetExporter() const;
+
+  /** Return the internal ITK image importer filter.
+      This is intended to facilitate users the access 
+      to methods in the importer */
+  ImporterFilterType * GetImporter() const;
+  
+  /** This call delegate the update to the importer */
+  void Update();
+  
+protected:
+  VTKImageToImageFilter(); 
+  virtual ~VTKImageToImageFilter(); 
+
+private:
+  VTKImageToImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  ImporterFilterPointer       m_Importer;
+  vtkImageExport            * m_Exporter;
+
+};
+
+} // end namespace itk
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "itkVTKImageToImageFilter.txx"
+#endif
+
+#endif
+
+
+
diff --git a/lib/maracasVisuLib/src/kernel/itkVTKImageToImageFilter.txx b/lib/maracasVisuLib/src/kernel/itkVTKImageToImageFilter.txx
new file mode 100644 (file)
index 0000000..c39e351
--- /dev/null
@@ -0,0 +1,144 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkVTKImageToImageFilter.txx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef _itkVTKImageToImageFilter_txx
+#define _itkVTKImageToImageFilter_txx
+
+#include "itkVTKImageToImageFilter.h"
+
+namespace itk
+{
+
+
+
+/**
+ * Constructor
+ */
+template <class TOutputImage>
+VTKImageToImageFilter<TOutputImage>
+::VTKImageToImageFilter()
+{
+
+  m_Exporter = vtkImageExport::New();
+
+  m_Importer = ImporterFilterType::New();
+
+  m_Importer->SetUpdateInformationCallback( m_Exporter->GetUpdateInformationCallback());
+  m_Importer->SetPipelineModifiedCallback( m_Exporter->GetPipelineModifiedCallback());
+  m_Importer->SetWholeExtentCallback( m_Exporter->GetWholeExtentCallback());
+  m_Importer->SetSpacingCallback( m_Exporter->GetSpacingCallback());
+  m_Importer->SetOriginCallback( m_Exporter->GetOriginCallback());
+  m_Importer->SetScalarTypeCallback( m_Exporter->GetScalarTypeCallback());
+  m_Importer->SetNumberOfComponentsCallback( m_Exporter->GetNumberOfComponentsCallback());
+  m_Importer->SetPropagateUpdateExtentCallback( m_Exporter->GetPropagateUpdateExtentCallback());
+  m_Importer->SetUpdateDataCallback( m_Exporter->GetUpdateDataCallback());
+  m_Importer->SetDataExtentCallback( m_Exporter->GetDataExtentCallback());
+  m_Importer->SetBufferPointerCallback( m_Exporter->GetBufferPointerCallback());
+  m_Importer->SetCallbackUserData( m_Exporter->GetCallbackUserData());
+
+}
+
+
+
+
+/**
+ * Destructor
+ */
+template <class TOutputImage>
+VTKImageToImageFilter<TOutputImage>
+::~VTKImageToImageFilter()
+{
+  if( m_Exporter )
+    {
+    m_Exporter->Delete();
+    m_Exporter = 0;
+    }
+}
+
+
+
+/**
+ * Set a vtkImageData as input 
+ */
+template <class TOutputImage>
+void
+VTKImageToImageFilter<TOutputImage>
+::SetInput( vtkImageData * inputImage )
+{
+  m_Exporter->SetInput( inputImage );
+}
+
+
+
+/**
+ * Get an itk::Image as output
+ */
+template <class TOutputImage>
+const typename VTKImageToImageFilter<TOutputImage>::OutputImageType *
+VTKImageToImageFilter<TOutputImage>
+::GetOutput() const
+{
+  return m_Importer->GetOutput();
+}
+
+
+
+
+/**
+ * Get the exporter filter
+ */
+template <class TOutputImage>
+vtkImageExport *
+VTKImageToImageFilter<TOutputImage>
+::GetExporter() const
+{
+  return m_Exporter;
+}
+
+
+
+/**
+ * Get the importer filter
+ */
+template <class TOutputImage>
+typename VTKImageToImageFilter<TOutputImage>::ImporterFilterType *
+VTKImageToImageFilter<TOutputImage>
+::GetImporter() const
+{
+  return m_Importer;
+}
+
+
+
+
+/**
+ * Delegate the Update to the importer
+ */
+template <class TOutputImage>
+void
+VTKImageToImageFilter<TOutputImage>
+::Update()
+{
+  m_Importer->Update();
+}
+
+
+
+
+} // end namespace itk
+
+#endif
+
diff --git a/lib/maracasVisuLib/src/kernel/marAxis.cpp b/lib/maracasVisuLib/src/kernel/marAxis.cpp
new file mode 100644 (file)
index 0000000..4a43e14
--- /dev/null
@@ -0,0 +1,1552 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marAxis.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include <vtkPlaneSource.h>
+#include <vtkKochanekSpline.h>
+#include <vtkPolyDataConnectivityFilter.h>        
+#include <vtkContourFilter.h>
+#include <vtkProbeFilter.h>
+
+
+#include <vtkImageChangeInformation.h>
+#include <vtkImageShiftScale.h> 
+#include <vtkDoubleArray.h> 
+
+
+#include "marAxis.h"
+#include "marVector.h"
+
+#include "ExtractionAxe.h"
+#include "FonctionsGrales.h"
+
+#include <vtkCellArray.h>
+#include <vtkCell.h>
+#include <vtkCleanPolyData.h>
+#include <vtkIdList.h>
+#include <vtkMath.h>
+#include <vtkMatrix4x4.h> 
+#include <vtkPointData.h>
+#include <vtkPolyData.h>
+#include <vtkPlane.h>
+#include <vtkSetGet.h>
+#include <vtkStripper.h>
+#include <vtkStructuredPoints.h>
+#include <vtkTransform.h> 
+
+// ----------------------------------------------------------------------------
+marAxis::marAxis( marParameters* p ) : 
+       marObject( p ), 
+          kCurve( 3, INDX_count - 3 ),
+      _healthySlice( -1 ), _startQuant( -1 ),
+      _finishQuant( -1 ), _actualQuant( -1 )
+
+{
+       _totalAxisLenght=-1;
+       _subAxisLenght=-1;
+       _referenceArea=-1;
+       _referenceAverDiam=-1;
+
+
+    _allData = NULL;
+
+       _healthySliceStart=-1;
+       _healthySliceEnd=-1;
+    reset( );
+       calibration = false;
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::addAxisPoint( double* p )
+{
+    double pt[ INDX_count ];
+
+    memcpy( pt, p, sizeof( POINTAXE ) );
+    pt[ INDX_SIGNALVALUE ] = 0;
+    addControlPoint( pt, pt + 3 );
+}
+
+// ----------------------------------------------------------------------------
+
+double* marAxis::getNormal( unsigned int slice ) {
+
+    double* ret = new double[ 3 ];
+
+    if ( slice == 0 ) {
+      ret[0] = _points[ slice + 1 ][0] - _points[ slice ][0];
+      ret[1] = _points[ slice + 1 ][1] - _points[ slice ][1];
+      ret[2] = _points[ slice + 1 ][2] - _points[ slice ][2];
+    }
+    else if ( slice == _points.size( ) - 1 ) {
+      ret[0] = _points[ slice - 1 ][0] - _points[ slice ][0];
+      ret[1] = _points[ slice - 1 ][1] - _points[ slice ][1];
+      ret[2] = _points[ slice - 1 ][2] - _points[ slice ][2];
+    }
+    else if ( slice > 0 && slice < _points.size( ) - 1 ) {
+      ret[0] = _points[ slice - 1 ][0] - _points[ slice + 1 ][0];
+      ret[1] = _points[ slice - 1 ][1] - _points[ slice + 1 ][1];
+      ret[2] = _points[ slice - 1 ][2] - _points[ slice + 1 ][2];
+    }
+
+    return( ret );
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::changeAxisResolution( )
+{/*
+   int i;
+   int nOut = ( int )ceil(
+   getParameters( )->
+   getDoubleParam( marParameters::e_axis_discret_step )
+   * ( double )( GetNumberOfPoints( ) )
+   );
+
+   i = GetNumberOfPoints( );
+   double d = getParameters( )->
+   getDoubleParam( marParameters::e_axis_discret_step );
+
+   SetResolution( nOut );
+   for( i = 0; i < _contours.size( ); i++ )
+   delete _contours[ i ];
+   _contours.clear( );
+   for( i = 0; i < nOut; i++ )
+   _contours.push_back( new marContour( getParameters( ) ) );
+ */
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::calculateSignal( kVolume* vol )
+{
+   /**
+    * PSIGNAL_USHORT <-> unsigned short *
+    */
+    /* PSIGNAL_FLOAT PutSignalValueFloat(PSIGNAL_FLOAT signal, int pos, float value)
+    {
+      signal[pos] = value;
+      return signal;
+    }*/
+  ushort maxlocal;
+  double *p;
+
+  double rayon;
+  unsigned int i, mask_size = getParameters( )-> getIntParam( marParameters::e_mask_size );
+
+  while( _signal.size( ) > 0 ) _signal.pop_back( );
+  // Intensity signal
+
+  PSIGNAL_USHORT signal = ( PSIGNAL_USHORT ) IdSigAlloc( _points.size( ), SIG_USHORT );
+  for( i = 0; i < _points.size( ); i++ ) {
+    p = _points[i];
+    rayon = RayonLocal(
+                      ( int ) ( p[ 0 ] ),
+                      ( int ) ( p[ 1 ] ),
+                      ( int ) ( p[ 2 ] ),
+                      _points_disc, getNumberOfControlPoints( ));
+
+    maxlocal = vol->GetMaxIntSphere2( p, rayon );
+    PutSignalValue( signal, i, maxlocal );
+  } // rof
+
+  PSIGNAL_FLOAT mask_signal = ( PSIGNAL_FLOAT )IdSigAlloc( mask_size, SIG_FLOAT );
+
+  for( i = 0; i < mask_size; i++ )
+    PutSignalValueFloat( mask_signal, i, 1 );
+
+  PSIGNAL_USHORT signalfilt = ( PSIGNAL_USHORT )IdSigAlloc( _points.size( ), SIG_USHORT );
+  signalfilt = MonSigConvolve( signal, mask_signal, signalfilt, 1.0 / ( double )mask_size, 0 );
+  for( i = 0; i < _points.size( ); i++ ){
+    _signal.push_back( GetSignalValue( signalfilt, i ) );
+  }
+  IdSigFree( signal );
+  IdSigFree( mask_signal );
+  IdSigFree( signalfilt );
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::start( )
+{
+    /* TODO
+       int swap, n = GetNumberOfPoints( );
+
+       swap = GSL_MIN( _startQuant, _finishQuant );
+       _finishQuant = GSL_MAX( _startQuant, _finishQuant );
+       _startQuant = swap;
+
+       _startQuant = ( _startQuant >= 0 )? _startQuant: 0;
+       _finishQuant = ( _finishQuant >= n )? _finishQuant: n - 1;
+       _actualQuant = _startQuant;
+    */
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::cut( int slice, bool up )
+{ // TODO
+}
+
+
+// ----------------------------------------------------------------------------
+void marAxis::doSpline( )
+{
+  unsigned int i;
+  unsigned int nop, nip;
+  float length=0, t;
+  float p1[ 3 ], p2[ 3 ];
+  double p[marAxis::INDX_count];
+
+  vtkKochanekSpline* spX = vtkKochanekSpline::New( );
+  vtkKochanekSpline* spY = vtkKochanekSpline::New( );
+  vtkKochanekSpline* spZ = vtkKochanekSpline::New( );
+
+  for( i = 0, length = 0.0; i < _controlPoints.size( ); i++ ) {
+    getControlPoint(i, p, p+3);
+    p2[ 0 ] = (float) p[marAxis::INDX_X];
+    p2[ 1 ] = (float) p[marAxis::INDX_Y];
+    p2[ 2 ] = (float) p[marAxis::INDX_Z];
+    spX->AddPoint( (float) i, p2[ 0 ] );
+    spY->AddPoint( (float) i, p2[ 1 ] );
+    spZ->AddPoint( (float) i, p2[ 2 ] );
+    if( i > 0 )
+      length += (float) (sqrt( (p2[0]-p1[0])*(p2[0]-p1[0]) +
+                               (p2[1]-p1[1])*(p2[1]-p1[1]) +
+                               (p2[2]-p1[2])*(p2[2]-p1[2]) ) );
+    p1[ 0 ] = p2[ 0 ]; p1[ 1 ] = p2[ 1 ]; p1[ 2 ] = p2[ 2 ];
+  } // rof
+
+  nop = ( unsigned int ) ( getParameters( )->getDoubleParam(
+                                           marParameters::e_axis_discret_step ) * length );
+  nip = _controlPoints.size( );
+  _healthySlice = -1;
+
+  while( _points.size( ) > 0 ) {
+    delete _points[ _points.size( ) - 1 ];
+    _points.pop_back( );
+  } // fwhile
+
+  while( _contours.size( ) > 0 ) {
+    delete _contours[ _contours.size( ) - 1 ];
+    _contours.pop_back( );
+  } // fwhile
+
+  for( i = 0; i < nop; i++ ) {
+    t = (float) (( ( double ) nip - 1.0 ) / ( ( double ) nop - 1.0 ) * i);
+    double* np = new double[ 3 ];
+    np[ 0 ] =  0;
+    np[ 1 ] =  0;
+    np[ 2 ] =  0;
+    np[ 0 ] = (double) (spX->Evaluate( t ));
+    np[ 1 ] = (double) (spY->Evaluate( t ));
+    np[ 2 ] = (double) (spZ->Evaluate( t ));
+    _points.push_back( np );
+    _contours.push_back( new marContour( i, getParameters( ) ) );
+
+  } // rof
+
+  spX->Delete( );
+  spY->Delete( );
+  spZ->Delete( );
+
+}
+
+
+
+// ----------------------------------------------------------------------------
+void marAxis::sliceVolumeAxis( kVolume* vol, bool forceCnt )
+{
+/*
+  int nCnts = ( int ) getNumberOfSplinePoints( );
+  int sizeIma = getParameters( )->getSizeIma( );
+  double dimIma = getParameters( )->getDimIma( );
+  double voxSize = getParameters( )->getVoxelSize( );
+
+  if( forceCnt )
+    for( unsigned int i = 0; i < _contours.size( ); i++ )
+      delete _contours[ i ];
+    _contours.clear( );
+
+    for( unsigned int i = 0; i < _slices.size( ); i++ ) {
+      delete _slices[ i ];
+      _3Dslices[ i ]->Delete( );
+      _quantificationImages[ i ]->Delete( );
+    }
+
+  _slices.clear( );
+  _3Dslices.clear( );
+  _quantificationImages.clear( );
+
+
+  // "Cutter" initialization
+  vtkStructuredPoints* stPoints = vtkStructuredPoints::New( );
+  // Perform "cut"
+  double *p, *n;
+  for( int k = 0; k < nCnts; k++ ) {
+    //s = ( double )k / ( double )( nCnts - 1 );
+    p = _points[k];
+    n = getNormal( k );
+    vtkPlaneSource* pSource = vtkPlaneSource::New( );
+    pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
+    pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
+    pSource->SetPoint2( p[ 0 ], p[ 1 ], p[ 2 ] + dimIma - 1.0 );
+    pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
+    pSource->Update( );
+    pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
+    pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
+    pSource->Update( );
+
+    _3Dslices.push_back( vtkProbeFilter::New( ) );
+    _3Dslices[ k ]->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
+    _3Dslices[ k ]->SetSource( vol->castVtk( ) );
+    _3Dslices[ k ]->Update( );
+    pSource->Delete( );
+
+    stPoints->GetPointData( )->
+               SetScalars( _3Dslices[ k ]->GetOutput( )->
+               GetPointData( )->GetScalars( ) );
+    stPoints->SetDimensions( sizeIma, sizeIma, 1 );
+    stPoints->SetScalarType( vol->castVtk( )->GetDataObjectType( ) );
+    stPoints->Update( );
+    if( forceCnt )
+      {
+               marContour* tmp_marContour = new marContour( k, getParameters( ) ) ;
+               tmp_marContour->calculateVariables();
+               _contours.push_back( tmp_marContour );
+       }
+    _slices.push_back( new kVolume( kVolume::UCHAR, 1, 1, 1 ) );
+
+    *( _slices[ k ] ) = ( vtkImageData* )stPoints;  //copy
+    _quantificationImages.push_back( (_slices[ k ])->castVtk( ) );
+  } // rof
+
+  stPoints->Delete( );
+*/
+}
+
+
+
+// ----------------------------------------------------------------------------
+int marAxis::getNumberOfContours( )
+{
+    return( _contours.size( ) );
+}
+
+// ----------------------------------------------------------------------------
+int marAxis::getNumberOfSplinePoints( )
+{
+    return( _points.size( ) );
+}
+
+/*
+// EED Esto toca limpiarlo o reimplementarlo en varias partes o algo
+// ----------------------------------------------------------------------------
+vtkPolyData* marAxis::setContour( int i, int x, int y,  std::vector< double* >* points, marContour* c )
+{
+       if( c != NULL ) 
+       {
+               c->setS( c->getS( ) );
+               _contours[ i ]->copyFrom( *c );
+       } 
+       else 
+       {
+               // PS -> //    int numberOfPoints, numberOfCells; // PS
+               // PS -> //    int id; // PS
+               // PS -> //    gslobj_vector p( 3 ); // PS
+               // PS -> //    double new_p[3]; // PS
+               // PS -> //    float pf[ 3 ]; // PS
+               vtkImageData* imagedata;
+               
+               // Contour parameters
+               // PS ->     int typ = getParameters( )->getIntParam( marParameters::e_algorithm_type );
+               double thr = getParameters( )->getDoubleParam( marParameters::e_threshold_isocontour );
+               
+               // PS ->        double thr = ( typ == marParameters::ISOCONTOURS )?
+               // PS ->       getParameters( )->
+               // PS ->       getDoubleParam( marParameters::e_threshold_isocontour ):
+               // PS ->     ( typ == marParameters::SNAKE ) ?
+               // PS ->       getParameters( )->
+               // PS ->       getDoubleParam( marParameters::e_threshold_snake_isocontour ):
+               // PS ->     30;
+               
+               
+               int sizeIma = getParameters( )->getSizeIma( );
+               double localint = getSignal( i );
+               double sigma = getParameters( )->getDoubleParam( marParameters::e_sigma );
+               double threshold = localint * thr / 100.0;
+               int dimIma    = ( int ) ( ( double ) sizeIma /getParameters( )->getDoubleParam( marParameters::e_scale ) );
+               int vmin = ( int )threshold;
+               int vmax = ( int )threshold;
+               
+               x = ( x != -1 )? x: sizeIma / 2;
+               y = ( y != -1 )? y: sizeIma / 2;
+               
+               // Isocontour
+               imagedata = (vtkImageData*) ((getSlice( i , NULL ))->castVtk( ));
+               float *range = imagedata->GetScalarRange();
+               
+               //vtkKitwareContourFilter* cntVTK = vtkKitwareContourFilter::New( );
+               vtkContourFilter* cntVTK = vtkContourFilter::New( );
+               cntVTK->SetInput( imagedata );
+               cntVTK->SetNumberOfContours( 1 );
+               //cntVTK->SetValue( 0, vmin );
+               cntVTK->SetValue( 0, (range[1]*thr/100) );
+               //cntVTK->SetValue( 1, vmax );
+               cntVTK->Update( );
+               
+               vtkCleanPolyData* cpd = vtkCleanPolyData::New( );
+               cpd->SetInput( cntVTK->GetOutput( ) );
+               cpd->ConvertLinesToPointsOff( );
+               cpd->Update( );
+               
+               vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( );
+               //conn->SetMaxRecursionDepth( 3000 );
+               
+               // PS ->     //conn->SetInput( cntVTK->GetOutput( ) ); PS
+               conn->SetInput( cpd->GetOutput( ) );
+               
+               conn->SetClosestPoint( x, y, 0 );
+               conn->SetExtractionModeToClosestPointRegion( );
+               conn->Update( );
+               
+               vtkCleanPolyData* cpd2 = vtkCleanPolyData::New( );
+               cpd2->SetInput( conn->GetOutput( ) );
+               cpd2->Update();
+               
+               vtkPolyData* polyDataResult = cpd2->GetOutput() ;
+               
+               double ta = _contours[ i ]->getS( );
+               
+               _contours[ i ]->reset( );
+               
+               // PS ->        gslobj_vector o( 3 ), n( 3 ), y( 3 ), vr( 3 );
+               
+               int id;
+               int numberOfCells;
+               int numberOfPoints,numberOfPoints2;
+               vtkCell* cell;
+               vtkIdList* pids;
+               marVector p( 3 );
+// PS ->               double new_p[3];
+               float pf[ 3 ];
+
+               numberOfCells = polyDataResult->GetNumberOfCells( );
+               cell = polyDataResult->GetCell( 0 );
+               pids = cell->GetPointIds( );
+               numberOfPoints = pids->GetNumberOfIds( );
+
+               numberOfPoints2=polyDataResult->GetNumberOfPoints();
+               
+               marVector o(3),n(3),y(3),vr(3);
+               double cost, sint;
+               y( 0 ) = y( 2 ) = 0.0;
+               y( 1 ) = 1.0;
+               getPoint( ( double* )o, ta );
+               getTangent( ( double* )n, ta );
+               vr = y.cross( n ).normalize( );
+               sint = y.cross( n ).norm2( );
+               cost = y.dot( n );
+       
+               for( int j = 0; j < numberOfPoints; j++ ) 
+               {
+                       id = pids->GetId( j );
+                       polyDataResult->GetPoint( id, pf );
+                       p( 0 ) = pf[ 0 ];
+                       p( 1 ) = 0.0;
+                       p( 2 ) = pf[ 1 ];
+                       
+                       // 3D transformation
+                       p = ( p * cost ) + ( vr * ( vr.dot( p ) * ( 1.0 - cost ) ) ) -
+                               ( p.cross( vr ) * sint ) + o;
+                       
+               // PS ->                double p_cross_vr[3];
+               // PS ->                vtkMath::Cross( p, vr, p_cross_vr);
+               // PS ->                for(int k=0; k<3; k++) 
+               // PS ->                {
+               // PS ->                        new_p[i] = (new_p[k] * cost) + ( vr(k) * ( vtkMath::Dot(vr, p) * ( 1.0 - cost ) ) ) -
+               // PS ->                                ( p_cross_vr[k] * sint ) + o(i);
+               // PS ->                }
+                       
+                       //TODO: check if p and new_p are the same...
+                       _contours[ i ]->addContourPoint( p );
+               } // rof
+               
+               // PS ->        int nbPoints=polyDataResult->GetNumberOfPoints();
+               // PS ->        
+               // PS ->        float* vtkContourPoint;
+               // PS ->        vtkContourPoint= new float[3];
+               // PS ->        double* marContourPoint;
+               // PS ->        marContourPoint= new double[3];
+               // PS -> 
+               // PS ->        for (int j=0;j< nbPoints;j++)
+               // PS ->        {
+               // PS ->                vtkContourPoint=polyDataResult->GetPoint(j);
+               // PS ->                marContourPoint[0]=(double)vtkContourPoint[0];
+               // PS ->                marContourPoint[1]=(double)vtkContourPoint[1];
+               // PS ->                marContourPoint[2]=(double)vtkContourPoint[2];
+               // PS ->                _contours[ i ]->addContourPoint( marContourPoint );
+               // PS ->        }
+               marContour * tutu=_contours[ i ];
+               _contours[ i ]->getArea();
+               _contours[ i ]->getPerimeter();
+               return( polyDataResult );
+               //return( cpd->GetOutput( ) );
+               //return( cntVTK->GetOutput( ) );
+               
+                
+//EED1            vtkStripper* isoStrips = vtkStripper::New( );
+//EED1            isoStrips->SetInput( cpd2->GetOutput( ) );
+//EED1            isoStrips->Update( );
+//EED1            
+//EED1                  vtkPolyData* data = isoStrips->GetOutput( );
+//EED1                  data->Update( );
+//EED1                  vtkCell* cell;
+//EED1                  vtkIdList* pids;
+//EED1                  
+//EED1                    numberOfCells = data->GetNumberOfCells( );
+//EED1                    cell = data->GetCell( 0 );
+//EED1                    pids = cell->GetPointIds( );
+//EED1                    numberOfPoints = pids->GetNumberOfIds( );
+
+               
+//EED2         _contours[ i ]->reset( );
+//EED2         if( typ == marParameters::ISOCONTOURS ) {
+//EED2         gslobj_vector o( 3 ), n( 3 ), y( 3 ), vr( 3 );
+//EED2         double cost, sint;
+//EED2         y( 0 ) = y( 2 ) = 0.0;
+//EED2         y( 1 ) = 1.0;
+//EED2         getPoint( ( double* )o, ta );
+//EED2         getTangent( ( double* )n, ta );
+//EED2         vr = y.cross( n ).normalize( );
+//EED2         sint = y.cross( n ).norm2( );
+//EED2         cost = y.dot( n );
+//EED2         
+//EED2           for( int j = 0; j < numberOfPoints; j++ ) {
+//EED2           id = pids->GetId( j );
+//EED2           data->GetPoint( id, pf );
+//EED2           p( 0 ) = pf[ 0 ];
+//EED2           p( 1 ) = 0.0;
+//EED2           p( 2 ) = pf[ 1 ];
+//EED2           
+//EED2                 // 3D transformation
+//EED2                 p = ( p * cost ) + ( vr * ( vr.dot( p ) * ( 1.0 - cost ) ) ) -
+//EED2          ( p.cross( vr ) * sint ) + o;
+//EED2                 
+//EED2                   double p_cross_vr[3];
+//EED2                   vtkMath::Cross( p, vr, p_cross_vr);
+//EED2                   for(int ii=0; ii<3; ii++) {
+//EED2                   new_p[i] = (new_p[ii] * cost) + ( vr(ii) * ( vtkMath::Dot(vr, p) * ( 1.0 - cost ) ) ) -
+//EED2                   ( p_cross_vr[ii] * sint ) + o(i);
+//EED2                   }
+//EED2                   
+//EED2                         //TODO: check if p and new_p are the same...
+//EED2                         _contours[ i ]->addContourPoint( p );
+//EED2                         } // rof
+//EED2                         } else if( typ == marParameters::SNAKE || typ == marParameters::DERICHE ) {
+//EED2                         // ONLY Isocontours at the moment.
+//EED2                         } // fi
+//EED2                         
+//EED2                           cntVTK->Delete( );
+//EED2                           cpd->Delete( );
+//EED2                           conn->Delete( );
+//EED2                           cpd2->Delete( );
+//EED2         isoStrips->Delete( );
+
+  } // fi
+}
+
+*/
+
+
+
+
+// ----------------------------------------------------------------------------
+void marAxis::createContour(int i, kVolume* vol)
+{
+
+       int j,id;
+       int numberOfPoints,numberOfCells;
+       vtkCell* cell;
+       vtkIdList* pids;
+       double p[ 3 ];
+       vtkPolyData* vtkPolyData_2DContour;
+       double x,y;
+
+       int sizeIma                             =       getParameters( )->getSizeIma( );
+       double dimIma                   =       getParameters( )->getDimIma( );
+
+// EED 24 Dec 2007
+  dimIma=sizeIma/3;
+
+       _contours[i]                    =       new marContour( i, getParameters( ) ) ;
+       vtkPolyData_2DContour   =       get2Dcontour(i,vol);
+
+       numberOfCells                   =       vtkPolyData_2DContour->GetNumberOfCells( );
+    cell                                       =       vtkPolyData_2DContour->GetCell( 0 );
+       pids                                    =       cell->GetPointIds( );
+       numberOfPoints                  =       pids->GetNumberOfIds( );
+
+       for( j = 0; j < numberOfPoints; j++ ) 
+       {
+               id = pids->GetId( j );
+               vtkPolyData_2DContour->GetPoint( id, p);
+               x=p[0]-64.0;
+               y=p[1]-64.0;
+               x=x * dimIma / ( float ) sizeIma;
+               y=y * dimIma / ( float ) sizeIma;
+               _contours[ i ]->addContourPoint( x , y );
+       }
+
+       _contours[i]->do_spline();
+       _contours[i]->calculateVariables();
+
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::EraseContour(int i){
+       if (_3Dcontour[i]!=NULL){
+               _3Dcontour[i]->Delete();
+               _3Dcontour[i]=NULL;
+       }
+
+       if (_2DDiameterMax[i]!=NULL){
+               _2DDiameterMax[i]->Delete();
+               _2DDiameterMax[i]=NULL;
+       }
+
+       if (_2DDiameterMin[i]!=NULL){
+               _2DDiameterMin[i]->Delete();
+               _2DDiameterMin[i]=NULL;
+       }
+
+       if (_2Dcontours[i]!=NULL){
+               _2Dcontours[i]->Delete();
+               _2Dcontours[i]=NULL;
+       }
+
+       if (_contours[i]!=NULL){
+               delete _contours[i];
+               _contours[i]=NULL;
+       }
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::replaceContour2D(int i,int size,double *vx,double *vy){
+
+       EraseContour(i);
+
+
+       vtkPoints *_pts = vtkPoints::New();
+       _pts->SetNumberOfPoints(size);
+       int j;
+
+       for (j=0 ; j<size ; j++){
+               _pts->SetPoint(j,       vx[j]   , vy[j] , 0 );
+       }
+//     _pts->SetPoint(0,       vx[0]   , vy[0] , 0 );
+
+       vtkCellArray *lines = vtkCellArray::New();
+       lines->InsertNextCell( size );
+       for ( j=0 ; j<size+1 ; j++ ){
+               lines->InsertCellPoint(j % size );
+       }
+
+       vtkPolyData *_pd = vtkPolyData::New();
+       _pd->SetPoints( _pts );
+       _pd->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _pts->Delete();  
+
+       _2Dcontours[i]=_pd;
+       createContour(i,NULL);
+}
+// ----------------------------------------------------------------------------
+void marAxis::createSlice(int i , kVolume* vol){
+       int k=i;
+       int sizeIma = getParameters( )->getSizeIma( );
+
+       vtkStructuredPoints* stPoints = vtkStructuredPoints::New( );
+       double *p, *n;
+    p = _points[k];
+    n = getNormal( k );
+
+    stPoints->GetPointData( )->SetScalars(  get3DSlice(k,vol)->GetOutput()->GetPointData()->GetScalars()  );
+    stPoints->SetDimensions( sizeIma, sizeIma, 1 );
+
+
+    stPoints->SetScalarType( vol->castVtk( )->GetDataObjectType( ) );
+       stPoints->SetScalarTypeToShort ();
+    stPoints->Update();
+       
+    vtkImageChangeInformation* change = vtkImageChangeInformation::New();
+    change->SetInput( stPoints );  
+    change->Update();    //important
+
+
+    if (_slices[k]!=NULL) { delete _slices[k]; }
+    _slices[k] = new kVolume( change->GetOutput() ) ;
+
+       stPoints->Delete( );
+       change->Delete();
+}
+// ----------------------------------------------------------------------------
+void marAxis::create3DSlice(int i , kVolume* vol )
+{
+
+  int k=i;
+  int sizeIma  = getParameters( )->getSizeIma( );
+  double dimIma = getParameters( )->getDimIma( );
+
+  dimIma=sizeIma/3;
+
+
+//  double voxSize = getParameters( )->getVoxelSize( );
+
+//  if( forceCnt )
+//    for( unsigned int i = 0; i < _contours.size( ); i++ )
+//      delete _contours[ i ];
+//    _contours.clear( );
+
+//    for( unsigned int i = 0; i < _slices.size( ); i++ ) {
+//      delete _slices[ i ];
+//      _3Dslices[ i ]->Delete( );
+//      _quantificationImages[ i ]->Delete( );
+//    }
+
+//  _slices.clear( );
+// _3Dslices.clear( );
+//  _quantificationImages.clear( );
+
+  // "Cutter" initialization
+//  vtkStructuredPoints* stPoints = vtkStructuredPoints::New( );
+
+  // Perform "cut"
+  double *p, *n;
+//  for( int k = 0; k < nCnts; k++ ) {
+    //s = ( double )k / ( double )( nCnts - 1 );
+    p = _points[k];
+    n = getNormal( k );
+
+    vtkPlaneSource* pSource = vtkPlaneSource::New( );
+    pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
+    pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
+    pSource->SetPoint2( p[ 0 ], p[ 1 ], p[ 2 ] + dimIma - 1.0 );
+    pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
+    pSource->Update( );
+    pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
+    pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
+    pSource->Update( );
+
+       if (_3Dslices[ k ]!=NULL){ _3Dslices[ k ]->Delete(); }
+    _3Dslices[ k ] = vtkProbeFilter::New( ) ;
+    _3Dslices[ k ]->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
+    _3Dslices[ k ]->SetSource( vol->castVtk( ) );
+    _3Dslices[ k ]->Update( );
+    pSource->Delete( );
+
+//    stPoints->GetPointData( )->
+//             SetScalars( _3Dslices[ k ]->GetOutput( )->
+//             GetPointData( )->GetScalars( ) );
+//    stPoints->SetDimensions( sizeIma, sizeIma, 1 );
+//    stPoints->SetScalarType( vol->castVtk( )->GetDataObjectType( ) );
+//    stPoints->Update( );
+//
+//    if( forceCnt )
+//      {
+//             marContour* tmp_marContour = new marContour( k, getParameters( ) ) ;
+//             tmp_marContour->calculateVariables();
+//             _contours.push_back( tmp_marContour );
+//     }
+//    _slices.push_back( new kVolume( kVolume::UCHAR, 1, 1, 1 ) );
+//    *( _slices[ k ] ) = ( vtkImageData* )stPoints;  //copy
+//    _quantificationImages.push_back( (_slices[ k ])->castVtk( ) );
+//  } // rof
+
+//  stPoints->Delete( );
+
+//     _3Dslices[i]=NULL;
+}
+
+
+
+
+// ----------------------------------------------------------------------------
+void marAxis::create3Dcontour(int i, kVolume* vol)
+{      
+       vtkPoints *_vtkPoints;
+       double *o;
+       double *n;
+       vtkMatrix4x4* mat;
+       vtkTransform* trans;
+       double nn[3];
+       double c[3],p1[3],p2[3];
+       double nA,nB,nC;
+
+       _vtkPoints                                              = vtkPoints::New();
+       o                                                               = _points[i];
+       n                                                               = getNormal( i );
+       mat                                                             = vtkMatrix4x4::New();
+       trans                                                   = vtkTransform::New();
+
+
+       nn[0]=n[0];  nn[1]=n[1];  nn[2]=n[2];
+       nC=sqrt( nn[0]*nn[0] + nn[1]*nn[1] + nn[2]*nn[2] );
+       nn[0]=nn[0]/nC;  nn[1]=nn[1]/nC;  nn[2]=nn[2]/nC;
+
+    vtkPlaneSource* pSource = vtkPlaneSource::New( );
+    pSource->SetOrigin( 0, 0   , 0                             );
+    pSource->SetPoint1( 1, 0   , 0                             );
+    pSource->SetPoint2( 0, 0   , 1.0   );
+    pSource->SetCenter( 0,0,0 );
+    pSource->SetNormal( nn[ 0 ], nn[ 1 ], nn[ 2 ] );
+    pSource->Update( );
+//    pSource->Update( );
+       pSource->GetOrigin(c);
+       pSource->GetPoint1(p1);
+       pSource->GetPoint2(p2);
+       pSource->Delete();
+       p1[0]=p1[0]-c[0];  p1[1]=p1[1]-c[1];  p1[2]=p1[2]-c[2];
+       p2[0]=p2[0]-c[0];  p2[1]=p2[1]-c[1];  p2[2]=p2[2]-c[2];
+       nA=sqrt( p1[0]*p1[0] + p1[1]*p1[1] + p1[2]*p1[2] );
+       nB=sqrt( p2[0]*p2[0] + p2[1]*p2[1] + p2[2]*p2[2] );
+       p1[0]=p1[0]/nA;  p1[1]=p1[1]/nA;  p1[2]=p1[2]/nA;
+       p2[0]=p2[0]/nB;  p2[1]=p2[1]/nB;  p2[2]=p2[2]/nB;
+
+    mat->SetElement (0,0, nn[0]);
+    mat->SetElement (1,0, nn[1]);
+    mat->SetElement (2,0, nn[2]);
+    mat->SetElement (3,0, 0);
+    mat->SetElement (0,1, p2[0]);
+    mat->SetElement (1,1, p2[1]);
+    mat->SetElement (2,1, p2[2]);
+    mat->SetElement (3,1, 0);
+       mat->SetElement (0,2, p1[0]);
+    mat->SetElement (1,2, p1[1]);
+    mat->SetElement (2,2, p1[2]);
+    mat->SetElement (3,2, 0);
+       mat->SetElement (0,3, 0);
+    mat->SetElement (1,3, 0);
+    mat->SetElement (2,3, 0);
+    mat->SetElement (3,3, 1);
+
+//     double deter=mat->Determinant(mat);
+       trans->Identity();
+       trans->SetMatrix(mat);
+       float ang;
+       ang=-90;
+       trans->RotateWXYZ  ( ang,0,1,0); 
+
+// EED Borrame
+//     double scale = 1; 
+//     trans->Scale  ( scale , scale, scale); 
+
+       trans->Update();
+
+       vtkMatrix4x4 *m=vtkMatrix4x4::New();
+       trans->GetMatrix  (  m  );
+    
+
+       int j,numberOfPoints;
+       marContour* contour2D   = getContour(i,vol);
+       numberOfPoints                  = contour2D->getNumberOfPoints( );
+       double fpA[3];
+       double pA[3],ppp[3];
+
+
+       for( j = 0; j <= numberOfPoints; j++ ) {
+               contour2D->getPoint( fpA,j % numberOfPoints);
+
+               pA[0] = fpA[0] + 0.2;  // correction EED 
+               pA[1] = fpA[1] + 0.2;  // correction EED
+
+               pA[2] = 0;
+
+// Why this does not works...(release version)????
+//             trans->TransformPoint(pA,ppp); 
+// or
+//             trans->TransformVector(pA,ppp);
+// so..
+               ppp[0] = m->GetElement(0,0)*pA[0] + m->GetElement(0,1)*pA[1] + m->GetElement(0,2)*pA[2] + m->GetElement(0,3);
+               ppp[1] = m->GetElement(1,0)*pA[0] + m->GetElement(1,1)*pA[1] + m->GetElement(1,2)*pA[2] + m->GetElement(1,3);
+               ppp[2] = m->GetElement(2,0)*pA[0] + m->GetElement(2,1)*pA[1] + m->GetElement(2,2)*pA[2] + m->GetElement(2,3);
+
+//             ppp[0]=ppp[0]+o[0]-c[0]; ppp[1]=ppp[1]+o[1]-c[1]; ppp[2]=ppp[2]+o[2]-c[2];  
+               ppp[0]=ppp[0]+o[0]; ppp[1]=ppp[1]+o[1]; ppp[2]=ppp[2]+o[2];  
+//             ppp[0]=ppp[0]+o[0]-c[0]*0.781; ppp[1]=ppp[1]+o[1]-c[1]*0.781;; ppp[2]=ppp[2]+o[2]-c[2]*0.781;;  
+               _vtkPoints->InsertNextPoint( (float)ppp[0],(float)ppp[1],(float)ppp[2] );
+       }
+
+       m->Delete();
+       mat->Delete();
+       trans->Delete();
+       if (_3Dcontour[i]!=NULL){ _3Dcontour[i]->Delete(); }
+       _3Dcontour[i]=_vtkPoints;       
+
+}
+// ----------------------------------------------------------------------------
+void marAxis::createSliceImage(int i  , kVolume* vol )
+{
+  _quantificationImages[i] = getSlice(i,vol)->castVtk( ) ;
+
+}
+// ----------------------------------------------------------------------------
+void marAxis::create2Dcontour(int i , kVolume* vol )
+{
+       vtkImageData* imagedata;
+               
+       double  thr                     = getParameters( )->getDoubleParam( marParameters::e_threshold_isocontour );
+       int             sizeIma         = getParameters( )->getSizeIma( );
+       double  localint        = getSignal( i );
+       double  sigma           = getParameters( )->getDoubleParam( marParameters::e_sigma );
+       double  threshold       = localint * thr / 100.0;
+
+       int             dimIma          = ( int ) ( ( double ) sizeIma /getParameters( )->getDoubleParam( marParameters::e_scale ) );
+       int             vmin            = ( int )threshold;
+       int             vmax            = ( int )threshold;
+
+       int             x                       = -1;
+       int             y                       = -1;
+
+       x = ( x != -1 )? x: sizeIma / 2;
+       y = ( y != -1 )? y: sizeIma / 2;
+       
+       // Isocontour
+       imagedata = (vtkImageData*) ((getSlice( i , vol ))->castVtk( ));
+       double *range = imagedata->GetScalarRange();    
+
+       //vtkKitwareContourFilter* cntVTK = vtkKitwareContourFilter::New( );
+       vtkContourFilter* cntVTK = vtkContourFilter::New( );
+       cntVTK->SetInput( imagedata );
+       cntVTK->SetNumberOfContours( 1 );
+       //cntVTK->SetValue( 0, vmin );
+       cntVTK->SetValue( 0, (range[1]*thr/100) );
+       //cntVTK->SetValue( 1, vmax );
+       cntVTK->Update( );
+               
+       vtkCleanPolyData* cpd = vtkCleanPolyData::New( );
+       cpd->SetInput( cntVTK->GetOutput( ) );
+       cpd->ConvertLinesToPointsOff( );
+       cpd->Update( );
+               
+       vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( );
+       //conn->SetMaxRecursionDepth( 3000 );
+               
+       // PS ->     //conn->SetInput( cntVTK->GetOutput( ) ); PS
+       conn->SetInput( cpd->GetOutput( ) );
+               
+       conn->SetClosestPoint( x, y, 0 );
+       conn->SetExtractionModeToClosestPointRegion( );
+       conn->Update( );
+               
+       vtkCleanPolyData* cpd2 = vtkCleanPolyData::New( );
+       cpd2->SetInput( conn->GetOutput( ) );
+       cpd2->Update();
+
+       vtkStripper* vtkstripper = vtkStripper::New( );
+       vtkstripper->SetInput( cpd2->GetOutput() );
+       vtkstripper->Update();
+
+       vtkPolyData* polyDataResult =  vtkstripper->GetOutput();
+    polyDataResult->Update( );
+       
+       cntVTK          -> Delete();
+       cpd2            -> Delete();
+       cpd                     -> Delete();
+       conn            -> Delete();
+
+/*
+// EED 27 Oct 2007
+       double *p;
+       int ii,size=polyDataResult->GetNumberOfPoints();
+printf("EED marAxis::create2Dcontour size %d\n",size);
+       for (ii=0;ii<size;ii++)
+       {
+               p=polyDataResult->GetPoint(ii);
+printf("EED marAxis::create2Dcontour %d >> %f %f %f\n",ii,p[0], p[1], p[2]);
+               p[2]=-100;      
+       }
+
+       for (ii=0;ii<size;ii++)
+       {
+               p=polyDataResult->GetPoint(ii);
+printf("EED marAxis::create2Dcontour xxxxx %d >> %f %f %f\n",ii,p[0], p[1], p[2]);
+       }
+*/
+
+       if ( _2Dcontours[i]!=NULL ) { _2Dcontours[i]->Delete(); }
+       _2Dcontours[i]=polyDataResult;
+}
+// ----------------------------------------------------------------------------
+void marAxis::create2DDiameterMin(     int i , kVolume* vol ){
+       double p1[2],p2[2];
+       marContour *marcontour=getContour(i,vol);
+       marcontour->getMinimumLine(p1,p2);
+       vtkPoints *_vtkPoints = vtkPoints::New();
+       int sizeIma = getParameters( )->getSizeIma( );
+
+       double dimIma = getParameters( )->getDimIma( );
+
+// EED 24 Dec 2007
+  dimIma=sizeIma/3;
+
+       double factor=( float ) sizeIma / dimIma;
+       p1[0]=p1[0]*factor+sizeIma/2;
+       p1[1]=p1[1]*factor+sizeIma/2;
+       p2[0]=p2[0]*factor+sizeIma/2;
+       p2[1]=p2[1]*factor+sizeIma/2;
+       _vtkPoints->InsertNextPoint( p1[0] , p1[1] , 1 );
+       _vtkPoints->InsertNextPoint( p2[0] , p2[1] , 1 );
+       if ( _2DDiameterMin[i]!=NULL ) { _2DDiameterMin[i]->Delete(); }
+       _2DDiameterMin[i] = _vtkPoints;
+}
+// ----------------------------------------------------------------------------
+void marAxis::create2DDiameterMax(     int i , kVolume* vol ){
+       double p1[2],p2[2];
+       marContour *marcontour=getContour(i,vol);
+       marcontour->getMaximumLine(p1,p2);
+       vtkPoints *_vtkPoints = vtkPoints::New();
+       int sizeIma = getParameters( )->getSizeIma( );
+
+       double dimIma = getParameters( )->getDimIma( );
+// EED 24 Dec 2007
+dimIma=sizeIma/3;
+
+       double factor=( float ) sizeIma / dimIma;
+       p1[0]=p1[0]*factor+sizeIma/2;
+       p1[1]=p1[1]*factor+sizeIma/2;
+       p2[0]=p2[0]*factor+sizeIma/2;
+       p2[1]=p2[1]*factor+sizeIma/2;
+       _vtkPoints->InsertNextPoint( p1[0] , p1[1] , 1 );
+       _vtkPoints->InsertNextPoint( p2[0] , p2[1] , 1 );
+       if ( _2DDiameterMax[i]!=NULL ) { _2DDiameterMax[i]->Delete(); }
+       _2DDiameterMax[i] = _vtkPoints;
+}
+// ----------------------------------------------------------------------------
+void marAxis::createEmptyVectors()
+{
+       int nCnts = ( int ) getNumberOfSplinePoints( );
+       clearAllVectors();
+       int i;
+//     int xxxx=getNumberOfContours();
+       for (i=0;i<nCnts;i++){
+               _contours.push_back( NULL );
+               _slices.push_back( NULL );
+               _3Dslices.push_back( NULL );
+               _3Dcontour.push_back( NULL );
+               _quantificationImages.push_back( NULL );
+               _2Dcontours.push_back( NULL );
+               _2DDiameterMin.push_back( NULL );
+               _2DDiameterMax.push_back( NULL );
+       }
+}
+// ----------------------------------------------------------------------------
+void marAxis::clearAllVectors()
+{
+       unsigned int i;
+       
+       for (i=0;i<_contours.size();i++){
+               if (_contours[i]!=NULL) {                                       //  DATA-MODEL-2D
+                       delete _contours[i];
+                       _contours[i]=NULL;
+               }
+       }
+       _contours.clear();
+
+       for (i=0;i<_slices.size();i++){                                 //  DATA-MODEL-Voxel XxYx1
+               if (_slices[i]!=NULL) {                         
+                       delete _slices[i];
+                       _slices[i]=NULL;
+               }
+       }
+       _slices.clear();
+
+
+       for (i=0;i<_3Dslices.size();i++){                                       //  VISUALISATION_VTK 3D
+               if (_3Dslices[i]!=NULL) {
+                       _3Dslices[i]->Delete();
+                       _3Dslices[i]=NULL;
+               }
+       }
+       _3Dslices.clear();
+
+       for (i=0;i<_3Dcontour.size();i++){                              //  VISUALISATION_VTK 3D
+               if (_3Dcontour[i]!=NULL) {                              
+                       _3Dcontour[i]->Delete();
+                       _3Dcontour[i]=NULL;
+               }
+       }
+       _3Dcontour.clear();
+
+       for (i=0;i<_quantificationImages.size();i++){   //  VISUALISATION_VTK 2D
+               if (_quantificationImages[i]!=NULL) {                           
+//                     _quantificationImages[i]->Delete();
+//                     _quantificationImages[i]=NULL;
+               }
+       }
+       _quantificationImages.clear();
+
+       for (i=0;i<_2Dcontours.size();i++){                             //  VISUALISATION_VTK 2D
+               if (_2Dcontours[i]!=NULL) {                             
+// EED ???  This object was allready erased bye the VTK pipeline
+//                     _2Dcontours[i]->Delete();
+                       _2Dcontours[i]=NULL;
+               }
+       }
+       _2Dcontours.clear();
+
+       for (i=0;i<_2DDiameterMin.size();i++){                  //  VISUALISATION_VTK 2D
+               if (_2DDiameterMin[i]!=NULL) {                          
+                       _2DDiameterMin[i]->Delete() ;
+                       _2DDiameterMin[i]=NULL;
+               }
+       }
+       _2DDiameterMin.clear();
+
+       for (i=0;i<_2DDiameterMax.size();i++){                  //  VISUALISATION_VTK 2D
+               if (_2DDiameterMax[i]!=NULL) {                          
+                       _2DDiameterMax[i]->Delete();
+                       _2DDiameterMax[i]=NULL;
+               }
+       }
+       _2DDiameterMax.clear();
+
+}
+// ----------------------------------------------------------------------------
+void marAxis::eraseContourVectorsContent()
+{
+       unsigned int i;
+       for (i=0;i<_contours.size();i++){
+               if (_contours[i]!=NULL) {                                       //  DATA-MODEL-2D
+                       delete _contours[i];
+                       _contours[i]=NULL;
+               }
+       }
+       for (i=0;i<_2Dcontours.size();i++){                             //  VISUALISATION_VTK 2D
+               if (_2Dcontours[i]!=NULL) {                             
+                       _2Dcontours[i]->Delete();
+                       _2Dcontours[i]=NULL;
+               }
+       }
+       for (i=0;i<_2DDiameterMin.size();i++){                          //  VISUALISATION_VTK 2D
+               if (_2DDiameterMin[i]!=NULL) {                          
+                       _2DDiameterMin[i]->Delete();
+                       _2DDiameterMin[i]=NULL;
+               }
+       }
+       for (i=0;i<_2DDiameterMax.size();i++){                          //  VISUALISATION_VTK 2D
+               if (_2DDiameterMax[i]!=NULL) {                          
+                       _2DDiameterMax[i]->Delete();
+                       _2DDiameterMax[i]=NULL;
+               }
+       }
+       for (i=0;i<_3Dcontour.size();i++){                              //  VISUALISATION_VTK 3D
+               if (_3Dcontour[i]!=NULL) {                              
+                       _3Dcontour[i]->Delete();
+                       _3Dcontour[i]=NULL;
+               }
+       }
+}
+
+// ----------------------------------------------------------------------------
+marContour* marAxis::getContour(int i, kVolume* vol)                           // DATA-MODEL 2D
+{                                                              
+       if (_contours[i]==NULL){ createContour(i, vol); }
+       return _contours[i];
+} 
+// ----------------------------------------------------------------------------
+kVolume* marAxis::getSlice(int i, kVolume* vol)                                                // DATA-MODEL-Voxel XxYx1
+{
+       if (_slices[i]==NULL){ createSlice( i , vol ); }
+       return _slices[i];
+}
+// ----------------------------------------------------------------------------
+
+bool marAxis::if3DcontourExist(int i)
+{
+       bool result=true;
+       if (_3Dcontour[i]==NULL)
+       {
+               result=false;
+       } 
+       return result;
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::Save3Dcontour(FILE *ff,int id)
+{
+       int i,size;
+       double point[3];
+       if (_3Dcontour[id]!=NULL)
+       {
+//Ramiro               fprintf(ff,"contour_id: %d \n", id);
+               size = _3Dcontour[id]->GetNumberOfPoints();
+//Ramiro               fprintf(ff,"numberOfPoints: %d \n", size);
+           for ( i=0 ; i<size  ;i++ ){
+               _3Dcontour[id]->GetPoint( i , point );
+                       fprintf(ff,"%f %f %f %d\n", point[0], point[1],point[2],id);
+           }
+       }
+}
+// ----------------------------------------------------------------------------
+void marAxis::SaveExisting3DContours(FILE *ff)
+{
+       if (ff!=NULL)
+       {
+               // counting existing 3Dcontours
+               int acum=0;
+               int i,size=_3Dcontour.size();
+               for (i=0; i<size; i++)
+               {
+                       if (_3Dcontour[i]!=NULL)
+                       {
+                               acum++;
+                       }
+               }
+//Ramiro               fprintf(ff, "NumberOf3DContours: %d \n", acum);
+               // saving existing 3Dcontours
+               for (i=0; i<size; i++)
+               {
+                       Save3Dcontour(ff,i);
+               }               
+       }
+}
+
+// ----------------------------------------------------------------------------
+vtkProbeFilter* marAxis::get3DSlice(int i, kVolume* vol){                      // VISUALISATION-VTK 3D
+       if (_3Dslices[i]==NULL){ create3DSlice(i,vol); }
+       return _3Dslices[i];
+}
+// ----------------------------------------------------------------------------
+vtkPoints* marAxis::get3Dcontour(int i, kVolume* vol){                         // VISUALISATION-VTK 3D
+       if (_3Dcontour[i]==NULL){ create3Dcontour(i, vol); }
+       return _3Dcontour[i];
+}
+// ----------------------------------------------------------------------------
+vtkImageData* marAxis::getSliceImage(int i, kVolume* vol){                     // VISUALISATION-VTK 2D
+       if (_quantificationImages[i]==NULL){ createSliceImage(i,vol); }
+       return _quantificationImages[i];
+}
+// ----------------------------------------------------------------------------
+vtkPolyData* marAxis::get2Dcontour(int i , kVolume* vol){                      // VISUALISATION-VTK 2D
+       if (_2Dcontours[i]==NULL){ create2Dcontour(i,vol); }
+       return _2Dcontours[i];
+}
+// ----------------------------------------------------------------------------
+vtkPoints* marAxis::get2DDiameterMin(int i , kVolume* vol){            // VISUALISATION-VTK 2D
+       if (_2DDiameterMin[i]==NULL){ create2DDiameterMin(i,vol); }
+       return _2DDiameterMin[i];
+}
+// ----------------------------------------------------------------------------
+vtkPoints* marAxis::get2DDiameterMax(int i , kVolume* vol){            // VISUALISATION-VTK 2D
+       if (_2DDiameterMax[i]==NULL){ create2DDiameterMax(i,vol); }
+       return _2DDiameterMax[i];
+}
+// ----------------------------------------------------------------------------
+double marAxis::getAxisLenght(int pIni,int pEnd){
+
+    if (pIni>pEnd){
+               int tmp=pIni;
+               pIni=pEnd;
+               pEnd=tmp;
+       }
+
+       marVector* pO = new marVector(2);
+       marVector* pF = new marVector(2);
+       double L;
+    unsigned int j;
+    for( j = pIni, L = 0.0; j < pEnd-1; j++ ) {
+               (*pO)=_points[j];
+               (*pF)=_points[j+1];
+               (*pF)=(*pF)-(*pO);
+               L+=pF->norm2();
+    } // rof
+       delete pO;
+       delete pF;
+       return L;
+}
+// ----------------------------------------------------------------------------
+void marAxis::calculateTotalAxisLenght(){
+       _totalAxisLenght = getAxisLenght( 0 , _points.size( ) );
+}
+// ----------------------------------------------------------------------------
+double marAxis::getTotalLength(){
+       if (_totalAxisLenght==-1){
+               calculateTotalAxisLenght();
+       }
+       return _totalAxisLenght;
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::calculateSubAxisLength(){
+       _subAxisLenght = getAxisLenght( _startQuant , _finishQuant );
+}
+// ----------------------------------------------------------------------------
+double marAxis::getSubAxisLength(){
+       if (_subAxisLenght==-1){
+               calculateSubAxisLength();
+       }
+       return _subAxisLenght;
+}
+// ----------------------------------------------------------------------------
+double marAxis::getAverageArea(int pIni, int pEnd, kVolume* vol){
+       marContour      *marcontourHealthy;
+       int                     ihealthySlice,itemp;
+       double          acumArea        =       0;
+       for (ihealthySlice = pIni ; ihealthySlice <= pEnd ; ihealthySlice++ ){
+               itemp=ihealthySlice;
+               if (itemp<0)                            { itemp=0;                                      }
+               if (itemp>=_points.size( ))     { itemp=_points.size( )-1;      }
+               marcontourHealthy = getContour( itemp , vol );
+               acumArea = acumArea + marcontourHealthy->getArea();
+       }
+       return acumArea / (pEnd - pIni + 1);
+}
+// ----------------------------------------------------------------------------
+void marAxis::calculateReferenceArea(kVolume* vol){
+       _referenceArea = getAverageArea(_healthySliceStart,_healthySliceEnd,  vol);
+}
+// ----------------------------------------------------------------------------
+double marAxis::getReferenceArea(kVolume* vol){
+       if (_referenceArea==-1){
+               calculateReferenceArea(vol);
+       }
+       return _referenceArea;
+}
+// ----------------------------------------------------------------------------
+void marAxis::calculateReferenceAverDiam(kVolume* vol){
+       marContour *marcontourHealthy;
+       int ihealthySlice;
+       double acumDiam=0;
+       for (ihealthySlice=_healthySliceStart; ihealthySlice<=_healthySliceEnd; ihealthySlice++){
+               marcontourHealthy = getContour( ihealthySlice , vol );
+               acumDiam = acumDiam + marcontourHealthy->getAverageDiameter();
+       }
+       _referenceAverDiam = acumDiam / (_healthySliceEnd-_healthySliceStart+1);
+}
+// ----------------------------------------------------------------------------
+double marAxis::getReferenceAverDiam(kVolume* vol){
+       if (_referenceAverDiam==-1){
+               calculateReferenceAverDiam(vol);
+       }
+       return _referenceAverDiam;
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::reset( )
+{
+//EED Borrame
+//    unsigned int i;
+    kCurve::reset( );
+
+    _description               = "";
+    _healthySlice              = -1;
+    _startQuant                        = -1;
+    _finishQuant               = -1;
+    _actualQuant               = -1;
+
+       _subAxisLenght          = -1;
+       _referenceArea          = -1;
+       _referenceAverDiam      = -1;
+
+       Delete( );
+
+// EED Borrame 
+/*
+    for( i = 0; i < _contours.size( ); i++ )
+      delete _contours[ i ];
+    _contours.clear( );
+    for( i = 0; i < _slices.size( ); i++ )
+       delete _slices[ i ];
+    _slices.clear( );
+*/
+}
+
+// ----------------------------------------------------------------------------
+void marAxis::copyFrom( const marObject& from )
+{ // TODO
+}
+
+// ----------------------------------------------------------------------------
+bool marAxis::save( std::ofstream& os )
+{
+    double p[ INDX_count ];
+    unsigned int i;
+
+    i = _description.length( );
+    os.write( ( const char* )&i, sizeof( int ) );
+    os.write( ( char* )_description.c_str( ), i * sizeof( char ) );
+
+    i = getNumberOfControlPoints( );
+    os.write( ( const char* )&i, sizeof( int ) );
+    for( i = 0; i < getNumberOfControlPoints( ); i++ ) {
+
+       memcpy( p, _controlPoints[ i ], 3 * sizeof( double ) );
+       memcpy( p + 3, _controlState[ i ],
+               ( INDX_count - 3 ) * sizeof( double ) );
+        os.write( ( const char* )p, INDX_count * sizeof( double ) );
+
+    } // rof
+    i = getNumberOfContours( );
+    os.write( ( const char* )&i, sizeof( int ) );
+    for( i = 0; i < getNumberOfContours( ); i++ )
+      _contours[ i ]->save( os );
+
+    return( true );
+}
+
+// ----------------------------------------------------------------------------
+bool marAxis::load( std::ifstream& is )
+{
+    double p[ INDX_count ];
+    int i, n;
+
+    reset( );
+
+    is.read( ( char* )&n, sizeof( int ) );
+    _description.resize( n );
+    is.read( ( char* )_description.c_str( ), n * sizeof( char ) );
+
+    is.read( ( char* )&n, sizeof( int ) );
+    for( i = 0; i < n; i++ ) {
+
+        is.read( ( char* )p, INDX_count * sizeof( double ) );
+        addControlPoint( p, p + 3 );
+
+    } // rof
+    is.read( ( char* )&n, sizeof( int ) );
+    for( i = 0; i < n; i++ ) {
+
+      _contours.push_back( new marContour( 0, getParameters( ) ) );
+      _contours[ i ]->load( is );
+
+    } // rof
+    return( true );
+}
+// ----------------------------------------------------------------------------
+vtkPolyData* marAxis::Draw( )
+{
+  unsigned int i, j;
+  double *p;
+
+  vtkPoints* allPoints = vtkPoints::New( );
+  vtkCellArray* allTopology = vtkCellArray::New( );
+
+  allTopology->InsertNextCell( _points.size( ) );
+  for( i = 0, j=0; i < _points.size( ); i++, j++ ) {
+    p = _points[i];
+    allPoints->InsertNextPoint( p[ 0 ],  p[ 1 ], p[ 2 ] );
+    allTopology->InsertCellPoint( j );
+  } // rof
+
+  _allData = vtkPolyData::New( );
+  _allData->SetPoints( allPoints );
+  _allData->SetLines( allTopology );
+  allPoints->Delete();
+  allTopology->Delete();
+
+  return ( _allData );
+}
+// ----------------------------------------------------------------------------
+vtkPolyData *marAxis::GetAxisData( )
+{
+       unsigned int i;
+       double point[ 3 ];
+       double radio;
+       double p[marAxis::INDX_count];
+
+
+       vtkPoints                       *allPoints              = vtkPoints::New( );
+       vtkCellArray            *allTopology    = vtkCellArray::New( );
+       vtkDoubleArray          *allRadios              = vtkDoubleArray::New( );
+       allRadios->SetName("radio");
+
+       for( i = 0; i < _controlPoints.size( ); i++ ) {
+               getControlPoint(i, p, p+3);
+               point[ 0 ]      =  p[marAxis::INDX_X];
+               point[ 1 ]      =  p[marAxis::INDX_Y];
+               point[ 2 ]      =  p[marAxis::INDX_Z];
+               radio           =  p[marAxis::INDX_RAYON]*2.0;
+               allPoints    -> InsertPoint( i, point[ 0 ] ,  point[ 1 ] , point[ 2 ]  );  //para saber exactamante el indice que se le asigno
+
+               allRadios       -> InsertValue(i,radio);
+    if(i>0){
+       allTopology->InsertNextCell(2);
+       allTopology->InsertCellPoint(i);
+       allTopology->InsertCellPoint(i-1);
+      }
+
+       } // rof
+
+       _allData = vtkPolyData::New( );
+       _allData        -> SetPoints( allPoints );
+       _allData        -> SetLines( allTopology );
+       _allData        -> GetPointData()->SetScalars(allRadios);
+
+       
+       return ( _allData );
+}
+// ----------------------------------------------------------------------------
+void marAxis::Delete( ){
+       clearAllVectors();
+
+       int i;
+       for (i=0;i<_points.size();i++){         
+               if (_points[i]!=NULL) {                         
+                       delete _points[i];
+                       _points[i]=NULL;
+               }
+       }
+       _points.clear();
+       _signal.clear();
+
+
+       if(_allData) {
+               _allData->Delete();
+               _allData = NULL;
+       }
+
+//  reset();
+}
+// ----------------------------------------------------------------------------
+void marAxis::setHealthySlice( int hsS, int hs, int hsE ){ 
+         _healthySliceStart    = hsS;
+         _healthySlice                 = hs;   
+         _healthySliceEnd              = hsE;
+         _referenceArea=-1;
+         _referenceAverDiam=-1;
+  };
+// ----------------------------------------------------------------------------
+void marAxis::setStartQuant( int sq ){
+       _startQuant             =       sq;             
+       _subAxisLenght  =       -1;
+};
+// ----------------------------------------------------------------------------
+void marAxis::setFinishQuant( int fq ){ 
+       _finishQuant    =       fq;             
+       _subAxisLenght  =       -1;
+};
+
+// ----------------------------------------------------------------------------
+void marAxis::AddPointToList(double x, double y, double z, int signal)
+{
+       double *p;
+       p=(double *)malloc(sizeof(double)*3);
+       p[0]=x;
+       p[1]=y;
+       p[2]=z;
+       _points.push_back( p );
+       _signal.push_back( signal );
+}
+
+
+
+// eof - axis.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marAxis.h b/lib/maracasVisuLib/src/kernel/marAxis.h
new file mode 100644 (file)
index 0000000..7abb691
--- /dev/null
@@ -0,0 +1,273 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marAxis.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __MAR__KERNEL__AXIS__HXX__
+#define __MAR__KERNEL__AXIS__HXX__
+
+#include <vtkPolyData.h>
+#include <vtkProbeFilter.h>
+#include <vector>
+
+//In an ideal future we should get rid of gslobj to get rid of gsl...
+// PS -> //#include "gslobj.hxx" //PS
+
+#include "curve.hxx"
+#include "volume.hxx"
+#include "marContour.h"
+#include "marObject.h"
+#include "ExtractionAxe.h"
+#include <marAxisContours.h>
+#include <marIsocontour.h>
+
+class vtkPoints;
+class vtkCellArray;
+
+/**
+ * \brief class describing an axe in Maracas
+ * \todo marAxis ...miss some stuff...
+ */
+class MAR_KERNEL_EXPORT marAxis : public marObject, public kCurve
+{
+public:
+
+/** An enum.
+*
+* More detailed enum description.
+*/
+  
+  enum AxisStateVectorIndexes
+{
+    INDX_X = 0,       /*!< X coordinate of an axis point. */  
+    INDX_Y,           /*!< Y coordinate of an axis point. */ 
+    INDX_Z,           /*!< Z coordinate of an axis point. */  
+    INDX_V1X,         /*!< X coordinate of the first eigen vector. */
+    INDX_V1Y,         /*!< Y coordinate of the first eigen vector. */
+    INDX_V1Z,         /*!< Z coordinate of the first eigen vector. */
+    INDX_V2X,         /*!< X coordinate of the second eigen vector. */
+    INDX_V2Y,         /*!< Y coordinate of the second eigen vector. */
+    INDX_V2Z,         /*!< Z coordinate of the second eigen vector. */
+    INDX_V3X,         /*!< X coordinate of the third eigen vector. */
+    INDX_V3Y,         /*!< Y coordinate of the third eigen vector. */
+    INDX_V3Z,         /*!< Z coordinate of the third eigen vector. */
+    INDX_LAMBDA1,     /*!< Value of the first eigen value. */  
+    INDX_LAMBDA2,     /*!< Value of the second eigen value. */  
+    INDX_LAMBDA3,     /*!< Value of the third eigen value. */  
+    INDX_MASSE,       /*!< Weight of the optimal sphere. */  
+    INDX_RAYON,       /*!< Radius of the optimal sphere. */  
+    INDX_INERTIE,     /*!< Inertia of the optimal sphere. */  
+    INDX_PTAGEMASSE,  /*!< X coordinate of an axis point. */  
+    INDX_PTAGERAYON,  /*!< X coordinate of an axis point. */  
+    INDX_SIGNALVALUE, /*!< X coordinate of an axis point. */  
+    INDX_count        /*!< Allow counting of this enum. */  
+    };
+
+public:
+
+/**
+* Cstor
+*/
+  marAxis( marParameters* p = NULL );
+
+/**
+* Destructor
+*/
+  ~marAxis( ) { reset( ); };
+
+/**
+* Return description as a std::string
+*/
+  std::string& getDescription( ) { return( _description ); };
+
+/**
+* Set description as a std::string
+*/
+  void setDescription( std::string& d ) { _description = d; };
+
+/**
+* Add a point to the axis
+* \warning no check is done
+  */
+  void addAxisPoint( double* p );
+  void changeAxisResolution( );
+  void calculateSignal( kVolume* vol );
+    
+
+  int getActualQuant( )                                                { return _actualQuant;                          }
+
+  float getSignal( uint slice )                                { return( _signal[ slice ] );           };
+
+  double* getSplinePoint( uint i )                     { return ( _points[ i ] );                      };
+
+  int getHealthySlice( )                                       { return( _healthySlice );                      };
+  int getHealthySliceStart( )                          { return( _healthySliceStart );         };
+  int getHealthySliceEnd( )                                    { return( _healthySliceEnd );           };
+
+  void setActualQuant(int act)                         { _actualQuant=act;                                     };
+
+  void setHealthySlice( int hsS, int hs, int hsE );
+
+  void setStartQuant( int sq );
+  void setFinishQuant( int fq );
+
+
+  int   getStartQuant( )                                       { return _startQuant;                           };
+  int   getFinishQuant( )                                      { return _finishQuant;                          };
+
+
+  void start( );
+  void next( )                                                         { _actualQuant++; };
+  void stop( )                                                         { _actualQuant = _finishQuant + 1; };
+  bool isFinished( ) { return( _actualQuant >= _startQuant && _actualQuant <= _finishQuant ); }
+
+  void doSpline ( );
+
+  void cut( int slice, bool up );
+
+// EED Ojo eduardo esto toca borrarlo
+  void sliceVolumeAxis( kVolume* vol, bool forceCnt = true );
+
+  double* getNormal( unsigned int slice );
+
+  int getNumberOfContours( );
+  int getNumberOfSplinePoints( );
+
+// EED Ojo Eduardo esto toca redefinirlo o partilo en dos o algo..
+//  vtkPolyData* setContour( int i, int x = -1, int y = -1,  std::vector< double* >* points =  NULL, marContour* c = NULL );
+
+// EED borrame
+/*
+  marContour* getContour( int i ) { return( _contours[ i ] ); };
+  kVolume* getSlice( int i ) { return( _slices[ i ] ); };
+  vtkProbeFilter* get3DSlice( int i ) { return( _3Dslices[ i ] ); };
+  vtkImageData* getSliceImage( int i ) { return(_quantificationImages[ i ]);  };
+*/
+
+
+  bool              if3DcontourExist(int i); 
+  void                         Save3Dcontour(FILE *ff,int i);
+  void                         SaveExisting3DContours(FILE *ff);
+
+       
+  marContour*          getContour(             int i , kVolume* vol );         // DATA-MODEL-2D  
+  kVolume*                     getSlice(               int i , kVolume* vol );         // DATA-MODEL-Voxel XxYx1
+  vtkProbeFilter*      get3DSlice(             int i , kVolume* vol );         // VISUALISATION-VTK 3D
+  vtkPoints*           get3Dcontour(   int i , kVolume* vol );         // VISUALISATION-VTK 3D
+  vtkImageData*                getSliceImage(  int i , kVolume* vol );         // VISUALISATION-VTK 2D
+  vtkPolyData*         get2Dcontour(   int i , kVolume* vol );         // VISUALISATION-VTK 2D
+  vtkPoints*           get2DDiameterMin(       int i , kVolume* vol );         // VISUALISATION-VTK 3D
+  vtkPoints*           get2DDiameterMax(       int i , kVolume* vol );         // VISUALISATION-VTK 3D
+
+  void                         replaceContour2D(int i,int size,double *vx,double *vy);
+  void                         EraseContour(int i);
+
+  void                         createEmptyVectors();
+  void                         clearAllVectors(); 
+  void                         eraseContourVectorsContent();
+  
+
+  void                         set_points_disc   ( PPPOINTAXE p ) { _points_disc = p; };
+
+  double                       getTotalLength();
+  double                       getSubAxisLength();
+  double                       getReferenceArea(kVolume* vol);
+  double                       getReferenceAverDiam(kVolume* vol);
+  double                       getAverageArea(int pIni, int pEnd, kVolume* vol);
+
+/**
+*  General methods
+*/
+  void                         reset( );
+  void                         copyFrom( const marObject& from );
+
+/**
+* Persistence methods
+*/
+  bool                         save( std::ofstream& os );
+  bool                         load( std::ifstream& is );
+
+  vtkPolyData          *Draw( );
+  vtkPolyData          *GetAxisData();
+  void                         Delete( );
+  double*                      getPoints(int i) { return _points[i]; };        
+
+       void AddPointToList(double x, double y, double z, int signal);
+
+
+
+private:
+
+  double _totalAxisLenght;
+  double _subAxisLenght;
+  double _referenceArea;
+  double _referenceAverDiam;
+
+  std::string                                          _description;                           //  Axis description
+  std::vector< double* >                       _points;                                        //  Axis spline points
+  std::vector< marContour* >           _contours;                                      //  DATA-MODEL-2D                       Axis Contours
+  std::vector< kVolume* >                      _slices;                                        //  DATA-MODEL-Voxel XxYx1      Axis perpendicular Slice
+  std::vector< vtkProbeFilter* >       _3Dslices;                                      //  VISUALISATION_VTK 3D        Axis perpendicular Slice
+  std::vector< vtkPoints* >                    _3Dcontour;                                     //  VISUALISATION_VTK 3D        Axis perpendicular Contour
+  std::vector< vtkImageData* >         _quantificationImages;          //  VISUALISATION_VTK 2D    Axis perpendicular Coup
+  std::vector< vtkPolyData* >          _2Dcontours;                            //  VISUALISATION_VTK 2D        Axis perpendicular Contour
+  std::vector< vtkPoints* >                    _2DDiameterMin;                         //  VISUALISATION_VTK 2D        Line diameter Minimum
+  std::vector< vtkPoints* >                    _2DDiameterMax;                         //  VISUALISATION_VTK 2D        Line diameter Maximum
+  std::vector< int >                           _signal;                                        //  Axis intensity signal
+  int _healthySlice;                     //  Healthy slice, if -1 then is unselected
+  int _healthySliceStart;
+  int _healthySliceEnd;
+  int _startQuant;
+  int _finishQuant;
+  int _actualQuant;
+  PPPOINTAXE _points_disc;
+    
+  vtkPolyData* _allData;
+
+  // Properties from marObject
+  //marParameters* _parameters;
+
+  // Properties from kCurve
+  // std::vector< double* > _controlPoints; //  Axis calculated points
+
+  void         calculateTotalAxisLenght();     
+  void         calculateSubAxisLength();
+  void         calculateReferenceArea(kVolume* vol );
+  void                 calculateReferenceAverDiam(kVolume* vol );
+  void         createContour(          int i   , kVolume* vol );
+  void         createSlice(            int i   , kVolume* vol );
+  void         create3DSlice(          int i   , kVolume* vol );
+  void         create3Dcontour(        int i   , kVolume* vol );
+  void         createSliceImage(       int i   , kVolume* vol );
+  void         create2Dcontour(        int i   , kVolume* vol );
+  void         create2DDiameterMin(int i       , kVolume* vol );
+  void         create2DDiameterMax(int i       , kVolume* vol );
+  double       getAxisLenght(          int pIni, int pEnd);
+  
+
+protected:
+
+  std::vector <marAxisContours* > quantContours;
+  std::vector <marPoint *> vesselPoints;
+  std::vector <marIsocontour *> lumenContour;
+  bool calibration;
+  
+
+//  std::vector <marIsocontour* > pointContours;
+  
+
+};
+
+#endif // __MAR__KERNEL__AXIS__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marAxisCT.cpp b/lib/maracasVisuLib/src/kernel/marAxisCT.cpp
new file mode 100644 (file)
index 0000000..51fa81e
--- /dev/null
@@ -0,0 +1,2543 @@
+// marAxisCT.cpp: implementation of the marAxisCT class.
+//
+//////////////////////////////////////////////////////////////////////
+
+
+#include <vtkImageCast.h>
+#include <vtkImageGaussianSmooth.h>
+#include <vtkCleanPolyData.h>
+#include <vtkPolyDataConnectivityFilter.h>
+#include <vtkStripper.h>
+#include <vtkCell.h>
+#include <vtkIdList.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkPlaneSource.h>
+#include <vtkContourFilter.h>
+#include <marLine.h>
+#include <marUtils.h>
+#include <vtkImageContinuousErode3D.h>
+#include <vtkImageThreshold.h>
+#include <vtkImageSobel2D.h>
+#include <vtkCellArray.h>
+#include <vtkImageLogic.h>
+
+
+#include "marAxisCT.h"
+#include "marGdcmDicom.h"
+
+
+
+
+marAxisCT::marAxisCT(  ) : marAxis(  )                             
+{
+}
+
+// ----------------------------------------------------------------------------
+marContour* marAxisCT::getContour( int point , kVolume* vol, int index ) {
+       if (quantContours[point] == NULL || quantContours[point]->getContour(index)->getContour() == NULL)
+       {
+               createContours(point,vol);
+       }
+
+       return quantContours[point]->getContour(index)->getContour();
+} 
+
+// ----------------------------------------------------------------------------
+vtkPoints* marAxisCT::get3Dcontour( int point , kVolume* vol, int index ) {
+       if (quantContours[point] == NULL || quantContours[point]->getContour(index)->get3DContour() == NULL)
+       {
+               create3Dcontours(point,vol); 
+       }
+
+       marAxisContours* cont = quantContours[point];
+
+       return cont->getContour(index)->get3DContour();
+}
+
+// ----------------------------------------------------------------------------
+vtkPolyData* marAxisCT::get2Dcontour( int point , kVolume* vol, int index ) {
+       if (quantContours[point] == NULL || quantContours[point]->getContour(index)->get2DContour() == NULL)
+       {
+               create2Dcontours(point,vol); 
+       }
+
+       marAxisContours* cont = quantContours[point];
+
+       
+
+       return cont->getContour(index)->get2DContour();
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marAxisCT::get2DDiameterMin( int point , kVolume* vol, int index ) {
+//     if (quantContours[point] == NULL || quantContours[point]->getContour(index)->get2DDiameterMin() == NULL)
+//     {
+               create2DDiametersMin(point,vol); 
+//     }
+
+       marAxisContours* cont = quantContours[point];
+
+       return cont->getContour(index)->get2DDiameterMin();
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marAxisCT::get2DDiameterMax( int point , kVolume* vol, int index ) {
+//     if (quantContours[point] == NULL || quantContours[point]->getContour(index)->get2DDiameterMax() == NULL)
+//     {
+               create2DDiametersMax(point,vol); 
+//     }
+
+       marAxisContours* cont = quantContours[point];
+
+       return cont->getContour(index)->get2DDiameterMax();
+}
+
+// ----------------------------------------------------------------------------
+int marAxisCT::getSignal(int point, int index, kVolume* vol) {
+       if (quantContours[point] == NULL )
+       {
+               createSignals(point,vol); 
+       }
+
+       return (int) ( quantContours[point]->getContour(index)->getSignal() );
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::createContours(        int point, kVolume* vol ) {
+
+       int j,id;
+       int numberOfPoints,numberOfCells;
+       vtkCell* cell;
+       vtkIdList* pids;
+       double p[ 3 ];
+       vtkPolyData* vtkPolyData_2DContour;
+       double x,y;
+
+       int sizeIma                             =       getParameters( )->getSizeIma( );
+       double dimIma                   =       getParameters( )->getDimIma( );
+
+       if (quantContours.size() < point - 1 )
+       {
+               create2Dcontours(point,vol);
+       }
+
+       marAxisContours* axisCont = quantContours[point];
+       
+       for (int i = 0; i < axisCont->getSize(); i++)
+       {
+               marContourVO* aContourVO = axisCont->getContour(i);
+               aContourVO->setContour(new marContour( point, getParameters( ) ));
+               vtkPolyData_2DContour = aContourVO->get2DContour();
+               numberOfCells                   =       vtkPolyData_2DContour->GetNumberOfCells( );
+               cell                                    =       vtkPolyData_2DContour->GetCell( 0 );
+               pids                                    =       cell->GetPointIds( );
+               numberOfPoints                  =       pids->GetNumberOfIds( );
+               for( j = 0; j < numberOfPoints; j++ ) 
+               {
+                       id = pids->GetId( j );
+                       vtkPolyData_2DContour->GetPoint( id, p);
+                       x=p[0]-64.0;
+                       y=p[1]-64.0;
+                       x=x * dimIma / ( float ) sizeIma;
+                       y=y * dimIma / ( float ) sizeIma;
+                       aContourVO->getContour()->addContourPoint( x , y );
+               }
+
+               aContourVO->getContour()->do_spline();
+               aContourVO->getContour()->calculateVariables();
+       }
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::create3Dcontours(      int point       , kVolume* vol ) {
+       
+       if (quantContours[point] == NULL )
+       {
+               createContours(point,vol);
+       }
+
+       marAxisContours* axisCont = quantContours[point];
+
+       for (int i = 0; i < axisCont->getSize(); i++)
+       {
+               vtkPoints *_vtkPoints;
+               double *o;
+               double *n;
+               vtkMatrix4x4* mat;
+               vtkTransform* trans;
+               double nn[3];
+               double c[3],p1[3],p2[3];
+               double nA,nB,nC;
+
+               _vtkPoints                                              = vtkPoints::New();
+               o                                                               = getPoints(point); //PENDIENTE  _points[i];
+               n                                                               = getNormal( i );
+               mat                                                             = vtkMatrix4x4::New();
+               trans                                                   = vtkTransform::New();
+
+
+               nn[0]=n[0];  nn[1]=n[1];  nn[2]=n[2];
+               nC=sqrt( nn[0]*nn[0] + nn[1]*nn[1] + nn[2]*nn[2] );
+               nn[0]=nn[0]/nC;  nn[1]=nn[1]/nC;  nn[2]=nn[2]/nC;
+
+               vtkPlaneSource* pSource = vtkPlaneSource::New( );
+               pSource->SetOrigin( 0, 0        , 0                             );
+               pSource->SetPoint1( 1, 0        , 0                             );
+               pSource->SetPoint2( 0, 0        , 1.0   );
+               pSource->SetCenter( 0,0,0 );
+               pSource->SetNormal( nn[ 0 ], nn[ 1 ], nn[ 2 ] );
+               pSource->Update( );
+               pSource->Update( );
+               pSource->GetOrigin(c);
+               pSource->GetPoint1(p1);
+               pSource->GetPoint2(p2);
+               pSource->Delete();
+               p1[0]=p1[0]-c[0];  p1[1]=p1[1]-c[1];  p1[2]=p1[2]-c[2];
+               p2[0]=p2[0]-c[0];  p2[1]=p2[1]-c[1];  p2[2]=p2[2]-c[2];
+               nA=sqrt( p1[0]*p1[0] + p1[1]*p1[1] + p1[2]*p1[2] );
+               nB=sqrt( p2[0]*p2[0] + p2[1]*p2[1] + p2[2]*p2[2] );
+               p1[0]=p1[0]/nA;  p1[1]=p1[1]/nA;  p1[2]=p1[2]/nA;
+               p2[0]=p2[0]/nB;  p2[1]=p2[1]/nB;  p2[2]=p2[2]/nB;
+
+               mat->SetElement (0,0, nn[0]);
+               mat->SetElement (1,0, nn[1]);
+               mat->SetElement (2,0, nn[2]);
+               mat->SetElement (3,0, 0);
+               mat->SetElement (0,1, p2[0]);
+               mat->SetElement (1,1, p2[1]);
+               mat->SetElement (2,1, p2[2]);
+               mat->SetElement (3,1, 0);
+               mat->SetElement (0,2, p1[0]);
+               mat->SetElement (1,2, p1[1]);
+               mat->SetElement (2,2, p1[2]);
+               mat->SetElement (3,2, 0);
+               mat->SetElement (0,3, 0);
+               mat->SetElement (1,3, 0);
+               mat->SetElement (2,3, 0);
+               mat->SetElement (3,3, 1);
+
+               double deter=mat->Determinant(mat);
+               trans->Identity();
+               trans->SetMatrix(mat);
+               float ang;
+               ang=-90;
+               trans->RotateWXYZ  ( ang,0,1,0); 
+               trans->Update();
+
+               vtkMatrix4x4 *m=vtkMatrix4x4::New();
+               trans->GetMatrix  (  m  );
+    
+               int j,numberOfPoints;
+
+               marContour* contour2D   = getContour(point,vol,i);
+               marContourVO* aContourVO = axisCont->getContour(i);
+               numberOfPoints                  = contour2D->getNumberOfPoints( );
+               double fpA[3];
+               double pA[3],ppp[3];
+
+               for( j = 0; j <= numberOfPoints; j++ ) {
+                       contour2D->getPoint( fpA,j % numberOfPoints);
+                       pA[0]=fpA[0];
+                       pA[1]=fpA[1];
+                       pA[2]=0;
+
+                       ppp[0] = m->GetElement(0,0)*pA[0] + m->GetElement(0,1)*pA[1] + m->GetElement(0,2)*pA[2] + m->GetElement(0,3);
+                       ppp[1] = m->GetElement(1,0)*pA[0] + m->GetElement(1,1)*pA[1] + m->GetElement(1,2)*pA[2] + m->GetElement(1,3);
+                       ppp[2] = m->GetElement(2,0)*pA[0] + m->GetElement(2,1)*pA[1] + m->GetElement(2,2)*pA[2] + m->GetElement(2,3);
+
+                       ppp[0]=ppp[0]+o[0]-c[0]; ppp[1]=ppp[1]+o[1]-c[1]; ppp[2]=ppp[2]+o[2]-c[2];  
+                       _vtkPoints->InsertNextPoint( (float)ppp[0],(float)ppp[1],(float)ppp[2] );
+
+               
+               }
+
+       
+               m->Delete();
+               mat->Delete();
+               trans->Delete();
+
+               if (aContourVO->get3DContour()!=NULL){ aContourVO->get3DContour()->Delete(); }
+                       aContourVO->set3DContour(_vtkPoints);
+       
+       }
+
+
+       
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::create2Dcontours(      int point       , kVolume* vol ) {
+       std::vector <marIsocontour *> contours;
+
+       
+
+       generatePoints(point,vol,&contours);
+       
+       vtkImageData* imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+       marAxisContours* axisCont = new marAxisContours();
+
+       for (int i = 0; i < contours.size(); i++)
+       {
+               marContourVO* contourVO = new marContourVO();
+               marIsocontour* iso = contours[i];
+       
+               contourVO->setIsocontour(vtkContourFilter::New());
+               contourVO->getIsocontour()->SetInput( imagedata );
+               contourVO->getIsocontour()->SetNumberOfContours( 1 );
+               contourVO->getIsocontour()->SetValue( 0, iso->getMaxIntensity() );      
+               contourVO->getIsocontour()->Update( );
+               
+               contourVO->setIsocontourCpd(vtkCleanPolyData::New());
+               contourVO->getIsocontourCpd()->SetInput( contourVO->getIsocontour()->GetOutput( ) );
+               contourVO->getIsocontourCpd()->ConvertLinesToPointsOff( );
+               contourVO->getIsocontourCpd()->Update( );
+
+               double cgx, cgy;
+
+               iso->getCG(&cgx,&cgy);
+               
+               contourVO->setIsocontourDcf(vtkPolyDataConnectivityFilter::New( ));
+               contourVO->getIsocontourDcf()->SetInput( contourVO->getIsocontourCpd()->GetOutput( ) );
+               
+               contourVO->getIsocontourDcf()->SetClosestPoint( cgx, cgy, 0 );
+               contourVO->getIsocontourDcf()->SetExtractionModeToClosestPointRegion( );
+               contourVO->getIsocontourDcf()->Update( );
+               
+               contourVO->setIsocontourCpd2(vtkCleanPolyData::New());
+               contourVO->getIsocontourCpd2()->SetInput( contourVO->getIsocontourDcf()->GetOutput( ) );
+               contourVO->getIsocontourCpd2()->Update();
+
+               contourVO->setIsocontourStripped(vtkStripper::New( ));
+               contourVO->getIsocontourStripped()->SetInput( contourVO->getIsocontourCpd2()->GetOutput() );
+               contourVO->getIsocontourStripped()->Update();
+       
+               contourVO->set2DContour(contourVO->getIsocontourStripped()->GetOutput());
+               contourVO->get2DContour()->Update();
+               contourVO->setSignal(iso->getMaxIntensity());
+               
+               if (iso->getType() == marAxisContours::LUMEN)
+               {
+                       contourVO->setType(marAxisContours::WALL);
+               }
+               else
+               {
+                       contourVO->setType(iso->getType());
+               }
+               
+               
+               
+               axisCont->addContour(contourVO);
+
+               
+               delete iso;
+               contours[i] = NULL;
+       }
+
+       
+
+       quantContours[point] = axisCont;
+       
+
+
+       updateLumenPercentage(point,vol);
+       
+       updateCalcPercentage(point,vol);
+//     adjustWall(point,vol);
+       if (calibration && point < startIndex)
+       {
+               this->adjustContour(point,vol); 
+       }
+       else
+       {
+               adjustWall(point,vol);
+       }
+       contours.clear();
+       imagedata->Delete();
+
+
+//     marIsocontour* cont = parsePolyDataToMarIsocontour(quantContours[point]->getContour(0));
+
+       /*FILE *archivo;
+       char nomArchivo[30], temp[3];
+
+       strcpy(nomArchivo,"./points");
+       itoa(point,temp,10);
+       strcat(nomArchivo,temp);
+       strcat(nomArchivo,".csv");
+       
+       archivo = fopen(nomArchivo,"w");
+       
+       for (int h = 0; h < cont->getSize(); h++)
+       {
+               double x, y;
+               cont->getPoint(h,&x,&y);
+               fprintf(archivo,"%f;%f\n",x,y);
+       }
+
+       fclose(archivo);*/
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::create2DDiametersMin(int point , kVolume* vol ) {
+       
+if (quantContours[point] == NULL )
+       {
+               createContours(point,vol);
+       }
+
+       marAxisContours* axisCont = quantContours[point];
+
+       for (int i = 0; i < axisCont->getSize(); i++)
+       {
+               double p1[2],p2[2];
+               marContour *marcontour=getContour(point,vol,i);
+               marContourVO* aContourVO = axisCont->getContour(i);
+
+               marcontour->getMinimumLine(p1,p2);
+               vtkPoints *_vtkPoints = vtkPoints::New();
+               
+               int sizeIma = getParameters( )->getSizeIma( );
+               double dimIma = getParameters( )->getDimIma( );
+               double factor=( float ) sizeIma / dimIma;
+               
+               p1[0]=p1[0]*factor+sizeIma/2;
+               p1[1]=p1[1]*factor+sizeIma/2;
+               p2[0]=p2[0]*factor+sizeIma/2;
+               p2[1]=p2[1]*factor+sizeIma/2;
+               _vtkPoints->InsertNextPoint( p1[0] , p1[1] , 1 );
+               _vtkPoints->InsertNextPoint( p2[0] , p2[1] , 1 );
+
+               if ( aContourVO->get2DDiameterMin()!=NULL ) { aContourVO->get2DDiameterMin()->Delete(); }
+                       aContourVO->set2DDiameterMin(_vtkPoints);
+
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::create2DDiametersMax(int point , kVolume* vol ) {
+       if (quantContours[point] == NULL )
+       {
+               createContours(point,vol);
+       }
+
+       marAxisContours* axisCont = quantContours[point];
+
+       for (int i = 0; i < axisCont->getSize(); i++)
+       {
+               double p1[2],p2[2];
+               marContour *marcontour=getContour(point,vol,i);
+               marContourVO* aContourVO = axisCont->getContour(i);
+
+               marcontour->getMaximumLine(p1,p2);
+               vtkPoints *_vtkPoints = vtkPoints::New();
+
+               int sizeIma = getParameters( )->getSizeIma( );
+               double dimIma = getParameters( )->getDimIma( );
+               double factor=( float ) sizeIma / dimIma;
+               p1[0]=p1[0]*factor+sizeIma/2;
+               p1[1]=p1[1]*factor+sizeIma/2;
+               p2[0]=p2[0]*factor+sizeIma/2;
+               p2[1]=p2[1]*factor+sizeIma/2;
+               _vtkPoints->InsertNextPoint( p1[0] , p1[1] , 1 );
+               _vtkPoints->InsertNextPoint( p2[0] , p2[1] , 1 );
+               
+               if ( aContourVO->get2DDiameterMax()!=NULL ) { aContourVO->get2DDiameterMax()->Delete(); }
+                       aContourVO->set2DDiameterMax(_vtkPoints);
+       }
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::createSignals (int point, kVolume* vol) {
+       if (quantContours[point] == NULL )
+       {
+               create2Dcontours(point,vol); //AQUI
+       //      filterSignal(vol);
+       }
+}
+
+// ----------------------------------------------------------------------------
+int    marAxisCT::getNumberOfContours(int point, kVolume* vol) {
+       if (quantContours[point] == NULL )
+       {
+               create2Dcontours(point,vol);//AQUI
+       //      filterSignal(vol);
+               
+       }
+
+       return quantContours[point]->getSize();
+}
+
+// ----------------------------------------------------------------------------
+int    marAxisCT::getContourType(int point, int index, kVolume* vol) {
+       if (quantContours[point] == NULL )
+       {
+               create2Dcontours(point,vol);
+       }
+       
+       return quantContours[point]->getContourType(index);
+
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::generatePoints(int point, kVolume* vol, std::vector<marIsocontour*> *list) {
+
+       vtkImageData* imagedata;
+       int dirs = 72;
+       double aPoint[ 3 ];
+       double *nPoint = new double[ 3 ];
+       double x, y, prevIntensity, threshold;
+       bool found, estStart, estDivided, isNeighbor;
+       int actualZone, startZone, coordBase, maxPoint, lumenCount, calcCount;
+       std::vector <marPoint  *> gradients;
+       std::vector <double> average;
+       std::vector <marIsocontour *> contoursLumen;
+       std::vector <marIsocontour *> contoursCalc;
+
+       contoursLumen.push_back(NULL);
+       contoursCalc.push_back(NULL);
+       
+       
+       
+       //1. Check starting zone
+       startZone = marAxisContours::LUMEN;
+       actualZone = startZone;
+       lumenCount = 0;
+       calcCount = 0;
+
+       imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+
+       int limInfX, limInfY, limInfZ;
+       int limSupX, limSupY, limSupZ;
+       imagedata->GetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+
+       vtkImageCast* cast = vtkImageCast::New();
+       cast->SetInput(imagedata);
+       cast->SetOutputScalarTypeToDouble();
+
+       vtkImageGaussianSmooth* filter = vtkImageGaussianSmooth::New();
+       filter->SetDimensionality(2);
+       filter->SetInput(cast->GetOutput());
+       filter->SetStandardDeviations((getParameters())->getStandardDeviation(),(getParameters())->getStandardDeviation());
+       filter->SetRadiusFactors((getParameters())->getRadius(),(getParameters())->getRadius());
+       filter->SetStandardDeviations(3,3);
+       filter->SetRadiusFactors(3,3);
+
+       //imagedata = filter->GetOutput();
+       
+       
+       nPoint = getPoints(point);
+
+       aPoint[ 0 ]     =  (limSupX - limInfX) / 2; //nPoint[0]; 
+       aPoint[ 1 ]     =  (limSupY - limInfY) / 2; //nPoint[1]; 
+       aPoint[ 2 ]     =  (limSupZ - limInfZ) / 2; // nPoint[2]; 
+       estDivided = false;
+       estStart = false;
+       //3. Generate rays over all directions
+       for (int dir = 0; dir < dirs; dir++)
+       {
+               
+               x = aPoint[ 0 ];
+               y = aPoint[ 1 ];
+               coordBase = 1;
+               prevIntensity = interpolate(x,y,imagedata);
+               generateVector(dir,&coordBase,aPoint[0],aPoint[1],&x,&y);
+
+               //2.1 Evaluate gradient in every position of the ray 
+               while ((x > (limInfX+1) && x < (limSupX-1)) && (y > (limInfY+1) && y < (limSupY-1)))
+               {
+                       
+                       //2.1.1 Interpolate
+                       double resp = interpolate(x,y,imagedata);
+                       //2.1.2 Calcultate gradient
+                       marPoint* p = new marPoint(x,y);
+                       p->setGradient(prevIntensity - resp);
+                       p->setDirection(dir);
+                       p->setIntensity(resp);
+                       
+                       prevIntensity = resp;
+
+                       gradients.push_back(p);
+
+                       //2.1.3 Increase ray for next evaluation
+                       generateVector(dir,&coordBase,aPoint[0],aPoint[1],&x,&y);
+
+               }// end while gradient
+
+               int index = 0;
+               found = false;
+               x = aPoint[ 0 ];
+               y = aPoint [ 1 ];
+               threshold = ((marParameters *) getParameters())->getContourThresh();
+               int mysize = gradients.size();
+               
+               //2.2 Compare every gradient value with threshold
+               while (index < gradients.size() && !found)
+               {
+                       //2.2.1 Evaluate Lumen
+                       if (actualZone == marAxisContours::LUMEN)
+                       {
+                               average.push_back(gradients[index]->getIntensity());
+                               
+                               //2.2.1.1 If value > threshold there is a contour
+                               if (fabs(gradients[index]->getGradient()) > threshold 
+                                       && fabs(gradients[index]->getGradient()) < 4000) {
+                                               //|| (calibration && (abs(gradients[index]->getIntensity()) > abs(avgValue - 2.5*stdValue)
+                                               //|| abs(gradients[index]->getIntensity()) > abs(avgValue + 2.5*stdValue)))) {
+
+                                       
+
+                                       if(gradients[index]->getGradient() > 0)
+                                               maxPoint = getMaximumGrad(gradients,index,gradients.size(),threshold);
+                                       else
+                                               maxPoint = getMinimumGrad(gradients,index,gradients.size(),threshold);
+
+                                       index = maxPoint;
+                                       x = gradients[maxPoint]->getX();
+                                       y = gradients[maxPoint]->getY();
+
+                                       //2.2.1.1.1 Assign lumen structure
+                                       isNeighbor = detectNeighbor(contoursLumen[lumenCount],dir,marAxisContours::LUMEN);
+                                       if (!isNeighbor)
+                                       {
+                                               lumenCount++;
+                                       }
+                                       
+                                       marIsocontour* cont = addPointToContour(contoursLumen[lumenCount],false,marAxisContours::LUMEN,gradients[maxPoint]);
+                                       contoursLumen[lumenCount] = cont;
+
+                                       //2.2.1.1.2 Check step lumen->calcification
+                                       double actualInt = interpolate(x,y,imagedata);
+                                       double auxX = x;
+                                       double auxY = y;
+                                       generateVector(dir,&coordBase,aPoint[0],aPoint[1],&auxX,&auxY);
+                                   double next = interpolate(auxX,auxY,imagedata);
+                                       if (gradients[index]->getGradient() < 0 /*&& actualInt < next */&& (auxX > (limInfX+1) && auxX < (limSupX-1)) && (auxY > (limInfY+1) && auxY < (limSupY-1)))
+                                       {
+                                               //2.2.1.1.2.1 Assign calcification structure
+                                               isNeighbor = detectNeighbor(contoursCalc[calcCount],dir,marAxisContours::CALCIFICATION);
+                                               if (!isNeighbor)
+                                               {
+                                                       calcCount++;
+                                                       contoursCalc.push_back(NULL);
+                                               }
+
+                                               cont = addPointToContour(contoursCalc[calcCount],true,marAxisContours::CALCIFICATION,gradients[maxPoint]);
+                                               
+                                               contoursCalc[calcCount] = cont;
+
+                                               actualZone = marAxisContours::CALCIFICATION;
+                                               //ASIGNACION varX???
+
+                                               //2.2.1.1.2.3 Verify divided structure
+                                               if (dir == 0)
+                                               {
+                                                       estStart = true;
+                                               }
+
+                                               if ((dir == dirs - 1) && estStart)
+                                               {
+                                                       estDivided = true;
+                                               }
+
+                                       }//2.2.1.1.3 Transition lumen->background
+                                       else
+                                       {
+                                               //2.2.1.1.3.1 Asign border structure
+                                               //ASIGNAR ESTRUCTURA
+                                               
+                                               //2.2.1.1.3.2 Generate stop condition
+                                               found = true;
+                                               actualZone = startZone;
+                                               coordBase = 1;
+                                               x = aPoint[ 0 ];
+                                               y = aPoint[ 1 ];
+                                               threshold = ((marParameters *) getParameters())->getContourThresh();
+                                       }
+
+                               }
+                       }
+                       //2.2.2 Evaluate calcification (MODIFIED IF THERE IS HYPODENSE)
+                       else
+                       {
+                               coordBase = 1;
+                               int calcIndex;
+                               double actualInt = interpolate(x,y,imagedata);
+                               generateVector(dir,&coordBase,aPoint[0],aPoint[1],&x,&y);
+                               double next = interpolate(x,y,imagedata);
+
+                               //2.2.2.1 If actual intensity is smaller than previous there is a contour
+                               if (actualInt < next)
+                               {
+                                       while (actualInt < interpolate(x,y,imagedata) && (x > (limInfX+1) && x < (limSupX-1)) && (y > (limInfY+1) && y < (limSupY-1)))
+                                       {
+                                               generateVector(dir,&coordBase,aPoint[0],aPoint[1],&x,&y);
+                                               index++;
+                                       }
+
+                               }
+
+                               generateVector(dir,&coordBase,aPoint[0],aPoint[1],&x,&y);
+
+                               //2.2.2.2 Assign calcification structure
+                               isNeighbor = detectNeighbor(contoursCalc[calcCount],dir,marAxisContours::CALCIFICATION);
+                               if (!isNeighbor)
+                               {
+                                       calcCount++;
+                                       contoursCalc.push_back(NULL);
+                               }
+
+                               //Adjust index to avoiod crash
+                               if (index >= gradients.size())
+                               {
+                                       calcIndex = gradients.size() - 1;
+                               }
+                               else
+                               {
+                                       calcIndex = index;
+                               }
+
+                               marIsocontour* cont = addPointToContour(contoursCalc[calcCount],false,marAxisContours::CALCIFICATION,gradients[calcIndex]);
+                               contoursCalc[calcCount] = cont;
+                               
+                               //2.2.2.3 Asign border structure
+                               //ASIGNACION BORDE
+
+                               found = true;
+                               actualZone = startZone;
+                               x = aPoint[ 0 ];
+                               y = aPoint[ 1 ];
+                               threshold = ((marParameters *) getParameters())->getContourThresh();
+
+                       }//end if zones
+
+                       index++;
+
+                       if (index == gradients.size() && !found)
+                       {
+                               threshold = threshold - 1;
+                               index = 0;
+                       }
+
+               }//end while evaluation
+
+               //TODO - SACAR A UTILS
+               for (int ind = 0; ind < gradients.size(); ind++)
+               {
+                       marPoint* p = gradients[ind];
+                       gradients[ind] = NULL;
+                       delete p;
+                       
+               }
+               gradients.clear();
+
+       }//end for directions
+
+       FILE *archivo;
+       char nomArchivo[30]; //, temp[3]
+
+       strcpy(nomArchivo,"./debug");
+//     itoa(point,temp,10);
+//     strcat(nomArchivo,temp);
+       strcat(nomArchivo,".txt");
+       archivo = fopen(nomArchivo,"w");
+       
+  
+
+
+       
+//     lumenContour[point] = contoursLumen[marAxisContours::LUMEN];
+       
+       double  tempXi, tempYi;
+       int polySides = contoursLumen[marAxisContours::LUMEN]->getSize();
+       
+    
+       marIsocontour* alc = new marIsocontour();
+       for (int m=0; m<polySides; m++) {
+               contoursLumen[marAxisContours::LUMEN]->getPoint(m,&tempXi,&tempYi);          
+               alc = addPointToContour(lumenContour[point],false,marAxisContours::LUMEN,new marPoint(tempXi,tempYi));
+               lumenContour[point] = alc;
+               fprintf(archivo,"X:%f,Y:%f\n",tempXi,tempYi);
+       }
+       
+
+       
+       //4. Verify divided unified structure
+       if (estDivided && calcCount > 0)
+       {
+               unifyDividedStructure(&contoursCalc);
+               calcCount--;
+       }   
+       
+       //5. Obtain statistics
+       double lumenInt = getStatistics(contoursLumen[marAxisContours::LUMEN],aPoint[ 0 ],aPoint[ 1 ], imagedata);
+       contoursLumen[marAxisContours::LUMEN]->setMaxIntensity(lumenInt);
+
+       if (contoursCalc[0] != NULL)
+       {
+               for (int i = 0; i < contoursCalc.size(); i++)
+               {
+                       lumenCount++;
+                       double maxInt = getCalcStatistics(contoursCalc[i],aPoint[ 0 ],aPoint[1],imagedata,i-1);
+                       contoursCalc[i]->setMaxIntensity(maxInt);
+                       contoursLumen.push_back(NULL);
+                       contoursLumen[lumenCount] = contoursCalc[i];
+               }
+       }
+       
+       
+       *list = contoursLumen;
+
+       contoursCalc.clear();
+    contoursLumen.clear();
+       marUtils* util = new marUtils();
+       double avg = util->obtainAverage(average);
+       //FILE *archivo;
+       //archivo = fopen("./debug.txt","w");
+       fprintf(archivo,"tamaño: %d umbra: %d",  (*list).size(),((marParameters *) getParameters())->getContourThresh());
+       for (int k = 0; k < contoursLumen.size(); k++)
+       {
+               double cgx, cgy;
+
+               (*list)[k]->getCG(&cgx,&cgy);
+               fprintf(archivo,"cx: %f cy:%f Señal: %f Type: %d\n", cgx, cgy, (*list)[k]->getMaxIntensity(), (*list)[k]->getType());
+       }
+
+       fprintf(archivo,"PROMEDIO %f - STD: %f\n",avg,util->obtainStandardDeviation(average,avg));
+       fprintf(archivo,"%d\n",lumenContour.size());
+       fclose(archivo);
+       imagedata->Delete();
+       
+}
+
+// ----------------------------------------------------------------------------
+int marAxisCT::getMaximumGrad(std::vector <marPoint *> list, int iniPos, int limit, double threshold) {
+       
+       double max = list[iniPos]->getGradient();
+       int coordMax = iniPos;
+       int cont = iniPos + 1;
+
+       while (cont < limit && list[cont]->getGradient()>=threshold){
+               if (list[cont]->getGradient() > max){
+                       max = list[cont]->getGradient();
+                       coordMax = cont;
+               }
+               cont++;
+       }
+
+       return coordMax;
+} 
+
+// ----------------------------------------------------------------------------
+int marAxisCT::getMinimumGrad(std::vector <marPoint *> list, int iniPos, int limit, double threshold) {
+       
+       double min = list[iniPos]->getGradient();
+       int coordMin = iniPos;
+       int cont = iniPos + 1;
+
+       while (cont < limit && fabs(list[cont]->getGradient())>=threshold){
+               if (list[cont]->getGradient() < min){
+                       min = list[cont]->getGradient();
+                       coordMin = cont;
+               }
+               cont++;
+       }
+
+       return coordMin;
+} 
+
+// ----------------------------------------------------------------------------
+double marAxisCT::interpolate(double x, double y, vtkImageData* imagedata) {
+
+       double a,b,c,d;
+       double intensity;
+       int i,j;
+
+       i = (int)floor(x);
+       j = (int)floor(y);
+
+       
+       c = imagedata->GetScalarComponentAsDouble(i,j,0,0) + (double) imagedata->GetScalarComponentAsDouble(i+1,j+1,0,0)
+               - imagedata->GetScalarComponentAsDouble(i+1,j,0,0) - imagedata->GetScalarComponentAsDouble(i,j+1,0,0);
+
+       b = imagedata->GetScalarComponentAsDouble(i,j+1,0,0) - c*i - imagedata->GetScalarComponentAsDouble(i,j,0,0);
+
+       a = imagedata->GetScalarComponentAsDouble(i+1,j,0,0) - c*j - imagedata->GetScalarComponentAsDouble(i,j,0,0);
+
+       d = imagedata->GetScalarComponentAsDouble(i,j,0,0) - a*i - b*j - c*i*j;
+
+       intensity = a*x + b*y + c*x*y + d;
+
+       return intensity;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::generateVector(int dir,int *coordBase,double originX,double originY,double *x,double *y) {
+
+       int dirs = 72;
+       int angle = (dir * (360 / dirs));
+
+       *x = 1 * cos(angle *(3.1415/180)) + (*x); 
+       *y = 1 * sin(angle *(3.1415/180)) + (*y); 
+
+       (*coordBase)++; 
+}
+
+// ----------------------------------------------------------------------------
+bool marAxisCT::detectNeighbor(marIsocontour* contour,int dir, int type) {
+       
+       bool isNeighbor = false;
+
+       if (contour == NULL){
+               isNeighbor = true; 
+       }else{
+               for (int i = 0; i < contour->getSize(); i++) {
+                       
+                       if (((contour->getDir(i) == (dir - 1)) || (contour->getDir(i) == dir)) 
+                                   && (contour->getType() == type)){ 
+                               isNeighbor = true; 
+                       }       
+               }
+       }
+
+       return isNeighbor;
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour* marAxisCT::addPointToContour(marIsocontour* cont ,bool inside,int type,marPoint* point) {
+
+       
+
+       if (cont == NULL)
+       {
+               cont = new marIsocontour();
+               cont->setType(type);
+       }
+       
+       cont->insertPoint(point->getX(),point->getY());
+       cont->setDir(cont->getSize() - 1,point->getDirection());
+       cont->setInside(cont->getSize() - 1,inside);
+       
+       return cont;
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::unifyDividedStructure(std::vector<marIsocontour*> *contList) {
+
+       marIsocontour* structOne = (*contList)[contList->size()-1];
+       marIsocontour* structTwo = (*contList)[0];
+       
+
+       for (int i = 0; i < structOne->getSize(); i++)
+       {
+               double x;
+               double y;
+               structOne->getPoint(i,&x,&y);
+               structTwo->insertPoint(x,y);
+               structTwo->setDir(structTwo->getSize() - 1,structOne->getDir(i));
+               structTwo->setInside(structTwo->getSize() - 1,structOne->getInside(i));
+
+       }
+
+       contList->pop_back();
+}
+
+// ----------------------------------------------------------------------------
+double marAxisCT::getStatistics(marIsocontour* contour, double x, double y, vtkImageData* imagedata) {
+
+       double max, auxX, auxY;
+       int basis;
+       max = interpolate(x,y,imagedata);
+
+       for (int i = 0; i < contour->getSize(); i++)
+       {
+               basis = 1;
+               auxX = x;
+               auxY = y;
+               double pointX;
+               double pointY;
+
+               contour->getPoint(i,&pointX,&pointY);
+               while (auxX != pointX || auxY != pointY)
+               {
+                       double intensity = interpolate(auxX,auxY,imagedata);
+                       if (max < intensity)
+                       {
+                               max = intensity;
+                       }
+                       generateVector(contour->getDir(i),&basis,x,y,&auxX,&auxY);
+
+               }
+       }
+       
+       return max;
+}
+
+
+// ----------------------------------------------------------------------------
+double marAxisCT::getCalcStatistics(marIsocontour* contour, double x, double y, vtkImageData* imagedata, int dir) {
+
+       
+       double max, auxX,auxY;
+       int basis;
+       
+       int i;
+       FILE *archivo;
+       char nomArchivo[30], temp[3];
+
+       strcpy(nomArchivo,"./statistics");
+
+// EED 06/06/2007 linux
+//     itoa(dir,temp,10);
+       sprintf(temp,"%d",dir);
+
+       strcat(nomArchivo,temp);
+       strcat(nomArchivo,".txt");
+
+
+       archivo = fopen(nomArchivo,"w");
+       i = 0; 
+       max = 0;
+       fprintf(archivo,"TAMAÑO %d\n",contour->getSize());
+
+       while (i < contour->getSize()) 
+       {
+               basis = 1;
+               double pointX, pointY;
+               contour->getPoint(i+1,&pointX,&pointY);
+               contour->getPoint(i,&auxX,&auxY);
+               fprintf(archivo,"final: %f %f inicial %f %f \n",pointX,pointY,auxX,auxY);       
+               
+               while (auxX != pointX || auxY != pointY)
+               {
+                       double intensity = interpolate(auxX,auxY,imagedata);
+                       if (max < intensity){
+                               max = intensity;
+                       }
+                       generateVector(contour->getDir(i),&basis,auxX,auxY,&auxX,&auxY);
+               }
+                       
+               i +=2;
+       }
+       fclose(archivo);
+       return max;
+}
+
+// ----------------------------------------------------------------------------
+int marAxisCT::round(double num){
+
+       float decimal;
+       int resp;
+       
+       decimal = num - floor(num) * 1.0000;
+
+       if (decimal >= 0.50000)
+               resp = (int)ceil(num);
+       else
+               resp = (int)floor(num);
+
+       return resp;
+
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::createEmptyContours(){
+
+       int nCnts = ( int ) getNumberOfSplinePoints( );
+       
+
+       for (int i = 0; i < nCnts; i++)
+       {
+               quantContours.push_back( NULL );
+               lumenContour.push_back( NULL);
+       }
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::updateLumenPercentage(int point, kVolume* vol)
+{
+       marContourVO* wallCont = searchContour(marAxisContours::WALL,point);
+       if (quantContours[point] == NULL || wallCont->get2DContour() == NULL)
+       {
+               create2Dcontours(point,vol); 
+       }
+
+       if (wallCont->getType() == marAxisContours::WALL
+                       && wallCont->isReplaced() == false)
+       {
+               int a = ((marParameters *) getParameters())->getLumenPercentage();
+               double oldValue = wallCont->getSignal();
+               double lumenPercentage=((marParameters *) getParameters())->getLumenPercentage();
+               double poww=pow(10.0,-2.0);
+               double newValue = oldValue * lumenPercentage*poww;
+               wallCont->getIsocontour()->SetValue(0,newValue);
+               wallCont->getIsocontour()->Update();
+               wallCont->get2DContour()->Update(); 
+       }
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::updateCalcPercentage(int point, kVolume* vol)
+{
+       double oldValue;
+       int posMax;
+
+       if (quantContours[point] == NULL)
+       {
+               create2Dcontours(point,vol); 
+       }
+
+       posMax = getMaxIntensity(point);
+       
+       if (quantContours[point]->getSize() > 1)
+       {
+               oldValue = quantContours[point]->getContour(posMax)->getSignal();
+       }
+       
+       for (int i = 1; i < quantContours[point]->getSize(); i++)
+       {
+               
+               if (quantContours[point]->getContour(i)->getType() == marAxisContours::CALCIFICATION 
+                               && quantContours[point]->getContour(i)->isReplaced() == false)
+               {
+
+                       double newValue = oldValue * ((((marParameters *) getParameters())->getCalcPercentage())*pow(10.0,-2.0));
+                       quantContours[point]->getContour(i)->getIsocontour()->SetValue(0,newValue);
+                       quantContours[point]->getContour(i)->getIsocontour()->Update();
+                       quantContours[point]->getContour(i)->get2DContour()->Update();
+               }
+       
+       }
+       
+}
+
+// ----------------------------------------------------------------------------
+int    marAxisCT::getMaxIntensity(int point)
+{
+       int pos = 1; 
+       double intMax;
+       if (quantContours[point]->getSize() > 2)
+       {
+               intMax = quantContours[point]->getContour(0)->getSignal();
+               for (int i = 0; i < quantContours[point]->getSize(); i++)
+               {
+                       if (quantContours[point]->getContour(i)->getSignal() > intMax && quantContours[point]->getContour(i)->getType() == marAxisContours::CALCIFICATION)
+                       {
+                               intMax = quantContours[point]->getContour(i)->getSignal() ;
+                               pos = i;
+                       }
+               }
+       }
+
+       return pos;
+       
+}
+// ----------------------------------------------------------------------------
+void marAxisCT::eraseContours()
+{
+
+       
+               int nCts = quantContours.size();
+               vesselPoints.clear();
+
+               int i = 0;
+
+               while (i < nCts)
+               {
+                       delete quantContours[i];
+                       quantContours[i] = NULL;
+                       lumenContour[i] = NULL;
+                       i++;
+               }
+               quantContours.clear();
+               lumenContour.clear();
+
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::eraseContoursPartial(int start)
+{
+
+       int nCts = 0;
+       int i = start;
+
+       while (i >= nCts)
+       {
+               delete quantContours[i];
+               quantContours[i] = NULL;
+               lumenContour[i] = NULL;
+               i--;
+       }
+       quantContours.clear();
+       lumenContour.clear();
+
+       //TODO Revisar esto que no me convence
+}
+
+
+// ----------------------------------------------------------------------------
+bool marAxisCT::pointInPolygon(marIsocontour *c, double x, double y){
+       int      i, j=0;
+       bool  oddNODES=false;
+       int polySides = c->getSize();
+       double *polyX, *polyY, tempX, tempY;
+
+       polyX = (double *) malloc(polySides*sizeof(double));
+       polyY = (double *) malloc(polySides*sizeof(double));
+
+       for (i=0; i<polySides; i++) {
+               c->getPoint(i,&tempX,&tempY);          
+               polyX[i] = tempX;
+               polyY[i] = tempY;
+       }
+
+       for (i=0; i<polySides; i++) {
+               j++; 
+               if (j==polySides) 
+                       j=0;
+               
+               if (polyY[i]<y && polyY[j]>=y
+                       ||  polyY[j]<y && polyY[i]>=y) {
+                       if (polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) {
+                               oddNODES=!oddNODES; 
+                       }
+               }
+       }
+
+       free(polyX);
+       free(polyY);
+  return oddNODES; 
+
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour* marAxisCT::parsePolyDataToMarIsocontour(marContourVO* contourVO){
+
+       vtkPolyData* polyDataCnt;
+       vtkIdList* pointsId;
+       double* pointPolyDataCnt;
+       int numPointsPolyDataCnt, numTemp;
+       marIsocontour *cont;
+
+       if (contourVO->isReplaced())
+       {
+               polyDataCnt = contourVO->get2DContour();
+       }
+       else
+       {
+               polyDataCnt =    contourVO->getIsocontourStripped()->GetOutput();
+       }
+       
+       numPointsPolyDataCnt = polyDataCnt->GetNumberOfPoints();
+       pointsId = polyDataCnt->GetCell(0)->GetPointIds();
+       numTemp = pointsId->GetNumberOfIds();
+       
+       cont = new marIsocontour();
+       
+       for (int i = 0; i < (numTemp -1); i++){
+               pointPolyDataCnt = polyDataCnt->GetPoint(pointsId->GetId(i));
+               cont->insertPoint(pointPolyDataCnt[0], pointPolyDataCnt[1]);
+               
+       }
+               
+       return cont;    
+}
+
+
+
+// ----------------------------------------------------------------------------
+marIsocontour* marAxisCT::filterContour(marIsocontour* contExt, marIsocontour* contInt, double radio){
+  
+       double tmp_eed;
+       double x1,y1,x2,y2,xInt,yInt, xAux, yAux;
+       std::vector<marLine*> lineas;   
+       std::vector<double> dists;
+       int count, countAux, ultima;
+       bool hayInterseccion;
+
+       marIsocontour* newCont = new marIsocontour();
+
+       for (int i = 0; i < contExt->getSize(); i++){
+               contExt->getPoint(i,&x1,&y1);
+               contInt->getPoint(i,&x2,&y2);
+               lineas.push_back(new marLine(x1,y1,x2,y2));     
+               tmp_eed = sqrt(pow((x2-x1),2.0) + pow((y2-y1),2.0)); 
+               dists.push_back( tmp_eed );
+       }
+
+       count = 0;
+       ultima = 0;
+       while (count < lineas.size() - 1){
+               countAux = 0;
+
+               marLine* l1 = lineas[count];
+       
+               hayInterseccion = false;
+               while (countAux < lineas.size()){
+                       marLine *l2 = lineas[countAux];
+
+                       l1->getIntersect(l2->getA(),l2->getB(),l2->getC(),&xInt,&yInt);
+
+                       
+                       if (xInt > 0 && yInt > 0){
+                               contExt->getPoint(countAux,&xAux,&yAux);
+                               if (dists[count] >= sqrt(pow((xInt-xAux),2.0) + pow((yInt-yAux),2.0))){
+                                       contExt->getPoint(count,&x1,&y1);
+                                       contInt->getPoint(count,&x2,&y2);
+
+                                       //Distancia menor?
+                                       if ((dists[count] > sqrt(pow((xInt-x1),2.0) + pow((yInt-y1),2.0))) && 
+                                               (dists[count] > sqrt(pow((xInt-x2),2.0) + pow((yInt-y2),2.0))))
+                                       {
+                                               ultima = countAux;
+                                               hayInterseccion = true;
+                                       
+                                       } 
+                               
+                               }
+                       }
+                       countAux++;
+               }
+
+       
+               if (!hayInterseccion){
+                       contInt->getPoint(count,&x2,&y2);
+                       newCont->insertPoint(x2,y2);
+               } 
+                       count++;
+               
+       }
+
+       return newCont;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::markUpLumen(int point, kVolume* vol)
+{
+       
+       marContourVO* aVO = this->searchContour(marAxisContours::ELUMEN,point);
+
+       if (aVO != NULL)
+       {
+               return;
+       }
+
+       int limInfX,limInfY,limInfZ,limSupX,limSupY,limSupZ;
+       vtkImageData* imagedata;
+       vtkImageData* erodedata;
+       std::vector <marIsocontour* > polygons;
+       std::vector <marPoint* > points;
+       double average = 0, deviation = 0;
+       vtkImageData* image = vtkImageData::New();
+       vesselPoints.clear();
+       
+
+       imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+       imagedata->GetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       image->SetDimensions(limSupX,limSupY,0);
+       image->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       image->SetScalarTypeToUnsignedShort();
+       image->AllocateScalars();
+       image->Update();
+       
+       vtkImageThreshold *imageThreshold = vtkImageThreshold::New();
+       imageThreshold->SetInput(imagedata);
+       imageThreshold->ThresholdByUpper(maxSignal);
+       imageThreshold->SetInValue(255);
+       imageThreshold->SetOutValue(0.0);
+       imageThreshold->Update();
+
+       vtkImageContinuousErode3D *imageErode3D = vtkImageContinuousErode3D::New();
+       imageErode3D->SetInput(imageThreshold->GetOutput());
+       imageErode3D->SetKernelSize(4,4,1);
+       imageErode3D->Update();
+       erodedata = imageErode3D->GetOutput();
+
+//     polygons.push_back(contExt);
+       for (int i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               polygons.push_back(parsePolyDataToMarIsocontour(quantContours[point]->getContour(i)));
+       }
+       
+       //7- Wipe image to detect lumen
+       
+        int x;
+       for (x = limInfX + 30; x < (limSupX - 1); x++)
+       {
+               
+               for (int y = limInfY; y < (limSupY - 1) ; y++)
+               {
+                       bool inWall = false;
+                       bool outCalc = true;
+                       
+                       for (int numConts = 0; numConts < polygons.size(); numConts++)
+                       {
+                               if (pointInPolygon(polygons[numConts],x,y) && erodedata->GetScalarComponentAsDouble(x,y,0,0) > 0)
+                               {
+                                       if (numConts == 0)
+                                       {
+                                               inWall = true;
+                                       }
+                               
+                                       else 
+                                       {
+                                               outCalc = false;
+                                       }
+                                       
+                               }
+                               
+                       }
+
+                       if (inWall && outCalc)
+                       {
+                               marPoint *p = new marPoint(x,y);
+                               p->setIntensity(imagedata->GetScalarComponentAsDouble(x,y,0,0));
+                               average += p->getIntensity();
+                               points.push_back(p);
+                       }
+
+               /*      if (cont >= (limSupY - limSupX))
+                       {
+                               contin = false;
+                       }*/
+               }
+       }
+       
+       if (points.size() > 0)
+       {
+               average = average / points.size();
+               for (int k = 0; k < points.size(); k++)
+               {
+                       marPoint *p = points[k];
+                       double actualInt = p->getIntensity();
+                       double temp = average - actualInt;
+                       deviation += pow(temp,2.0);
+               }
+               deviation = sqrt(deviation / points.size());
+
+       }
+
+
+       polygons.push_back(lumenContour[point]);
+
+
+       for (x = limInfX; x < (limSupX - 1); x++)
+       {
+               for (int y = limInfY; y < (limSupY - 1); y++)
+               {
+                       bool inWall = false;
+                       bool outCalc = true;
+                       bool inLumen = false;
+                       unsigned short *refValue = (unsigned short *) image->GetScalarPointer(x,y,0);
+                       *refValue = 0;
+
+                       for (int numConts = 0; numConts < polygons.size(); numConts++)
+                       {
+                               bool adentro = pointInPolygon(polygons[numConts],x,y);
+                               if (pointInPolygon(polygons[numConts],x,y) && erodedata->GetScalarComponentAsDouble(x,y,0,0) > 0)
+                               {
+                                       if (numConts == 0)
+                                       {
+                                               inWall = true;
+                                       }
+                                       else if (numConts == polygons.size() - 1)
+                                       {
+                                               inLumen = true;
+                                               
+                                       }
+                                       else
+                                       {
+                                               outCalc = false;
+                                       }
+                               }
+                       }
+
+                       double intensidad = imagedata->GetScalarComponentAsDouble(x,y,0,0);
+                       
+                       if (inWall && outCalc && inLumen)
+                       {
+
+                               if (imagedata->GetScalarComponentAsDouble(x,y,0,0) > (average - 1.5*deviation)
+                                        && imagedata->GetScalarComponentAsDouble(x,y,0,0) < (average + 2.5*deviation))
+                               {
+                                       *refValue = 255;                
+                               }
+                       
+                       }
+
+               }
+       }
+
+       
+
+       extractLumen(image,lumenContour[point],point);
+       
+//     fclose(archivo);
+}
+
+// ----------------------------------------------------------------------------
+double marAxisCT::obtainContourArea(marIsocontour* contour)
+{
+
+       double area = 0.0;
+       double x1,y1,x2,y2;
+       
+       for (int i = 0; i < contour->getSize();i++)
+       {
+               contour->getPoint(i,&x1,&y1);
+               if (i < (contour->getSize() - 1)) 
+               {
+                       contour->getPoint(i+1,&x2,&y2);
+               }
+               else 
+               {
+                       contour->getPoint(0,&x2,&y2);
+               }
+
+               area += (x1 * y2);
+               area -= (y1 * x2);
+       }
+
+       area = area / 2;
+
+       if (area < 0)
+               area = -area;
+
+       return area;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::adjustWall(int point, kVolume* vol)
+{
+       //int actualPercentage = ((marParameters *) getParameters())->getLumenPercentage();
+       marIsocontour* cont;
+       double actualArea, previousArea;
+       std::vector <double > grad;
+       marContourVO* wallCont = searchContour(marAxisContours::WALL,point);
+
+       //Obtain first area
+       ((marParameters *) getParameters())->setLumenPercentage(50);
+       updateLumenPercentage(point,vol);
+       cont = parsePolyDataToMarIsocontour(wallCont);
+       previousArea = obtainContourArea(cont);
+
+       for (int eval = 49; eval >= 0; eval--)
+       {
+               ((marParameters *) getParameters())->setLumenPercentage(eval);
+               updateLumenPercentage(point,vol);
+               cont = parsePolyDataToMarIsocontour(wallCont);
+               actualArea = obtainContourArea(cont);
+               grad.push_back(fabs(actualArea - previousArea));
+       }
+
+       int newPercentage = 50 - maxValue(grad);
+       ((marParameters *) getParameters())->setLumenPercentage(newPercentage);
+       updateLumenPercentage(point,vol);
+
+       
+
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::adjustCalcification(int point, kVolume* vol)
+{
+}
+
+// ----------------------------------------------------------------------------
+int    marAxisCT::maxValue(std::vector <double> list)
+{
+       int max = 0;
+       double maxVal = list[0];
+
+       for (int i = 0; i < list.size(); i++)
+       {
+               if (list[i] > maxVal)
+               {
+                       maxVal = list[i];
+                       max = i;
+               }
+       }
+
+       return max;
+}
+
+
+// ----------------------------------------------------------------------------
+int marAxisCT::getDiameter(marContourVO* contourVO, double x, double y, int limInfX, int limInfY, int limSupX, int limSupY)
+{
+       bool stop = false; 
+       double originX = x;
+       double originY = y;
+
+       int coordBase = 1, diameterOne = 0, diameterTwo = 0;
+       marIsocontour* cont = parsePolyDataToMarIsocontour(contourVO);
+       generateVector(1,&coordBase,originX,originY,&x,&y);
+
+       while ((x > (limInfX+1) && x < (limSupX-1)) && (y > (limInfY+1) && y < (limSupY-1)) && !stop)
+       {
+               generateVector(0,&coordBase,originX,originY,&x,&y);
+               if (pointInPolygon(cont,x,y))
+               {
+                       diameterOne++;
+               }
+               else
+               {
+                       stop = true; 
+               }
+       }
+
+       stop = false; 
+       x = originX;
+       y = originY; 
+       while ((x > (limInfX+1) && x < (limSupX-1)) && (y > (limInfY+1) && y < (limSupY-1)) && !stop)
+       {
+               generateVector(35,&coordBase,originX,originY,&x,&y);
+               if (pointInPolygon(cont,x,y))
+               {
+                       diameterOne++;
+               }
+               else
+               {
+                       stop = true; 
+               }
+       }
+
+       stop = false; 
+       x = originX;
+       y = originY; 
+       while ((x > (limInfX+1) && x < (limSupX-1)) && (y > (limInfY+1) && y < (limSupY-1)) && !stop)
+       {
+               generateVector(17,&coordBase,originX,originY,&x,&y);
+               if (pointInPolygon(cont,x,y))
+               {
+                       diameterTwo++;
+               }
+               else
+               {
+                       stop = true; 
+               }
+       }
+
+       stop = false; 
+       x = originX;
+       y = originY; 
+       while ((x > (limInfX+1) && x < (limSupX-1)) && (y > (limInfY+1) && y < (limSupY-1)) && !stop)
+       {
+               generateVector(107,&coordBase,originX,originY,&x,&y);
+               if (pointInPolygon(cont,x,y))
+               {
+                       diameterTwo++;
+               }
+               else
+               {
+                       stop = true; 
+               }
+       }
+
+       delete cont;
+
+       return (diameterOne + diameterTwo) / 2;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::histogram(int point, kVolume* vol)
+{
+
+       vtkImageData* imagedata;
+       int limInfX, limInfY, limInfZ;
+       int limSupX, limSupY, limSupZ;
+       int pos;
+       
+       
+       FILE *archivo;
+       char nomArchivo[30],temp[3];
+       marContourVO* wallCont = searchContour(marAxisContours::WALL,point);
+       
+               
+//     for (int point = 0; point <  quantContours.size(); point++)
+//     {
+               imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+               imagedata->GetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+               ((marParameters *) getParameters())->setLumenPercentage(86);
+               updateLumenPercentage(point,vol);
+               marIsocontour* contExt = parsePolyDataToMarIsocontour(wallCont);
+
+               std::vector<double> intensity;
+               std::vector<int> frecuencies;
+           
+               for (int i = 0; i < limSupX; i++)
+               {
+                       for (int j = 0; j < limSupY; j++)
+                       {
+                               if(pointInPolygon(contExt,i,j))
+                               {
+                                       
+                                       pos = searchData(intensity,imagedata->GetScalarComponentAsDouble(i,j,0,0));
+                                       if (pos == -1)
+                                       {
+                                               intensity.push_back( imagedata->GetScalarComponentAsDouble(i,j,0,0));
+                                               frecuencies.push_back(1);
+                                       
+                                               
+                                       }
+                                       else
+                                       {
+                                               frecuencies[pos]++;
+                                       }
+                               }
+                               
+                       }
+               }
+                       
+               strcpy(nomArchivo,"./histogram");
+
+// EED 06/06/2007 linux
+//             itoa(point,temp,10);
+               sprintf(temp,"%d",point);
+
+               strcat(nomArchivo,temp);
+               strcat(nomArchivo,".csv");
+               
+               
+
+               archivo = fopen(nomArchivo,"w");
+               for (int k = 0; k < frecuencies.size(); k++)
+               {
+
+                       fprintf(archivo,"%f;%d\n",intensity[k],frecuencies[k]);
+
+               }
+               fclose(archivo);
+               
+       
+               
+
+               //imagedata->Delete();
+               delete contExt;
+//     }
+
+}
+
+// ----------------------------------------------------------------------------
+int    marAxisCT::searchData(std::vector<double> vec, double value)
+{
+       int resp = -1;
+       bool found = false;
+
+       for (int i = 0; i< vec.size() && !found; i++)
+       {
+               if (vec[i] == value)
+               {
+                       resp = i;
+                       found = true;
+               }
+       }
+
+       return resp;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::setCalibration(bool calib)
+{
+       calibration = calib;
+}
+
+// ----------------------------------------------------------------------------
+bool marAxisCT::getCalibration()
+{
+       return calibration;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::adjustContour(int point, kVolume* vol)
+{
+
+       double percentage = 0.05;
+       double prevDifference = 0;
+       if (quantContours[point + 1] == NULL)
+       {
+               create2Dcontours(point + 1 ,vol);
+       }
+
+       //1. Obtain actual signal 
+       double signal = maxSignal;
+       marContourVO* wallCont = searchContour(marAxisContours::WALL,point);
+
+       //2. Obtain previous contour
+       marIsocontour* prev = parsePolyDataToMarIsocontour(searchContour(marAxisContours::WALL, point + 1));
+       
+       //3. Adjust actual contour
+       double newValue = signal; 
+       wallCont->getIsocontour()->SetValue(0,newValue);
+       wallCont->getIsocontour()->Update();
+       wallCont->get2DContour()->Update();
+
+       //4. Obtain points
+       marIsocontour* actual = parsePolyDataToMarIsocontour(wallCont);
+
+       //5. Compare areas
+       double prevA = obtainContourArea(prev);
+       double actuA = obtainContourArea(actual);
+
+       prevDifference = fabs(prevA - actuA);
+
+
+       if (prevA - actuA > 0 && prevA - actuA < percentage*prevA) //CASO 1
+       {
+               bool stop = false;
+               while (!stop && newValue > 0)
+               {
+                       newValue--;
+                       
+                       wallCont->getIsocontour()->SetValue(0,newValue);
+                       wallCont->getIsocontour()->Update();
+                       wallCont->get2DContour()->Update();
+
+                       actual = parsePolyDataToMarIsocontour(wallCont);
+                       actuA = obtainContourArea(actual);
+                       if (fabs(prevA - actuA) > percentage*prevA)
+                       {
+                               newValue++;
+                               wallCont->getIsocontour()->SetValue(0,newValue);
+                               wallCont->getIsocontour()->Update();
+                               wallCont->get2DContour()->Update();
+                               stop = true;
+                       }
+               }
+       
+       }
+       else if (prevA - actuA < 0 && prevA - actuA > -percentage*prevA) //CASO 2
+       {
+
+               bool stop = false;
+               while (!stop && newValue > 0)
+               {
+                       newValue--;
+                       
+                       wallCont->getIsocontour()->SetValue(0,newValue);
+                       wallCont->getIsocontour()->Update();
+                       wallCont->get2DContour()->Update();
+
+                       actual = parsePolyDataToMarIsocontour(wallCont);
+                       actuA = obtainContourArea(actual);
+                       if (prevA - actuA < -percentage*prevA)
+                       {
+                               newValue++;
+                               wallCont->getIsocontour()->SetValue(0,newValue);
+                               wallCont->getIsocontour()->Update();
+                               wallCont->get2DContour()->Update();
+                               stop = true;
+                       }
+               }
+       }
+       else if (prevA - actuA < 0 && prevA - actuA < -percentage*prevA) //CASO 3
+       {
+
+               bool stop = false;
+               
+               while (!stop)
+               {
+                       newValue++;
+                       
+                       wallCont->getIsocontour()->SetValue(0,newValue);
+                       wallCont->getIsocontour()->Update();
+                       wallCont->get2DContour()->Update();
+
+                       actual = parsePolyDataToMarIsocontour(wallCont);
+                       
+                       actuA = obtainContourArea(actual);
+                       if (prevA - actuA > -percentage*prevA)
+                       {
+                               if (prevDifference < fabs(prevA - actuA))
+                               {
+                                       newValue--;
+                                       wallCont->getIsocontour()->SetValue(0,newValue);
+                                       wallCont->getIsocontour()->Update();
+                                       wallCont->get2DContour()->Update();
+                               }
+                               
+                               stop = true;
+                               
+                       }
+                       prevDifference = fabs(prevA - actuA);
+               }
+       }
+       else if (prevA - actuA > 0 && prevA - actuA > percentage*prevA) //CASO 4
+       {
+               bool stop = false;
+               while (!stop && newValue > 0)
+               {
+                       newValue--;
+                       
+                       wallCont->getIsocontour()->SetValue(0,newValue);
+                       wallCont->getIsocontour()->Update();
+                       wallCont->get2DContour()->Update();
+
+                       actual = parsePolyDataToMarIsocontour(wallCont);
+                       actuA = obtainContourArea(actual);
+                       if (prevA - actuA < percentage*prevA)
+                       {
+                               if (prevDifference < fabs(prevA - actuA))
+                               {
+                                       newValue++;
+                                       wallCont->getIsocontour()->SetValue(0,newValue);
+                                       wallCont->getIsocontour()->Update();
+                                       wallCont->get2DContour()->Update();
+                               }
+                               
+                               stop = true;
+                               
+                       }
+                       prevDifference = fabs(prevA - actuA);
+               }
+       }
+
+       
+       maxSignal = newValue;
+
+       this->markUpLumen(point,vol);
+}
+
+// ----------------------------------------------------------------------------
+int marAxisCT::getStartIndex()
+{
+       return startIndex;
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::setStartIndex(int start)
+{
+       startIndex = start;
+
+       int per = ((marParameters *) getParameters())->getLumenPercentage();
+       double oldValue = quantContours[start]->getContour(0)->getSignal()*per*pow(10.0,-2.0);
+
+       maxSignal = oldValue; // / (per*pow(10.0,-2.0));
+}
+
+// ----------------------------------------------------------------------------
+int    marAxisCT::getPointSize()
+{
+       return vesselPoints.size();
+}
+
+// ----------------------------------------------------------------------------
+marPoint* marAxisCT::getPoint(int i)
+{
+       return vesselPoints[i];
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::extractLumen(vtkImageData *lumenImage, marIsocontour *lumenContour, int point)
+{
+
+       
+       vtkImageCast* cast = vtkImageCast::New();
+       cast->SetInput(lumenImage);
+       cast->SetOutputScalarTypeToDouble();
+       
+       vtkImageGaussianSmooth* filter = vtkImageGaussianSmooth::New();
+       filter->SetDimensionality(2);
+       filter->SetInput(cast->GetOutput());
+       filter->SetStandardDeviations((getParameters())->getStandardDeviation(),(getParameters())->getStandardDeviation());
+       filter->SetRadiusFactors((getParameters())->getRadius(),(getParameters())->getRadius());
+       filter->SetStandardDeviations(3,3);
+       filter->SetRadiusFactors(3,3);
+       
+
+
+       marAxisContours* axisCont = quantContours[point];
+
+       int pos = -1;
+       
+       for (int i = 0; i < axisCont->getSize()  && pos == -1; i++)
+       {
+               if (axisCont->getContourType(i) == marAxisContours::ELUMEN)
+               {
+                       pos = i;
+               }
+       }
+
+       bool stop = false;
+       if (pos != -1)          //Verify that contour hasn't been replaced
+       {
+               stop = true;
+               if (axisCont->isReplaced(pos))
+               {
+                       stop = true;
+               }
+       
+       }
+
+       if (!stop)
+       {
+               marContourVO* contourVO = new marContourVO();
+               marIsocontour* iso = lumenContour;
+               
+               contourVO->setIsocontour(vtkContourFilter::New());
+               contourVO->getIsocontour()->SetInput( filter->GetOutput() );
+               contourVO->getIsocontour()->SetNumberOfContours( 1 );
+               contourVO->getIsocontour()->SetValue( 0, 128 ); 
+               contourVO->getIsocontour()->Update( );
+                       
+               contourVO->setIsocontourCpd(vtkCleanPolyData::New());
+               contourVO->getIsocontourCpd()->SetInput( contourVO->getIsocontour()->GetOutput( ) );
+               contourVO->getIsocontourCpd()->ConvertLinesToPointsOff( );
+               contourVO->getIsocontourCpd()->Update( );
+
+               double cgx, cgy;
+
+               iso->getCG(&cgx,&cgy);
+                       
+               contourVO->setIsocontourDcf(vtkPolyDataConnectivityFilter::New( ));
+               contourVO->getIsocontourDcf()->SetInput( contourVO->getIsocontourCpd()->GetOutput( ) );
+                       
+               contourVO->getIsocontourDcf()->SetClosestPoint( cgx, cgy, 0 );
+               contourVO->getIsocontourDcf()->SetExtractionModeToClosestPointRegion( );
+               contourVO->getIsocontourDcf()->Update( );
+                       
+               contourVO->setIsocontourCpd2(vtkCleanPolyData::New());
+               contourVO->getIsocontourCpd2()->SetInput( contourVO->getIsocontourDcf()->GetOutput( ) );
+               contourVO->getIsocontourCpd2()->Update();
+
+               contourVO->setIsocontourStripped(vtkStripper::New( ));
+               contourVO->getIsocontourStripped()->SetInput( contourVO->getIsocontourCpd2()->GetOutput() );
+               contourVO->getIsocontourStripped()->Update();
+               
+               contourVO->set2DContour(contourVO->getIsocontourStripped()->GetOutput());
+               contourVO->get2DContour()->Update();
+               contourVO->setSignal(255);
+               contourVO->setType(marAxisContours::ELUMEN); 
+               
+               
+               
+               marIsocontour* actual = parsePolyDataToMarIsocontour(contourVO);
+               marContourVO* aVO = searchContour(marAxisContours::WALL,point);
+               double wallArea = 0;
+               if (aVO != NULL)
+               {
+                       wallArea = obtainContourArea(parsePolyDataToMarIsocontour(aVO));
+               }
+       
+               double prevA = obtainContourArea(actual);
+               
+               int newValue = 128;
+               int finalValue = 128;
+               double actuA = 1;
+               while (newValue > 0 && actuA > 0)
+               {
+                       
+                       newValue--;
+
+                       try
+                       {
+                               contourVO->getIsocontour()->SetValue(0,newValue);
+                               contourVO->getIsocontour()->Update();
+                               contourVO->get2DContour()->Update();
+                               actual = parsePolyDataToMarIsocontour(contourVO);
+                               actuA = obtainContourArea(actual);
+                               if ((actuA /1000) < 1 && (prevA / 1000) > 1)
+                               {
+                                       finalValue = newValue;
+                                       prevA = actuA;
+                               }
+                               else if (actuA > prevA && (prevA / 1000) < 1 && actuA < 0.1*wallArea)
+                               {
+                                       finalValue = newValue;
+                                       prevA = actuA;
+                               }
+                       }
+                       catch (std::exception e)
+                       {
+                               actuA = 0;
+                       }
+                       
+               }
+
+               contourVO->getIsocontour()->SetValue(0,finalValue);
+               contourVO->getIsocontour()->Update();
+               contourVO->get2DContour()->Update();
+
+
+
+               /*iso->getType()*/
+
+               if (pos != -1)
+               {
+                       axisCont->replaceContour(contourVO,pos);
+               }
+               else
+               {
+                       axisCont->addContour(contourVO);
+               }
+               //      axisCont->addContour(contourVO);
+
+
+               quantContours[point] = axisCont;
+       }
+
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::generateFile(int point,kVolume* vol)
+{
+       FILE *archivo;
+       char nomArchivo[30], temp[3];
+
+       strcpy(nomArchivo,"./point");
+
+// EED 06/06/2007 linux
+//     itoa(point,temp,10);
+       sprintf(temp,"%d",point);
+
+       strcat(nomArchivo,temp);
+       strcat(nomArchivo,".txt");
+       archivo = fopen(nomArchivo,"w");
+
+       fprintf(archivo, "%d", quantContours[point]->getSize());
+
+       int i;
+       for (i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               marIsocontour* iso =parsePolyDataToMarIsocontour(quantContours[point]->getContour(i));
+               fprintf(archivo, " %d",iso->getSize());
+               
+       }
+       fprintf(archivo,"\n");
+
+       for ( i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               marIsocontour* iso =parsePolyDataToMarIsocontour(quantContours[point]->getContour(i));
+               fprintf(archivo,"Tipo: %d\n",quantContours[point]->getContourType(i));
+               for (int j = 0; j < iso->getSize(); j++)
+               {
+                       double tempX, tempY;
+                       iso->getPoint(j,&tempX,&tempY); 
+                       fprintf(archivo,"%f;%f;%d\n",tempX,tempY,point);
+               }
+       }
+
+// EED 30 Janvier 2007
+       vtkImageData *vtkimagedata = this->getSliceImage(point,vol);
+
+       std::string directory = "./";
+       std::string filename  = "xx";
+       float rescalaSlope           =  1;
+       float rescalaIntercept       =  0;
+       int dim[3];
+       vtkimagedata->GetDimensions(dim);
+       int voi[6];
+       voi[0]=0;
+       voi[1]=dim[0];
+       voi[2]=0;
+       voi[3]=dim[1];
+       voi[4]=0;
+       voi[5]=dim[2];
+       marRAW2Files marraw2;
+       marraw2.saveVolume(directory,filename,vtkimagedata,voi,rescalaSlope,rescalaIntercept);
+
+
+
+       fclose(archivo);
+
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::replaceContour2D(int point,int size,double *vx,double *vy, int type)
+{
+
+       vtkPoints *_pts = vtkPoints::New();
+       _pts->SetNumberOfPoints(size);
+       int j;
+
+       for (j=0 ; j<size ; j++){
+               _pts->SetPoint(j,       vx[j]   , vy[j] , 0 );
+       }
+//     _pts->SetPoint(0,       vx[0]   , vy[0] , 0 );
+
+       vtkCellArray *lines = vtkCellArray::New();
+       lines->InsertNextCell( size );
+       for ( j=0 ; j<size+1 ; j++ ){
+               lines->InsertCellPoint(j % size );
+       }
+
+       vtkPolyData *_pd = vtkPolyData::New();
+       _pd->SetPoints( _pts );
+       _pd->SetLines( lines );
+       lines->Delete();  //do not delete lines ??
+       _pts->Delete();  
+
+       marContourVO* vo = new marContourVO();///this->searchContour(type,point); 
+       vo->setReplaced(true);
+       vo->set2DContour(_pd);
+       vo->setType(type);
+       quantContours[point]->addContour(vo);   //->replaceContour(vo,i);
+/*     _2Dcontours[i]=_pd;
+       createContour(i,NULL);*/
+}
+
+// ----------------------------------------------------------------------------
+void marAxisCT::cleanContours(int type, int point)
+{
+       marAxisContours* newContours = new marAxisContours();
+       if (quantContours[point] != NULL)
+       {
+               for (int i = 0; i < quantContours[point]->getSize(); i++)
+               {
+                       if (quantContours[point]->getContourType(i) != type)
+                       {
+                               newContours->addContour(quantContours[point]->getContour(i));
+                       }
+                       else
+                       {
+                       /*      marContourVO* vo = quantContours[point]->getContour(i);
+                               vo->set2DContour(NULL);
+                               newContours->replaceContour(vo,i);*/
+                       }
+               }
+       }
+
+       quantContours[point] = newContours;
+}
+
+// ----------------------------------------------------------------------------
+marContourVO*   marAxisCT::searchContour(int type, int point)
+{
+       marContourVO* cont = NULL;
+
+       for (int i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               if (quantContours[point]->getContourType(i) == type)
+               {
+                       cont = quantContours[point]->getContour(i);
+               }
+       }
+
+       return cont;
+}
+
+// ----------------------------------------------------------------------------
+double marAxisCT::performXOR(int type, int point, std::vector<marIsocontour *> manual, kVolume* vol)
+{
+       if (manual.size() == 0)
+       {
+               return 0;
+       }
+
+       int limInfX,limInfY,limInfZ,limSupX,limSupY,limSupZ;
+       std::vector <marIsocontour* > polygons;
+       vtkImageData* imagedata;
+
+       imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+       imagedata->GetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       vtkImageData* imageA = vtkImageData::New();
+       imageA->SetDimensions(limSupX,limSupY,0);
+       imageA->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       imageA->SetScalarTypeToUnsignedShort();
+       imageA->AllocateScalars();
+       imageA->Update();
+
+       vtkImageData* imageM = vtkImageData::New();
+       imageM->SetDimensions(limSupX,limSupY,0);
+       imageM->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       imageM->SetScalarTypeToUnsignedShort();
+       imageM->AllocateScalars();
+       imageM->Update();
+
+       
+       for (int i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               if (quantContours[point]->getContourType(i) == type)
+               {
+                       polygons.push_back(parsePolyDataToMarIsocontour(quantContours[point]->getContour(i)));
+               }
+               
+       }
+
+       if (polygons.size() == 0)
+       {
+               return 0;
+       }
+       int x,y;
+       for (x = limInfX; x < (limSupX - 1); x++)
+       {
+               for (y = limInfY; y < (limSupY - 1); y++)
+               {
+                       unsigned short *refValueA = (unsigned short *) imageA->GetScalarPointer(x,y,0);
+                       unsigned short *refValueM = (unsigned short *) imageM->GetScalarPointer(x,y,0);
+                       *refValueA = 0;
+                       *refValueM = 0;
+
+                       int numConts;
+                       for (numConts = 0; numConts < polygons.size(); numConts++)
+                       {
+                               if (pointInPolygon(polygons[numConts],x,y))
+                               {
+                                               *refValueA = 255;
+                               }
+                       }
+
+                       for (numConts = 0; numConts < manual.size(); numConts++)
+                       {
+                               if (pointInPolygon(manual[numConts],x,y))
+                               {
+                                               *refValueM = 255;
+                               }
+                       }
+               }
+       }
+
+/*     vtkImageLogic* xor = vtkImageLogic::New();
+       xor->SetInput1(imageM);
+       xor->SetInput2(imageA);
+       xor->SetOutputTrueValue(255);
+       xor->SetOperationToXor();
+
+       vtkImageCast* cast = vtkImageCast::New();
+       cast->SetInput(xor->GetOutput());
+       cast->SetOutputScalarTypeToDouble();
+*/
+       int coincidencias = 0;
+       for (x = limInfX; x < (limSupX - 1); x++)
+       {
+               for (y = limInfY; y < (limSupY - 1); y++)
+               {
+                       int compA = (int) imageA->GetScalarComponentAsDouble(x,y,0,0);
+                       int compM = (int) imageM->GetScalarComponentAsDouble(x,y,0,0);
+
+                       int xor_ = compA^compM;
+                       if (xor_ == 255)
+                       {
+                               coincidencias++;
+                       }
+               }
+       }
+
+       double resp = (double)coincidencias ;
+
+       return resp;
+
+}
+
+// ----------------------------------------------------------------------------
+double  marAxisCT::performAND(int type, int point, std::vector<marIsocontour *> manual, kVolume* vol)
+{
+
+       if (manual.size() == 0)
+       {
+               return 0;
+       }
+
+       int limInfX,limInfY,limInfZ,limSupX,limSupY,limSupZ;
+       std::vector <marIsocontour* > polygons;
+       vtkImageData* imagedata;
+
+       imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+       imagedata->GetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       vtkImageData* imageA = vtkImageData::New();
+       imageA->SetDimensions(limSupX,limSupY,0);
+       imageA->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       imageA->SetScalarTypeToUnsignedShort();
+       imageA->AllocateScalars();
+       imageA->Update();
+
+       vtkImageData* imageM = vtkImageData::New();
+       imageM->SetDimensions(limSupX,limSupY,0);
+       imageM->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       imageM->SetScalarTypeToUnsignedShort();
+       imageM->AllocateScalars();
+       imageM->Update();
+
+       for (int i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               if (quantContours[point]->getContourType(i) == type)
+               {
+                       polygons.push_back(parsePolyDataToMarIsocontour(quantContours[point]->getContour(i)));
+               }
+               
+       }
+
+       if (polygons.size() == 0)
+       {
+               return 0;
+       }
+
+       int x,y;
+       for (x = limInfX; x < (limSupX - 1); x++)
+       {
+               for (y = limInfY; y < (limSupY - 1); y++)
+               {
+                       unsigned short *refValueA = (unsigned short *) imageA->GetScalarPointer(x,y,0);
+                       unsigned short *refValueM = (unsigned short *) imageM->GetScalarPointer(x,y,0);
+                       *refValueA = 0;
+                       *refValueM = 0;
+
+                       int numConts;
+                       for (numConts = 0; numConts < polygons.size(); numConts++)
+                       {
+                               if (pointInPolygon(polygons[numConts],x,y))
+                               {
+                                               *refValueA = 255;
+                               }
+                       }
+
+                       for (numConts = 0; numConts < manual.size(); numConts++)
+                       {
+                               if (pointInPolygon(manual[numConts],x,y))
+                               {
+                                               *refValueM = 255;
+                               }
+                       }
+               }
+       }
+
+/*     vtkImageLogic* and = vtkImageLogic::New();
+       and->SetInput1(imageM);
+       and->SetInput2(imageA);
+       and->SetOutputTrueValue(255);
+       and->SetOperationToAnd();
+*/
+       int coincidencias = 0;
+       for (x = limInfX; x < (limSupX - 1); x++)
+       {
+               for (y = limInfY; y < (limSupY - 1); y++)
+               {
+                       int compA = (int) imageA->GetScalarComponentAsDouble(x,y,0,0);
+                       int compM = (int) imageM->GetScalarComponentAsDouble(x,y,0,0);
+
+                       int and_ = compA & compM;
+                       if (and_ == 255)
+                       {
+                               coincidencias++;
+                       }
+               }
+       }
+
+       double resp = (double)coincidencias ;
+
+
+       return resp;
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour* marAxisCT::loadMarIsocontour(int size, double *vx, double *vy)
+{
+       marIsocontour* cont = new marIsocontour();
+               
+       for ( int j=0 ; j<size ; j++ )
+       {
+               cont->insertPoint(vx[j], vy[j]);
+       }
+
+       return cont;
+}
+
+// ----------------------------------------------------------------------------
+double marAxisCT::performUnion(int type, int point, std::vector<marIsocontour *> manual, kVolume* vol)
+{
+               if (manual.size() == 0)
+       {
+               return 0;
+       }
+
+       int limInfX,limInfY,limInfZ,limSupX,limSupY,limSupZ;
+       std::vector <marIsocontour* > polygons;
+       vtkImageData* imagedata;
+
+       imagedata = (vtkImageData*) ((getSlice( point , vol ))->castVtk( ));
+       imagedata->GetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       vtkImageData* imageA = vtkImageData::New();
+       imageA->SetDimensions(limSupX,limSupY,0);
+       imageA->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       imageA->SetScalarTypeToUnsignedShort();
+       imageA->AllocateScalars();
+       imageA->Update();
+
+       vtkImageData* imageM = vtkImageData::New();
+       imageM->SetDimensions(limSupX,limSupY,0);
+       imageM->SetExtent(limInfX,limSupX,limInfY,limSupY,limInfZ,limSupZ);
+       imageM->SetScalarTypeToUnsignedShort();
+       imageM->AllocateScalars();
+       imageM->Update();
+
+       int i;
+       for (i = 0; i < quantContours[point]->getSize(); i++)
+       {
+               if (quantContours[point]->getContourType(i) == type)
+               {
+                       polygons.push_back(parsePolyDataToMarIsocontour(quantContours[point]->getContour(i)));
+               }
+               
+       }
+
+       if (polygons.size() == 0)
+       {
+               return 0;
+       }
+
+       int x,y;
+       for ( x = limInfX; x < (limSupX - 1); x++)
+       {
+               for ( y = limInfY; y < (limSupY - 1); y++)
+               {
+                       unsigned short *refValueA = (unsigned short *) imageA->GetScalarPointer(x,y,0);
+                       unsigned short *refValueM = (unsigned short *) imageM->GetScalarPointer(x,y,0);
+                       *refValueA = 0;
+                       *refValueM = 0;
+                       int  numConts; 
+                       for ( numConts = 0; numConts < polygons.size(); numConts++)
+                       {
+                               if (pointInPolygon(polygons[numConts],x,y))
+                               {
+                                               *refValueA = 255;
+                               }
+                       }
+
+                       for (numConts = 0; numConts < manual.size(); numConts++)
+                       {
+                               if (pointInPolygon(manual[numConts],x,y))
+                               {
+                                               *refValueM = 255;
+                               }
+                       }
+               }
+       }
+
+/*     vtkImageLogic* and = vtkImageLogic::New();
+       and->SetInput1(imageM);
+       and->SetInput2(imageA);
+       and->SetOutputTrueValue(255);
+       and->SetOperationToAnd();
+*/
+       int coincidencias = 0;
+       for (x = limInfX; x < (limSupX - 1); x++)
+       {
+               for ( y = limInfY; y < (limSupY - 1); y++)
+               {
+                       int compA = (int) imageA->GetScalarComponentAsDouble(x,y,0,0);
+                       int compM = (int) imageM->GetScalarComponentAsDouble(x,y,0,0);
+
+                       int or_ = compA | compM;
+                       if (or_ == 255)
+                       {
+                               coincidencias++;
+                       }
+               }
+       }
+
+       double resp = (double)coincidencias;
+
+
+       return resp;
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marAxisCT.h b/lib/maracasVisuLib/src/kernel/marAxisCT.h
new file mode 100644 (file)
index 0000000..ece5589
--- /dev/null
@@ -0,0 +1,123 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marAxisCT.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __MAR__KERNEL__AXISCT__HXX__
+#define __MAR__KERNEL__AXISCT__HXX__
+
+
+
+#include <marAxis.h>
+#include <marAxisContours.h>
+#include <marPoint.h>
+#include <marIsocontour.h>
+#include <vector>
+#include <list>
+
+class MAR_KERNEL_EXPORT marAxisCT : public marAxis
+{
+
+public:
+
+               
+       marAxisCT(  );
+       marContour*             getContour( int point , kVolume* vol, int index );              // DATA-MODEL-2D  
+       vtkPoints*              get3Dcontour(   int point , kVolume* vol, int index );          // VISUALISATION-VTK 3D
+       vtkPolyData*    get2Dcontour(   int point , kVolume* vol, int index );          // VISUALISATION-VTK 2D
+       vtkPoints*              get2DDiameterMin(       int point , kVolume* vol, int index );          // VISUALISATION-VTK 3D
+       vtkPoints*              get2DDiameterMax(       int point , kVolume* vol, int index );          // VISUALISATION-VTK 3D
+       int                             getSignal(int point, int index, kVolume* vol);
+       void                    updateLumenPercentage(int point, kVolume* vol);
+       void                    updateCalcPercentage(int point, kVolume* vol);
+
+       void                    replaceContour2D(int point,int size,double *vx,double *vy, int type);
+
+       marContourVO*   searchContour(int type, int point);
+       int                     getNumberOfContours(int point, kVolume* vol);
+       int                     getContourType(int point, int index, kVolume* vol  );
+       void            createEmptyContours();
+       void            eraseContours();
+       void            eraseContoursPartial(int start);
+       
+       void                    histogram(int point, kVolume* vol);
+       void            setCalibration(bool calib);
+       bool            getCalibration();
+       
+       int                     getStartIndex();
+       void            setStartIndex(int start);
+
+       int                     getPointSize();
+       marPoint*       getPoint(int i);
+       void            markUpLumen(int point, kVolume* vol);
+       void            generateFile(int point,kVolume* vol);
+
+       void            cleanContours(int type, int point);
+       double          performXOR(int type, int point, std::vector<marIsocontour *> manual, kVolume* vol);
+       double          performAND(int type, int point, std::vector<marIsocontour *> manual, kVolume* vol);
+       double          performUnion(int type, int point, std::vector<marIsocontour *> manual, kVolume* vol);
+       marIsocontour*  loadMarIsocontour(int size, double *vx, double *vy);
+
+
+private:
+
+       void                    createContours(         int point       , kVolume* vol );
+       void                    create3Dcontours(       int point       , kVolume* vol );
+       void                    create2Dcontours(       int point       , kVolume* vol );
+       void                    create2DDiametersMin(int point  , kVolume* vol );
+       void                    create2DDiametersMax(int point  , kVolume* vol );
+       void                    createSignals (int point, kVolume* vol);
+       void                    generatePoints(int point, kVolume* vol, std::vector<marIsocontour*> *list);
+       int                             getMaximumGrad(std::vector <marPoint *> list, int iniPos, int limit, double threshold);
+       int                             getMinimumGrad(std::vector <marPoint *> list, int iniPos, int limit, double threshold);
+       double                  interpolate(double x, double y, vtkImageData* imagedata);
+       void                    generateVector(int dir,int *coordBase,double originX,double originY,double *x,double *y);
+       bool                    detectNeighbor(marIsocontour* contour,int dir, int type);
+       marIsocontour*  addPointToContour(marIsocontour* cont ,bool inside,int type,marPoint* point);
+       void                    unifyDividedStructure(std::vector<marIsocontour*> *contList);
+       double                  getStatistics(marIsocontour* contour, double x, double y, vtkImageData* imagedata);
+       double                  getCalcStatistics(marIsocontour* contour, double x, double y, vtkImageData* imagedata,int i);
+       int                             round(double num);
+       int                             getMaxIntensity(int point);
+       bool                    pointInPolygon(marIsocontour *c, double x, double y);
+       marIsocontour*  parsePolyDataToMarIsocontour(marContourVO* contourVO);
+
+       marIsocontour*  filterContour(marIsocontour* contExt, marIsocontour* contInt, double radio);
+       
+       double                  obtainContourArea(marIsocontour*contour);
+       void                    adjustWall(int point, kVolume* vol);
+       void                    adjustCalcification(int point, kVolume* vol);
+       void                    adjustContour(int point, kVolume* vol);
+       int                             maxValue(std::vector <double> list);
+       int                             getDiameter(marContourVO* contourVO, double x, double y, int limInfX, int limInfY, int limSupX, int limSupY);
+       
+       int                             searchData(std::vector<double> vec, double value);
+
+       void                    extractLumen(vtkImageData *lumenImage, marIsocontour *lumenContour, int point);
+       double                  avgValue;
+       double                  stdValue;
+       int                             startIndex;
+       double                  maxSignal;
+
+       
+       
+                               //      Contours per slice
+
+       //Eliminados
+       //      marIsocontour*  shrinkContour(marIsocontour *cont, double thresh, vtkImageData* imageData, double radio);
+  
+};
+
+#endif // __MAR__KERNEL__AXISCT__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marAxisContours.cpp b/lib/maracasVisuLib/src/kernel/marAxisContours.cpp
new file mode 100644 (file)
index 0000000..df18d76
--- /dev/null
@@ -0,0 +1,87 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marAxisContours.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "marAxisContours.h"
+
+
+
+// ----------------------------------------------------------------------------
+void marAxisContours::addContour(marContourVO* cont) {
+
+       if (cont->getType() == LUMEN && contours.size() > 1)
+       {
+               contours[LUMEN] = cont;
+       } 
+       else if (cont->getType() == WALL && contours.size() > 2)
+       {
+               contours[WALL] = cont;
+       }
+       else
+       {
+               contours.push_back(cont);
+       }
+       
+}
+
+// ----------------------------------------------------------------------------
+void marAxisContours::replaceContour(marContourVO* cont, int index) {
+       if (contours.size() > index + 1)
+       {
+               contours[index] = cont;
+       }
+       else
+       {
+               contours.push_back(cont);
+       }
+}
+
+// ----------------------------------------------------------------------------
+marContourVO* marAxisContours::getContour(int i ) {
+
+       return contours[i];
+}
+
+// ----------------------------------------------------------------------------
+int marAxisContours::getTotalPlaques() {
+       
+       int tam = 0;
+       for (int i = 0; i < contours.size(); i++)
+       {
+               if (contours[i]->getType() == CALCIFICATION)
+               {
+                       tam++;
+               }
+       }
+
+       return tam;
+}
+
+// ----------------------------------------------------------------------------
+int marAxisContours::getContourType(int i) {
+       
+       return contours[i]->getType();
+}
+
+int marAxisContours::getSize() {
+       return contours.size();
+}
+
+// ----------------------------------------------------------------------------
+bool marAxisContours::isReplaced(int i)
+{
+       return contours[i]->isReplaced();
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marAxisContours.h b/lib/maracasVisuLib/src/kernel/marAxisContours.h
new file mode 100644 (file)
index 0000000..2e0139d
--- /dev/null
@@ -0,0 +1,51 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marAxisContours.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__AXIS_CONTOURS__HXX__
+#define __MAR__KERNEL__AXIS_CONTOURS__HXX__
+
+#include "marContourVO.h"
+#include <vector>
+
+class MAR_KERNEL_EXPORT marAxisContours  
+{
+public:
+
+       enum ContourTypes
+       {
+               LUMEN = 0,         /*!< Lumen Type partial. */  
+               WALL,              /*!< Wall Type. */ 
+               CALCIFICATION,     /*!< Calcification Type. */  
+               HYPODENSE,          /*!< Hypodense Type. */
+               ELUMEN                          /*!< Extracted Lumen */
+       };
+
+       void addContour(marContourVO* cont);
+       void replaceContour(marContourVO* cont, int index);
+       marContourVO* getContour(int i );
+
+       int getTotalPlaques();
+       int getContourType(int i);
+       int getSize();
+       bool isReplaced(int i);
+
+   private:
+          std::vector <marContourVO *> contours;
+
+};
+
+#endif //__MAR__KERNEL__AXIS_CONTOURS__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marContour.cpp b/lib/maracasVisuLib/src/kernel/marContour.cpp
new file mode 100644 (file)
index 0000000..4f919c9
--- /dev/null
@@ -0,0 +1,503 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marContour.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:54 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+
+
+extern "C" {
+#include"idcnt.h"
+};
+
+//#include <gsl/gsl_blas.h> //PS
+#include "marVector.h"
+#include <math.h> //PS
+#include "marMathConst.h" //PS
+
+#include "marContour.h"
+#include <vtkPolyLine.h>
+#include <vtkKochanekSpline.h> 
+
+#include "load_snake.h"
+
+// -------------------------------------------------------------------------
+marContour::marContour( double s, marParameters* p )
+: marObject( p ),
+_s( s )
+{
+}
+
+// -------------------------------------------------------------------------
+
+void marContour::addContourPoint(  double x, double y  )
+{
+    double* np = new double[ 2 ];
+       
+//    memcpy( np, p, 2 * sizeof( double ) );
+       np[0]=x;
+       np[1]=y;
+    _points.push_back( np );
+}
+
+// -------------------------------------------------------------------------
+void marContour::resample( )
+{ // TODO
+}
+
+// -------------------------------------------------------------------------
+bool marContour::isCalculated( )
+{
+    return( _points.size( ) > 0 );
+}
+
+// -------------------------------------------------------------------------
+int marContour::getNumberOfPoints( )
+{
+    return( _points.size( ) );
+}
+
+// -------------------------------------------------------------------------
+void marContour::getPoint( double* p, int i )
+{
+    memcpy( p, _points[ i ], 2 * sizeof( double ) );
+}
+// -------------------------------------------------------------------------
+void marContour::calculateVariables()
+{
+
+        _area                                  =       -1;
+        _perimeter                             =       -1;
+        _diameterFromArea              =       -1;
+        _diameterFromPerimeter =       -1;
+        _minimumDiameter               =       -1;
+        _maximumDiameter               =       -1;
+        _averageDiameter               =       -1;
+
+
+       calculateArea();
+       calculatePerimeter();
+       calculateDiameterFromArea();    
+       calculateDiameterFromPerimeter();
+       calculateMinimumMaximumDiameter();
+       calculateAverageDiameter();     
+
+}
+/* METHOD DESCRIPTION ****************************************************
+ *                                                                       *
+ * marContour::do_spline (method)                                        *
+ *                                                                       *
+ * DESCRIPTION : Calculates a spline function in order to add points to  *
+ *               actual points.                                          *
+ *                                                                       *
+ * SYNTAX : ctn.do_spline( )                                             *
+ *                                                                       *
+ ******************************************************* END DESCRIPTION */
+void marContour::do_spline( ) {
+    unsigned int i, to;
+    vtkKochanekSpline* CntSplineX = vtkKochanekSpline::New( );
+    vtkKochanekSpline* CntSplineY = vtkKochanekSpline::New( );
+
+//EED  temPoint< float, 2 >* tmp;
+       double *tmp;
+
+//EED    float t;
+    unsigned int nps = 1000; // TODO: 1000?????
+    CntSplineX->SetDefaultTension( 0 ); CntSplineX->SetDefaultBias( 0 ); CntSplineX->SetDefaultContinuity( 0 );
+    CntSplineY->SetDefaultTension( 0 ); CntSplineY->SetDefaultBias( 0 ); CntSplineY->SetDefaultContinuity( 0 );
+    for( i = 0; i < _points.size( ); i++ ) {
+        CntSplineX->AddPoint( i, ( _points[ i ] )[ 0 ] );
+        CntSplineY->AddPoint( i, ( _points[ i ] )[ 1 ] );
+    } //  rof
+
+    if( i > 0 ) {
+        CntSplineX->AddPoint( i, ( _points[ 0 ] )[ 0 ] );
+        CntSplineY->AddPoint( i, ( _points[ 0 ] )[ 1 ] );
+    } // fi
+    to = _points.size( );
+    while( _no_spline_points.size( ) > 0 ) {
+        delete _no_spline_points[ _no_spline_points.size( ) - 1 ];
+        _no_spline_points.pop_back( );
+    } // fwhile
+    for( i = 0; i < _points.size( ); i++ ) {
+//EED         tmp = new temPoint< float, 2 >;
+               tmp = (double*)malloc ( 2*sizeof(double) );
+         ( tmp )[ 0 ] = ( _points[ i ] )[ 0 ];
+         ( tmp )[ 1 ] = ( _points[ i ] )[ 1 ];
+        _no_spline_points.push_back( tmp );
+    } // rof
+
+//EED    this->clean( );
+//EED    for( i = 0; i < nps; i++ ) {
+//EED        tmp = new temPoint< float, 2 >;
+//EED        t = ( float ) ( to - 1 ) / ( float ) ( nps - 1 ) * ( float ) i;
+//EED        ( *tmp )[ 0 ] = CntSplineX->Evaluate( t );
+//EED        ( *tmp )[ 1 ] = CntSplineY->Evaluate( t );
+//EED        _points.push_back( tmp );
+//EED    } // rof
+//EED    _updated_measures = false;
+
+       CntSplineX->Delete();
+       CntSplineY->Delete();
+
+
+}
+
+// -------------------------------------------------------------------------
+void marContour::calculateArea( )
+{
+    double area;
+    int i, j;
+       
+    // This uses Green's theorem:
+    // A = 1/2 * sum( xiyi+1 - xi+1yi); pO == pN
+    // A < 0 -> A = |A| (a negative value could raise because points are
+    // given in clockwise order).
+    for( i = 0, area = 0.0; i < _points.size( ); i++ ) {
+               
+        j = ( i + 1 ) % _points.size( );
+               
+        //  Area
+        area +=
+            ( _points[ i ][ 0 ] * _points[ j ][ 1 ] ) -
+            ( _points[ j ][ 0 ] * _points[ i ][ 1 ] );
+               
+
+    } // rof
+    area /= 2.0;
+    area = fabs( area );
+
+    this->_area = area;
+}
+
+
+
+
+
+
+
+
+// -------------------------------------------------------------------------
+void marContour::calculatePerimeter( )
+{
+       // PS ->     //gsl_vector* pO = gsl_vector_alloc( 2 ); //PS
+       marVector* pO = new marVector(2);
+       // PS ->     //gsl_vector* pF = gsl_vector_alloc( 2 ); //PS
+       marVector* pF = new marVector(2);
+    double L;
+    unsigned int j;
+       
+       int nbPoints=_points.size( );
+
+    for( j = 0, L = 0.0; j < nbPoints; j++ ) {
+               
+               // PS ->        //memcpy( pO->data, _points[ j ], 2 * sizeof( double ) ); //PS
+               (*pO)=_points[j];
+               // PS ->        //memcpy( pF->data, _points[ j + 1 ], 2 * sizeof( double ) ); //PS
+               (*pF)=_points[(j+1)%nbPoints];
+               
+               // PS ->        // gsl_vector_sub( pF, pO );//PS
+               (*pF)=(*pF)-(*pO);
+               // PS ->        //L += gsl_blas_dnrm2( pF );//PS
+               L+=pF->norm2();
+               
+    } // rof
+       /*
+       // PS ->     //memcpy( pO->data, _points[ j - 1 ], 2 * sizeof( double ) ); //PS
+     (*pO)=_points[j-1];
+       // PS ->        //memcpy( pF->data, _points[ 0 ], 2 * sizeof( double ) ); //PS
+       (*pF)=_points[0];
+       
+       
+       // PS ->        // gsl_vector_sub( pF, pO );//PS
+       (*pF)=(*pF)-(*pO);
+       // PS ->        //L += gsl_blas_dnrm2( pF );//PS
+       L+=pF->norm2();
+       
+       // PS ->     //gsl_vector_free( pO );//PS
+       // PS ->     //gsl_vector_free( pF );//PS
+       */
+       delete pO;
+       delete pF;
+
+    _perimeter=L ;
+}
+
+// -------------------------------------------------------------------------
+/* METHOD DESCRIPTION ****************************************************
+ *                                                                       *
+ * marContour::recalcule_measures (method)                               *
+ *                                                                       *
+ * DESCRIPTION : Does one step to calcule measures. Don't call this      *
+ *               outside this file.                                      *
+ *                                                                       *
+ * SYNTAX : this->recalcule_measures( )                                  *
+ *                                                                       *
+ ******************************************************* END DESCRIPTION */
+void marContour::calculateMinimumMaximumDiameter( )
+{
+
+       double _minimum_diameter;
+       double _maximum_diameter;
+       double _p1_min[2];
+       double _p2_min[2];
+       double _p1_max[2];
+       double _p2_max[2];
+//-----
+
+    unsigned int i, j;
+    float  tmp1[2], tmp2[2];
+    vtkPoints* points;
+    vtkPolyLine* poly;
+    vtkUnstructuredGrid* grid;
+    PCONTOUR_FLOAT ctr, ctr2;
+
+    double mom_min;
+    double mom_max;
+
+//EED    if( !_updated_measures ) {
+        //  Preparation
+//EED        _area = 0.0;
+//EED        _perimeter = 0.0;
+        _minimum_diameter = 0.0;
+        _maximum_diameter = 0.0;
+        _p1_min[ 0 ] = _p1_min[ 1 ] = 0.0;
+        _p2_min[ 0 ] = _p2_min[ 1 ] = 0.0;
+        _p1_max[ 0 ] = _p1_max[ 1 ] = 0.0;
+        _p2_max[ 0 ] = _p2_max[ 1 ] = 0.0;
+//EED        //  This uses Green's theorem:
+//EED        //  A = 1/2 * sum( xiyi+1 - xi+1yi); pO == pN
+//EED        //  A < 0 -> A = |A| (a negative value is because points are given in
+//EED        //  clockwise order).
+//EED        //
+//EED        //  P = sum( |Pj_Pj+1| ); pO == pN
+//EED        //
+//EED        //  Prepares data for maximum & minimum process.
+//EED        //  The scale factor must be applied.
+        points = vtkPoints::New( );
+        poly   = vtkPolyLine::New( );
+        grid   = vtkUnstructuredGrid::New( );
+
+        poly->GetPointIds( )->SetNumberOfIds( _points.size( ) );
+        ctr2 = ( PCONTOUR_FLOAT ) IdCntAlloc( _points.size( ), CNT_FLOAT );
+
+        for( i = 0, j = 1; i < _points.size( ); i++, j = ( j + 1 ) % _points.size( ) ) {
+            tmp1[0] = _points[ i ][0];
+            tmp1[1] = _points[ i ][1];
+//EED            tmp1 = *_points[ i ];
+            tmp2[0] = _points[ j ][0];
+            tmp2[1] = _points[ j ][1];
+//EED            tmp2 = *_points[ j ];
+            //  VTK stuff for maximum & minimum
+            poly->GetPointIds( )->SetId( i, i );
+            points->InsertNextPoint( tmp1[ 0 ], tmp1[ 1 ], 1 );
+            //  Point scale factor
+//EED           tmp1 *= ( _parameters->get_dim_ima( ) / ( float ) _parameters->get_size_ima( ) );
+//EED           tmp2 *= ( _parameters->get_dim_ima( ) / ( float ) _parameters->get_size_ima( ) );
+            //  Area & perimeter
+//EED            IdCntAddPointG( ctr2, tmp1[ 0 ], tmp1[ 1 ] );
+//EED            _area += ( ( tmp1[ 0 ] * tmp2[ 1 ] ) - ( tmp2[ 0 ] * tmp1[ 1 ] ) );
+//EED            _perimeter += tmp1 * tmp2;
+        } // rof
+//EED        _area *= 0.5;
+//EED        _area = ( float ) fabs( ( double ) _area );
+        //  TODO : Just testing: LibIDO is better than green theorem's?
+        //  which is the difference?
+//EED        _area = ( float ) IdCntCalculAireG( ( PCONTOUR ) ctr2 );
+        //  Libido contour
+        ctr = ( PCONTOUR_FLOAT ) IdCntAlloc( _no_spline_points.size( ), CNT_FLOAT );
+        for( i = 0; i < _no_spline_points.size( ); i++ ) {
+            IdCntAddPointG(
+                ctr,
+                ( _no_spline_points[ i ] )[ 0 ],
+                ( _no_spline_points[ i ] )[ 1 ]
+            );
+        } // rof
+        //  Diameters...
+
+        if( _points.size( ) > 0 ) {
+            grid->Allocate( 1, 1 );
+            grid->InsertNextCell( poly->GetCellType( ), poly->GetPointIds( ) );
+            grid->SetPoints( points );
+            axe_max_min(
+                ctr,
+                _no_spline_points.size( ),
+                ( int ) grid->GetCell( 0 ),
+                &_minimum_diameter, &_maximum_diameter,
+                &( _p1_min[ 0 ] ), &( _p1_min[ 1 ] ),
+                &( _p2_min[ 0 ] ), &( _p2_min[ 1 ] ),
+                &( _p1_max[ 0 ] ), &( _p1_max[ 1 ] ),
+                &( _p2_max[ 0 ] ), &( _p2_max[ 1 ] ),
+                &mom_min, &mom_max
+            );
+                       _min[0]=_p1_min[ 0 ]; 
+                       _min[1]=_p1_min[ 1 ]; 
+                       _min[2]=_p2_min[ 0 ]; 
+                       _min[3]=_p2_min[ 1 ]; 
+                       _max[0]=_p1_max[ 0 ]; 
+                       _max[1]=_p1_max[ 1 ]; 
+                       _max[2]=_p2_max[ 0 ]; 
+                       _max[3]=_p2_max[ 1 ]; 
+
+//EED
+//                     float param_dim  =(float) _parameters->get_dim_ima( );
+//                     float param_size =(float) _parameters->get_size_ima( );
+//                     float relation=param_dim / param_size
+//            _minimum_diameter *= relation;
+//            _maximum_diameter *= relation;
+
+        } // fi
+//EED     _updated_measures = true;
+//EED   } // fi
+//}
+//-----
+       _minimumDiameter = _minimum_diameter;
+       _maximumDiameter = _maximum_diameter;
+
+       points->Delete();
+       poly->Delete();
+       grid->Delete();
+       
+}
+
+
+// -------------------------------------------------------------------------
+void marContour::getMaximumLine( double* pO, double* pF )
+{
+    memcpy( pO, _max, 2 * sizeof( double ) );
+    memcpy( pF, _max + 2, 2 * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void marContour::getMinimumLine( double* pO, double* pF )
+{
+    memcpy( pO, _min, 2 * sizeof( double ) );
+    memcpy( pF, _min + 2, 2 * sizeof( double ) );
+}
+
+// -------------------------------------------------------------------------
+void marContour::reset( )
+{
+    int i;
+       
+    for( i = 0; i < _points.size( ); i++ )
+               delete _points[ i ];
+    _points.clear( );
+
+    for( i = 0; i < _no_spline_points.size( ); i++ )
+               delete _no_spline_points[ i ];
+    _no_spline_points.clear( );
+
+    _min[ 0 ] = _min[ 1 ] = _min[ 2 ] = _min[ 3 ] = 0.0;
+    _max[ 0 ] = _max[ 1 ] = _max[ 2 ] = _max[ 3 ] = 0.0;
+}
+
+// -------------------------------------------------------------------------
+void marContour::copyFrom( const marObject& from )
+{
+    double* tmp;
+    int i;
+    marContour* f = &( ( marContour& )from );
+       
+    reset( );
+    memcpy( _min, f->_min, 4 * sizeof( double ) );
+    memcpy( _max, f->_max, 4 * sizeof( double ) );
+    for( i = 0; i < f->_points.size( ); i++ ) {
+               
+               tmp = new double[ 3 ];
+               memcpy( tmp, f->_points[ i ], 3 * sizeof( double ) );
+               _points.push_back( tmp );
+               
+    } // rof
+}
+
+// -------------------------------------------------------------------------
+bool marContour::save( std::ofstream& os )
+{
+    int i;
+       
+    i = _points.size( );
+    os.write( ( const char* )&i, sizeof( int ) );
+    for( i = 0; i < _points.size( ); i++ )
+               os.write( ( const char* )_points[ i ], 3 * sizeof( double ) );
+       
+    return( true );
+}
+
+// -------------------------------------------------------------------------
+bool marContour::load( std::ifstream& is )
+{
+    int i, size;
+    double* tmp;
+       
+    reset( );
+    is.read( ( char* )&size, sizeof( int ) );
+    for( i = 0; i < size; i++ ) {
+               
+               tmp = new double[ 3 ];
+               is.read( ( char* )tmp, 3 * sizeof( double ) );
+               _points.push_back( tmp );
+               
+    } // rof
+       
+    return( true );
+}
+
+
+// ----------------------------------------------------------------------------
+vtkUnstructuredGrid* marContour::Draw( )
+{
+       int taille;
+       double p[2];
+       
+       vtkPoints* PointsContour;
+       vtkPolyLine* aPolyLine;
+       int i;
+       
+       taille = (int) (this->getNumberOfPoints( ) / 2);
+       
+       PointsContour = vtkPoints::New( );
+       
+       aPolyLine = vtkPolyLine::New( );
+       ( aPolyLine->GetPointIds( ) )->SetNumberOfIds( taille );
+       for ( i = 0;  i < taille; i++) {
+               ( aPolyLine->GetPointIds( ) )->SetId( i , i);
+               getPoint((double *) p, i*2);
+               PointsContour->InsertNextPoint( p[ 0 ], p[ 1 ], 0 );
+       }
+       
+       _allData = vtkUnstructuredGrid::New( );
+       _allData->Allocate( 1 , 1 );
+       _allData->InsertNextCell( aPolyLine->GetCellType( ) , 
+               aPolyLine->GetPointIds( ) );
+       _allData->SetPoints( PointsContour );
+       
+       PointsContour->Delete( );
+       aPolyLine->Delete( );
+       return ( _allData );
+}
+
+// ----------------------------------------------------------------------------
+void marContour::Delete( )
+{
+       if(_allData) {
+               _allData->Delete();
+               _allData = NULL;
+       }
+       
+       reset();
+}
+
+
+// eof - contour.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marContour.h b/lib/maracasVisuLib/src/kernel/marContour.h
new file mode 100644 (file)
index 0000000..093a6b0
--- /dev/null
@@ -0,0 +1,130 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marContour.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__CONTOUR__HXX__
+#define __MAR__KERNEL__CONTOUR__HXX__
+
+
+#include "marObject.h"
+
+//#include <kgfo/volume.hxx>
+#include "volume.hxx"
+#include "mathdefs.h"
+
+#include <vtkUnstructuredGrid.h>
+#include <vector>
+
+
+
+/** /def marObject
+ *  \brief Contour object.
+ */
+class MAR_KERNEL_EXPORT marContour : public marObject
+{
+    public:
+
+    /** Default constructor.
+     */
+    marContour( double s, marParameters* p = NULL );
+
+    /** Default destructor.
+     */
+    ~marContour( ) { reset( ); };
+
+    double getS( ) { return( _s ); };
+
+    void setS( double s ) { _s = s; };
+
+    /** Adds a contour point.
+     */
+    void addContourPoint( double x, double y );
+
+    /** Resamples current contour, according to actual parameters,
+     *  to have more or less points.
+     */
+    void resample( );
+
+    /** Returns if the contour has any points.
+     */
+    bool isCalculated( );
+
+    /** General analyzers.
+     */
+    int getNumberOfPoints( );
+    void getPoint( double* p, int i );
+
+    /** Quantification analyzers.
+     */
+       void calculateVariables();
+       void do_spline( );
+    double getArea()                                   {       return _area;                                   }
+    double getPerimeter()                              {       return _perimeter;                              }
+    double getDiameterFromArea()               {       return _diameterFromArea;               }
+    double getDiameterFromPerimeter()  {       return _diameterFromPerimeter;  }
+    double getMinimumDiameter()                        {       return _minimumDiameter;                }
+    double getMaximumDiameter()                        {       return _maximumDiameter;                }
+    double getAverageDiameter()                        {       return _averageDiameter;                }
+
+    void getMaximumLine( double* pO, double* pF );
+    void getMinimumLine( double* pO, double* pF );
+
+
+    /** General methods.
+     */
+    void reset( );
+    void copyFrom( const marObject& from );
+    vtkUnstructuredGrid* Draw( );
+    void Delete( );
+
+    /** Persistence methods.
+     */
+    bool save( std::ofstream& os );
+    bool load( std::ifstream& is );
+
+    private:
+
+
+       void calculateArea();
+       void calculatePerimeter();
+       void calculateDiameterFromArea()                { _diameterFromArea                     = sqrt( 4.0 * getArea( ) / GTM_PI ) ;                           }
+       void calculateDiameterFromPerimeter()   { _diameterFromPerimeter        = getPerimeter( )       / GTM_PI ;                                              }       
+       void calculateMinimumMaximumDiameter(); 
+       void calculateAverageDiameter()         { _averageDiameter = ( getMaximumDiameter( ) + getMinimumDiameter( ) ) * 0.5 ;  }
+               
+       std::vector< double* > _points;
+
+// EED borrame
+//    std::vector< temPoint< float,2 >* > _no_spline_points;   //  Points that define contour without spline (persistence)
+    std::vector< double* > _no_spline_points;   //  Points that define contour without spline (persistence)
+
+    double _s; // paramètre curviligne (entre 0 et 1)
+    double _min[ 4 ];
+    double _max[ 4 ];
+    vtkUnstructuredGrid* _allData;
+
+       double _area;
+       double _perimeter;
+       double _diameterFromArea;
+       double _diameterFromPerimeter;
+       double _minimumDiameter;
+       double _maximumDiameter;
+       double _averageDiameter;
+
+
+
+};
+
+#endif // __MAR__KERNEL__CONTOUR__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marContourVO.cpp b/lib/maracasVisuLib/src/kernel/marContourVO.cpp
new file mode 100644 (file)
index 0000000..23765e5
--- /dev/null
@@ -0,0 +1,183 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marContourVO.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:54 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "marContourVO.h"
+
+// ----------------------------------------------------------------------------
+marContour* marContourVO::getContour( ) {
+       return _contours;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setContour(marContour* cont) {
+       _contours = cont;
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marContourVO::get3DContour( ) {
+       return _3Dcontour;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::set3DContour(vtkPoints* cont) {
+       _3Dcontour = cont;
+}
+
+// ----------------------------------------------------------------------------
+vtkPolyData* marContourVO::get2DContour( ) {
+       return _2Dcontours;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::set2DContour(vtkPolyData* cont) {
+       _2Dcontours = cont;
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marContourVO::get2DDiameterMin( ) {
+       return _2DDiameterMin;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::set2DDiameterMin(vtkPoints* diam) {
+       _2DDiameterMin = diam;
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marContourVO::get2DDiameterMax( ) {
+       return _2DDiameterMax;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::set2DDiameterMax(vtkPoints* diam) {
+       _2DDiameterMax = diam;
+}
+
+// ----------------------------------------------------------------------------
+double marContourVO::getSignal( ) {
+       return _signal;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setSignal(double signal) {
+       _signal = signal;
+
+}                              
+
+// ----------------------------------------------------------------------------
+int marContourVO::getType( ) {
+       return _contType;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setType(int cont) {
+       _contType = cont;
+}
+
+// ----------------------------------------------------------------------------
+vtkContourFilter* marContourVO::getIsocontour()
+{
+       return _isocontour;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setIsocontour(vtkContourFilter* iso)
+{
+       _isocontour = iso;
+}
+
+// ----------------------------------------------------------------------------
+vtkCleanPolyData* marContourVO::getIsocontourCpd()
+{
+       return _isocontour_cpd;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setIsocontourCpd(vtkCleanPolyData* isocpd)
+{
+       _isocontour_cpd = isocpd;
+}
+
+// ----------------------------------------------------------------------------
+vtkCleanPolyData* marContourVO::getIsocontourCpd2()
+{
+       return _isocontour_cpd2;
+}
+
+
+// ----------------------------------------------------------------------------
+void marContourVO::setIsocontourCpd2(vtkCleanPolyData* isocpd)
+{
+       _isocontour_cpd2 = isocpd;
+}
+
+// ----------------------------------------------------------------------------
+vtkPolyDataConnectivityFilter* marContourVO::getIsocontourDcf()
+{
+       return _isocontour_dcf;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setIsocontourDcf(vtkPolyDataConnectivityFilter*     isodcf)
+{
+       _isocontour_dcf = isodcf;
+}
+
+// ----------------------------------------------------------------------------
+vtkStripper* marContourVO::getIsocontourStripped()
+{
+       return _isocontour_stripped;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setIsocontourStripped(vtkStripper* isoStripped)
+{
+       _isocontour_stripped = isoStripped;
+}
+
+// ----------------------------------------------------------------------------
+marContourVO::~marContourVO()
+{
+       if (_contours != NULL) { delete _contours; }
+       if (_3Dcontour != NULL) { _3Dcontour->Delete(); }
+       if (_2Dcontours != NULL) { _2Dcontours->Delete(); }
+       if (_2DDiameterMin != NULL) { _2DDiameterMin->Delete(); }
+       if (_2DDiameterMax != NULL) { _2DDiameterMax->Delete(); }
+       _signal = 0.0;
+       _contType = -1;
+       if (_isocontour != NULL) { _isocontour->Delete(); }
+       if (_isocontour_cpd != NULL) { _isocontour_cpd->Delete(); }
+       if (_isocontour_dcf != NULL) { _isocontour_dcf->Delete(); }
+       if (_isocontour_cpd2 != NULL) { _isocontour_cpd2->Delete(); }
+}
+
+// ----------------------------------------------------------------------------
+bool marContourVO::isReplaced()
+{
+       return _replaced;
+}
+
+// ----------------------------------------------------------------------------
+void marContourVO::setReplaced(bool rep)
+{
+       _replaced = rep;
+}
+
+marContourVO::marContourVO()
+{
+       _replaced = false;
+}
diff --git a/lib/maracasVisuLib/src/kernel/marContourVO.h b/lib/maracasVisuLib/src/kernel/marContourVO.h
new file mode 100644 (file)
index 0000000..4cb5e7c
--- /dev/null
@@ -0,0 +1,100 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marContourVO.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__CONTOURVO__HXX__
+#define __MAR__KERNEL__CONTOURVO__HXX__
+
+#include "marContour.h"
+#include <vtkPolyData.h>
+#include <vtkProbeFilter.h>
+#include <vtkContourFilter.h>
+#include <vtkCleanPolyData.h>
+#include <vtkPolyDataConnectivityFilter.h>
+#include <vtkStripper.h>
+
+class vtkPoints;
+class vtkCellArray;
+
+
+class MAR_KERNEL_EXPORT  marContourVO 
+{
+
+   public:
+
+          
+          marContour* getContour( );
+          void setContour(marContour* cont);
+
+          vtkPoints* get3DContour( );
+          void set3DContour(vtkPoints* cont);
+
+          vtkPolyData* get2DContour( );
+          void set2DContour(vtkPolyData* cont);
+
+          vtkPoints* get2DDiameterMin( );
+          void set2DDiameterMin(vtkPoints* diam);
+
+          vtkPoints* get2DDiameterMax( );
+          void set2DDiameterMax(vtkPoints* diam);
+
+          double getSignal( );
+          void setSignal(double cont);
+
+          int getType( );
+          void setType(int cont);
+
+          vtkContourFilter* getIsocontour();
+          void setIsocontour(vtkContourFilter* iso);
+
+          vtkCleanPolyData* getIsocontourCpd();
+          void setIsocontourCpd(vtkCleanPolyData* isocpd);
+
+          vtkCleanPolyData* getIsocontourCpd2();
+          void setIsocontourCpd2(vtkCleanPolyData* isocpd);
+
+          vtkPolyDataConnectivityFilter* getIsocontourDcf();
+          void setIsocontourDcf(vtkPolyDataConnectivityFilter* isodcf);
+
+          vtkStripper* getIsocontourStripped();
+          void setIsocontourStripped(vtkStripper* isoStripped);
+
+          bool isReplaced();
+          void setReplaced(bool rep);
+
+          ~marContourVO();
+               marContourVO();
+
+   private:
+
+           
+       marContour*             _contours;                                      //  DATA-MODEL-2D                       Axis Contours
+       vtkPoints*                      _3Dcontour;                                     //  VISUALISATION_VTK 3D        Axis perpendicular Contour
+       vtkPolyData*            _2Dcontours;                            //  VISUALISATION_VTK 2D        Axis perpendicular Contour
+       vtkPoints*                      _2DDiameterMin;                         //  VISUALISATION_VTK 2D        Line diameter Minimum
+       vtkPoints*                      _2DDiameterMax;                         //  VISUALISATION_VTK 2D        Line diameter Maximum
+       double                          _signal;                                        //  Axis intensity signal
+       int                                     _contType;                                      //  ContourType
+       vtkContourFilter*       _isocontour;
+       vtkCleanPolyData*       _isocontour_cpd;
+       vtkPolyDataConnectivityFilter*  _isocontour_dcf;
+       vtkCleanPolyData*       _isocontour_cpd2;
+       vtkStripper*            _isocontour_stripped;
+       bool                            _replaced;
+
+}; 
+#endif // __MAR__KERNEL__CONTOUR_VO__HXX__
+
diff --git a/lib/maracasVisuLib/src/kernel/marDicom.cpp b/lib/maracasVisuLib/src/kernel/marDicom.cpp
new file mode 100644 (file)
index 0000000..f89d4c0
--- /dev/null
@@ -0,0 +1,436 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marDicom.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:54 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+extern "C"
+{
+#include <idacr.h>
+#include <idacr-restricted.h>
+}
+#include "marDicom.h"
+#include <wx/file.h>
+
+static char* DicomTagsNames[] = {
+    "ID_File_Name",
+    "ID_SOP_Class_UID",
+    "ID_SOP_Instance_UID",
+    "ID_Study_Date",
+    "ID_Series_Date",
+    "ID_Acquisition_Date",
+    "ID_Image_Date",
+    "ID_Study_Time",
+    "ID_Series_Time",
+    "ID_Acquisition_Time",
+    "ID_Image_Time",
+    "ID_Modality",
+    "ID_Manufacturer",
+    "ID_Institution_Name",
+    "ID_Study_Description",
+    "ID_Series_Description",
+    "ID_Admitting_Diagnoses_Description",
+    "ID_Patient_Name",
+    "ID_Patient_ID",
+    "ID_Body_Part_Examined",
+    "ID_Scanning_Sequence",
+    "ID_Sequence_Variant",
+    "ID_Scan_Options",
+    "ID_MR_Acquisition_Type",
+    "ID_Sequence_Name",
+    "ID_Slice_Thickness",
+    "ID_Repetition_Time",
+    "ID_Echo_Time",
+    "ID_Inversion_Time",
+    "ID_Number_of_Averages",
+    "ID_Imaging_Frequency",
+    "ID_Imaged_Nucleus",
+    "ID_Echo_Number",
+    "ID_Magnetic_Field_Strength",
+    "ID_Spacing_Between_Slices",
+    "ID_Echo_Train_Length",
+    "ID_Percent_Sampling",
+    "ID_Percent_Phase_Field_of_View",
+    "ID_Receiving_Coil",
+    "ID_Patient_Position",
+    "ID_Study_Instance_UID",
+    "ID_Series_Instance_UID",
+    "ID_Study_ID",
+    "ID_Series_Number",
+    "ID_Acquisition_Number",
+    "ID_Image_Number",
+    "ID_Patient_Orientation",
+    "ID_Image_Position",
+    "ID_Image_Position_Patient",
+    "ID_Image_Orientation",
+    "ID_Image_Orientation_Patient",
+    "ID_Location",
+    "ID_Frame_of_Reference_UID",
+    "ID_Slice_Location",
+    "ID_Image_Comments",
+    "ID_Pixel_Spacing",
+    "ID_Window_Center",
+    "ID_Window_Width",
+};
+
+// -------------------------------------------------------------------------
+marDicom::marDicom( marParameters* p )
+    : marObject( p ),
+      _actualStudy( "" ), _actualSerie( "" ),
+      _volume( NULL )
+{
+}
+
+// ----------------------------------------------------------------------------
+wxArrayString marDicom_SelectDirs( wxString& root )
+{
+    wxArrayString ret;
+    wxString it, tmp;
+
+    tmp = root.c_str( );
+    tmp += "/*";
+    it = wxFindFirstFile( tmp, wxDIR );
+    while( !it.IsEmpty( ) )
+    {
+      if( wxFileNameFromPath( it ).Cmp( "." ) != 0 && wxFileNameFromPath( it ).Cmp( ".." ) != 0 )
+        ret.Add( wxFileNameFromPath( it ) );
+
+      it = wxFindNextFile( );
+    } // fwhile
+
+    ret.Sort( );
+    return( ret );
+}
+
+// -------------------------------------------------------------------------
+wxArrayString marDicom::getStudies( )
+{
+    return( marDicom_SelectDirs( getParameters( )->getStringParam( marParameters::e_dicom_images_directory ) ) );
+}
+
+// -------------------------------------------------------------------------
+wxArrayString marDicom::getSeries( )
+{
+    wxString tmp;
+    
+    tmp = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+    tmp += '/';
+    tmp += _actualStudy;
+    return( marDicom_SelectDirs( tmp ) );
+}
+
+// -------------------------------------------------------------------------
+wxArrayString marDicom::getStudyData( )
+{
+  int i;
+  char** res;
+  wxArrayString ret;
+  wxString cad;
+
+  if( _actualStudy != "" ) {
+    cad = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+    cad += '/';
+    cad += _actualStudy;
+    
+    // WARNING : Use of LibIDO to get the information.
+    res = IdStrGetExamInfo( ( char* )cad.c_str( ), "*" );
+    for( i = 0; i < ID_dicom_tags_count; i++ )
+    {
+      ret.Add( copystring( res[ i ] ) );
+      delete res[ i ];
+    } // rof
+
+    ret[ID_File_Name] = _actualStudy;
+    delete res;
+
+  } // fi
+  return( ret );
+}
+
+// -------------------------------------------------------------------------
+wxArrayString marDicom::getSerieData( )
+{
+    int i;
+    char** res;
+    wxArrayString ret;
+    wxString cad;
+
+    if( _actualSerie != "" )
+    {
+      // WARNING : Use of LibIDO to get the information.
+      cad = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+      cad += '/';
+      cad += _actualStudy;
+      cad += '/';
+      cad += _actualSerie;
+
+      res = IdStrGetSerieInfo( ( char* )cad.c_str( ), "*" );
+      for( i = 0; i < ID_dicom_tags_count; i++ )
+      {
+        ret.Add( copystring( res[ i ] ) );
+        delete res[ i ];  
+      } // rof
+
+      ret[ ID_File_Name ] = _actualSerie;
+      delete res;
+
+    } // fi
+    return( ret );
+}
+
+// -------------------------------------------------------------------------
+wxArrayString marDicom_SelectFiles( wxString& root )
+{
+    wxString it, tmp;
+    wxArrayString ret;
+
+    tmp = root.c_str( );
+    tmp += "/*";
+    it = wxFindFirstFile( tmp, wxFILE );
+    while( !it.IsEmpty( ) )
+    {
+      if( IdAcrIsAcrReadable( ( char* )it.c_str( ) ) ) // Check if DICOM
+        ret.Add( it );
+
+      it = wxFindNextFile( );
+    } // fwhile
+
+    ret.Sort( );
+    return( ret );
+}
+
+// -------------------------------------------------------------------------
+void marDicom::loadActualSerie( )
+{
+    wxString tmp;
+
+    reset( );
+
+    tmp = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+    tmp += '/';
+    tmp += _actualStudy;
+    tmp += '/';
+    tmp += _actualSerie;
+    _imageFileNames = marDicom_SelectFiles( tmp );
+    loadVolume( true );
+}
+
+// -------------------------------------------------------------------------
+bool marDicom_ReadAllImageData( wxString& fn,
+                               PPIMAGE_USHORT& ima,
+                               wxString& number,
+                               int& dX, int& dY,
+                               double& vX, double& vY, double& vZ )
+{
+    char** tmp;
+//    char*  stmp;
+//    char*  end;
+
+    ima = ( PPIMAGE_USHORT )IdAcrReadFile( ( char* )fn.c_str( ), IMA_USHORT );
+    dX = IdImaDimX( ima );
+    dY = IdImaDimY( ima );
+
+    tmp = IdAcrInquireIRMInfo( ( char* )fn.c_str( ) );
+    number = tmp[ 16 ];
+//    printf("%s\n", tmp[20]);
+    
+    //stmp = strtok( tmp[ 20 ], "\\" );
+    //vX = strtod( stmp, &end );
+    //stmp = strtok( NULL, "\\" );
+    //vY = strtod( stmp, &end );
+    
+    sscanf( tmp[ 20 ], "%lf\\%lf", &vX, &vY);
+    //vZ = strtod( tmp[ 6 ], &end );
+    vZ = strtod( tmp[ 6 ], NULL );
+    
+//    printf("Vx = %lf  Vy = %lf  Vz = %lf\n", vX, vY, vZ);
+
+    //for( int i = 0; i < marDicom::ID_dicom_tags_count; i++ )
+    //delete tmp[ i ];
+    //delete tmp;
+    return( true );
+
+}
+
+// -------------------------------------------------------------------------
+void marDicom::loadVolume( bool force )
+{
+/*
+TODO: this function calls 11 534 336 to kVolume::setPixel !!!!
+*/
+    wxString number, tmp;
+    int size, i, j, k, dx, dy, dz, loc;
+    double vX, vY, vZ;
+    PPIMAGE_USHORT ima_t;
+
+    if( force || !_volume )
+    {
+      freeVolume( );
+      _imageNumbers.Clear( );
+      dz = _imageFileNames.GetCount( );
+
+      if( dz > 0 )
+      {
+        tmp = _imageFileNames[0 ];
+        marDicom_ReadAllImageData( tmp, ima_t, number, dx, dy, vX, vY, vZ );
+        getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, vX );
+        getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, vY );
+        getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, vZ );
+
+        printf("dx = %i dy = %i dz = %i vX = %lf vY = %lf vZ = %lf\n", dx, dy, dz, vX, vY, vZ );
+        _volume = new kVolume( kVolume::USHORT, dx, dy, dz, vX, vY, vZ );
+        IdImaFree( ima_t );
+
+        // Loads real data
+        for( k = 0; k < dz; k++ )
+        {
+          tmp = _imageFileNames[ k ];
+          marDicom_ReadAllImageData( tmp, ima_t, number, dx, dy, vX, vY, vZ );
+          _imageNumbers.Add( number.c_str( ) );
+          
+          for( j = 0; j < dy; j++ )
+            for( i = 0; i < dx; i++ )
+              _volume->setPixel( ima_t[ j ][ i ], i, j, k );
+          
+          IdImaFree( ima_t );
+
+        } // rof
+      } // fi
+    } // fi
+}
+
+// -------------------------------------------------------------------------
+void marDicom::freeVolume( )
+{
+    if( _volume ) delete _volume;
+    _volume = NULL;
+}
+
+// -------------------------------------------------------------------------
+bool marDicom::setActualStudy( wxString& s )
+{
+    wxString cad;
+
+    if( _actualStudy != s )
+    {
+      cad = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+      cad += '/';
+      cad += s;
+      if( wxDirExists( cad.c_str( ) ) )
+      {
+        _actualStudy = s;
+        _actualSerie = "";
+        return( true );
+      }
+      else
+        return( false );
+    }
+    else
+      return( true );
+}
+
+// -------------------------------------------------------------------------
+bool marDicom::setActualSerie( wxString& s )
+{
+    wxString cad;
+
+    if( _actualSerie != s  )
+    {
+      cad = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+      cad += '/';
+      cad += _actualStudy;
+      cad += '/';
+      cad += s;
+      if( wxDirExists( cad.c_str( ) ) )
+      {
+        _actualSerie = s;
+        return( true );
+      }
+      else
+        return( false );
+    }
+    else
+      return( true );
+}
+
+// -------------------------------------------------------------------------
+void marDicom::copyFrom( const marObject& from )
+{ // TODO
+}
+
+// -------------------------------------------------------------------------
+bool marDicom::save( std::ofstream& os )
+{
+    int s;
+
+    s = _actualStudy.length( );
+    os.write( ( const char* )&s, sizeof( int ) );
+    os.write( ( char* )_actualStudy.c_str( ), s * sizeof( char ) );
+    s = _actualSerie.length( );
+    os.write( ( const char* )&s, sizeof( int ) );
+    os.write( ( char* )_actualSerie.c_str( ), s * sizeof( char ) );
+    return( true );
+}
+
+// -------------------------------------------------------------------------
+bool marDicom::load( std::ifstream& is )
+{
+    int s;
+
+    reset( );
+
+    is.read( ( char* )&s, sizeof( int ) );
+    _actualStudy.resize( s );
+    is.read( ( char* )_actualStudy.c_str( ), s * sizeof( char ) );
+    is.read( ( char* )&s, sizeof( int ) );
+    _actualSerie.resize( s );
+    is.read( ( char* )_actualSerie.c_str( ), s * sizeof( char ) );
+    return( true );
+}
+
+// ----------------------------------------------------------------------------
+wxArrayString marDicom::getRelationalArrayStudyData( )
+{
+    wxArrayString ret;
+    wxArrayString inf = getStudyData( );
+    unsigned int i;
+
+    for( i = 0; i < inf.GetCount( ); i++ )
+    {
+        ret.Add( wxString( DicomTagsNames[ i ] ) );
+        ret.Add( wxString( inf[ i ] ) );
+
+    } // rof
+    return( ret );
+
+}
+
+// ----------------------------------------------------------------------------
+wxArrayString marDicom::getRelationalArraySerieData( )
+{
+    wxArrayString ret;
+    wxArrayString inf = getSerieData( );
+    unsigned int i;
+
+    for( i = 0; i < inf.GetCount( ); i++ ) {
+
+        ret.Add( wxString( DicomTagsNames[ i ] ) );
+        ret.Add( wxString( inf[ i ] ) );
+
+    } // rof
+    return( ret );
+
+}
+
+// eof - dicom.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marDicom.h b/lib/maracasVisuLib/src/kernel/marDicom.h
new file mode 100644 (file)
index 0000000..91b73d0
--- /dev/null
@@ -0,0 +1,181 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marDicom.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__DICOM__HXX__
+#define __MAR__KERNEL__DICOM__HXX__
+
+#include <kgfo/volume.h>
+#include <wx/list.h>
+#include "marObject.h"
+
+class MAR_KERNEL_EXPORT marDicom : public marObject
+{
+    public:
+
+    enum DicomTags
+       {
+           ID_File_Name = 0                   ,
+           ID_SOP_Class_UID                   ,
+           ID_SOP_Instance_UID                ,
+           ID_Study_Date                      ,
+           ID_Series_Date                     ,
+           ID_Acquisition_Date                ,
+           ID_Image_Date                      ,
+           ID_Study_Time                      ,
+           ID_Series_Time                     ,
+           ID_Acquisition_Time                ,
+           ID_Image_Time                      ,
+           ID_Modality                        ,
+           ID_Manufacturer                    ,
+           ID_Institution_Name                ,
+           ID_Study_Description               ,
+           ID_Series_Description              ,
+           ID_Admitting_Diagnoses_Description ,
+           ID_Patient_Name                    ,
+           ID_Patient_ID                      ,
+           ID_Body_Part_Examined              ,
+           ID_Scanning_Sequence               ,
+           ID_Sequence_Variant                ,
+           ID_Scan_Options                    ,
+           ID_MR_Acquisition_Type             ,
+           ID_Sequence_Name                   ,
+           ID_Slice_Thickness                 ,
+           ID_Repetition_Time                 ,
+           ID_Echo_Time                       ,
+           ID_Inversion_Time                  ,
+           ID_Number_of_Averages              ,
+           ID_Imaging_Frequency               ,
+           ID_Imaged_Nucleus                  ,
+           ID_Echo_Number                     ,
+           ID_Magnetic_Field_Strength         ,
+           ID_Spacing_Between_Slices          ,
+           ID_Echo_Train_Length               ,
+           ID_Percent_Sampling                ,
+           ID_Percent_Phase_Field_of_View     ,
+           ID_Receiving_Coil                  ,
+           ID_Patient_Position                ,
+           ID_Study_Instance_UID              ,
+           ID_Series_Instance_UID             ,
+           ID_Study_ID                        ,
+           ID_Series_Number                   ,
+           ID_Acquisition_Number              ,
+           ID_Image_Number                    ,
+           ID_Patient_Orientation             ,
+           ID_Image_Position                  ,
+           ID_Image_Position_Patient          ,
+           ID_Image_Orientation               ,
+           ID_Image_Orientation_Patient       ,
+           ID_Location                        ,
+           ID_Frame_of_Reference_UID          ,
+           ID_Slice_Location                  ,
+           ID_Image_Comments                  ,
+           ID_Pixel_Spacing                   ,
+           ID_Window_Center                   ,
+           ID_Window_Width                    ,
+           ID_dicom_tags_count
+       };
+
+    public:
+
+    marDicom( marParameters* p = NULL );
+
+    ~marDicom( )
+       {
+           reset( );
+       }
+
+    wxString& getActualStudy( )
+       {
+           return( _actualStudy );
+       }
+
+    wxString& getActualSerie( )
+       {
+           return( _actualSerie );
+       }
+
+    wxArrayString getStudies( );
+    wxArrayString getSeries( );
+    wxArrayString getStudyData( );
+    wxArrayString getSerieData( );
+
+    void loadActualSerie( );
+
+    wxArrayString& getImageFileNames( )
+       {
+           return( _imageFileNames );
+       }
+
+    wxArrayString& getImageNumbers( )
+       {
+           return( _imageNumbers );
+       }
+
+    void loadVolume( bool force = false );
+    void freeVolume( );
+    bool volumeLoaded( )
+       {
+           return( _volume != NULL );
+       }
+
+    kVolume* getVolume( )
+       {
+           return( _volume );
+       }
+
+    wxString getImageNumber( int i )
+       {
+           return( _imageNumbers[ i ] );
+       }
+
+    wxString getImageFileName( int i )
+       {
+           return( _imageFileNames[ i ] );
+       }
+
+    bool setActualStudy( wxString& s );
+    bool setActualSerie( wxString& s );
+
+    /** General methods
+     */
+    void reset( )
+       {
+           freeVolume( );
+           _imageFileNames.Clear( );
+           _imageNumbers.Clear( );
+       }
+
+    void copyFrom( const marObject& from );
+
+    /** Persistence methods
+     */
+    bool save( std::ofstream& os );
+    bool load( std::ifstream& is );
+
+    wxArrayString getRelationalArrayStudyData( );
+    wxArrayString getRelationalArraySerieData( );
+
+    private:
+
+    wxString _actualStudy;
+    wxString _actualSerie;
+    wxArrayString _imageFileNames;
+    wxArrayString _imageNumbers;
+    kVolume* _volume;
+
+};
+
+#endif // __MAR__KERNEL__DICOM__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marDicomBase.cpp b/lib/maracasVisuLib/src/kernel/marDicomBase.cpp
new file mode 100644 (file)
index 0000000..9d45e57
--- /dev/null
@@ -0,0 +1,713 @@
+
+#include "marDicomBase.h"
+
+#include <vtkVolume16Reader.h> 
+#include <vtkExtractVOI.h>
+#include <vtkImageChangeInformation.h>
+#include "vtkMetaImageWriter.h"
+
+
+
+marFilesBase::marFilesBase( marParameters* p  ) :  marObject( p ) {
+       _volume=NULL;
+}
+// -------------------------------------------------------------------------
+marFilesBase::~marFilesBase(){
+       freeVolume( );
+}
+// -------------------------------------------------------------------------
+kVolume* marFilesBase::getVolume( ){
+       return( _volume );
+}
+// -------------------------------------------------------------------------
+void marFilesBase::SetVolume( kVolume* volume  ){
+       _volume=volume;
+}
+// -------------------------------------------------------------------------
+bool marFilesBase::volumeLoaded( ){
+       return( _volume != NULL );
+}
+// -------------------------------------------------------------------------
+void marFilesBase::freeVolume( ){
+       if( _volume ) delete _volume;
+       _volume = NULL;
+}
+
+
+// -------------------------------------------------------------------------
+
+std::vector < std::string*>  *marFilesBase::GetListImages()
+{
+       return &_lstString;
+}
+
+// -------------------------------------------------------------------------
+void marFilesBase::CleanListImages()
+{
+       int i,size;
+       size=this->_lstString.size();
+       for(i=0;i<size;i++)
+       {
+               delete _lstString[i];
+       }
+       _lstString.clear();
+}
+
+
+// -------------------------------------------------------------------------
+void marFilesBase::ResetLstFileNotReaded()
+{
+       _lstFileNotReaded.clear();
+}
+
+
+// -------------------------------------------------------------------------
+std::string marFilesBase::GetMsgLstFile()
+{
+       int i,sizeLst;
+//EEDx44
+       std::string msgLstFile="";
+       sizeLst=_lstFileNotReaded.size();
+       for (i=0;i<sizeLst;i++)
+       {
+               msgLstFile = msgLstFile + *(_lstFileNotReaded[i]) ;
+               msgLstFile = msgLstFile + "\n";
+       }
+
+       return msgLstFile;
+}
+
+
+
+
+
+
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+marRAWFiles::marRAWFiles(marParameters* p)
+:  marFilesBase(p)
+{
+       _littreEndianBigEndian=0;
+}
+// -------------------------------------------------------------------------
+marRAWFiles::~marRAWFiles()
+{
+}
+// -------------------------------------------------------------------------
+//EED 9 oct 2006
+bool marRAWFiles::loadImage(int i) // virtual
+{
+
+       int dim[3];
+
+       vtkImageData *vol = getVolume( )->castVtk();
+       void *p_vol=(void*)getVolume( )->castVtk()->GetScalarPointer(0,0,i);
+       vol->GetDimensions(dim);
+
+       int dataSize = sizeof(unsigned short)*dim[0]*dim[1];
+       bool ok=true;
+
+/*
+       std::string *ss = _lstString[i];
+       FILE *ff=fopen( (char*)(ss->c_str())  , "r+" );
+       fread( (char*)p_vol , dataSize,1, ff);
+       fclose(ff);
+*/
+
+       std::string *ss = _lstString[i];
+       vtkVolume16Reader *reader = vtkVolume16Reader::New ();
+       reader->SetDataDimensions ( dim[0] , dim[1] );
+       if (_littreEndianBigEndian == 0) {
+           reader->SetDataByteOrderToLittleEndian ( );
+       } else {
+               reader->SetDataByteOrderToBigEndian();
+       }
+       reader->SetFilePrefix ( (char*)(ss->c_str())  );
+       reader->SetFilePattern("%s");
+    reader->SetImageRange ( 0, 0 );
+    reader->SetDataSpacing ( 1, 1, 1 );
+    reader->Update ();
+       void *pp_vol=(void*)reader->GetOutput()->GetScalarPointer(0,0,0);
+       memcpy(p_vol,pp_vol,dataSize);
+       reader->Delete();
+
+
+/*
+
+       std::string *ss = _lstString[i];
+       vtkGsmisReader *reader = vtkGsmisReader::New();
+       reader->SetFileName( (char*)(ss->c_str())  );
+       vtkImageData *ima=reader->GetOutput();
+       ima->Update();
+       void *pp_vol=(void*)ima->GetScalarPointer(0,0,0);
+       memcpy(p_vol,pp_vol,dataSize);
+//     reader->Delete();
+*/
+
+
+
+/*
+       int             ii;
+       char    tmp;
+       char    *pp = (char*)p_vol;
+       unsigned short   *valueA;
+       dataSize        = dim[0]*dim[1];
+       for (ii=0;ii<dataSize;ii++)
+       {
+               tmp             = *pp;
+               *pp             = *(pp+1);
+               *(pp+1) = tmp;
+
+               valueA=(unsigned short*)pp;
+               *valueA=*valueA-32000;
+               if (*valueA>=32000)
+               {
+                       *valueA=0;
+               } 
+
+               pp              = pp+2;
+       }
+*/
+
+       if (ok==false) {
+               _lstFileNotReaded.push_back( (char*)(ss->c_str()) );
+       }
+
+       return ok;
+}
+// -------------------------------------------------------------------------
+//EED 9 oct 2006
+void marRAWFiles::loadActualSerie(wxGauge* gauge )
+{
+
+       // Read File List
+       FILE *ff;
+       ff = fopen( _lstString[0] -> c_str() , "r"); 
+       std::string directory(*(_lstString[1]) );
+       char tmp[255];
+
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int type =      atoi(tmp);  // 0
+
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wx  =       atoi(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wy  =       atoi(tmp);
+
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spx      =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spy      =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spz      =       atof(tmp);
+
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int LB  =       atoi(tmp);
+
+       this->SetLittreEndianBigEndian(LB);
+
+
+       int wz=0;
+       this->CleanListImages();
+       while ( !feof(ff) )
+       {
+               fscanf(ff,"%s",tmp);
+               std::string *tmpStr =  new std::string(tmp);
+               (*tmpStr) = "/"+(*tmpStr);
+               (*tmpStr) = (directory)+(*tmpStr);
+               _lstString.push_back( tmpStr);
+               wz++;
+       }
+
+       fclose(ff);
+
+
+       // Create Free Memory block image
+       freeVolume();
+
+       if (wz==0)
+       {
+               wz=1;
+       }
+
+       kVolume *vol =new kVolume( kVolume::USHORT, wx, wy, wz,spx, spy, spz, malloc(sizeof(unsigned short)*wx*wy*wz ) );
+       SetVolume( vol );
+
+
+       // Define Spacing
+       getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, spx );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, spy );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, spz );
+
+       // Define Intercept Slope
+       getParameters( )->setDoubleParam( marParameters::e_RescaleIntercept , 0 );
+       getParameters( )->setDoubleParam( marParameters::e_RescaleSlope     , 1 );
+}
+// -------------------------------------------------------------------------
+void marRAWFiles::SetLittreEndianBigEndian(int value)
+{
+       _littreEndianBigEndian = value;
+}
+// -------------------------------------------------------------------------
+int    marRAWFiles::GetLittreEndianBigEndian()
+{
+       return _littreEndianBigEndian;
+}
+// -------------------------------------------------------------------------
+void marRAWFiles::reset( )
+{
+}
+// -------------------------------------------------------------------------
+void marRAWFiles::copyFrom( const marObject& from )
+{
+}
+// -------------------------------------------------------------------------
+bool marRAWFiles::save( std::ofstream& os )
+{
+       return true;
+}
+// -------------------------------------------------------------------------
+bool marRAWFiles::load( std::ifstream& is )
+{
+       return true;
+}
+
+
+//-------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+marRAW2AsciiFiles::marRAW2AsciiFiles(marParameters* p)
+:  marRAWFiles(p)
+{
+}
+// -------------------------------------------------------------------------
+marRAW2AsciiFiles::~marRAW2AsciiFiles()
+{
+}
+// -------------------------------------------------------------------------
+bool marRAW2AsciiFiles::loadImage(int i) // virtual
+{
+       return true;
+}
+
+
+// -------------------------------------------------------------------------
+//EED 9 oct 2006
+void marRAW2AsciiFiles::loadActualSerie(wxGauge* gauge )
+{
+
+       // Read File List
+       FILE *ff;
+       ff = fopen( _lstString[0] -> c_str() , "r"); 
+       char tmp[255];
+
+       // type
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int type =      atoi(tmp);  // 300
+
+       //size x,y,z
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wx  =       atoi(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wy  =       atoi(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wz  =       atoi(tmp);
+
+       // spacing x,y,z
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spx      =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spy      =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spz      =       atof(tmp);
+
+       // Intercept Slope
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double intercept        =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double slope            =       atof(tmp);
+
+
+       fscanf(ff,"%s",tmp);
+       std::string file(tmp);
+       std::string namefile( *_lstString[1] );  // directory
+       namefile=namefile+"/";                   // +  
+       namefile=namefile+file;                  // file
+
+       fclose(ff);
+
+
+       this->CleanListImages();
+
+       // Create Free Memory block image
+       freeVolume();
+
+       if (wz==0)
+       {
+               wz=1;
+       }
+
+       kVolume *vol =new kVolume( kVolume::USHORT, wx, wy, wz,spx, spy, spz, malloc(sizeof(unsigned short)*wx*wy*wz ) );
+       SetVolume( vol );
+
+
+       // Define Spacing
+       getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, spx );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, spy );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, spz );
+
+       // Define Intercept Slope
+       getParameters( )->setDoubleParam( marParameters::e_RescaleIntercept , 0 );
+       getParameters( )->setDoubleParam( marParameters::e_RescaleSlope     , 1 );
+
+
+       void    *p_vol  = (void*)getVolume( )->castVtk()->GetScalarPointer(0,0,0);
+       short   *pp             = (short*)p_vol;
+
+       FILE *fff=fopen( (char*)namefile.c_str() , "r+" );
+       long int ii, dataSize   = wx*wy*wz;
+       float value;
+       for (ii=0;ii<dataSize;ii++)
+       {
+               fscanf(fff,"%f ",&value);
+               // Intercept Slope
+               *pp     = (short)        ( value*slope + intercept );
+               if (*pp<0)
+               {
+                       *pp=0;
+               } 
+               pp++;
+       }
+       fclose(fff);
+
+
+// Y- Flip
+//     FlipY( getVolume( )->castVtk() );
+       
+}
+
+
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+marRAW2Files::marRAW2Files(marParameters* p)
+:  marRAWFiles(p)
+{
+}
+// -------------------------------------------------------------------------
+marRAW2Files::~marRAW2Files()
+{
+}
+// -------------------------------------------------------------------------
+bool marRAW2Files::loadImage(int i) // virtual
+{
+       return true;
+}
+
+
+// -------------------------------------------------------------------------
+//EED 9 oct 2006
+void marRAW2Files::loadActualSerie(wxGauge* gauge )
+{
+
+       // Read File List
+       FILE *ff;
+       ff = fopen( _lstString[0] -> c_str() , "r"); 
+       char tmp[255];
+
+       // type
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int type =      atoi(tmp);  // 200
+
+       //size x,y,z
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wx  =       atoi(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wy  =       atoi(tmp);
+//     fscanf(ff,"%s",tmp);
+//     fscanf(ff,"%s",tmp);
+//     int wz  =       atoi(tmp);
+
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wz1 =       atoi(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int wz2 =       atoi(tmp);
+
+       int wz = wz2-wz1;
+       
+       // spacing x,y,z
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spx      =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spy      =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double spz      =       atof(tmp);
+
+       // Intercept Slope
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double intercept        =       atof(tmp);
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       double slope            =       atof(tmp);
+
+       // L/B
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int littleBig   =       atoi(tmp);
+
+       // bits
+       fscanf(ff,"%s",tmp);
+       fscanf(ff,"%s",tmp);
+       int bits        =       atoi(tmp);
+
+       if ((bits!=8) && (bits!=16)){
+               bits=16;
+       }
+       
+       fscanf(ff,"%s",tmp);
+       std::string file(tmp);
+       std::string namefile( *_lstString[1] );  // directory
+       namefile=namefile+"/";                   // +  
+       namefile=namefile+file;                  // file
+
+       fclose(ff);
+
+
+       this->CleanListImages();
+
+       // Create Free Memory block image
+       freeVolume();
+
+       if (wz==0)
+       {
+               wz=1;
+       }
+
+
+       kVolume *vol =new kVolume( kVolume::USHORT, wx, wy, wz,spx, spy, spz, malloc(sizeof(unsigned short)*wx*wy*wz ) );
+       SetVolume( vol );
+
+
+       // Define Spacing
+       getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, spx );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, spy );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, spz );
+
+       // Define Intercept Slope
+       getParameters( )->setDoubleParam( marParameters::e_RescaleIntercept , 0 );
+       getParameters( )->setDoubleParam( marParameters::e_RescaleSlope     , 1 );
+
+       void *p_vol=(void*)getVolume( )->castVtk()->GetScalarPointer(0,0,0);
+       FILE *fff=fopen( (char*)namefile.c_str() , "r+" );
+    if (bits==16)
+    {
+               fseek( fff , wx*wy*wz1*2 , SEEK_CUR );
+       fread( (char*)p_vol , wx*wy*wz*2,1, fff);
+           fclose(fff);
+
+
+       // littleBigEndien
+               if (littleBig==1){
+                       long int                ii;
+                       char                    tmpB;
+                       char                    *pp = (char*)p_vol;
+                       unsigned short   *valueA;
+                       long int dataSize       = wx*wy*wz;
+                       for (ii=0;ii<dataSize;ii++)
+                       {
+                               tmpB            = *pp;
+                               *pp                     = *(pp+1);
+                               *(pp+1)         = tmpB;
+                               
+                               valueA= ((unsigned short*)pp);
+                               if (*valueA>=32000)
+                               {
+                                       *valueA=0;
+                               } 
+                               pp              = pp+2;
+
+                       }
+               }
+
+               unsigned short                  *pp = (unsigned short*)p_vol;
+               int tmpInt;
+               int ii, dataSize        = wx*wy*wz;
+               for (ii=0;ii<dataSize;ii++)
+               {
+                       tmpInt = (int) (*pp);
+                       tmpInt  = (int)  ( tmpInt*slope+intercept );
+                       if (tmpInt<0)
+                       {
+                               tmpInt=0;
+                       } 
+                       if (tmpInt>65535) 
+                       {
+                               tmpInt=65535;
+                       }
+                       (*pp) = (unsigned short)tmpInt;
+                       pp              = pp+1;
+               }
+
+    } else {
+       unsigned short *pShort=(unsigned short*)p_vol;
+       int i8bitImage,size8bitImage = wx*wy*wz;
+       unsigned char *pChar=(unsigned char*)malloc( size8bitImage );
+               fseek( fff , wx*wy*wz1 , SEEK_CUR );
+       fread( (unsigned char*)pChar , size8bitImage,1, fff);
+           fclose(fff);
+               double tmpDouble;
+       for ( i8bitImage=0 ; i8bitImage < size8bitImage ; i8bitImage++ )
+       {
+                       
+                       tmpDouble=(float)pChar[ i8bitImage ];
+                       tmpDouble=tmpDouble*slope+intercept;
+                       if (tmpDouble<0)
+                       {
+                               tmpDouble=0;
+                       } 
+               pShort[ i8bitImage ] = (unsigned short)tmpDouble;
+       }
+       free (pChar);
+    }
+
+// Y- Flip
+       FlipY( getVolume( )->castVtk() );
+       
+}
+
+
+
+
+// -------------------------------------------------------------------------
+void marRAW2Files::FlipY(vtkImageData *imagedata)
+{
+       vtkImageData *vtkimagedata = imagedata;
+       vtkimagedata->Update();
+       int dim[3];
+       vtkimagedata->GetDimensions(dim);
+       unsigned short tmp;
+       unsigned short *pp=(unsigned short*)vtkimagedata->GetScalarPointer(0,0,0);
+       int xx,yy,zz;
+       int sizeX  = dim[0];
+       int sizeY  = dim[1];
+       int sizeY2 = sizeY/2;
+       int sizeZ  = dim[2];
+       long int deltaZ;
+       long int deltaA;
+       long int deltaB;
+
+       for ( zz=0 ; zz<sizeZ ; zz++ )
+       {
+               deltaZ=zz*sizeX*sizeY;
+               for ( xx=0 ; xx<sizeX ; xx++ )
+               {
+               for ( yy=0 ; yy<sizeY2 ; yy++ )
+                       {
+                               deltaA          = xx + yy*sizeX + deltaZ;
+                               deltaB          = xx + (sizeY-yy-1)*sizeX + deltaZ;
+                               tmp                     = pp[deltaA ];
+                               pp[deltaA]      = pp[deltaB ];
+                               pp[deltaB]      = tmp;
+                               }
+                       }
+               }
+   vtkimagedata->Update();
+
+}
+// -------------------------------------------------------------------------
+
+// EED 23 Janvier 2007
+void marRAW2Files::saveVolume( std::string directory, std::string name, vtkImageData *imagedata,int voi[6], double slope, double intercept) // virtual
+{
+
+       std::string filename             = directory+"/"+name;
+
+               // Crop
+       vtkExtractVOI *crop = vtkExtractVOI::New();
+       crop->SetInput( imagedata );
+       crop->SetVOI( voi );
+       crop->Update();
+
+       int dim[3];
+       int ext[6];
+       double spc[3];
+       crop->GetOutput()->GetDimensions(dim);
+       crop->GetOutput()->GetSpacing(spc);
+       crop->GetOutput()->GetExtent(ext);
+
+
+       vtkImageChangeInformation* change = vtkImageChangeInformation::New();
+       change->SetInput( crop->GetOutput() );
+
+
+//     change->SetExtentTranslation( -ext[0], -ext[2], -ext[4] );
+   
+
+       change->SetOutputSpacing ( spc[0] , spc[1] , spc[2] );
+       change->Update();    //important
+
+//   change->SetExtentTranslation( ext[0], ext[2], ext[4] );
+//     change->Update();
+
+
+       // write mdh file
+   std::string nameMW           = filename+".mhd";
+
+       vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
+       writer->SetInput( change->GetOutput() );
+       writer->SetFileName( nameMW.c_str() );
+       writer->SetFileDimensionality( 3 );
+       writer->Write( );
+
+               // write maracas file
+       std::string nameM=filename+".maracas";
+
+
+       FILE *ff;
+       ff=fopen(nameM.c_str(),"w");
+               fprintf(ff,"MaracasType 200\n" );
+               fprintf(ff,"sizeX %d\n",dim[0] );
+               fprintf(ff,"sizeY %d\n",dim[1] );
+               fprintf(ff,"sizeZ1 %d\n",0 );
+               fprintf(ff,"sizeZ2 %d\n",dim[2] );
+               fprintf(ff,"spcX %f\n",spc[0]  );
+               fprintf(ff,"spcY %f\n",spc[1]  );
+               fprintf(ff,"spcZ %f\n",spc[2]  );
+               fprintf(ff,"intercept %f\n",intercept );
+               fprintf(ff,"slope %f\n",slope );
+               fprintf(ff,"LB %d\n",0 );
+               fprintf(ff,"bits %d\n",16 );
+               fprintf(ff,"%s.raw\n", name.c_str() );
+       fclose(ff);
+
+       writer  -> Delete();
+       change  -> Delete();
+       crop    -> Delete();
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marDicomBase.h b/lib/maracasVisuLib/src/kernel/marDicomBase.h
new file mode 100644 (file)
index 0000000..6c4d61b
--- /dev/null
@@ -0,0 +1,110 @@
+
+
+#ifndef __MAR__KERNEL__MARDICOMBASE__HXX__
+#define __MAR__KERNEL__MARDICOMBASE__HXX__
+
+
+
+#include <wx/gauge.h>
+
+#include "marObject.h"
+#include "volume.hxx"
+
+
+#include <vector>
+#include <string>
+//using namespace std;
+
+
+
+
+
+class marFilesBase : public marObject{
+public:
+                                               marFilesBase(marParameters* p);
+       virtual                         ~marFilesBase();
+       virtual wxString        GetPatientName() {return _T(""); };
+                       kVolume*        getVolume( );
+                       void            SetVolume( kVolume* volume  );
+                       bool            volumeLoaded( );
+                       void            freeVolume( );
+
+       virtual void            loadActualSerie( wxGauge* gauge) {} ;
+       virtual bool            loadImage(int i) {return true; };
+       std::vector < std::string*>  *GetListImages();
+                       void            CleanListImages();
+
+       void                            ResetLstFileNotReaded();
+       std::string                     GetMsgLstFile();
+
+private:
+       kVolume                                         *_volume;
+
+protected:
+       std::vector < std::string*>     _lstString;
+       std::vector < char*>            _lstFileNotReaded; 
+
+};
+
+
+
+//-------------------------------------------------------------------
+
+class marRAWFiles : public marFilesBase
+{
+public:
+       marRAWFiles(marParameters* p = NULL);
+       ~marRAWFiles();
+       virtual bool    loadImage(int i);
+       virtual void    loadActualSerie(wxGauge* gauge );
+                       void    SetLittreEndianBigEndian(int value);
+                       int             GetLittreEndianBigEndian();
+
+    void reset( );
+    void copyFrom( const marObject& from );
+    bool save( std::ofstream& os );
+    bool load( std::ifstream& is );
+
+
+private:
+       int _littreEndianBigEndian;
+protected:
+};
+
+
+//-------------------------------------------------------------------
+class marRAW2Files : public marRAWFiles
+{
+public:
+       marRAW2Files(marParameters* p = NULL);
+       ~marRAW2Files();
+       virtual bool loadImage(int i);
+       virtual void loadActualSerie(wxGauge* gauge );
+       virtual void saveVolume( std::string directory, std::string filename, vtkImageData *vtkimagedata,int voi[6], double slope, double intercept);
+                       void FlipY(vtkImageData *imagedata);
+
+private:
+protected:
+};
+
+
+//-------------------------------------------------------------------
+class marRAW2AsciiFiles : public marRAWFiles
+{
+public:
+       marRAW2AsciiFiles(marParameters* p = NULL);
+       ~marRAW2AsciiFiles();
+       virtual bool loadImage(int i);
+       virtual void loadActualSerie(wxGauge* gauge );
+
+private:
+protected:
+};
+
+
+
+
+
+
+#endif // __MAR__KERNEL__MARDICOMBASE__HXX__
+
diff --git a/lib/maracasVisuLib/src/kernel/marDynData.cpp b/lib/maracasVisuLib/src/kernel/marDynData.cpp
new file mode 100644 (file)
index 0000000..067f800
--- /dev/null
@@ -0,0 +1,204 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marDynData.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include <vtkImageResample.h>
+#include <vtkExtractVOI.h>
+#include <vtkImageData.h>
+#include <vtkImageChangeInformation.h>
+#include <vtkImageShiftScale.h> 
+#include <vtkImageThreshold.h> 
+#include "marDynData.h"
+
+// -------------------------------------------------------------------------
+marDynData::marDynData( marParameters* p ) : marObject( p ), _volume( NULL )
+{
+       _marimagedata = new marImageData(NULL); 
+}
+
+// -------------------------------------------------------------------------
+marDynData::~marDynData() 
+{
+//     _marimagedata->SetImageData(NULL);
+       delete _marimagedata;
+       reset( );
+}
+// -------------------------------------------------------------------------
+
+void marDynData::loadData( kVolume* vol, int* voi )
+ {
+   int ext[6];
+   reset( );
+   vtkExtractVOI *crop = vtkExtractVOI::New();
+   crop->SetInput( vol->castVtk( ) );
+
+   crop->SetVOI( voi );
+   //crop->SetSampleRate( getParameters( )->getVoxelSize( ), getParameters( )->getVoxelSize( ), getParameters( )->getVoxelSize( ));
+   
+   float RescalaSlope          =  getParameters()->getRescaleSlope();
+   float RescalaIntercept      =  getParameters()->getRescaleIntercept();
+
+//EED
+//     RescalaSlope            = 1;
+//     RescalaIntercept        = 0;
+
+   vtkImageShiftScale *scale = vtkImageShiftScale::New();
+   scale->SetInput( crop->GetOutput( ) );
+   scale->SetScale(RescalaSlope);
+   scale->SetShift(0);
+   scale->SetOutputScalarTypeToShort();
+   scale->Update();
+   vtkImageShiftScale *shift = vtkImageShiftScale::New();
+   shift->SetInput( scale->GetOutput( ) );
+   shift->SetScale(1); 
+   shift->SetShift(RescalaIntercept);
+   shift->SetOutputScalarTypeToShort();
+   shift->Update();
+
+
+   vtkImageThreshold *threshold = vtkImageThreshold::New();
+   threshold->SetInput( shift->GetOutput( ) );
+   threshold->ThresholdByUpper (-10000); 
+   threshold->ThresholdByLower (-1); 
+   threshold->SetInValue(0);   
+   threshold->ReplaceOutOff ();
+   threshold->ReplaceInOn ();
+   threshold->SetOutputScalarTypeToUnsignedShort();
+   
+   vtkImageResample* ir = vtkImageResample::New( );
+   ir->SetInput( threshold->GetOutput( ) );
+   ir->SetDimensionality( 3 );
+   double voxelSize= getParameters( )->getVoxelSize( );
+   ir->SetAxisOutputSpacing( 0, voxelSize );
+   ir->SetAxisOutputSpacing( 1, voxelSize );
+   ir->SetAxisOutputSpacing( 2, voxelSize );
+
+
+//     ir->SetAxisMagnificationFactor(0,1/getParameters( )->getVoxelSize( )); 
+
+//EEDx1
+   ir->InterpolateOn( );
+//   ir->InterpolateOff( );
+
+
+   ir->Update( );    //important
+   ir->GetOutput()->GetExtent( ext );
+  /**
+   * Before we were using kgfoCrop which assume extent start at 0,0,0
+   */
+   vtkImageChangeInformation* change = vtkImageChangeInformation::New();
+   change->SetInput( ir->GetOutput() );
+   change->SetExtentTranslation( -ext[0], -ext[2], -ext[4] );
+   change->SetOutputSpacing ( voxelSize , voxelSize , voxelSize );
+   change->Update();    //important
+   _volume = new kVolume( change->GetOutput( ) );
+
+       _marimagedata->AddImageData( _volume->castVtk() );
+       double spc[3];
+       vol->castVtk()->GetSpacing(spc);
+       _marimagedata->SetSpcOriginal( spc );
+       _marimagedata->SetVoiOriginal(voi);
+
+
+   crop                -> Delete();
+   ir          -> Delete();
+   change      -> Delete();
+   shift       -> Delete();
+   scale       -> Delete();
+   threshold-> Delete();
+ }
+
+
+// -------------------------------------------------------------------------
+void marDynData::reset( )
+{
+  //Efface car _volume est juste un pointeur ver _volume de marGdcmDicom qui
+  //est detruit par le reset correspondant
+// PS ->   #ifndef DXMM
+// PS ->   if( _volume ) delete _volume;
+// PS ->   #endif
+  _volume = NULL;
+}
+
+// -------------------------------------------------------------------------
+void marDynData::copyFrom( const marObject& from )
+{
+  reset( );
+  _volume = new kVolume( *( ( ( marDynData& )from )._volume ) );
+}
+
+// -------------------------------------------------------------------------
+bool marDynData::save( std::ofstream& os )
+{
+    void* data = _volume->getData1D( );
+    uint dims[ 3 ];
+    ulong dSize = _volume->getRawSizeInBytes( );
+    double sizes[ 3 ];
+    kVolume::Type type = _volume->getType( );
+
+    dims[ 0 ] = _volume->getXdim( );
+    dims[ 1 ] = _volume->getYdim( );
+    dims[ 2 ] = _volume->getZdim( );
+    sizes[ 0 ] = _volume->getXsize( );
+    sizes[ 1 ] = _volume->getYsize( );
+    sizes[ 2 ] = _volume->getZsize( );
+
+    os.write( ( const char* )dims, 3 * sizeof( uint ) );
+    os.write( ( const char* )sizes, 3 * sizeof( double ) );
+    os.write( ( const char* )&type, sizeof( kVolume::Type ) );
+    os.write( ( const char* )&dSize, sizeof( ulong ) );
+    os.write( ( const char* )data, dSize );
+
+    return( true );
+}
+
+// -------------------------------------------------------------------------
+bool marDynData::load( std::ifstream& is )
+{
+    uchar* data;
+    uint dims[ 3 ];
+    ulong dSize;
+    double sizes[ 3 ];
+    kVolume::Type type;
+
+    reset( );
+
+    is.read( ( char* )dims, 3 * sizeof( uint ) );
+    is.read( ( char* )sizes, 3 * sizeof( double ) );
+    is.read( ( char* )&type, sizeof( kVolume::Type ) );
+    is.read( ( char* )&dSize, sizeof( ulong ) );
+    data = new uchar[ dSize ];
+    is.read( ( char* )data, dSize );
+       
+    _volume = new kVolume( type, dims, sizes, ( void* )data );
+       
+    //cleaning
+    delete[] data;
+
+    return( true );
+}
+
+// ----------------------------------------------------------------------------------------------
+marImageData *marDynData::GetMarImageData()
+{
+       return _marimagedata;
+}
+// ----------------------------------------------------------------------------------------------
+
+// eof - dynData.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marDynData.h b/lib/maracasVisuLib/src/kernel/marDynData.h
new file mode 100644 (file)
index 0000000..0a20e9e
--- /dev/null
@@ -0,0 +1,59 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marDynData.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__DYNDATA__HXX__
+#define __MAR__KERNEL__DYNDATA__HXX__
+
+#include "marObject.h"
+//#include "marAxis.h"
+#include "volume.hxx"
+#include "marImageData.h"
+
+#include <vtkImageData.h>
+
+class MAR_KERNEL_EXPORT marDynData : public marObject
+{
+public:
+
+  marDynData( marParameters* p = NULL );
+  ~marDynData( ) ;
+
+  void loadData( kVolume* vol, int* voi );
+
+// EED Borrame
+//  void loadDataDXMM( kVolume* vol, int* voi );
+
+  float getActualVoxel() { return getParameters()->getVoxelSize( ); }
+  kVolume* getVolume( )        { return( _volume );    };
+
+  //General methods
+  void reset( );
+  void copyFrom( const marObject& from );
+
+  //Persistence methods
+  bool save( std::ofstream& os );
+  bool load( std::ifstream& is );
+
+  marImageData* GetMarImageData();
+
+
+private:
+
+       marImageData    *_marimagedata;
+       kVolume                 *_volume;
+};
+
+#endif // __MAR__KERNEL__DYNDATA__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marExperiment.cpp b/lib/maracasVisuLib/src/kernel/marExperiment.cpp
new file mode 100644 (file)
index 0000000..830514a
--- /dev/null
@@ -0,0 +1,392 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marExperiment.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+//#include "matrix.h"
+#include "marExperiment.h"
+#include "FonctionsGrales.h"
+#include "ExtractionAxe.h"
+
+// ----------------------------------------------------------------------------
+marExperiment::marExperiment( marParameters* p ) : marObject( p ),
+                              _dynData( NULL ), _description( _T("NO DESCRIPTION") )
+{
+  _voi[ 0 ] = _voi[ 1 ] = _voi[ 2 ] = 0;
+  _voi[ 3 ] = _voi[ 4 ] = _voi[ 5 ] = 0;
+  _startPoint[ 0 ] = _startPoint[ 1 ] = _startPoint[ 2 ] = 0;
+  _axes.push_back( NULL );
+
+}
+
+marExperiment::~marExperiment( ) { 
+       reset( ); 
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::initExperiment( kVolume* volume )
+{
+  {
+    reset( );
+    _dynData = new marDynData( getParameters( ) );
+
+     _dynData->loadData( volume, _voi );
+
+/* EED Borrame
+#ifndef DXMM
+     _dynData->loadData( volume, _voi );
+#else
+    _dynData->loadDataDXMM( volume, _voi );
+#endif
+*/
+  }
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::setStartPoint( int sx, int sy, int sz )
+{
+// EED 22 sep 2006
+//  _startPoint[ 0 ] = ( int )( ( double )sx * getParameters( )->getVoxelSize( ) );
+//  _startPoint[ 1 ] = ( int )( ( double )sy * getParameters( )->getVoxelSize( ) );
+//  _startPoint[ 2 ] = ( int )( ( double )sz * getParameters( )->getVoxelSize( ) );
+
+  _startPoint[ 0 ] = sx;
+  _startPoint[ 1 ] = sy;
+  _startPoint[ 2 ] = sz;
+
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::extractVascularTree( int sens , double *vit, int cleanLevel)
+{
+
+  marAxis* tmpAxis;
+  marAxis* tmpAxis2;
+
+#ifdef __LFV__GET__VASCULAR__TREE__
+    PPPOINTAXE pts = NULL;
+    PARBREVASCULAIRE res = NULL;
+#else
+    PPPOINTAXE res = NULL;
+    double pt[ marAxis::INDX_count ];
+#endif
+    int n, i;
+    res = ExtraireArbre(
+      _startPoint[ 0 ],
+      _startPoint[ 1 ],
+      _startPoint[ 2 ],
+      ( PPPVOLUME_USHORT )( _dynData->getVolume( )->castIdo( ) ),
+      1, 1, 1,
+      _dynData->getVolume( )->getXdim( ) - 1,
+      _dynData->getVolume( )->getYdim( ) - 1,
+      _dynData->getVolume( )->getZdim( ) - 1,
+      ( double )( getParameters( )->getIntParam( marParameters::e_roi_dimension ) ),
+      ( double )( getParameters( )->getIntParam( marParameters::e_step ) ),
+      getParameters( )->getDoubleParam( marParameters::e_gravity_distance ),
+      getParameters( )->getDoubleParam( marParameters::e_distance_to_maximum_intensity ),
+      getParameters( )->getDoubleParam( marParameters::e_flexion_coeficient ),
+      getParameters( )->getDoubleParam( marParameters::e_tension_coeficient ),
+      getParameters( )->getIntParam( marParameters::e_mass_power ),
+#ifdef __LFV__GET__VASCULAR__TREE__
+      pts,
+#else
+      res,
+#endif
+      &n , sens , vit);
+
+    // Data treatment
+#ifdef __LFV__GET__VASCULAR__TREE__
+    for( n = 0; n < res->nomAxes; n++ ) {
+      tmp = new marAxis( getParameters( ) );
+      tmp->set_points_disc( res->lstAxes[ n ] );
+      for( i = 0; i < res->lstAxes[ n ]->nomPoints; i++ )
+        tmp->AddAxisPoint( *( res->lstAxes[ n ]->lstPoints[ i ] ) );
+      tmp->doSpline( );
+      tmp->calculateSignal( _dynData->getVolume( ) );
+      _axes.push_back( tmp );
+    } // rof
+#else
+       if (n>2){
+               //
+               double voxSize = this->getParameters( )->getVoxelSize( );
+               tmpAxis = new marAxis( this->getParameters( ) );
+               std::string desc = "Axis N.";
+               desc += _axes.size( );
+               tmpAxis->setDescription( desc );
+               tmpAxis->set_points_disc( res );
+               for( i = 0; i < n; i++ ) {
+                       memcpy( pt, res[ i ], sizeof( POINTAXE ) );
+                       pt[ 0 ] *= voxSize;
+                       pt[ 1 ] *= voxSize;
+                       pt[ 2 ] *= voxSize;
+                       tmpAxis->addAxisPoint( pt );
+               }        // rof
+               tmpAxis->doSpline( );
+               tmpAxis->calculateSignal( _dynData->getVolume( ) );
+
+               //
+               int jCount=0;
+               tmpAxis2 = new marAxis( this->getParameters( ) );
+               tmpAxis2->setDescription( desc );
+               tmpAxis2->set_points_disc( res );       
+               for( i = 0; i < n; i++ ) {
+                       if (tmpAxis->getSignal(i)>=cleanLevel ){
+                               jCount++;
+                               memcpy( pt, res[ i ], sizeof( POINTAXE ) );
+                               pt[ 0 ] *= voxSize;
+                               pt[ 1 ] *= voxSize;
+                               pt[ 2 ] *= voxSize;
+                               tmpAxis2->addAxisPoint( pt );
+                       } else {
+                               i=n;
+                       }
+               } // for 
+               delete tmpAxis;
+
+               if (jCount>2){
+                       tmpAxis2->doSpline( );
+                       tmpAxis2->calculateSignal( _dynData->getVolume( ) );
+                       _axes.push_back( tmpAxis2 );
+                       _axes[ 0 ] = tmpAxis2;
+               } else {
+                       delete tmpAxis2;
+               }
+    }
+#endif // __LFV__GET__VASCULAR__TREE__
+
+}
+
+
+//marContour* marExperiment::generateContour( int slice, int x, int y, std::vector< double* >* points) 
+vtkPolyData* marExperiment::generateContour( int slice, int x, int y, std::vector< double* >* points)
+{
+/*  vtkImageData* imagedata;
+
+  imagedata = getSliceImage( slice );
+  vtkKitwareContourFilter* cntVTK = vtkKitwareContourFilter::New( );
+  cntVTK->SetInput( imagedata );
+  cntVTK->SetNumberOfContours( 1 );
+  //cntVTK->SetValue( 0, vmin );
+  cntVTK->SetValue( 0, 20 );
+  //cntVTK->SetValue( 1, vmax );
+  cntVTK->Update( );
+
+    return cntVTK;*/
+
+//  return(_axes[ 0 ]->setContour( slice, x, y, points));
+
+       return NULL;
+       
+  //return( _axes[ 0 ]->getContour( slice ) );
+}
+
+
+// ----------------------------------------------------------------------------
+void marExperiment::applyChangeResolution( )
+{
+  int i;
+
+  for( i = 1; i < _axes.size( ); i++ )
+    _axes[ i ]->changeAxisResolution( );
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::prepareQuantification( )
+{
+
+// EED borrame
+//  _axes[0]->sliceVolumeAxis( _dynData->getVolume( ), true);
+
+  if( _axes[ 0 ] )
+    _axes[ 0 ]->createEmptyVectors();
+
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::backQuant( )
+{
+//Cette méthode n'existe plus: dommage 
+//    if ( _axes[0]->getQuantOn() )
+  {
+    _axes[0]->setFinishQuant( _axes[0]->getFinishQuant() - 1);
+    if ( _axes[0]->getFinishQuant() < 0 )
+      _axes[0]->setFinishQuant(0);
+  }
+}
+
+
+// ----------------------------------------------------------------------------
+void marExperiment::reset( )
+{
+  int i;
+
+  _description = _T("");
+  if( _dynData != NULL ) delete _dynData;
+    
+  _dynData = NULL;
+
+  for( i = 1; i < _axes.size( ); i++ ){
+    if (_axes[ i ]!=NULL) delete _axes[ i ];
+  }
+
+  _axes.clear( );
+  _axes.push_back( NULL );
+// PS ->   // PS Et les images ???? _quantificationImages
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::calculateAxesSignal( )
+{
+  int i;
+  for( i = 1; i < _axes.size( ); i++ )
+    _axes[ i ]->calculateSignal( _dynData->getVolume( ) );
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::prepareContourImages( )
+{
+  if( _axes[ 0 ] )
+    _axes[ 0 ]->sliceVolumeAxis( _dynData->getVolume( ) );
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::copyFrom( const marObject& from )
+{ // TODO
+}
+
+// ----------------------------------------------------------------------------
+bool marExperiment::save( std::ofstream& os )
+{
+  int i;
+  size_t st;
+
+  st = _description.length( );
+  os.write( ( const char* )&st, sizeof( size_t ) );
+  os.write( ( const char* )_description.c_str( ), sizeof( char ) * st );
+  os.write( ( const char* )_startPoint, 3 * sizeof( int ) );
+  os.write( ( const char* )_voi, 6 * sizeof( int ) );
+  _dynData->save( os );
+  i = _axes.size( ) - 1;
+  os.write( ( const char* )&i, sizeof( int ) );
+  for( i = 1; i < _axes.size( ); i++ )
+    _axes[ i ]->save( os );
+  return( true );
+}
+
+// ----------------------------------------------------------------------------
+bool marExperiment::load(  std::ifstream& is )
+{
+
+  int i, n;
+  char ttmp[ 5000 ];
+  size_t st;
+  marAxis* ax;
+
+  reset( );
+
+  is.read( ( char* )&st, sizeof( size_t ) );
+  is.read( ( char* )ttmp, sizeof( char ) * st );
+  ttmp[ st ] = '\0';
+
+// EED 05 join 2007
+// _description  = ttmp;
+  _description   = wxString(ttmp, wxConvUTF8);
+
+  is.read( ( char* )_startPoint, 3 * sizeof( int ) );
+  is.read( ( char* )_voi, 6 * sizeof( int ) );
+
+  _dynData = new marDynData( getParameters( ) );
+  _dynData->load( is );
+
+  is.read( ( char* )&n, sizeof( int ) );
+  for( i = 1; i <= n; i++ ) {
+    ax = new marAxis( getParameters( ) );
+    ax->load( is );
+    _axes.push_back( ax );
+    _axes[ 0 ] = ax;
+  } // rof
+  return( true );
+}
+
+// ----------------------------------------------------------------------------
+void marExperiment::DeleteAxis( unsigned int index )
+{
+       /* Very naughty bug, when doing a - 1, where a is uint result is still
+       uint, imaging when a=0 :) need to cast to int*/
+  
+  int axesize=_axes.size( )-1;
+  index=index+1;
+  delete _axes[ index ];
+  for( int i = index; i < axesize; i++ ) 
+     _axes[ i ] = _axes[ i + 1 ];
+  _axes.pop_back( );
+
+  if (index<axesize) {
+       _axes[ 0 ]=_axes[ index ];
+  } else {
+       _axes[ 0 ]=NULL;
+  }
+
+/*  
+  _axes[index]->Delete();
+  if(_axes[ 0 ]) 
+         _axes[ 0 ]->Delete( );
+  _axes.erase(_axes.begin() + index);
+*/
+
+// PS ->   // PS : traitement identique Ã  la methode std::vector::erase(iterator)
+/*
+  if(_axes[ 0 ]) 
+         _axes[ 0 ]->Delete( );
+  delete _axes[ index ];
+*/
+}
+// ----------------------------------------------------------------------------
+void marExperiment::RegenerateSignal(){
+       marAxis *maraxis = getAxis(); 
+       if (maraxis!=NULL) {
+               maraxis->calculateSignal( _dynData->getVolume( ) );
+               maraxis->eraseContourVectorsContent();                   
+       }
+}
+// ----------------------------------------------------------------------------
+void marExperiment::ClearContours(){
+       marAxis *maraxis = getAxis(); 
+       if (maraxis!=NULL) maraxis->eraseContourVectorsContent();                        
+}
+// ----------------------------------------------------------------------------
+void marExperiment::RegenerateAxis(){
+       if (getAxis()!=NULL){
+               int actualquant=getAxis()->getActualQuant();
+               DeleteAxis(0);                  
+               extractVascularTree();
+               setAxis(0);     
+               getAxis()->setActualQuant(actualquant);
+               getAxis()->createEmptyVectors();                         
+       }
+}
+// ----------------------------------------------------------------------------
+void marExperiment::RecalculateAxis(){
+       marAxis *maraxis = getAxis(); 
+       if (maraxis!=NULL){
+               maraxis->doSpline();     
+               int nCnts = ( int ) maraxis->getNumberOfSplinePoints( );
+               getAxis()->setActualQuant(nCnts/2);
+               getAxis()->createEmptyVectors();                         
+       }
+}
+
+// eof - experiment.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marExperiment.h b/lib/maracasVisuLib/src/kernel/marExperiment.h
new file mode 100644 (file)
index 0000000..42c5a09
--- /dev/null
@@ -0,0 +1,126 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marExperiment.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__EXPERIMENT__HXX__
+#define __MAR__KERNEL__EXPERIMENT__HXX__
+
+#include <vector>
+#include "volume.hxx"
+#include "marAxis.h"
+#include "marDynData.h"
+#include "GestionBifurcations.h"
+
+class MAR_KERNEL_EXPORT marExperiment : public marObject
+{
+
+public:
+
+  marExperiment( marParameters* p = NULL );
+  ~marExperiment( );
+
+  wxString& getDescription( ) { return( _description ); };
+  void setDescription( wxString& d )   { _description = d; };
+
+  marDynData* getDynData( )    { return( _dynData ); };
+
+  void getVOI( int* voi ) { memcpy( voi, _voi, sizeof( int ) * 6 ); };
+  void setVOI( int* voi ) { memcpy( _voi, voi, sizeof( int ) * 6 ); };
+
+  void initExperiment( kVolume* volume );
+
+  void setStartPoint( int* sp )
+  {
+    setStartPoint( sp[ 0 ], sp[ 1 ], sp[ 2 ] );
+  }
+
+  void setStartPoint( int sx, int sy, int sz );
+  void extractVascularTree( int sens = 1, double *vit=NULL, int cleanLevel=0 );
+  void DeleteAxis ( unsigned int index );
+
+//  marContour* generateContour( int slice, int x, int y, std::vector< double* >* points);
+  vtkPolyData* generateContour( int slice, int x, int y, std::vector< double* >* points);
+
+  void applyChangeResolution( );
+
+  int getNumberOfAxes( )
+  {
+    return( _axes.size( ) - 1 );
+  };
+
+  marAxis* getAxis( int i = -1 ) 
+  { 
+    return( _axes[ i + 1 ] ); 
+  };
+
+  void appendAxis( marAxis* ax )
+  {
+    _axes.push_back( ax );
+    _axes[ 0 ] = ax;
+  }
+
+  void setAxis( int i )
+  {
+    _axes[ 0 ] = _axes[ i + 1 ];
+  }
+
+  int   getQuantStart( )  { return _axes[0]->getStartQuant( );};
+  int   getQuantFinish( ) { return _axes[0]->getFinishQuant( );};
+  void  backQuant( );
+
+  void prepareQuantification( );
+
+  marContour*          getContour( int i )                     { return(_axes[0]->getContour           ( i ,  _dynData->getVolume( )  ));      };
+  vtkImageData*                getSliceImage( int i )          { return(_axes[0]->getSliceImage        ( i ,  _dynData->getVolume( )  ));      };
+  vtkProbeFilter*      get3DSlice( int i )                     { return(_axes[0]->get3DSlice           ( i ,  _dynData->getVolume( )  ));      };
+  vtkPoints*           get3Dcontour( int i )           { return(_axes[0]->get3Dcontour         ( i ,  _dynData->getVolume( )  ));      };
+  vtkPolyData*         get2Dcontour( int i )           { return(_axes[0]->get2Dcontour         ( i ,  _dynData->getVolume( )  ));      };
+  vtkPoints*           get2DDiameterMin( int i )       { return(_axes[0]->get2DDiameterMin     ( i ,  _dynData->getVolume( )  ));      };
+  vtkPoints*           get2DDiameterMax( int i )       { return(_axes[0]->get2DDiameterMax     ( i ,  _dynData->getVolume( )  ));      };
+  double                       getTotalLength()                        { return _axes[0]->getTotalLength() * _dynData->getActualVoxel() ;              };
+  double                       getSubAxisLength()                      { return _axes[0]->getSubAxisLength() * _dynData->getActualVoxel();             };
+  double                       getReferenceArea()                      { return _axes[0]->getReferenceArea( _dynData->getVolume( ));                   };
+  double                       getReferenceAverDiam()          { return _axes[0]->getReferenceAverDiam( _dynData->getVolume( ));               };
+
+  double                       getAverageArea(int pIni, int pEnd) {return _axes[0]->getAverageArea(pIni,pEnd, _dynData->getVolume( ) );                };
+  int                          getNumberOfSlices( )            { return _axes[0]->getNumberOfContours();                                                               };
+
+  void calculateAxesSignal( );
+  void prepareContourImages( );
+
+  void ClearContours();
+  void RegenerateAxis();
+  void RegenerateSignal();
+  void RecalculateAxis();
+
+  //General methods.
+  void reset( );
+  void copyFrom( const marObject& from );
+
+  //Persistence methods.
+  bool save( std::ofstream& os );
+  bool load( std::ifstream& is );
+
+private:
+
+  wxString _description;
+  marDynData* _dynData;
+  int _voi[ 6 ];
+  int _startPoint[ 3 ];
+
+  std::vector< marAxis* > _axes;
+};
+
+#endif // __MAR__KERNEL__EXPERIMENT__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marExperimentCT.cpp b/lib/maracasVisuLib/src/kernel/marExperimentCT.cpp
new file mode 100644 (file)
index 0000000..1655e94
--- /dev/null
@@ -0,0 +1,226 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marExperimentCT.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include "marExperimentCT.h"
+
+
+// ----------------------------------------------------------------------------
+marExperimentCT::marExperimentCT( marParameters* p ) : marExperiment( p )
+                              
+{
+  
+}
+
+// ----------------------------------------------------------------------------
+marContour* marExperimentCT::getContour( int point, int contour ) {
+       return ((marAxisCT *)getAxis())->getContour(point,getDynData()->getVolume(),contour);
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints*     marExperimentCT::get3Dcontour( int point, int contour ) {
+       return ((marAxisCT *)getAxis())->get3Dcontour(point,getDynData()->getVolume(),contour);
+}
+
+// ----------------------------------------------------------------------------
+vtkPolyData* marExperimentCT::get2Dcontour( int point, int contour ) {
+       return ((marAxisCT *)getAxis())->get2Dcontour(point,getDynData()->getVolume(),contour);
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marExperimentCT::get2DDiameterMin( int point, int contour ) {
+       return ((marAxisCT *)getAxis())->get2DDiameterMin(point,getDynData()->getVolume(),contour);
+}
+
+// ----------------------------------------------------------------------------
+vtkPoints* marExperimentCT::get2DDiameterMax( int point, int contour ) {
+       return ((marAxisCT *)getAxis())->get2DDiameterMax(point,getDynData()->getVolume(),contour);;
+}
+
+// ----------------------------------------------------------------------------
+int marExperimentCT::getNumberOfContours(int point) {
+       return ((marAxisCT *)getAxis())->getNumberOfContours(point,getDynData()->getVolume( )) ;
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::prepareQuantification( ) {
+
+       if(getAxis())
+       {
+               ((marAxisCT *)getAxis())->eraseContours();
+               ((marAxisCT *)getAxis())->createEmptyContours();
+               marExperiment::prepareQuantification();
+       }
+       
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::RegenerateAxis() {
+
+       if (getAxis()!=NULL){
+               ((marAxisCT *)getAxis())->eraseContours();
+               ((marAxisCT *)getAxis())->createEmptyContours();
+       //      marExperiment::RegenerateAxis();
+       }
+
+       
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::RecalculateAxis() {
+
+       if (getAxis()!=NULL){
+               ((marAxisCT *)getAxis())->eraseContours();
+               ((marAxisCT *)getAxis())->createEmptyContours();
+               marExperiment::RecalculateAxis();
+       }
+       
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::updateLumenPercentage(int percentage)
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+       ((marAxisCT *)getAxis())->getParameters()->setLumenPercentage(percentage);
+       ((marAxisCT *)getAxis())->updateLumenPercentage(point,getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::updateCalcPercentage(int percentage) 
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+       ((marAxisCT *)getAxis())->getParameters()->setCalcPercentage(percentage);
+       ((marAxisCT *)getAxis())->updateCalcPercentage(point,getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::updateDiscontinuityThreshold(int percentage)
+{
+       ((marAxisCT *)getAxis())->getParameters()->setContourThresh(percentage);
+       ((marAxisCT *)getAxis())->eraseContours();
+       ((marAxisCT *)getAxis())->createEmptyContours();
+       ((marAxisCT *)getAxis())->setCalibration(false);
+
+}
+
+
+
+// ----------------------------------------------------------------------------
+int    marExperimentCT::getContourType(int point, int index) {
+       return ((marAxisCT *)getAxis())->getContourType(point, index, getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::histogram(int point) {
+       
+       ((marAxisCT *)getAxis())->histogram(point, getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::setCalibration(bool calib)
+{
+       ((marAxisCT *)getAxis())->setCalibration(calib);
+}
+
+// ----------------------------------------------------------------------------
+bool marExperimentCT::getCalibration()
+{
+       return ((marAxisCT *)getAxis())->getCalibration();
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::ClearContoursPartial(int start)
+{
+       ((marAxisCT *)getAxis())->eraseContoursPartial(start);
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::setStartIndex(int start)
+{
+       ((marAxisCT *)getAxis())->setStartIndex(start);
+}
+
+// ----------------------------------------------------------------------------
+int    marExperimentCT::getPointSize()
+{
+       return ((marAxisCT *)getAxis())->getPointSize();
+}
+
+// ----------------------------------------------------------------------------
+marPoint* marExperimentCT::getPoint(int i)
+{
+       return ((marAxisCT *)getAxis())->getPoint(i);
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::markUpLumen(int point)
+{
+       ((marAxisCT *)getAxis())->markUpLumen(point, getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::generateFile()
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+       ((marAxisCT *)getAxis())->generateFile(point, getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::replaceContour2D(int size,double *vx,double *vy, int type)
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+       ((marAxisCT *)getAxis())->replaceContour2D(point,size,vx,vy,type);
+}
+
+// ----------------------------------------------------------------------------
+void marExperimentCT::cleanContours(int type)
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+       ((marAxisCT *)getAxis())->cleanContours(type,point);
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour* marExperimentCT::loadMarIsocontour(int size, double *vx, double *vy)
+{
+       return ((marAxisCT *)getAxis())->loadMarIsocontour(size,vx,vy);
+}
+
+// ----------------------------------------------------------------------------
+double marExperimentCT::performXOR(int type, std::vector<marIsocontour*> manual)
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+
+       return ((marAxisCT *)getAxis())->performXOR(type,point,manual, getDynData()->getVolume());
+}
+
+// ----------------------------------------------------------------------------
+double marExperimentCT::performAND(int type, std::vector<marIsocontour*> manual)
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+        
+       return ((marAxisCT *)getAxis())->performAND(type,point,manual, getDynData()->getVolume());
+       
+
+}
+
+// ----------------------------------------------------------------------------
+double marExperimentCT::performUnion(int type, std::vector<marIsocontour*> manual)
+{
+       int point = ((marAxisCT *)getAxis())->getActualQuant();
+        
+       return ((marAxisCT *)getAxis())->performUnion(type,point,manual, getDynData()->getVolume());
+}
diff --git a/lib/maracasVisuLib/src/kernel/marExperimentCT.h b/lib/maracasVisuLib/src/kernel/marExperimentCT.h
new file mode 100644 (file)
index 0000000..7646d68
--- /dev/null
@@ -0,0 +1,66 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marExperimentCT.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__EXPERIMENTCT__HXX__
+#define __MAR__KERNEL__EXPERIMENTCT__HXX__
+
+#include <vector>
+#include "volume.hxx"
+#include "marExperiment.h"
+#include "marDynData.h"
+#include "GestionBifurcations.h"
+#include "marAxisCT.h"
+#include "marPoint.h"
+
+class MAR_KERNEL_EXPORT marExperimentCT : public marExperiment
+{
+
+public:
+  
+  marExperimentCT( marParameters* p = NULL );
+  
+  marContour*          getContour( int point, int contour );
+  vtkPoints*           get3Dcontour( int point, int contour );
+  vtkPolyData*         get2Dcontour( int point, int contour );
+  vtkPoints*           get2DDiameterMin( int point, int contour );
+  vtkPoints*           get2DDiameterMax( int point, int contour );
+  int                          getNumberOfContours(int point);
+  void                         prepareQuantification( );
+  void                         RegenerateAxis();
+  void                         RecalculateAxis();
+  void                         updateLumenPercentage(int percentage);
+  void                         updateCalcPercentage(int percentage);
+  void                         updateDiscontinuityThreshold(int percentage);
+  int                          getContourType(int point, int index);
+  void                         histogram(int point);
+  void                         setCalibration(bool calib);
+  bool                         getCalibration();
+  void                         ClearContoursPartial(int start);
+  void                         setStartIndex(int start);
+  int                          getPointSize();
+  marPoint*                    getPoint(int i);
+  void                         markUpLumen(int point);
+  void                         generateFile();
+  void                         replaceContour2D(int size,double *vx,double *vy, int type);
+  void                         cleanContours(int type);
+  marIsocontour*       loadMarIsocontour(int size, double *vx, double *vy);
+  double                       performXOR(int type, std::vector<marIsocontour*> manual);
+  double                       performAND(int type, std::vector<marIsocontour*> manual);
+  double                       performUnion(int type, std::vector<marIsocontour*> manual);
+
+};
+
+#endif // __MAR__KERNEL__EXPERIMENTCT__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marGdcmDicom.cpp b/lib/maracasVisuLib/src/kernel/marGdcmDicom.cpp
new file mode 100644 (file)
index 0000000..df3c107
--- /dev/null
@@ -0,0 +1,1060 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marGdcmDicom.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#pragma warning ( disable : 4251 )
+#endif //_MSC_VER
+
+
+#include <wx/file.h>
+#include <wx/filename.h>
+#include <wx/dir.h>
+#include <wx/msgdlg.h>
+
+#include <vector>
+#include <string>
+
+#include <gdcm.h> 
+#include <gdcmFile.h> 
+#include "vtkGdcmReader.h"
+
+#include <vtkImageData.h>
+#include <vtkImageChangeInformation.h>
+#include <vtkImageCast.h>
+#include <vtkImageShiftScale.h>
+#include <vtkCommand.h>
+#include <vtkImageAppend.h> 
+#include <vtkImageReader.h> 
+
+#include "marGdcmDicom.h"
+
+
+
+#include <iostream>
+#include <fstream>
+//using namespace std;
+
+
+
+#define _DICOMFILENAME "/DICOMDIR"
+
+//----------------------------------------------------------------------------
+// Callback for the interaction
+class marProgressObserver : public vtkCommand
+{
+  public:
+  static marProgressObserver *New() 
+    { return new marProgressObserver; }
+    marProgressObserver()
+    {
+      this->FrameGauge = NULL;
+    }
+  virtual void Execute(vtkObject *wdg, unsigned long event, void* calldata)
+    {
+      if ( this->FrameGauge )
+        {
+        int val = this->FrameGauge->GetValue();
+        this->FrameGauge->SetValue( val + 1);
+        //wxYield();
+        //wxSafeYield();
+        //wxYieldIfNeeded();
+        //wxWakeUpIdle();
+        //wxSafeYield( this->FrameGauge, FALSE);
+        }
+    }
+  wxGauge *FrameGauge;
+};
+//----------------------------------------------------------------------------
+/* EED Borrame
+static char* DicomTagsNames[] = {
+    "ID_File_Name",
+    "ID_SOP_Class_UID",                     //!0008 0016 UI ID SOP Class UID
+    "ID_SOP_Instance_UID",                  //!0008 0018 UI ID SOP Instance UID
+    "ID_Study_Date",                        //!0008 0020 DA ID Study Date
+    "ID_Series_Date",                       //!0008 0021 DA ID Series Date
+    "ID_Acquisition_Date",                  //!0008 0022 DA ID Acquisition Date
+    "ID_Image_Date",                        //!0008 0023 DA ID Image Date
+    "ID_Study_Time",                        //!0008 0030 TM ID Study Time
+    "ID_Series_Time",                       //!0008 0031 TM ID Series Time
+    "ID_Acquisition_Time",                  //!0008 0032 TM ID Acquisition Time
+    "ID_Image_Time",                        //!0008 0033 TM ID Image Time
+    "ID_Modality",                          //!0008 0060 CS ID Modality
+    "ID_Manufacturer",                      //!0008 0070 LO ID Manufacturer
+    "ID_Institution_Name",                  //!0008 0080 LO ID Institution Name
+    "ID_Study_Description",                 //!0008 1030 LO ID Study Description
+    "ID_Series_Description",                //!0008 103e LO ID Series Description
+    "ID_Admitting_Diagnoses_Description",   //!0008 1080 LO ID Admitting Diagnoses Description
+    "ID_Patient_Name",                      //!0010 0010 PN PAT Patient Name
+    "ID_Patient_ID",                        //!0010 0020 LO PAT Patient ID
+    "ID_Body_Part_Examined",                //!0018 0015 CS ACQ Body Part Examined
+    "ID_Scanning_Sequence",                 //!0018 0020 CS ACQ Scanning Sequence
+    "ID_Sequence_Variant",                  //!0018 0021 CS ACQ Sequence Variant
+    "ID_Scan_Options",                      //!0018 0022 CS ACQ Scan Options
+    "ID_MR_Acquisition_Type",               //!0018 0023 CS ACQ MR Acquisition Type
+    "ID_Sequence_Name",                     //!0018 0024 SH ACQ Sequence Name
+    "ID_Slice_Thickness",                   //!0018 0050 DS ACQ Slice Thickness
+    "ID_Repetition_Time",                   //!0018 0080 DS ACQ Repetition Time
+    "ID_Echo_Time",                         //!0018 0081 DS ACQ Echo Time
+    "ID_Inversion_Time",                    //!0018 0082 DS ACQ Inversion Time
+    "ID_Number_of_Averages",                //!0018 0083 DS ACQ Number of Averages
+    "ID_Imaging_Frequency",                 //!0018 0084 DS ACQ Imaging Frequency
+    "ID_Imaged_Nucleus",                    //!0018 0085 SH ACQ Imaged Nucleus
+    "ID_Echo_Number",                       //!0018 0086 IS ACQ Echo Number
+    "ID_Magnetic_Field_Strength",           //!0018 0087 DS ACQ Magnetic Field Strength
+    "ID_Spacing_Between_Slices",            //!0018 0088 DS ACQ Spacing Between Slices
+    "ID_Echo_Train_Length",                 //!0018 0091 IS ACQ Echo Train Length
+    "ID_Percent_Sampling",                  //!0018 0093 DS ACQ Percent Sampling
+    "ID_Percent_Phase_Field_of_View",       //!0018 0094 DS ACQ Percent Phase Field of View
+    "ID_Receiving_Coil",                    //!0018 1250 SH ACQ Receiving Coil
+    "ID_Patient_Position",                  //!0018 5100 CS ACQ Patient Position
+    "ID_Study_Instance_UID",                //!0020 000d UI REL Study Instance UID
+    "ID_Series_Instance_UID",               //!0020 000e UI REL Series Instance UID
+    "ID_Study_ID",                          //!0020 0010 SH REL Study ID
+    "ID_Series_Number",                     //!0020 0011 IS REL Series Number
+    "ID_Acquisition_Number",                //!0020 0012 IS REL Acquisition Number
+    "ID_Image_Number",                      //!0020 0013 IS REL Image Number
+    "ID_Patient_Orientation",               //!0020 0020 CS REL Patient Orientation
+    "ID_Image_Position",                    //!0020 0030 RET REL Image Position
+    "ID_Image_Position_Patient",            //!0020 0032 DS REL Image Position Patient
+    "ID_Image_Orientation",                 //!0020 0035 RET REL Image Orientation
+    "ID_Image_Orientation_Patient",         //!0020 0037 DS REL Image Orientation (Patient)
+    "ID_Location",                          //!0020 0050 RET REL Location
+    "ID_Frame_of_Reference_UID",            //!0020 0052 UI REL Frame of Reference UID
+    "ID_Slice_Location",                    //!0020 1041 DS REL Slice Location
+    "ID_Image_Comments",                    //!0020 4000 LT REL Image Comments
+    "ID_Pixel_Spacing",                     //!0028 0030 DS IMG Pixel Spacing
+    "ID_Window_Center",                     //!0028 1050 DS IMG Window Center
+    "ID_Window_Width",                      //!0028 1051 DS IMG Window Width
+    "ID_Rescale_Intercept",                 //!0028 1052 CT IMG Rescale Intercept
+    "ID_Rescale_Slope",                     //!0028 1053 CT IMG Rescale Slope
+};
+
+*/
+
+// -------------------------------------------------------------------------
+marGdcmDicom::marGdcmDicom( marParameters* p )
+                         : marFilesBase( p ){
+               _dicomDir=NULL;
+               _iniSlice=-1;
+               _endSlice=-1;
+//EED Borrame  FillDicomInfo( );
+}
+
+/** Conversion de wxString en string. */
+//#define ws2s(as) (string(as.GetData()))
+
+/** Conversion de string en wxString. */
+//#define s2ws(s) (wxString((s).c_str()))
+
+/** Conversion de C-string en wxString. */
+//#define cs2ws(s) (wxString(s))
+
+/* EED Borrame
+// -------------------------------------------------------------------------
+wxArrayString marGdcmDicom::gdcmGetExamInfo( wxString directoryname ){
+
+  wxArrayString temparray;
+  temparray.Alloc( 60 );
+
+  wxDir dir(directoryname);
+  wxString filename;
+  bool cont = dir.GetFirst( &filename, "*", wxDIR_FILES );
+  filename = directoryname + "/" + filename;
+  
+  std::string val;
+  
+  GDCM_NAME_SPACE::Header GdcmHeader( filename.c_str() );
+  temparray.Add( filename );                                             //    "ID_File_Name",
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0016).c_str() );//    "ID_SOP_Class_UID",         //0008 0016 UI ID SOP Class UID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0018).c_str() );//    "ID_SOP_Instance_UID",      //0008 0018 UI ID SOP Instance UID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0020).c_str() );//    "ID_Study_Date",            //0008 0020 DA ID Study Date
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0021).c_str() );//    "ID_Series_Date",           //0008 0021 DA ID Series Date
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0022).c_str() );//    "ID_Acquisition_Date",      //0008 0022 DA ID Acquisition Date
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0023).c_str() );//    "ID_Image_Date",            //0008 0023 DA ID Image Date
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0030).c_str() );//    "ID_Study_Time",            //0008 0030 TM ID Study Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0031).c_str() );//    "ID_Series_Time",           //0008 0031 TM ID Series Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0032).c_str() );//    "ID_Acquisition_Time",      //0008 0032 TM ID Acquisition Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0033).c_str() );//    "ID_Image_Time",            //0008 0033 TM ID Image Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0060).c_str() );//    "ID_Modality",              //0008 0060 CS ID Modality
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0070).c_str() );//    "ID_Manufacturer",          //0008 0070 LO ID Manufacturer
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x0080).c_str() );//    "ID_Institution_Name",      //0008 0080 LO ID Institution Name
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x1030).c_str() );//    "ID_Study_Description",     //0008 1030 LO ID Study Description
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x103e).c_str() );//    "ID_Series_Description",    //0008 103e LO ID Series Description
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0008,0x1080).c_str() );//    "ID_Admitting_Diagnoses_Description", //0008 1080 LO ID Admitting Diagnoses Description
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0010,0x0010).c_str() );//    "ID_Patient_Name",          //0010 0010 PN PAT Patient Name
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0010,0x0020).c_str() );//    "ID_Patient_ID",            //0010 0020 LO PAT Patient ID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0015).c_str() );//    "ID_Body_Part_Examined",    //0018 0015 CS ACQ Body Part Examined
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0020).c_str() );//    "ID_Scanning_Sequence",     //0018 0020 CS ACQ Scanning Sequence
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0021).c_str() );//    "ID_Sequence_Variant",      //0018 0021 CS ACQ Sequence Variant
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0022).c_str() );//    "ID_Scan_Options",          //0018 0022 CS ACQ Scan Options
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0023).c_str() );//    "ID_MR_Acquisition_Type",   //0018 0023 CS ACQ MR Acquisition Type
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0024).c_str() );//    "ID_Sequence_Name",         //0018 0024 SH ACQ Sequence Name
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0050).c_str() );//    "ID_Slice_Thickness",       //0018 0050 DS ACQ Slice Thickness
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0080).c_str() );//    "ID_Repetition_Time",       //0018 0080 DS ACQ Repetition Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0081).c_str() );//    "ID_Echo_Time",             //0018 0081 DS ACQ Echo Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0082).c_str() );//    "ID_Inversion_Time",        //0018 0082 DS ACQ Inversion Time
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0083).c_str() );//    "ID_Number_of_Averages",    //0018 0083 DS ACQ Number of Averages
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0084).c_str() );//    "ID_Imaging_Frequency",     //0018 0084 DS ACQ Imaging Frequency
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0085).c_str() );//    "ID_Imaged_Nucleus",        //0018 0085 SH ACQ Imaged Nucleus
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0086).c_str() );//    "ID_Echo_Number",           //0018 0086 IS ACQ Echo Number
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0087).c_str() );//    "ID_Magnetic_Field_Strength", //0018 0087 DS ACQ Magnetic Field Strength
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0088).c_str() );//    "ID_Spacing_Between_Slices",  //0018 0088 DS ACQ Spacing Between Slices
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0091).c_str() );//    "ID_Echo_Train_Length",     //0018 0091 IS ACQ Echo Train Length
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0093).c_str() );//    "ID_Percent_Sampling",      //0018 0093 DS ACQ Percent Sampling
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x0094).c_str() );//    "ID_Percent_Phase_Field_of_View", //0018 0094 DS ACQ Percent Phase Field of View
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x1250).c_str() );//    "ID_Receiving_Coil",        //0018 1250 SH ACQ Receiving Coil
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0018,0x5100).c_str() );//    "ID_Patient_Position",      //0018 5100 CS ACQ Patient Position
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x000d).c_str() );//    "ID_Study_Instance_UID",    //0020 000d UI REL Study Instance UID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x000e).c_str() );//    "ID_Series_Instance_UID",   //0020 000e UI REL Series Instance UID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0010).c_str() );//    "ID_Study_ID",              //0020 0010 SH REL Study ID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0011).c_str() );//    "ID_Series_Number",         //0020 0011 IS REL Series Number
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0012).c_str() );//    "ID_Acquisition_Number",    //0020 0012 IS REL Acquisition Number
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0013).c_str() );//    "ID_Image_Number",          //0020 0013 IS REL Image Number
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0020).c_str() );//    "ID_Patient_Orientation",   //0020 0020 CS REL Patient Orientation
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0030).c_str() );//    "ID_Image_Position",        //0020 0030 RET REL Image Position
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0032).c_str() );//    "ID_Image_Position_Patient",  //0020 0032 DS REL Image Position Patient
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0035).c_str() );//    "ID_Image_Orientation",     //0020 0035 RET REL Image Orientation
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0037).c_str() );//    "ID_Image_Orientation_Patient", //0020 0037 DS REL Image Orientation (Patient)
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0050).c_str() );//    "ID_Location",              //0020 0050 RET REL Location
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x0052).c_str() );//    "ID_Frame_of_Reference_UID",  //0020 0052 UI REL Frame of Reference UID
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x1041).c_str() );//    "ID_Slice_Location",        //0020 1041 DS REL Slice Location
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0020,0x4000).c_str() );//    "ID_Image_Comments",        //0020 4000 LT REL Image Comments
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0028,0x0030).c_str() );//    "ID_Pixel_Spacing",         //0028 0030 DS IMG Pixel Spacing
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0028,0x1050).c_str() );//    "ID_Window_Center",         //0028 1050 DS IMG Window Center
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0028,0x1051).c_str() );//    "ID_Window_Width",          //0028 1051 DS IMG Window Width
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0028,0x1052).c_str() );//    "ID_Rescale_Intercept",     //0028 1052 CT IMG Rescale Intercept
+  temparray.Add( GdcmHeader.GetEntryByNumber(0x0028,0x1053).c_str() );//    "ID_Rescale_Slope",         //0028 1053 CT IMG Rescale Slope
+
+  return temparray;  
+}
+*/
+
+//#undef s2ws
+
+
+// ----------------------------------------------------------------------------
+GDCM_NAME_SPACE::DicomDir* marGdcmDicom::getGdcmDicomDir() {
+       return _dicomDir;
+}
+
+
+// ----------------------------------------------------------------------------
+void marGdcmDicom::CreateDicomFile( ){
+       wxString rootdir = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+// EED Borrame         GDCM_NAME_SPACE::DicomDir *tmp_dicomDir = new GDCM_NAME_SPACE::DicomDir( rootdir.c_str() , true );
+       GDCM_NAME_SPACE::DicomDir *tmp_dicomDir = GDCM_NAME_SPACE::DicomDir::New();
+       tmp_dicomDir->SetFileName( (const char*)(rootdir.mb_str()) );
+       tmp_dicomDir->ParseDirectory();
+       wxString strDicomDir(rootdir + wxString(_DICOMFILENAME, wxConvUTF8) );
+       tmp_dicomDir->Write( (const char*)(strDicomDir.mb_str()) );
+       tmp_dicomDir->Delete();
+}
+
+// ----------------------------------------------------------------------------
+void marGdcmDicom::FillDicomInfo(bool parseDir){
+       reset();
+
+       wxString rootdir = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+       wxString strDICOMDIR( rootdir );
+       if (parseDir==false){
+          strDICOMDIR= strDICOMDIR + (wxChar)(_DICOMFILENAME);
+       }
+//EED Borrame  _dicomDir = new GDCM_NAME_SPACE::DicomDir( strDICOMDIR.c_str() , parseDir );
+       _dicomDir = GDCM_NAME_SPACE::DicomDir::New();
+       _dicomDir->SetFileName( (const char*)(strDICOMDIR.mb_str()) );
+       if (parseDir==true){
+               _dicomDir->ParseDirectory();
+       } else {
+               _dicomDir->Load();
+       }
+}
+
+//-------------------------------------------------------------------------
+void marGdcmDicom::setActualPatient(GDCM_NAME_SPACE::DicomDirPatient *patient){
+       _actualPatient = patient;
+}
+//-------------------------------------------------------------------------
+void marGdcmDicom::setActualStudy(GDCM_NAME_SPACE::DicomDirStudy *study){
+       _actualStudy = study;
+}
+//-------------------------------------------------------------------------
+void marGdcmDicom::setActualSerie(GDCM_NAME_SPACE::DicomDirSerie *serie){
+       _actualSerie = serie;
+       setIniSlice(1);
+       GDCM_NAME_SPACE::DicomDirImage          *im;
+       int                                             numOfImg = 0;
+    im = serie->GetFirstImage();
+    while ( im ) { // on degouline les Images de cette serie
+               numOfImg++;
+               im = serie->GetNextImage();   
+       }
+       setEndSlice( numOfImg );
+}
+//-------------------------------------------------------------------------
+void marGdcmDicom::setIniSlice(int iniSlice){
+       _iniSlice=iniSlice;
+}
+//-------------------------------------------------------------------------
+void marGdcmDicom::setEndSlice(int endSlice){
+       _endSlice=endSlice;
+}
+//-------------------------------------------------------------------------
+GDCM_NAME_SPACE::DicomDirSerie *marGdcmDicom::getActualSerie(){
+   return _actualSerie;
+}
+
+//-------------------------------------------------------------------------
+GDCM_NAME_SPACE::DicomDirStudy* marGdcmDicom::getActualStudy(){
+       return _actualStudy;
+}
+
+
+// -------------------------------------------------------------------------
+bool marGdcmDicom::SerieVerificationEqImageSize( GDCM_NAME_SPACE::FileList *gdcmFileList ){
+       bool    ok        =     true;
+       int             ww        =     -1;
+       int             hh        =     -1;
+       int             wwBak = -1;
+       int             hhBak = -1;
+
+       int i;
+       for (i=(*gdcmFileList).size(); i<(*gdcmFileList).size() ; i++){
+               GDCM_NAME_SPACE::File *gdcmFile = (GDCM_NAME_SPACE::File*)(*gdcmFileList)[i];
+
+               ww = gdcmFile->GetXSize();
+               hh = gdcmFile->GetYSize();
+
+               if (wwBak!=-1){
+                       if (ww!=wwBak){ ok=false; }
+               }
+               wwBak=ww;
+
+               if (hhBak!=-1){
+                       if (hh!=hhBak){ ok=false; }
+               }
+               hhBak=hh;
+
+       }
+
+       return ok;
+}
+
+
+/*
+// -------------------------------------------------------------------------
+bool marGdcmDicom::SerieVerificationEqImageOrientation(  gdcmPub::FileList *gdcmFileList  ){
+       bool ok = true;
+       float ox=-1,oy=-1,oz-1;
+       float oxBak=-99999,oyBak=-99999,ozBak=-99999;
+       gdcmPub::SerieHeader::GdcmHeaderList gdcmheaderlist = serieheader->GetGdcmFileList();
+
+//     gdcmPub::ListDicomDirImage::const_iterator      itImage;
+//     itImage = (serie->GetDicomDirImages()).begin();
+
+       float iop[6];
+       for ( gdcmPub::SerieHeader::GdcmHeaderList::const_iterator 
+                 it = gdcmheaderlist.begin();
+          it != gdcmheaderlist.end(); ++it ){
+               (*it)->GetImageOrientationPatient( iop );
+               normal[0] = iop[1]*iop[5] - iop[2]*iop[4];
+        normal[1] = iop[2]*iop[3] - iop[0]*iop[5];
+        normal[2] = iop[0]*iop[4] - iop[1]*iop[3];
+
+ falta terminar esto .....
+
+               if (oxBak!=-99999){
+                       float rox,roy,roz;
+                       prodouit_vectorial(ox,oy,oz , oxBak,oyBak,ozBak , &rox,&roy,&roz);
+                       if ( (abs(rox)>0.000001) || (abs(roy)>0.000001) || (abs(roz)>0.000001)){
+                               ok=false;
+                       }
+               }
+               oxBak=ox;
+               oyBak=oy;
+               ozBak=oz;
+       }
+
+       // The same image orientation verification
+       while (itImage != serie->GetDicomDirImages().end() ) { // on degouline les SERIES de cette study
+        wxString strNum;
+        wxString strSub;
+        wxString strImgOriPat=(*itImage)->GetEntryByNumber(0x0020, 0x0037).c_str();
+               double x1,y1,z1;
+               double x2,y2,z2;
+               if (strImgOriPat.Cmp( gdcmPub::GDCM_UNFOUND.c_str() )!=0){
+                       int pp;
+                       strSub=strImgOriPat.Mid(0);
+
+                       pp=strSub.First('\');
+                       strNum=strSub.Mid(0, pp-1 );
+                       strNum.ToDouble(&x1);
+                       strSub=strSub.Mid(pp+1);
+
+                       pp=strSub.First('\');
+                       strNum=strSub.Mid(0, pp-1 );
+                       strNum.ToDouble(&y1);
+                       strSub=strSub.Mid(pp+1);
+
+                       pp=strSub.First('\');
+                       strNum=strSub.Mid(0, pp-1 );
+                       strNum.ToDouble(&z1);
+                       strSub=strSub.Mid(pp+1);
+
+                       pp=strSub.First('\');
+                       strNum=strSub.Mid(0, pp-1 );
+                       strNum.ToDouble(&x2);
+                       strSub=strSub.Mid(pp+1);
+
+                       pp=strSub.First('\');
+                       strNum=strSub.Mid(0, pp-1 );
+                       strNum.ToDouble(&y2);
+                       strSub=strSub.Mid(pp+1);
+
+                       pp=strSub.First('\');
+                       strNum=strSub.Mid(0, pp-1 );
+                       strNum.ToDouble(&z2);
+                       strSub=strSub.Mid(pp+1);
+                       
+                       normalize(&x1,&y1,&z1);
+                       normalize(&x2,&y2,&z2);
+                       prodouit_vectorial(x1,y1,z1 , x2,y2,z2 , &ox,&oy,&oz);
+                       normalize(&ox,&oy,&oz);
+                       if (oxBak!=-99999){
+                               double rox,roy,roz;
+                               prodouit_vectorial(ox,oy,oz , oxBak,oyBak,ozBak , &rox,&roy,&roz);
+                               if ( (abs(rox)>0.000001) || (abs(roy)>0.000001) || (abs(roz)>0.000001)){
+                                       ok=false;
+                               }
+                       }
+                       oxBak=ox;
+                       oyBak=oy;
+                       ozBak=oz;
+               } 
+               ++itImage;   
+       } // while
+       return ok;
+}
+// -------------------------------------------------------------------------
+*/
+
+
+bool marGdcmDicom::SerieVerification( GDCM_NAME_SPACE::FileList  *gdcmFileList ){
+       bool ok1=true;
+       bool ok2=true;
+       bool ok3=true;
+       ok1=SerieVerificationEqImageSize(gdcmFileList);
+//     ok2=SerieVerificationEqImageOrientation(gdcmFileList);
+//     ok3=SerieVerificationDifImagePositionPatient(gdcmFileList);
+       if (ok1==false){
+               wxMessageDialog *msg = new wxMessageDialog(NULL, _T("The size of all images aren't the same."), _T("Warning"), wxOK );
+               msg->ShowModal();
+               delete msg;
+       }
+       return ok1 && ok2 && ok3;
+}
+
+
+// -------------------------------------------------------------------------
+void marGdcmDicom::CreateEmptyVoxel(){
+       freeVolume();
+       GDCM_NAME_SPACE::File *gdcmFile=_gdcmFileList[0];
+       int wx = gdcmFile->GetXSize();
+       int wy = gdcmFile->GetYSize();
+       int wz = _gdcmFileList.size();
+
+       if (wx==0)
+       {
+               wx=1;
+       }
+
+       double spx= (double)gdcmFile->GetXSpacing (); 
+       double spy= (double)gdcmFile->GetYSpacing (); 
+       double spz= (double)gdcmFile->GetZSpacing (); 
+       kVolume *vol =new kVolume( kVolume::USHORT, wx, wy, wz,spx, spy, spz, malloc(sizeof(unsigned short)*wx*wy*wz ) );
+       SetVolume( vol );
+}
+// -------------------------------------------------------------------------
+void marGdcmDicom::PrepareLoadVolumeDispers(){
+       CreateSerieHelper();
+       CreateEmptyVoxel();
+       ExtactSpacing();
+       ExtactInterceptSlope();
+}
+
+//EED 7 mars 2007
+// -------------------------------------------------------------------------
+void marGdcmDicom::ExtactSpacing(){
+       GDCM_NAME_SPACE::File *gdcmFile=_gdcmFileList[0];
+       float sx = gdcmFile->GetXSpacing();
+       float sy = gdcmFile->GetYSpacing();
+//     float sz = gdcmFile->GetZSpacing();
+
+
+       float xx1 = (_gdcmFileList[0])->GetXOrigin();
+       float yy1 = (_gdcmFileList[0])->GetYOrigin();
+       float zz1 = (_gdcmFileList[0])->GetZOrigin();
+
+       (_gdcmFileList[1])->Load();
+       float xx2 = (_gdcmFileList[1])->GetXOrigin();
+       float yy2 = (_gdcmFileList[1])->GetYOrigin();
+       float zz2 = (_gdcmFileList[1])->GetZOrigin();
+
+       float xx=xx1-xx2;
+       float yy=yy1-yy2;
+       float zz=zz1-zz2;
+
+       float sz=sqrt( xx*xx + yy*yy+ zz*zz );
+
+       getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, sx );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, sy );
+       getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, sz );
+}
+// -------------------------------------------------------------------------
+void marGdcmDicom::ExtactInterceptSlope(){
+       GDCM_NAME_SPACE::File *gdcmFile=_gdcmFileList[0];
+       float slope             = gdcmFile->GetRescaleSlope();
+       float intercept = gdcmFile->GetRescaleIntercept();
+       getParameters( )->setDoubleParam( marParameters::e_RescaleIntercept , intercept );
+       getParameters( )->setDoubleParam( marParameters::e_RescaleSlope     , slope     );
+}
+
+
+// -------------------------------------------------------------------------
+bool marGdcmDicom::loadFileDicom(void* p_vol,int *dim,char *namefile)
+{
+       int  dataSize;
+       GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New();
+//     gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_NOSHADOW);
+       gdcmFile->SetFileName( namefile );
+       bool ok = gdcmFile->Load();
+       if (ok==true)
+       {
+               dataSize=sizeof(unsigned short)*dim[0]*dim[1];
+
+               bool manualLecture=false;
+               if ( (gdcmFile->GetTransferSyntaxName()=="Implicit VR - Little Endian")         ||
+                        (gdcmFile->GetTransferSyntaxName()=="Explicit VR - Little Endian")         || 
+                        (gdcmFile->GetTransferSyntaxName()=="Explicit VR - Big Endian")         ) 
+               {
+                       manualLecture=true;
+               }
+
+               if (manualLecture==true){
+                       long int offset = gdcmFile->GetPixelOffset(); 
+                       FILE *ff=fopen(namefile, "r" );
+                       fseek (ff,offset,SEEK_SET);
+                       fread( (char*)p_vol , dataSize,1, ff);
+                       fclose(ff);
+
+                       // gdcm/Dics/dicomTS.dic
+                       // champ DICOM >> 0002|0010
+                       if (gdcmFile->GetTransferSyntaxName()=="Explicit VR - Big Endian")
+                       {
+                               int i;
+                               char tmp;
+                               char *pp=(char*)p_vol;
+                               dataSize=dim[0]*dim[1];
+                               for (i=0;i<dataSize;i++)
+                               {
+                                       tmp             = *pp;
+                                       *pp             = *(pp+1);
+                                       *(pp+1) = tmp;
+                                       pp=pp+2;
+                               }
+                       }
+               } else {
+                       GDCM_NAME_SPACE::FileHelper *fh =       GDCM_NAME_SPACE::FileHelper::New(gdcmFile);
+                       memcpy((char*)p_vol, fh->GetImageDataRaw() , dataSize); 
+               }
+       }
+       gdcmFile->Delete();
+       return ok;
+}
+// -------------------------------------------------------------------------
+
+
+bool marGdcmDicom::loadImage(int i)
+{
+
+       int dim[3];
+       GDCM_NAME_SPACE::File   *gdcmFileTEMP;
+
+       gdcmFileTEMP = _gdcmFileList[i];
+       vtkImageData *vol = getVolume( )->castVtk();
+       void *p_vol=(void*)getVolume( )->castVtk()->GetScalarPointer(0,0,i);
+       vol->GetDimensions(dim);
+       bool ok=loadFileDicom( p_vol ,dim, (char *)gdcmFileTEMP->GetFileName().c_str() );
+
+//EEDx44       
+       if (ok==false) {
+               char *ss = (char *)gdcmFileTEMP->GetFileName().c_str();
+               _lstFileNotReaded.push_back( ss );
+       }
+
+       return ok;
+}
+
+/* EED Borrame
+// -------------------------------------------------------------------------
+
+void marGdcmDicom::loadImage(int i)
+{
+       long int offset; 
+       GDCM_NAME_SPACE::File   *gdcmFileTEMP=_gdcmFileList[i]; 
+       GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New();
+       gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_NOSHADOW);
+       gdcmFile->SetFileName( gdcmFileTEMP->GetFileName().c_str() );
+       bool ok = gdcmFile->Load();
+       offset = gdcmFile->GetPixelOffset(); 
+       gdcmFile->Delete();
+
+       std::ifstream infile;
+       FILE *ff=fopen(gdcmFileTEMP->GetFileName().c_str(), "r" );
+       vtkImageData *vol = getVolume( )->castVtk();
+       int dim[3];
+       vol->GetDimensions(dim);
+       int US=sizeof(unsigned short);
+       int dataSize=US*dim[0];
+       int y,sizeY=dim[1];
+       for (y=0;y<sizeY;y++){
+               fseek (ff,offset,SEEK_SET);
+               void *p_vol = vol->GetScalarPointer(0,y,i);
+               fread( (char*)p_vol , dataSize,1, ff);
+               offset=offset+dataSize;
+       }
+       fclose(ff);
+}
+*/
+// -------------------------------------------------------------------------
+
+/* EED Borrame
+void marGdcmDicom::loadImage(int i)
+{
+
+       GDCM_NAME_SPACE::File   *gdcmFileTEMP;
+       gdcmFileTEMP    = _gdcmFileList[i];
+       
+
+       GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New();
+       gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_NOSHADOW);
+       gdcmFile->SetFileName( gdcmFileTEMP->GetFileName().c_str() );
+       bool ok = gdcmFile->Load();
+       long int offset = gdcmFile->GetPixelOffset(); 
+       gdcmFile->Delete();
+
+       std::ifstream infile;
+       infile.open( gdcmFileTEMP->GetFileName().c_str() ,  ifstream::in );
+       if (infile.is_open()==true){
+           vtkImageData *vol = getVolume( )->castVtk();
+               void *p_vol = vol->GetScalarPointer(0,0,i);
+               int dim[3];
+               vol->GetDimensions(dim);
+               int dataSize=2*dim[0]*dim[1];
+               int US=sizeof(unsigned short);
+               char *temp=new char [dataSize];
+               infile.seekg( 0 , ios_base::beg );
+//             int a=infile.readsome(  (char*)p_vol , dataSize );
+//             int a=infile.readsome(  temp , dataSize );
+
+               int length = 0;
+               while (infile.good())
+               {
+                       length += infile.readsome (temp,100);
+               }
+
+               infile.close();
+       }
+}
+*/
+// -------------------------------------------------------------------------
+
+
+/* EED Borrame
+
+void marGdcmDicom::loadImage(int i){
+       vtkGdcmReader *gdcmReader = NULL;
+
+       GDCM_NAME_SPACE::File   *gdcmFile;
+       gdcmFile        = _gdcmFileList[i];
+
+
+       gdcmReader      = vtkGdcmReader::New();
+       const char *fileName = gdcmFile->GetFileName().c_str();
+       gdcmReader->SetFileName( fileName );
+    gdcmReader->UpdateWholeExtent();
+
+       //To simplyfy calculation later I turn Origin to (0, 0, 0)
+       //this shouldn't be 'trop grave'
+       vtkImageChangeInformation *change = vtkImageChangeInformation::New();
+
+       change->SetInput( gdcmReader->GetOutput() );
+       change->SetOutputOrigin( 0, 0, 0);
+  
+       //Our algorithm are made based on unsigned short pixel/voxel:
+       //We need to cast our imagedata
+       vtkImageCast *cast = vtkImageCast::New();
+       cast->SetInput( change->GetOutput() );
+       cast->SetOutputScalarTypeToUnsignedShort();
+       cast->Update(); //important
+  
+
+       vtkImageData *imagedata = cast->GetOutput();
+    vtkImageData *vol = getVolume( )->castVtk();
+
+    void *p_imagedata = imagedata->GetScalarPointer(0,0,0);
+    void *p_vol = vol->GetScalarPointer(0,0,i);
+       int dim[3];
+       imagedata->GetDimensions(dim);
+
+       memcpy( p_vol, p_imagedata , sizeof(unsigned short)*dim[0]*dim[1] );
+
+       //!\todo thanks
+       if(gdcmReader) gdcmReader->Delete();
+       cast->Delete();
+       change->Delete();
+}
+*/
+// -------------------------------------------------------------------------
+void marGdcmDicom::Cleaning_gdcmFileList(){
+       GDCM_NAME_SPACE::File *gdcmFile;
+       int i;
+       for (i=0; i<_gdcmFileList.size(); i++ ){
+               gdcmFile=_gdcmFileList[i];
+               gdcmFile->Delete();
+       }
+       _gdcmFileList.clear();
+}
+
+// -------------------------------------------------------------------------
+void marGdcmDicom::CreateSerieHelper(){      // Virtual
+       wxString rootdir; 
+       rootdir = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+       GDCM_NAME_SPACE::DicomDirImage *im;  
+
+/* EED Borrame
+    _serieHelper = new GDCM_NAME_SPACE::SerieHelper();
+       int iSlice=0;
+       im = _actualSerie->GetFirstImage();
+       while ( im ) { // on degouline les Images de cette serie
+               iSlice++;
+               if ((iSlice>=_iniSlice) && (iSlice<=_endSlice)){
+                       wxString tmp( rootdir);
+                       tmp=tmp+"/";
+                       tmp=tmp+im->GetEntryValue(0x0004, 0x1500).c_str();  // File name
+                       _serieHelper->AddFileName( tmp.c_str() ); 
+                       _actualImage = im;
+               }
+               im = _actualSerie->GetNextImage();   
+       }
+
+    _serieHelper->OrderGdcmFileList( _serieHelper->GetFirstCoherentFileList() );
+*/
+
+/* EED Borrame
+    GDCM_NAME_SPACE::SerieHelper *serieHelper = new GDCM_NAME_SPACE::SerieHelper();
+       int iSlice=0;
+       im = _actualSerie->GetFirstImage();
+       while ( im ) { // on degouline les Images de cette serie
+               iSlice++;
+               if ((iSlice>=_iniSlice) && (iSlice<=_endSlice)){
+                       wxString tmp( rootdir);
+                       tmp=tmp+"/";
+                       tmp=tmp+im->GetEntryValue(0x0004, 0x1500).c_str();  // File name
+                       serieHelper->AddFileName( tmp.c_str() ); 
+                       _actualImage = im;
+               }
+               im = _actualSerie->GetNextImage();   
+       }
+
+       GDCM_NAME_SPACE::GdcmFileList* tmpGdcmFileList=serieHelper->GetFirstCoherentFileList(); 
+    serieHelper->OrderGdcmFileList( tmpGdcmFileList );
+       for (int i=0; i <tmpGdcmFileList->size() ; i++){
+               _gdcmFileList.push_back( (*tmpGdcmFileList)[i] );
+       }
+*/
+
+
+       Cleaning_gdcmFileList();
+
+/*
+       GDCM_NAME_SPACE::File *gdcmFile;
+       int iSlice=0;
+       im = _actualSerie->GetFirstImage();
+       while ( im ) { // on degouline les Images de cette serie
+               if ((iSlice>=_iniSlice) && (iSlice<=_endSlice)){
+                       wxString fileName( rootdir);
+                       fileName=fileName+"/";
+                       fileName=fileName+im->GetEntryString(0x0004, 0x1500).c_str();  // File name
+
+                       if (_gdcmFileList.size()==0){
+//EED Borrame                          gdcmFile = new GDCM_NAME_SPACE::File(fileName.c_str());
+                               gdcmFile = GDCM_NAME_SPACE::File::New();
+                               gdcmFile->SetFileName( fileName.c_str() );
+                       } else {
+                               gdcmFile = GDCM_NAME_SPACE::File::New();
+//EED Borrame                          GDCM_NAME_SPACE::DocEntry *entry = im->GetFirstString();
+                               GDCM_NAME_SPACE::DocEntry *entry = im->GetFirstEntry();
+                               while (entry){
+//EED Borrame                                  GDCM_NAME_SPACE::ValEntry *newEntry = new GDCM_NAME_SPACE::ValEntry(entry->GetDictEntry()); 
+                                       GDCM_NAME_SPACE::DocEntry *newEntry = new GDCM_NAME_SPACE::DocEntry(); 
+
+                                       newEntry->Copy(entry);
+                                       gdcmFile->AddEntry(newEntry);
+                                       entry = im->GetNextEntry();
+                               }
+                               gdcmFile->SetFileName( fileName.c_str() );
+                       }
+                       _gdcmFileList.push_back(gdcmFile);
+               }
+               im = _actualSerie->GetNextImage();   
+               iSlice++;
+       }
+*/
+
+       GDCM_NAME_SPACE::File *gdcmFile;
+       int iSlice=0;
+       im = _actualSerie->GetFirstImage();
+       while ( im ) { // on degouline les Images de cette serie
+               if ((iSlice>=_iniSlice) && (iSlice<=_endSlice)){
+                       wxString fileName( rootdir);
+                       fileName=fileName+_T("/");
+                       fileName=fileName + wxString(im->GetEntryString(0x0004, 0x1500).c_str(), wxConvUTF8);  // File name
+
+                       gdcmFile = GDCM_NAME_SPACE::File::New();
+                       gdcmFile->SetFileName( (const char*)(fileName.mb_str()) );
+                       _gdcmFileList.push_back(gdcmFile);
+               }
+               im = _actualSerie->GetNextImage();   
+               iSlice++;
+       }
+
+
+       GDCM_NAME_SPACE::SerieHelper *serieHelper = GDCM_NAME_SPACE::SerieHelper::New();
+    serieHelper->OrderFileList( &_gdcmFileList );
+       delete serieHelper;
+
+       if (getParameters( )->getInvestSliceOrder()==true){
+               GDCM_NAME_SPACE::File *tmpGdcmFile;
+               int i,size=_gdcmFileList.size();
+               for (i=0, size=_gdcmFileList.size()-1 ; i<=size; i++, size--){
+                       tmpGdcmFile=_gdcmFileList[i];
+                       _gdcmFileList[i]=_gdcmFileList[size];
+                       _gdcmFileList[size]=tmpGdcmFile;
+               }
+       }
+
+       if ( !SerieVerification( &_gdcmFileList ) ){
+               wxMessageDialog *msg = new wxMessageDialog(NULL, _T("This series doesn't look like a good series for Maracas.\nDo you want to continue?"), _T("Warning"), wxOK | wxCANCEL );
+               msg->ShowModal();
+               delete msg;
+       }
+
+}
+
+//-------------------------------------------------------------------------
+void marGdcmDicom::loadActualSerie( wxGauge* gauge)
+{
+  loadVolume( true , gauge);
+}
+
+// -------------------------------------------------------------------------
+void marGdcmDicom::loadVolume( bool force , wxGauge *gauge)
+{
+
+       PrepareLoadVolumeDispers();
+       loadImage(0);
+
+/*
+       int i;
+       int dim[3];
+    vtkImageData *vol = getVolume( )->castVtk();
+       vol->GetDimensions(dim);        
+       for (i=0; i<dim[2]; i++){
+               loadImage(i);
+       }
+*/
+
+/* EED Borrame 
+  vtkGdcmReader *gdcmReader = NULL;
+
+  if( force || !getVolume() ){
+    freeVolume( );
+    CreateSerieHelper();
+       ExtactSpacing();
+       ExtactInterceptSlope();
+       GDCM_NAME_SPACE::File *gdcmFile;
+       GDCM_NAME_SPACE::GdcmFileList *lstGdcmFile = _serieHelper->GetFirstCoherentFileList();
+       gdcmReader = vtkGdcmReader::New();
+    int i;
+       for ( i=0;i<lstGdcmFile->size();i++){
+               gdcmFile = (*lstGdcmFile)[i];
+               gdcmReader->AddFileName( gdcmFile->GetFileName().c_str() );
+       }
+    gdcmReader->UpdateWholeExtent();
+    gdcmReader->Update();
+  } // fi
+
+  marProgressObserver *progressEvent = marProgressObserver::New();
+  progressEvent->FrameGauge = gauge;
+  //gdcmReader->AddObserver( vtkCommand::ProgressEvent, progressEvent);
+  progressEvent->Delete();
+
+  //To simplyfy calculation later I turn Origin to (0, 0, 0)
+  //this shouldn't be 'trop grave'
+  vtkImageChangeInformation *change = vtkImageChangeInformation::New();
+
+  change->SetInput( gdcmReader->GetOutput() );
+  change->SetOutputOrigin( 0, 0, 0);
+  
+  //Our algorithm are made based on unsigned short pixel/voxel:
+  //We need to cast our imagedata
+  vtkImageCast *cast = vtkImageCast::New();
+  cast->SetInput( change->GetOutput() );
+  cast->SetOutputScalarTypeToUnsignedShort();
+  cast->Update(); //important
+  
+  //FIXME: kVolume doesn't need to be -again- matrix rotated (done in vtkGdcmReader)!!
+  kVolume *volume = new kVolume( cast->GetOutput() );
+  SetVolume(volume);
+
+  //!\todo thanks
+  if(gdcmReader) gdcmReader->Delete();
+  cast->Delete();
+  change->Delete();
+*/
+}
+
+// -------------------------------------------------------------------------
+void marGdcmDicom::reset( ){
+       freeVolume( );
+       Cleaning_gdcmFileList();
+       if(_dicomDir) {
+               _dicomDir->Delete();
+       }
+       _dicomDir = NULL;
+}
+
+// -------------------------------------------------------------------------
+wxString marGdcmDicom::GetPatientName(){
+       GDCM_NAME_SPACE::File *gdcmFile=_gdcmFileList[0];
+       return wxString( wxString(gdcmFile->GetEntryString(0x0010,0x0010).c_str(), wxConvUTF8)  ).Trim();//0010 0010 PN PAT Patient Name
+}
+
+// -------------------------------------------------------------------------
+void marGdcmDicom::copyFrom( const marObject& from )
+{ //!\todo TODO
+}
+
+// -------------------------------------------------------------------------
+bool marGdcmDicom::save( std::ofstream& os )
+{
+/*  int s = _actualStudy.length( );
+
+  os.write( ( const char* )&s, sizeof( int ) );
+  os.write( ( char* )_actualStudy.c_str( ), s * sizeof( char ) );
+
+  s = _actualSerie.length( );
+
+  os.write( ( const char* )&s, sizeof( int ) );
+  os.write( ( char* )_actualSerie.c_str( ), s * sizeof( char ) );*/
+
+       for(std::vector<SerieInfo>::iterator it1 = m_DicomInfo.begin(); 
+        it1 != m_DicomInfo.end(); it1++ )
+    {
+      for(std::vector<wxArrayString>::iterator it2 = it1->begin(); 
+            it2 != it1->end(); it2++ )
+        {
+            for(int i=0; i<it2->GetCount(); i++)
+              {
+                //wxString temp( it2->Item(i) );
+                os << it2->Item(i); //temp;
+              }
+        }
+    }
+
+  return( true );
+}
+
+// -------------------------------------------------------------------------
+bool marGdcmDicom::load( std::ifstream& is )
+{
+/*  int s;
+
+  reset( );
+
+  is.read( ( char* )&s, sizeof( int ) );
+  _actualStudy.resize( s );
+  is.read( ( char* )_actualStudy.c_str( ), s * sizeof( char ) );
+  is.read( ( char* )&s, sizeof( int ) );
+  _actualSerie.resize( s );
+  is.read( ( char* )_actualSerie.c_str( ), s * sizeof( char ) );*/
+
+  for(std::vector<SerieInfo>::iterator it1 = m_DicomInfo.begin(); 
+        it1 != m_DicomInfo.end(); it1++ )
+    {
+      for(std::vector<wxArrayString>::iterator it2 = it1->begin(); 
+            it2 != it1->end(); it2++ )
+        {
+            for(int i=0; i<it2->GetCount(); i++)
+              {
+                std::string temp;
+                is >> temp ;
+                it2->Add( wxString(temp.c_str(), wxConvUTF8) );
+              }
+        }
+    }
+
+  return( true );
+}
+
+
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+
+marGdcmDicomILPD::marGdcmDicomILPD( marParameters* p  )
+: marGdcmDicom(p)
+{
+}
+// -------------------------------------------------------------------------
+void marGdcmDicomILPD::CreateSerieHelper()
+{
+       GDCM_NAME_SPACE::File *gdcmFile;
+       Cleaning_gdcmFileList();
+       int i,max=_lstString.size();
+       for (i=0;i<max;i++)
+       {
+               if (_gdcmFileList.size()==0){
+                       gdcmFile = GDCM_NAME_SPACE::File::New();
+                       gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_ALL);
+                       gdcmFile->SetFileName( _lstString[i] -> c_str() );
+                       bool ok = gdcmFile->Load();
+               } else {
+                       gdcmFile = GDCM_NAME_SPACE::File::New();
+                       gdcmFile->SetFileName( _lstString[i] -> c_str() );
+               }
+               _gdcmFileList.push_back(gdcmFile);
+       }
+
+}
+// -------------------------------------------------------------------------
+
+
+
+
+
diff --git a/lib/maracasVisuLib/src/kernel/marGdcmDicom.h b/lib/maracasVisuLib/src/kernel/marGdcmDicom.h
new file mode 100644 (file)
index 0000000..7d3b493
--- /dev/null
@@ -0,0 +1,148 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marGdcmDicom.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __MAR__KERNEL__MARGDCMDICOM__HXX__
+#define __MAR__KERNEL__MARGDCMDICOM__HXX__
+
+#include <vector>
+#include <string>
+
+#include <wx/string.h>
+#include <wx/gauge.h>
+
+
+
+#include "gdcmDicomDir.h"
+#include "gdcmSerieHelper.h" 
+#include "gdcmDicomDirPatient.h"
+#include "gdcmDicomDirStudy.h"
+#include "gdcmDicomDirSerie.h"
+#include "gdcmDicomDirImage.h"
+#include "marDicomBase.h"
+
+
+
+
+
+typedef std::vector<wxArrayString> SerieInfo;  //DICOM info for each serie
+/**
+ * Shouldn't we break the dependencies to wx ???
+ * 
+ * We use vector instead of list for efficiency: for access time
+ * futhermore the number of patient is not changing a lot, so we 
+ * might add the number of patient to params.dat, to allocate the right 
+ * number of vector
+ *
+ */
+
+// EED
+// class MAR_KERNEL_EXPORT marGdcmDicom : public marObject
+
+
+class marGdcmDicom : public marFilesBase
+{
+  public:
+
+    marGdcmDicom( marParameters* p = NULL );
+
+    ~marGdcmDicom( ){
+           reset( );
+    }
+
+    void loadActualSerie(wxGauge* gauge );
+    void loadVolume( bool force = false, wxGauge* gauge = NULL);
+       void PrepareLoadVolumeDispers();
+       virtual bool loadImage(int i);
+       bool loadFileDicom(void* p_vol,int *dim,char *namefile);
+
+
+    /** 
+     * General methods
+     */
+    void reset( );
+       void Cleaning_gdcmFileList();
+
+    void copyFrom( const marObject& from );
+    /**
+     * Persistence methods
+     */
+    bool save( std::ofstream& os );
+    bool load( std::ifstream& is );
+
+       void CreateDicomFile( );
+    void FillDicomInfo(bool parseDir);
+    
+    wxString GetPatientName();
+       
+       GDCM_NAME_SPACE::DicomDir* getGdcmDicomDir();
+
+       GDCM_NAME_SPACE::DicomDirStudy* getActualStudy();
+
+       void setActualPatient(GDCM_NAME_SPACE::DicomDirPatient *patient);
+       void setActualStudy(GDCM_NAME_SPACE::DicomDirStudy *study);
+       void setActualSerie(GDCM_NAME_SPACE::DicomDirSerie *serie);
+
+       void setIniSlice(int iniSlice);
+       void setEndSlice(int endSlice);
+
+       GDCM_NAME_SPACE::DicomDirSerie *getActualSerie();
+
+
+  private:
+
+
+    std::vector< SerieInfo > m_DicomInfo;
+       GDCM_NAME_SPACE::DicomDir                       *_dicomDir;
+       GDCM_NAME_SPACE::DicomDirPatient        *_actualPatient;
+       GDCM_NAME_SPACE::DicomDirStudy          *_actualStudy;
+       GDCM_NAME_SPACE::DicomDirSerie          *_actualSerie;
+       GDCM_NAME_SPACE::DicomDirImage          *_actualImage;
+
+       int _iniSlice;
+       int _endSlice;
+
+       virtual void CreateSerieHelper();
+       void CreateEmptyVoxel();
+       void ExtactSpacing();
+       void ExtactInterceptSlope();
+
+       bool SerieVerification(  GDCM_NAME_SPACE::FileList *gdcmFileList  );
+       bool SerieVerificationEqImageSize(  GDCM_NAME_SPACE::FileList *gdcmFileList  );
+//     bool SerieVerificationEqImageOrientation(  GDCM_NAME_SPACE::GdcmFileList *gdcmFileList  );
+
+
+
+  protected:
+       GDCM_NAME_SPACE::FileList               _gdcmFileList; 
+
+};
+
+
+//-------------------------------------------------------------------
+
+class marGdcmDicomILPD : public marGdcmDicom
+{
+public:
+       marGdcmDicomILPD( marParameters* p = NULL );
+private:
+       virtual void CreateSerieHelper();
+protected:
+};
+
+//-------------------------------------------------------------------
+
+#endif // __MAR__KERNEL__MARGDCMDICOM__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marImageData.cpp b/lib/maracasVisuLib/src/kernel/marImageData.cpp
new file mode 100644 (file)
index 0000000..de4273f
--- /dev/null
@@ -0,0 +1,133 @@
+/*=========================================================================
+
+
+=========================================================================*/
+#include "marImageData.h"
+
+// ----------------------------------------------------------------------------------------------
+marImageData::marImageData(vtkImageData *imagedata)
+{
+       _spcOriginal[0] = 1;
+       _spcOriginal[1] = 1;
+       _spcOriginal[2] = 1;
+       _voiOriginal[0] = 0;
+       _voiOriginal[1] = 0;
+       _voiOriginal[2] = 0;
+       _voiOriginal[3] = 0;
+       _voiOriginal[4] = 0;
+       _voiOriginal[5] = 0;
+       AddImageData(imagedata);
+}
+// ----------------------------------------------------------------------------------------------
+marImageData::~marImageData()
+{
+       int i,size=_imagedataLST.size();
+       for (i=0;i<size;i++)
+       {
+               _imagedataLST[i]->Delete();
+       }
+       _imagedataLST.clear();
+}
+
+// ----------------------------------------------------------------------------------------------
+void marImageData::SetSpcOriginal(double spc[3])
+{
+       this->_spcOriginal[0]=spc[0];
+       this->_spcOriginal[1]=spc[1];
+       this->_spcOriginal[2]=spc[2];
+}
+// ----------------------------------------------------------------------------------------------
+void marImageData::SetVoiOriginal(int voi[6])
+{
+       int i;
+       for (i=0;i<6;i++)
+       {
+               this->_voiOriginal[i] = voi[i];
+       }
+}
+// ----------------------------------------------------------------------------------------------
+void marImageData::AddImageData(vtkImageData *imagedata)
+{
+       if (imagedata!=NULL){
+               _imagedataLST.push_back( imagedata );
+       }
+}
+// ----------------------------------------------------------------------------------------------
+void marImageData::GetSpcOriginal(double spc[3])
+{
+       spc[0] = this->_spcOriginal[0];
+       spc[1] = this->_spcOriginal[1];
+       spc[2] = this->_spcOriginal[2];
+}
+// ----------------------------------------------------------------------------------------------
+void marImageData::GetVoiOriginal(int voi[6])
+{
+       int i;
+       for (i=0;i<6;i++)
+       {
+               voi[i] = this->_voiOriginal[i];
+       }
+}
+// ----------------------------------------------------------------------------------------------
+vtkImageData *marImageData::GetImageDataT(int t)
+{
+       return _imagedataLST[t];
+}
+// ----------------------------------------------------------------------------------------------
+vtkImageData *marImageData::GetImageData()
+{
+       return _imagedataLST[0];
+}
+// ----------------------------------------------------------------------------------------------
+int marImageData::GetXOriginal(int value)
+{
+       double min=_spcOriginal[0];
+       if (_spcOriginal[1]<min)
+       {
+               min = _spcOriginal[1];
+       }
+       if (_spcOriginal[2]<min)
+       {
+               min = _spcOriginal[2];
+       }
+       double result = value / (  _spcOriginal[0] / min ) ;
+       result=result + _voiOriginal[0];
+       return (int)result;
+}
+// ----------------------------------------------------------------------------------------------
+int marImageData::GetYOriginal(int value)
+{
+       double min=_spcOriginal[0];
+       if (_spcOriginal[1]<min)
+       {
+               min = _spcOriginal[1];
+       }
+       if (_spcOriginal[2]<min)
+       {
+               min = _spcOriginal[2];
+       }
+       double result = value / (  _spcOriginal[1] / min ) ;
+       result=result + _voiOriginal[2];
+       return (int)result;
+}
+// ----------------------------------------------------------------------------------------------
+int marImageData::GetZOriginal(int value)
+{
+       double min=_spcOriginal[0];
+       if (_spcOriginal[1]<min)
+       {
+               min = _spcOriginal[1];
+       }
+       if (_spcOriginal[2]<min)
+       {
+               min = _spcOriginal[2];
+       }
+       double result = value / (  _spcOriginal[2] / min ) ;
+       result=result + _voiOriginal[4];
+       return (int)result;
+}
+// ----------------------------------------------------------------------------------------------
+int marImageData::GetMaxT()
+{
+       return _imagedataLST.size();
+}
diff --git a/lib/maracasVisuLib/src/kernel/marImageData.h b/lib/maracasVisuLib/src/kernel/marImageData.h
new file mode 100644 (file)
index 0000000..32cc068
--- /dev/null
@@ -0,0 +1,45 @@
+/*=========================================================================
+
+  */
+
+#ifndef __MAR_IMAGE_DATA__h
+#define __MAR_IMAGE_DATA__h
+
+#include <vector>
+
+#include "vtkImageData.h"
+
+class marImageData
+{
+public:
+       marImageData(vtkImageData *imagedata);
+       ~marImageData();
+
+       void SetSpcOriginal(double spc[3]);
+       void SetVoiOriginal(int voi[6]);
+       void AddImageData(vtkImageData *imagedata);
+
+       void GetSpcOriginal(double spc[3]);
+       void GetVoiOriginal(int voi[6]);
+       vtkImageData *GetImageData();
+       vtkImageData *GetImageDataT(int t);
+       int GetMaxT();
+
+       int GetXOriginal(int value);
+       int GetYOriginal(int value);
+       int GetZOriginal(int value);
+
+private:
+       double                                          _spcOriginal[3];
+       int                                                     _voiOriginal[6];
+       std::vector<vtkImageData *> _imagedataLST;
+//     vtkImageData            *_imagedata;
+protected:
+
+};
+
+
+
+#endif   //  __MAR_IMAGE_DATA__h
+
+
diff --git a/lib/maracasVisuLib/src/kernel/marInterface.cpp b/lib/maracasVisuLib/src/kernel/marInterface.cpp
new file mode 100644 (file)
index 0000000..0c64586
--- /dev/null
@@ -0,0 +1,227 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marInterface.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:55 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#pragma warning ( disable : 4251 )
+#endif //_MSC_VER
+
+#include "marInterface.h"
+#include <wx/file.h>
+#include <wx/log.h>
+
+
+
+
+// ----------------------------------------------------------------------------
+marInterface::marInterface( )
+: _parameters( NULL ), _dicom( NULL ),
+_experiment( NULL )
+{
+       m_paramFileName=MAR_DEFAULT_FILE_PARAMETERS;
+    _parameters = new marParameters( );
+//EED    _dicom = new marGdcmDicom( _parameters );
+    _experiment = new marExperiment( _parameters );
+       
+    // loadParameters( ); //PS !!! dangereux de faire des opérations d'E/S 
+       // dans des constructeurs
+}
+
+// ----------------------------------------------------------------------------
+marInterface::~marInterface( ){
+    reset( );
+}
+
+// ----------------------------------------------------------------------------
+bool marInterface::loadParameters( std::string pFile )
+{
+       std::ifstream is( pFile.c_str( ),std::ios::binary|std::ios::in);
+
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Loading parameters from file ") 
+//             + wxString(pFile.c_str()));
+       
+       if( is==NULL )
+       {
+               wxString errorMsg;
+               errorMsg= wxString(_T("Error : Cannot open file "))
+                               + wxString( pFile.c_str(), wxConvUTF8 )
+                               + wxString(_T(" to load parameters"));
+//EEDxx2.4 DEBuG
+//             wxLogDebug(errorMsg);
+               return (false);
+       }
+       _parameters->reset( );
+       if (_parameters->load( is ))
+       {
+               is.close( );
+               return( true );
+       }
+       else
+       {
+               is.close();
+//EEDxx2.4 DEBuG
+//             wxLogDebug(wxString("Error : Cannot load parameters from file ")
+//                             + wxString(pFile.c_str())
+//                             + wxString(": file may be corrupted"));
+               return (false);
+       }
+}
+
+// ----------------------------------------------------------------------------
+bool marInterface::saveParameters( std::string pFile )
+{
+       std::ofstream os(pFile.c_str( ),std::ios::binary | std::ios::out);
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Saving parameters to file ") 
+//                     + wxString(pFile.c_str()));
+       
+       
+       if( os==NULL )
+       {
+               wxString errorMsg;
+               errorMsg= wxString(_T("Error : Cannot open file "))
+                               + wxString(pFile.c_str(), wxConvUTF8)
+                               + wxString(_T(" to save parameters"));
+//EEDxx2.4 DEBuG
+//             wxLogDebug(errorMsg);
+               return( false );
+       }
+       if(_parameters->save( os ))
+       {
+               os.close( );
+               return( true );
+       }
+       else
+       {
+               os.close();
+//EEDxx2.4 DEBuG
+//             wxLogDebug(wxString("Error : Cannot save parameters to file ")
+//                             + wxString(pFile.c_str()));
+               return (false);
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+bool marInterface::initExperiment( )
+{
+    _experiment->reset( );
+    _experiment->initExperiment( _dicom->getVolume( ) );
+    return( true );
+       
+}
+// ----------------------------------------------------------------------------
+bool marInterface::saveExperiment( std::string nFile )
+{
+       std::ofstream os( nFile.c_str( ),std::ios::binary | std::ios::out );
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Saving experiment to file ") 
+//                     + wxString(nFile.c_str()));
+       
+       wxString errorMsg;
+       errorMsg= wxString(_T("Cannot open file "))
+                       + wxString(nFile.c_str(), wxConvUTF8)
+                       + wxString(_T(" to save experiment"));
+
+       
+    if( os !=NULL ) {
+               
+        _parameters->save( os );
+        _dicom->save( os );
+        _experiment->save( os );
+               os.close( );
+               return( true );
+               
+    } // fi
+//EEDxx2.4 DEBuG
+//     wxLogDebug(errorMsg);
+    return( false );
+}
+
+// ----------------------------------------------------------------------------
+bool marInterface::loadExperiment( std::string nFile )
+{
+       std::ifstream is( nFile.c_str( ) ,std::ios::binary|std::ios::in );
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Loading experiment from file ") 
+//                     + wxString(nFile.c_str()));
+       
+       wxString errorMsg;
+       errorMsg= wxString(_T("Cannot open file "))
+                       + wxString(nFile.c_str(), wxConvUTF8)
+                       + wxString(_T(" to load experiment"));
+       
+    if( is !=NULL) {
+               
+        _parameters->reset( );
+        _dicom->reset( );
+        _experiment->reset( );
+               
+        _parameters->load( is );
+        _dicom->load( is );
+        _experiment->load( is );
+               is.close( );
+               return( true );
+               
+    } // fi
+//EEDxx2.4 DEBuG
+//     wxLogDebug(errorMsg);
+    return( false );
+}
+
+// ----------------------------------------------------------------------------
+void marInterface::reset( )
+{
+    if( _dicom         != NULL ) delete _dicom;
+    if( _experiment != NULL ) delete _experiment;
+    if( _parameters != NULL ) delete _parameters;
+
+    _dicom             = NULL;
+    _experiment = NULL;
+    _parameters = NULL;
+}
+// ----------------------------------------------------------------------------
+void marInterface::SetParamFileName(std::string pFileName) 
+{ 
+       m_paramFileName=pFileName; 
+}
+// ----------------------------------------------------------------------------
+std::string  marInterface::GetParamFileName() 
+{ 
+       return m_paramFileName;  
+}
+// ----------------------------------------------------------------------------
+void marInterface::SetDicom(marFilesBase *dicom) 
+{
+       _dicom=dicom;                            
+}
+
+
+// eof - interface.cxx
+
+
+/* EED
+void marInterface::SetVolumeData(int dimX,int dimY,int dimZ, float spacingX, float spacingY, float spacingZ, unsigned short * pixels)
+{
+       if (_dicom!=NULL)
+               _dicom->SetVolumeData(dimX,dimY,dimZ,spacingX,spacingY,spacingZ,pixels);
+}
+*/
+
diff --git a/lib/maracasVisuLib/src/kernel/marInterface.h b/lib/maracasVisuLib/src/kernel/marInterface.h
new file mode 100644 (file)
index 0000000..c25c5b9
--- /dev/null
@@ -0,0 +1,63 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marInterface.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__INTERFACE__HXX__
+#define __MAR__KERNEL__INTERFACE__HXX__
+
+//#include "marDicom.h"
+#include "marDicomBase.h"
+#include "marKVolume.h"
+#include "marExperiment.h"
+
+class MAR_KERNEL_EXPORT marInterface
+{
+  public:
+
+    marInterface( );
+    ~marInterface( );
+
+    bool loadParameters( std::string pFile );
+    bool saveParameters( std::string pFile );
+
+    bool loadParameters( ) {return loadParameters(m_paramFileName);}
+    bool saveParameters( ) {return saveParameters(m_paramFileName);}
+
+    bool initExperiment( );
+
+    bool saveExperiment( std::string nFile );
+//    bool loadExperiment( wxString nFile );
+    bool loadExperiment( std::string nFile );
+
+    void reset( );
+
+       void            SetParamFileName(std::string pFileName); 
+       std::string GetParamFileName();
+       void            SetDicom(marFilesBase *dicom);
+
+//EED    void SetVolumeData(int dimX,int dimY,int dimZ, float spacingX, float spacingY, float spacingZ, unsigned short * pixels);
+//             marDicom*               _dicom;
+//EED   marGdcmDicom*  _dicom;
+
+    marFilesBase*              _dicom;
+
+    marExperiment*     _experiment;
+    marParameters*     _parameters;
+
+protected:
+       std::string m_paramFileName;
+};
+
+#endif // __MAR__KERNEL__INTERFACE__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marInterfaceCT.cpp b/lib/maracasVisuLib/src/kernel/marInterfaceCT.cpp
new file mode 100644 (file)
index 0000000..4ae171c
--- /dev/null
@@ -0,0 +1,506 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marInterfaceCT.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:55 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+=========================================================================*/
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#pragma warning ( disable : 4251 )
+#endif //_MSC_VER
+
+#include "marInterfaceCT.h"
+#include <wx/file.h>
+#include <wx/log.h>
+
+
+
+
+// ----------------------------------------------------------------------------
+marInterfaceCT::marInterfaceCT( )
+: _parameters( NULL ), _dicom( NULL ),
+_experiment( NULL )
+{
+       m_paramFileName=MAR_DEFAULT_FILE_PARAMETERS;
+    _parameters = new marParameters( );
+
+    _experiment = new marExperimentCT( _parameters );
+       
+    
+}
+
+// ----------------------------------------------------------------------------
+marInterfaceCT::~marInterfaceCT( ){
+    reset( );
+}
+
+// ----------------------------------------------------------------------------
+bool marInterfaceCT::loadParameters( std::string pFile )
+{
+       std::ifstream is( pFile.c_str( ),std::ios::binary|std::ios::in);
+
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Loading parameters from file ") 
+//             + wxString(pFile.c_str()));
+       
+       if( is==NULL )
+       {
+               wxString errorMsg;
+               errorMsg= wxString(_T("Error : Cannot open file "))
+                               + wxString((wxChar*)pFile.c_str(), wxConvUTF8)
+                               + wxString(_T(" to load parameters"));
+//EEDxx2.4 DEBuG
+//             wxLogDebug(errorMsg);
+               return (false);
+       }
+       _parameters->reset( );
+       if (_parameters->load( is ))
+       {
+               is.close( );
+               return( true );
+       }
+       else
+       {
+               is.close();
+//EEDxx2.4 DEBuG
+//             wxLogDebug(wxString("Error : Cannot load parameters from file ")
+//                             + wxString(pFile.c_str())
+//                             + wxString(": file may be corrupted"));
+               return (false);
+       }
+}
+
+// ----------------------------------------------------------------------------
+bool marInterfaceCT::saveParameters( std::string pFile )
+{
+       std::ofstream os(pFile.c_str( ),std::ios::binary | std::ios::out);
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Saving parameters to file ") 
+//                     + wxString(pFile.c_str()));
+       
+       
+       if( os==NULL )
+       {
+               wxString errorMsg;
+               errorMsg= wxString(_T("Error : Cannot open file "))
+                               + wxString( (wxChar*)pFile.c_str(), wxConvUTF8)
+                               + wxString(_T(" to save parameters"));
+//EEDxx2.4 DEBuG
+//             wxLogDebug(errorMsg);
+               return( false );
+       }
+       if(_parameters->save( os ))
+       {
+               os.close( );
+               return( true );
+       }
+       else
+       {
+               os.close();
+//EEDxx2.4 DEBuG
+//             wxLogDebug(wxString("Error : Cannot save parameters to file ")
+//                             + wxString(pFile.c_str()));
+               return (false);
+       }
+
+}
+
+// ----------------------------------------------------------------------------
+bool marInterfaceCT::initExperiment( )
+{
+    _experiment->reset( );
+    _experiment->initExperiment( _dicom->getVolume( ) );
+    return( true );
+       
+}
+// ----------------------------------------------------------------------------
+bool marInterfaceCT::saveExperiment( std::string nFile )
+{
+       std::ofstream os( nFile.c_str( ),std::ios::binary | std::ios::out );
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Saving experiment to file ") 
+//                     + wxString(nFile.c_str()));
+       
+       wxString errorMsg;
+       errorMsg= wxString(_T("Cannot open file "))
+                       + wxString((wxChar*)nFile.c_str(), wxConvUTF8)
+                       + wxString(_T(" to save experiment"));
+
+       
+    if( os !=NULL ) {
+               
+        _parameters->save( os );
+        _dicom->save( os );
+        _experiment->save( os );
+               os.close( );
+               return( true );
+               
+    } // fi
+//EEDxx2.4 DEBuG
+//     wxLogDebug(errorMsg);
+    return( false );
+}
+
+// ----------------------------------------------------------------------------
+bool marInterfaceCT::loadExperiment( std::string nFile )
+{
+       std::ifstream is( nFile.c_str( ) ,std::ios::binary|std::ios::in );
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug(wxString("Loading experiment from file ") 
+//                     + wxString(nFile.c_str()));
+       
+       wxString errorMsg;
+       errorMsg= wxString(_T("Cannot open file "))
+                       + wxString((wxChar*)nFile.c_str(), wxConvUTF8)
+                       + wxString(_T(" to load experiment"));
+       
+    if( is !=NULL) {
+               
+        _parameters->reset( );
+        _dicom->reset( );
+        _experiment->reset( );
+               
+        _parameters->load( is );
+        _dicom->load( is );
+        _experiment->load( is );
+               is.close( );
+               return( true );
+               
+    } // fi
+//EEDxx2.4 DEBuG
+//     wxLogDebug(errorMsg);
+    return( false );
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::reset( ){
+    if( _experiment != NULL ) delete _experiment;
+    if( _dicom != NULL ) delete _dicom;
+    if( _parameters != NULL ) delete _parameters;
+    _experiment = NULL;
+    _dicom = NULL;
+    _parameters = NULL;
+}
+// ----------------------------------------------------------------------------
+void marInterfaceCT::SetParamFileName(std::string pFileName) { 
+       m_paramFileName=pFileName; 
+}
+// ----------------------------------------------------------------------------
+std::string  marInterfaceCT::GetParamFileName() { 
+       return m_paramFileName;  
+}
+// ----------------------------------------------------------------------------
+void marInterfaceCT::SetDicom(marFilesBase *dicom) {
+       _dicom=dicom;                            
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::appendAxis( marAxis* ax )
+{
+    _experiment->appendAxis(ax);
+}
+
+
+// ----------------------------------------------------------------------------
+marAxisCT* marInterfaceCT::getAxis( int i ) {
+       return (marAxisCT *) _experiment->getAxis(i);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::setAxis( int i )
+{
+   _experiment->setAxis(i);
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getQuantStart( ) {
+       return _experiment->getQuantStart( );
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getQuantFinish( ) {
+       return _experiment->getQuantFinish( );
+}
+// ----------------------------------------------------------------------------
+void marInterfaceCT::prepareQuantification( ) {
+       _experiment->prepareQuantification( );
+}
+
+
+// ----------------------------------------------------------------------------
+vtkImageData* marInterfaceCT::getSliceImage( int i ) {
+       return _experiment->getSliceImage( i );
+}
+
+// ----------------------------------------------------------------------------
+vtkProbeFilter*        marInterfaceCT::get3DSlice( int i ) {
+       return _experiment->get3DSlice( i );
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::getTotalLength( ) {
+       return _experiment->getTotalLength( );
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::getSubAxisLength( ) {
+       return _experiment->getSubAxisLength( );
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::getReferenceArea( ) {
+               return _experiment->getReferenceArea( );
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::getReferenceAverDiam() {
+       return _experiment->getReferenceAverDiam( );
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::getAverageArea(int pIni, int pEnd) {
+       return _experiment->getAverageArea(pIni,pEnd);
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getNumberOfSlices( ) {
+       return _experiment->getNumberOfSlices( );
+}
+
+// ----------------------------------------------------------------------------        
+int marInterfaceCT::getActualQuant( ) {
+       return _experiment->getAxis()->getActualQuant();
+}
+
+// ----------------------------------------------------------------------------
+marExperimentCT* marInterfaceCT::GetExperiment()
+{
+       return _experiment;
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getHealthySlice( ) {
+       return _experiment->getAxis( )->getHealthySlice( );
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getHealthySliceStart( ) {
+       return _experiment->getAxis()->getHealthySliceStart( );
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getHealthySliceEnd( ) {
+       return _experiment->getAxis()->getHealthySliceEnd( );
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::setHealthySlice( int hsS, int hs, int hsE ) {
+       _experiment->getAxis()->setHealthySlice(hsS,hs,hsE);
+       
+}
+// ----------------------------------------------------------------------------
+void marInterfaceCT::setActualQuant(int act) {
+       _experiment->getAxis()->setActualQuant( act ) ;
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::replaceContour2D(int i,int size,double *vx,double *vy) {
+       _experiment->getAxis()->replaceContour2D(i,size,vx,vy);
+}
+
+void marInterfaceCT::replaceContour2D(int size,double *vx,double *vy, int type)
+{
+       _experiment->replaceContour2D(size,vx,vy,type);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::EraseContour( int i ) {
+       _experiment->getAxis()->EraseContour( i );
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::ClearContours() {
+       _experiment->ClearContours();
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::RegenerateAxis() {
+       _experiment->RegenerateAxis();
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::RegenerateSignal() {
+       _experiment->RegenerateSignal();
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::RecalculateAxis() {
+       _experiment->RegenerateAxis();
+}
+
+// ----------------------------------------------------------------------------        
+void marInterfaceCT::getMinMax( double& min, double& max ) {
+       _experiment->getDynData( )->getVolume( )->getMinMax( min, max );
+}
+
+// ----------------------------------------------------------------------------        
+marContour* marInterfaceCT::getContour( int point, int contour ) {
+       return _experiment->getContour(point,contour);
+}
+
+// ----------------------------------------------------------------------------        
+vtkPoints*     marInterfaceCT::get3Dcontour( int point, int contour ) {
+       return _experiment->get3Dcontour(point,contour);
+}
+
+// ----------------------------------------------------------------------------        
+vtkPolyData* marInterfaceCT::get2Dcontour( int point, int contour ) {
+       return _experiment->get2Dcontour(point,contour);
+}
+
+// ----------------------------------------------------------------------------        
+vtkPoints* marInterfaceCT::get2DDiameterMin( int point, int contour ) {
+       return _experiment->get2DDiameterMin(point,contour);
+}
+
+// ----------------------------------------------------------------------------        
+vtkPoints* marInterfaceCT::get2DDiameterMax( int point, int contour ) {
+       return _experiment->get2DDiameterMax(point,contour);
+}
+
+// ----------------------------------------------------------------------------        
+marParameters* marInterfaceCT::getParameters(){
+       return _parameters;
+}
+// ----------------------------------------------------------------------------        
+marDynData* marInterfaceCT::getDynData(){
+       return  _experiment->getDynData();
+}
+
+// ----------------------------------------------------------------------------        
+int marInterfaceCT::getNumberOfContours(int point) {
+       return _experiment->getNumberOfContours(point);
+}
+
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::updateLumenPercentage(int percentage) {
+       _experiment->updateLumenPercentage(percentage);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::updateCalcPercentage(int percentage) {
+       _experiment->updateCalcPercentage(percentage);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::updateDiscontinuityThreshold(int percentage) {
+       _experiment->updateDiscontinuityThreshold(percentage);
+       //TODO HACER RESET DEL CONTORNO
+}
+
+// ----------------------------------------------------------------------------
+int marInterfaceCT::getContourType(int point, int index)
+{
+       return _experiment->getContourType(point,index);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::histogram(int point)
+{
+       _experiment->histogram(point);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::setCalibration(bool calib)
+{
+       _experiment->setCalibration(calib);
+}
+
+// ----------------------------------------------------------------------------
+bool marInterfaceCT::getCalibration()
+{
+       return _experiment->getCalibration();
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::ClearContoursPartial(int start)
+{
+       _experiment->ClearContoursPartial(start);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::setStartIndex(int start)
+{
+       _experiment->setStartIndex(start);
+}
+
+// ----------------------------------------------------------------------------
+int    marInterfaceCT::getPointSize()
+{
+       return _experiment->getPointSize();
+}
+
+// ----------------------------------------------------------------------------
+marPoint* marInterfaceCT::getPoint(int i)
+{
+       return _experiment->getPoint(i);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::markUpLumen(int point)
+{
+       _experiment->markUpLumen(point);
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::generateFile()
+{
+       _experiment->generateFile();
+}
+
+// ----------------------------------------------------------------------------
+void marInterfaceCT::cleanContours(int type)
+{
+       _experiment->cleanContours(type);
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour* marInterfaceCT::loadMarIsocontour(int size, double *vx, double *vy)
+{
+       return _experiment->loadMarIsocontour(size,vx,vy);
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::performXOR(int type, std::vector<marIsocontour*> manual)
+{
+       return _experiment->performXOR(type, manual);
+}
+
+// ----------------------------------------------------------------------------
+double marInterfaceCT::performAND(int type, std::vector<marIsocontour*> manual)
+{
+       return _experiment->performAND(type, manual);
+}
+
+
+double marInterfaceCT::performUnion(int type, std::vector<marIsocontour*> manual)
+{
+       return _experiment->performUnion(type, manual);
+}
+// eof - marInterfaceCT.cxx
+
+
diff --git a/lib/maracasVisuLib/src/kernel/marInterfaceCT.h b/lib/maracasVisuLib/src/kernel/marInterfaceCT.h
new file mode 100644 (file)
index 0000000..0b83a25
--- /dev/null
@@ -0,0 +1,145 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marInterfaceCT.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__INTERFACECT__HXX__
+#define __MAR__KERNEL__INTERFACECT__HXX__
+
+//#include "marDicom.h"
+#include "marDicomBase.h"
+#include "marKVolume.h"
+#include "marExperimentCT.h"
+#include "marAxisCT.h"
+#include "marDynData.h"
+
+
+
+
+class MAR_KERNEL_EXPORT marInterfaceCT
+{
+  public:
+
+    marInterfaceCT( );
+    ~marInterfaceCT( );
+
+    bool loadParameters( std::string pFile );
+    bool saveParameters( std::string pFile );
+
+    bool loadParameters( ) {return loadParameters(m_paramFileName);}
+    bool saveParameters( ) {return saveParameters(m_paramFileName);}
+
+    bool initExperiment( );
+
+    bool saveExperiment( std::string nFile );
+//    bool loadExperiment( wxString nFile );
+    bool loadExperiment( std::string nFile );
+
+    void reset( );
+
+       void            SetParamFileName(std::string pFileName); 
+       std::string GetParamFileName();
+       void            SetDicom(marFilesBase *dicom);
+       
+       void appendAxis( marAxis* ax );
+       marAxisCT* getAxis( int i = -1 ) ;
+       void setAxis( int i );
+
+       int   getQuantStart( );
+       int   getQuantFinish( );
+
+       void prepareQuantification( );
+
+
+       vtkImageData*           getSliceImage( int i );
+       vtkProbeFilter* get3DSlice( int i );
+       double                  getTotalLength();
+       double                  getSubAxisLength();
+       double                  getReferenceArea();
+       double                  getReferenceAverDiam();
+       double                  getAverageArea(int pIni, int pEnd);
+       int                             getNumberOfSlices( );
+
+       marContour*             getContour( int point, int contour );
+    vtkPoints*         get3Dcontour( int point, int contour );
+    vtkPolyData*       get2Dcontour( int point, int contour );
+    vtkPoints*         get2DDiameterMin( int point, int contour );
+    vtkPoints*         get2DDiameterMax( int point, int contour );
+
+       marParameters*  getParameters();
+       marDynData*             getDynData();
+
+       void getVOI( int* voi ) { _experiment->getVOI(voi); };
+       void setVOI( int* voi ) { _experiment->setVOI(voi); };
+       int getActualQuant( );
+       int getHealthySlice( );
+       int getHealthySliceStart( );
+       int getHealthySliceEnd( );
+       void setHealthySlice( int hsS, int hs, int hsE );
+       void setActualQuant(int act);
+
+       void replaceContour2D(int i,int size,double *vx,double *vy);
+       void replaceContour2D(int size,double *vx,double *vy, int type);
+       void cleanContours(int type);
+       void EraseContour(int i);
+
+       void ClearContours();
+    void RegenerateAxis();
+    void RegenerateSignal();
+    void RecalculateAxis();
+       void ClearContoursPartial(int start);
+       
+       void getMinMax( double& min, double& max );
+
+       int getNumberOfContours(int point);
+
+       void updateLumenPercentage(int percentage);
+       void updateCalcPercentage(int percentage);
+       void updateDiscontinuityThreshold(int percentage);
+       marIsocontour* loadMarIsocontour(int size, double *vx, double *vy);
+       double performXOR(int type, std::vector<marIsocontour*> manual);
+       double performAND(int type, std::vector<marIsocontour*> manual);
+       double performUnion(int type, std::vector<marIsocontour*> manual);
+
+       void histogram(int point) ;
+       
+
+
+
+       int     getContourType(int point, int index);
+       void                            setCalibration(bool calib);
+       bool                            getCalibration();
+       void                            setStartIndex(int start);
+
+       int                                     getPointSize();
+       marPoint*                       getPoint(int i);
+       void                            markUpLumen(int point);
+       void                            generateFile();
+
+       marExperimentCT* GetExperiment();
+
+    marFilesBase*              _dicom;
+       marParameters*          _parameters;
+       
+
+protected:
+       std::string m_paramFileName;
+
+private:
+       marExperimentCT*        _experiment;
+};
+
+#endif // __MAR__KERNEL__INTERFACECT__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marIsocontour.cpp b/lib/maracasVisuLib/src/kernel/marIsocontour.cpp
new file mode 100644 (file)
index 0000000..b0f5e8b
--- /dev/null
@@ -0,0 +1,138 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marIsocontour.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:55 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+
+#include "marIsocontour.h"
+
+// ----------------------------------------------------------------------------
+marIsocontour::marIsocontour() {
+       intmax = -1;
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour::~marIsocontour() {
+       
+       //TODO - SACAR A UTILS
+       for (int ind = 0; ind < listContour.size(); ind++)
+       {
+               marPoint* p = listContour[ind];
+               listContour[ind] = NULL;
+               delete p;
+               
+       }
+       listContour.clear();
+
+}
+
+// ----------------------------------------------------------------------------
+marIsocontour::marIsocontour(double intmax) {
+       this->intmax = intmax;
+}
+       
+// ----------------------------------------------------------------------------
+void marIsocontour::getCG(double *x, double *y) {
+   double sumax = 0;
+   double sumay = 0;
+
+       for (int i = 0; i < listContour.size(); i++){
+               double x, y;
+               getPoint(i, &x, &y);
+               sumax +=x;
+               sumay +=y;
+       }
+
+       sumax /= listContour.size();
+       sumay /= listContour.size();
+
+       *x = (double) sumax;
+       *y = (double) sumay;
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::insertPoint(double x, double y) {
+       marPoint* p = new marPoint(x, y);
+       listContour.push_back(p);
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::getPoint(int i, double *x, double *y) {
+       marPoint* p = listContour[i];
+       *x = p->getX();
+       *y = p->getY();
+
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::setPoint(int i, double x, double y) {
+       marPoint *p = listContour[i];
+       p->setPoint(x, y);
+}
+
+// ----------------------------------------------------------------------------
+int marIsocontour::getSize() {
+       return listContour.size();
+}
+
+// ----------------------------------------------------------------------------
+double marIsocontour::getMaxIntensity() {
+       return intmax;
+}
+
+// ----------------------------------------------------------------------------
+int marIsocontour::getType() {
+       return type;
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::setType(int type) {
+       this->type = type;
+}
+
+// ----------------------------------------------------------------------------
+int marIsocontour::getDir(int i) {
+       marPoint* p = listContour[i];
+       return p->getDirection();
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::setDir(int i, int direction) {
+       marPoint *p = listContour[i];
+       p->setDirection(direction);
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::setInside(int i, bool ins) {
+       marPoint *p = listContour[i];
+       p->setInside(ins);
+}
+
+// ----------------------------------------------------------------------------
+bool marIsocontour::getInside(int i) {
+       marPoint* p = listContour[i];
+       return p->getInside();
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::setMaxIntensity(double intmax) {
+       this->intmax = intmax;
+}
+
+// ----------------------------------------------------------------------------
+void marIsocontour::removeLastPoint() {
+       listContour.pop_back();
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marIsocontour.h b/lib/maracasVisuLib/src/kernel/marIsocontour.h
new file mode 100644 (file)
index 0000000..a5beb2a
--- /dev/null
@@ -0,0 +1,52 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marIsocontour.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__ISOCONTOUR__HXX__
+#define __MAR__KERNEL__ISOCONTOUR__HXX__
+
+#include "marPoint.h"
+#include <vector>
+
+class MAR_KERNEL_EXPORT  marIsocontour
+{
+public:
+       marIsocontour();
+       marIsocontour(double intmax);
+       virtual ~marIsocontour();
+
+       void getCG(double *x, double *y);
+       void insertPoint(double x, double y);
+       void getPoint(int i, double *x, double *y);
+       void setPoint(int i, double x, double y);
+       int getSize();
+       double getMaxIntensity();
+       void setMaxIntensity(double intmax);
+       int getType();
+       void setType(int type);
+       int getDir(int i);
+       void setDir(int i, int direction);
+       void setInside(int i, bool ins);
+       bool getInside(int i);
+       void removeLastPoint();
+       
+
+private:
+       std::vector<marPoint *> listContour;
+       double intmax;
+       int type;
+};
+
+#endif // __MAR__KERNEL__ISOCONTOUR__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marKVolume.cpp b/lib/maracasVisuLib/src/kernel/marKVolume.cpp
new file mode 100644 (file)
index 0000000..0a43a11
--- /dev/null
@@ -0,0 +1,60 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marKVolume.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:55 $
+ Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+/* EED Borrame
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#pragma warning ( disable : 4251 )
+#endif //_MSC_VER
+*/
+
+#include "marKVolume.h"
+
+// -------------------------------------------------------------------------
+marKVolume::marKVolume( ){
+       _volume=NULL;
+}
+// -------------------------------------------------------------------------
+marKVolume::~marKVolume( ){
+}
+// -------------------------------------------------------------------------
+bool marKVolume::volumeLoaded( ) { 
+       return( _volume != NULL ); 
+}
+// -------------------------------------------------------------------------   
+kVolume* marKVolume::getVolume( ) {    
+       return( _volume ); 
+}
+// -------------------------------------------------------------------------   
+void marKVolume::setVolume(kVolume* vol ) {    
+       _volume = vol; 
+}
+// -------------------------------------------------------------------------   
+bool marKVolume::load( std::ifstream& is ){
+       // ToDo
+       return true;
+}
+// -------------------------------------------------------------------------   
+bool marKVolume::save( std::ofstream& os ){
+       // ToDo
+       return true;
+}
+// -------------------------------------------------------------------------   
+void marKVolume::reset(){
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marKVolume.h b/lib/maracasVisuLib/src/kernel/marKVolume.h
new file mode 100644 (file)
index 0000000..7413c9d
--- /dev/null
@@ -0,0 +1,43 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marKVolume.h,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:55 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#ifndef __MAR__KERNEL__MARKVOLUME__HXX__
+#define __MAR__KERNEL__MARKVOLUME__HXX__
+
+
+#include "volume.hxx"
+
+class MAR_KERNEL_EXPORT marKVolume {
+       
+public:
+       
+    marKVolume( );
+    ~marKVolume( );
+
+    bool        volumeLoaded( );
+    kVolume* getVolume( );
+    void        setVolume( kVolume *vol);
+       bool     load( std::ifstream& is );
+       bool     save( std::ofstream& os );
+       void     reset();
+
+  private:
+         
+       kVolume* _volume;
+};
+
+#endif // __MAR__KERNEL__MARKVOLUME__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marLine.cpp b/lib/maracasVisuLib/src/kernel/marLine.cpp
new file mode 100644 (file)
index 0000000..d057a53
--- /dev/null
@@ -0,0 +1,82 @@
+
+#include "marLine.h"
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+marLine::marLine(){
+       this->a = 1;
+       this->b = 1;
+       this->c = 0;
+}
+
+// ----------------------------------------------------------------------------
+marLine::marLine(double x1, double y1, double x2, double y2){
+       this->a = y2 - y1;                      //REVISAR SIGNO
+       this->b = (x1 - x2);
+       this->c = (y1 - y2) * x1 + (x2 - x1)*y1;
+}
+
+// ----------------------------------------------------------------------------
+marLine::marLine(double a, double b){
+       this->a = a;
+       this->b = b;
+       this->c = 0;
+}
+
+// ----------------------------------------------------------------------------
+void marLine::getNormal(double *a, double *b){
+       *a = (this->b);
+       *b = this->a;
+}
+
+// ----------------------------------------------------------------------------
+void marLine::getIntersect(double a, double b, double c, double *x, double *y){
+
+       if (this->a == a){
+               *x = -1;
+               *y = -1;
+               return;
+       }
+
+       if (this->b == b){
+               *x = -1;
+               *y = -1;
+               return;
+       }
+
+       *x = (c*this->b - this->c*b) / (this->a*b - a*this->b);
+
+       if (this->b == 0){
+               *y = -c/b;
+       } else if (b == 0){
+               *y = -this->c/this->b;
+       } else {
+               *y = (-this->a*(*x) - this->c) / this->b;
+       }
+       
+
+       if (*x < 0 || *y < 0){
+               *x = -1;
+               *y = -1;
+       }
+       
+}
+// ----------------------------------------------------------------------------
+double marLine::getA(){
+       return a;
+}
+
+// ----------------------------------------------------------------------------
+double marLine::getB(){
+       return b;
+}
+
+// ----------------------------------------------------------------------------
+double marLine::getC(){
+       return c;
+}
+
+// ----------------------------------------------------------------------------
+marLine::~marLine(){
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marLine.h b/lib/maracasVisuLib/src/kernel/marLine.h
new file mode 100644 (file)
index 0000000..9f4884e
--- /dev/null
@@ -0,0 +1,27 @@
+// marLine.h: interface for the marLine class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef __marLine_h
+#define __marLine_h
+
+class marLine  
+{
+public:
+       marLine();
+       marLine(double x1, double y1, double x2, double y2);
+       marLine(double a, double b);
+       void getNormal(double *a, double *b);
+       void getIntersect(double a, double b, double c, double *x, double *y);
+       double getA();
+       double getB();
+       double getC();
+       virtual ~marLine();
+
+private:
+       double a;
+       double b;
+       double c;
+};
+
+#endif // !defined(AFX_MARLINE_H__28F8F1C4_E5F2_48C7_94E0_3C8BEA226D06__INCLUDED_)
diff --git a/lib/maracasVisuLib/src/kernel/marMathConst.h b/lib/maracasVisuLib/src/kernel/marMathConst.h
new file mode 100644 (file)
index 0000000..4715323
--- /dev/null
@@ -0,0 +1,12 @@
+// header to define some math constants
+
+const double PI = 3.14159265358979323846264338328;
+
+//#ifndef M_PI
+//#define M_PI       3.14159265358979323846264338328      /* pi */
+//#endif
+
+//#ifndef M_PI_2
+//#define M_PI_2     1.57079632679489661923132169164      /* pi/2 */
+//#endif
+
diff --git a/lib/maracasVisuLib/src/kernel/marMatrix.cpp b/lib/maracasVisuLib/src/kernel/marMatrix.cpp
new file mode 100644 (file)
index 0000000..e882023
--- /dev/null
@@ -0,0 +1,425 @@
+// marMatrix.cpp: implementation of the marMatrix class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "marMatrix.h"
+#include <assert.h>
+
+//////////////////////////////////////////////////////////////////////
+// Construction
+//////////////////////////////////////////////////////////////////////
+marMatrix::marMatrix(size_t size1, size_t size2)
+       :shallowCopy(false)
+{
+       _size1=size1;
+       _size2=size2;
+       _data=new double[_size1*_size2];
+}
+
+marMatrix::marMatrix(double *data, size_t size1, size_t size2)
+       :shallowCopy(true)
+{
+       if (size1==0 || size2==0)
+       {
+               assert(false);
+       }
+       else
+       {
+               _size1=size1;
+               _size2=size2;
+               _data=data;
+
+// PS ->               size_t iMax=_size1*_size2;
+// PS ->               _data=new double[iMax];
+// PS -> 
+// PS ->               for (int i=0;i<iMax;i++)
+// PS ->               {
+// PS ->                       _data[i]=data[i];
+// PS ->               }
+
+       }
+}
+
+
+marMatrix::marMatrix(const marMatrix &m)
+       :shallowCopy(false)
+{
+       if (m._size1==0 || m._size2==0)
+       {
+               assert(false);
+       }
+       else
+       {
+               _size1=m._size1;
+               _size2=m._size2;
+
+               size_t iMax=_size1*_size2;
+               _data=new double[iMax];
+
+               int i;
+               for (i=0;i<iMax;i++)
+               {
+                       _data[i]=m._data[i];
+               }
+       }
+}
+
+//////////////////////////////////////////////////////////////////////
+// Destruction
+//////////////////////////////////////////////////////////////////////
+marMatrix::~marMatrix()
+{
+       if (!shallowCopy) 
+       {
+               delete _data;
+       }
+       else
+       {
+               _data=NULL;
+       }
+}
+
+//////////////////////////////////////////////////////////////////////
+// Opérateurs
+//////////////////////////////////////////////////////////////////////
+// ---------------------------------------------------------------------
+/*Affichage*/
+std::ostream& operator<<(std::ostream& os,const marMatrix& m)
+{
+       int i,j;
+       for (i =0;i<m._size1;i++)
+       {
+               for (j =0;j<m._size2;j++)
+               {
+                       os << " " << m._data[i*m._size2+j];
+               }
+               os << "\n";
+       }
+    return(os);
+}
+
+// ---------------------------------------------------------------------
+/*Casting*/
+marMatrix::operator double*() const 
+{ 
+       return(_data);
+}
+
+// ---------------------------------------------------------------------
+/*Indexation*/
+double& marMatrix::operator()(size_t i, size_t j) 
+{ 
+       return(_data[i*_size2+j]);
+}
+
+const double& marMatrix::operator()(size_t i, size_t j) const
+{
+       return(_data[i*_size2+j]);
+}
+
+// ---------------------------------------------------------------------
+/*Affectation*/
+marMatrix& marMatrix::operator=(const marMatrix& o)
+{
+       _size1=o._size1;
+       _size2=o._size2;
+       if (!(_data==NULL)&&(!shallowCopy))
+       {
+               delete _data;
+       }
+       shallowCopy=false;
+       size_t iMax=_size1*_size2;
+       _data=new double[iMax];
+
+       int i;
+       for (i=0;i<iMax;i++)
+       {
+               _data[i]=o._data[i];
+       }
+       return (*this);
+}
+
+marMatrix& marMatrix::operator=(double o)
+{
+       if (_size1!=0 && _size2!=0)
+       {
+               if (!(_data==NULL)&&(!shallowCopy))
+               {
+                       delete _data;
+               }
+               shallowCopy=false;
+               size_t iMax=_size1*_size2;
+               _data=new double[iMax];
+               for (int i=0;i<iMax;i++)
+               {
+                       _data[i]=o;
+               }
+       }
+       else
+       {
+               assert(false);
+       }
+       return (*this);
+}
+
+marMatrix& marMatrix::operator=(double*o)
+{
+       if (_size1!=0 && _size2!=0)
+       {
+               if (!(_data==NULL)&&(!shallowCopy))
+               {
+                       delete _data;
+               }
+               shallowCopy=false;
+               size_t iMax=_size1*_size2;
+               _data=new double[iMax];
+               for (int i=0;i<iMax;i++)
+               {
+                       _data[i]=o[i];
+               }
+       }
+       else
+       {
+               assert(false);
+       }
+       return (*this);
+}
+
+// ---------------------------------------------------------------------
+/*Comparaison*/
+bool marMatrix::operator==(const marMatrix& o) const
+{
+    bool equal=true;
+       
+    if(_size1!=o._size1 || _size2!=o._size2)
+       {
+               return(false);
+       }
+       size_t iMax=_size1*_size2;
+
+       for (int i=0;i<iMax && equal;i++)
+       {
+               equal=equal && (_data[i]==o._data[i]); 
+       }
+    return(equal);
+}
+
+bool marMatrix::operator!=(const marMatrix& o) const
+{
+       return(!((*this)==o));
+}
+
+// ---------------------------------------------------------------------
+/*Addition*/
+marMatrix marMatrix::operator+(const marMatrix& o)
+{
+       marMatrix result(*this);
+       
+       if ((o._size1!=result._size1) 
+               || (result._size1==0) 
+               || (o._size2!=result._size2) 
+               || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0 ; i < iMax ; i++)
+               {
+                       result._data[i]+=o._data[i];
+               }
+       }
+       return result;
+}
+
+marMatrix marMatrix::operator+(double o)
+{
+       marMatrix result(*this);
+       
+       if ((result._size1==0) || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0;i < iMax;i++)
+               {
+                       result._data[i]+=o;
+               }
+       }
+       return result;
+}
+
+marMatrix marMatrix::operator+(double*o)
+{
+       marMatrix result(*this);
+       
+       if ((result._size1==0) || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0;i < iMax;i++)
+               {
+                       result._data[i]+=o[i];
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Soustraction*/
+marMatrix marMatrix::operator-(const marMatrix& o)
+{
+       marMatrix result(*this);
+       
+       if ((o._size1!=result._size1) 
+               || (result._size1==0) 
+               || (o._size2!=result._size2) 
+               || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0;i < iMax;i++)
+               {
+                       result._data[i]-=o._data[i];
+               }
+       }
+       return result;
+}
+
+marMatrix marMatrix::operator-(double o)
+{
+       marMatrix result(*this);
+       
+       if ((result._size1==0) || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0;i < iMax;i++)
+               {
+                       result._data[i]-=o;
+               }
+       }
+       return result;
+}
+
+marMatrix marMatrix::operator-(double*o)
+{
+       marMatrix result(*this);
+       
+       if ((result._size1==0) || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0;i < iMax;i++)
+               {
+                       result._data[i]-=o[i];
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Multiplication (produit scalaire)*/
+marMatrix marMatrix::operator*(double o)
+{
+       marMatrix result(*this);
+       
+       if ((result._size1==0) || (result._size2==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               size_t iMax=result._size1*result._size2;
+               int i;
+               for (i=0;i < iMax;i++)
+               {
+                       result._data[i]*=o;
+               }
+       }
+       return result;
+}
+
+marMatrix marMatrix::operator*(const marMatrix &o)
+{
+       size_t mA=_size1;
+       size_t nA=_size2;
+       size_t mB=o._size1;
+       size_t nB=o._size2;
+       size_t mR=mA;
+       size_t nR=nB;
+
+       marMatrix result(mR,nR);
+       result=0.0;
+
+       int k,i,j;
+       if (nA==mB)
+       {
+               for (k=0;k<nA;k++)
+               {
+                       for (i=0;i<mR;i++)
+                       {
+                               for (j=0;j<nR;j++)
+                               {
+                                       result(i,j)+=(*this)(i,k)*o(k,j);
+                               }
+                       }
+               }
+       }
+       else
+       {
+               assert(false);
+       }
+       return result;
+}
+
+marVector marMatrix::operator*(const marVector &o)
+{
+       marVector result(_size1);
+       if (o.size()!=_size2)
+       {
+               assert(false);
+       }
+       else
+       {
+               marMatrix resultM(_size1,1);
+               marMatrix B((double*)o,o.size(),1);
+               resultM=(*this)*B;
+               result=(double*)resultM;
+       }
+       return result;
+}
+
+//////////////////////////////////////////////////////////////////////
+// Méthodes
+//////////////////////////////////////////////////////////////////////
+size_t marMatrix::rows() const
+{
+    return _size1; 
+}
+
+size_t marMatrix::columns() const
+{
+       return _size2;
+}
diff --git a/lib/maracasVisuLib/src/kernel/marMatrix.h b/lib/maracasVisuLib/src/kernel/marMatrix.h
new file mode 100644 (file)
index 0000000..7450158
--- /dev/null
@@ -0,0 +1,57 @@
+// marMatrix.h: interface for the marMatrix class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include <iostream>
+#include <stddef.h>
+#include "marVector.h"
+
+class marMatrix  
+{
+public:
+/*==Constructeurs========================================*/
+       marMatrix(const marMatrix &m);
+       marMatrix(double * data,size_t size1=3,size_t size2=3);
+       marMatrix(size_t size1,size_t size2);
+/*==Constructeurs========================================*/
+       virtual ~marMatrix();
+
+/*==opérateurss========================================*/
+    friend std::ostream& operator<<(std::ostream& os, const marMatrix& m);
+       marMatrix& operator=( const marMatrix& o );
+    marMatrix& operator=( double o );
+    marMatrix& operator=( double* o );
+
+    operator double*( ) const;
+
+    double& operator()( size_t i, size_t j );
+    const double& operator()( size_t i, size_t j ) const;
+
+    marMatrix operator+( const marMatrix& o );
+    marMatrix operator+( double o );
+    marMatrix operator+( double* o );
+
+       marMatrix operator-( const marMatrix& o );
+    marMatrix operator-( double o );
+    marMatrix operator-( double* o );
+
+       marMatrix operator*( const marMatrix& o );
+    marVector operator*( const marVector& o );
+    marMatrix operator*( double o );
+
+    bool operator==( const marMatrix& o ) const;
+    bool operator!=( const marMatrix& o ) const;
+
+/*==Méthodes========================================*/
+       size_t columns() const;
+       size_t rows() const;
+
+/*==Attributs========================================*/
+private:
+       bool shallowCopy; // true if _data is a shallow copy of original data (pointer copy)
+       size_t _size1;
+       size_t _size2;
+       double* _data;
+};
+
diff --git a/lib/maracasVisuLib/src/kernel/marObject.cpp b/lib/maracasVisuLib/src/kernel/marObject.cpp
new file mode 100644 (file)
index 0000000..088bfad
--- /dev/null
@@ -0,0 +1,82 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marObject.cpp,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:55 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "marObject.h"
+
+// -------------------------------------------------------------------------
+marObject::marObject( marParameters* p )
+{
+    _parameters = p;
+    _parametersCopied = false;
+}
+
+// -------------------------------------------------------------------------
+marObject::~marObject( )
+{
+    if( _parametersCopied && _parameters != NULL ) delete _parameters;
+}
+
+// -------------------------------------------------------------------------
+void marObject::setParameters( marParameters* p )
+{
+    if( _parametersCopied && _parameters != NULL ) delete _parameters;
+    _parameters = p;
+    _parametersCopied = false;
+}
+
+// -------------------------------------------------------------------------
+void marObject::copyParameters( marParameters* p )
+{
+    if( _parametersCopied && _parameters != NULL ) delete _parameters;
+    _parameters = new marParameters( );
+    *_parameters = *p;
+    _parametersCopied = true;
+}
+
+// -------------------------------------------------------------------------
+bool marObject::save( std::string& nw )
+{
+    std::ofstream os( nw.c_str( ) );
+
+    if( os ) {
+
+       save( os );
+       os.close( );
+       return( true );
+
+    } // fi
+
+    return( false );
+}
+
+// -------------------------------------------------------------------------
+bool marObject::load( std::string& nr )
+{
+    std::ifstream is( nr.c_str( ) );
+
+    if( is ) {
+
+       load( is );
+       is.close( );
+       return( true );
+
+    } // fi
+
+    return( false );
+}
+
+// eof - object.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marObject.h b/lib/maracasVisuLib/src/kernel/marObject.h
new file mode 100644 (file)
index 0000000..b049ae4
--- /dev/null
@@ -0,0 +1,84 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marObject.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__OBJECT__HXX__
+#define __MAR__KERNEL__OBJECT__HXX__
+
+#include <string>
+#include "marTypes.h"
+#include "marParameters.h"
+
+/** /def marObject
+ *  \brief General maracas object.
+ */
+class MAR_KERNEL_EXPORT marObject
+{
+    public:
+
+    /** Default constructor.
+     */
+    marObject( marParameters* p );
+
+    /** Default destructor.
+     */
+    ~marObject( );
+
+    /** Parameters assignation methods.
+     *
+     *  You can assign a marParameters object by reference (setParameters)
+     *  or by value (copyParameters).
+     *  Besides, if you want to make your actual reference to be by value,
+     *  call makeACopyParameters.
+     */
+    void setParameters( marParameters* p );
+    void copyParameters( marParameters* p );
+    void makeACopyParameters( )
+    {
+           copyParameters( _parameters );
+    }
+
+    /** Parameters analizers.
+     */
+    marParameters* getParameters( ) { return( _parameters ); };
+    bool parametersOwned( ) { return( _parametersCopied ); };
+
+    /** Virtual general methods
+     *  (must be defined in each sub-class).
+     */
+    virtual void reset( ) = 0;
+    virtual void copyFrom( const marObject& from ) = 0;
+
+    /** Virtual persistence methods
+     *  (must be defined in each sub-class).
+     */
+    virtual bool save( std::ofstream& os ) = 0;
+    virtual bool load( std::ifstream& is ) = 0;
+
+    /** Persistence methods
+     */
+    bool save( std::string& nw );
+    bool load( std::string& nr );
+
+    private:
+
+    marParameters* _parameters;
+    bool _parametersCopied;
+
+};
+
+#endif // __MAR__KERNEL__OBJECT__HXX__
+
+// eof - marObject.h
diff --git a/lib/maracasVisuLib/src/kernel/marParameters.cpp b/lib/maracasVisuLib/src/kernel/marParameters.cpp
new file mode 100644 (file)
index 0000000..8bf5354
--- /dev/null
@@ -0,0 +1,509 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marParameters.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:56 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "marParameters.h"
+#include <math.h>
+#include <wx/log.h>
+
+static char* BoolParamNames[] = {
+       // PS ->     "e_debug_window_visible"  ,
+       // PS ->        "e_debug_console_visible"     ,
+       // PS ->        "e_calculate_mip_default"    ,
+       // PS ->        "e_choose_all_slices_default" ,
+       "e_debug_isocontour"          ,
+       "e_debug_diameters"           ,
+       "e_debug_fill_area"           ,
+       "e_invest_slice_order"           ,
+       // PS ->        "e_show_cell"                 ,
+       // PS ->        "e_show_int_cell"
+};
+static char* DoubleParamNames[] = {
+    "e_gravity_distance"              ,
+       "e_axis_discret_step"             ,
+       "e_distance_to_maximum_intensity" ,
+       "e_cell_coeficient"               ,
+       "e_flexion_coeficient"            ,
+       "e_tension_coeficient"            ,
+       "e_voxel_x_dimension"            ,
+       "e_voxel_y_dimension"             ,
+       "e_voxel_z_dimension"             ,
+       "e_scale"                         ,
+       // PS ->        "e_sampling"                      ,
+       "e_threshold_isocontour"          ,
+       "e_threshold_snake_isocontour"    ,
+       "e_sigma"                         ,
+       // PS ->        "e_gradient_coeficient"           ,
+       // PS ->        "e_extern_coeficient"             ,
+       // PS ->        "e_ballon_coeficient"             ,
+       // PS ->        "e_back_color_3D_r"               ,
+       // PS ->        "e_back_color_3D_g"               ,
+       // PS ->        "e_back_color_3D_b"               ,
+       // PS ->        "e_axis_color_r"                  ,
+       // PS ->        "e_axis_color_g"                  ,
+       // PS ->        "e_axis_color_b"
+    "e_RescaleIntercept"          ,
+    "e_RescaleSlope"              ,
+};
+static char* IntParamNames[] = {
+    "e_roi_dimension"                     ,
+       "e_step"                                  ,
+       "e_step_coeficient"                       ,
+       "e_mass_power"                            ,
+       "e_algorithm_type"                        ,
+       "e_mask_size"                             ,
+       "e_number_of_points_for_snake"            ,
+       "e_quantification_type"                   ,
+       "e_stenosis_type"                         ,
+       // PS ->        "e_number_of_iterations_snake_isocontour" ,
+       // PS ->        "e_number_of_iterations_snake_deriche"    ,
+       "e_voxel_type"                            ,
+       // PS ->        "e_coef_cell_max_int"
+};
+static char* StringParamNames[] = {
+       "e_installation_directory" ,
+       "e_dicom_images_directory"
+};
+
+// -------------------------------------------------------------------------
+double marParameters::getVoxelSize( )
+{
+/* OLD CODE:
+
+ double ret = 1.0;
+  if( _intValues[ e_voxel_type ] == VOX_TYPE_MINIMUM ) {
+  
+   ret = _doubleValues[ e_voxel_x_dimension ];
+   ret = GTM_MIN( _doubleValues[ e_voxel_y_dimension ], ret );
+   ret = GTM_MIN( _doubleValues[ e_voxel_z_dimension ], ret );
+   
+    } // fi
+    return( ret );
+       */
+
+
+//EEDx1        
+    double ret = 1.0;
+    //Juan Carrillo 03/06/2005
+       if( _intValues[ e_voxel_type ] == VOX_TYPE_MINIMUM ) {
+               
+               ret = _doubleValues[ e_voxel_x_dimension ];
+               ret = ( _doubleValues[ e_voxel_y_dimension ] < ret )?
+                       _doubleValues[ e_voxel_y_dimension ]: ret;
+               ret = ( _doubleValues[ e_voxel_z_dimension ] < ret )?
+                       _doubleValues[ e_voxel_z_dimension ]: ret;
+    } // fi
+    return( ret*1 );
+}
+
+// -------------------------------------------------------------------------
+double marParameters::getDimIma( )
+{
+       double scale = _doubleValues[ e_scale ];
+       double roiDim = ( double )( _intValues[ e_roi_dimension ] );
+    return( scale * roiDim );
+}
+
+// -------------------------------------------------------------------------
+int marParameters::getSizeIma( )
+{
+    //  TODO : There should be a formal way to calculate a good image size.
+    return( 128 ); 
+}
+
+// -------------------------------------------------------------------------
+double marParameters::getImaRatio( )
+{
+    return( getDimIma( ) / ( double )( getSizeIma( ) ) );
+}
+
+// -------------------------------------------------------------------------
+void marParameters::setROIStep( double width )
+{
+    _intValues[ e_roi_dimension ] =
+               ( int )ceil( _doubleValues[ e_cell_coeficient ] * width );
+    _intValues[ e_step ] =
+               ( int )floor( ( double )_intValues[ e_roi_dimension ] /
+                     ( double )_intValues[ e_step_coeficient ] );
+}
+
+
+// -------------------------------------------------------------------------
+float marParameters::getRescaleSlope(){
+       return (float) _doubleValues[ e_RescaleSlope ];
+}
+// -------------------------------------------------------------------------
+float marParameters::getRescaleIntercept(){
+       return (float) _doubleValues[ e_RescaleIntercept ];
+}
+// -------------------------------------------------------------------------
+void marParameters::setRescaleSlope(float slope){
+       _doubleValues[ e_RescaleSlope ]= slope;
+}
+// -------------------------------------------------------------------------
+void marParameters::setRescaleIntercept(float intercept){
+       _doubleValues[ e_RescaleIntercept ]= intercept;
+}
+// -------------------------------------------------------------------------
+void marParameters::copyFrom( const marParameters& from )
+{
+    int i;
+       
+    memcpy( _boolValues, from._boolValues, e_bool_cont * sizeof( bool ) );
+    memcpy( _intValues, from._intValues, e_int_cont * sizeof( int ) );
+    memcpy( _doubleValues,
+               from._doubleValues,
+               e_double_cont * sizeof( double ) );
+       
+     for( i = 0; i < e_string_cont; i++ )
+               _stringValues[ i ] = from._stringValues[ i ];
+}
+
+// -------------------------------------------------------------------------
+void marParameters::reset( )
+{
+       // PS ->     _boolValues[ e_debug_window_visible ]      = false;
+       // PS ->     _boolValues[ e_debug_console_visible ]     = false;
+       // PS ->     _boolValues[ e_calculate_mip_default ]     = false;
+       // PS ->     _boolValues[ e_choose_all_slices_default ] = true;
+    _boolValues[ e_debug_isocontour ]          = true;
+    _boolValues[ e_debug_diameters ]           = true;
+    _boolValues[ e_debug_fill_area ]           = false;
+    _boolValues[ e_invest_slice_order ]                   = false;
+       // PS ->     _boolValues[ e_show_cell ]                 = true;
+       // PS ->     _boolValues[ e_show_int_cell ]             = true;
+       
+    _doubleValues[ e_gravity_distance ]              = 1.0;
+    _doubleValues[ e_axis_discret_step ]             = 2.0;
+    _doubleValues[ e_distance_to_maximum_intensity ] = 0.0;
+    _doubleValues[ e_cell_coeficient ]               = 1.2;
+    _doubleValues[ e_flexion_coeficient ]            = 0.1;
+    _doubleValues[ e_tension_coeficient ]            = 0.3;
+    _doubleValues[ e_voxel_x_dimension ]             = 1.0;
+    _doubleValues[ e_voxel_y_dimension ]             = 1.0;
+    _doubleValues[ e_voxel_z_dimension ]             = 1.0;
+    _doubleValues[ e_scale ]                         = 4.0;
+       // PS ->     _doubleValues[ e_sampling ]                      = 4.0;
+    _doubleValues[ e_threshold_isocontour ]          = 40.0;
+    _doubleValues[ e_threshold_snake_isocontour ]    = 40.0;
+    _doubleValues[ e_sigma ]                         = 0.1;
+    _doubleValues[ e_RescaleIntercept ]              = 0;
+    _doubleValues[ e_RescaleSlope ]                  = 1;
+       // PS ->     _doubleValues[ e_extern_coeficient ]             = 0.3;
+       // PS ->     _doubleValues[ e_gradient_coeficient ]           = 0.3;
+       // PS ->     _doubleValues[ e_ballon_coeficient ]             = 0.02;
+       // PS ->     _doubleValues[ e_back_color_3D_r ]               = 0.0;
+       // PS ->     _doubleValues[ e_back_color_3D_g ]               = 0.0;
+       // PS ->     _doubleValues[ e_back_color_3D_b ]               = 0.0;
+       // PS ->     _doubleValues[ e_axis_color_r ]                  = 1.0;
+       // PS ->     _doubleValues[ e_axis_color_g ]                  = 0.0;
+       // PS ->     _doubleValues[ e_axis_color_b ]                  = 0.0;
+       
+       
+    _intValues[ e_roi_dimension ]                         = 10;
+    _intValues[ e_step ]                                  = 3;
+    _intValues[ e_step_coeficient ]                       = 2;
+    _intValues[ e_mass_power ]                            = 2;
+    _intValues[ e_algorithm_type ]                        = ISOCONTOURS;
+    _intValues[ e_mask_size ]                             = 5;
+    _intValues[ e_number_of_points_for_snake ]            = 20;
+    _intValues[ e_quantification_type ]                   = TYPE_AREA;
+    _intValues[ e_stenosis_type ]                         = TYPE_AREA;
+       // PS ->     _intValues[ e_number_of_iterations_snake_isocontour ] = 5;
+       // PS ->     _intValues[ e_number_of_iterations_snake_deriche ]    = 700;
+
+
+    _intValues[ e_voxel_type ]                            = VOX_TYPE_NORMAL;
+
+
+       // PS ->     _intValues[ e_coef_cell_max_int ]                     = 2;
+       
+     _stringValues[ e_installation_directory ]  = _T("NO_DIRECTORY");
+     _stringValues[ e_dicom_images_directory ] = _T("NO_DIRECTORY");
+       
+        //MAZV CT compatibility
+       _contourThresh          = 10;
+       _lumenPercentage        = 86;
+       _calcPercentage         = 90;
+       _standardDeviation      = 3;
+       _radius                 = 3;
+       //end MAZV CT compatibility
+
+}
+
+// -------------------------------------------------------------------------
+bool marParameters::save( std::ofstream& os )
+{
+    int i, s;
+       try 
+       {
+               os.write( ( const char* )_boolValues, e_bool_cont * sizeof( bool ) );
+               os.write( ( char* )_intValues, e_int_cont * sizeof( int ) );
+               os.write( ( const char* )_doubleValues, e_double_cont * sizeof( double ) );
+               for( i = 0; i < e_string_cont; i++ ) {
+                       s = _stringValues[ i ].length( );
+                       os.write( ( const char* )&s, sizeof( int ) );
+                       os.write( ( const char* )_stringValues[ i ].c_str( ), s * sizeof( char ) );
+               } // rof
+               return( true );
+       }
+       catch (...)
+       {
+               return(false);
+       }
+    
+}
+
+// -------------------------------------------------------------------------
+bool marParameters::load( std::ifstream& is )
+{
+       int i, s;
+       try
+       {
+               is.read( ( char* )_boolValues, e_bool_cont * sizeof( bool ) );
+               is.read( ( char* )_intValues, e_int_cont * sizeof( int ) );
+               is.read( ( char* )_doubleValues, e_double_cont * sizeof( double ) );
+               for( i = 0; i < e_string_cont; i++ )
+               {
+                       is.read( ( char* )&s, sizeof( int ) );
+                       _stringValues[ i ].resize( s );
+                       is.read( ( char* )_stringValues[ i ].c_str( ), s * sizeof( char ) );
+               } // rof
+               return( true ); 
+       }
+       catch (...)
+       {
+               
+               return(false);
+       }
+       
+}
+
+// -------------------------------------------------------------------------
+bool marParameters::save( wxString& nw )
+{
+    std::ofstream os( (const char*)nw.mb_str( ) ,std::ios::out |std::ios::binary );
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug("Saving parameters to file " + nw);
+       
+    if( os==NULL ) 
+       {
+               wxString errorMsg;
+               errorMsg= _T("Error : Cannot open file ")+nw+_T(" to save parameters");
+//EEDxx2.4 DEBuG
+//             wxLogDebug(errorMsg);
+               return( false );
+       }
+       if (save( os ))
+       {
+               os.close( );
+//EEDxx2.4 DEBuG
+//             wxLogDebug("Parameters saved to file " + nw);
+               return( true );
+       }
+       else
+       {
+               os.close( );
+//EEDxx2.4 DEBuG
+//             wxLogDebug("Error : Cannot save parameters to file "+nw);
+               return(false);
+       }
+}
+
+// -------------------------------------------------------------------------
+bool marParameters::load( wxString& nr )
+{
+    std::ifstream is( (const char*)nr.mb_str( ),std::ios::binary|std::ios::in);
+       
+//EEDxx2.4 DEBuG
+//     wxLogDebug("Laoding parameters from file " + nr);
+    if( is==NULL ) 
+       {
+               wxString errorMsg;
+               errorMsg= _T("Error : Cannot open file ")+nr+_T(" to load parameters");
+//EEDxx2.4 DEBuG
+//             wxLogDebug(errorMsg);
+               return( false );
+       }
+       if (load( is ))
+       {
+               is.close( );
+//EEDxx2.4 DEBuG
+//             wxLogDebug("Parameters loaded from file " + nr);
+               return( true );
+       }
+       else
+       {
+               is.close( );
+//EEDxx2.4 DEBuG
+//             wxLogDebug("Error : Cannot load parameters from file "+nr+": file may be corrupted");
+               return(false);
+       }
+}
+
+// ----------------------------------------------------------------------------
+wxArrayString marParameters::getRelationalArray( )
+{
+    // Allocate memory for pairs of data plus one end NULL array
+       //    wxStringList ret;
+    wxArrayString ret;
+    wxString str;
+    int i, j;
+       
+    for( i = 0, j = 0; i < e_bool_cont; i++, j += 2 ) {
+               
+               ret.Add( wxString( BoolParamNames[ i ], wxConvUTF8)  );
+               str.Printf( _T("%d"), ( _boolValues[ i ] )? 1: 0 );
+               ret.Add( str );
+               
+    } // rof
+    for( i = 0; i < e_double_cont; i++, j += 2 ) {
+               
+               ret.Add( wxString( DoubleParamNames[ i ], wxConvUTF8)  );
+               str.Printf( _T("%f"), _doubleValues[ i ] );
+               ret.Add( str );
+               
+    } // rof
+    for( i = 0; i < e_int_cont; i++, j += 2 ) {
+               
+               ret.Add( wxString( IntParamNames[ i ], wxConvUTF8) );
+               str.Printf( _T("%d"), _intValues[ i ] );
+               ret.Add( str );
+               
+    } // rof
+
+     for( i = 0; i < e_string_cont; i++, j += 2 ) {
+               ret.Add( wxString( StringParamNames[ i ], wxConvUTF8)  );
+               ret.Add( wxString( _stringValues[ i ].c_str( ), wxConvUTF8 ) );
+     } // rof
+
+
+    return( ret );
+       
+}
+
+// ----------------------------------------------------------------------------
+//void marParameters::setRelationalArray( wxStringList& arr )
+void marParameters::setRelationalArray( wxArrayString& arr )
+{
+       
+    int i = 0, j;
+    bool cont;
+       
+       //    while( arr[ i ] != NULL ) {
+    while( !arr.IsEmpty() ) {
+               
+               cont = true;
+               for( j = 0; j < e_string_cont && cont; j++ ) {
+                       if( strcmp( StringParamNames[ j ], (const char*)arr[ i ].mb_str() ) == 0 ) {
+                               _stringValues[ j ] = ( wxString )arr[ i + 1 ];
+                               cont = false;
+                       } // fi
+               } // rof
+               for( j = 0; j < e_bool_cont && cont; j++ ) {
+                       
+                       if( strcmp( BoolParamNames[ j ], (const char*)arr[ i ].mb_str() ) == 0 ) {
+                               
+                               _boolValues[ j ] = ( strcmp( (const char*)arr[ i + 1 ].mb_str(), "1" ) == 0 );
+                               cont = false;
+                               
+                       } // fi
+                       
+               } // rof
+               for( j = 0; j < e_int_cont && cont; j++ ) {
+                       
+                       if( strcmp( IntParamNames[ j ], (const char*)arr[ i ].mb_str() ) == 0 ) {
+                               
+                               _intValues[ j ] = atoi( (const char*)arr[ i + 1 ].mb_str() );
+                               cont = false;
+                               
+                       } // fi
+                       
+               } // rof
+               for( j = 0; j < e_double_cont && cont; j++ ) {
+                       
+                       if( strcmp( DoubleParamNames[ j ], (const char*)arr[ i ].mb_str() ) == 0 ) {
+                               
+                               ( ( wxString )arr[ i + 1 ] ).ToDouble( &_doubleValues[ j ] );
+                               cont = false;
+                               
+                       } // fi
+                       
+               } // rof
+               i += 2;
+               
+    } // fwhile
+       
+}
+
+
+bool marParameters::getInvestSliceOrder(){
+  return _boolValues[ e_invest_slice_order ];
+}
+
+//MAZV - Added for CT compatibility
+// ----------------------------------------------------------------------------
+int marParameters::getContourThresh() {
+       return _contourThresh;
+}
+
+// ----------------------------------------------------------------------------
+void marParameters::setContourThresh( int thresh ) {
+       _contourThresh = thresh;
+}
+
+// ----------------------------------------------------------------------------
+double marParameters::getStandardDeviation() {
+       return _standardDeviation;
+}
+
+// ----------------------------------------------------------------------------
+double marParameters::getRadius() {
+       return _radius;
+}
+
+// ----------------------------------------------------------------------------
+void marParameters::setStandardDeviation( double dev ) {
+       _standardDeviation = dev;
+}
+
+// ----------------------------------------------------------------------------
+void marParameters::setRadius( double rad ) {
+       _radius = rad;
+}
+
+// ----------------------------------------------------------------------------
+void marParameters::setLumenPercentage(int percentage) {
+       _lumenPercentage = percentage;
+}
+// ----------------------------------------------------------------------------
+void marParameters::setCalcPercentage(int percentage) {
+       _calcPercentage = percentage;
+}
+
+// ----------------------------------------------------------------------------
+int     marParameters::getLumenPercentage() {
+       return _lumenPercentage;
+}
+
+// ----------------------------------------------------------------------------
+int  marParameters::getCalcPercentage() {
+       return _calcPercentage;
+}
+//MAZV end of addition
+// eof - parameters.cxx
diff --git a/lib/maracasVisuLib/src/kernel/marParameters.h b/lib/maracasVisuLib/src/kernel/marParameters.h
new file mode 100644 (file)
index 0000000..369eff3
--- /dev/null
@@ -0,0 +1,236 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marParameters.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__PARAMETERS__HXX__
+#define __MAR__KERNEL__PARAMETERS__HXX__
+
+#include "marTypes.h"
+#include <wx/arrstr.h>
+#include <wx/list.h>
+#include <fstream>
+//using namespace std;
+
+/** /def marParameters
+ *  \brief Parameters class definition.
+ */
+class MAR_KERNEL_EXPORT marParameters
+{
+    public:
+
+    /** /def Enumerations
+     *  Some mnemonic enumerations for indexes or
+     *  behaviour types.
+     */
+    enum VoxelTypes
+    {
+           VOX_TYPE_MINIMUM = 0x01,
+           VOX_TYPE_NORMAL  = 0x02
+
+    };
+    enum AlgorithmTypes
+    {
+           ISOCONTOURS = 1,
+           SNAKE       = 2,
+           DERICHE     = 3
+
+    };
+    enum QuantificationTypes
+    {
+           TYPE_AREA                    = 0x01,
+           TYPE_PERIMETER               = 0x02,
+           TYPE_DIAMETER_FROM_AREA      = 0x04,
+           TYPE_DIAMETER_FROM_PERIMETER = 0x08,
+           TYPE_MINIMUM_DIAMETER        = 0x10,
+           TYPE_MAXIMUM_DIAMETER        = 0x20,
+           TYPE_AVERAGE_DIAMETER        = 0x40
+
+    };
+    enum BoolParamIndexes
+    {
+// PS ->           e_debug_window_visible = 0  ,
+// PS ->           e_debug_console_visible     ,
+// PS ->           e_calculate_mip_default     ,
+// PS ->           e_choose_all_slices_default ,
+           e_debug_isocontour          ,
+           e_debug_diameters           ,
+           e_debug_fill_area           ,
+           e_invest_slice_order        ,
+// PS ->           e_show_cell                 ,
+// PS ->           e_show_int_cell             ,
+               e_bool_cont
+    };
+    enum DoubleParamIndexes
+    {
+           e_gravity_distance = 0          ,
+           e_axis_discret_step             ,
+           e_distance_to_maximum_intensity ,
+           e_cell_coeficient               ,
+           e_flexion_coeficient            ,
+           e_tension_coeficient            ,
+           e_voxel_x_dimension             ,
+           e_voxel_y_dimension             ,
+           e_voxel_z_dimension             ,
+           e_scale                         ,
+// PS ->           e_sampling                      ,
+           e_threshold_isocontour          ,
+           e_threshold_snake_isocontour    ,
+           e_sigma                         ,
+        e_RescaleIntercept              ,
+        e_RescaleSlope                  ,
+// PS ->           e_gradient_coeficient           ,
+// PS ->           e_extern_coeficient             ,
+// PS ->           e_ballon_coeficient             ,
+// PS ->           e_back_color_3D_r               ,
+// PS ->           e_back_color_3D_g               ,
+// PS ->           e_back_color_3D_b               ,
+// PS ->           e_axis_color_r                  ,
+// PS ->           e_axis_color_g                  ,
+// PS ->           e_axis_color_b                  ,
+           e_double_cont
+    };
+    enum IntParamIndexes
+    {
+           e_roi_dimension = 0                     ,
+           e_step                                  ,
+           e_step_coeficient                       ,
+           e_mass_power                            ,
+           e_algorithm_type                        ,
+           e_mask_size                             ,
+           e_number_of_points_for_snake            ,
+           e_quantification_type                   ,
+           e_stenosis_type                         ,
+// PS ->           e_number_of_iterations_snake_isocontour ,
+// PS ->           e_number_of_iterations_snake_deriche    ,
+           e_voxel_type                            ,
+// PS ->           e_coef_cell_max_int                     ,
+           e_int_cont
+    };
+
+//EED
+       enum StringParamIndexes
+     {
+           e_installation_directory = 0 ,
+           e_dicom_images_directory    ,
+           e_string_cont
+     };
+
+    public:
+
+    /** Default constructor.
+     */
+    marParameters( ) { reset( );  };
+
+    /** Default destructor.
+     */
+    ~marParameters( ) {}
+
+    /** Default analyzers & modificators.
+     *
+     *  These methods use an index i, which should be one defined on
+     *  correspondant type enum. For example, if you want to get the
+     *  installation directory parameter you should write:
+     *
+     *  marParameters* myParams = new marParameters( );
+     *  std::string myDir = myParams->
+     *                         getStringParam(
+     *                              marParameters::e_installation_directory );
+     */
+    bool   getBoolParam( int i )            { return( _boolValues[ i ] );   };
+    double getDoubleParam( int i )          { return( _doubleValues[ i ] ); };
+    int    getIntParam( int i )             { return( _intValues[ i ] );    };
+
+//EED
+     wxString& getStringParam( int i )       { return( _stringValues[ i ] );};
+
+    void   setBoolParam( int i, bool p )     { _boolValues[ i ] = p;       };
+    void   setDoubleParam( int i, double p ) { _doubleValues[ i ] = p;      };
+    void   setIntParam( int i, int p )       { _intValues[ i ] = p;         };
+
+//EED
+     void setStringParam( int i, const wxString& p ) { _stringValues[ i ] = p; };
+
+    /** Special analizers & modifiers
+     *  (in marKernel context, of course).
+     */
+    double     getVoxelSize( );
+    double     getDimIma( );
+    int                getSizeIma( );
+    double     getImaRatio( );
+    float      getRescaleSlope();
+    float      getRescaleIntercept();
+       bool    getInvestSliceOrder();
+
+    void       setROIStep( double width );
+    void       setRescaleSlope(float slope);
+    void       setRescaleIntercept(float intercept);
+
+
+    /** Copy.
+     */
+    void   copyFrom( const marParameters& from );
+
+    /** Persistence methods.
+     */
+    void reset( );
+    bool save( std::ofstream& os );
+    bool load( std::ifstream& is );
+    bool save( wxString& nw );
+    bool load( wxString& nr );
+
+    wxArrayString getRelationalArray( );
+    void setRelationalArray( wxArrayString& arr );
+
+       //MAZV - Added for CT compatibility
+       int getContourThresh();
+       double getStandardDeviation();
+       double getRadius();
+       int     getLumenPercentage();
+       int getCalcPercentage();
+
+       void setContourThresh( int thresh );
+       void setStandardDeviation( double dev );
+       void setRadius( double rad );
+       void setLumenPercentage(int percentage);
+       void setCalcPercentage(int percentage);
+       //MAZV - End of addition
+
+
+  private:
+
+    bool   _boolValues[ ( int )e_bool_cont ];
+    double _doubleValues[ ( int )e_double_cont ];
+    int   _intValues[ ( int )e_int_cont ];
+
+// EED
+       wxString _stringValues[ ( int )e_string_cont ];
+
+       //MAZV Added fot CT compatibility
+       int     _contourThresh;
+       double  _standardDeviation;
+       double  _radius;
+       int _lumenPercentage;
+       int _calcPercentage;
+       //MAZV - End of addition
+
+};
+
+
+       
+       
+
+#endif // __MAR__KERNEL__PARAMETERS__HXX__
+
+// eof - marParameters.h
diff --git a/lib/maracasVisuLib/src/kernel/marPoint.cpp b/lib/maracasVisuLib/src/kernel/marPoint.cpp
new file mode 100644 (file)
index 0000000..6d42b27
--- /dev/null
@@ -0,0 +1,102 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marPoint.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:56 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#include "marPoint.h"
+
+// ----------------------------------------------------------------------------
+marPoint::marPoint(double x, double y) {
+       this->x = x;
+       this->y = y;
+}
+
+marPoint::~marPoint()
+{
+
+}
+
+// ----------------------------------------------------------------------------
+double marPoint::getX()
+{
+       return x;
+}
+
+// ----------------------------------------------------------------------------
+double marPoint::getY()
+{
+       return y;
+}
+
+// ----------------------------------------------------------------------------
+void marPoint::setPoint(double x, double y){
+       this->x = x;
+       this->y = y;
+}
+
+// ----------------------------------------------------------------------------
+double marPoint::getGradient() {
+       return gradient;
+}
+
+// ----------------------------------------------------------------------------
+void marPoint::setGradient(double g) {
+       gradient = g;
+}
+
+// ----------------------------------------------------------------------------
+int marPoint::getDirection() {
+       return dir;
+}
+
+// ----------------------------------------------------------------------------
+bool marPoint::getInside() {
+       return inside;
+}
+
+// ----------------------------------------------------------------------------
+void marPoint::setDirection(int direction) {
+       dir = direction;
+}
+
+// ----------------------------------------------------------------------------
+void marPoint::setInside (bool ins) {
+       inside = ins;
+}
+
+// ----------------------------------------------------------------------------
+void marPoint::setIntensity(double intensity)
+{
+       this->intensity = intensity;
+}
+
+// ----------------------------------------------------------------------------
+double marPoint::getIntensity()
+{
+       return intensity;
+}
+
+// ----------------------------------------------------------------------------
+void marPoint::setType(int type)
+{
+       this->type = type;
+}
+
+// ----------------------------------------------------------------------------
+int marPoint::getType()
+{
+       return type;
+}
+
diff --git a/lib/maracasVisuLib/src/kernel/marPoint.h b/lib/maracasVisuLib/src/kernel/marPoint.h
new file mode 100644 (file)
index 0000000..9b6d487
--- /dev/null
@@ -0,0 +1,54 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marPoint.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef __MAR__KERNEL__POINT__HXX__
+#define __MAR__KERNEL__POINT__HXX__
+
+
+#include "marTypes.h"
+
+class MAR_KERNEL_EXPORT marPoint  
+{
+public:
+       marPoint(double x, double y);
+       ~marPoint();
+       double getX();
+       double getY();
+       void setPoint(double x, double y);
+       void setGradient(double g);
+       double getGradient();
+       int getDirection();
+       bool getInside();
+       void setDirection(int direction);
+       void setInside (bool ins);
+       void setIntensity(double intensity);
+       double getIntensity();
+       void setType(int type);
+       int getType();
+
+private:
+       double x;
+       double y;
+       double gradient;
+       int dir;                //Ray's direction
+       bool inside;    //Point's location
+       double intensity;
+       int type;
+
+};
+
+#endif // __MAR__KERNEL__POINT__HXX__
+
diff --git a/lib/maracasVisuLib/src/kernel/marSimpleDicom.cpp b/lib/maracasVisuLib/src/kernel/marSimpleDicom.cpp
new file mode 100644 (file)
index 0000000..da0ed21
--- /dev/null
@@ -0,0 +1,596 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marSimpleDicom.cpp,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:56 $
+ Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+
+   This software is distributed WITHOUT ANY WARRANTY; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#pragma warning ( disable : 4251 )
+#endif //_MSC_VER
+
+// PS -> #include "gdcm.h"
+#include "marSimpleDicom.h"
+#include <wx/file.h>
+#include <wx/filename.h>
+#include <wx/dir.h>
+#include <vector>
+#include <string>
+// PS -> #include "vtkGdcmReader.h"
+#include <vtkImageChangeInformation.h>
+#include <vtkImageCast.h>
+#include <vtkImageResample.h>
+#include <vtkImageShiftScale.h>
+// PS -> #include <gdcmHeaderHelper.h>
+#include <vtkCommand.h>
+#include <vtkUnsignedShortArray.h>
+#include <vtkPointData.h>
+
+#include <wx/gauge.h>
+#include <wx/app.h>
+
+
+
+//----------------------------------------------------------------------------
+// Callback for the interaction
+class marProgressObserver : public vtkCommand
+{
+public:
+       static marProgressObserver *New()
+    { return new marProgressObserver; }
+    marProgressObserver()
+    {
+               this->FrameGauge = NULL;
+    }
+       virtual void Execute(vtkObject *wdg, unsigned long event, void* calldata)
+    {
+               if ( this->FrameGauge )
+        {
+                       int val = this->FrameGauge->GetValue();
+                       this->FrameGauge->SetValue( val + 1);
+                       //wxYield();
+                       //wxSafeYield();
+                       //wxYieldIfNeeded();
+                       //wxWakeUpIdle();
+                       //wxSafeYield( this->FrameGauge, FALSE);
+        }
+    }
+       wxGauge *FrameGauge;
+};
+//----------------------------------------------------------------------------
+
+
+static char* DicomTagsNames[] = {
+    "ID_File_Name",
+               "ID_SOP_Class_UID",                     //!0008 0016 UI ID SOP Class UID
+               "ID_SOP_Instance_UID",                  //!0008 0018 UI ID SOP Instance UID
+               "ID_Study_Date",                        //!0008 0020 DA ID Study Date
+               "ID_Series_Date",                       //!0008 0021 DA ID Series Date
+               "ID_Acquisition_Date",                  //!0008 0022 DA ID Acquisition Date
+               "ID_Image_Date",                        //!0008 0023 DA ID Image Date
+               "ID_Study_Time",                        //!0008 0030 TM ID Study Time
+               "ID_Series_Time",                       //!0008 0031 TM ID Series Time
+               "ID_Acquisition_Time",                  //!0008 0032 TM ID Acquisition Time
+               "ID_Image_Time",                        //!0008 0033 TM ID Image Time
+               "ID_Modality",                          //!0008 0060 CS ID Modality
+               "ID_Manufacturer",                      //!0008 0070 LO ID Manufacturer
+               "ID_Institution_Name",                  //!0008 0080 LO ID Institution Name
+               "ID_Study_Description",                 //!0008 1030 LO ID Study Description
+               "ID_Series_Description",                //!0008 103e LO ID Series Description
+               "ID_Admitting_Diagnoses_Description",   //!0008 1080 LO ID Admitting Diagnoses Description
+               "ID_Patient_Name",                      //!0010 0010 PN PAT Patient Name
+               "ID_Patient_ID",                        //!0010 0020 LO PAT Patient ID
+               "ID_Body_Part_Examined",                //!0018 0015 CS ACQ Body Part Examined
+               "ID_Scanning_Sequence",                 //!0018 0020 CS ACQ Scanning Sequence
+               "ID_Sequence_Variant",                  //!0018 0021 CS ACQ Sequence Variant
+               "ID_Scan_Options",                      //!0018 0022 CS ACQ Scan Options
+               "ID_MR_Acquisition_Type",               //!0018 0023 CS ACQ MR Acquisition Type
+               "ID_Sequence_Name",                     //!0018 0024 SH ACQ Sequence Name
+               "ID_Slice_Thickness",                   //!0018 0050 DS ACQ Slice Thickness
+               "ID_Repetition_Time",                   //!0018 0080 DS ACQ Repetition Time
+               "ID_Echo_Time",                         //!0018 0081 DS ACQ Echo Time
+               "ID_Inversion_Time",                    //!0018 0082 DS ACQ Inversion Time
+               "ID_Number_of_Averages",                //!0018 0083 DS ACQ Number of Averages
+               "ID_Imaging_Frequency",                 //!0018 0084 DS ACQ Imaging Frequency
+               "ID_Imaged_Nucleus",                    //!0018 0085 SH ACQ Imaged Nucleus
+               "ID_Echo_Number",                       //!0018 0086 IS ACQ Echo Number
+               "ID_Magnetic_Field_Strength",           //!0018 0087 DS ACQ Magnetic Field Strength
+               "ID_Spacing_Between_Slices",            //!0018 0088 DS ACQ Spacing Between Slices
+               "ID_Echo_Train_Length",                 //!0018 0091 IS ACQ Echo Train Length
+               "ID_Percent_Sampling",                  //!0018 0093 DS ACQ Percent Sampling
+               "ID_Percent_Phase_Field_of_View",       //!0018 0094 DS ACQ Percent Phase Field of View
+               "ID_Receiving_Coil",                    //!0018 1250 SH ACQ Receiving Coil
+               "ID_Patient_Position",                  //!0018 5100 CS ACQ Patient Position
+               "ID_Study_Instance_UID",                //!0020 000d UI REL Study Instance UID
+               "ID_Series_Instance_UID",               //!0020 000e UI REL Series Instance UID
+               "ID_Study_ID",                          //!0020 0010 SH REL Study ID
+               "ID_Series_Number",                     //!0020 0011 IS REL Series Number
+               "ID_Acquisition_Number",                //!0020 0012 IS REL Acquisition Number
+               "ID_Image_Number",                      //!0020 0013 IS REL Image Number
+               "ID_Patient_Orientation",               //!0020 0020 CS REL Patient Orientation
+               "ID_Image_Position",                    //!0020 0030 RET REL Image Position
+               "ID_Image_Position_Patient",            //!0020 0032 DS REL Image Position Patient
+               "ID_Image_Orientation",                 //!0020 0035 RET REL Image Orientation
+               "ID_Image_Orientation_Patient",         //!0020 0037 DS REL Image Orientation (Patient)
+               "ID_Location",                          //!0020 0050 RET REL Location
+               "ID_Frame_of_Reference_UID",            //!0020 0052 UI REL Frame of Reference UID
+               "ID_Slice_Location",                    //!0020 1041 DS REL Slice Location
+               "ID_Image_Comments",                    //!0020 4000 LT REL Image Comments
+               "ID_Pixel_Spacing",                     //!0028 0030 DS IMG Pixel Spacing
+               "ID_Window_Center",                     //!0028 1050 DS IMG Window Center
+               "ID_Window_Width",                      //!0028 1051 DS IMG Window Width
+};
+
+// -------------------------------------------------------------------------
+marSimpleDicom::marSimpleDicom( marParameters* p )
+: marFilesBase( p ), m_pSlicesPixels(NULL),
+m_ActualStudy(0), m_ActualSerie(0)
+// PS -> ,helper(NULL)
+{
+       // FillDicomInfo( );
+}
+
+// -------------------------------------------------------------------------
+marSimpleDicom::~marSimpleDicom(){
+       reset( );
+}
+
+
+
+/** Conversion de wxString en string. */
+//#define ws2s(as) (string(as.GetData()))
+/** Conversion de string en wxString. */
+#define s2ws(s) (wxString((s).c_str()))
+/** Conversion de C-string en wxString. */
+//#define cs2ws(s) (wxString(s))
+
+// -------------------------------------------------------------------------
+// PS -> wxArrayString marGdcmDicom::gdcmGetExamInfo( wxString directoryname )
+// PS -> {
+// PS ->       wxArrayString temparray;
+// PS ->       temparray.Alloc( 58 );
+// PS ->
+// PS ->       wxDir dir(directoryname);
+// PS ->       wxString filename;
+// PS ->       bool cont = dir.GetFirst( &filename, "*", wxDIR_FILES );
+// PS ->       filename = directoryname + "/" + filename;
+// PS ->
+// PS ->       std::string val;
+// PS ->
+// PS ->       gdcmHeader GdcmHeader( filename.c_str() );
+// PS ->       temparray.Add( filename );                                             //    "ID_File_Name",
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0016).c_str() );//    "ID_SOP_Class_UID",         //0008 0016 UI ID SOP Class UID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0018).c_str() );//    "ID_SOP_Instance_UID",      //0008 0018 UI ID SOP Instance UID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0020).c_str() );//    "ID_Study_Date",            //0008 0020 DA ID Study Date
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0021).c_str() );//    "ID_Series_Date",           //0008 0021 DA ID Series Date
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0022).c_str() );//    "ID_Acquisition_Date",      //0008 0022 DA ID Acquisition Date
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0023).c_str() );//    "ID_Image_Date",            //0008 0023 DA ID Image Date
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0030).c_str() );//    "ID_Study_Time",            //0008 0030 TM ID Study Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0031).c_str() );//    "ID_Series_Time",           //0008 0031 TM ID Series Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0032).c_str() );//    "ID_Acquisition_Time",      //0008 0032 TM ID Acquisition Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0033).c_str() );//    "ID_Image_Time",            //0008 0033 TM ID Image Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0060).c_str() );//    "ID_Modality",              //0008 0060 CS ID Modality
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0070).c_str() );//    "ID_Manufacturer",          //0008 0070 LO ID Manufacturer
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x0080).c_str() );//    "ID_Institution_Name",      //0008 0080 LO ID Institution Name
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x1030).c_str() );//    "ID_Study_Description",     //0008 1030 LO ID Study Description
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x103e).c_str() );//    "ID_Series_Description",    //0008 103e LO ID Series Description
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0008,0x1080).c_str() );//    "ID_Admitting_Diagnoses_Description", //0008 1080 LO ID Admitting Diagnoses Description
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0010,0x0010).c_str() );//    "ID_Patient_Name",          //0010 0010 PN PAT Patient Name
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0010,0x0020).c_str() );//    "ID_Patient_ID",            //0010 0020 LO PAT Patient ID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0015).c_str() );//    "ID_Body_Part_Examined",    //0018 0015 CS ACQ Body Part Examined
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0020).c_str() );//    "ID_Scanning_Sequence",     //0018 0020 CS ACQ Scanning Sequence
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0021).c_str() );//    "ID_Sequence_Variant",      //0018 0021 CS ACQ Sequence Variant
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0022).c_str() );//    "ID_Scan_Options",          //0018 0022 CS ACQ Scan Options
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0023).c_str() );//    "ID_MR_Acquisition_Type",   //0018 0023 CS ACQ MR Acquisition Type
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0024).c_str() );//    "ID_Sequence_Name",         //0018 0024 SH ACQ Sequence Name
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0050).c_str() );//    "ID_Slice_Thickness",       //0018 0050 DS ACQ Slice Thickness
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0080).c_str() );//    "ID_Repetition_Time",       //0018 0080 DS ACQ Repetition Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0081).c_str() );//    "ID_Echo_Time",             //0018 0081 DS ACQ Echo Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0082).c_str() );//    "ID_Inversion_Time",        //0018 0082 DS ACQ Inversion Time
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0083).c_str() );//    "ID_Number_of_Averages",    //0018 0083 DS ACQ Number of Averages
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0084).c_str() );//    "ID_Imaging_Frequency",     //0018 0084 DS ACQ Imaging Frequency
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0085).c_str() );//    "ID_Imaged_Nucleus",        //0018 0085 SH ACQ Imaged Nucleus
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0086).c_str() );//    "ID_Echo_Number",           //0018 0086 IS ACQ Echo Number
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0087).c_str() );//    "ID_Magnetic_Field_Strength", //0018 0087 DS ACQ Magnetic Field Strength
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0088).c_str() );//    "ID_Spacing_Between_Slices",  //0018 0088 DS ACQ Spacing Between Slices
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0091).c_str() );//    "ID_Echo_Train_Length",     //0018 0091 IS ACQ Echo Train Length
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0093).c_str() );//    "ID_Percent_Sampling",      //0018 0093 DS ACQ Percent Sampling
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x0094).c_str() );//    "ID_Percent_Phase_Field_of_View", //0018 0094 DS ACQ Percent Phase Field of View
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x1250).c_str() );//    "ID_Receiving_Coil",        //0018 1250 SH ACQ Receiving Coil
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0018,0x5100).c_str() );//    "ID_Patient_Position",      //0018 5100 CS ACQ Patient Position
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x000d).c_str() );//    "ID_Study_Instance_UID",    //0020 000d UI REL Study Instance UID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x000e).c_str() );//    "ID_Series_Instance_UID",   //0020 000e UI REL Series Instance UID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0010).c_str() );//    "ID_Study_ID",              //0020 0010 SH REL Study ID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0011).c_str() );//    "ID_Series_Number",         //0020 0011 IS REL Series Number
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0012).c_str() );//    "ID_Acquisition_Number",    //0020 0012 IS REL Acquisition Number
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0013).c_str() );//    "ID_Image_Number",          //0020 0013 IS REL Image Number
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0020).c_str() );//    "ID_Patient_Orientation",   //0020 0020 CS REL Patient Orientation
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0030).c_str() );//    "ID_Image_Position",        //0020 0030 RET REL Image Position
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0032).c_str() );//    "ID_Image_Position_Patient",  //0020 0032 DS REL Image Position Patient
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0035).c_str() );//    "ID_Image_Orientation",     //0020 0035 RET REL Image Orientation
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0037).c_str() );//    "ID_Image_Orientation_Patient", //0020 0037 DS REL Image Orientation (Patient)
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0050).c_str() );//    "ID_Location",              //0020 0050 RET REL Location
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x0052).c_str() );//    "ID_Frame_of_Reference_UID",  //0020 0052 UI REL Frame of Reference UID
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x1041).c_str() );//    "ID_Slice_Location",        //0020 1041 DS REL Slice Location
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0020,0x4000).c_str() );//    "ID_Image_Comments",        //0020 4000 LT REL Image Comments
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0028,0x0030).c_str() );//    "ID_Pixel_Spacing",         //0028 0030 DS IMG Pixel Spacing
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0028,0x1050).c_str() );//    "ID_Window_Center",         //0028 1050 DS IMG Window Center
+// PS ->       temparray.Add( GdcmHeader.GetPubElValByNumber(0x0028,0x1051).c_str() );//    "ID_Window_Width",          //0028 1051 DS IMG Window Width
+// PS ->
+// PS ->       return temparray;
+// PS ->
+// PS -> }
+#undef s2ws
+// ----------------------------------------------------------------------------
+// PS -> void marGdcmDicom::FillDicomInfo()
+// PS -> {
+// PS ->       reset();
+// PS ->
+// PS ->       //!\todo FIXME : m_DicomInfo.size() == 0
+// PS ->       //if( m_DicomInfo.size() == 0 )
+// PS ->       {
+// PS ->               wxString file,subsubdir, subdir, rootdir = getParameters( )->getStringParam( marParameters::e_dicom_images_directory );
+// PS ->               wxDir dir(rootdir);
+// PS ->               bool cont = dir.GetFirst( &subdir, "*", wxDIR_DIRS );
+// PS ->               while ( cont )
+// PS ->               {
+// PS ->                       subdir = rootdir + "/" + subdir;
+// PS ->
+// PS ->                       SerieInfo tempserie;
+// PS ->                       wxDir dir2( subdir );
+// PS ->                       bool cont2 = dir2.GetFirst( &subsubdir, "*", wxDIR_DIRS );
+// PS ->                       while ( cont2 )
+// PS ->                       {
+// PS ->                               subsubdir = subdir + "/" + subsubdir;
+// PS ->                               wxArrayString temptemp(gdcmGetExamInfo(subsubdir));
+// PS ->                               tempserie.push_back(temptemp);
+// PS ->                               cont2 = dir2.GetNext(&subsubdir);
+// PS ->                       }
+// PS ->
+// PS ->                       m_DicomInfo.push_back( tempserie );
+// PS ->                       cont = dir.GetNext(&subdir);
+// PS ->               }
+// PS ->       }
+// PS -> }
+//-------------------------------------------------------------------------
+void marSimpleDicom::loadActualSerie( wxGauge* gauge)
+{
+       // PS ->   #ifdef DXMM
+       loadVolumeDXMM( true , gauge);
+       // PS ->   #else
+       // PS ->   loadVolume( true , gauge);
+       // PS ->   #endif
+}
+
+// -------------------------------------------------------------------------
+// PS -> void marGdcmDicom::loadVolume( bool force , wxGauge *gauge)
+// PS -> {
+// PS ->   float spacing[3];
+// PS ->   vtkGdcmReader *gdcmReader = NULL;
+// PS ->
+// PS ->   if( force || !_volume )
+// PS ->   {
+// PS ->     freeVolume( );
+// PS ->
+// PS ->     wxFileName temp(m_DicomInfo[m_ActualStudy][m_ActualSerie][ID_File_Name]);
+// PS ->
+// PS ->     helper = new gdcmSerieHeaderHelper();
+// PS ->     helper->SetDirectory( temp.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR ).c_str() );
+// PS ->     helper->OrderGdcmFileList();
+// PS ->
+// PS ->     std::list<gdcmHeaderHelper*> flist = helper->GetGdcmFileList();
+// PS ->     if( flist.size() > 0)
+// PS ->     {
+// PS ->       gdcmReader = vtkGdcmReader::New();
+// PS ->       for(std::list<gdcmHeaderHelper*>::iterator it = flist.begin(); it != flist.end(); it++ )
+// PS ->       {
+// PS ->         gdcmReader->AddFileName( (*it)->GetFileName().c_str() );
+// PS ->       }
+// PS ->     } // fi
+// PS ->   } // fi
+// PS ->
+// PS ->   marProgressObserver *progressEvent = marProgressObserver::New();
+// PS ->   progressEvent->FrameGauge = gauge;
+// PS ->   //gdcmReader->AddObserver( vtkCommand::ProgressEvent, progressEvent);
+// PS ->   progressEvent->Delete();
+// PS ->
+// PS ->   //To simplyfy calculation later I turn Origin to (0, 0, 0)
+// PS ->   //this shouldn't be 'trop grave'
+// PS ->   vtkImageChangeInformation *change = vtkImageChangeInformation::New();
+// PS ->   change->SetInput( gdcmReader->GetOutput() );
+// PS ->   change->SetOutputOrigin( 0, 0, 0);
+// PS ->   change->Update();
+// PS ->
+// PS ->   float *range = change->GetOutput()->GetScalarRange();
+// PS ->
+// PS ->   //Our algorithm are made based on unsigned short pixel/voxel:
+// PS ->   //We need to cast our imagedata
+// PS ->   vtkImageCast *cast = vtkImageCast::New();
+// PS ->   cast->SetInput( change->GetOutput() );
+// PS ->   cast->SetOutputScalarTypeToUnsignedShort();
+// PS ->   cast->Update(); //important
+// PS ->
+// PS ->   //As I need to shift & scale I don't need anymore vtkImageCast:
+// PS -> /*  vtkImageShiftScale *shift = vtkImageShiftScale::New();
+// PS ->   shift->SetInput( change->GetOutput() );
+// PS ->   shift->SetShift( -range[0] );
+// PS ->   shift->SetScale( VTK_UNSIGNED_SHORT_MAX / (range[1] - range[0]) );
+// PS ->   shift->SetOutputScalarTypeToUnsignedShort();
+// PS ->   shift->Update();*/
+// PS ->
+// PS ->   cast->GetOutput()->GetSpacing( spacing );
+// PS ->   getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, spacing[0] );
+// PS ->   getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, spacing[1] );
+// PS ->   getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, spacing[2] );
+// PS ->
+// PS ->   //FIXME: kVolume doesn't need to be -again- matrix rotated (done in vtkGdcmReader)!!
+// PS ->   _volume = new kVolume( cast->GetOutput() );
+// PS ->
+// PS ->   //!\todo thanks
+// PS ->   if(gdcmReader) gdcmReader->Delete();
+// PS ->   cast->Delete();
+// PS ->   change->Delete();
+// PS -> }
+
+void marSimpleDicom::loadVolumeDXMM( bool force , wxGauge *gauge)
+{
+// PS ->
+// PS ->  FILE *stream;
+// PS ->  char string[20];
+// PS ->  wxString prefix, fileParam, fileVol, rootdir;
+// PS ->  rootdir=wxString("c:/temp");
+// PS ->  wxDir dir(rootdir);
+// PS ->  int dimX, dimY, dimZ;
+// PS ->  float spacing[3];
+// PS ->  vtkImageReader *volVTK = NULL;
+// PS ->
+// PS ->  fileParam = rootdir + "/" + "paramDxMM.txt";
+// PS ->  stream = fopen(fileParam.c_str(),"r");
+// PS ->
+// PS ->  wxString errorMsg;
+// PS ->  errorMsg= "Cannot open file "+fileParam;
+// PS ->  wxASSERT_MSG(stream!=NULL,errorMsg);
+// PS ->
+// PS ->  fscanf(stream,"%s", string);
+// PS ->  dimX = atoi(string);
+// PS ->  fscanf(stream,"%s", string);
+// PS ->  dimY = atoi(string);
+// PS ->  fscanf(stream,"%s", string);
+// PS ->  dimZ = atoi(string);
+// PS ->  fscanf(stream,"%s", string);
+// PS ->  spacing[0] = atof(string);
+// PS ->  fscanf(stream,"%s", string);
+// PS ->  spacing[1] = atof(string);
+// PS ->  fscanf(stream,"%s", string);
+// PS ->  spacing[2] = atof(string);
+// PS ->  fclose(stream);
+// PS ->
+// PS ->  getParameters( )->setDoubleParam( marParameters::e_voxel_x_dimension, spacing[0] );
+// PS ->  getParameters( )->setDoubleParam( marParameters::e_voxel_y_dimension, spacing[1] );
+// PS ->  getParameters( )->setDoubleParam( marParameters::e_voxel_z_dimension, spacing[2] );
+// PS ->
+// PS ->  if( force || !_volume )
+// PS ->  {
+// PS ->       freeVolume( );
+// PS ->  } // fi
+// PS ->
+// PS ->  marProgressObserver *progressEvent = marProgressObserver::New();
+// PS ->  progressEvent->FrameGauge = gauge;
+// PS ->  progressEvent->Delete();
+// PS ->
+// PS ->  prefix = rootdir + "/" + "imaDxMM";
+// PS ->  volVTK = vtkImageReader::New();
+// PS ->  volVTK->SetDataByteOrderToLittleEndian();
+// PS ->  volVTK->SetDataScalarTypeToUnsignedShort();
+// PS ->  volVTK->SetDataExtent(0, dimX-1, 0, dimY-1, 0, dimZ-1);
+// PS ->  volVTK->SetFilePrefix( prefix.c_str() );
+// PS ->  volVTK->SetFilePattern( "%s%d.raw");
+// PS ->  volVTK->SetDataSpacing(spacing[0],spacing[1],spacing[2]);
+// PS ->  volVTK->Update();
+// PS ->  vtkImageResample* ir = vtkImageResample::New( );
+// PS ->  ir->SetInput(volVTK->GetOutput());
+// PS ->  ir->SetDimensionality( 3 );
+// PS ->  ir->SetAxisOutputSpacing( 0, getParameters( )->getVoxelSize( ) );
+// PS ->  ir->SetAxisOutputSpacing( 1, getParameters( )->getVoxelSize( ) );
+// PS ->  ir->SetAxisOutputSpacing( 2, getParameters( )->getVoxelSize( ) );
+// PS ->  ir->InterpolateOn( );
+// PS ->  ir->Update( );    //important
+// PS ->
+// PS ->  _volume = new kVolume( ir->GetOutput( ) );
+// PS ->
+// PS ->  //!\todo thanks
+// PS ->  if (ir) ir->Delete( );
+// PS ->  if(volVTK) volVTK->Delete();
+
+       if (m_pSlicesPixels!=NULL)
+       {
+               vtkUnsignedShortArray * dataArray=vtkUnsignedShortArray::New();
+
+               int iRow,iColumn,iSlice,iPixel;
+
+               int iiSlice;
+               for (iiSlice=0;iiSlice<m_nSlices;iiSlice++)
+               {
+                       if (_investSliceOrder==false) {
+                               iSlice=iiSlice;
+                       } else {
+                               iSlice=(iiSlice*(-1)) + m_nSlices - 1;
+                       }
+
+                       for (iRow=0;iRow<m_nY;iRow++)
+                       {
+                               for (iColumn=0;iColumn<m_nX;iColumn++)
+                               {
+                                       iPixel=(m_nSlices-1-iSlice)*m_nX*m_nY + (m_nY-1-iRow)*m_nX + iColumn;
+                                       dataArray->InsertNextValue(m_pSlicesPixels[iPixel]);
+                               }                               
+                       }
+               }
+               vtkImageData*imgData=vtkImageData::New();
+               imgData->SetDimensions(m_nX,m_nY,m_nSlices);
+               imgData->SetSpacing(m_PixelSpacingRow,m_PixelSpacingColumn,m_PixelSpacingSlice);
+               imgData->SetOrigin(0,0,0);
+               imgData->SetScalarTypeToUnsignedShort();
+               imgData->GetPointData()->SetScalars(dataArray);
+
+
+               // TO DO : remplir le vtkImageResample
+               vtkImageResample* ir = vtkImageResample::New();
+               ir->SetInput(imgData);
+               ir->SetDimensionality( 3 );
+               ir->SetAxisOutputSpacing( 0, getParameters()->getVoxelSize() );
+               ir->SetAxisOutputSpacing( 1, getParameters()->getVoxelSize() );
+               ir->SetAxisOutputSpacing( 2, getParameters()->getVoxelSize() );
+               ir->InterpolateOn( );
+               ir->Update( );    //important
+
+// EED
+//             _volume = new kVolume( ir->GetOutput( ) );
+               SetVolume( new kVolume( ir->GetOutput()  )  );
+
+               //!\todo thanks
+               if (ir) ir->Delete();
+               if(imgData) imgData->Delete();
+               if(dataArray) dataArray->Delete();
+        getParameters( )->setDoubleParam( marParameters::e_RescaleSlope    , m_RescaleSlope     );
+        getParameters( )->setDoubleParam( marParameters::e_RescaleIntercept, m_RescaleIntercept );
+       }
+
+}
+
+
+// -------------------------------------------------------------------------
+void marSimpleDicom::copyFrom( const marObject& from )
+{ //!\todo TODO
+}
+
+// -------------------------------------------------------------------------
+bool marSimpleDicom::save( std::ofstream& os )
+{
+/*  int s = _actualStudy.length( );
+
+ os.write( ( const char* )&s, sizeof( int ) );
+ os.write( ( char* )_actualStudy.c_str( ), s * sizeof( char ) );
+
+  s = _actualSerie.length( );
+
+   os.write( ( const char* )&s, sizeof( int ) );
+       os.write( ( char* )_actualSerie.c_str( ), s * sizeof( char ) );*/
+
+       for(std::vector<SerieInfo>::iterator it1 = m_DicomInfo.begin();
+       it1 != m_DicomInfo.end(); it1++ )
+    {
+               for(std::vector<wxArrayString>::iterator it2 = it1->begin();
+               it2 != it1->end(); it2++ )
+        {
+            for(int i=0; i<it2->GetCount(); i++)
+                       {
+                //wxString temp( it2->Item(i) );
+                os << it2->Item(i); //temp;
+                       }
+        }
+    }
+
+
+
+       return( true );
+}
+
+// -------------------------------------------------------------------------
+bool marSimpleDicom::load( std::ifstream& is )
+{
+/*  int s;
+
+ reset( );
+
+  is.read( ( char* )&s, sizeof( int ) );
+  _actualStudy.resize( s );
+  is.read( ( char* )_actualStudy.c_str( ), s * sizeof( char ) );
+  is.read( ( char* )&s, sizeof( int ) );
+  _actualSerie.resize( s );
+       is.read( ( char* )_actualSerie.c_str( ), s * sizeof( char ) );*/
+
+       for(std::vector<SerieInfo>::iterator it1 = m_DicomInfo.begin();
+       it1 != m_DicomInfo.end(); it1++ )
+    {
+               for(std::vector<wxArrayString>::iterator it2 = it1->begin();
+               it2 != it1->end(); it2++ )
+        {
+            for(int i=0; i<it2->GetCount(); i++)
+                       {
+                std::string temp;
+                is >> temp ;
+                it2->Add( temp.c_str() );
+                       }
+        }
+    }
+
+
+       return( true );
+}
+
+// -------------------------------------------------------------------------
+void marSimpleDicom::SetVolumeData( int dimX, 
+                                                                   int dimY, 
+                                                                       int dimZ, 
+                                                                       float spacingX, 
+                                                                       float spacingY, 
+                                                                       float spacingZ,
+                                                                       float rescaleSlope,
+                                                                       float rescaleIntercept,
+                                                                       unsigned short *pixels)
+{
+       m_pSlicesPixels         = pixels;
+       m_nX                            = dimX;
+       m_nY                            = dimY;
+       m_nSlices                       = dimZ;
+       m_PixelSpacingColumn= spacingX;
+       m_PixelSpacingRow       = spacingY;
+       m_PixelSpacingSlice     = spacingZ;
+       m_RescaleSlope          = rescaleSlope;
+       m_RescaleIntercept      = rescaleIntercept;
+}
+
+// -------------------------------------------------------------------------
+void marSimpleDicom::reset( ){
+//             freeVolume( );
+               //_imageFileNames.Clear( );
+               
+               int n = m_DicomInfo.size();
+               ///\todo does this clear evrythg ?
+               for(int i=0; i<n; i++) {
+                       m_DicomInfo[i].clear();
+               }
+               m_DicomInfo.clear();
+               
+// PS ->               if(helper)
+// PS ->                       delete helper;
+// PS ->               helper = NULL;
+               m_pSlicesPixels         =       NULL;
+               m_nX                            =       0;
+               m_nY                            =       0;
+               m_nSlices                       =       0;
+               m_PixelSpacingColumn=   0;
+               m_PixelSpacingRow       =       0;
+               m_PixelSpacingSlice     =       0;
+               m_RescaleSlope          =       1;
+               m_RescaleIntercept      =       0;
+    }
+
+// -------------------------------------------------------------------------
+void marSimpleDicom::SetInvestSliceOrder(bool investSliceOrder){
+       _investSliceOrder=investSliceOrder;
+}
+// -------------------------------------------------------------------------
+
diff --git a/lib/maracasVisuLib/src/kernel/marSimpleDicom.h b/lib/maracasVisuLib/src/kernel/marSimpleDicom.h
new file mode 100644 (file)
index 0000000..8872fe9
--- /dev/null
@@ -0,0 +1,208 @@
+/*=========================================================================
+
+ Program:   wxMaracas
+ Module:    $RCSfile: marSimpleDicom.h,v $
+ Language:  C++
+ Date:      $Date: 2008/10/31 16:32:56 $
+ Version:   $Revision: 1.1 $
+  Copyright: (c) 2002, 2003
+  License:
+  
+   This software is distributed WITHOUT ANY WARRANTY; without even 
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+   PURPOSE.  See the above copyright notice for more information.
+   
+=========================================================================*/
+
+#ifndef __MAR__KERNEL__MARSIMPLEDICOM__HXX__
+#define __MAR__KERNEL__MARSIMPLEDICOM__HXX__
+
+#include "marDicomBase.h"
+
+#include "volume.hxx"
+#include <wx/string.h>
+#include <wx/gauge.h>
+// PS -> #include <gdcm.h>
+// PS -> #include <gdcmHeaderHelper.h>
+#include <vector>
+// PS -> #include <gdcmElValSet.h>
+
+typedef std::vector<wxArrayString> SerieInfo;  //DICOM info for each serie
+                                                                                          /**
+* Shouldn't we break the dependencies to wx ???
+* 
+* We use vector instead of list for efficiency: for access time
+* futhermore the number of patient is not changing a lot, so we 
+* might add the number of patient to params.dat, to allocate the right 
+* number of vector
+*
+*/
+
+// EED Borrame 
+//class MAR_KERNEL_EXPORT marGdcmDicom : public marObject
+
+class marSimpleDicom : public marFilesBase
+{
+public:
+       
+    enum DicomTags
+    {
+               ID_File_Name = 0                   ,
+                       ID_SOP_Class_UID                   ,//!0008 0016 UI ID SOP Class UID
+                       ID_SOP_Instance_UID                ,//!0008 0018 UI ID SOP Instance UID
+                       ID_Study_Date                      ,//!0008 0020 DA ID Study Date
+                       ID_Series_Date                     ,//!0008 0021 DA ID Series Date
+                       ID_Acquisition_Date                ,//!0008 0022 DA ID Acquisition Date
+                       ID_Image_Date                      ,//!0008 0023 DA ID Image Date
+                       ID_Study_Time                      ,//!0008 0030 TM ID Study Time
+                       ID_Series_Time                     ,//!0008 0031 TM ID Series Time
+                       ID_Acquisition_Time                ,//!0008 0032 TM ID Acquisition Time
+                       ID_Image_Time                      ,//!0008 0033 TM ID Image Time
+                       ID_Modality                        ,//!0008 0060 CS ID Modality
+                       ID_Manufacturer                    ,//!0008 0070 LO ID Manufacturer
+                       ID_Institution_Name                ,//!0008 0080 LO ID Institution Name
+                       ID_Study_Description               ,//!0008 1030 LO ID Study Description
+                       ID_Series_Description              ,//!0008 103e LO ID Series Description
+                       ID_Admitting_Diagnoses_Description ,//!0008 1080 LO ID Admitting Diagnoses Description
+                       ID_Patient_Name                    ,//!0010 0010 PN PAT Patient Name
+                       ID_Patient_ID                      ,//!0010 0020 LO PAT Patient ID
+                       ID_Body_Part_Examined              ,//!0018 0015 CS ACQ Body Part Examined
+                       ID_Scanning_Sequence               ,//!0018 0020 CS ACQ Scanning Sequence
+                       ID_Sequence_Variant                ,//!0018 0021 CS ACQ Sequence Variant
+                       ID_Scan_Options                    ,//!0018 0022 CS ACQ Scan Options
+                       ID_MR_Acquisition_Type             ,//!0018 0023 CS ACQ MR Acquisition Type
+                       ID_Sequence_Name                   ,//!0018 0024 SH ACQ Sequence Name
+                       ID_Slice_Thickness                 ,//!0018 0050 DS ACQ Slice Thickness
+                       ID_Repetition_Time                 ,//!0018 0080 DS ACQ Repetition Time
+                       ID_Echo_Time                       ,//!0018 0081 DS ACQ Echo Time
+                       ID_Inversion_Time                  ,//!0018 0082 DS ACQ Inversion Time
+                       ID_Number_of_Averages              ,//!0018 0083 DS ACQ Number of Averages
+                       ID_Imaging_Frequency               ,//!0018 0084 DS ACQ Imaging Frequency
+                       ID_Imaged_Nucleus                  ,//!0018 0085 SH ACQ Imaged Nucleus
+                       ID_Echo_Number                     ,//!0018 0086 IS ACQ Echo Number
+                       ID_Magnetic_Field_Strength         ,//!0018 0087 DS ACQ Magnetic Field Strength
+                       ID_Spacing_Between_Slices          ,//!0018 0088 DS ACQ Spacing Between Slices
+                       ID_Echo_Train_Length               ,//!0018 0091 IS ACQ Echo Train Length
+                       ID_Percent_Sampling                ,//!0018 0093 DS ACQ Percent Sampling
+                       ID_Percent_Phase_Field_of_View     ,//!0018 0094 DS ACQ Percent Phase Field of View
+                       ID_Receiving_Coil                  ,//!0018 1250 SH ACQ Receiving Coil
+                       ID_Patient_Position                ,//!0018 5100 CS ACQ Patient Position
+                       ID_Study_Instance_UID              ,//!0020 000d UI REL Study Instance UID
+                       ID_Series_Instance_UID             ,//!0020 000e UI REL Series Instance UID
+                       ID_Study_ID                        ,//!0020 0010 SH REL Study ID
+                       ID_Series_Number                   ,//!0020 0011 IS REL Series Number
+                       ID_Acquisition_Number              ,//!0020 0012 IS REL Acquisition Number
+                       ID_Image_Number                    ,//!0020 0013 IS REL Image Number
+                       ID_Patient_Orientation             ,//!0020 0020 CS REL Patient Orientation
+                       ID_Image_Position                  ,//!0020 0030 RET REL Image Position
+                       ID_Image_Position_Patient          ,//!0020 0032 DS REL Image Position Patient
+                       ID_Image_Orientation               ,//!0020 0035 RET REL Image Orientation
+                       ID_Image_Orientation_Patient       ,//!0020 0037 DS REL Image Orientation (Patient)
+                       ID_Location                        ,//!0020 0050 RET REL Location
+                       ID_Frame_of_Reference_UID          ,//!0020 0052 UI REL Frame of Reference UID
+                       ID_Slice_Location                  ,//!0020 1041 DS REL Slice Location
+                       ID_Image_Comments                  ,//!0020 4000 LT REL Image Comments
+                       ID_Pixel_Spacing                   ,//!0028 0030 DS IMG Pixel Spacing
+                       ID_Window_Center                   ,//!0028 1050 DS IMG Window Center
+                       ID_Window_Width                    ,//!0028 1051 DS IMG Window Width
+                       ID_dicom_tags_count
+    };
+       
+public:
+       void SetVolumeData( int dimX,
+                                               int dimY,
+                                               int dimZ, 
+                               float spacingX, 
+                                               float spacingY, 
+                                               float spacingZ, 
+                                               float rescaleSlope,
+                                               float rescaleIntercept,
+                                               unsigned short * pixels);
+       
+    marSimpleDicom( marParameters* p = NULL );
+       
+    virtual ~marSimpleDicom( );
+       
+    /**
+       Function which return an *ordered* array string
+       The string is ordered so that filename are in the right order
+    */
+// PS ->     wxArrayString getStudyInfo( ) { return( m_DicomInfo[m_ActualStudy][0] ); }
+// PS ->     int getNumberOfStudies( ) { return m_DicomInfo.size(); }
+// PS ->     wxArrayString getSerieInfo( ) { return( m_DicomInfo[m_ActualStudy][m_ActualSerie] ); }
+// PS ->     int getNumberOfSeries( ) { return m_DicomInfo[m_ActualStudy].size(); }
+       
+       
+// PS ->     int getNumberOfFiles( )
+// PS ->     {
+// PS ->               return m_DicomInfo[m_ActualStudy][m_ActualSerie].GetCount();
+// PS ->     }
+       
+       void SetInvestSliceOrder(bool investSliceOrder);
+
+    void loadActualSerie(wxGauge* gauge );
+       
+// PS ->     wxArrayString getImageNumbers( )
+// PS ->     {
+// PS ->               wxArrayString imageNumbers;
+// PS ->               std::list<gdcmHeaderHelper*> flist = helper->GetGdcmFileList();
+// PS ->               for(std::list<gdcmHeaderHelper*>::iterator it = flist.begin(); 
+// PS ->               it != flist.end(); it++ )
+// PS ->               {
+// PS ->                       imageNumbers.Add( wxString::Format("%d", (*it)->GetImageNumber()) );
+// PS ->               }
+// PS ->               return( imageNumbers );
+// PS ->     }
+
+       // PS ->     void loadVolume( bool force = false, wxGauge* gauge = NULL);
+    void loadVolumeDXMM( bool force = false, wxGauge* gauge = NULL);
+       
+// PS ->       
+// PS ->     bool setActualStudy( unsigned int studynumber )
+// PS ->     {
+// PS ->               m_ActualStudy = studynumber;
+// PS ->               return true;
+// PS ->     }
+// PS ->     bool setActualSerie( unsigned int serienumber )
+// PS ->     {
+// PS ->               m_ActualSerie = serienumber;
+// PS ->               return true;
+// PS ->     }
+// PS ->       
+    /** 
+       * General methods
+       */
+    void reset( );
+    void copyFrom( const marObject& from );
+       
+    /**
+       * Persistence methods
+       */
+    bool save( std::ofstream& os );
+    bool load( std::ifstream& is );
+       
+// PS ->     void FillDicomInfo();
+    
+// PS ->     wxString GetPatientName()
+// PS ->       {
+// PS ->               return wxString( helper->GetGdcmHeader()->GetPubElValByNumber(0x0010,0x0010).c_str()).Trim();//0010 0010 PN PAT Patient Name
+// PS ->       }
+       
+  private:
+         
+// PS ->         wxArrayString gdcmGetExamInfo( wxString directoryname );
+         
+         std::vector< SerieInfo > m_DicomInfo;
+         unsigned int m_ActualStudy;
+         unsigned int m_ActualSerie;
+         
+// PS ->         gdcmSerieHeaderHelper *helper;
+         unsigned short * m_pSlicesPixels;
+         int   m_nX, m_nY, m_nSlices;
+         float m_PixelSpacingColumn,m_PixelSpacingRow,m_PixelSpacingSlice;
+         float m_RescaleSlope, m_RescaleIntercept;
+         bool  _investSliceOrder;
+};
+
+#endif // __MAR__KERNEL__MARSIMPLEDICOM__HXX__
diff --git a/lib/maracasVisuLib/src/kernel/marTypes.h b/lib/maracasVisuLib/src/kernel/marTypes.h
new file mode 100644 (file)
index 0000000..998e7c9
--- /dev/null
@@ -0,0 +1,96 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: marTypes.h,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef __MAR__KERNEL__TYPES__HXX__
+#define __MAR__KERNEL__TYPES__HXX__
+
+/*! /def MAR_KERNEL_EXPORT
+ *  \brief Library export type.
+ *
+ *  Use this constant to define your class, function or variable link type.
+ *  Ex.: class MAR_KERNEL_EXPORT myClass { ... };
+ *  This is defined by means of other constants:
+ *       - MAR_KERNEL_MAKING_DLL (compilation of a dll).
+ *       - MAR_KERNEL_USING_DLL  (linking, ie, using the dll).
+ *  Note that if you want to build a static library, you should forget all
+ *  this fairy tale :-).
+ */
+
+//JHCL - Start
+//If we're using windws
+#if defined(WIN32)
+//If we're using a dynamic library
+# ifdef maracasVisuLib_BUILD_SHARED
+#   define MARACASVISULIB_EXPORTS __declspec( dllexport )
+# else
+#   define MARACASVISULIB_EXPORTS //__declspec( dllimport )
+# endif //maracasvisulib_EXPORTS
+#endif
+//JHCL - End
+
+#if defined(WIN32) //&& defined(MARACAS_BUILD_SHARED_LIBS)
+//guerapa0
+# ifdef MaracasKernel_EXPORTS
+//querapa1
+#   define MAR_KERNEL_EXPORT __declspec( dllexport )
+# else
+#   define MAR_KERNEL_EXPORT //__declspec( dllimport )
+# endif //MaracasKernel_EXPORTS
+
+# ifdef MaracasInterfaceWX_EXPORTS
+#   define MAR_INTERFACEWX_EXPORT __declspec( dllexport )
+# else
+#   define MAR_INTERFACEWX_EXPORT //__declspec( dllimport )
+# endif //MaracasInterfaceWX_EXPORTS
+
+#else
+
+# define MAR_KERNEL_EXPORT
+# define MAR_INTERFACEWX_EXPORT
+
+#endif //WIN32
+// Other ridiculous constants and typedefs. Just for fun!
+#define MAR_DEFAULT_FILE_PARAMETERS      "params.dat"
+#define MAR_DEFAULT_FILE_DICTIONARY      "marDict.txt"
+#define MAR_DEFAULT_FILE_EXT_EXPERIMENT  ".exp"
+
+
+/*! \file kgfo_typ.hxx
+ *  \brief General constants, types, enums, structs.
+ *
+ *  This file is included by all project files.
+ */
+typedef unsigned char  uchar;  /*!< unsigned char redefintion. */
+typedef unsigned int   uint;   /*!< unsigned int redefintion. */
+typedef unsigned long  ulong;  /*!< unsigned long redefintion. */
+typedef unsigned short ushort; /*!< unsigned short redefintion. */
+
+// Is this compilation using LibIDO?
+#define KGFO_USE_IDO
+
+// Is this compilation using VTK?
+#define KGFO_USE_VTK
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4018 )
+// 'this' : used in base member initializer list ... so what !
+#pragma warning ( disable : 4355 )
+#endif //_MSC_VER
+
+#endif // __MAR__KERNEL__TYPES__HXX__
+
+// eof - marTypes.h
diff --git a/lib/maracasVisuLib/src/kernel/marUtils.cpp b/lib/maracasVisuLib/src/kernel/marUtils.cpp
new file mode 100644 (file)
index 0000000..224d127
--- /dev/null
@@ -0,0 +1,49 @@
+
+#include "marUtils.h"
+
+// ----------------------------------------------------------------------------
+marUtils::marUtils()
+{
+
+}
+
+// ----------------------------------------------------------------------------
+marUtils::~marUtils()
+{
+
+}
+// ----------------------------------------------------------------------------
+double marUtils::obtainAverage(std::vector<double> list)
+{
+       double average = 0;
+       for (int i = 0; i < list.size(); i++)
+       {
+               average += list[i];
+       }
+
+       if (list.size() > 0)
+       {
+               average = average / list.size();
+       }
+
+       return average;
+
+}
+
+// ----------------------------------------------------------------------------
+double marUtils::obtainStandardDeviation(std::vector<double> list, double average)
+{
+       double std = 0;
+
+       for(int i = 0; i < list.size(); i++)
+       {
+               std += pow(list[i] - average,2.0);
+       }
+
+       if (list.size() > 0)
+       {
+               std = sqrt(std/list.size());
+       }
+
+       return std;
+}
diff --git a/lib/maracasVisuLib/src/kernel/marUtils.h b/lib/maracasVisuLib/src/kernel/marUtils.h
new file mode 100644 (file)
index 0000000..81e7d7b
--- /dev/null
@@ -0,0 +1,21 @@
+// marUtils.h: interface for the marUtils class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef __MAR__KERNEL__UTILS__HXX__
+#define __MAR__KERNEL__UTILS__HXX__
+
+#include <vector>
+#include <math.h>
+class marUtils  
+{
+public:
+       marUtils();
+       ~marUtils();
+
+       double obtainAverage(std::vector<double> list);
+       double obtainStandardDeviation(std::vector<double> list, double average);
+
+};
+
+#endif 
diff --git a/lib/maracasVisuLib/src/kernel/marVector.cpp b/lib/maracasVisuLib/src/kernel/marVector.cpp
new file mode 100644 (file)
index 0000000..7f92f0a
--- /dev/null
@@ -0,0 +1,720 @@
+// marVector.cpp: implementation of the marVector class.
+//
+//////////////////////////////////////////////////////////////////////
+#include "marVector.h"
+#include <assert.h>
+#include <math.h>
+
+
+//////////////////////////////////////////////////////////////////////
+// Constructeurs
+//////////////////////////////////////////////////////////////////////
+marVector::marVector(size_t s)
+       :shallowCopy(false)
+{
+       if (s!=0)
+       {
+               _data=new double[s];
+               _size=s;
+       }
+       else
+       {
+               _data=NULL;
+               _size=0;
+               assert(false);
+       }
+}
+
+marVector::marVector(const marVector &v)
+       :shallowCopy(false)
+{
+       _size=v._size;
+       _data=new double[_size];
+       int i;
+       for (i=0;i<_size;i++)
+       {
+               _data[i]=v._data[i];
+       }
+}
+
+marVector::marVector(double*v,size_t s)
+       :shallowCopy(true)
+{
+       if (s!=0)
+       {
+               _size=s;
+               _data=v;
+// PS ->               _data=new double[_size];
+// PS ->               for (int i=0;i<_size;i++)
+// PS ->               {
+// PS ->                       _data[i]=v[i];
+// PS ->               }
+               
+       }
+       else
+       {
+               _data=NULL;
+               _size=0;
+               assert(false);
+       }
+       
+}
+
+//////////////////////////////////////////////////////////////////////
+// Destructeur
+//////////////////////////////////////////////////////////////////////
+marVector::~marVector()
+{
+       if (!shallowCopy) 
+       {
+               delete _data;
+       }
+       else
+       {
+               _data=NULL;
+       }
+}
+
+//////////////////////////////////////////////////////////////////////
+// Opérateurs
+//////////////////////////////////////////////////////////////////////
+// ---------------------------------------------------------------------
+/*Affichage*/
+std::ostream& operator<<(std::ostream& os,const marVector& v)
+{
+       int i;
+    for(i=0;i < v.size();i++) 
+       {
+               os << " " << v(i);
+       }
+       os <<"\n";
+    return(os);
+}
+
+// ---------------------------------------------------------------------
+/*Casting*/
+marVector::operator double*() const 
+{ 
+       return(_data);
+}
+
+// ---------------------------------------------------------------------
+/*Indexation*/
+double& marVector::operator()(size_t i) 
+{ 
+       return(_data[i]);
+}
+
+const double& marVector::operator()(size_t i) const
+{
+       return(_data[i]);
+}
+
+// ---------------------------------------------------------------------
+/*Affectation*/
+marVector& marVector::operator=(const marVector& o)
+{
+       _size=o._size;
+       if (!(_data==NULL)&&(!shallowCopy))
+       {
+               delete _data;
+       }
+       shallowCopy=false;
+       _data=new double[_size];
+       int i;
+       for (i=0;i<_size;i++)
+       {
+               _data[i]=o._data[i];
+       }
+       return (*this);
+}
+
+marVector& marVector::operator=(double o)
+{
+       if (_size!=0)
+       {
+               if (!(_data==NULL)&&(!shallowCopy))
+               {
+                       delete _data;
+               }
+               shallowCopy=false;
+               _data=new double[_size];
+               int i;
+               for (i=0;i<_size;i++)
+               {
+                       _data[i]=o;
+               }
+       }
+       else
+       {
+               assert(false);
+       }
+       return (*this);
+}
+
+marVector& marVector::operator=(double*o)
+{
+       if (_size!=0)
+       {
+               if (!(_data==NULL)&&(!shallowCopy))
+               {
+                       delete _data;
+               }
+               shallowCopy=false;
+               _data=new double[_size];
+               int i;
+               for (i=0;i<_size;i++)
+               {
+                       _data[i]=o[i];
+               }
+       }
+       else
+       {
+               assert(false);
+       }
+       return (*this);
+}
+
+// ---------------------------------------------------------------------
+/*Comparaison*/
+bool marVector::operator==(const marVector& o) const
+{
+    bool equal=true;
+       
+    if(_size!=o._size)
+       {
+               return(false);
+       }
+       
+       int i;
+       for(i=0;i<_size && equal;i++)
+       {
+               equal=equal && (_data[i]==o._data[i]); 
+       }
+    return(equal);
+}
+
+bool marVector::operator!=(const marVector& o) const
+{
+       return(!((*this)==o));
+}
+
+// ---------------------------------------------------------------------
+/*Addition*/
+marVector marVector::operator+(const marVector& o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if ((o._size!=s) || (s==0))
+       {
+               assert(false);
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] +=o._data[i];
+               }
+       }
+       return result;
+}
+
+marVector marVector::operator+(double o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if (s==0)
+       {
+               assert(false);
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] +=o;
+               }
+       }
+       return result;
+}
+
+marVector marVector::operator+(double*o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if (s==0)
+       {
+               assert(false);
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] +=o[i];
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Addition + Affectation*/
+marVector& marVector::operator+=(const marVector& o)
+{
+       if ((o._size!=_size) || (_size==0))
+       {
+               assert(false);          
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] +=o._data[i];
+               }
+       }
+       return (*this);
+}
+
+marVector& marVector::operator+=(double o)
+{
+       if (_size==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] +=o;
+               }
+       }
+    return(*this);
+}
+
+marVector& marVector::operator+=(double*o)
+{
+       if (_size==0)
+       {
+               assert(false);          
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] +=o[i];
+               }
+       }
+    return(*this);
+}
+
+// ---------------------------------------------------------------------
+/*Soustraction*/
+marVector marVector::operator-(const marVector& o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if ((o._size !=s) || (s==0))
+       {
+               assert(false);          
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] -=o._data[i];
+               }
+       }
+       return result;
+}
+
+marVector marVector::operator-(double o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if (s==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] -=o;
+               }
+       }
+       return result;
+}
+
+marVector marVector::operator-(double*o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if (s==0)
+       {
+               assert(false);          
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] -=o[i];
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Sooustraction + Affection*/
+marVector& marVector::operator-=(const marVector& o)
+{
+       if ((o._size!=_size) || (_size==0))
+       {
+               assert(false);          
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] -=o._data[i];
+               }
+       }
+       return (*this);
+}
+
+marVector& marVector::operator-=(double o)
+{
+       if (_size==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] -=o;
+               }
+       }
+    return(*this);
+}
+
+marVector& marVector::operator-=(double*o)
+{
+       if (_size==0)
+       {
+               assert(false);          
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] -=o[i];
+               }
+       }
+    return(*this);
+}
+
+// ---------------------------------------------------------------------
+/*Multiplication (produit scalaire)*/
+marVector marVector::operator*(double o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if (s==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i]*=o;
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Multiplication (produit scalaire) + Affectation*/
+marVector& marVector::operator*=(double o)
+{
+       if (_size==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i]*=o;
+               }
+       }
+    return(*this);
+}
+
+// ---------------------------------------------------------------------
+/*Division (division scalaire)*/
+marVector marVector::operator/(double o)
+{
+       marVector result(*this);
+       size_t s=result._size;
+       
+       if (s==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < s;i++)
+               {
+                       result._data[i] /=o;
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Division (division scalaire) + Affectation*/
+marVector& marVector::operator/=(double o)
+{
+       if (_size==0)
+       {
+               assert(false);  
+       }
+       else 
+       {
+               for (int i=0;i < _size;i++)
+               {
+                       _data[i] /=o;
+               }
+       }
+    return(*this);
+}
+
+//////////////////////////////////////////////////////////////////////
+// Opérations
+//////////////////////////////////////////////////////////////////////
+// ---------------------------------------------------------------------
+/*Produit scalaire*/
+double marVector::dot(const marVector& o)
+{
+    double result;
+       if ((_size!=o._size) || (_size==0))
+       {
+               assert(false); 
+       }
+       else
+       {
+               result=0.0;
+               for (int i=0;i<_size;i++)
+               {
+                       result+=(_data[i]*o._data[i]);
+               }
+       }
+       return result;
+}
+
+double marVector::dot(double*o)
+{
+    double result;
+       if (_size==0)
+       {
+               assert(false); 
+       }
+       else
+       {
+               result=0.0;
+               for (int i=0;i<_size;i++)
+               {
+                       result+=(_data[i]*o[i]);
+               }
+       }
+       return result;
+}
+
+// ---------------------------------------------------------------------
+/*Produit vectoriel*/
+marVector marVector::cross(const marVector& o)
+{
+    marVector result(*this);
+       if ((o._size!=_size) || (_size!=3))
+       {
+               assert(false); 
+       }
+       else
+       {
+               double S,s;
+               
+               // 1st element
+               S=_data[1]*o._data[2];
+               s=_data[2]*o._data[1];
+               result._data[0]=S - s;
+               
+               // 2nd element
+               S=_data[2]*o._data[0];
+               s=_data[0]*o._data[2];
+               result._data[1]=S - s;
+               
+               // 3rd element
+               S=_data[0]*o._data[1];
+               s=_data[1]*o._data[0];
+               result._data[2]=S - s;
+       }
+    return(result);    
+}
+
+marVector marVector::cross(double*o)
+{
+    marVector result(*this);
+       if (_size!=3)
+       {
+               assert(false); 
+       }
+       else
+       {
+               double S,s;
+               
+               // 1st element
+               S=_data[1]*o[2];
+               s=_data[2]*o[1];
+               result._data[0]=S - s;
+               
+               // 2nd element
+               S=_data[2]*o[0];
+               s=_data[0]*o[2];
+               result._data[1]=S - s;
+               
+               // 3rd element
+               S=_data[0]*o[1];
+               s=_data[1]*o[0];
+               result._data[2]=S - s;
+       }
+    return(result);
+}
+
+int marVector::scross(const marVector& o)
+{
+       if ((o._size!=_size) && (_size!=3))
+       {
+               return (1);
+       }
+       else
+       {
+               *this=cross(o);
+               return(0);
+       } 
+}
+
+int marVector::scross(double*o)
+{
+       if (_size!=3)
+       {
+               return (1);
+       }
+       else
+       {
+               *this=cross(o);
+               return(0);
+       } 
+}
+
+// ---------------------------------------------------------------------
+/*Norme euclidienne*/
+double marVector::norm2()
+// Calcule la norme euclidienne du vecteur 
+// en utilisant l'agorithme de Blue
+{
+       
+       double norme2=0.0;
+       if (_size==0)
+       {
+               assert(false);
+       }
+       else
+       {
+               const double seuil1=pow( 2., 154. ),seuil2=1/seuil1;
+               double n1=0; /* les sommes partielles */
+               double n2=0;
+               double n3=0;
+               double n4;
+               int i;
+               for ( i=0; i<_size; i++ ) 
+               {
+                       double x=_data[i];      /* x=abs(vecteur[i]) */
+                       
+                       if (x<0) 
+                       { 
+                               x=-x;
+                       }
+                       /* sommation par classe */
+                       if ( x > seuil1 ) 
+                       {
+                               x *=seuil2;
+                               n1 +=x*x;
+                       } 
+                       else if ( x < seuil2 ) 
+                       {
+                               x  *=seuil1;
+                               n2 +=x*x;
+                       } 
+                       else
+                       {
+                               n3 +=x*x;
+                       }
+               }
+               
+               n3=sqrt(n3);
+               if (n1>0)
+               {
+                       n4=seuil1 * sqrt(n1);
+               }
+               else
+               {
+                       n4=seuil2 * sqrt(n2);
+               }
+               
+// EED 
+/*
+               if (n3 < n4) 
+               {
+                       n3 /=n4;
+                       norme2=n4 * sqrt( 1 + n3*n3 );
+               } 
+               else 
+               {
+                       n4 /=n3;
+                       norme2=n3 * sqrt( 1 + n4*n4 );
+               }
+*/
+               norme2=n3;
+       }
+       return norme2;
+}
+
+// ---------------------------------------------------------------------
+/*Normalisation*/
+marVector marVector::normalize( )
+{
+       marVector result=marVector(*this);
+       result *= (1/result.norm2());
+       return result;
+}
+
+int marVector::snormalize( )
+{
+       (*this)*=(1/this->norm2());
+       return(0);
+}// renvoie 0 si OK, 1 sinon
+
+//////////////////////////////////////////////////////////////////////
+// Méthodes
+//////////////////////////////////////////////////////////////////////
+
+size_t marVector::size() const
+{
+       return _size;
+}
diff --git a/lib/maracasVisuLib/src/kernel/marVector.h b/lib/maracasVisuLib/src/kernel/marVector.h
new file mode 100644 (file)
index 0000000..3e7f420
--- /dev/null
@@ -0,0 +1,97 @@
+// marVector.h: interface for the marVector class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include <iostream>
+#include <stddef.h>
+class marVector  
+{
+public:
+/*
+Remarque : les (double*) sont organisés ligne par ligne
+*/
+/*==Constructeurs========================================*/
+       marVector(size_t s=3);
+       marVector(double* v,size_t s);
+       marVector(const marVector & v);
+/*==Destructeur========================================*/
+       virtual ~marVector();
+
+/*==Opérateurs========================================*/
+       /* Affectation */
+       marVector& operator=(const marVector& o);
+    marVector& operator=(double o);
+    marVector& operator=(double* o);
+
+       /* Affichage */
+    friend std::ostream& operator<<(std::ostream& os, const marVector& v);
+
+       /* Casting */
+    operator double*() const ;
+
+       /* Indexation */
+       double& operator()(size_t i);
+    const double& operator()(size_t i) const;
+
+       /* Comparaison */
+    bool operator==(const marVector& o) const;
+    bool operator!=(const marVector& o) const;
+
+       /* Addition */
+    marVector operator+(const marVector& o);
+    marVector operator+(double o);
+    marVector operator+(double* o);
+       /* Addition + Affectation */
+    marVector& operator+=(const marVector& o);
+    marVector& operator+=(double o);
+    marVector& operator+=(double* o);
+
+       /* Soustraction */
+    marVector operator-(const marVector& o);
+    marVector operator-(double o);
+    marVector operator-(double* o);
+       /* Soustraction + Affectation */
+    marVector& operator-=(const marVector& o);
+    marVector& operator-=(double o);
+    marVector& operator-=(double* o);
+
+       /* Multiplication (produit scalaire) */
+    marVector operator*(double o);
+       /* Multiplication (produit scalaire) + Affectation */
+    marVector& operator*=(double o);
+
+       /* Division (division scalaire) */
+    marVector operator/(double o);
+       /* Division (division scalaire) + Affectation */
+    marVector& operator/=(double o);
+
+/*==Opérations========================================*/
+       /* produit scalaire */
+    double dot( const marVector& o );
+    double dot( double* o );
+       
+       /* produit vectoriel (3D uniquement): le resultat est renvoye */
+    marVector cross( const marVector& o );
+    marVector cross( double* o );
+       /* produit vectoriel (3D uniquement): le resultat est stocké dans this*/
+    int scross( const marVector& o ); // renvoie 0 si OK, 1 sinon
+    int scross( double* o ); // renvoie 0 si OK, 1 sinon
+
+       /* norme euclidienne */
+    double norm2( );
+
+       /* normalisation */
+    marVector normalize( ); // resultat renvoyé
+    int snormalize( ); // resultat stocké dans this, renvoie 0 si OK, 1 sinon
+
+/*==Méthodes========================================*/
+       size_t size() const;
+
+/*==Attributs========================================*/
+private:
+       bool shallowCopy; // true if _data is a shallow copy of original data (pointer copy)
+       size_t _size;
+       double* _data;
+};
+
+
diff --git a/lib/maracasVisuLib/src/kernel/matrix.cxx b/lib/maracasVisuLib/src/kernel/matrix.cxx
new file mode 100644 (file)
index 0000000..53c9dbe
--- /dev/null
@@ -0,0 +1,488 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: matrix.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "gslobj.hxx"
+#include <string>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_linalg.h>
+
+// ---------------------------------------------------------------------
+std::ostream& operator<<( std::ostream& os, const gslobj_matrix& m )
+{
+    for( int i = 0; i < m.size1( ); i++ ) {
+
+       for( int j = 0; j < m.size2( ); j++ )
+           os << m( i, j ) << " ";
+       os << std::endl;
+
+    } // rof
+    return( os );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix::gslobj_matrix( size_t r, size_t c )
+    : _copy( true )
+{
+    _gsl = gsl_matrix_alloc( r, c );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix::gslobj_matrix( const gslobj_matrix& m )
+    : _copy( true )
+{
+    _gsl = gsl_matrix_alloc( m._gsl->size1, m._gsl->size2 );
+    gsl_matrix_memcpy( _gsl, m._gsl );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix::gslobj_matrix( double* m, size_t r, size_t c )
+    : _copy( false )
+{
+    _view = gsl_matrix_view_array( m, r, c );
+    _gsl = &( _view.matrix );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix::gslobj_matrix( double* m[], size_t r, size_t c )
+    : _copy( false )
+{
+    _view = gsl_matrix_view_array( m[ 0 ], r, c );
+    _gsl = &( _view.matrix );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix::gslobj_matrix( gsl_matrix* m )
+    : _copy( false )
+{
+    _gsl = m;
+}
+
+// ---------------------------------------------------------------------
+/*==PS========================================
+void gslobj_matrix::resize( size_t r, size_t c )
+{
+    if( _copy ) {
+
+       if( r != rows( ) || c != columns( ) )
+           gsl_matrix_free( _gsl );
+       _gsl = gsl_matrix_alloc( r, c );
+
+    } // fi
+}
+==PS========================================*/
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator=( const gslobj_matrix& o )
+{
+    gsl_matrix_memcpy( _gsl, o._gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator=( double o )
+{
+    gsl_matrix_set_all( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator=( double* o )
+{
+    memcpy( _gsl->data, o,
+           _gsl->size1 * _gsl->size2 * sizeof( double ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator=( double* o[] )
+{
+    memcpy( _gsl->data, o[ 0 ],
+           _gsl->size1 * _gsl->size2 * sizeof( double ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator=( gsl_matrix* o )
+{
+    gsl_matrix_memcpy( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+double& gslobj_matrix::operator()( size_t i, size_t j )
+{
+    return( _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] );
+}
+
+// ---------------------------------------------------------------------
+const double& gslobj_matrix::operator()( size_t i, size_t j ) const
+{
+    return( _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] );
+}
+
+// ---------------------------------------------------------------------
+/*==PS========================================
+void gslobj_matrix::setValue( size_t i, size_t j, double val )
+{
+    _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] = val;
+}
+==PS========================================*/
+
+// ---------------------------------------------------------------------
+bool gslobj_matrix::operator==( const gslobj_matrix& o ) const
+{
+    bool ret = true;
+
+    if( _gsl->size1 != o._gsl->size1 || _gsl->size2 != o._gsl->size2 )
+       return( false );
+
+    for( int i = 0; i < _gsl->size1 && ret; i++ )
+       for( int j = 0; j < _gsl->size2 && ret; j++ )
+           ret = ret &&
+               ( _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] !=
+                 o._gsl->data[ ( ( i * _gsl->size2 ) + j ) ] );
+    return( ret );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator+( const gslobj_matrix& o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_add( r._gsl, o._gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator+( double o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_add_constant( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator+( double* o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_view vw = gsl_matrix_view_array( o,
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_add( r._gsl, &( vw.matrix ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator+( double* o[] )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_add( r._gsl, &( vw.matrix ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator+( gsl_matrix* o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_add( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator+=( const gslobj_matrix& o )
+{
+    gsl_matrix_add( _gsl, o._gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator+=( double o )
+{
+    gsl_matrix_add_constant( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator+=( double* o )
+{
+    gsl_matrix_view vw = gsl_matrix_view_array( o,
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_add( _gsl, &( vw.matrix ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator+=( double* o[] )
+{
+    gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_add( _gsl, &( vw.matrix ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator+=( gsl_matrix* o )
+{
+    gsl_matrix_add( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator-( const gslobj_matrix& o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_sub( r._gsl, o._gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator-( double o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_add_constant( r._gsl, -o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator-( double* o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_view vw = gsl_matrix_view_array( o,
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_sub( r._gsl, &( vw.matrix ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator-( double* o[] )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_sub( r._gsl, &( vw.matrix ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator-( gsl_matrix* o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_sub( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator-=( const gslobj_matrix& o )
+{
+    gsl_matrix_sub( _gsl, o._gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator-=( double o )
+{
+    gsl_matrix_add_constant( _gsl, -o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator-=( double* o )
+{
+    gsl_matrix_view vw = gsl_matrix_view_array( o,
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_sub( _gsl, &( vw.matrix ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator-=( double* o[] )
+{
+    gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_matrix_sub( _gsl, &( vw.matrix ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator-=( gsl_matrix* o )
+{
+    gsl_matrix_sub( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator*( const gslobj_matrix& o )
+{
+    gslobj_matrix r( *this );
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, r._gsl, o._gsl,
+                   0.0, _gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator*( double o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_scale( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator*( double* o )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_view vw = gsl_matrix_view_array( o,
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, r._gsl, &( vw.matrix ),
+                   0.0, _gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator*( double* o[] )
+{
+    gslobj_matrix r( *this );
+    gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, r._gsl, &( vw.matrix ),
+                   0.0, _gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix gslobj_matrix::operator*( gsl_matrix* o )
+{
+    gslobj_matrix r( *this );
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, r._gsl, o,
+                   0.0, _gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_matrix::operator*( const gslobj_vector& o )
+{
+    gslobj_vector ret( rows( ) );
+    gsl_blas_dgemv( CblasNoTrans, 1.0, _gsl,
+                   ( gsl_vector* )o, 0.0,
+                   ( gsl_vector* )ret );
+    return( ret );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator*=( const gslobj_matrix& o )
+{
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, _gsl, o._gsl,
+                   0.0, _gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator*=( double o )
+{
+    gsl_matrix_scale( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator*=( double* o )
+{
+    gsl_matrix_view vw = gsl_matrix_view_array( o,
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, _gsl, &( vw.matrix ),
+                   0.0, _gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator*=( double* o[] )
+{
+    gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
+                                               _gsl->size1,
+                                               _gsl->size2 );
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, _gsl, &( vw.matrix ),
+                   0.0, _gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_matrix& gslobj_matrix::operator*=( gsl_matrix* o )
+{
+    gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
+                   1.0, _gsl, o,
+                   0.0, _gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+/*==PS========================================
+gslobj_matrix gslobj_matrix::transpose( )
+{
+    gslobj_matrix r( _gsl->size2, _gsl->size1 ); 
+    gsl_matrix_transpose_memcpy( r._gsl, _gsl );
+    return( r );
+}
+==PS========================================*/
+// ---------------------------------------------------------------------
+/*==PS========================================
+gslobj_matrix gslobj_matrix::invertLU( )
+{
+    gslobj_matrix r( *this ), lu( *this );
+    gsl_permutation* perm = gsl_permutation_calloc( rows( ) );
+    int sign;
+
+    gsl_linalg_LU_decomp( lu._gsl, perm, &sign );
+    gsl_linalg_LU_invert( lu._gsl, perm, r._gsl );
+    return( r );
+}
+==PS========================================*/
+// ---------------------------------------------------------------------
+/*==PS========================================
+double gslobj_matrix::determinant( )
+{
+    gslobj_matrix lu( *this );
+    gsl_permutation* perm = gsl_permutation_calloc( rows( ) );
+    int sign;
+
+    gsl_linalg_LU_decomp( lu._gsl, perm, &sign );
+    return( gsl_linalg_LU_det( lu._gsl, sign ) );
+}
+==PS========================================*/
+// ---------------------------------------------------------------------
+/*==PS========================================
+void gslobj_matrix::identity( )
+{
+    gsl_matrix_set_identity( _gsl );
+}
+==PS========================================*/
+// eof - gslobj_matrix.cxx
diff --git a/lib/maracasVisuLib/src/kernel/vector.cxx b/lib/maracasVisuLib/src/kernel/vector.cxx
new file mode 100644 (file)
index 0000000..28357f9
--- /dev/null
@@ -0,0 +1,375 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: vector.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "gslobj.hxx"
+#include <string>
+#include <gsl/gsl_blas.h>
+
+// ---------------------------------------------------------------------
+std::ostream& operator<<( std::ostream& os, const gslobj_vector& v )
+{
+    for( int i = 0; i < v.size( ); i++ ) os << " " << v( i );
+    return( os );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector::gslobj_vector( size_t s )
+    : _copy( true )
+{
+    _gsl = gsl_vector_alloc( s );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector::gslobj_vector( const gslobj_vector& v )
+    : _copy( true )
+{
+    _gsl = gsl_vector_alloc( v._gsl->size );
+    gsl_vector_memcpy( _gsl, v._gsl );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector::gslobj_vector( double* v, size_t s )
+    : _copy( false )
+{
+    _view = gsl_vector_view_array( v, s );
+    _gsl = &( _view.vector );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector::gslobj_vector( gsl_vector* v )
+    : _copy( false )
+{
+    _gsl = v;
+}
+
+// ---------------------------------------------------------------------
+/*==PS========================================
+void gslobj_vector::resize( size_t s )
+{
+    if( _copy ) {
+
+       if( s != size( ) )
+           gsl_vector_free( _gsl );
+       _gsl = gsl_vector_alloc( s );
+
+    } // fi
+}
+==PS========================================*/
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator=( const gslobj_vector& o )
+{
+    gsl_vector_memcpy( _gsl, o._gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator=( double o )
+{
+    gsl_vector_set_all( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator=( double* o )
+{
+    memcpy( _gsl->data, o, _gsl->size * sizeof( double ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator=( gsl_vector* o )
+{
+    gsl_vector_memcpy( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+bool gslobj_vector::operator==( const gslobj_vector& o ) const
+{
+    bool ret = true;
+
+    if( _gsl->size != o._gsl->size )
+       return( false );
+
+    for( int i = 0; i < _gsl->size && ret; i++ )
+       ret = ret && ( _gsl->data[ i ] != o._gsl->data[ i ] );
+    return( ret );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator+( const gslobj_vector& o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_add( r._gsl, o._gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator+( double o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_add_constant( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator+( double* o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
+    gsl_vector_add( r._gsl, &( vw.vector ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator+( gsl_vector* o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_add( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator+=( const gslobj_vector& o )
+{
+    gsl_vector_add( _gsl, o._gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator+=( double o )
+{
+    gsl_vector_add_constant( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator+=( double* o )
+{
+    gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
+    gsl_vector_add( _gsl, &( vw.vector ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator+=( gsl_vector* o )
+{
+    gsl_vector_add( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator-( const gslobj_vector& o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_sub( r._gsl, o._gsl );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator-( double o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_add_constant( r._gsl, -o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator-( double* o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
+    gsl_vector_sub( r._gsl, &( vw.vector ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator-( gsl_vector* o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_sub( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator-=( const gslobj_vector& o )
+{
+    gsl_vector_sub( _gsl, o._gsl );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator-=( double o )
+{
+    gsl_vector_add_constant( _gsl, -o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator-=( double* o )
+{
+    gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
+    gsl_vector_sub( _gsl, &( vw.vector ) );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator-=( gsl_vector* o )
+{
+    gsl_vector_sub( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator*( double o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_scale( r._gsl, o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator*=( double o )
+{
+    gsl_vector_scale( _gsl, o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+double gslobj_vector::dot( const gslobj_vector& o )
+{
+    double r;
+    gsl_blas_ddot( _gsl, o._gsl, &r );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+double gslobj_vector::dot( double* o )
+{
+    double r;
+    gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
+    gsl_blas_ddot( _gsl, &( vw.vector ), &r );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+double gslobj_vector::dot( gsl_vector* o )
+{
+    double r;
+    gsl_blas_ddot( _gsl, o, &r );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::cross( const gslobj_vector& o )
+{
+    return( cross( o._gsl->data ) );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::cross( double* o )
+{
+    gslobj_vector r( *this );
+    double S, s;
+       
+    // 1st element
+    S = _gsl->data[ 1 ] * o[ 2 ];
+    s = _gsl->data[ 2 ] * o[ 1 ];
+    r._gsl->data[ 0 ] = S - s;
+               
+    // 2nd element
+    S = _gsl->data[ 2 ] * o[ 0 ];
+    s = _gsl->data[ 0 ] * o[ 2 ];
+    r._gsl->data[ 1 ] = S - s;
+               
+    // 3rd element
+    S = _gsl->data[ 0 ] * o[ 1 ];
+    s = _gsl->data[ 1 ] * o[ 0 ];
+    r._gsl->data[ 2 ] = S - s;
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::cross( gsl_vector* o )
+{
+    return( cross( o->data ) );
+}
+
+// ---------------------------------------------------------------------
+int gslobj_vector::scross( const gslobj_vector& o )
+{
+    *this = cross( o );
+    return( 1 );
+}
+
+// ---------------------------------------------------------------------
+int gslobj_vector::scross( double* o )
+{
+    *this = cross( o );
+    return( 1 );
+}
+
+// ---------------------------------------------------------------------
+int gslobj_vector::scross( gsl_vector* o )
+{
+    *this = cross( o );
+    return( 1 );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::operator/( double o )
+{
+    gslobj_vector r( *this );
+    gsl_vector_scale( r._gsl, 1.0 / o );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector& gslobj_vector::operator/=( double o )
+{
+    gsl_vector_scale( _gsl, 1.0 / o );
+    return( *this );
+}
+
+// ---------------------------------------------------------------------
+/*==PS========================================
+double gslobj_vector::norm1( )
+{
+    return( gsl_blas_dasum( _gsl ) );
+}
+==PS========================================*/
+// ---------------------------------------------------------------------
+double gslobj_vector::norm2( )
+{
+    return( gsl_blas_dnrm2( _gsl ) );
+}
+
+// ---------------------------------------------------------------------
+gslobj_vector gslobj_vector::normalize( )
+{
+    gslobj_vector r( *this );
+    gsl_vector_scale( r._gsl, 1.0 / gsl_blas_dnrm2( _gsl ) );
+    return( r );
+}
+
+// ---------------------------------------------------------------------
+int gslobj_vector::snormalize( )
+{
+    return( gsl_vector_scale( _gsl, 1.0 / gsl_blas_dnrm2( _gsl ) ) );
+}
+
+// eof - gslobj_vector.cxx
diff --git a/lib/maracasVisuLib/src/kernel/volume.cxx b/lib/maracasVisuLib/src/kernel/volume.cxx
new file mode 100644 (file)
index 0000000..22e0556
--- /dev/null
@@ -0,0 +1,1087 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: volume.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+// PS -> //#include <gsl/gsl_math.h>//PS
+#include <memory.h>
+#include "volume.hxx"
+
+#ifdef KGFO_USE_VTK
+
+#include <vtkCharArray.h>
+#include <vtkDataArray.h>
+#include <vtkDoubleArray.h>
+#include <vtkFloatArray.h>
+#include <vtkIntArray.h>
+#include <vtkPointData.h>
+#include <vtkShortArray.h>
+#include <vtkUnsignedCharArray.h>
+#include <vtkUnsignedIntArray.h>
+#include <vtkUnsignedShortArray.h>
+
+// -------------------------------------------------------------------------
+const vtkIdType kVolume::VTKTypes[] = { VTK_CHAR, VTK_FLOAT, VTK_DOUBLE,
+                                       VTK_INT, VTK_SHORT, VTK_UNSIGNED_CHAR,
+                                       VTK_UNSIGNED_INT, VTK_UNSIGNED_SHORT };
+
+#endif // KGFO_USE_VTK
+
+#ifdef KGFO_USE_IDO
+
+// -------------------------------------------------------------------------
+const int kVolume::IDOTypes[] = { VOL_CHAR, VOL_FLOAT, VOL_DOUBLE, VOL_LONG,
+                                 VOL_SHORT, VOL_UCHAR, VOL_ULONG,
+                                 VOL_USHORT };
+
+#endif // KGFO_USE_IDO
+
+// -------------------------------------------------------------------------
+const void* kVolume::BLANK   = ( void* ) 0;
+const void* kVolume::NOALLOC = ( void* )-1;
+const int kVolume::SIZETypes[] = { sizeof( char ), sizeof( float ), 
+                                  sizeof( double ), sizeof( int ),
+                                  sizeof( short ), sizeof( uchar ),
+                                  sizeof( uint ), sizeof( ushort ) };
+
+// ---------------------------------------------------------------------------
+template< class FROM, class TO >
+    static void convertCastT( FROM* src, TO* dest, ulong size )
+{
+    FROM* end = src + size;
+    for( ; src < end; src++, dest++ ) *dest = ( TO )*src;
+}
+
+
+// ---------------------------------------------------------------------------
+template< class FROM, class TO >
+    static void convertScaleT( FROM *src, TO *dest, ulong size,
+                              double smin, double tmin, double slope )
+{
+    FROM* end = src + size;
+    for( ; src < end; src++, dest++ )
+       *dest = ( TO )( ( double( *src ) - smin ) * slope + tmin );
+}
+
+// ---------------------------------------------------------------------------
+template< class TYPE >
+    static void getMinMaxT( TYPE *src, ulong size,
+                           double& min, double& max )
+{
+    TYPE* end = src + size;
+    TYPE m, M;
+    bool st;
+       
+    m = ( TYPE )0;
+    M = ( TYPE )0;
+    for( st = true; src < end; src++, st = false ) {
+               
+       if( *src < m || st ) m = *src;
+       if( *src > M || st ) M = *src;
+               
+    } // rof
+       
+    min = ( double )m;
+    max = ( double )M;
+}
+
+// -------------------------------------------------------------------------
+kVolume::kVolume( )
+    : _type( UCHAR ), _creator( SELF ),
+#ifdef KGFO_USE_VTK
+      _vtk( NULL ),
+#endif // KGFO_USE_VTK
+#ifdef KGFO_USE_IDO
+      _privateIdo( NULL ),
+#endif // KGFO_USE_IDO
+      _raw( NULL ), _columns( NULL ),
+      _images( NULL )
+{
+    _dims[ CX ] = 1; _dims[ CY ] = 1; _dims[ CZ ] = 1;
+    _sizes[ CX ] = 1; _sizes[ CY ] = 1; _sizes[ CZ ] = 1;
+    allocate( );
+    buildIndex( );
+}
+
+// -------------------------------------------------------------------------
+kVolume::kVolume( Type type,
+                 uint xdim, uint ydim, uint zdim,
+                 double xsize, double ysize, double zsize,
+                 void* data )
+    : _type( type ), _creator( SELF ),
+#ifdef KGFO_USE_VTK
+      _vtk( NULL ),
+#endif // KGFO_USE_VTK
+#ifdef KGFO_USE_IDO
+      _privateIdo( NULL ),
+#endif // KGFO_USE_IDO
+      _raw( NULL ), _columns( NULL ),
+      _images( NULL )
+{
+    _dims[ CX ] = xdim; _dims[ CY ] = ydim; _dims[ CZ ] = zdim;
+    _sizes[ CX ] = xsize; _sizes[ CY ] = ysize; _sizes[ CZ ] = zsize;
+    if( data != NOALLOC ) {
+       
+       if( data != BLANK )
+           _raw = data;
+       else
+           allocate( );
+       buildIndex( );
+                       
+    } // fi
+}
+
+// -------------------------------------------------------------------------
+kVolume::kVolume( Type type,
+                 const uint *dims,
+                 const double *sizes,
+                 void* data )
+    : _type( type ), _creator( SELF ),
+#ifdef KGFO_USE_VTK
+      _vtk( NULL ),
+#endif // KGFO_USE_VTK
+#ifdef KGFO_USE_IDO
+      _privateIdo( NULL ),
+#endif // KGFO_USE_IDO
+      _raw( NULL ), _columns( NULL ),
+      _images( NULL )
+{
+    memcpy( _dims, dims, 3 * sizeof( uint ) );
+    memcpy( _sizes, sizes, 3 * sizeof( double ) );
+    if( data != NOALLOC ) {
+       
+       if( data != BLANK )
+           _raw = data;
+       else
+           allocate( );
+       buildIndex( );
+                       
+    } // fi
+}
+
+// -------------------------------------------------------------------------
+kVolume::kVolume( const kVolume& org )
+    : _type( UCHAR ), _creator( SELF ),
+#ifdef KGFO_USE_VTK
+      _vtk( NULL ),
+#endif // KGFO_USE_VTK
+#ifdef KGFO_USE_IDO
+      _privateIdo( NULL ),
+#endif // KGFO_USE_IDO
+      _raw( NULL ), _columns( NULL ),
+      _images( NULL )
+{
+    copyFrom( org );
+}
+
+// -------------------------------------------------------------------------
+kVolume& kVolume::operator=( const kVolume& org )
+{
+    copyFrom( org );
+    return( *this );
+}
+
+// -------------------------------------------------------------------------
+void kVolume::copyFrom( const kVolume& org )
+{
+    _type = org._type;
+    _creator = SELF;
+    _raw = 0;
+    _columns = 0;
+    _images = 0;
+
+    memcpy( _dims, org._dims, 3 * sizeof( uint ) );
+    memcpy( _sizes, org._sizes, 3 * sizeof( double ) );
+    if( org._raw ) {
+
+       allocate( );
+       buildIndex( );
+       memcpy( _raw, org._raw, getRawSizeInBytes( ) );
+
+    } // fi
+}
+
+// -------------------------------------------------------------------------
+bool kVolume::sameDimension( const kVolume& comp )
+{
+    return( ( _dims[ CX ] == comp._dims[ CX ] &&
+             _dims[ CY ] == comp._dims[ CY ] &&
+             _dims[ CZ ] == comp._dims[ CZ ] ) );
+}
+
+// -------------------------------------------------------------------------
+double kVolume::getPixel( uint x, uint y, uint z ) const
+{
+    double p;
+
+    switch( _type ) {
+               
+    case CHAR:   p = ( double )(   ( char*** )_images )[ z ][ y ][ x ]; break;
+    case FLOAT:  p = ( double )(  ( float*** )_images )[ z ][ y ][ x ]; break;
+    case DOUBLE: p = ( double )( ( double*** )_images )[ z ][ y ][ x ]; break;
+    case INT:    p = ( double )(    ( int*** )_images )[ z ][ y ][ x ]; break;
+    case SHORT:  p = ( double )(  ( short*** )_images )[ z ][ y ][ x ]; break;
+    case UCHAR:  p = ( double )(  ( uchar*** )_images )[ z ][ y ][ x ]; break;
+    case UINT:   p = ( double )(   ( uint*** )_images )[ z ][ y ][ x ]; break;
+    case USHORT: p = ( double )( ( ushort*** )_images )[ z ][ y ][ x ]; break;
+    default: p = 0.0; break;
+
+    } // fswitch
+
+    return( p );
+}
+
+// -------------------------------------------------------------------------
+void kVolume::setPixel( double v, uint x, uint y, uint z )
+{
+
+    switch( _type ) {
+               
+    case CHAR:     ( ( char*** )_images )[ z ][ y ][ x ] = ( char )v; break;
+    case FLOAT:   ( ( float*** )_images )[ z ][ y ][ x ] = ( float )v; break;
+    case DOUBLE: ( ( double*** )_images )[ z ][ y ][ x ] = ( double )v; break;
+    case INT:       ( ( int*** )_images )[ z ][ y ][ x ] = ( int )v; break;
+    case SHORT:   ( ( short*** )_images )[ z ][ y ][ x ] = ( short )v; break;
+    case UCHAR:   ( ( uchar*** )_images )[ z ][ y ][ x ] = ( uchar )v; break;
+    case UINT:     ( ( uint*** )_images )[ z ][ y ][ x ] = ( uint )v; break;
+    case USHORT: ( ( ushort*** )_images )[ z ][ y ][ x ] = ( ushort )v; break;
+    default: break;
+
+    } // fswitch
+}
+
+// -------------------------------------------------------------------------
+void kVolume::convertCast( Type type )
+{
+    if( _type != type ) {
+
+       void* buffer;
+       ulong size = getRawSize( );
+
+       buffer = ( void* )new uchar[ size * SIZETypes[ type ] ];
+
+       switch( _type ) {
+
+       case CHAR:
+           switch( type ) {
+
+           case SHORT:  convertCastT( ( char* )_raw, ( short* )buffer, size ); break;
+           case INT:    convertCastT( ( char* )_raw, ( int* )buffer, size ); break;
+           case USHORT: convertCastT( ( char* )_raw, ( ushort* )buffer, size ); break;
+           case UINT:   convertCastT( ( char* )_raw, ( uint* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( char* )_raw, ( float* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( char* )_raw, ( double* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( char* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case SHORT:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( short* )_raw, ( char* )buffer, size ); break;
+           case INT:    convertCastT( ( short* )_raw, ( int* )buffer, size ); break;
+           case USHORT: convertCastT( ( short* )_raw, ( ushort* )buffer, size ); break;
+           case UINT:   convertCastT( ( short* )_raw, ( uint* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( short* )_raw, ( float* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( short* )_raw, ( double* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( short* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case INT:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( int* )_raw, ( char* )buffer, size ); break;
+           case SHORT:  convertCastT( ( int* )_raw, ( short* )buffer, size ); break;
+           case USHORT: convertCastT( ( int* )_raw, ( ushort* )buffer, size ); break;
+           case UINT:   convertCastT( ( int* )_raw, ( uint* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( int* )_raw, ( float* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( int* )_raw, ( double* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( int* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case USHORT:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( ushort* )_raw, ( char* )buffer, size ); break;
+           case SHORT:  convertCastT( ( ushort* )_raw, ( short* )buffer, size ); break;
+           case INT:    convertCastT( ( ushort* )_raw, ( int* )buffer, size ); break;
+           case UINT:   convertCastT( ( ushort* )_raw, ( uint* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( ushort* )_raw, ( float* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( ushort* )_raw, ( double* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( ushort* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case UINT:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( uint* )_raw, ( char* )buffer, size ); break;
+           case SHORT:  convertCastT( ( uint* )_raw, ( short* )buffer, size ); break;
+           case INT:    convertCastT( ( uint* )_raw, ( int* )buffer, size ); break;
+           case USHORT: convertCastT( ( uint* )_raw, ( ushort* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( uint* )_raw, ( float* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( uint* )_raw, ( double* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( uint* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case FLOAT:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( float* )_raw, ( char* )buffer, size ); break;
+           case SHORT:  convertCastT( ( float* )_raw, ( short* )buffer, size ); break;
+           case INT:    convertCastT( ( float* )_raw, ( int* )buffer, size ); break;
+           case USHORT: convertCastT( ( float* )_raw, ( ushort* )buffer, size ); break;
+           case UINT:   convertCastT( ( float* )_raw, ( uint* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( float* )_raw, ( double* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( float* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case DOUBLE:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( double* )_raw, ( char* )buffer, size ); break;
+           case SHORT:  convertCastT( ( double* )_raw, ( short* )buffer, size ); break;
+           case INT:    convertCastT( ( double* )_raw, ( int* )buffer, size ); break;
+           case USHORT: convertCastT( ( double* )_raw, ( ushort* )buffer, size ); break;
+           case UINT:   convertCastT( ( double* )_raw, ( uint* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( double* )_raw, ( float* )buffer, size ); break;
+           case UCHAR:  convertCastT( ( double* )_raw, ( uchar* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       case UCHAR:
+           switch( type ) {
+
+           case CHAR:   convertCastT( ( uchar* )_raw, ( char* )buffer, size ); break;
+           case SHORT:  convertCastT( ( uchar* )_raw, ( short* )buffer, size ); break;
+           case INT:    convertCastT( ( uchar* )_raw, ( int* )buffer, size ); break;
+           case USHORT: convertCastT( ( uchar* )_raw, ( ushort* )buffer, size ); break;
+           case UINT:   convertCastT( ( uchar* )_raw, ( uint* )buffer, size ); break;
+           case FLOAT:  convertCastT( ( uchar* )_raw, ( float* )buffer, size ); break;
+           case DOUBLE: convertCastT( ( uchar* )_raw, ( double* )buffer, size ); break;
+
+           } // fswitch
+           break;
+
+       } // fswitch
+
+       _type = type;
+       deallocate( );
+       _creator = SELF;
+       _raw = buffer;
+       buildIndex( );
+
+    } // fi
+}
+
+// -------------------------------------------------------------------------
+void kVolume::convertScale( Type type, double min, double max )
+{
+    double tmin, tmax, smin, smax;
+
+// PS ->     //tmin = GSL_MIN( min, max ); //PS
+       tmin= ((min<max)?min:max);
+// PS ->     //tmax = GSL_MAX( min, max ); //PS
+       tmax= ((min>max)?min:max);
+
+    getMinMax( smin, smax );
+       
+    // compute scaling slope
+    double a = ( tmax - tmin ) / ( smax - smin );
+
+    void* buffer;
+    ulong size = getRawSize( );
+
+    buffer = ( void* )new uchar[ size * SIZETypes[ type ] ];
+
+    switch( _type ) {
+
+    case CHAR:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( char* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( char* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( char* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( char* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( char* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( char* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( char* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( char* )_raw, ( uchar* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case SHORT:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( short* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( short* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( short* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( short* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( short* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( short* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( short* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( short* )_raw, ( uchar* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case INT:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( int* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( int* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( int* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( int* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( int* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( int* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( int* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( int* )_raw, ( uchar* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case USHORT:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( ushort* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( ushort* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( ushort* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( ushort* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( ushort* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( ushort* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( ushort* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( ushort* )_raw, ( uchar* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case UINT:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( uint* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( uint* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( uint* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( uint* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( uint* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( uint* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( uint* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( uint* )_raw, ( uchar* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case UCHAR:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( uchar* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( uchar* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( uchar* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( uchar* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( uchar* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( uchar* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( uchar* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( uchar* )_raw, ( uchar* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case DOUBLE:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( double* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( double* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( double* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( double* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( double* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( double* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( double* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( uchar* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+    case FLOAT:
+       switch( type ) {
+
+       case CHAR:   convertScaleT( ( float* )_raw, ( char* )buffer, size, smin, tmin, a ); break;
+       case SHORT:  convertScaleT( ( float* )_raw, ( short* )buffer, size, smin, tmin, a ); break;
+       case INT:    convertScaleT( ( float* )_raw, ( int* )buffer, size, smin, tmin, a ); break;
+       case USHORT: convertScaleT( ( float* )_raw, ( ushort* )buffer, size, smin, tmin, a ); break;
+       case UINT:   convertScaleT( ( float* )_raw, ( uint* )buffer, size, smin, tmin, a ); break;
+       case FLOAT:  convertScaleT( ( float* )_raw, ( float* )buffer, size, smin, tmin, a ); break;
+       case DOUBLE: convertScaleT( ( float* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+       case UCHAR:  convertScaleT( ( float* )_raw, ( double* )buffer, size, smin, tmin, a ); break;
+
+       } // fswitch
+       break;
+
+    } // fswitch
+
+    _type = type;
+    deallocate( );
+    _creator = SELF;
+    _raw = buffer;
+    buildIndex( );
+}
+
+// -------------------------------------------------------------------------
+void kVolume::getMinMax( double& min, double& max ) const
+{
+    ulong size = getRawSize( );
+
+    switch( _type ) {
+               
+    case CHAR:   getMinMaxT( ( char* )_raw, size, min, max ); break;
+    case FLOAT:  getMinMaxT( ( float* )_raw, size, min, max ); break;
+    case DOUBLE: getMinMaxT( ( double* )_raw, size, min, max ); break;
+    case INT:    getMinMaxT( ( int* )_raw, size, min, max ); break;
+    case SHORT:  getMinMaxT( ( short* )_raw, size, min, max ); break;
+    case UCHAR:  getMinMaxT( ( uchar* )_raw, size, min, max ); break;
+    case UINT:   getMinMaxT( ( uint* )_raw, size, min, max ); break;
+    case USHORT: getMinMaxT( ( ushort* )_raw, size, min, max ); break;
+
+    } // fswitch
+}
+
+// -------------------------------------------------------------------------
+double kVolume::getMin( ) const
+{
+    double m, M;
+
+    getMinMax( m, M );
+    return( m );
+}
+
+// -------------------------------------------------------------------------
+double kVolume::getMax( ) const
+{
+    double m, M;
+
+    getMinMax( m, M );
+    return( M );
+}
+
+// -------------------------------------------------------------------------
+/*double kVolume::GetMaxIntSphere( double* p, double r )
+{
+    int minX, minY, minZ, maxX, maxY, maxZ;
+    gslobj_vector vP( p, 3 ), v( 3 );
+    double maxint, tmp;
+    bool start;
+       
+    minX = int( floor( p[ 0 ] - r ) );
+    minY = int( floor( p[ 1 ] - r ) );
+    minZ = int( floor( p[ 2 ] - r ) );
+    maxX = int( ceil( p[ 0 ] + r ) );
+    maxY = int( ceil( p[ 1 ] + r ) );
+    maxZ = int( ceil( p[ 2 ] + r ) );
+       
+    minX = GSL_MAX( minX, 0 );
+    minY = GSL_MAX( minY, 0 );
+    minZ = GSL_MAX( minZ, 0 );
+       
+    maxX = GSL_MIN( maxX, this->getXdim( ) - 1 );
+    maxY = GSL_MIN( maxY, this->getYdim( ) - 1 );
+    maxZ = GSL_MIN( maxZ, this->getZdim( ) - 1 );
+
+    maxint = 0.0;
+    start = true;
+    for( v( 0 ) = minX; v( 0 ) <= maxX; v( 0 )++ )
+      for( v( 1 ) = minY; v( 1 ) <= maxY; v( 1 )++ )
+        for( v( 2 ) = minZ; v( 2 ) <= maxZ; v( 2 )++ )
+          if( ( v - vP ).norm2( ) <= r ) {
+            tmp = this->getPixel( ( uint )v(0), ( uint )v(1), ( uint )v(2));
+            maxint = ( tmp > maxint || start )? tmp: maxint;
+            start = false;
+          } // fi
+
+    return( maxint );
+}*/
+// -------------------------------------------------------------------------
+unsigned short kVolume::GetMaxIntSphere2( double* p, double r )
+{
+   /**
+    * unsigned short range : 0 -> 65535
+    * unsigned int   range : 0 -> 2147483647 // 2^31 - 1
+    */
+    int minX, minY, minZ, maxX, maxY, maxZ;
+    unsigned int v[3];
+    unsigned short maxint = 0, tmp;
+
+    minX = int( floor( p[ 0 ] - r ) );
+    minY = int( floor( p[ 1 ] - r ) );
+    minZ = int( floor( p[ 2 ] - r ) );
+    maxX = int( ceil( p[ 0 ] + r ) );
+    maxY = int( ceil( p[ 1 ] + r ) );
+    maxZ = int( ceil( p[ 2 ] + r ) );
+
+// PS ->     //minX = GSL_MAX( minX, 0 );//PS
+// PS ->     //minY = GSL_MAX( minY, 0 );//PS
+// PS ->     //minZ = GSL_MAX( minZ, 0 );//PS
+       minX=((minX>0)?minX:0);
+       minY=((minY>0)?minY:0);
+       minZ=((minZ>0)?minZ:0);
+       
+// PS ->     //maxX = GSL_MIN( maxX, this->getXdim( ) - 1 );//PS
+// PS ->     //maxY = GSL_MIN( maxY, this->getYdim( ) - 1 );//PS
+// PS ->     //maxZ = GSL_MIN( maxZ, this->getZdim( ) - 1 );//PS
+       int xDim=this->getXdim( ) - 1;
+       maxX= (maxX<xDim?maxX:xDim);
+
+       int yDim=this->getYdim( ) - 1;
+       maxY= (maxY<yDim?maxY:yDim);
+
+       int zDim=this->getZdim( ) - 1;
+       maxZ= (maxZ<zDim?maxZ:zDim);
+
+    double r2 = r*r;  //need to do comparison in double ... don't know why...
+    for( v[0] = minX; v[0] <= maxX; v[0]++ )
+      for( v[1] = minY; v[1] <= maxY; v[1]++ )
+        for( v[2] = minZ; v[2] <= maxZ; v[2]++ )
+          if( ((v[0]-p[0])*(v[0]-p[0])+(v[1]-p[1])*(v[1]-p[1])+(v[2]-p[2])*(v[2]-p[2])) <= r2 )
+          {
+            tmp = (unsigned short)this->getPixel( v[0], v[1], v[2] );
+            maxint = ( tmp > maxint ) ? tmp : maxint;
+          }
+
+    return( maxint );
+}
+
+// -------------------------------------------------------------------------
+void kVolume::allocate( )
+{
+    ulong size = getRawSizeInBytes( );
+
+    if( _creator == SELF ) {
+
+       _raw = ( void* )new uchar[ size ];
+       memset( _raw, 0, size );
+
+    } // fi
+}
+
+// -------------------------------------------------------------------------
+void kVolume::buildIndex( )
+{
+    ulong size;
+
+    size = ( _dims[ CZ ] * sizeof( uchar** ) ) +
+       ( _dims[ CZ ] * _dims[ CY ] * sizeof( void* ) );
+
+#ifdef KGFO_USE_IDO
+
+    if( _creator == SELF || _creator == VTK ) {
+               
+       size += sizeof( PRIVATE_VOLUME );
+               
+       _privateIdo = ( PRIVATE_VOLUME* ) new uchar[ size ];
+       _privateIdo->UsedNbZ = 0;  // Warning, I don't really know
+       _privateIdo->UsedNbY = 0;  // the reason to use these three
+       _privateIdo->UsedNbX = 0;  // fields. - lflorez
+       _privateIdo->subObject = 1;
+       _privateIdo->DimX = _dims[ CX ];
+       _privateIdo->DimY = _dims[ CY ];
+       _privateIdo->DimZ = _dims[ CZ ];
+       _privateIdo->_message = 0;
+       _privateIdo->_fichier = 0;
+       _privateIdo->Type = IDOTypes[ _type ];
+               
+       _images = ( void*** ) &( _privateIdo[ 1 ] );
+               
+#else
+               
+       _images = ( void*** )new uchar[ size ];
+               
+#endif // KGFO_USE_IDO
+               
+       _columns = ( void** )( _images + _dims[ CZ ] );
+       void** plane = _columns;
+       for( uint z = 0; z < _dims[ CZ ]; z++ ) {
+                       
+           _images[ z ] = plane;
+           plane += _dims[ CY ];
+                       
+       } // rof
+       void* line = _raw;
+       for( uint y = 0; y < _dims[ CZ ] * _dims[ CY ]; y++ ) {
+                       
+           _columns[ y ] = line;
+           line = ( void* )( ( uchar* ) line +
+                             _dims[ CX ] * SIZETypes[ _type ] );
+                       
+       } // rof
+               
+#ifdef KGFO_USE_IDO
+               
+    } else
+       _images = ( void*** )( &_privateIdo[ 1 ] );
+       
+#endif // KGFO_USE_IDO
+       
+#ifdef KGFO_USE_VTK
+       
+    vtkCharArray* carray;
+    vtkDoubleArray* darray;
+    vtkFloatArray* farray;
+    vtkIntArray* iarray;
+    vtkShortArray* sarray;
+    vtkUnsignedCharArray* ucarray;
+    vtkUnsignedIntArray* uiarray;
+    vtkUnsignedShortArray* usarray;
+       
+    size = _dims[ CX ] * _dims[ CY ] * _dims[ CZ ];
+
+    if( _creator == SELF || _creator == IDO ) {
+         
+       _vtk = vtkImageData::New( );
+       _vtk->SetDimensions( _dims[ CX ], _dims[ CY ], _dims[ CZ ] );
+       _vtk->SetSpacing( _sizes[ CX ], _sizes[ CY ], _sizes[ CZ ] );
+
+       switch( _type ) {
+
+       case CHAR:
+           carray = vtkCharArray::New( );
+           carray->SetNumberOfComponents( 1 );
+           carray->SetArray( ( char* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_CHAR );
+           _vtk->GetPointData( )->SetScalars( carray );
+           carray->Delete( );
+           break;
+
+       case UCHAR:
+           ucarray = vtkUnsignedCharArray::New( );
+           ucarray->SetNumberOfComponents( 1 );
+           ucarray->SetArray( ( uchar* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_UNSIGNED_CHAR );
+           _vtk->GetPointData( )->SetScalars( ucarray );
+           ucarray->Delete( );
+           break;
+
+       case SHORT:
+           sarray = vtkShortArray::New( );
+           sarray->SetNumberOfComponents( 1 );
+           sarray->SetArray( ( short* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_SHORT );
+           _vtk->GetPointData( )->SetScalars( sarray );
+           sarray->Delete( );
+           break;
+
+       case INT:
+           iarray = vtkIntArray::New( );
+           iarray->SetNumberOfComponents( 1 );
+           iarray->SetArray( ( int* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_INT );
+           _vtk->GetPointData( )->SetScalars( iarray );
+           iarray->Delete( );
+           break;
+
+       case USHORT:
+           usarray = vtkUnsignedShortArray::New( );
+           usarray->SetNumberOfComponents( 1 );
+           usarray->SetArray( ( ushort* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_UNSIGNED_SHORT );
+           _vtk->GetPointData( )->SetScalars( usarray );
+           usarray->Delete( );
+           break;
+
+       case UINT:
+           uiarray = vtkUnsignedIntArray::New( );
+           uiarray->SetNumberOfComponents( 1 );
+           uiarray->SetArray( ( uint* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_UNSIGNED_INT );
+           _vtk->GetPointData( )->SetScalars( uiarray );
+           uiarray->Delete( );
+           break;
+
+       case FLOAT:
+           farray = vtkFloatArray::New( );
+           farray->SetNumberOfComponents( 1 );
+           farray->SetArray( ( float* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_FLOAT );
+           _vtk->GetPointData( )->SetScalars( farray );
+           farray->Delete( );
+           break;
+                 
+       case DOUBLE:
+           darray = vtkDoubleArray::New( );
+           darray->SetNumberOfComponents( 1 );
+           darray->SetArray( ( double* )( _raw ), size, 1 );
+           _vtk->SetScalarType( VTK_DOUBLE );
+           _vtk->GetPointData( )->SetScalars( darray );
+           darray->Delete( );
+           break;
+                 
+       } // fswitch
+         
+    } // fi
+
+#endif // KGFO_USE_VTK
+}
+
+// -------------------------------------------------------------------------
+void kVolume::deallocate( )
+{
+#ifdef KGFO_USE_VTK
+
+    if( _vtk ) _vtk->Delete();
+    _vtk = NULL;
+
+#endif // KGFO_USE_VTK
+
+#ifdef KGFO_USE_IDO
+
+    if( _creator == SELF || _creator == VTK ) {
+
+       delete[] _privateIdo;
+       _privateIdo = NULL;
+       
+    } // fi
+
+#else
+
+    delete[] ( uchar* )_images;
+
+#endif // KGFO_USE_IDO
+
+    if( _raw && _creator == SELF )
+
+//EED purify 12/sept/2006
+//     delete[] ( uchar* )_raw;
+
+       free ( _raw );
+
+    _creator   = SELF;
+    _raw               = NULL;
+    _columns   = NULL;
+    _images            = NULL;
+}
+
+#ifdef KGFO_USE_VTK
+
+// -------------------------------------------------------------------------
+kVolume::kVolume( vtkImageData* org )
+    : _raw( 0 ), _columns( 0 ), _images( 0 ),
+      _creator( VTK ),
+#ifdef KGFO_USE_IDO
+      _privateIdo( NULL ),
+#endif // KGFO_USE_IDO
+      _vtk( 0 )
+{
+    //int i, j, k, y;
+    int itmp[ 3 ];
+    double ftmp[ 3 ];
+    //double v;
+
+    switch( org->GetScalarType( ) ) {
+
+    case VTK_CHAR:           _type = CHAR;   break;
+    case VTK_UNSIGNED_CHAR:  _type = UCHAR;  break;
+    case VTK_SHORT:          _type = SHORT;  break;
+    case VTK_INT:            _type = INT;    break;
+    case VTK_UNSIGNED_SHORT: _type = USHORT; break;
+    case VTK_UNSIGNED_INT:   _type = UINT;   break;
+    case VTK_FLOAT:          _type = FLOAT;  break;
+    case VTK_DOUBLE:         _type = DOUBLE; break;
+    default: break;
+               
+    } // fswitch
+       
+    org->GetDimensions( itmp );
+    _dims[ CX ] = ( uint )itmp[ 0 ];
+    _dims[ CY ] = ( uint )itmp[ 1 ];
+    _dims[ CZ ] = ( uint )itmp[ 2 ];
+    org->GetSpacing( ftmp );
+    _sizes[ CX ] = ( double )ftmp[ 0 ];
+    _sizes[ CY ] = ( double )ftmp[ 1 ];
+    _sizes[ CZ ] = ( double )ftmp[ 2 ];
+
+    _raw = org->GetPointData( )->GetScalars( )->GetVoidPointer( 0 );
+    //_vtk = org;
+    _vtk = vtkImageData::New();
+    _vtk->ShallowCopy( org );
+    buildIndex( );
+}
+
+// -------------------------------------------------------------------------
+kVolume& kVolume::operator=( vtkImageData* org )
+{
+    copyFrom( org );
+    return( *this );
+}
+
+// -------------------------------------------------------------------------
+void kVolume::copyFrom( vtkImageData* org )
+{
+    int i, j, k;//, y;
+    int itmp[ 3 ];
+    int ext[ 6 ];
+    double ftmp[ 3 ];
+    double v;
+
+    deallocate( );
+       
+#ifdef KGFO_USE_IDO
+
+    _privateIdo = NULL;
+
+#endif // KGFO_USE_IDO
+
+    _vtk               = NULL;
+    _raw               = NULL;
+    _columns   = NULL;
+    _images            = NULL;
+    _creator   = SELF;
+
+    switch( org->GetScalarType( ) ) {
+
+    case VTK_CHAR:           _type = CHAR;   break;
+    case VTK_UNSIGNED_CHAR:  _type = UCHAR;  break;
+    case VTK_SHORT:          _type = SHORT;  break;
+    case VTK_INT:            _type = INT;    break;
+    case VTK_UNSIGNED_SHORT: _type = USHORT; break;
+    case VTK_UNSIGNED_INT:   _type = UINT;   break;
+    case VTK_FLOAT:          _type = FLOAT;  break;
+    case VTK_DOUBLE:         _type = DOUBLE; break;
+    default: break;
+               
+    } // fswitch
+       
+    org->GetDimensions( itmp );
+    _dims[ CX ] = ( uint )itmp[ 0 ];
+    _dims[ CY ] = ( uint )itmp[ 1 ];
+    _dims[ CZ ] = ( uint )itmp[ 2 ];
+    org->GetSpacing( ftmp );
+    _sizes[ CX ] = ( double )ftmp[ 0 ];
+    _sizes[ CY ] = ( double )ftmp[ 1 ];
+    _sizes[ CZ ] = ( double )ftmp[ 2 ];
+
+    allocate( );
+    buildIndex( );
+
+    // This avoids vtk extent crap conversion...
+    org->GetExtent( ext );
+    for( i = ext[ 0 ]; i <= ext[ 1 ]; i++ ) {
+
+       for( j = ext[ 2 ]; j <= ext[ 3 ]; j++ ) {
+
+           for( k = ext[ 4 ]; k <= ext[ 5 ]; k++ ) {
+               
+               v = org->GetScalarComponentAsDouble( i, j, k, 0 );
+               setPixel( v, i - ext[ 0 ], j - ext[ 2 ], k - ext[ 4 ] );
+               
+           } // rof
+
+       } // rof
+
+    } // rof
+}
+
+#endif // KGFO_USE_VTK
+
+#ifdef KGFO_USE_IDO
+
+// -------------------------------------------------------------------------
+kVolume::kVolume( PPPVOLUME org )
+    : _raw( 0 ), _columns( 0 ), _images( 0 ),
+      _creator( IDO ),
+#ifdef KGFO_USE_VTK
+      _vtk( 0 ),
+#endif // KGFO_USE_VTK
+      _privateIdo( 0 )
+{
+    switch( IdVolType( org ) ) {
+
+    case VOL_UCHAR:  _type = UCHAR;  break;
+    case VOL_CHAR:   _type = CHAR;   break;
+    case VOL_FLOAT:  _type = FLOAT;  break;
+    case VOL_DOUBLE: _type = DOUBLE; break;
+    case VOL_SHORT:  _type = SHORT;  break;
+    case VOL_USHORT: _type = USHORT; break;
+    case VOL_LONG:   _type = INT;    break;
+    case VOL_ULONG:  _type = UINT;   break;
+    default: break;
+
+    } // fswitch
+
+    _dims[ CX ] = IdVolDimX( org );
+    _dims[ CY ] = IdVolDimY( org );
+    _dims[ CZ ] = IdVolDimZ( org );
+    _sizes[ CX ] = 1;
+    _sizes[ CY ] = 1;
+    _sizes[ CZ ] = 1;
+
+    _privateIdo = _IdVolPrivate( org );
+    _raw = ( ( void*** ) &( _privateIdo[ 1 ] ) )[ 0 ][ 0 ];
+    buildIndex( );
+}
+
+// -------------------------------------------------------------------------
+kVolume& kVolume::operator=( PPPVOLUME org )
+{
+    copyFrom( org );
+    return( *this );
+}
+
+// -------------------------------------------------------------------------
+void kVolume::copyFrom( PPPVOLUME org )
+{
+    void* buffer;
+
+    deallocate( );
+
+    _raw               = NULL;
+    _columns   = NULL;
+    _images            = NULL;
+    _creator   = SELF;
+#ifdef KGFO_USE_VTK
+    _vtk = NULL;
+#endif // KGFO_USE_VTK
+    _privateIdo = NULL;
+
+    switch( IdVolType( org ) ) {
+
+    case VOL_UCHAR:  _type = UCHAR;  break;
+    case VOL_CHAR:   _type = CHAR;   break;
+    case VOL_FLOAT:  _type = FLOAT;  break;
+    case VOL_DOUBLE: _type = DOUBLE; break;
+    case VOL_SHORT:  _type = SHORT;  break;
+    case VOL_USHORT: _type = USHORT; break;
+    case VOL_LONG:   _type = INT;    break;
+    case VOL_ULONG:  _type = UINT;   break;
+    default: break;
+
+    } // fswitch
+
+    _dims[ CX ] = IdVolDimX( org );
+    _dims[ CY ] = IdVolDimY( org );
+    _dims[ CZ ] = IdVolDimZ( org );
+    _sizes[ CX ] = 1;
+    _sizes[ CY ] = 1;
+    _sizes[ CZ ] = 1;
+
+    allocate( );
+    buildIndex( );
+    buffer = ( ( void*** ) &( org[ 1 ] ) )[ 0 ][ 0 ];
+    memcpy( _raw, buffer, getRawSizeInBytes( ) );
+}
+
+#endif // KGFO_USE_IDO
+
+// eof - volume.cxx
diff --git a/lib/maracasVisuLib/src/kernel/volume.hxx b/lib/maracasVisuLib/src/kernel/volume.hxx
new file mode 100644 (file)
index 0000000..ed641d9
--- /dev/null
@@ -0,0 +1,259 @@
+/*=========================================================================
+
+  Program:   wxMaracas
+  Module:    $RCSfile: volume.hxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/31 16:32:56 $
+  Version:   $Revision: 1.1 $
+
+  Copyright: (c) 2002, 2003
+  License:
+  
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#ifndef KGFO__VOLUME__HXX
+#define KGFO__VOLUME__HXX
+
+#include "marTypes.h"
+#include <string>
+
+#ifdef KGFO_USE_IDO
+extern "C"
+{
+#include <idvol.h>
+};
+#endif // KGFO_USE_IDO
+
+#ifdef KGFO_USE_VTK
+#include <vtkImageData.h>
+#endif // KGFO_USE_VTK
+
+class MAR_KERNEL_EXPORT kVolume
+{
+    public:
+
+    enum Creator{ VTK, IDO, SELF };
+    enum Coord{ CX = 0, CY = 1, CZ = 2 };
+    enum Type{ CHAR = 0, FLOAT = 1, DOUBLE = 2,
+              INT = 3, SHORT = 4, UCHAR = 5,
+              UINT = 6, USHORT = 7 };
+
+    static const int SIZETypes[];
+    static const void* BLANK;
+    static const void* NOALLOC;
+#ifdef KGFO_USE_VTK
+
+    static const vtkIdType VTKTypes[];
+
+#endif // KGFO_USE_VTK
+#ifdef KGFO_USE_IDO
+
+    static const int IDOTypes[];
+
+#endif // KGFO_USE_IDO
+
+    public:
+
+    kVolume( );
+
+    kVolume( Type type,
+            uint xdim, uint ydim, uint zdim,
+            double xsize = 1, double ysize = 1, double zsize = 1,
+            void* data = 0 );
+    kVolume( Type type,
+            const uint *dims,
+            const double *sizes,
+            void* data = 0 );
+
+    kVolume( const kVolume& org );
+    kVolume& operator=( const kVolume& org );
+    void copyFrom( const kVolume& org );
+
+    virtual ~kVolume( ) { deallocate( ); }
+
+    Type getType( ) const { return( _type ); }
+
+    bool sameDimension( const kVolume& comp );
+
+    const uint* getDimensions( ) const { return( _dims ); }
+    uint getWidth( ) const { return( _dims[ CX ] ); }
+    uint getHeight( ) const { return( _dims[ CY ] ); }
+    uint getDepth( ) const { return( _dims[ CZ ] ); }
+    uint getNcols( ) const { return( _dims[ CX ] ); }
+    uint getNrows( ) const { return( _dims[ CY ] ); }
+    uint getNplanes( ) const { return( _dims[ CZ ] ); }
+    uint getXdim( ) const { return( _dims[ CX ] ); }
+    uint getYdim( ) const { return( _dims[ CY ] ); }
+    uint getZdim( ) const { return( _dims[ CZ ] ); }
+
+    void setDimensions( uint* dims )
+    {
+       memcpy( _dims, dims, 3 * sizeof( uint ) );
+    }
+    void setWidth( uint w ) { _dims[ CX ] = w; }
+    void setHeight( uint h ) { _dims[ CY ] = h; }
+    void setDepth( uint d ) { _dims[ CZ ] = d; }
+    void setNcols( uint c ) { _dims[ CX ] = c; }
+    void setNrows( uint r ) { _dims[ CY ] = r; }
+    void setNplanes( uint p ) { _dims[ CZ ] = p; }
+    void setXdim( uint x ) { _dims[ CX ] = x; }
+    void setYdim( uint y ) { _dims[ CY ] = y; }
+    void setZdim( uint z ) { _dims[ CZ ] = z; }
+
+    const double *getSizes( ) const { return( _sizes ); }
+    double getXsize( ) const { return( _sizes[ CX ] ); }
+    double getYsize( ) const { return( _sizes[ CY ] ); }
+    double getZsize( ) const { return( _sizes[ CZ ] ); }
+
+    void setSizes( double* sizes )
+    {
+       memcpy( _sizes, sizes, 3 * sizeof( double ) );
+    }
+    void setXsize( double x ) { _sizes[ CX ] = x; }
+    void setYsize( double y ) { _sizes[ CY ] = y; }
+    void setZsize( double z ) { _sizes[ CZ ] = z; }
+
+    void* getData1D( ) { return( _raw ); }
+    const void* getData1D( ) const { return( _raw ); }
+
+    void** getData2D( ) { return( _columns ); }
+    void** const getData2D( ) const { return( _columns ); }
+
+    void*** getData3D( ) { return( _images ); }
+    void*** const getData3D( ) const { return( _images ); }
+
+    void reset( ) { memset( _raw, 0, getRawSizeInBytes( ) ); }
+
+    ulong getRawSize( ) const
+    {
+       return( ( ulong )_dims[ CX ] *
+               ( ulong )_dims[ CY ] *
+               ( ulong )_dims[ CZ ] );
+    }
+    ulong getRawSizeInBytes( ) const
+    {
+       return( SIZETypes[ _type ] * getRawSize( ) );
+    }
+
+    double getPixel( uint x, uint y, uint z ) const;
+    void setPixel( double v, uint x, uint y, uint z );
+
+    void convertCast( Type type );
+    void convertScale( Type type, double min, double max );
+    void normalize( double min, double max )
+    {
+       convertScale( _type, min, max );
+    }
+
+    void getMinMax( double& min, double& max ) const;
+    double getMin( ) const;
+    double getMax( ) const;
+    //double GetMaxIntSphere( double* p, const double r ) const;
+    unsigned short GetMaxIntSphere2( double* p, const double r );
+
+  private:
+
+    void allocate( );
+    void buildIndex( );
+    void deallocate( );
+
+  protected:
+
+    Type _type;
+    Creator _creator;
+
+    uint _dims[ 3 ];
+    double _sizes[ 3 ];
+    void* _raw;
+    void** _columns;
+    void*** _images;
+
+#ifdef KGFO_USE_VTK
+
+    public:
+
+    /**
+     * Creators/copiers from a vtkImageData object.
+     * C++ creators allows you to create a kVolume cast to you vtkImageData
+     * object, but if extent != bounds, you can expect a weird behaviour.
+     * If you want to forget all about extents, then crop your volume or
+     * use either the operator= or the copyFrom method.
+     */
+    kVolume( vtkImageData* org );
+    kVolume& operator=( vtkImageData* org );
+    void copyFrom( vtkImageData* org ); 
+
+    vtkImageData* castVtk( ) const { return( _vtk ); }
+    operator vtkImageData*( ) const { return( _vtk ); }
+
+    protected:
+
+    vtkImageData* _vtk;
+
+#endif // KGFO_USE_VTK
+
+
+#ifdef KGFO_USE_IDO
+
+    public:
+
+    kVolume( PPPVOLUME org );
+
+    kVolume& operator=( PPPVOLUME org );
+    void copyFrom( PPPVOLUME org ); 
+
+    PPPVOLUME castIdo( ) const
+    {
+       return( ( PPPVOLUME )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME( ) const
+    {
+       return( ( PPPVOLUME )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_CHAR( ) const
+    {
+       return( ( PPPVOLUME_CHAR )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_FLOAT( ) const
+    {
+       return( ( PPPVOLUME_FLOAT )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_DOUBLE( ) const
+    {
+       return( ( PPPVOLUME_DOUBLE )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_LONG( ) const
+    {
+       return( ( PPPVOLUME_LONG )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_SHORT( ) const
+    {
+       return( ( PPPVOLUME_SHORT )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_UCHAR( ) const
+    {
+       return( ( PPPVOLUME_UCHAR )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_ULONG( ) const
+    {
+       return( ( PPPVOLUME_ULONG )( &_privateIdo[ 1 ] ) );
+    }
+    operator PPPVOLUME_USHORT( ) const
+    {
+       return( ( PPPVOLUME_USHORT )( &_privateIdo[ 1 ] ) );
+    }
+       
+    protected:
+
+    PRIVATE_VOLUME* _privateIdo;
+
+#endif // KGFO_USE_IDO
+};
+
+#endif // KGFO__VOLUME__HXX
+
+// eof - volume.hxx
diff --git a/lib/maracasVisuLib/src/kernel/vtkDijkstraImageData.cxx b/lib/maracasVisuLib/src/kernel/vtkDijkstraImageData.cxx
new file mode 100644 (file)
index 0000000..5bbed49
--- /dev/null
@@ -0,0 +1,734 @@
+#include "vtkDijkstraImageData.h"
+#include "vtkObjectFactory.h"
+#include "vtkIntArray.h"
+#include "vtkPointData.h"
+#include "vtkPriorityQueue.h"
+#include "vtkIdList.h"
+#include "vtkImageData.h"
+#include "vtkFloatArray.h"
+ #include <math.h>
+#include <stdlib.h>
+
+vtkCxxSetObjectMacro(vtkDijkstraImageData,BoundaryScalars,vtkDataArray);
+ //----------------------------------------------------------------------------
+ vtkDijkstraImageData* vtkDijkstraImageData::New()
+ {
+
+          
+
+
+   // First try to create the object from the vtkObjectFactory
+   vtkObject* ret = vtkObjectFactory::CreateInstance("vtkDijkstraImageData");
+   if(ret)
+    {
+     return (vtkDijkstraImageData*)ret;
+     }
+   // If the factory was unable to create the object, then create it here.
+   return new vtkDijkstraImageData;
+ }
+
+
+//----------------------------------------------------------------------------
+// Constructor sets default values
+vtkDijkstraImageData::vtkDijkstraImageData()
+{
+  this->SourceID = 0;
+  this->SinkID = 0;
+  this->NumberOfInputPoints = 0;
+  this->PathPointer = -1;
+  this->StopWhenEndReached = 1;
+  this->ShortestPathIdList = NULL;
+  this->Parent        = NULL;
+  this->Visited          = NULL;
+  this->PQ = NULL;
+  this->BoundaryScalars = NULL;
+
+  this->UseInverseDistance = 0;
+  this->UseInverseSquaredDistance = 0;
+  this->UseInverseExponentialDistance = 1;
+  this->UseSquaredDistance = 0;
+
+  this->puntos = NULL;
+  this->lineas = NULL;
+
+
+  this->logger = NULL;
+
+       //if ((this->logger = freopen("c:\\creatis\\maracas\\dijkstra.txt","w", stdout)) == NULL)
+       //      exit(-1);
+    
+}
+
+
+//------------------------------------------------------------------------------
+vtkDijkstraImageData::~vtkDijkstraImageData()
+{
+
+
+  if (this->ShortestPathIdList)
+    this->ShortestPathIdList->Delete();
+  if (this->Parent)
+    this->Parent->Delete();
+  if(this->BoundaryScalars) 
+    this->BoundaryScalars->Delete();
+  //if (this->Visited)
+  // this->Visited->Delete();
+  //if (this->PQ)
+  // this->PQ->Delete();
+  //if (this->Heap)
+  //this->Heap->Delete();
+  //if (this->p)
+  //this->p->Delete();
+  //if(this->BoundaryScalars)
+  //this->BoundaryScalars->Delete();
+  //DeleteGraph();
+  //if (this->CumulativeWeightFromSource)
+  //this->CumulativeWeightFromSource->Delete();
+  
+}
+
+//------------------------------------------------------------------------------
+unsigned long vtkDijkstraImageData::GetMTime()
+{
+  unsigned long mTime=this->MTime.GetMTime();
+  
+  return mTime;
+}
+
+
+void vtkDijkstraImageData::SetInput(vtkImageData* data){
+       this->vtkProcessObject::SetNthInput(0, data);
+}
+
+vtkImageData* vtkDijkstraImageData::GetInput(){
+       return (vtkImageData *)(this->Inputs[0]);
+}
+
+//------------------------------------------------------------------------------
+void vtkDijkstraImageData::init(vtkImageData *inData)
+{
+
+  if (this->ShortestPathIdList)
+    this->ShortestPathIdList->Delete();
+  
+  if (this->Parent)
+    this->Parent->Delete();
+  if (this->Visited)
+    this->Visited->Delete();
+  if (this->PQ)
+  this->PQ->Delete();
+
+  this->ShortestPathIdList = vtkIdList::New();
+  this->Parent        = vtkIntArray::New();
+  this->Visited          = vtkIntArray::New();
+  this->PQ = vtkPriorityQueue::New();
+  
+  
+  CreateGraph(inData);     
+  
+
+  int numPoints = inData->GetNumberOfPoints();
+
+  this->Parent->SetNumberOfComponents(1);
+  this->Parent->SetNumberOfTuples(numPoints);
+  this->Visited->SetNumberOfComponents(1);
+  this->Visited->SetNumberOfTuples(numPoints);
+}
+
+void vtkDijkstraImageData::DeleteGraph()
+{
+  
+  /*const int npoints = this->GetNumberOfInputPoints();
+  
+    if (this->Neighbors)
+    {
+    for (int i = 0; i < npoints; i++)
+    {
+    if(this->Neighbors[i])
+    this->Neighbors[i]->Delete();
+    }
+    delete [] this->Neighbors;
+    }
+    this->Neighbors = NULL;
+  */
+}
+
+//------------------------------------------------------------------------------
+void vtkDijkstraImageData::CreateGraph(vtkImageData *inData) {
+
+  
+  //DeleteGraph();
+  //delete old arrays in case we are re-executing this filter
+  int numPoints = inData->GetNumberOfPoints(); 
+  this->SetNumberOfInputPoints(numPoints);
+  
+  // initialization
+  int *dim = inData->GetDimensions();
+  vtkDataArray *scalars = inData->GetPointData()->GetScalars();
+  vtkIdList *graphNodes = vtkIdList::New();
+  int graphSize = 0;
+  // create the graph
+  for(int k = 0; k <dim[2]; k++) {
+    this->UpdateProgress ((float) k / (2 * ((float) dim[2] - 1)));
+    for(int j = 0; j <dim[1]; j++) {
+      for(int i = 0; i <dim[0]; i++) {
+    
+    int id = k*(dim[1]*dim[0]) + j*dim[0] + i;
+    float maskValue = scalars->GetTuple1(id);
+    // only add neighbor if it is in the graph
+    
+    if(maskValue > 0) {    
+      // add to graph
+      graphNodes->InsertNextId(id);
+      graphSize++;
+    }
+      }
+    }
+  }
+
+  this->SetNumberOfGraphNodes(graphSize);
+  //printf("graph size %i \n ",graphSize);
+  
+  // fill the PQ
+  PQ->Allocate(graphSize);
+  for(int i=0; i<graphSize;i++) {
+    PQ->Insert(VTK_LARGE_FLOAT,graphNodes->GetId(i));
+  }
+  // free some memory
+  graphNodes->Delete();
+  
+}
+
+
+//------------------------------------------------------------------------------
+void vtkDijkstraImageData::RunDijkstra(vtkDataArray *scalars,int startv, int endv)
+{
+  
+       int i, u, v;
+  
+       printf("tipo de ponderacion de pesos : linear %i, squared %i, exponential %i\n",this->UseInverseDistance,this->UseInverseSquaredDistance,this->UseInverseExponentialDistance);
+       
+       
+  
+       //-------------------------------------------------------------------------------
+       // INICIALIZACION. 
+       //-------------------------------------------------------------------------------
+       
+       // 1. Se marcan todos los vertices del grafo como no visitados.
+       InitSingleSource(startv);
+       
+       // 2. Se marca el punto de arranque como visitado
+       this->Visited->SetValue(startv, 1);
+       
+       // 3. Se obtiene el tamanio inicial de los vertices no visitados
+       int initialSize = PQ->GetNumberOfItems();
+       int size = initialSize;
+       int stop = 0;
+
+       //Nota: PQ contiene los nodos del grafo no evaluados.
+       //Segun Dijkstra, el algoritmo termina cuando todos los nodos tienen un valor de distancia minima.
+
+       //------------------------------------------------------------------------
+       // PARA TODOS LOS VERTICES EN PQ (SIN EVALUAR)
+       //------------------------------------------------------------------------
+       while ((PQ->GetNumberOfItems() > 0) && !stop)
+       {
+               
+               this->UpdateProgress (0.5 + (float) (initialSize - size) / ((float) 2 * initialSize));
+       
+       
+               vtkFloatingPointType u_weight;
+               
+               //----------------------------------------------------------------------
+               //1. Aqui obtiene el siguiente punto a evaluar. Al retirarlo de la cola
+               // se asume que ya ha sido evaluado, se evaluaran sus vecinos.
+               // u is now in S since the shortest path to u is determined
+               //----------------------------------------------------------------------
+               #if (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION == 0)      
+               u = PQ->Pop(u_weight,0);
+               #else
+               u = PQ->Pop(0, u_weight);
+               #endif
+               //printf("Evaluando el nodo %i con prioridad %.2f\n",u,u_weight);
+               //printPointData(u);
+
+
+        //-----------------------------------------
+               //2. Se marca "u" como ya visitado.
+               //-----------------------------------------
+               this->Visited->SetValue(u, 1);
+      
+               
+               
+               //------------------------------------------------------------------------------------
+               //3. Si u es el nodo final el algoritmo se detiene. (despues de evaluar sus vecinos)
+               //------------------------------------------------------------------------------------
+               if (u == endv && StopWhenEndReached)
+                       stop = 1;
+      
+               // Update all vertices v neighbors to u
+               // find the neighbors of u
+               
+               
+               
+               //-----------------------------------------
+               //4. Encontrar los vecinos de u
+               //-----------------------------------------
+               vtkIdList *list = vtkIdList::New();
+               this->FindNeighbors(list,u,scalars);
+      
+               //printf("%i tiene %i vecinos\n",u,list->GetNumberOfIds());
+               
+               //-----------------------------------------
+               // 5. Para cada vecino ....
+               //-----------------------------------------
+               for (i = 0; i < list->GetNumberOfIds(); i++) 
+               {
+
+                       //---------------------------------------------------------------------
+                       // 5.1 Se obtiene su ID (el indice es el orden en la lista de vecinos)
+                       //---------------------------------------------------------------------
+                       v = list->GetId(i);
+                       //printf("---> evaluando el vecino % i\n",v);
+    
+                       // s is the set of vertices with determined shortest path...do not 
+                       // use them again
+
+                       //-----------------------------------------------------------------
+                       // 5.2 Si ya ha sido visitado se descarta...
+                       //-----------------------------------------------------------------
+                       if (this->Visited->GetValue(v) != 1)
+                       {
+                               //printf("---> ---> el vecino %i no ha sido visitado\n",v);
+                               // Only relax edges where the end is not in s and edge 
+                               // is in the front 
+                               //---------------------------------------------------
+                               // 5.2.1 Se obtiene el COSTO W
+                               //---------------------------------------------------
+                               float w = EdgeCost(scalars, u, v);
+                               
+                               //---------------------------------------------------
+                               // 5.2.2 
+                               //---------------------------------------------------
+                               float v_weight = this->PQ->GetPriority(v);
+                               if(v == endv) {
+                                       //printf("we have found endv %i, its weight is %f, neighbor is %i , weight is %f, edge weight is %f\n",v,v_weight,u,u_weight,w);
+                                       //stop=1;
+                                       //break;
+                               }
+
+                               //printf("---> ---> el costo de %i es %.2f\n",v,(w+u_weight));
+                               //printf("---> ---> el costo previo de %i es %.2f\n",v,v_weight);
+        
+                                                               
+                               //-------------------------------------------------------------------------------
+                               // 5.2.3 Si se encuentra un camino menor, se reajusta el costo (Node Relaxation)
+                               //-------------------------------------------------------------------------------
+                               if (v_weight > (u_weight + w))
+                               {
+                                       // 5.2.3.1 Se elimina V de la cola de nodos por evaluar (PQ). Porque se encontro un costo mas bajo
+                                       this->PQ->DeleteId(v);
+                                       
+                                       // 5.2.3.2 Se inserta nuevamente V en la cola de nodos por evaluar con el nuevo costo.
+                                       this->PQ->Insert((u_weight + w),v);
+                                       //printf("---> ---> reajustando el peso de %i a %.2f\n",v,u_weight + w);
+                                       //printf("u_weight=%.2f\n",u_weight);
+                                       
+                                       // 5.2.3.3 se coloca V conectado con U (esto sirve para reconstruir el camino minimo)
+                                       
+                                       this->Parent->SetValue(v, u);
+                                       //printf("setting parent of %i to be %i",v,u);
+                               }
+                       }
+                       else{
+                               //printf("---> el vecino %i ya se visito\n",v);
+                       }
+               }
+
+               //-------------------------------------------------------
+               // 6. Liberar la memoria ocupada por la lista de vecinos
+               //-------------------------------------------------------
+               list->Delete();
+               size--;
+       }
+       this->PQ->Delete();
+       this->Visited->Delete();
+}
+
+//----------------------------------------------------------------------------
+void vtkDijkstraImageData::InitSingleSource(int startv)
+{
+  for (int v = 0; v < this->GetNumberOfInputPoints(); v++)
+    {
+      this->Parent->SetValue(v, -1);
+      this->Visited->SetValue(v, 0);
+    }
+  PQ->DeleteId(startv);
+  // re-insert the source with priority 0
+  PQ->Insert(0,startv);
+  //printf("priority of startv %f",PQ->GetPriority(startv));
+}
+
+
+//----------------------------------------------------------------------------
+void vtkDijkstraImageData::FindNeighbors(vtkIdList *list,int id, vtkDataArray *scalars) {
+  
+  // find i, j, k for that node
+  vtkImageData *input = this->GetInput();
+
+  int *dim = input->GetDimensions();
+  int numPts = dim[0] * dim[1] * dim[2];
+  
+  //printf("vecinos de %i :(",id);
+  for(int vk = -1; vk<2; vk++) {
+    for(int vj = -1; vj<2; vj++) {
+      for(int vi = -1; vi<2; vi++) {         
+    
+               int tmpID = id + (vk * dim[1]*dim[0]) + (vj * dim[0]) + vi;
+               // check we are in bounds (for volume faces)     
+               if( tmpID >= 0 && tmpID < numPts && tmpID != 0) {
+                       float mask = scalars->GetTuple1(tmpID);
+                       // only add neighbor if it is in the graph
+                       if(mask > 0 && tmpID != id) {        
+                               list->InsertUniqueId(tmpID);
+                               //printf("%i,",tmpID);
+                               //printPointData(tmpID);
+                       }
+               }
+      }
+    }
+  }
+  //printf(")\n");
+}
+
+
+
+float vtkDijkstraImageData::fuerzaAtraccion(int u, float w)
+{
+       //1. Identificar las coordenadas del punto de inicio y del punto final (polos)
+       double coordsSource[3];
+       double coordsSink[3];
+       double coordsPoint[3];
+
+       this->GetInput()->GetPoint(this->GetSourceID(), coordsSource);
+       this->GetInput()->GetPoint(this->GetSinkID(), coordsSink);
+       
+    
+       //2. Identificar las coordenadas del punto al cual se le quiere sacar el potencial electrico
+       this->GetInput()->GetPoint(u, coordsPoint);
+
+
+       //3 Calcular r1 y r2
+
+       float r1 = sqrt((coordsSource[0]-coordsPoint[0])*(coordsSource[0]-coordsPoint[0]) +
+               (coordsSource[1]-coordsPoint[1])*(coordsSource[1]-coordsPoint[1]) +
+               (coordsSource[2]-coordsPoint[2])*(coordsSource[2]-coordsPoint[2]));
+
+
+       float r2 = sqrt((coordsSink[0]-coordsPoint[0])*(coordsSink[0]-coordsPoint[0]) +
+               (coordsSink[1]-coordsPoint[1])*(coordsSink[1]-coordsPoint[1]) +
+               (coordsSink[2]-coordsPoint[2])*(coordsSink[2]-coordsPoint[2]));
+
+       float d = sqrt((coordsSink[0]-coordsSource[0])*(coordsSink[0]-coordsSource[0]) +
+               (coordsSink[1]-coordsSource[1])*(coordsSink[1]-coordsSource[1]) +
+               (coordsSink[2]-coordsSource[2])*(coordsSink[2]-coordsSource[2]));
+
+
+
+       if (r2 < d && r1 > d){
+               return w/2;
+       } else if ( r2 > d && r1 < d){
+               return w/2;
+       } else if (r1 < d && r2 < d){
+               return w*w;
+       } else return w/2;
+
+
+       
+}
+
+//----------------------------------------------------------------------------
+// The edge cost function should be implemented as a callback function to
+// allow more advanced weighting
+float vtkDijkstraImageData::EdgeCost(vtkDataArray *scalars, int u, int v)
+{
+  
+  float w;
+  
+    float dist2 = scalars->GetTuple1(v);  //+ fuerzaAtraccion(v, scalars->GetTuple1(v));
+    float dist = sqrt(dist2);
+    if(this->UseInverseDistance)
+      w = (1.0/dist);
+    else if(this->UseInverseSquaredDistance)
+      w = (1.0/(dist2));
+    else if(this->UseInverseExponentialDistance)
+      w = (1.0/exp(dist));
+    else if(this->UseSquaredDistance)
+      w = dist2;
+
+
+
+  return w;
+}
+
+//----------------------------------------------------------------------------
+void vtkDijkstraImageData::BuildShortestPath(int start,int end)
+{
+
+       int p = end;
+       int next = 0;
+       int i = 0;
+       double punto[3];
+
+       this->puntos = vtkPoints::New();
+       this->lineas = vtkCellArray::New();
+
+       
+       
+       //printf("======================camino minimo========================\n");
+       //printf("Punto Inicial = %i,  Punto Final = %i\n",start, end);
+
+       while (p != start && p > 0)
+    {
+               printPointData(p);
+       
+               this->GetInput()->GetPoint(p,punto);
+               this->puntos->InsertPoint(i,punto); //puntos y lineas usados como resultado (vtkPolyData)
+          
+               next = this->Parent->GetValue(p);
+
+               this->GetInput()->GetPoint(next,punto);
+               this->puntos->InsertPoint(i+1,punto);
+               
+               this->lineas->InsertNextCell(2);
+               this->lineas->InsertCellPoint(i);
+               this->lineas->InsertCellPoint(i+1);
+
+               this->ShortestPathIdList->InsertNextId(p);
+               p = next;
+               i++;
+    }
+       
+       this->ShortestPathIdList->InsertNextId(p);
+       printPointData(p);
+       //printf("===========================================================\n");
+       
+       
+
+       this->GetOutput()->SetPoints (this->puntos);
+       this->GetOutput()->SetLines(this->lineas);
+       this->GetOutput()->Modified();
+    //fclose(logger);
+
+}
+
+vtkIdList* vtkDijkstraImageData::GetShortestPathIdList()
+{
+       return this->ShortestPathIdList;
+}
+
+
+
+void vtkDijkstraImageData::printPointData(int pointID)
+{
+       double coords[3];
+
+       this->GetInput()->GetPoint(pointID, coords);
+       double scalar = this->GetInput()->GetPointData()->GetScalars()->GetTuple1(pointID);
+
+       printf("Punto ID: %i ",pointID);
+       printf("Coords[%.0f, %.0f, %.0f] ", coords[0], coords[1], coords[2]);
+       printf("Scalar: %.2f\n", scalar);
+
+}
+
+
+
+//----------------------------------------------------------------------------
+// ITERATOR PART 
+
+void vtkDijkstraImageData::InitTraversePath(){
+  this->PathPointer = -1;
+}
+
+//----------------------------------------------------------------------------
+int vtkDijkstraImageData::GetNumberOfPathNodes(){
+  return this->ShortestPathIdList->GetNumberOfIds();
+}
+
+//----------------------------------------------------------------------------
+int vtkDijkstraImageData::GetNextPathNode(){
+  this->PathPointer = this->PathPointer + 1;
+  
+  if(this->PathPointer < this->GetNumberOfPathNodes()) {
+    //printf("this->GetPathNode(this->PathPointer) %i",this->GetPathNode(this->PathPointer));
+    return this->ShortestPathIdList->GetId(this->PathPointer);
+  } else {
+    return -1;
+  }
+}
+
+//----------------------------------------------------------------------------
+// find closest scalar to id that is non-zero
+int vtkDijkstraImageData::findClosestPointInGraph(vtkDataArray *scalars,int id,int dim0,int dim1, int dim2) {
+
+  
+  int kFactor = dim0 * dim1;
+  int jFactor = dim0;
+  
+  int numPoints = kFactor * dim2;
+  vtkIdList* Q = vtkIdList::New();
+  Q->InsertNextId(id);
+  
+  int pointer = 0;
+  int foundID = -1;
+  
+  while(Q->GetNumberOfIds() != 0) {
+    
+    int current = Q->GetId(pointer);
+    pointer = pointer + 1;
+    //printf("we are looking at id %i \n",current);
+    
+    // check to see if we found something in the graph
+    if(scalars->GetTuple1(current) >0) {
+      //printf("before return");
+      return current;
+    } else {
+      // set it to -1 to show that we already looked at it
+      scalars->SetTuple1(current,-1);
+      // put the neighbors on the stack
+      // top
+      if (current + kFactor <numPoints) {
+    if(scalars->GetTuple1(current + kFactor) != -1){
+      //printf("expand k+1 %i",current + kFactor);
+      Q->InsertNextId(current+kFactor);
+    }
+      }
+      // bottom
+       if (current - kFactor >= 0){
+     if(scalars->GetTuple1(current - kFactor) != -1){
+       //printf("expand k-1 %i", current - kFactor);
+       Q->InsertNextId(current-kFactor);
+     }
+       }
+       // front
+       if (current + jFactor < numPoints) {
+     if(scalars->GetTuple1(current + jFactor) != -1){
+       //printf("expand j+1 %i",current + jFactor);
+       Q->InsertNextId(current + jFactor);
+     }
+       }
+       // back
+       if (current - jFactor >= 0) {
+     if(scalars->GetTuple1(current - jFactor) != -1){
+       //printf("expand j-1 %i",current - jFactor);
+       Q->InsertNextId(current - jFactor);    
+     }
+       }
+       // left
+       if (current+1 <numPoints){
+     if(scalars->GetTuple1(current + 1) != -1){
+       //printf("expand i+1 %i",current+1);
+       Q->InsertNextId(current + 1);    
+     }
+       }
+       // right
+       if (current -1 >= 0) {
+     if(scalars->GetTuple1(current - 1) != -1){
+       //printf("expand i-1 %i",current - 1);
+       Q->InsertNextId(current - 1);    
+     }
+       }
+     }
+   }
+   Q->Delete();
+   return foundID;
+ }
+ //----------------------------------------------------------------------------
+ // This method is passed a input and output Data, and executes the filter
+ // algorithm to fill the output from the input.
+ // It just executes a switch statement to call the correct function for
+ // the Datas data types.
+ // -- sp 2002-09-05 updated for vtk4
+ void vtkDijkstraImageData::Execute()
+ {
+     
+   vtkImageData *inData = this->GetInput();
+   vtkPolyData  *outData = this->GetOutput();
+
+   
+    
+  
+   // Components turned into x, y and z
+   if (inData->GetNumberOfScalarComponents() > 3)
+     {
+     vtkErrorMacro("This filter can handle upto 3 components");
+     return;
+     }
+   
+
+   //printf("*************** vtkDijkstraImageData Execute **************\n\n\n");
+   this->init(inData);
+   //printf("*************** after init ****************\n\n\n");
+   
+   int *dim = inData->GetDimensions();
+   vtkDataArray *scalars = inData->GetPointData()->GetScalars();
+   
+    // find closest point in graph to source and sink if their value is not 0
+   printf("source ID %i value is %f\n",this->GetSourceID(),scalars->GetTuple1(this->GetSourceID()));
+   if(scalars->GetTuple1(this->GetSourceID()) == 0) {
+     
+     vtkFloatArray *copyScalars = vtkFloatArray::New();
+     copyScalars->DeepCopy(inData->GetPointData()->GetScalars());
+     
+     this->SetSourceID(this->findClosestPointInGraph(copyScalars,this->GetSourceID(),dim[0],dim[1],dim[2]));
+     
+     copyScalars->Delete();
+     printf("NEW source ID %i value is %f\n",this->GetSourceID(),scalars->GetTuple1(this->GetSourceID()));
+   }
+   printf("sink ID %i value is %f\n",this->GetSinkID(),scalars->GetTuple1(this->GetSinkID()));
+   if(scalars->GetTuple1(this->GetSinkID()) == 0) {
+     vtkFloatArray *copyScalars2 = vtkFloatArray::New();
+     copyScalars2->DeepCopy(inData->GetPointData()->GetScalars());
+     this->SetSinkID(this->findClosestPointInGraph(copyScalars2,this->GetSinkID(),dim[0],dim[1],dim[2]));
+     copyScalars2->Delete();
+     
+     printf("NEW sink ID %i value is %f\n",this->GetSinkID(),scalars->GetTuple1(this->GetSinkID()));
+   }
+       
+   
+   this->RunDijkstra(scalars,this->GetSourceID(),this->GetSinkID());
+   
+   this->BuildShortestPath(this->GetSourceID(),this->GetSinkID());
+   
+   
+   
+     
+ }
+ //----------------------------------------------------------------------------
+ void vtkDijkstraImageData::PrintSelf(ostream& os, vtkIndent indent)
+ {
+   Superclass::PrintSelf(os,indent);
+   os << indent << "Source ID: ( "
+      << this->GetSourceID() << " )\n";
+   os << indent << "Sink ID: ( "
+      << this->GetSinkID() << " )\n";
+ }
diff --git a/lib/maracasVisuLib/src/kernel/vtkDijkstraImageData.h b/lib/maracasVisuLib/src/kernel/vtkDijkstraImageData.h
new file mode 100644 (file)
index 0000000..a3e0833
--- /dev/null
@@ -0,0 +1,162 @@
+
+ #ifndef __VTK__VTK__DIJKSTRA__IMAGE__DATA__H
+ #define __VTK__VTK__DIJKSTRA__IMAGE__DATA__H
+ #include "vtkPolyDataSource.h"
+ #include "vtkImageData.h"
+ #include "vtkPoints.h"
+ #include "vtkCellArray.h"
+ #include "vtkPolyData.h"
+
+ class vtkIntArray;
+ class vtkDataArray;
+ class vtkPriorityQueue;
+ class vtkIdList;
+ class vtkDijkstraImageData : public vtkPolyDataSource
+ {
+   public:
+   static vtkDijkstraImageData *New();
+   vtkTypeMacro(vtkDijkstraImageData,vtkPolyDataSource);
+   void PrintSelf(ostream& os, vtkIndent indent);
+   
+   vtkSetMacro(SourceID,int);
+   vtkGetMacro(SourceID,int);
+   vtkSetMacro(SinkID,int);
+   vtkGetMacro(SinkID,int);
+   vtkGetObjectMacro(Parent,vtkIntArray);
+   
+   
+   virtual void SetBoundaryScalars(vtkDataArray*);
+   vtkGetObjectMacro(BoundaryScalars,vtkDataArray);
+   
+   vtkSetMacro(NumberOfInputPoints,int);
+   vtkGetMacro(NumberOfInputPoints,int);
+   
+   
+   vtkSetMacro(NumberOfGraphNodes,int);
+   vtkGetMacro(NumberOfGraphNodes,int);
+   
+   
+   vtkIdList* GetShortestPathIdList();
+   
+   
+   vtkSetMacro(UseInverseDistance,int);
+   vtkGetMacro(UseInverseDistance,int);
+   
+  
+   vtkSetMacro(UseInverseSquaredDistance,int);
+   vtkGetMacro(UseInverseSquaredDistance,int);
+  
+   vtkSetMacro(UseInverseExponentialDistance,int);
+   vtkGetMacro(UseInverseExponentialDistance,int);
+   vtkSetMacro(UseSquaredDistance,int);
+   vtkGetMacro(UseSquaredDistance,int);
+       
+   // Description:
+   unsigned long GetMTime();
+   
+   // path operations
+   void InitTraversePath();
+   int GetNextPathNode();
+   int GetNumberOfPathNodes();
+   
+   void SetInput(vtkImageData*);
+   vtkImageData* GetInput();
+   
+   
+   void CreateGraph(vtkImageData *inData);
+   void DeleteGraph();
+   void FindNeighbors(vtkIdList *list,int id, vtkDataArray *scalars); 
+   
+   int findClosestPointInGraph(vtkDataArray *scalars,int id,int dim0,int dim1, int dim2); 
+   
+  
+   
+   void InitSingleSource(int startv);
+  
+   void RunDijkstra(vtkDataArray *scalars,int source, int sink);
+   
+   float EdgeCost(vtkDataArray *scalars, int u, int v);
+   void BuildShortestPath(int start,int end);
+  
+         
+   
+   
+   int SourceID;
+   
+   
+   int SinkID;  
+   
+   
+   vtkDataArray *BoundaryScalars;
+  
+   int NumberOfInputPoints;
+   int NumberOfGraphNodes;
+   int UseInverseDistance;
+   int UseInverseSquaredDistance;
+   int UseInverseExponentialDistance;
+   int UseSquaredDistance;
+  
+   
+   vtkPriorityQueue *PQ;
+   
+   vtkIdList *ShortestPathIdList;
+   
+   vtkIntArray *Parent;
+   
+   vtkIntArray *Visited;  
+  
+  
+   int PathPointer;
+  
+   int StopWhenEndReached;
+
+
+   vtkPoints *puntos; 
+   vtkCellArray *lineas;
+   vtkImageData *input;
+
+
+
+       void init(vtkImageData *inData);
+
+       void printPointData(int pointID);
+
+       float fuerzaAtraccion(int u, float w);
+       
+ protected:
+   vtkDijkstraImageData();
+   ~vtkDijkstraImageData();
+    void Execute();
+
+   
+   FILE *logger;
+ private:
+//   vtkDijstraImageData(const vtkDijkstraImageData&);
+   void operator=(const vtkDijkstraImageData&);
+ };
+ #endif //__VTK__VTK__DIJKSTRA__IMAGE__DATA__H
diff --git a/lib/maracasVisuLib/src/kernel/vtkJoiner.cxx b/lib/maracasVisuLib/src/kernel/vtkJoiner.cxx
new file mode 100644 (file)
index 0000000..ecb5436
--- /dev/null
@@ -0,0 +1,40 @@
+
+#include "vtkJoiner.h"
+
+vtkJoiner::vtkJoiner(){
+}
+
+vtkJoiner::~vtkJoiner(){
+}
+
+
+vtkImageData* vtkJoiner::join(vtkImageData *a, vtkImageData *b){
+       
+       int extent[6];
+       vtkImageData *c = vtkImageData::New();
+       c->DeepCopy(a);
+       
+       unsigned char *ptrA = NULL;
+       unsigned char *ptrB = NULL;
+       unsigned char *ptrC = NULL;
+
+       a->GetExtent(extent);
+       int i, j, k;
+       for(i=extent[0];i<=extent[1];i++){
+               for(j=extent[2];j<=extent[3];j++){
+                       for(k=extent[4];k<=extent[5];k++){
+                               ptrA = (unsigned char *) a->GetScalarPointer(i,j,k);
+                               ptrB = (unsigned char *) b->GetScalarPointer(i,j,k);
+                               ptrC = (unsigned char *) c->GetScalarPointer(i,j,k);
+                               if ((*ptrA != 0) || (*ptrB != 0)){
+                                       *ptrC=255;
+                               }
+                               else{
+                                       *ptrC = 0;
+                               }
+                       }
+               }
+       }
+
+       return c;
+}
diff --git a/lib/maracasVisuLib/src/kernel/vtkJoiner.h b/lib/maracasVisuLib/src/kernel/vtkJoiner.h
new file mode 100644 (file)
index 0000000..dbf582c
--- /dev/null
@@ -0,0 +1,17 @@
+
+
+#ifndef __VTK__JOINER__H__
+#define __VTK__JOINER__H__
+
+#include "vtkImageData.h"
+
+class vtkJoiner
+{
+public:
+       vtkJoiner();
+       virtual ~vtkJoiner();
+       vtkImageData* join(vtkImageData *a, vtkImageData *b);
+};
+
+#endif //__VTK__JOINER__H__
+
diff --git a/lib/maracasVisuLib/src/kernel/vtkOtsu.cxx b/lib/maracasVisuLib/src/kernel/vtkOtsu.cxx
new file mode 100644 (file)
index 0000000..2ebd04a
--- /dev/null
@@ -0,0 +1,162 @@
+#include "vtkOtsu.h"
+
+        vtkOtsu::vtkOtsu(){
+                volume = NULL;
+                region = NULL;
+       
+       }
+
+        vtkOtsu::~vtkOtsu(){
+               
+       }
+
+
+
+
+       double vtkOtsu::calculateOptimalThreshold(vtkImageData* volume, vtkImageData *region){
+
+               this->volume = volume;
+               this->region = region;
+       
+               double valor = 0.0;
+               double media = 0.0;
+               double valorEnRegion = 0.0;
+           
+       
+               int extent[6];
+               
+               int index = 0;
+               
+               
+               this->volume->GetExtent(extent);
+               this->max=0.0;
+               this->sigmaT = 0.0;
+               
+               //1. Numero de voxeles
+               this->voxelCount = 0;
+               
+
+
+               //2. Inicializar el histograma y criterios
+               this->histogram = new int[1000];
+               this->criterias = new double[1000];
+               for (index = 0; index <1000; index++){
+                       this->histogram[index] = 0;
+                       this->criterias[index] = 0.0;
+               }
+               
+               
+               //3. Encontrar el maximo, el promedio y calcular el histograma
+               int i, j, k;
+               for(i=extent[0];i<=extent[1];i++){
+                       for(j=extent[2];j<=extent[3];j++){
+                               for(k=extent[4];k<=extent[5];k++){
+                                       valorEnRegion = this->region->GetScalarComponentAsDouble(i,j,k,0);
+                                       if (valorEnRegion == 0.0){
+                                               valor = this->volume->GetScalarComponentAsDouble(i,j,k,0);
+                                               if (valor > this->max){
+                                                       this->max = valor;
+                                               }
+                                               index  = (int)valor;
+                                               this->histogram[index]++;
+                                               media += valor;
+                                               this->voxelCount++;
+                                       }
+                               }
+                       }
+               }
+               
+               media = (double)media/(double)this->voxelCount;
+
+               //calcula sigma total
+               for(index=0;index<=max;index++){
+                       this->sigmaT += (index - media)*(index - media)* this->histogram[index] / (double)this->voxelCount;
+               }
+
+
+               //calcular criterio para cada posible threshold e ir seleccionando el maximo
+           int optimalThreshold = 0;
+               double optimalCriteria = 0.0;
+
+               for (index=0;index<=max;index++){
+                       criterias[index] = this->getCriteria(index);
+                       if (criterias[index] > optimalCriteria){
+                               optimalCriteria = criterias[index];
+                               optimalThreshold = index;
+                       }
+               }
+               return optimalThreshold;
+
+               
+       }
+
+
+       double vtkOtsu::getCriteria(double threshold){
+               
+               int extent[6];
+               int i,j,k;
+               double valor = 0.0;
+               double valorEnRegion = 0.0;
+
+               this->volume->GetExtent(extent);
+               
+               //1. Encontrar la frecuencia y la media de las clases A y B
+               double mediaA=0.0;
+               double wA = 0.0;
+               int countA = 0;
+               
+               double mediaB=0.0;
+               double wB = 0.0;
+               int countB = 0;
+
+               for(i=extent[0];i<=extent[1];i++){
+                       for(j=extent[2];j<=extent[3];j++){
+                               for(k=extent[4];k<=extent[5];k++){
+                                       valorEnRegion = this->region->GetScalarComponentAsDouble(i,j,k,0);
+                                       if (valorEnRegion == 0.0){
+                                               valor = this->volume->GetScalarComponentAsDouble(i,j,k,0);
+                                               if (valor < threshold){
+                                                       mediaA += valor;
+                                                       countA++;
+
+                                               }
+                                               else{
+                                                       mediaB += valor;
+                                                       countB++;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               mediaA = (double)mediaA / (double)countA;
+               wA = (double)countA / (double)this->voxelCount;
+
+               mediaB = (double)mediaB / (double)countB;
+               wB = (double)countB / (double)this->voxelCount;
+
+
+               //2. Encontrar la varianza de las clases A y B
+
+               double sigmaA=0.0;
+               double sigmaB=0.0;
+
+               int index = 0;
+               
+               for(index=0;index<=threshold;index++){
+                       sigmaA += (index - mediaA)*(index - mediaA)*this->histogram[index]/(double)countA;
+               }
+
+               
+               for(index=threshold;index<=this->max;index++){
+                       sigmaB += (index - mediaB)*(index - mediaB)*this->histogram[index]/(double)countB;
+               }
+
+               //3. Calcular la varianza inter clases
+
+               double sigmaAB = wA*wB*(mediaA-mediaB)*(mediaA-mediaB);
+               double criteria = (double)sigmaAB/(double)sigmaT;
+
+               return criteria;
+
+       }
diff --git a/lib/maracasVisuLib/src/kernel/vtkOtsu.h b/lib/maracasVisuLib/src/kernel/vtkOtsu.h
new file mode 100644 (file)
index 0000000..60f8687
--- /dev/null
@@ -0,0 +1,32 @@
+
+
+#ifndef __VTK__VTK__OTSU__H__
+#define __VTK__VTK__OTSU__H__
+
+
+#include "vtkImageData.h"
+
+class vtkOtsu
+{
+public:
+       vtkOtsu();
+       virtual ~vtkOtsu();
+       double calculateOptimalThreshold(vtkImageData *volume, vtkImageData *region);
+private:
+       double getCriteria(double threshold);
+       
+       int voxelCount;
+       int* histogram;
+       double* criterias;
+       
+       vtkImageData *volume;
+       vtkImageData *region;
+
+       double sigmaT;
+       double max;
+
+};
+
+
+
+#endif // __VTK__VTK__OTSU__H__
\ No newline at end of file
diff --git a/lib/maracasVisuLib/src/kernel/vtkOtsuImageData.cxx b/lib/maracasVisuLib/src/kernel/vtkOtsuImageData.cxx
new file mode 100644 (file)
index 0000000..ad44f89
--- /dev/null
@@ -0,0 +1,152 @@
+#include "vtkOtsuImageData.h"
+
+        vtkOtsuImageData::vtkOtsuImageData(){
+                volume = NULL;
+                P = NULL;
+
+       }
+
+        vtkOtsuImageData::~vtkOtsuImageData(){
+               
+       }
+
+       int vtkOtsuImageData::calculateOptimalThreshold(vtkImageData* voi){
+               
+               int extent[6];
+               int static TAM = 10000;
+               
+               
+               this->volume = voi; //VOI
+               this->volume->GetExtent(extent);
+
+               printf("otsu: extent = x (%d %d) y (%d %d) z(%d %d)\n",extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
+
+                                       
+               double valor = 0.0;
+               int index = 0;
+               int T = 0;
+               int max=0;
+               int voxelCount = 0;
+       
+               //1. Inicializacion
+               this->H = new int[TAM];
+               this->P = new double[TAM];
+               this->SI = new double[TAM];
+               for (index = 0; index <TAM; index++){
+                       this->H[index] = 0;
+                       this->P[index] = 0.0;   //probabilidad acumulada
+                       this->SI[index] = 0.0;
+               }
+               
+               //2. Calcular el Histograma
+               
+               int i, j, k;
+               for(i=extent[0];i<=extent[1];i++){
+                       for(j=extent[2];j<=extent[3];j++){
+                               for(k=extent[4];k<=extent[5];k++){
+                                       
+                                                                               
+                                       valor = this->volume->GetScalarComponentAsDouble(i,j,k,0);
+                                       if (valor > max){
+                                               max = (int)valor;
+                                       }
+                                       
+                                       index  = (int)valor;
+                                       this->H[index]++;
+                                       voxelCount++;
+                                       
+                               }
+                       }
+               }
+
+               printf("otsu: voxelCount = %d\n",voxelCount);
+               
+               //3. Normalizacion de la funcion P
+               for(index=0;index<=max;index++){
+                       this->P[index] = (double)this->H[index] / (double)voxelCount;
+                       //printf("H[%d] = %d\n",index, H[index]);
+               }
+
+
+
+
+               //FILE *logger = NULL;
+       
+               //if ((logger = freopen("c:\\Diego\\Andes\\Tesis\\ITK\\FM_3D\\bin\\Debug\\thotsu.txt","w", stdout)) == NULL)
+                       //exit(-1);
+
+               //printf("THRESHOLD; VARIANZA INTERCLASE\n");
+
+
+               //4. Recorrer los diferentes niveles de intensidad
+
+               for(T=0;T<=max;T++){
+
+                       //printf("T= %d, ",T);
+                       
+                       //4.1 Calcular las probabilidades acumuladas de las clases A y B
+                       double Q1 = 0.0;
+                       double Q2 = 0.0;
+                       for(index=0;index<=max;index++){
+                               if (index < T){
+                                       Q1 = Q1 + this->P[index];
+                               }
+                               else{
+                                       Q2 = Q2 + this->P[index];
+                               }
+                       }
+
+                       //4.2 Calcular las medias de las clases A y B
+                       double U1 = 0.0;
+                       double U2 = 0.0;
+                       for (index=0;index<=max;index++){
+                               if (index < T){
+                                       U1 = U1 + ((double)(index * this->P[index])/(double)Q1);
+                               }
+                               else{
+                                       U2 = U2 + ((double)(index * this->P[index])/(double)Q2);
+                               }
+                       }
+
+                       
+                       //4.3 Calcular las varianzas individuales
+                       double S1 = 0.0;
+                       double S2 = 0.0;
+                       for (index=0;index<=max;index++){
+                               if (index < T){
+                                       S1 = S1 + ((index - U1)*(index - U1)*(this->P[index]/(double)Q1));
+                               }
+                               else{
+                                       S2 = S2 + ((index - U2)*(index - U2)*(this->P[index]/(double)Q2));
+                               }
+                       }
+
+                       //4.4 Calcular SI: La varianza intraclases y seleccionar el valor minimo
+                       this->SI[T] = Q1*S1 + Q2*S2;
+                       //printf("VI = %.2f\n",SI[T]);
+               }
+               
+           int optimalThreshold        = 0;
+               double optimalCriteria  = VTK_LARGE_FLOAT;
+
+       
+
+               for (int index2=0;index2<=max;index2++){
+                       
+                       if (SI[index2] < optimalCriteria){
+                               optimalCriteria = SI[index2];
+                               optimalThreshold = index2;
+                               //printf("ENTRO %d %d\n",index2,optimalThreshold);
+                       }
+                       //printf("SI[%d] = %.2f, optimo = %d\n",index2,SI[index2],optimalThreshold);
+               }
+               //fclose(logger);
+               //logger = NULL;
+
+               printf(">>>%d<<<\n", optimalThreshold);
+       
+               return optimalThreshold;
+       }
+
+
+
diff --git a/lib/maracasVisuLib/src/kernel/vtkOtsuImageData.h b/lib/maracasVisuLib/src/kernel/vtkOtsuImageData.h
new file mode 100644 (file)
index 0000000..978a748
--- /dev/null
@@ -0,0 +1,28 @@
+#include "vtkImageData.h"
+
+
+#ifndef __VTK__VTK__OTSU__IMAGE__DATA__H__
+#define __VTK__VTK__OTSU__IMAGE__DATA__H__
+
+class vtkOtsuImageData
+{
+public:
+       vtkOtsuImageData();
+       virtual ~vtkOtsuImageData();
+       int calculateOptimalThreshold(vtkImageData *volume);
+       
+
+protected:
+
+        FILE *logger;
+private:
+       int* H;
+       double* SI;
+       double* P;
+       
+       vtkImageData *volume;
+       
+
+};
+
+#endif //__VTK__VTK__OTSU__IMAGE__DATA__H__
diff --git a/lib/maracasVisuLib/src/kernel/vtkOtsuSphereSource.cxx b/lib/maracasVisuLib/src/kernel/vtkOtsuSphereSource.cxx
new file mode 100644 (file)
index 0000000..019030a
--- /dev/null
@@ -0,0 +1,154 @@
+#include "vtkOtsuSphereSource.h"
+
+        vtkOtsuSphereSource::vtkOtsuSphereSource(){
+                volume = NULL;
+                region = NULL;
+                result = NULL;
+                P = NULL;
+
+       }
+
+        vtkOtsuSphereSource::~vtkOtsuSphereSource(){
+               
+       }
+
+       double vtkOtsuSphereSource::calculateOptimalThreshold(vtkImageData* voi){
+               
+               int extent[6];
+               double centro[3];
+               int static TAM = 2000;
+
+                       
+               
+               this->volume = voi; //VOI
+               this->region = region; //JF
+               this->volume->GetExtent(extent);
+
+               centro[0] = (extent[0] + extent[1]) / 2;
+               centro[1] = (extent[2] + extent[3]) / 2;
+               centro[2] = (extent[4] + extent[5]) / 2;
+
+               double radio = (extent[1] - extent[0]) /(double)2.0;
+
+               result = vtkImageData::New();
+       result->DeepCopy(volume);
+               
+               double valorEnRegion = 0.0;
+               double valor = 0.0;
+               int index = 0;
+               int T = 0;
+               int max=0;
+               int voxelCount = 0;
+       
+               //1. Inicializacion
+               this->H = new int[TAM];
+               this->P = new double[TAM];
+               this->SI = new double[TAM];
+               for (index = 0; index <TAM; index++){
+                       this->H[index] = 0;
+                       this->P[index] = 0.0;   //probabilidad acumulada
+                       this->SI[index] = 0.0;
+               }
+               
+               //2. Calcular el Histograma
+               double *ptr;
+               int i, j, k;
+               for(i=extent[0];i<=extent[1];i++){
+                       for(j=extent[2];j<=extent[3];j++){
+                               for(k=extent[4];k<=extent[5];k++){
+                                       
+                                       ptr = (double *)this->result->GetScalarPointer(i,j,k);
+
+                                       // verificar si esta dentro de la esfera
+                                       if(  ((i-centro[0])*(i-centro[0]) + 
+                                                (j-centro[1])*(j-centro[1]) +
+                                                (k-centro[2])*(k-centro[2])) <= (radio*radio)){
+
+                                               
+                                                       valor = this->volume->GetScalarComponentAsDouble(i,j,k,0);
+                                                       if (valor > max){
+                                                               max = (int)valor;
+                                                       }
+                                                       index  = (int)valor;
+                                                       this->H[index]++;
+                                                       voxelCount++;
+                                               
+                                               
+                                       }
+                                       else {
+                                               *ptr=0.0;
+                                       }
+                                       
+                               }
+                       }
+               }
+               
+               //3. Normalizacion de la funcion P
+               for(index=0;index<=max;index++){
+                       this->P[index] = (double)this->H[index] / (double)voxelCount;
+               }
+
+
+               //4. Recorrer los diferentes niveles de intensidad
+
+               for(T=0;T<=max;T++){
+                       
+                       //4.1 Calcular las probabilidades acumuladas de las clases A y B
+                       double Q1 = 0.0;
+                       double Q2 = 0.0;
+                       for(index=0;index<=max;index++){
+                               if (index < T){
+                                       Q1 = Q1 + this->P[index];
+                               }
+                               else{
+                                       Q2 = Q2 + this->P[index];
+                               }
+                       }
+
+                       //4.2 Calcular las medias de las clases A y B
+                       double U1 = 0.0;
+                       double U2 = 0.0;
+                       for (index=0;index<=max;index++){
+                               if (index < T){
+                                       U1 = U1 + ((double)(index * this->P[index])/(double)Q1);
+                               }
+                               else{
+                                       U2 = U2 + ((double)(index * this->P[index])/(double)Q2);
+                               }
+                       }
+
+                       
+                       //4.3 Calcular las varianzas individuales
+                       double S1 = 0.0;
+                       double S2 = 0.0;
+                       for (index=0;index<=max;index++){
+                               if (index < T){
+                                       S1 = S1 + ((index - U1)*(index - U1)*(this->P[index]/(double)Q1));
+                               }
+                               else{
+                                       S2 = S2 + ((index - U2)*(index - U2)*(this->P[index]/(double)Q2));
+                               }
+                       }
+
+                       //4.4 Calcular SI: La varianza intraclases y seleccionar el valor minimo
+                       this->SI[T] = Q1*S1 + Q2*S2;
+               }
+               
+           int optimalThreshold        = 0;
+               double optimalCriteria  = VTK_LARGE_FLOAT;
+
+               for (index=0;index<=max;index++){
+                       if (SI[index] < optimalCriteria){
+                               optimalCriteria = SI[index];
+                               optimalThreshold = index;
+                       }
+               }
+               return optimalThreshold;
+       }
+
+
+
+
+       vtkImageData* vtkOtsuSphereSource::getImageForSegmentation(){
+               return this->result;
+       }
diff --git a/lib/maracasVisuLib/src/kernel/vtkOtsuSphereSource.h b/lib/maracasVisuLib/src/kernel/vtkOtsuSphereSource.h
new file mode 100644 (file)
index 0000000..95155c3
--- /dev/null
@@ -0,0 +1,29 @@
+
+
+#ifndef __VTK__VTK__OTSU__SPHERE__SOURCE__H__
+#define __VTK__VTK__OTSU__SPHERE__SOURCE__H__
+
+
+#include "vtkImageData.h"
+
+class vtkOtsuSphereSource
+{
+public:
+       vtkOtsuSphereSource();
+       virtual ~vtkOtsuSphereSource();
+       double calculateOptimalThreshold(vtkImageData *voi);
+       vtkImageData* getImageForSegmentation();
+private:
+       int* H;
+       double* SI;
+       double* P;
+       
+       vtkImageData *volume;
+       vtkImageData *region;
+       vtkImageData *result;
+
+};
+
+
+
+#endif // __VTK__OTSU__SPHERE__SOURCE__H__
diff --git a/lib/maracasVisuLib/src/kernel/vtkSTLExtractor.cpp b/lib/maracasVisuLib/src/kernel/vtkSTLExtractor.cpp
new file mode 100644 (file)
index 0000000..7d8720d
--- /dev/null
@@ -0,0 +1,105 @@
+
+#include "vtkSTLExtractor.h"
+#include <vtkImageGaussianSmooth.h>
+#include <vtkMarchingCubes.h>
+#include <vtkCleanPolyData.h>
+#include <vtkTriangleFilter.h>
+#include <vtkImageContinuousDilate3D.h>
+
+
+vtkSTLExtractor::vtkSTLExtractor(){
+       innerSurface = vtkPolyData::New();
+       outerSurface = vtkPolyData::New();
+       marchingCubesLevel = 128.0;
+       sigmaLevel = 100.0;
+}
+
+vtkSTLExtractor::~vtkSTLExtractor(){
+       innerSurface->Delete();
+       outerSurface->Delete();
+}
+
+void vtkSTLExtractor::setVolume(vtkImageData *volume){
+       this->volume = volume;
+}
+
+
+void vtkSTLExtractor::setMarchingCubesLevel(double level){
+       this->marchingCubesLevel = level;
+}
+
+void vtkSTLExtractor::setSigmaLevel(double level){
+       this->sigmaLevel = level;
+}
+
+
+double vtkSTLExtractor::getMarchingCubesLevel(){
+       return marchingCubesLevel;
+}
+
+double vtkSTLExtractor::getSigmaLevel(){
+       return sigmaLevel;
+}
+
+
+vtkPolyData* vtkSTLExtractor::getInnerSurface(){
+       return innerSurface;
+}
+
+
+vtkPolyData* vtkSTLExtractor::getOuterSurface(){
+       return outerSurface;
+}
+
+
+
+void vtkSTLExtractor::calculate(){
+
+       // ------------------------------------------------------------------------
+               //  1. CALCULATING THE INNER SURFACE
+               // ------------------------------------------------------------------------
+           vtkImageGaussianSmooth *gaussFilter = vtkImageGaussianSmooth::New();
+        gaussFilter->SetInput(volume);
+        gaussFilter->SetDimensionality(3);
+       gaussFilter->SetStandardDeviation(sigmaLevel);
+    
+        vtkMarchingCubes *cubesFilter = vtkMarchingCubes::New();
+        cubesFilter->SetInput(gaussFilter->GetOutput());
+        cubesFilter->SetValue(0,marchingCubesLevel);
+               cubesFilter->ComputeGradientsOn ();
+        cubesFilter->ComputeScalarsOn ();
+               cubesFilter->SetNumberOfContours( 1 );
+           
+               // Unir puntos duplicados y remover primitivas degeneradas
+               vtkCleanPolyData *cleanFilter = vtkCleanPolyData::New();
+        cleanFilter->SetInput ( cubesFilter->GetOutput() );
+               
+               // crea poligonos triangulares
+        vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();
+        triangleFilter->SetInput( cleanFilter->GetOutput() );
+        triangleFilter->Update();
+
+               innerSurface->DeepCopy(triangleFilter->GetOutput());
+
+
+               // ------------------------------------------------------------------------
+               //  2. CALCULATING THE OUTER SURFACE
+               // ------------------------------------------------------------------------
+               vtkImageContinuousDilate3D *dilateFilter = vtkImageContinuousDilate3D ::New();
+        dilateFilter->SetInput (volume);
+               dilateFilter->SetKernelSize (3, 3, 3);
+               gaussFilter->SetInput( dilateFilter->GetOutput());
+        triangleFilter->Update();
+               
+           outerSurface->DeepCopy(triangleFilter->GetOutput());
+
+               // ------------------------------------------------------------------------
+               //  3. CLEANING UP
+               // ------------------------------------------------------------------------
+
+               gaussFilter->Delete();
+               cubesFilter->Delete();
+               cleanFilter->Delete();
+           triangleFilter->Delete();
+        dilateFilter->Delete();
+}
diff --git a/lib/maracasVisuLib/src/kernel/vtkSTLExtractor.h b/lib/maracasVisuLib/src/kernel/vtkSTLExtractor.h
new file mode 100644 (file)
index 0000000..43ba5ad
--- /dev/null
@@ -0,0 +1,48 @@
+
+
+#ifndef __VTK__STL__EXTRACTOR__HXX__
+#define __VTK__STL__EXTRACTOR__HXX__
+
+
+/*
+*  La clase vtkSTLExtractor recibe como parametro un volumen binario y a partir de el
+*  genera las superficies de estereolitografia interna y externa.
+*  
+*      The class vtkSTLExtractor receives a a binary volume and from this volume,
+*      generates the inner and outer stereolitography surfaces.
+*
+*      Author: Diego Cantor.
+*/
+
+
+#include <vtkImageData.h>
+#include <vtkPolyData.h>
+
+
+class vtkSTLExtractor  
+{
+public:
+       vtkSTLExtractor();
+       virtual ~vtkSTLExtractor();
+       void setVolume(vtkImageData *volume);
+       void setMarchingCubesLevel(double level);
+       void setSigmaLevel(double level);
+       double getMarchingCubesLevel();
+       double getSigmaLevel();
+       void calculate();
+       vtkPolyData* getInnerSurface();
+       vtkPolyData* getOuterSurface();
+       void Delete();
+       
+private:
+
+       double sigmaLevel;
+       double marchingCubesLevel;
+       vtkPolyData *innerSurface;
+       vtkPolyData *outerSurface;
+       vtkImageData *volume;
+
+
+};
+
+#endif  //__VTK__STL__EXTRACTOR__HXX__