]> SALOME platform Git repositories - modules/visu.git/commitdiff
Salome HOME
NRI : merge from 1.2c
authornri <nri@opencascade.com>
Thu, 6 Nov 2003 10:18:40 +0000 (10:18 +0000)
committernri <nri@opencascade.com>
Thu, 6 Nov 2003 10:18:40 +0000 (10:18 +0000)
75 files changed:
adm_local/unix/make_commence.in
doc/html/INPUT/HTML/VISU_Gen.html
doc/html/INPUT/doxyfile
doc/html/INPUT/sources/Application-About.png
doc/html/INPUT/sources/Application-About1.jpg
doc/html/INPUT/sources/application.gif
doc/html/INPUT/sources/application.jpg
doc/html/INPUT/sources/bg_salome.gif [new file with mode: 0644]
doc/html/INPUT/sources/bg_salomepro.gif [deleted file]
doc/html/INPUT/sources/doxygen.css [deleted file]
doc/html/INPUT/sources/static/DataStruct.gif [new file with mode: 0755]
doc/html/INPUT/sources/static/PrsObj.gif [new file with mode: 0755]
doc/html/INPUT/sources/static/View.gif [new file with mode: 0755]
doc/html/INPUT/sources/static/doxygen.css [new file with mode: 0755]
doc/html/INPUT/sources/static/examples_VISU.html [new file with mode: 0755]
doc/html/INPUT/sources/static/overview_VISU.html [new file with mode: 0755]
doc/html/INPUT/sources/static/page2.html [new file with mode: 0755]
doc/html/INPUT/sources/static/tree.js [new file with mode: 0755]
doc/html/INPUT/sources/static/treeview.js [new file with mode: 0644]
doc/html/Makefile.in
idl/VISU_Gen.idl
resources/VISU_en.xml
resources/VISU_fr.xml
src/CONVERTOR/Makefile.in
src/Makefile.in
src/OBJECT/Makefile.in
src/OBJECT/VISU_Actor.cxx
src/OBJECT/VISU_Actor.h
src/PIPELINE/Makefile.in
src/VISUGUI/Makefile.in
src/VISUGUI/VISU_msg_en.po
src/VISUGUI/VisuGUI.cxx
src/VISUGUI/VisuGUI.h
src/VISUGUI/VisuGUI_CutPlanesDlg.cxx
src/VISUGUI/VisuGUI_CutPlanesDlg.h
src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx
src/VISUGUI/VisuGUI_IsoSurfacesDlg.h
src/VISUGUI/VisuGUI_MagnitudeDlg.cxx
src/VISUGUI/VisuGUI_MagnitudeDlg.h
src/VISUGUI/VisuGUI_NonIsometricDlg.cxx
src/VISUGUI/VisuGUI_ScalarBarDlg.cxx
src/VISUGUI/VisuGUI_ScalarBarDlg.h
src/VISUGUI/VisuGUI_Selection.cxx
src/VISUGUI/VisuGUI_Selection.h
src/VISUGUI/VisuGUI_StreamLinesDlg.cxx
src/VISUGUI/VisuGUI_StreamLinesDlg.h
src/VISUGUI/VisuGUI_TimeAnimation.cxx
src/VISUGUI/VisuGUI_TimeAnimation.h
src/VISUGUI/VisuGUI_VectorsDlg.cxx
src/VISUGUI/VisuGUI_VectorsDlg.h
src/VISUGUI/VisuGUI_VisuAsDlg.cxx
src/VISUGUI/VisuGUI_VisuAsDlg.h
src/VISU_I/Makefile.in
src/VISU_I/VISUConfig.hh
src/VISU_I/VISU_CorbaMedConvertor.cxx
src/VISU_I/VISU_CorbaMedConvertor.hxx
src/VISU_I/VISU_Gen_i.cc
src/VISU_I/VISU_Gen_i.hh
src/VISU_I/VISU_PrsObject_i.cc
src/VISU_I/VISU_PrsObject_i.hh
src/VISU_I/VISU_Result_i.cc
src/VISU_I/VISU_Result_i.hh
src/VISU_I/VISU_Table_i.cc
src/VISU_I/VISU_Table_i.hh
src/VISU_I/VISU_TimeAnimation.cxx
src/VISU_I/VISU_TimeAnimation.h
src/VISU_I/VISU_ViewManager_i.cc
src/VISU_I/VISU_ViewManager_i.hh
src/VISU_SWIG/Makefile.in
src/VISU_SWIG/batchmode_visu.py
src/VISU_SWIG/batchmode_visu_view3d.py
src/VISU_SWIG/libVISU_Swig.i
src/VISU_SWIG/visu.py
src/VISU_SWIG/visu_med.py
src/VISU_SWIG/visu_view3d.py

index 2850be76d9e830376e798665aafeabfca731d8c5..e106eb052d5dac81a5fc060fa2b95544180ce2ef 100644 (file)
@@ -47,9 +47,8 @@ PYTHONHOME = @PYTHONHOME@
 PYTHON_INCLUDES = @PYTHON_INCLUDES@
 PYTHON_LIBS = @PYTHON_LIBS@
 PYTHON_VERSION = @PYTHON_VERSION@
-PYTHON_SITE = @PYTHON_SITE@
-PYTHON_SITE_INSTALL = @PYTHON_SITE_INSTALL@
-
+PYTHON_SITE = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages
+PYTHON_SITE_INSTALL = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome
 # QT
 
 QT_ROOT = @QT_ROOT@
@@ -101,13 +100,18 @@ MED2_MT_LIBS=@MED2_MT_LIBS@
 OCC_INCLUDES=@CAS_CPPFLAGS@
 OCC_CXXFLAGS=@CAS_CXXFLAGS@
 
-OCC_KERNEL_LIBS=@CAS_KERNEL@
-OCC_OCAF_LIBS=@CAS_OCAF@
-OCC_VIEWER_LIBS=@CAS_VIEWER@
-OCC_MODELER_LIBS=@CAS_MODELER@
-OCC_DATAEXCHANGE_LIBS=@CAS_DATAEXCHANGE@
-OCC_LIBS=@CAS_LDFLAGS@
-
+#OCC_KERNEL_LIBS=@CAS_KERNEL@
+#OCC_OCAF_LIBS=@CAS_OCAF@
+#OCC_VIEWER_LIBS=@CAS_VIEWER@
+#OCC_MODELER_LIBS=@CAS_MODELER@
+#OCC_DATAEXCHANGE_LIBS=@CAS_DATAEXCHANGE@
+#OCC_LIBS=@CAS_LDFLAGS@
+CAS_KERNEL=@CAS_KERNEL@
+CAS_OCAF=@CAS_OCAF@
+CAS_VIEWER=@CAS_VIEWER@
+CAS_MODELER=@CAS_MODELER@
+CAS_DATAEXCHANGE=@CAS_DATAEXCHANGE@
+CAS_LDPATH=@CAS_LDPATH@
 # MPICH
 
 MPICH_INCLUDES=@MPICH_INCLUDES@
@@ -164,6 +168,8 @@ CXXFLAGS+= $(CORBA_CXXFLAGS)
 #LDFLAGS+= $(CORBA_LIBS)
 LIBS+=$(CORBA_LIBS)
 
+DOXYGEN = @DOXYGEN@
+
 ## Shared libraries
 LT_STATIC_EXEC=@LT_STATIC_EXEC@
 DYNAMIC_DIRS=@DYNAMIC_DIRS@
@@ -192,8 +198,9 @@ libdir=@libdir@/salome
 # warning : if user give this path in configure we could have salome/salome :-(
 includedir=@includedir@/salome
 datadir=@datadir@/salome
-idldir=$(prefix)/idl/salome
+idldir=${prefix}/idl/salome
 sharedpydir=@libdir@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules
+incmakedir=${prefix}/salome_adm/unix
 
 docdir=$(datadir)/doc
 
@@ -201,7 +208,7 @@ docdir=$(datadir)/doc
 # begin of package rules
 #
 
-.PHONY: all lib bin inc resources tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean
+.PHONY: all lib bin inc resources data doc tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean
 
 .SUFFIXES: .cxx .cc .c .f .o .lo .idl .py .i .ui .po .qm
 
@@ -212,6 +219,7 @@ all:
        $(MAKE) lib
        $(MAKE) bin
        $(MAKE) resources
+       $(MAKE) data
 
 #
 # add target to build administrative files
index 4ceccd784b8e7630448e3bb389665f0752c07f0c..13cb79cea6336b7a258fc99e94c9612e04cd0833 100644 (file)
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Prs3d</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Destroy (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Destroy (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
 <td colspan="11"><font size="+3"><b><div align="center"><i>interface Mesh</i></div></b></font></td>
 </tr>
 <td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
 <td bgcolor= "lightgreen"><div align="center"><b>double  GetScale (  )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = GetScale (  )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsColored (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsColored (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ShowColored ( in boolean theColored )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ShowColored ( theColored )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Color  GetColor (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColor (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColor ( in Color theColor )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColor ( theColor )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = GetOrientationType (  )</b></div></td>
 </tr>
 <tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDisplacement ( in double theDisp )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDisplacement ( theDisp )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetDisplacement (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDisplacement (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetPlanePosition ( in long thePlaneNumber, in double thePlanePosition )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetPlanePosition ( thePlaneNumber, thePlanePosition )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDefault ( in long thePlaneNumber )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDefault ( thePlaneNumber )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetPlanePosition ( in long thePlaneNumber )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPlanePosition ( thePlaneNumber )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsDefault ( in long thePlaneNumber )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsDefault ( thePlaneNumber )</b></div></td>
+</tr>
+<tr>
 <td bgcolor= "lightgreen"><div align="center"><b>void SetNbPlanes ( in long theNb )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>SetNbPlanes ( theNb )</b></div></td>
 </tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface CutLines</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetOrientationType ( in Orientation theNb )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetOrientationType ( theNb )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetOrientationType2 ( in Orientation theNb )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetOrientationType2 ( theNb )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Orientation  GetOrientationType (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetOrientationType (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Orientation  GetOrientationType2 (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetOrientationType2 (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDisplacement ( in double theDisp )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDisplacement ( theDisp )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDisplacement2 ( in double theDisp )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDisplacement2 ( theDisp )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetDisplacement (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDisplacement (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetDisplacement2 (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDisplacement2 (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetBasePlanePosition ( in double thePlanePosition )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetBasePlanePosition ( thePlanePosition )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetBasePlanePosition (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetBasePlanePosition (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetLinePosition ( in long thePlaneNumber, in double thePlanePosition )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetLinePosition ( thePlaneNumber, thePlanePosition )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetLinePosition ( in long thePlaneNumber )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLinePosition ( thePlaneNumber )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDefault (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDefault (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsDefault (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsDefault (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDefaultPosition ( in long thePlaneNumber )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDefaultPosition ( thePlaneNumber )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsDefaultPosition ( in long thePlaneNumber )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsDefaultPosition ( thePlaneNumber )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetNbLines ( in long theNb )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetNbLines ( theNb )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbLines (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbLines (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRotateX ( in double theAngle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRotateX ( theAngle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRotateX2 ( in double theAngle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRotateX2 ( theAngle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetRotateX (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRotateX (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetRotateX2 (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRotateX2 (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRotateY ( in double theAngle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRotateY ( theAngle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRotateY2 ( in double theAngle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRotateY2 ( theAngle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetRotateY (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRotateY (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetRotateY2 (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRotateY2 (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
 <td colspan="11"><font size="+3"><b><div align="center"><i>interface StreamLines</i></div></b></font></td>
 </tr>
 <td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
 <td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDirection ( in Direction theDirection )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDirection ( theDirection )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Direction  GetDirection (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDirection (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetStepLength ( in double theStep )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetStepLength ( theStep )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetStepLength (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStepLength (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetPropagationTime ( in double theTime )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetPropagationTime ( theTime )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetPropagationTime (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPropagationTime (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetIntegrationStep ( in double theStep )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetIntegrationStep ( theStep )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetIntegrationStep (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetIntegrationStep (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetSource ( in Prs3d thePrs3d )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetSource ( thePrs3d )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Prs3d  GetSource (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetSource (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetUsedPoints ( in double thePercents )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetUsedPoints ( thePercents )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetUsedPoints (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetUsedPoints (  )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Animation</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void addField ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>addField ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void generatePresentations ( in long theFieldNum )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>generatePresentations ( theFieldNum )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  generateFrames (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = generateFrames (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void clearView (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>clearView (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void startAnimation (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>startAnimation (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void stopAnimation (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>stopAnimation (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void nextFrame (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>nextFrame (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void prevFrame (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>prevFrame (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void firstFrame (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>firstFrame (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void lastFrame (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>lastFrame (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void gotoFrame ( in long theFrame )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>gotoFrame ( theFrame )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  getNbFields (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getNbFields (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  getNbFrames (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getNbFrames (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  isRunning (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = isRunning (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  getCurrentFrame (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getCurrentFrame (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ScalarMap  getPresentation ( in long theField, in long theFrame )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getPresentation ( theField, theFrame )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setPresentationType ( in long theFieldNum, in VISUType theType )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setPresentationType ( theFieldNum, theType )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>VISUType  getPresentationType ( in long theFieldNum )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getPresentationType ( theFieldNum )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setSpeed ( in long theSpeed )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setSpeed ( theSpeed )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  getSpeed (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getSpeed (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  isProportional (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = isProportional (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setAnimationRange ( in double theMin, in double theMax )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setAnimationRange ( theMin, theMax )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  getMinRange (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getMinRange (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  getMaxRange (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getMaxRange (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  isRangeDefined (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = isRangeDefined (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void dumpTo ( in string thePath )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>dumpTo ( thePath )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  isCycling (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = isCycling (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  getMinTime (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getMinTime (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  getMaxTime (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getMaxTime (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setProportional ( in boolean theProp )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setProportional ( theProp )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setCycling ( in boolean theCycle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setCycling ( theCycle )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
 <td colspan="11"><font size="+3"><b><div align="center"><i>interface Result</i></div></b></font></td>
 </tr>
 <td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
 <td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  BuildAll (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = BuildAll (  )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = ImportFile ( theFileName )</b></div></td>
 </tr>
 <tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Result  ImportMed ( in FIELD theField )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = ImportMed ( theField )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Result  ImportMedMesh ( in MESH theMesh )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = ImportMedMesh ( theMesh )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Result  ImportMed ( in SObject theMedSObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ImportMed ( theMedSObject )</b></div></td>
 </tr>
 <tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Result  ImportMedSupport ( in SUPPORT theSupport )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = ImportMedSupport ( theSupport )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Result  ImportMedField ( in FIELD theField )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ImportMedField ( theField )</b></div></td>
 </tr>
 <tr>
 <td bgcolor= "lightgreen"><div align="center"><b>Mesh  MeshOnEntity ( in Result theResult, in string theMeshName, in Entity theEntity )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = CutPlanesOnField ( theResult, theMeshName, theEntity, theFieldName, theIteration )</b></div></td>
 </tr>
 <tr>
+<td bgcolor= "lightgreen"><div align="center"><b>CutLines  CutLinesOnField ( in Result theResult, in string theMeshName, in Entity theEntity, in string theFieldName, in double theIteration )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CutLinesOnField ( theResult, theMeshName, theEntity, theFieldName, theIteration )</b></div></td>
+</tr>
+<tr>
 <td bgcolor= "lightgreen"><div align="center"><b>Table  CreateTable ( in string theTableEntry )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateTable ( theTableEntry )</b></div></td>
 </tr>
 <td bgcolor= "lightgreen"><div align="center"><b>Container  CreateContainer (  )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateContainer (  )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Animation  CreateAnimation ( in View3D theView3d )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateAnimation ( theView3d )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>void Destroy ( in View theView )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>Destroy ( theView )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ProcessEvents (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ProcessEvents (  )</b></div></td>
+</tr>
 </table><br>
 </b></HTML>
index d31c61fe815df69e2f869eb78d1cdae76b02f842..78c2c468baabe83af0f0e85b266831fb7fc8fc85 100755 (executable)
@@ -3,7 +3,7 @@
 #---------------------------------------------------------------------------
 # General configuration options
 #---------------------------------------------------------------------------
-PROJECT_NAME           = "SALOME PRO - VISU - v.1.2"
+PROJECT_NAME           = "SALOME - VISU - v.1.2"
 PROJECT_NUMBER         = id#1.1
 OUTPUT_DIRECTORY       = ../
 OUTPUT_LANGUAGE        = English
@@ -96,11 +96,11 @@ GENERATE_HTMLHELP      = NO
 CHM_FILE               = 
 HHC_LOCATION           = 
 GENERATE_CHI           = NO
-BINARY_TOC             = NO
-TOC_EXPAND             = NO
-DISABLE_INDEX          = NO
+BINARY_TOC             = YES
+TOC_EXPAND             = YES
+DISABLE_INDEX          = YES
 ENUM_VALUES_PER_LINE   = 4
-GENERATE_TREEVIEW      = NO
+GENERATE_TREEVIEW      = YES
 TREEVIEW_WIDTH         = 250
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
index 80e0bcb063acf425fa1001d39beea368bb4497a3..7b58330d50856e28562e8f9ed80dae72d6e6dda3 100755 (executable)
Binary files a/doc/html/INPUT/sources/Application-About.png and b/doc/html/INPUT/sources/Application-About.png differ
index b8f2cfb6da8aa2f60922b1c60f642ce9e1eebab5..cf7ab8ba025d6bd9212f8bd5681e77d1aaef8e4f 100755 (executable)
Binary files a/doc/html/INPUT/sources/Application-About1.jpg and b/doc/html/INPUT/sources/Application-About1.jpg differ
index 10da488d2dcf2a063029d868686e1882e45487ab..0b05d5c18ee88779d283508781836e2b151f606f 100644 (file)
Binary files a/doc/html/INPUT/sources/application.gif and b/doc/html/INPUT/sources/application.gif differ
index 6d3b6a0a8c281dca8747fdd34b4d4de0f737c4a3..a6979ab9999552ccb91a0358f75103b09db5246c 100755 (executable)
Binary files a/doc/html/INPUT/sources/application.jpg and b/doc/html/INPUT/sources/application.jpg differ
diff --git a/doc/html/INPUT/sources/bg_salome.gif b/doc/html/INPUT/sources/bg_salome.gif
new file mode 100644 (file)
index 0000000..c7e0306
Binary files /dev/null and b/doc/html/INPUT/sources/bg_salome.gif differ
diff --git a/doc/html/INPUT/sources/bg_salomepro.gif b/doc/html/INPUT/sources/bg_salomepro.gif
deleted file mode 100755 (executable)
index 677b704..0000000
Binary files a/doc/html/INPUT/sources/bg_salomepro.gif and /dev/null differ
diff --git a/doc/html/INPUT/sources/doxygen.css b/doc/html/INPUT/sources/doxygen.css
deleted file mode 100755 (executable)
index 6e2c772..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-H1 { text-align: center; }
-CAPTION { font-weight: bold }
-A.qindex {}
-A.qindexRef {}
-A.el { text-decoration: none; font-weight: bold }
-A.elRef { font-weight: bold }
-A.code { text-decoration: none; font-weight: normal; color: #4444ee }
-A.codeRef { font-weight: normal; color: #4444ee }
-A:hover { text-decoration: none; background-color: lightblue }
-DL.el { margin-left: -1cm }
-DIV.fragment { width: 100%; border: none; background-color: #CCCCCC }
-DIV.ah { background-color: #CCCCCC; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
-TD.md { background-color: lightblue; font-weight: bold; }
-TD.mdname1 { background-color: lightblue; font-weight: bold; color: #602020; }
-TD.mdname { background-color: lightblue; font-weight: bold; color: #602020; width: 600px; }
-DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold }
-DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller }
-BODY { background: url(sources/bg_salomepro.gif) }
-TD.indexkey { 
-   background-color: #CCCCCC; 
-   font-weight: bold; 
-   padding-right  : 10px; 
-   padding-top    : 2px; 
-   padding-left   : 10px; 
-   padding-bottom : 2px; 
-   margin-left    : 0px; 
-   margin-right   : 0px; 
-   margin-top     : 2px; 
-   margin-bottom  : 2px  
-}
-TD.indexvalue { 
-   background-color: #CCCCCC; 
-   font-style: italic; 
-   padding-right  : 10px; 
-   padding-top    : 2px; 
-   padding-left   : 10px; 
-   padding-bottom : 2px; 
-   margin-left    : 0px; 
-   margin-right   : 0px; 
-   margin-top     : 2px; 
-   margin-bottom  : 2px  
-}
-span.keyword       { color: #008000 }
-span.keywordtype   { color: #604020 }
-span.keywordflow   { color: #e08000 }
-span.comment       { color: #800000 }
-span.preprocessor  { color: #806020 }
-span.stringliteral { color: #002080 }
-span.charliteral   { color: #008080 }
diff --git a/doc/html/INPUT/sources/static/DataStruct.gif b/doc/html/INPUT/sources/static/DataStruct.gif
new file mode 100755 (executable)
index 0000000..bec28ad
Binary files /dev/null and b/doc/html/INPUT/sources/static/DataStruct.gif differ
diff --git a/doc/html/INPUT/sources/static/PrsObj.gif b/doc/html/INPUT/sources/static/PrsObj.gif
new file mode 100755 (executable)
index 0000000..a8aa81f
Binary files /dev/null and b/doc/html/INPUT/sources/static/PrsObj.gif differ
diff --git a/doc/html/INPUT/sources/static/View.gif b/doc/html/INPUT/sources/static/View.gif
new file mode 100755 (executable)
index 0000000..b6aa909
Binary files /dev/null and b/doc/html/INPUT/sources/static/View.gif differ
diff --git a/doc/html/INPUT/sources/static/doxygen.css b/doc/html/INPUT/sources/static/doxygen.css
new file mode 100755 (executable)
index 0000000..0a8e93d
--- /dev/null
@@ -0,0 +1,49 @@
+H1 { text-align: center; }
+CAPTION { font-weight: bold }
+A.qindex {}
+A.qindexRef {}
+A.el { text-decoration: none; font-weight: bold }
+A.elRef { font-weight: bold }
+A.code { text-decoration: none; font-weight: normal; color: #4444ee }
+A.codeRef { font-weight: normal; color: #4444ee }
+A:hover { text-decoration: none; background-color: lightblue }
+DL.el { margin-left: -1cm }
+DIV.fragment { width: 100%; border: none; background-color: #CCCCCC }
+DIV.ah { background-color: #CCCCCC; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
+TD.md { background-color: lightblue; font-weight: bold; }
+TD.mdname1 { background-color: lightblue; font-weight: bold; color: #602020; }
+TD.mdname { background-color: lightblue; font-weight: bold; color: #602020; width: 600px; }
+DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold }
+DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller }
+BODY { background: url(sources/bg_salome.gif) }
+TD.indexkey { 
+   background-color: #CCCCCC; 
+   font-weight: bold; 
+   padding-right  : 10px; 
+   padding-top    : 2px; 
+   padding-left   : 10px; 
+   padding-bottom : 2px; 
+   margin-left    : 0px; 
+   margin-right   : 0px; 
+   margin-top     : 2px; 
+   margin-bottom  : 2px  
+}
+TD.indexvalue { 
+   background-color: #CCCCCC; 
+   font-style: italic; 
+   padding-right  : 10px; 
+   padding-top    : 2px; 
+   padding-left   : 10px; 
+   padding-bottom : 2px; 
+   margin-left    : 0px; 
+   margin-right   : 0px; 
+   margin-top     : 2px; 
+   margin-bottom  : 2px  
+}
+span.keyword       { color: #008000 }
+span.keywordtype   { color: #604020 }
+span.keywordflow   { color: #e08000 }
+span.comment       { color: #800000 }
+span.preprocessor  { color: #806020 }
+span.stringliteral { color: #002080 }
+span.charliteral   { color: #008080 }
diff --git a/doc/html/INPUT/sources/static/examples_VISU.html b/doc/html/INPUT/sources/static/examples_VISU.html
new file mode 100755 (executable)
index 0000000..40e26ee
--- /dev/null
@@ -0,0 +1,1270 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">\r
+<html>\r
+<head>\r
+                    \r
+  <meta http-equiv="Content-Type"\r
+ content="text/html; charset=iso-8859-1">\r
+                    \r
+  <meta name="GENERATOR"\r
+ content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">\r
+  <title>Main Page</title>\r
+                                 \r
+  <link href="doxygen.css" rel="stylesheet" type="text/css">\r
+</head>\r
+  <body>\r
+     &nbsp;     \r
+<center>    \r
+<table width="96%">\r
+     <tbody>\r
+        <tr>\r
+     <td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif"\r
+ border="0" height="46" width="122">\r
+          </a></td>\r
+       <td>                             \r
+      <div align="right"><a href="http://www.opencascade.org/SALOME/"><img\r
+ src="sources/application.gif" border="0" height="46" width="108">\r
+          </a></div>\r
+     </td>\r
+     </tr>\r
+                 \r
+  </tbody>    \r
+</table>\r
+    </center>\r
+           \r
+<h1><a name="page2">Examples</a> </h1>\r
+       &nbsp;&nbsp; &nbsp;<big><b><i> Interfaces:</i></b></big><br>\r
+          <a class="el"\r
+ href="examples_VISU.html#Base"><br>\r
+  VISU::Base</a><br>\r
+  <a class="el" href="#VISU_Gen">VISU::VISU_Gen</a><br>\r
+  <a class="el"\r
+ href="examples_VISU.html#PrsObject">VISU::PrsObject<br>\r
+  </a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1Result.html">VISU::Result</a><a\r
+ class="el"\r
+ href="examples_VISU.html#Prs3d"><br>\r
+  <br>\r
+  VISU::Prs3d</a><br>\r
+  <a class="el"\r
+ href="examples_VISU.html#Mesh">VISU::Mesh</a><br>\r
+  <a class="el"\r
+ href="examples_VISU.html#ScalarMap">VISU::ScalarMap</a><br>\r
+  <a class="el" href="#CutPlanes">VISU::CutPlanes</a><br>\r
+  <a class="el" href="#CutLines">VISU::CutLines</a><br>\r
+  <a class="el" href="#IsoSurfaces">VISU::IsoSurfaces</a><br>\r
+  <a class="el"\r
+ href="examples_VISU.html#DeformedShape">VISU::DeformedShape</a><br>\r
+   <a class="el" href="#Vectors">VISU::Vectors</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1StreamLines.html">VISU::StreamLines</a><br>\r
+  <br>\r
+  <a class="el" href="#Table">VISU::Table</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1Curve.html">VISU::Curve</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1Container.html">VISU::Container</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1ViewManager.html"><br>\r
+  VISU::ViewManager</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1View.html">VISU::View</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1View3D.html">VISU::View3D</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1TableView.html">VISU::TableView</a><br>\r
+  <a class="el"\r
+ href="interfaceVISU_1_1XYPlot.html">VISU::XYPlot</a><br>\r
+       \r
+<h3><a name="Base"></a>Base</h3>\r
+       \r
+<table cellpadding="0" cellspacing="0" border="0">\r
+      <tbody>\r
+        <tr>\r
+          <td class="md" nowrap valign="top"><a class="el"\r
+ href="namespaceVISU.html#a0">IdType</a>\r
+  VISU::Base::GetID </td>\r
+               <td class="md" valign="top">(&nbsp;</td>\r
+               <td class="mdname1" valign="top" nowrap>&nbsp;  \r
+       </td>\r
+               <td class="md" valign="top">)&nbsp;</td>\r
+               <td class="md" nowrap><br>\r
+          </td>\r
+             </tr>\r
+                        \r
+  </tbody>    \r
+</table>\r
+                   \r
+<p>#Returns ID of the object. That is IOR of CORBA representation a VISU\r
+object.<br>\r
+    </p>\r
+       \r
+<p>aSObject = myLocalStudy.FindObjectIOR(theResult.GetID()) <br>\r
+    </p>\r
+       \r
+<table cellpadding="0" cellspacing="0" border="0">\r
+      <tbody>\r
+        <tr>\r
+          <td class="md" nowrap valign="top"><a class="el"\r
+ href="namespaceVISU.html#a39">VISUType</a>\r
+  VISU::Base::GetType </td>\r
+               <td class="md" valign="top">(&nbsp;</td>\r
+               <td class="mdname1" valign="top" nowrap>&nbsp;  \r
+       </td>\r
+               <td class="md" valign="top">)&nbsp;</td>\r
+        </tr>\r
+               \r
+  </tbody>    \r
+</table>\r
+       \r
+<p>#Returns the type of the presentable object. It can be used for quick\r
+class definition of an VISU object<br>\r
+    <br>\r
+    if aVISUObject.GetType() == VISU.TSCALARMAP :<br>\r
+    &nbsp;&nbsp;&nbsp; #do something ...<br>\r
+ </p>\r
\r
+<p><br>\r
+</p>\r
+<h3><a name="VISU_Gen"></a><big>VISU_Gen</big><br>\r
+ </h3>\r
\r
+<table cellpadding="0" cellspacing="0" border="0">\r
+   <tbody>\r
+     <tr>\r
+       <td class="md" nowrap valign="top"> void VISU::VISU_Gen::SetCurrentStudy \r
+      </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceSALOMEDS_1_1Study.html">SALOMEDS::Study</a>&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp; <em>theStudy</em> \r
+         </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+       </td>\r
+          </tr>\r
+            \r
+  </tbody> \r
+</table>\r
+            <br>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceSALOMEDS_1_1Study.html">SALOMEDS::Study</a> \r
+VISU::VISU_Gen::GetCurrentStudy </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp;     \r
+    </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   <br>\r
+ #It is very important to set SALOMEDS::Study for VISU Engine before you\r
+start any work with them.<br>\r
+ #Every object that you will create will be assigned to the study you set \r
+before.<br>\r
+ #It can be done like this:<br>\r
+ <p></p>\r
\r
+<p>aStudy = myStudyManager.NewStudy("A foo Study")<br>\r
+ if aStudy is None : raise RuntimeError, "Error"<br>\r
+ else : print "OK"<br>\r
+ &nbsp;&nbsp;&nbsp; theVisuGen.SetCurrentStudy(aStudy)<br>\r
+ &nbsp;&nbsp;&nbsp; #to do every things you like<br>\r
+ &nbsp;&nbsp;&nbsp; ...<br>\r
+ </p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1ViewManager.html">ViewManager</a> \r
+VISU::VISU_Gen::GetViewManager </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp;     \r
+    </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Gets the ViewManager which is used for creation of post-processing \r
+presentations.     </p>\r
+       </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <br>\r
+ #In order to display any VISU::PrsObject in propriate viewer you must take \r
+VISU::ViewManager interface<br>\r
+ <p></p>\r
\r
+<p>aViewManager = myVisuGen.GetViewManager()<br>\r
+ #to do something for displaing some presentation<br>\r
+ ...<br>\r
+ </p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceSALOMEDS_1_1SObject.html">SALOMEDS::SObject</a> \r
+VISU::VISU_Gen::ImportTables </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in string&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp; <em>theFileName</em> \r
+         </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Imports tables from a file and create TableAttribute in Sudy   \r
+ </p>\r
+       </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <br>\r
+ #It is possible to import some ASCII files that include text table representation. \r
+One file can consist from more than one table.<br>\r
+ <p></p>\r
\r
+<p>aSObject = myVisuGen.ImportTables("/MyPresicousFileOfTables.txt")<br>\r
+ </p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a> \r
+VISU::VISU_Gen::ImportFile </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in string&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp; <em>theFileName</em> \r
+         </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Imports data from a file.     </p>\r
+       </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <br>\r
+ #It is possible import a med files to VISU<br>\r
+ <p></p>\r
\r
+<p>aResult = myVisuGen.ImportFile("/ItIsDreamOfMyLife.med")<br>\r
+ </p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a> \r
+VISU::VISU_Gen::ImportMed </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceSALOMEDS_1_1SObject.html">SALOMEDS::SObject</a>&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp; <em>theMedSObject</em> \r
+         </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Imports data from a MED object.     </p>\r
+       </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <br>\r
+ #<br>\r
+ <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a> \r
+VISU::VISU_Gen::ImportMedField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceSALOME__MED_1_1FIELD.html">SALOME_MED::FIELD</a>&nbsp;</td>\r
+            <td class="mdname1" valign="top" nowrap>&nbsp; <em>theField</em> \r
+         </td>\r
+            <td class="md" valign="top">)&nbsp;</td>\r
+            <td class="md" nowrap><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Imports data from a MED field.     </p>\r
+       </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Mesh.html">Mesh</a> \r
+VISU::VISU_Gen::MeshOnEntity </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates a Mesh on the basis of the data generated in other sources \r
+(MED object or file).     </p>\r
+       </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Mesh.html">Mesh</a> \r
+VISU::VISU_Gen::FamilyMeshOnEntity </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFamilyName</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Mesh.html">Mesh</a> \r
+VISU::VISU_Gen::GroupMesh </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theGroupName</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1ScalarMap.html">ScalarMap</a> \r
+VISU::VISU_Gen::ScalarMapOnField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFieldName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in double&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theIteration</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates a scalar bar presentation. </p>\r
+       \r
+      <dl compact>\r
+        <dt><b> Parameters: </b></dt>\r
+        <dd>            \r
+          <table border="0" cellspacing="2" cellpadding="0">\r
+  <tbody>\r
+               <tr>\r
+                 <td valign="top"><em>theResult</em>&nbsp;</td>\r
+                 <td> Data generated in other sources. (MED object or file) \r
+                </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theMeshName</em>&nbsp;</td>\r
+                 <td> One of the meshes presented in MED file </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theEntity</em>&nbsp;</td>\r
+                 <td> Type of entity where the field is defined </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theFieldName</em>&nbsp;</td>\r
+                 <td> Group of data attributed to the MESH. The data can\r
+be scalar or vector. </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theIteration</em>&nbsp;</td>\r
+                 <td> Number of iteration on the field </td>\r
+               </tr>\r
+               \r
+            </tbody>           \r
+          </table>\r
+  </dd>\r
+      </dl>\r
+     </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1DeformedShape.html">DeformedShape</a> \r
+VISU::VISU_Gen::DeformedShapeOnField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFieldName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in double&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theIteration</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates a deformed shape presentation. </p>\r
+       \r
+      <dl compact>\r
+        <dt><b> Parameters: </b></dt>\r
+        <dd>            \r
+          <table border="0" cellspacing="2" cellpadding="0">\r
+  <tbody>\r
+               <tr>\r
+                 <td valign="top"><em>theResult</em>&nbsp;</td>\r
+                 <td> Data generated in other sources. (MED object or file) \r
+                </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theMeshName</em>&nbsp;</td>\r
+                 <td> One of the meshes presented in MED file </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theEntity</em>&nbsp;</td>\r
+                 <td> Type of entity where the field is defined </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theFieldName</em>&nbsp;</td>\r
+                 <td> Group of data attributed to the MESH. The data can\r
+be scalar or vector. </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theIteration</em>&nbsp;</td>\r
+                 <td> Number of iteration on the field </td>\r
+               </tr>\r
+               \r
+            </tbody>           \r
+          </table>\r
+  </dd>\r
+      </dl>\r
+     </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1Vectors.html">Vectors</a> \r
+VISU::VISU_Gen::VectorsOnField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFieldName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in double&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theIteration</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates a vector presentation. </p>\r
+       \r
+      <dl compact>\r
+        <dt><b> Parameters: </b></dt>\r
+        <dd>            \r
+          <table border="0" cellspacing="2" cellpadding="0">\r
+  <tbody>\r
+               <tr>\r
+                 <td valign="top"><em>theResult</em>&nbsp;</td>\r
+                 <td> Data generated in other sources. (MED object or file) \r
+                </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theMeshName</em>&nbsp;</td>\r
+                 <td> One of the meshes presented in MED file </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theEntity</em>&nbsp;</td>\r
+                 <td> Type of entity where the field is defined </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theFieldName</em>&nbsp;</td>\r
+                 <td> Group of data attributed to the MESH. The data can\r
+be scalar or vector. </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theIteration</em>&nbsp;</td>\r
+                 <td> Number of iteration on the field </td>\r
+               </tr>\r
+               \r
+            </tbody>           \r
+          </table>\r
+  </dd>\r
+      </dl>\r
+     </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1IsoSurfaces.html">IsoSurfaces</a> \r
+VISU::VISU_Gen::IsoSurfacesOnField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFieldName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in double&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theIteration</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates an iso surface presentation. </p>\r
+       \r
+      <dl compact>\r
+        <dt><b> Parameters: </b></dt>\r
+        <dd>            \r
+          <table border="0" cellspacing="2" cellpadding="0">\r
+  <tbody>\r
+               <tr>\r
+                 <td valign="top"><em>theResult</em>&nbsp;</td>\r
+                 <td> Data generated in other sources. (MED object or file) \r
+                </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theMeshName</em>&nbsp;</td>\r
+                 <td> One of the meshes presented in MED file </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theEntity</em>&nbsp;</td>\r
+                 <td> Type of entity where the field is defined </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theFieldName</em>&nbsp;</td>\r
+                 <td> Group of data attributed to the MESH. The data can\r
+be scalar or vector. </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theIteration</em>&nbsp;</td>\r
+                 <td> Number of iteration on the field </td>\r
+               </tr>\r
+               \r
+            </tbody>           \r
+          </table>\r
+  </dd>\r
+      </dl>\r
+     </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1StreamLines.html">StreamLines</a> \r
+VISU::VISU_Gen::StreamLinesOnField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFieldName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in double&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theIteration</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates an stream lines presentation. </p>\r
+       \r
+      <dl compact>\r
+        <dt><b> Parameters: </b></dt>\r
+        <dd>            \r
+          <table border="0" cellspacing="2" cellpadding="0">\r
+  <tbody>\r
+               <tr>\r
+                 <td valign="top"><em>theResult</em>&nbsp;</td>\r
+                 <td> Data generated in other sources. (MED object or file) \r
+                </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theMeshName</em>&nbsp;</td>\r
+                 <td> One of the meshes presented in MED file </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theEntity</em>&nbsp;</td>\r
+                 <td> Type of entity where the field is defined </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theFieldName</em>&nbsp;</td>\r
+                 <td> Group of data attributed to the MESH. The data can\r
+be scalar or vector. </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theIteration</em>&nbsp;</td>\r
+                 <td> Number of iteration on the field </td>\r
+               </tr>\r
+               \r
+            </tbody>           \r
+          </table>\r
+  </dd>\r
+      </dl>\r
+     </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+  <p></p>\r
\r
+<p>  \r
+<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td class="md">              \r
+      <table cellpadding="0" cellspacing="0" border="0">\r
+          <tbody>\r
+           <tr>\r
+            <td class="md" nowrap valign="top"> <a class="el"\r
+ href="interfaceVISU_1_1CutPlanes.html">CutPlanes</a> \r
+VISU::VISU_Gen::CutPlanesOnField </td>\r
+            <td class="md" valign="top">(&nbsp;</td>\r
+            <td class="md" nowrap valign="top">in <a class="el"\r
+ href="interfaceVISU_1_1Result.html">Result</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theResult</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theMeshName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in <a class="el"\r
+ href="namespaceVISU.html#a38">Entity</a>&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theEntity</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in string&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theFieldName</em>, \r
+            </td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td><br>\r
+             </td>\r
+            <td class="md" nowrap>in double&nbsp;</td>\r
+            <td class="mdname" nowrap>&nbsp; <em>theIteration</em></td>\r
+          </tr>\r
+          <tr>\r
+            <td><br>\r
+             </td>\r
+            <td class="md">)&nbsp;</td>\r
+            <td class="md" colspan="2"><br>\r
+             </td>\r
+          </tr>\r
+                  \r
+        </tbody>       \r
+      </table>\r
+      </td>\r
+    </tr>\r
+     \r
+  </tbody> \r
+</table>\r
+   \r
+<table cellspacing="5" cellpadding="0" border="0">\r
+    <tbody>\r
+     <tr>\r
+      <td>&nbsp;            </td>\r
+      <td>         \r
+      <p> Creates a presentation of cut planes. </p>\r
+       \r
+      <dl compact>\r
+        <dt><b> Parameters: </b></dt>\r
+        <dd>            \r
+          <table border="0" cellspacing="2" cellpadding="0">\r
+  <tbody>\r
+               <tr>\r
+                 <td valign="top"><em>theResult</em>&nbsp;</td>\r
+                 <td> Data generated in other sources. (MED object or file) \r
+                </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theMeshName</em>&nbsp;</td>\r
+                 <td> One of the meshes presented in MED file </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theEntity</em>&nbsp;</td>\r
+                 <td> Type of entity where the field is defined </td>\r
+               </tr>\r
+  <tr>\r
+                 <td valign="top"><em>theFieldName</em>&nbsp;</td>\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/doc/html/INPUT/sources/static/overview_VISU.html b/doc/html/INPUT/sources/static/overview_VISU.html
new file mode 100755 (executable)
index 0000000..844abd4
--- /dev/null
@@ -0,0 +1,252 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">\r
+<html>\r
+<head>\r
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\r
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">\r
+   <title>Main Page</title>\r
+<link href="doxygen.css" rel="stylesheet" type="text/css">\r
+</head>\r
+<body>\r
+&nbsp;\r
+<center><table WIDTH="96%" >\r
+<tr>\r
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>\r
+\r
+\r
+<td>\r
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>\r
+</td>\r
+</tr>\r
+</table></center>\r
+\r
+\r
+<h1><a name="page2">General overview</a>\r
+</h1>\r
+<a name="cont"></a><h2>Table of contents </h2>\r
+<b><i>\r
+<ul>\r
+  <li><a href="#1">1. Introduction</a></li>\r
+  <li><a href="#2">2. Definitions </a></li>\r
+               \r
+  <li><a href="#3">3. Forms of data visualization </a></li>\r
+  <ul>\r
+               <li><a href="#3_1">3.1 Data tables</a></li>\r
+               <li><a href="#3_2">3.2 XY plots  </a></li>\r
+               <li><a href="#3_3">3.3 3D presentations  </a></li>\r
+               </ul>\r
+       <li><a href="#4">4. Data structure</a></li>\r
+       <li><a href="#5">5. VISU module features and services</a></li>\r
+       <ul>\r
+               <li><a href="#5_1">5.1 Base class</a></li>\r
+               <li><a href="#5_2">5.2 ViewManager class  </a></li>\r
+               <li><a href="#5_3">5.3 View class  </a></li>\r
+               <ul>\r
+               <li><a href="#5_3_1">5.3.1 3dView class  </a></li>\r
+               <li><a href="#5_3_2">5.3.2 TableView class  </a></li>\r
+               <li><a href="#5_3_3">5.3.3 XYPlotView class  </a></li>\r
+               </ul>\r
+               <li><a href="#5_4">5.4 Result class  </a></li>\r
+               <li><a href="#5_5">5.5 PrsObject class  </a></li>\r
+               <ul>\r
+               <li><a href="#5_5_1">5.5.1 Curve class  </a></li>\r
+               <li><a href="#5_5_2">5.5.2 Table class  </a></li>\r
+               <li><a href="#5_5_3">5.5.3 Container class </a></li>\r
+               <li><a href="#5_5_4">5.5.4 Prs3d class  </a></li>\r
+               <li><a href="#5_5_5">5.5.5 Mesh class  </a></li>\r
+               <li><a href="#5_5_6">5.5.6 ScalarMap class  </a></li>\r
+               <li><a href="#5_5_7">5.5.7 CutLines class  </a></li>\r
+               <li><a href="#5_5_8">5.5.8 CutPlanes class  </a></li>\r
+               <li><a href="#5_5_9">5.5.9 IsoSurfaces class  </a></li>\r
+               <li><a href="#5_5_10">5.5.10 DeformedShape class  </a></li>\r
+               <li><a href="#5_5_11">5.5.11 Vectors class  </a></li>\r
+               <li><a href="#5_5_12">5.5.12 StreamLines class  </a></li>\r
+               \r
+               </ul>\r
+               <li><a href="#5_6">5.6 Animation class  </a></li>\r
+               <li><a href="#5_7">5.7 VISU_Gen class  </a></li>\r
+               \r
+       </ul>\r
+</ul>\r
+</i> </b> <br>\r
+<a name="1"></a><h2>1. Introduction </h2>\r
+<p>Post-processing module VISU for SALOME is destined for visualization of data \r
+  produced by other components. VISU provides various forms of data visualization \r
+  including: </p>\r
+  \r
+<ul>\r
+  <li>Data tables, </li>\r
+  <li>XY plots based on data from tables, </li>\r
+  <li>3D presentations, </li>  \r
+  <ul>\r
+    <li> Scalar Map,</li>\r
+    <li> Deformed Shape, </li>\r
+    <li> Vectors,</li>\r
+    <li> Iso Surfaces,</li>\r
+    <li> Cut Planes,</li>\r
+    <li> Stream Lines,</li>\r
+    <li> Cut Lines.</li>\r
+  </ul>\r
+</ul>\r
+<i><a href="#cont">Back to the contents</a></i>\r
+<a name="2"></a><h2>2. Defintions </h2>\r
+<p>The following terms are used for presentation of the VISU module:</p>\r
+<dl>\r
+<dt><b>Study</b></dt> \r
+<dd>manages data produced by various component of SALOME platform. More detailed description of the SALOME Study can be found in the document named "Data Structure and Persistence Specifications".</dd>\r
+<dt><b>Component</b></dt> \r
+<dd>a SALOME software module that implements predefined interfaces. \r
+The component provides the data for the SALOME study in a form of links (stored in the Study) \r
+to the specific data stored in the component. All components are CORBA servers and it allows them \r
+to be running on different host stations.</dd>\r
+<dt><b>Geometry</b></dt> <dd>a coherent set of data produced by component GEOM or any other geometry tool \r
+and imported using geometry exchange interface (like BRep, IGES and so on).</dd>\r
+<dt><b>Mesh</b></dt> <dd>a collection of elements used as a support for numeric simulation.</dd>\r
+<dt><b>Field</b></dt> <dd>the set of results of the same type allocated to mesh elements. \r
+Fields can be one of next types: scalars, vectors, tensors, matrices, character strings.</dd>\r
+</dl>\r
+<i><a href="#cont">Back to the contents</a></i>\r
+<a name="3"></a><h2>3. Forms of data visualization </h2>\r
+<a name="3_1"></a><h3>3.1 Data tables </h3>\r
+<p>Table represents data in spreadsheet-like form. For these purposes the QTable \r
+  widget will be provided. This widget can be reused in any module for any dialog \r
+  box as a control. For post-processing data visualization needs this widget is \r
+  used inside of Table window (based on non-modal window frame). Data represented \r
+  in Table window of post-processing module is be editable. </p>\r
+ <a name="3_2"></a> <h3>3.2 XY plots</h3>\r
+<p>XY plot represents calculation data in form of 2D (XY) plotting. \r
+XY plot view is shown in a separated view window (non-modal dialog box), which can be moved in any position of the screen for convenience. \r
+The QWT extension of QT toolkit is used for XY plotting. \r
+QWT provides unlimited number of displayed curves (data sets) and supports logarithmic scale, zooming, and selection.</p>\r
+<a name="3_3"></a>\r
+<h3>3.3 3D presentations </h3>\r
+<p>A 3D presentation shows geometry, mesh and fields in 3D space. \r
+Provides selection, rotation, zooming, scaling, and panning of 3d scene. \r
+Color bar for scalar data presentation is supplied. \r
+For 3D presentation window of the current implementation of VTK viewer in study window is used.</p>\r
+<i><a href="#cont">Back to the contents</a></i>\r
+<a name="4"></a><h2>4. Data structure </h2>\r
+<p>Source data for post-processing module can be imported from MED file or MED object in study data structure (CORBA object) can be used for this purposes. </p>\r
+<p>In case of import MED file the data from this file will be converted in form of VTK Data Source format and stored in VISU data structure. In case of using of MED object from study the label in VISU data structure will be created with reference to the corresponded MED object.</p>\r
+<p>Available result data is displayed under corresponded MED data label. For every result the number of presentations can be created dependently on result type. </p>\r
+<p>Presentation is represented in data structure in form of list of presentation creation parameters. This could be:</p>\r
+<ul>\r
+<li>Presentation type (table, XY plot, 3d view);</li>\r
+<li>Presentation subtype (for example for 3d: scalar map, iso-surfaces, combined view and so on);</li>\r
+<li>Parameters of the presentation dependently on its type (number of colors, type of scale, font parameters, grid parameters and so on).</li>\r
+</ul>\r
+<p>Parameters of presentation are persistent data, which will be stored in study file.</p>\r
+\r
+\r
+<div align="center"><img src="DataStruct.gif"> </div>\r
+<i><a href="#cont">Back to the contents</a></i>\r
+<a name="5"></a><h2>5. VISU module features and services </h2>\r
+<p>The functionality of the VISU module is provided by a set of classes which are combined into \r
+the <b>VISU</b> package.\r
+<p>The API reference of the VISU component can be found <a href="namespaceVISU.html">here</a>.</p>\r
+<a name="5_1"></a><h3>5.1 Base class</h3>\r
+<p>This is a root class for all objects of the VISU module.</p>\r
+ <p>The API reference for this class can be found <a href="interfaceVISU_1_1Base.html">here</a>.</p>\r
+\r
+<a name="5_2"></a><h3>5.2 ViewManager class</h3>\r
+<p>This class is used for management of the view windows (creation and deletion).</p>\r
+ <p>The API reference for this class can be found <a href="interfaceVISU_1_1ViewManager.html">here</a>.</p>\r
+\r
+<a name="5_3"></a><h3>5.3 View class</h3>\r
+<p>View class is a base for all other classes, necessary for creation of different views .</p>\r
\r
+<div align="center"><img src="View.gif"> </div>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1View.html">here</a>.</p>\r
+\r
+<a name="5_3_1"></a><h4>5.3.1 3dView class</h4>\r
+<p>This class provides a set of methods for creation of a 3d view window.</p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_13dView.html">here</a>.</p>\r
+\r
+<a name="5_3_2"></a><h4>5.3.2 TableView class</h4>\r
+<p>This class provides a set of methods for creation of a Table view window.</p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1TableView.html">here</a>.</p>\r
+\r
+<a name="5_3_3"></a><h4>5.3.3 XYPlotView class</h4>\r
+<p>This class provides a set of methods for creation of a XYPlot view window.</p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1XYPlotView.html">here</a>.</p>\r
+\r
+<a name="5_4"></a><h3>5.4 Result class</h3>\r
+<p>This class serves for inner representation of data generated in other sources. \r
+(MED object or file) This data is needed for further construction of graphical presentations.</p> \r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Result.html">here</a>.</p>\r
+<a name="5_5"></a><h3>5.5 PrsObject class</h3>\r
+<p>It is the root class of all presentable objects. </p>\r
+<div align="center"><img src="PrsObj.gif"> </div>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1PrsObject.html">here</a>.</p>\r
+\r
+<a name="5_5_1"></a><h4>5.5.1 Curve class</h4>\r
+<p>Manages presentation parameters of one curve. \r
+This object can be used for presentation of set of curves using Container class. </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Curve.html">here</a>.</p>\r
+\r
+<a name="5_5_2"></a><h4>5.5.2 Table class</h4>\r
+<p>Manages presentation parameters of a table.  </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Table.html">here</a>.</p>\r
+\r
+<a name="5_5_3"></a><h4>5.5.3 Container class</h4>\r
+<p>This class is provided in order to create one presentation using several presentable objects. This can provide combination of a set of curves to display them in XY plot view. \r
+</p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Container.html">here</a>.</p>\r
+\r
+<a name="5_5_4"></a><h4>5.5.4 Prs3d class</h4>\r
+<p>Root class for all 3D presentations. </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Prs3d.html">here</a>.</p>\r
+\r
+<a name="5_5_5"></a><h4>5.5.5 Mesh class</h4>\r
+<p>Manages presentation parameters of a 3D presentattion of a mesh. \r
+This object can be used for presentation of set of curves using Container class. </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Mesh.html">here</a>.</p>\r
+\r
+<a name="5_5_6"></a><h4>5.5.6 ScalarMap class</h4>\r
+<p>Manages presentation parameters of the scalar bar.  </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1ScalarMap.html">here</a>.</p>\r
+\r
+<a name="5_5_7"></a><h4>5.5.7 CutLines class</h4>\r
+<p>Manages presentation parameters of the cut lines presentation.  </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1CutLines.html">here</a>.</p>\r
+\r
+<a name="5_5_8"></a><h4>5.5.8 CutPlanes class</h4>\r
+<p>Manages presentation parameters of the cut planes presentation.   </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1CutPlanes.html">here</a>.</p>\r
+\r
+<a name="5_5_9"></a><h4>5.5.9 IsoSurfaces class</h4>\r
+<p>Manages presentation parameters of the iso surfaces presentation.  </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1IsoSurfaces.html">here</a>.</p>\r
+\r
+<a name="5_5_10"></a><h4>5.5.10 DeformedShape class</h4>\r
+<p>Manages presentation parameters of the deformed shape presentation.   </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1DeformedShape.html">here</a>.</p>\r
+\r
+<a name="5_5_11"></a><h4>5.5.11 Vectors class</h4>\r
+<p>Manages presentation parameters of the vector presentation.  </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Vectors.html">here</a>.</p>\r
+\r
+<a name="5_5_12"></a><h4>5.5.12 StreamLines class</h4>\r
+<p>Manages presentation parameters of the streamlines presentation.  </p>\r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1StreamLines.html">here</a>.</p>\r
+\r
+<a name="5_6"></a><h3>5.6 Animation class</h3>\r
+<p>This class provides a set of methods used for:</p>\r
+<ul>\r
+  <li>generating different animations, </li>\r
+  <li>setting the parameters of the animations,</li>\r
+  <li>playing these animations in the VISU module.</li>\r
+</ul> \r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Animation.html">here</a>.</p>\r
+\r
+<a name="5_7"></a><h3>5.7 VISU_Gen class</h3>\r
+<p>This is the main clas of the VISU component in SALOME application. It is used for  , \r
+using the views provided by ViewManager. This class provides a set of methods used for:</p>\r
+<ul>\r
+  <li>creation of all types of post-processing presentations from given Result and Table object reference   </li>\r
+  <li>creation of animations</li>\r
+  \r
+</ul> \r
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1VISU__Gen.html">here</a>.</p>\r
+<i><a href="#cont">Back to the contents</a></i>\r
+</body>\r
+</html>\r
diff --git a/doc/html/INPUT/sources/static/page2.html b/doc/html/INPUT/sources/static/page2.html
new file mode 100755 (executable)
index 0000000..d31cf0c
--- /dev/null
@@ -0,0 +1,31 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+</body>
+</html>
+<!-- Generated by Doxygen 1.3-rc2 -->
+<ul>
+<li><b>SALOME VISU module</b><ul>
+<li><a href="HTML/VISU_Gen.html">Mapping of VISU_Gen functions</a></li></ul>
+</li></ul>
+</body>
+</html>
diff --git a/doc/html/INPUT/sources/static/tree.js b/doc/html/INPUT/sources/static/tree.js
new file mode 100755 (executable)
index 0000000..d6c4c9b
--- /dev/null
@@ -0,0 +1,82 @@
+foldersTree = gFld("<b>SALOME v.1.3.0 </b>", "", "")
+     insDoc(foldersTree, gLnk("Main Page", "", "main.html"))
+
+aux1 = insFld(foldersTree, gFld("TUI Reference Guide", ""))
+  aux2 = insFld(aux1, gFld("Modules", ""))
+    aux3 = insFld(aux2, gFld("SALOME VISU module", ""))
+             insDoc(aux3, gLnk("Overview", "", "overview_VISU.html"))
+      aux4 = insFld(aux3, gFld("Packages", ""))
+               insDoc(aux4, gLnk("VISU", "", "namespaceVISU.html"))
+             insDoc(aux3, gLnk("Examples", "", "examples_VISU.html"))  
+
+
+/*! Data structures
+*/
+         insDoc(aux1, gLnk("Data Structures", "", "annotated.html"))
+
+/*!    insDoc(aux1, gLnk("VISU::Animation", "", "interfaceVISU_1_1Animation.html"))
+       insDoc(aux1, gLnk("VISU::Base", "", "interfaceVISU_1_1Base.html"))
+       insDoc(aux1, gLnk("VISU::Container", "", "interfaceVISU_1_1Container.html"))
+       insDoc(aux1, gLnk("VISU::Curve", "", "interfaceVISU_1_1Curve.html"))
+       insDoc(aux1, gLnk("VISU::CutLines", "", "interfaceVISU_1_1CutLines.html"))
+       insDoc(aux1, gLnk("VISU::CutPlanes", "", "interfaceVISU_1_1CutPlanes.html"))
+       insDoc(aux1, gLnk("VISU::DeformedShape", "", "interfaceVISU_1_1DeformedShape.html"))
+       insDoc(aux1, gLnk("VISU::IsoSurfaces", "", "interfaceVISU_1_1IsoSurfaces.html"))
+       insDoc(aux1, gLnk("VISU::Mesh", "", "interfaceVISU_1_1Mesh.html"))
+       insDoc(aux1, gLnk("VISU::Prs3d", "", "interfaceVISU_1_1Prs3d.html"))
+       insDoc(aux1, gLnk("VISU::PrsObject", "", "interfaceVISU_1_1PrsObject.html"))
+       insDoc(aux1, gLnk("VISU::Result", "", "interfaceVISU_1_1Result.html"))
+       insDoc(aux1, gLnk("VISU::ScalarMap", "", "interfaceVISU_1_1ScalarMap.html"))
+       insDoc(aux1, gLnk("VISU::StreamLines", "", "interfaceVISU_1_1StreamLines.html"))
+       insDoc(aux1, gLnk("VISU::Table", "", "interfaceVISU_1_1Table.html"))
+       insDoc(aux1, gLnk("VISU::TableView", "", "interfaceVISU_1_1TableView.html"))
+       insDoc(aux1, gLnk("VISU::Vectors", "", "interfaceVISU_1_1Vectors.html"))
+       insDoc(aux1, gLnk("VISU::View", "", "interfaceVISU_1_1View.html"))
+       insDoc(aux1, gLnk("VISU::View3D", "", "interfaceVISU_1_1View3D.html"))
+       insDoc(aux1, gLnk("VISU::ViewManager", "", "interfaceVISU_1_1ViewManager.html"))
+       insDoc(aux1, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html"))
+       insDoc(aux1, gLnk("VISU::XYPlot", "", "interfaceVISU_1_1XYPlot.html"))
+*/
+         insDoc(aux1, gLnk("Class Hierarchy", "", "hierarchy.html"))
+
+/*!    
+  aux2 = insFld(aux1, gFld("VISU::Base", "", "interfaceVISU_1_1Base.html"))
+         insDoc(aux2, gLnk("VISU::Animation", "", "interfaceVISU_1_1Animation.html"))
+    aux3 = insFld(aux2, gFld("VISU::PrsObject", "", "interfaceVISU_1_1PrsObject.html"))
+           insDoc(aux3, gLnk("VISU::Container", "", "interfaceVISU_1_1Container.html"))
+           insDoc(aux3, gLnk("VISU::Curve", "", "interfaceVISU_1_1Curve.html"))
+      aux4 = insFld(aux3, gFld("VISU::Prs3d", "", "interfaceVISU_1_1Prs3d.html"))
+             insDoc(aux4, gLnk("VISU::Mesh", "", "interfaceVISU_1_1Mesh.html"))
+        aux5 = insFld(aux4, gFld("VISU::ScalarMap", "", "interfaceVISU_1_1ScalarMap.html"))
+               insDoc(aux5, gLnk("VISU::CutLines", "", "interfaceVISU_1_1CutLines.html"))
+               insDoc(aux5, gLnk("VISU::CutPlanes", "", "interfaceVISU_1_1CutPlanes.html"))
+          aux6 = insFld(aux5, gFld("VISU::DeformedShape", "", "interfaceVISU_1_1DeformedShape.html"))
+                 insDoc(aux6, gLnk("VISU::StreamLines", "", "interfaceVISU_1_1StreamLines.html"))
+                 insDoc(aux6, gLnk("VISU::Vectors", "", "interfaceVISU_1_1Vectors.html"))
+               insDoc(aux5, gLnk("VISU::IsoSurfaces", "", "interfaceVISU_1_1IsoSurfaces.html"))
+           insDoc(aux3, gLnk("VISU::Table", "", "interfaceVISU_1_1Table.html"))
+         insDoc(aux2, gLnk("VISU::Result", "", "interfaceVISU_1_1Result.html"))
+    aux3 = insFld(aux2, gFld("VISU::View", "", "interfaceVISU_1_1View.html"))
+           insDoc(aux3, gLnk("VISU::TableView", "", "interfaceVISU_1_1TableView.html"))
+           insDoc(aux3, gLnk("VISU::View3D", "", "interfaceVISU_1_1View3D.html"))
+           insDoc(aux3, gLnk("VISU::XYPlot", "", "interfaceVISU_1_1XYPlot.html"))
+         insDoc(aux2, gLnk("VISU::ViewManager", "", "interfaceVISU_1_1ViewManager.html"))
+         insDoc(aux2, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html"))
+         insDoc(aux2, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html"))
+         insDoc(aux2, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html"))
+*/
+         insDoc(aux1, gLnk("Class methods list", "", "functions.html"))
+/*!
+aux1 = insFld(foldersTree, gFld("Namespace List", "", "namespaces.html"))
+       insDoc(aux1, gLnk("VISU", "", "namespaceVISU.html"))
+*/
+         insDoc(aux1, gLnk("Namespace Members", "", "namespacemembers.html"))
+
+         insDoc(aux1, gLnk("File List", "", "files.html"))
+      
+/*!
+       insDoc(aux1, gLnk("VISU_Gen.idl", "", "VISU__Gen_8idl.html"))
+*/
+/*!  insDoc(foldersTree, gLnk("Graphical Class Hierarchy", "", "inherits.html"))
+*/
diff --git a/doc/html/INPUT/sources/static/treeview.js b/doc/html/INPUT/sources/static/treeview.js
new file mode 100644 (file)
index 0000000..55eb43d
--- /dev/null
@@ -0,0 +1,505 @@
+//**************************************************************** 
+// You are free to copy the "Folder-Tree" script as long as you  
+// keep this copyright notice: 
+// Script found in: http://www.geocities.com/Paris/LeftBank/2178/ 
+// Author: Marcelino Alves Martins (martins@hks.com) December '97. 
+//**************************************************************** 
+//Log of changes: 
+//       17 Feb 98 - Fix initialization flashing problem with Netscape
+//       
+//       27 Jan 98 - Root folder starts open; support for USETEXTLINKS; 
+//                   make the ftien4 a js file 
+//       
+// DvH:  Dec 2000 -  Made some minor changes to support external 
+//                   references
+// Definition of class Folder 
+// ***************************************************************** 
+function Folder(folderDescription, tagName, hreference) //constructor 
+{ 
+  //constant data 
+  this.desc = folderDescription 
+  this.tagName = tagName
+  this.hreference = hreference 
+  this.id = -1   
+  this.navObj = 0  
+  this.iconImg = 0  
+  this.nodeImg = 0  
+  this.isLastNode = 0 
+  //dynamic data 
+  this.isOpen = true 
+  this.iconSrc = "ftv2folderopen.png"   
+  this.children = new Array 
+  this.nChildren = 0 
+  //methods 
+  this.initialize = initializeFolder 
+  this.setState = setStateFolder 
+  this.addChild = addChild 
+  this.createIndex = createEntryIndex 
+  this.hide = hideFolder 
+  this.display = display 
+  this.renderOb = drawFolder 
+  this.totalHeight = totalHeight 
+  this.subEntries = folderSubEntries 
+  this.outputLink = outputFolderLink 
+} 
+function setStateFolder(isOpen) 
+{ 
+  var subEntries 
+  var totalHeight 
+  var fIt = 0 
+  var i=0 
+  if (isOpen == this.isOpen) 
+    return 
+  if (browserVersion == 2)  
+  { 
+    totalHeight = 0 
+    for (i=0; i < this.nChildren; i++) 
+      totalHeight = totalHeight + this.children[i].navObj.clip.height 
+      subEntries = this.subEntries() 
+    if (this.isOpen) 
+      totalHeight = 0 - totalHeight 
+    for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) 
+      indexOfEntries[fIt].navObj.moveBy(0, totalHeight) 
+  }  
+  this.isOpen = isOpen 
+  propagateChangesInState(this) 
+} 
+function propagateChangesInState(folder) 
+{   
+  var i=0 
+  if (folder.isOpen) 
+  { 
+    if (folder.nodeImg) 
+      if (folder.isLastNode) 
+        folder.nodeImg.src = "ftv2mlastnode.png" 
+      else 
+         folder.nodeImg.src = "ftv2mnode.png" 
+    folder.iconImg.src = "ftv2folderopen.png" 
+    for (i=0; i<folder.nChildren; i++) 
+      folder.children[i].display() 
+  } 
+  else 
+  { 
+    if (folder.nodeImg) 
+      if (folder.isLastNode) 
+        folder.nodeImg.src = "ftv2plastnode.png" 
+      else 
+         folder.nodeImg.src = "ftv2pnode.png" 
+    folder.iconImg.src = "ftv2folderclosed.png" 
+    for (i=0; i<folder.nChildren; i++) 
+      folder.children[i].hide() 
+  }  
+} 
+function hideFolder() 
+{ 
+  if (browserVersion == 1 || browserVersion == 3) { 
+    if (this.navObj.style.display == "none") 
+      return 
+    this.navObj.style.display = "none" 
+  } else { 
+    if (this.navObj.visibility == "hidden") 
+      return 
+    this.navObj.visibility = "hidden" 
+  } 
+   
+  this.setState(0) 
+} 
+function initializeFolder(level, lastNode, leftSide) 
+{ 
+var j=0 
+var i=0 
+var numberOfFolders 
+var numberOfDocs 
+var nc 
+      
+  nc = this.nChildren 
+   
+  this.createIndex() 
+  var auxEv = "" 
+  if (browserVersion > 0) 
+    auxEv = "<a href='javascript:clickOnNode("+this.id+")'>" 
+  else 
+    auxEv = "<a>" 
+  if (level>0) 
+    if (lastNode) //the last 'brother' in the children array 
+    { 
+      this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mlastnode.png' width=16 height=22 border=0></a>") 
+//    leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"  
+      this.isLastNode = 1 
+    } 
+    else 
+    { 
+      this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mnode.png' width=16 height=22 border=0></a>") 
+      leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
+      this.isLastNode = 0 
+    } 
+  else 
+    this.renderOb("") 
+   
+  if (nc > 0) 
+  { 
+    level = level + 1 
+    for (i=0 ; i < this.nChildren; i++)  
+    { 
+      if (i == this.nChildren-1) 
+        this.children[i].initialize(level, 1, leftSide) 
+      else 
+        this.children[i].initialize(level, 0, leftSide) 
+      } 
+  } 
+} 
+function drawFolder(leftSide) 
+{ 
+  if (browserVersion == 2) { 
+    if (!doc.yPos) 
+      doc.yPos=8 
+    doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
+  } 
+  if (browserVersion == 3) 
+  {
+    doc.write("<div id='folder" + this.id + "' style='visibility:hide;'>") 
+  }
+   
+  doc.write("\n<table ") 
+  if (browserVersion == 1) 
+    doc.write(" id='folder" + this.id + "' style='position:block;' ") 
+  doc.write(" border=0 cellspacing=0 cellpadding=0>") 
+  doc.write("\n<tr><td>") 
+  doc.write(leftSide) 
+  this.outputLink() 
+  doc.write("<img name='folderIcon" + this.id + "' ") 
+  doc.write("src='" + this.iconSrc+"' border=0></a>") 
+  doc.write("</td>\n<td valign=middle nowrap>") 
+  if (USETEXTLINKS) 
+  { 
+    this.outputLink() 
+    doc.write(this.desc + "</a>") 
+  } 
+  else 
+    doc.write(this.desc)
+
+/*! 
+  if (this.tagName!="")
+  {
+    doc.write(" [external]")
+  }
+*/
+  doc.write("</td>")  
+  doc.write("\n</table>\n") 
+   
+  if (browserVersion == 2) { 
+    doc.write("</layer>") 
+  } 
+  if (browserVersion == 3) { 
+    doc.write("</div>") 
+  } 
+  if (browserVersion == 1) { 
+    this.navObj = doc.all["folder"+this.id] 
+    this.iconImg = doc.all["folderIcon"+this.id] 
+    this.nodeImg = doc.all["nodeIcon"+this.id] 
+  } else if (browserVersion == 2) { 
+    this.navObj = doc.layers["folder"+this.id] 
+    this.iconImg = this.navObj.document.images["folderIcon"+this.id] 
+    this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
+    doc.yPos=doc.yPos+this.navObj.clip.height 
+  } else if (browserVersion == 3) {
+    this.navObj = doc.getElementById("folder"+this.id)
+    this.iconImg = doc.images.namedItem("folderIcon"+this.id)
+    this.nodeImg = doc.images.namedItem("nodeIcon"+this.id)
+  }
+} 
+function outputFolderLink() 
+{ 
+  if (this.hreference) 
+  { 
+    doc.write("<a ")
+    if (this.tagName)
+    {
+      doc.write("doxygen='" + this.tagName + "' ");
+    }
+    doc.write("href='" + this.hreference + "' TARGET=\"basefrm\" ") 
+    if (browserVersion > 0) 
+      doc.write("onClick='javascript:clickOnFolder("+this.id+")'") 
+    doc.write(">") 
+  } 
+  else 
+    doc.write("<a>") 
+} 
+function addChild(childNode) 
+{ 
+  this.children[this.nChildren] = childNode 
+  this.nChildren++ 
+  return childNode 
+} 
+function folderSubEntries() 
+{ 
+  var i = 0 
+  var se = this.nChildren 
+  for (i=0; i < this.nChildren; i++){ 
+    if (this.children[i].children) //is a folder 
+      se = se + this.children[i].subEntries() 
+  } 
+  return se 
+} 
+// Definition of class Item (a document or link inside a Folder) 
+// ************************************************************* 
+function Item(itemDescription, tagName, itemLink) // Constructor 
+{ 
+  // constant data 
+  this.desc = itemDescription 
+  this.tagName = tagName
+  this.link = itemLink 
+  this.id = -1 //initialized in initalize() 
+  this.navObj = 0 //initialized in render() 
+  this.iconImg = 0 //initialized in render() 
+  this.iconSrc = "ftv2doc.png" 
+  // methods 
+  this.initialize = initializeItem 
+  this.createIndex = createEntryIndex 
+  this.hide = hideItem 
+  this.display = display 
+  this.renderOb = drawItem 
+  this.totalHeight = totalHeight 
+} 
+function hideItem() 
+{ 
+  if (browserVersion == 1 || browserVersion == 3) { 
+    if (this.navObj.style.display == "none") 
+      return 
+    this.navObj.style.display = "none" 
+  } else { 
+    if (this.navObj.visibility == "hidden") 
+      return 
+    this.navObj.visibility = "hidden" 
+  }     
+} 
+function initializeItem(level, lastNode, leftSide) 
+{  
+  this.createIndex() 
+  if (level>0) 
+    if (lastNode) //the last 'brother' in the children array 
+    { 
+      this.renderOb(leftSide + "<img src='ftv2lastnode.png' width=16 height=22>") 
+      leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"  
+    } 
+    else 
+    { 
+      this.renderOb(leftSide + "<img src='ftv2node.png' width=16 height=22>") 
+      leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
+    } 
+  else 
+    this.renderOb("")   
+} 
+function drawItem(leftSide) 
+{ 
+  if (browserVersion == 2) 
+    doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
+  if (browserVersion == 3) 
+    doc.write("<div id='item" + this.id + "' style='display:block;'>") 
+     
+  doc.write("\n<table ") 
+  if (browserVersion == 1) 
+    doc.write(" id='item" + this.id + "' style='position:block;' ") 
+  doc.write(" border=0 cellspacing=0 cellpadding=0>\n") 
+  doc.write("<tr><td>") 
+  doc.write(leftSide) 
+  if (this.link!="")
+  {
+    doc.write("<a href=" + this.link + ">") 
+  }
+  doc.write("<img id='itemIcon"+this.id+"' ") 
+  doc.write("src='"+this.iconSrc+"' border=0>") 
+  if (this.link!="")
+  {
+    doc.write("</a>")
+  } 
+  doc.write("</td>\n<td valign=middle nowrap>") 
+  if (USETEXTLINKS && this.link!="") 
+    doc.write("<a href=" + this.link + ">" + this.desc + "</a>") 
+  else 
+    doc.write(this.desc) 
+/*!
+  if (this.tagName!="")
+  {
+    doc.write(" [external]");
+  }
+*/
+  doc.write("\n</table>\n") 
+   
+  if (browserVersion == 2) 
+    doc.write("</layer>") 
+  if (browserVersion == 3) 
+    doc.write("</div>")
+  if (browserVersion == 1) { 
+    this.navObj = doc.all["item"+this.id] 
+    this.iconImg = doc.all["itemIcon"+this.id] 
+  } else if (browserVersion == 2) { 
+    this.navObj = doc.layers["item"+this.id] 
+    this.iconImg = this.navObj.document.images["itemIcon"+this.id] 
+    doc.yPos=doc.yPos+this.navObj.clip.height 
+  } else if (browserVersion == 3) {
+    this.navObj = doc.getElementById("item"+this.id)
+    this.iconImg = doc.images.namedItem("itemIcon"+this.id)
+  }
+} 
+// Methods common to both objects (pseudo-inheritance) 
+// ******************************************************** 
+function display() 
+{ 
+  if (browserVersion == 1 || browserVersion == 3) 
+    this.navObj.style.display = "block" 
+  else 
+    this.navObj.visibility = "show" 
+} 
+function createEntryIndex() 
+{ 
+  this.id = nEntries 
+  indexOfEntries[nEntries] = this 
+  nEntries++ 
+} 
+// total height of subEntries open 
+function totalHeight() //used with browserVersion == 2 
+{ 
+  var h = this.navObj.clip.height 
+  var i = 0 
+   
+  if (this.isOpen) //is a folder and _is_ open 
+    for (i=0 ; i < this.nChildren; i++)  
+      h = h + this.children[i].totalHeight() 
+  return h 
+} 
+// Events 
+// ********************************************************* 
+function clickOnFolder(folderId) 
+{ 
+  var clicked = indexOfEntries[folderId] 
+  if (!clicked.isOpen) 
+    clickOnNode(folderId) 
+  return  
+  if (clicked.isSelected) 
+    return 
+} 
+function clickOnNode(folderId) 
+{ 
+  var clickedFolder = 0 
+  var state = 0 
+  clickedFolder = indexOfEntries[folderId] 
+  state = clickedFolder.isOpen 
+  clickedFolder.setState(!state) //open<->close  
+} 
+function initializeDocument() 
+{ 
+  doc = document;
+  if (doc.all) 
+    browserVersion = 1 //IE4   
+  else 
+    if (doc.layers) 
+      browserVersion = 2 //NS4 
+    else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1)
+        browserVersion = 3 //mozilla
+      else 
+        browserVersion = 0 //other 
+
+  foldersTree.initialize(0, 1, "") 
+  foldersTree.display()
+  
+  if (browserVersion > 0) 
+  { 
+    if(browserVersion != 3)
+      doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+">&nbsp;</layer>") 
+    // close the whole tree 
+    clickOnNode(0) 
+    // open the root folder 
+    clickOnNode(0) 
+  } 
+} 
+// Auxiliary Functions for Folder-Treee backward compatibility 
+// ********************************************************* 
+function gFld(description, tagName, hreference) 
+{ 
+  folder = new Folder(description, tagName, hreference) 
+  return folder 
+} 
+function gLnk(description, tagName, linkData) 
+{ 
+  fullLink = "" 
+  if (linkData!="")
+  {
+    fullLink = "'"+linkData+"' target=\"basefrm\"" 
+  } 
+  linkItem = new Item(description, tagName, fullLink)   
+  return linkItem 
+} 
+function insFld(parentFolder, childFolder) 
+{ 
+  return parentFolder.addChild(childFolder) 
+} 
+function insDoc(parentFolder, document) 
+{ 
+  parentFolder.addChild(document) 
+} 
+// Global variables 
+// **************** 
+USETEXTLINKS = 1
+indexOfEntries = new Array 
+nEntries = 0 
+doc = document 
+browserVersion = 0 
+selectedFolder=0
index 6b636a242121ce8b4e90d2391361c730eb6ea185..812d7cdf1c8646ef6f6a56944b7ff3d3d912be6c 100644 (file)
@@ -1,11 +1,14 @@
-# -* Makefile *- 
+#  Copyright (C) 2003  CEA/DEN, EDF R&D
 #
-# Author : Vasily Rusyaev (Open Cascade NN)
-# Date : 13/02/2003
-# $Header: 
 #
-# source path
+#
+#  File   : Makefile.in
+#  Author : Vasily Rusyaev (Open Cascade NN)
+#  Module : doc
+#  $Header: 
+
 top_srcdir=@top_srcdir@
+root_srcdir=@ROOT_SRCDIR@
 top_builddir=../..
 srcdir=@srcdir@
 VPATH=.:@srcdir@
@@ -16,11 +19,11 @@ doxygen=@DOXYGEN@
 doc:
        cp -fr $(srcdir)/INPUT ./; \
        cd INPUT; \
-       sed 's|../../../share/salome|../$(top_srcdir)|' doxyfile > doxyfile1; \
+       sed 's|../../../share/salome|$(root_srcdir)|' doxyfile > doxyfile1; \
        mv -f doxyfile1 doxyfile; \
        $(doxygen) ./doxyfile; \
        cd ..; \
-       cp -f $(srcdir)/INPUT/sources/doxygen.css ./html/doxygen.css
+       cp -fr $(srcdir)/INPUT/sources/static/*.* ./html/
        cp -fr $(srcdir)/INPUT/sources/ html/
        cp -fr $(srcdir)/INPUT/exemple/ html/
        cp -fr $(srcdir)/INPUT/HTML/  html/
index b04df2443cd93a58f7c8db5036698c8c71335c3d..5d62ff55c198ccaaa88c0ce6a9f569a9ec6d7e89 100644 (file)
@@ -5,14 +5,11 @@
 //  File   : VISU_Gen.idl
 //  Author : Alexey Petrov
 
-/*! \file VISU_Gen.idl This file conatins a set of interfaces of %VISU module.
-      This module will provide various forms of data visualization in %SALOME application.
+/*! \file VISU_Gen.idl This file conatins a set of interfaces of the %VISU module.
+      This module provides various forms of data visualization in %SALOME application.
       These forms include data tables, XY plots, 3d representations
       and combination of these forms.
 */
-/*!
- \defgroup Visu SALOME VISU module
-*/
 
 #ifndef __VISU_GEN__
 #define __VISU_GEN__
 #include "SALOMEDS_Attributes.idl"
 #include "MED.idl"
 
-/*! \ingroup Visu
-  The main package of interfaces of the module %VISU.
+/*!
+  The main package of interfaces of the post-processing module %VISU.
 */
 module VISU {
   //-------------------------------------------------------
   typedef string IdType;
-  enum Scaling{ LINEAR, LOGARITHMIC};
+/*!
+ This enumeration contains a set of elements defining the type of the scaling, which
+can be applied on different presentations.
+*/
+  enum Scaling{ LINEAR, /*!< Linear type of scaling. */
+               LOGARITHMIC /*!< Logarithmic type of scaling. */
+             };
   enum Entity{ NODE, EDGE, FACE, CELL};
 /*!
- This enumeration contains a set of elements defining the type of the module.
+ This enumeration contains a set of elements defining the type of the %VISU object.
 */
    enum VISUType{ TNONE,
                  TCURVE, TTABLE, TCONTAINER, TMESH, TSCALARMAP,
@@ -53,7 +56,7 @@ Returns the type of the presentable object
   };   
 /*! \brief Presentable object interface
 
- It is the root class of all presentable objects.
+Presentable object interface is the root class of all presentable objects.
 */
   interface PrsObject : Base{
   };
@@ -118,29 +121,29 @@ Gets the color of the curve.
 */
     SALOMEDS::Color GetColor();
  /*!
- This enumeration contains a set of elements defining the representation type of markers (data points) with help of
+ This enumeration contains a set of elements defining the presentation type of markers (data points) with help of
 which the curve is constructed on the graphics.
 */
     enum MarkerType{ NONE, CIRCLE, RECTANGLE, DIAMOND,
                      DTRIANGLE, UTRIANGLE, LTRIANGLE, RTRIANGLE,
                      CROSS, XCROSS };
 /*!
-Sets the representation type of markers (data points) with help of
+Sets the presentation type of markers (data points) with help of
 which the curve is constructed on the graphics.
 */
     void SetMarker(in MarkerType theType);
 /*!
-Gets the representation type of markers (data points) with help of
+Gets the presentation type of markers (data points) with help of
 which the curve is constructed on the graphics.
 */
     MarkerType GetMarker();
 /*!
  This enumeration contains a set of elements defining the
- type of representation of curve lines on the graphics.
+ type of presentation of a curve line on the graphics.
 */
     enum LineType{ VOIDLINE, SOLIDLINE, DASHLINE, DOTLINE, DASHDOTLINE, DASHDOTDOTLINE};
 /*!
-Sets the type of representation of curve lines on the graphics.
+Sets the type of presentation of curve lines on the graphics.
 */
     void SetLine(in LineType theType, in long theLineWidth);
 /*!
@@ -178,17 +181,25 @@ Removes all curves from the container.
 
   };
   //-------------------------------------------------------
+/*! \brief 3D presentation interface
+
+This is a root class for all 3D presentations, which can be displayed in %VISU module.
+*/
     interface Prs3d : PrsObject{
+/*! Kills a 3D presentation.
+*/
       void Destroy();
     };
 /*!
  This enumeration contains a set of elements defining the
- type of representation of the mesh.
+ type of presentation of the mesh.
 */
 
     enum PresentationType{ POINT,
                            WIREFRAME,
                            SHADED,
+                          INSIDEFRAME,
+                          SURFACEFRAME,
                            SHRINK
                          };
 /*! \brief Interface of the mesh.
@@ -334,7 +345,7 @@ Gets the title of this presentable object.
 
 Presentation parameters of the deformed shape presentation.
 */
-    interface DeformedShape : ScalarMap{
+  interface DeformedShape : ScalarMap{
 /*!
 Sets the scale of the presentatable object.
 */
@@ -343,16 +354,24 @@ Sets the scale of the presentatable object.
 Gets the scale of the presentatable object.
 */
     double GetScale();
+
+    boolean IsColored();
+    void ShowColored(in boolean theColored);
+
+    SALOMEDS::Color GetColor();
+    void SetColor(in SALOMEDS::Color theColor);
   };
   //-------------------------------------------------------
 /*! \brief Cut planes interface
 
-Presentation parameters of Cut planes presentation.
+Presentation parameters of Cut planes presentation. This type of presentation consists of
+cutting your initial mesh by a definite number of planes. As the result you will see these planes
+which will be cutted by the borders of the mesh.
 */
   interface CutPlanes : ScalarMap{
 /*!
  This enumeration contains a set of elements defining the orientation in 3D space
- of cut planes presentation.
+ of the cut planes.
 */
     enum Orientation {XY, YZ, ZX};
 /*!
@@ -363,9 +382,43 @@ Sets the type of orientation in 3D space of cut planes presentation.
 Gets the type of orientation in 3D space of cut planes presentation.
 */
     Orientation GetOrientationType();
+/*!
+Sets the displacement of the cut planes in 3D space.
+
+\param theDisp This parameter defines position of the cut planes
+in 3D space. It varies from 0 to 1. If the chosen value is 0.5, the cut planes
+will be evenly located regarding each other; in other words, the distance between all
+of them will equal. If the value is higher or lower than 0.5, the planes will be displaced
+to one or another side.
+*/
     void SetDisplacement(in double theDisp);
+/*!
+Gets the displacement of the cut planes in 3D space.
+*/
     double GetDisplacement();
 /*!
+Sets the position of a definite cut plane
+*/
+     void SetPlanePosition(in long thePlaneNumber, in double thePlanePosition);
+
+/*!
+Sets the position of the choosen plane to default value
+*/
+     void SetDefault(in long thePlaneNumber);
+
+/*!
+Gets the position of the choosen plane
+*/
+
+    double GetPlanePosition(in long thePlaneNumber);
+
+/*!
+Determines whether the choosen plane has default position
+*/
+
+    boolean IsDefault(in long thePlaneNumber);
+
+/*!
 Sets the number of cut planes.
 */
     void SetNbPlanes(in long theNb);
@@ -391,10 +444,6 @@ Sets rotation angle of the cut plane presentation.
     double GetRotateY();
   };
   //-------------------------------------------------------
-  /*! \brief Interface of the stream lines representation    
-  This interface contains presentation parameters of
-  stream lines presentations.
-  */
 /*! \brief Cut lines interface
 
 Presentation parameters of Cut lines presentation.
@@ -413,6 +462,18 @@ Presentation parameters of Cut lines presentation.
     double GetDisplacement();
     double GetDisplacement2();
 
+    void SetBasePlanePosition(in double thePlanePosition);
+    double GetBasePlanePosition();
+
+    void SetLinePosition(in long thePlaneNumber, in double thePlanePosition);
+    double GetLinePosition(in long thePlaneNumber);
+
+    void SetDefault();
+    boolean IsDefault();
+
+    void SetDefaultPosition(in long thePlaneNumber);
+    boolean IsDefaultPosition(in long thePlaneNumber);
+
     void SetNbLines(in long theNb);
     long GetNbLines();
 
@@ -428,7 +489,10 @@ Presentation parameters of Cut lines presentation.
     double GetRotateY();
     double GetRotateY2();
   };
-
+  /*! \brief Interface of the stream lines representation
+  This interface contains presentation parameters of
+  stream lines presentations.
+  */
   interface StreamLines : DeformedShape{
     enum Direction{ FORWARD,
                    BACKWARD,
@@ -571,6 +635,7 @@ This interface serves for inner representation of data generated in other source
 This data is needed for further construction of graphical presentations.
 */
   interface Result : Base {
+    boolean BuildAll();
   };
   //-------------------------------------------------------
   interface ViewManager;
@@ -857,26 +922,44 @@ False if the parameters with this name don't exist.
 
 
   //-------------------------------------------------------
+/*! \brief Interface of the Table view
+
+This interface is used for creation of a view necessary for presentation of a table.
+*/
   interface TableView : View {
-   
+
   };
 
 
   //-------------------------------------------------------
+/*! \brief Interface of the XY plot view
+
+This interface is used for creation of a view necessary for presentation of a XY plot generated on the basis
+of one or several curve lines.
+*/
   interface XYPlot : View {
+/*! Sets the title of the XY plot
+\param theTitle  The title of the XY plot
+*/
+
     void SetSubTitle(in string theTitle);
+/*! Gets the title of the XY plot
+*/
     string GetSubTitle();
-
+/*!
+This enumeration contains a set of elements determining the type of the curve lines, which
+will be displayed in your XY plot.
+*/
     enum CurveType { POINTS, MULTYLINE, SPLINE};
     void SetCurveType(in CurveType theType);
     CurveType GetCurveType();
-       
+
     void SetMarkerSize(in long theSize);
     long GetMarkerSize();
 
     void EnableXGrid(in boolean theMajor, in long theNumMajor, in boolean theMinor, in long theNumMinor);
     void EnableYGrid(in boolean theMajor, in long theNumMajor, in boolean theMinor, in long theNumMinor);
+
     void SetHorScaling(in Scaling theScaling);
     Scaling GetHorScaling();
     void SetVerScaling(in Scaling theScaling);
@@ -920,6 +1003,7 @@ False if the parameters with this name don't exist.
 
     void Destroy(in View theView);
 
+    void ProcessEvents();
  };
 };
 #endif
index 4f3216badeaed47f2f715a8b4e02d19ba0b803d0..9b73860104ba6a76089e4dc8b693b8cee8fc954a 100644 (file)
@@ -70,6 +70,9 @@
   <submenu label-id="Visu" item-id="" pos-id="-1">
     <popup-item item-id="51" pos-id="" label-id="Scalar Bar" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
     <popup-item item-id="52" pos-id="" label-id="Sweeping" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
+    <separator pos-id=""/>
+    <popup-item item-id="53" pos-id="" label-id="Full med loading" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
+    <!-- popup-item item-id="54" pos-id="" label-id="Build default Prs3d" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/ -->
   </submenu>
   <endsubmenu />   
   <separator pos-id="-1"/> 
index 7ff81e2213ac8d706d5881cb5a2717b2c682f08f..9b73860104ba6a76089e4dc8b693b8cee8fc954a 100644 (file)
 
 <!-- ************************* File  (menubar) ************************************** -->
 <menu-item label-id="File" item-id="1" pos-id="1">
+  <popup-item item-id="199" pos-id="8" label-id="Import table from File" icon-id="" tooltip-id="" toggle-id="" execute-action=""/>
   <popup-item item-id="112" pos-id="8" label-id="Import from File" icon-id="" tooltip-id="" accel-id="Ctrl+I" toggle-id="" execute-action=""/>
-  <!-- popup-item item-id="122" pos-id="9" label-id="Export to File" icon-id="" tooltip-id="" accel-id="Ctrl+E" toggle-id="" execute-action=""/-->
-  <separator pos-id="10"/> 
+  <popup-item item-id="113" pos-id="9" label-id="Explore MED File" icon-id="" tooltip-id="" accel-id="Ctrl+M" toggle-id="" execute-action=""/>
+  <!--popup-item item-id="122" pos-id="10" label-id="Export to File" icon-id="" tooltip-id="" accel-id="Ctrl+E" toggle-id="" execute-action=""/-->
+  <separator pos-id="11"/> 
 </menu-item>
   
 <!-- ************************* Visualization (menubar) ************************************** -->
@@ -27,7 +29,9 @@
   <popup-item item-id="4013" pos-id="" label-id="Vectors" icon-id="Visu_vectors.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
   <popup-item item-id="4014" pos-id="" label-id="Iso Surfaces" icon-id="Visu_isosurfaces.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
   <popup-item item-id="4015" pos-id="" label-id="Cut Planes" icon-id="Visu_cutplane.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-  <!--popup-item item-id="4016" pos-id="" label-id="Same As..." icon-id="Visu_sameas.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/-->
+  <popup-item item-id="4018" pos-id="" label-id="Cut Lines" icon-id="Visu_cutlines.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
+  <popup-item item-id="4016" pos-id="" label-id="Stream Lines" icon-id="Visu_streamlines.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
+  <!--popup-item item-id="4017" pos-id="" label-id="Same As..." icon-id="Visu_sameas.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/-->
 </menu-item>
                        
 <!-- ************************* Selection (menubar) ************************************** -->
@@ -66,6 +70,9 @@
   <submenu label-id="Visu" item-id="" pos-id="-1">
     <popup-item item-id="51" pos-id="" label-id="Scalar Bar" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
     <popup-item item-id="52" pos-id="" label-id="Sweeping" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
+    <separator pos-id=""/>
+    <popup-item item-id="53" pos-id="" label-id="Full med loading" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
+    <!-- popup-item item-id="54" pos-id="" label-id="Build default Prs3d" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/ -->
   </submenu>
   <endsubmenu />   
   <separator pos-id="-1"/> 
   <toolbutton-item item-id="430" pos-id="" label-id="Scaling" icon-id="Visu_scaling.png" tooltip-id="Scaling" accel-id="" toggle-id="" execute-action=""/>
 </toolbar>
 
-<toolbar label-id="Visualisation Toolbar">
+<toolbar label-id="Visualization Toolbar">
   <toolbutton-item item-id="4011" pos-id="" label-id="Scalar Map" icon-id="Visu_scalars.png" tooltip-id="Scalar Map" accel-id="" toggle-id="" execute-action=""/>
   <toolbutton-item item-id="4012" pos-id="" label-id="Deformed shape" icon-id="Visu_deformed.png" tooltip-id="Deformed Shape" accel-id="" toggle-id="" execute-action=""/>
   <toolbutton-item item-id="4013" pos-id="" label-id="Vectors" icon-id="Visu_vectors.png" tooltip-id="Vectors" accel-id="" toggle-id="" execute-action=""/>
   <toolbutton-item item-id="4014" pos-id="" label-id="Iso Surfaces" icon-id="Visu_isosurfaces.png" tooltip-id="Iso Surfaces" accel-id="" toggle-id="" execute-action=""/>
   <toolbutton-item item-id="4015" pos-id="" label-id="Cut Planes" icon-id="Visu_cutplane.png" tooltip-id="Cut Planes" accel-id="" toggle-id="" execute-action=""/>
-  <!--toolbutton-item item-id="4016" pos-id="" label-id="Same As..." icon-id="Visu_sameas.png" tooltip-id="Same As" accel-id="" toggle-id="" execute-action=""/-->
+  <toolbutton-item item-id="4018" pos-id="" label-id="Cut Lines" icon-id="Visu_cutlines.png" tooltip-id="Cut Lines" accel-id="" toggle-id="" execute-action=""/>
+  <toolbutton-item item-id="4016" pos-id="" label-id="Stream Lines" icon-id="Visu_streamlines.png" tooltip-id="Stream Lines" accel-id="" toggle-id="" execute-action=""/>
+  <!--toolbutton-item item-id="4017" pos-id="" label-id="Same As..." icon-id="Visu_sameas.png" tooltip-id="Same As" accel-id="" toggle-id="" execute-action=""/-->
 </toolbar>
 
 <toolbar label-id="Selection Toolbar">
index 690201897739d0d1451f3f7da7932f3d1815e890..d5b5d3912bc1ef3800b992e4f72626e6a0ec3c66 100644 (file)
@@ -25,9 +25,9 @@
 #  Module : VISU
 
 top_srcdir=@top_srcdir@
-top_builddir=../../..
+top_builddir=../..
 srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl
+VPATH=.:@srcdir@
 
 
 @COMMENCE@
@@ -44,7 +44,9 @@ LIB_SRC = VISU_Convertor.cxx VISU_Convertor_impl.cxx VISU_ConvertorUtils.cxx \
 BIN = VISUConvertor
 BIN_SRC = 
 
-CPPFLAGS+= -ftemplate-depth-32  $(VTK_INCLUDES) $(MED2_INCLUDES) $(QT_INCLUDES)
-LDFLAGS+= $(VTK_LIBS) $(MED2_LIBS) $(HDF5_LIBS) $(QT_LIBS)
+CPPFLAGS+= -ftemplate-depth-32 $(VTK_INCLUDES) $(MED2_INCLUDES) $(QT_INCLUDES) \
+       -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS+= $(VTK_LIBS) $(MED2_LIBS) $(HDF5_LIBS) $(QT_LIBS) \
+        -L${KERNEL_ROOT_DIR}/lib/salome
 
 @CONCLUDE@
index 2e69db2f30d45be506402d148eb364e977c1c236..0751cdb2beb8ba0e7e2ed9708fd618af16e19569 100644 (file)
@@ -32,6 +32,6 @@ VPATH=.:@srcdir@
 
 @COMMENCE@
 
-SUBDIRS = OBJECT VISU_I VISUGUI VISU_SWIG
+SUBDIRS = CONVERTOR PIPELINE OBJECT VISU_I VISUGUI VISU_SWIG
 
 @MODULE@
index 66d61f25446935881a96d174abd6c6d5be9c1d14..310b27250ca343566f4db82207576831dc428737 100644 (file)
@@ -32,13 +32,12 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 
 @COMMENCE@
 
-EXPORT_HEADERS = VISU_Actor.h VISU_LookupTable.hxx VISU_ScalarBarActor.hxx
-
+EXPORT_HEADERS = VISU_Actor.h VISU_MeshAct.h VISU_ScalarMapAct.h VISU_VectorsAct.h
 
 # Libraries targets
 
 LIB = libVisuObject.la
-LIB_SRC = VISU_Actor.cxx VISU_LookupTable.cxx VISU_ScalarBarActor.cxx
+LIB_SRC = VISU_Actor.cxx VISU_MeshAct.cxx VISU_ScalarMapAct.cxx VISU_VectorsAct.cxx
 
 LIB_CLIENT_IDL = 
 
@@ -46,13 +45,12 @@ LIB_CLIENT_IDL =
 BIN = 
 BIN_SRC        =
 
-CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) \
-       $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
-LDFLAGS+=$(QT_MT_LIBS) $(VTK_LIBS) $(OGL_LIBS) $(PYTHON_LIBS) \
-       -lSalomeObject -L${KERNEL_ROOT_DIR}/lib/salome
+CPPFLAGS+=$(OCC_INCLUDES) $(VTK_INCLUDES) \
+       -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS+=$(VTK_LIBS) -lSalomeObject \
+       -lVisuPipeLine -L${KERNEL_ROOT_DIR}/lib/salome
 
 %_moc.cxx: %.h
        $(MOC) $< -o $@
 
-
 @CONCLUDE@
index 814ef8141d36e0435e8e1bc359326ac307b366d8..6a2ccc1087e0a5583857781406e14788ddffdc7e 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VISU_Actor.h"
-#include "VISU_LookupTable.hxx"
-#include "VISU_ScalarBarActor.hxx"
+#include "VISU_PipeLine.hxx"
+#include "SALOME_PassThroughFilter.h"
  
 // VTK Includes
-#include <vtkActor.h>
 #include <vtkProperty.h>
+#include <vtkDataSetMapper.h>
 #include <vtkShrinkPolyData.h>
-#include <vtkFeatureEdges.h>
 #include <vtkObjectFactory.h>
 
-static int VISU_POINT_SIZE = 3;
+using namespace std;
 
 //=======================================================================
 
-VISU_Actor* VISU_Actor::New(){
-  vtkObject* ret = vtkObjectFactory::CreateInstance("VISU_Actor");
-  if(ret) return (VISU_Actor*)ret;
-  return new VISU_Actor;
-} 
+vtkStandardNewMacro(VISU_Actor);
 
 VISU_Actor::VISU_Actor(){
   myIsShrunk = false;
   myIsShrinkable = false;
   myParent = this;
+  myPipeLine = NULL;
   myPrs3d = NULL;
 
   myIO = NULL;
@@ -78,35 +73,57 @@ void VISU_Actor::setIO(const Handle(SALOME_InteractiveObject)& theIO){
   myName = theIO->getName(); 
 }
 
-void VISU_Actor::setPrs3d(VISU::Prs3d_i* thePrs3d){ 
+void VISU_Actor::SetPrs3d(VISU::Prs3d_i* thePrs3d){ 
   myPrs3d = thePrs3d;
 }
 
-void VISU_Actor::SetParent(VISU_Actor* theParent){ 
-  myParent = theParent;
+void VISU_Actor::SetPipeLine(VISU_PipeLine* thePipeLine) throw(std::runtime_error&){
+  if (myPipeLine != thePipeLine){
+    if (myPipeLine != NULL) myPipeLine->UnRegister(this);
+    myPipeLine = thePipeLine;
+    if (myPipeLine != NULL) myPipeLine->Register(this);
+    this->Modified();
+    vtkMapper *aMapper = myPipeLine->GetMapper();
+    vtkDataSet *aDataSet = aMapper->GetInput();
+    if(!aDataSet)
+      throw std::runtime_error("VISU_Actor::SetPipeLine >> There is no input data");
+    aDataSet->Update();
+    static float eps = VTK_LARGE_FLOAT * 0.1 ;
+    if(aDataSet->GetLength() > eps)
+      throw std::runtime_error("VISU_Actor::SetPipeLine >> Diagonal of the actor is too large");
+    if(!aDataSet->GetNumberOfCells())
+      throw std::runtime_error("VISU_Actor::SetPipeLine >> There is no visible elements");
+    SetShrinkable(aDataSet->GetNumberOfCells() > 10);
+
+    vtkDataSetMapper* aNewMapper = vtkDataSetMapper::New();
+    aNewMapper->SetInput(aDataSet);
+    aMapper->ShallowCopy(aMapper);
+    SetMapper(aNewMapper);
+    aNewMapper->Delete();
+  }
 }
 
-void VISU_Actor::SetMapper(vtkMapper* theMapper){
-  SALOME_Actor::SetMapper(theMapper);
+void VISU_Actor::SetParent(VISU_Actor* theParent){ 
+  myParent = theParent;
 }
 
 void VISU_Actor::SetShrinkable(bool theIsShrinkable){
   myIsShrinkable = theIsShrinkable;
 }
 
-void VISU_Actor::setShrink(float theFactor){
+void VISU_Actor::SetShrink(float theFactor){
   if(!myIsShrinkable || myIsShrunk) return;
   vtkShrinkPolyData *aShrinkFilter = vtkShrinkPolyData::New();
   aShrinkFilter->SetShrinkFactor(theFactor);
   // use for post-filtering
   aShrinkFilter->SetInput(myPassFilter[2]->GetPolyDataOutput());
   myPassFilter[3]->SetInput(aShrinkFilter->GetOutput());
-  myPassFilter[3]->Modified();
+  aShrinkFilter->Register(myPassFilter[3]);
   aShrinkFilter->Delete();
   myIsShrunk = true;
 }
 
-void VISU_Actor::unShrink(){
+void VISU_Actor::UnShrink(){
   if(!myIsShrunk) return;
   myPassFilter[3]->SetInput(myPassFilter[2]->GetPolyDataOutput());
   myPassFilter[3]->Modified();
@@ -137,16 +154,6 @@ float VISU_Actor::GetLineWidth(){
   return GetProperty()->GetLineWidth();
 }
 
-void VISU_Actor::SetRepresentation(int theMode) { 
-  GetProperty()->SetRepresentation(theMode);
-  if(theMode == 0) 
-    GetProperty()->SetPointSize(VISU_POINT_SIZE);
-}
-
-int VISU_Actor::GetRepresentation(){ 
-  return GetProperty()->GetRepresentation();
-}
-
 void VISU_Actor::ShallowCopy(vtkProp *prop){
   VISU_Actor *anActor = VISU_Actor::SafeDownCast(prop);
   if(anActor != NULL){
@@ -165,202 +172,3 @@ void VISU_Actor::highlight(Standard_Boolean highlight) {
       if(ishighlighted)        ishighlighted=false;
   }
 }
-
-//=======================================================================
-
-VISUScalarMap_Actor* VISUScalarMap_Actor::New(){
-  vtkObject* ret = vtkObjectFactory::CreateInstance("VISUScalarMap_Actor");
-  if(ret) return (VISUScalarMap_Actor*)ret;
-  return new VISUScalarMap_Actor;
-} 
-
-VISUScalarMap_Actor::VISUScalarMap_Actor(){
-  myScalarBar = VISU_ScalarBarActor::New();
-  GetProperty()->FrontfaceCullingOff();
-  GetProperty()->BackfaceCullingOff();
-}
-
-VISUScalarMap_Actor::~VISUScalarMap_Actor(){
-  myScalarBar->Delete();
-}
-
-void VISUScalarMap_Actor::AddToRender(vtkRenderer* theRenderer){
-  SALOME_Actor::AddToRender(theRenderer);
-  if(myScalarBar)
-    theRenderer->AddActor2D(myScalarBar);
-}
-
-void VISUScalarMap_Actor::RemoveFromRender(vtkRenderer* theRenderer){
-  SALOME_Actor::RemoveFromRender(theRenderer);
-  if(myScalarBar)
-    theRenderer->RemoveActor(myScalarBar);
-}
-
-void VISUScalarMap_Actor::SetVisibility(int theMode){
-  SALOME_Actor::SetVisibility(theMode);
-  if(myScalarBar) myScalarBar->SetVisibility(*myBarVisibility && theMode);
-}
-
-int VISUScalarMap_Actor::GetVisibility(){
-  return SALOME_Actor::GetVisibility();
-}
-
-void VISUScalarMap_Actor::SetBarVisibility(const bool* theMode){
-  myBarVisibility = theMode;
-  if(myScalarBar) myScalarBar->SetVisibility(*myBarVisibility);
-}
-
-//=======================================================================
-
-VISUMesh_Actor* VISUMesh_Actor::New(){
-  vtkObject* ret = vtkObjectFactory::CreateInstance("VISUMesh_Actor");
-  if(ret) return (VISUMesh_Actor*)ret;
-  return new VISUMesh_Actor;
-} 
-
-VISUMesh_Actor::VISUMesh_Actor(){
-  myEdgeMapper = vtkPolyDataMapper::New();
-  mySurfaceActor = VISU_Actor::New();
-  mySurfaceActor->SetParent(this);
-  mySurfaceActor->GetProperty()->SetPointSize(VISU_POINT_SIZE);
-  mySurfaceActor->GetProperty()->FrontfaceCullingOff();
-  mySurfaceActor->GetProperty()->BackfaceCullingOff();
-  mySurfaceActor->SetRepresentation(2);
-
-  myEdgeActor = VISU_Actor::New();
-  myEdgeActor->SetParent(this);
-  myEdgeActor->PickableOff();
-  myEdgeActor->GetProperty()->SetPointSize(VISU_POINT_SIZE);
-  myEdgeActor->GetProperty()->FrontfaceCullingOff();
-  myEdgeActor->GetProperty()->BackfaceCullingOff();
-  myEdgeActor->SetRepresentation(2);
-
-  myRepresentation = 2; //SURFACE
-  myVisibility = 1; //On
-}
-
-VISUMesh_Actor::~VISUMesh_Actor(){
-  myEdgeMapper->Delete();
-  mySurfaceActor->Delete();
-  myEdgeActor->Delete();
-}
-
-void VISUMesh_Actor::setIO(const Handle(SALOME_InteractiveObject)& theIO){
-  mySurfaceActor->setIO(theIO);
-  myEdgeActor->setIO(theIO);
-}
-
-void VISUMesh_Actor::setPrs3d(VISU::Prs3d_i* thePrs3d){ 
-  if(thePrs3d){
-    VISU_Actor::setPrs3d(thePrs3d);
-    mySurfaceActor->setPrs3d(thePrs3d);
-    myEdgeActor->setPrs3d(thePrs3d);
-  }
-}
-
-void VISUMesh_Actor::AddToRender(vtkRenderer* theRenderer){
-  theRenderer->AddActor(mySurfaceActor);
-  theRenderer->AddActor(myEdgeActor);
-}
-
-void VISUMesh_Actor::RemoveFromRender(vtkRenderer* theRenderer){
-  theRenderer->RemoveActor(mySurfaceActor);
-  theRenderer->RemoveActor(myEdgeActor);
-}
-
-void VISUMesh_Actor::SetMapper(vtkMapper* theMapper){
-  VISU_Actor::SetMapper(theMapper);
-  SALOME_PassThroughFilter* aPassFilter = SALOME_PassThroughFilter::New();
-  aPassFilter->SetInput(theMapper->GetInput());
-  vtkFeatureEdges *aFeatureEdges = vtkFeatureEdges::New();
-  aFeatureEdges->SetInput(aPassFilter->GetPolyDataOutput());
-  aFeatureEdges->BoundaryEdgesOn();
-  aFeatureEdges->ManifoldEdgesOn();
-  myEdgeMapper->SetInput(aFeatureEdges->GetOutput());
-  aFeatureEdges->Delete();
-  myEdgeMapper->ScalarVisibilityOff();
-  myEdgeActor->SetMapper(myEdgeMapper);
-  mySurfaceActor->SetMapper(theMapper);
-}
-
-void VISUMesh_Actor::SetTransform(SALOME_Transform* theTransform){
-  mySurfaceActor->SetTransform(theTransform);
-  myEdgeActor->SetTransform(theTransform);
-}
-
-void VISUMesh_Actor::SetShrinkable(bool theIsShrinkable){
-  myIsShrinkable = theIsShrinkable;
-  myEdgeActor->SetShrinkable(myIsShrinkable);
-  mySurfaceActor->SetShrinkable(myIsShrinkable);
-}
-
-vtkProperty* VISUMesh_Actor::GetProperty(){ 
-  mySurfaceActor->GetProperty();
-} 
-
-void VISUMesh_Actor::SetProperty(vtkProperty* theProperty){ 
-  mySurfaceActor->SetProperty(theProperty);
-}
-
-vtkProperty* VISUMesh_Actor::GetEdgeProperty(){ 
-  myEdgeActor->GetProperty();
-} 
-
-void VISUMesh_Actor::SetEdgeProperty(vtkProperty* theProperty){ 
-  myEdgeActor->SetProperty(theProperty);
-}
-
-void VISUMesh_Actor::SetLineWidth(float theLineWidth){
-  GetProperty()->SetLineWidth(theLineWidth);
-  GetEdgeProperty()->SetLineWidth(theLineWidth);
-}
-
-float VISUMesh_Actor::GetLineWidth(){
-  return GetProperty()->GetLineWidth();
-}
-
-void VISUMesh_Actor::setShrink(float theFactor){
-  if(!myIsShrinkable || myIsShrunk || myRepresentation == 0) return;
-  mySurfaceActor->setShrink(theFactor);
-  myIsShrunk = true;
-  SetRepresentation(myRepresentation);
-}
-
-void VISUMesh_Actor::unShrink(){
-  if(!myIsShrunk) return;
-  mySurfaceActor->unShrink();
-  myIsShrunk = false;
-  SetRepresentation(myRepresentation);
-}
-
-void VISUMesh_Actor::SetRepresentation(int theMode){
-  if(theMode < 0 || theMode >2) return;
-  myRepresentation = theMode;
-  myEdgeActor->SetRepresentation(2);
-  mySurfaceActor->SetRepresentation(myRepresentation);
-  switch(theMode){
-  case 0: //POINTS
-    myEdgeActor->VisibilityOff();
-    mySurfaceActor->VisibilityOn();
-    break;
-  case 1: //WIREFRAME
-    myEdgeActor->VisibilityOff();
-    mySurfaceActor->VisibilityOn();
-    break;
-  case 2: //SURFACE
-    myEdgeActor->SetVisibility(!myIsShrunk);
-    mySurfaceActor->VisibilityOn();
-    break;
-  }
-  myRepresentation = theMode;
-}
-
-void VISUMesh_Actor::SetVisibility(int theMode){
-  SetRepresentation(myRepresentation);
-  myEdgeActor->SetVisibility(theMode);
-  mySurfaceActor->SetVisibility(theMode);
-  myVisibility = theMode;
-}
-
-//=======================================================================
-
index 641a944240e471c4c44f401b8e35c073322a63df..1d8b34186b12f9ddacae59e858be6293772da2e9 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
-
 #ifndef VISU_ACTOR_H
 #define VISU_ACTOR_H
 
 #include "SALOME_Actor.h"
+
+#include <stdexcept>
 #include <string>
 
 class vtkProp;
-class vtkPolyData;
 class vtkProperty;
-class vtkPolyDataMapper;
 
 namespace VISU { 
   class Prs3d_i;
 }
-class VISU_ScalarBarActor;
+class VISU_PipeLine;
 
 #ifdef _WIN_32
 #define VTKOCC_EXPORT __declspec (dllexport)
@@ -59,8 +57,11 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor {
 
   virtual void setIO(const Handle(SALOME_InteractiveObject)& theIO);
 
-  VISU::Prs3d_i* getPrs3d(){ return myPrs3d;}
-  virtual void setPrs3d(VISU::Prs3d_i* thePrs3d);
+  VISU::Prs3d_i* GetPrs3d(){ return myPrs3d;}
+  virtual void SetPrs3d(VISU::Prs3d_i* thePrs3d);
+
+  virtual VISU_PipeLine* GetPipeLine() { return myPipeLine;}
+  virtual void SetPipeLine(VISU_PipeLine* thePipeLine) throw(std::runtime_error&);
 
   VISU_Actor* GetParent(){ return myParent;}
   virtual void SetParent(VISU_Actor* theParent);
@@ -71,14 +72,12 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor {
   void  SetOpacity(float opa) {};
   float GetOpacity() { return 0;};
 
-  virtual void SetMapper(vtkMapper* theMapper); 
-
   virtual void SetShrinkable(bool theIsShrinkable);
   virtual bool GetShrinkable() { return myIsShrinkable;}
 
-  virtual bool isShrunk() { return myIsShrunk;}
-  virtual void setShrink(float theFactor = 0.8); 
-  virtual void unShrink(); 
+  virtual bool IsShrunk() { return myIsShrunk;}
+  virtual void SetShrink(float theFactor = 0.8); 
+  virtual void UnShrink(); 
 
   virtual void SetVisibility(int theMode);
   virtual int GetVisibility();
@@ -89,9 +88,6 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor {
   virtual void SetLineWidth(float theLineWidth);
   virtual float GetLineWidth();
 
-  virtual void SetRepresentation(int theMode);
-  virtual int GetRepresentation();
-    
   bool IsHighlighting;
   std::string myFieldName;
 
@@ -100,82 +96,10 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor {
  
   VISU_Actor* myParent;
   VISU::Prs3d_i* myPrs3d;
+  VISU_PipeLine* myPipeLine;
   vtkProperty* HighlightProperty;
   bool myIsShrinkable;
   bool myIsShrunk;
 };
 
-//=======================================================================
-
-class VTKOCC_EXPORT VISUScalarMap_Actor : public VISU_Actor {
- public:
-  vtkTypeMacro(VISUScalarMap_Actor,VISU_Actor);
-  static VISUScalarMap_Actor* New();
-  ~VISUScalarMap_Actor();
-
-  virtual void AddToRender(vtkRenderer* theRenderer); 
-  virtual void RemoveFromRender(vtkRenderer* theRenderer);
-
-  virtual void SetVisibility(int theMode);
-  virtual int GetVisibility();
-
-  virtual VISU_ScalarBarActor* GetScalarBar(){ return myScalarBar;}
-
-  virtual void SetBarVisibility(const bool* theMode);
-  virtual bool GetBarVisibility(){ return *myBarVisibility;}
-
- protected:
-  VISUScalarMap_Actor();
-  const bool* myBarVisibility;
-  VISU_ScalarBarActor* myScalarBar;
-};
-
-//=======================================================================
-
-class VTKOCC_EXPORT VISUMesh_Actor : public VISU_Actor {
- public:
-  vtkTypeMacro(VISUMesh_Actor,VISU_Actor);
-  static VISUMesh_Actor* New();
-  ~VISUMesh_Actor();
-
-  virtual void setIO(const Handle(SALOME_InteractiveObject)& theIO);
-  virtual void setPrs3d(VISU::Prs3d_i* thePrs3d);
-
-  virtual void AddToRender(vtkRenderer* theRenderer); 
-  virtual void RemoveFromRender(vtkRenderer* theRenderer);
-
-  virtual void SetMapper(vtkMapper* theMapper); 
-  virtual void SetTransform(SALOME_Transform* theTransform); 
-
-  virtual vtkProperty* GetProperty(); 
-  virtual void SetProperty(vtkProperty* theProperty);
-
-  virtual vtkProperty* GetEdgeProperty(); 
-  virtual void SetEdgeProperty(vtkProperty* theProperty);
-
-  virtual void SetLineWidth(float theLineWidth);
-  virtual float GetLineWidth();
-
-  virtual void SetRepresentation(int theMode);
-  virtual int GetRepresentation() { return myRepresentation;};
-
-  virtual void SetVisibility(int theMode);
-  virtual int GetVisibility() { return myVisibility;}
-
-  virtual void SetShrinkable(bool theIsShrinkable);
-
-  virtual void setShrink(float theFactor = 0.8); 
-  virtual void unShrink(); 
-
- protected:
-  VISUMesh_Actor();
-  int myRepresentation, myVisibility;
-  vtkPolyDataMapper* myEdgeMapper;
-  VISU_Actor *mySurfaceActor, *myEdgeActor;
-};
-
-//=======================================================================
-
 #endif //VISU_ACTOR_H
-
-
index ae6728c96618db38c261298cce09b29280ec8f21..7cdd24fbe23f89a56a4830cacf7d50b03476a090 100644 (file)
@@ -25,9 +25,9 @@
 #  Module : VISU
 
 top_srcdir=@top_srcdir@
-top_builddir=../../..
+top_builddir=../..
 srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl
+VPATH=.:@srcdir@
 
 
 @COMMENCE@
@@ -58,7 +58,8 @@ LIB_SRC = VISU_PipeLine.cxx VISU_PipeLineUtils.cxx \
 BIN = VISUPipeLine
 BIN_SRC        = 
 
-CPPFLAGS+= $(VTK_INCLUDES)
-LDFLAGS+= $(VTK_LIBS) -lSalomeVTKFilter -lVisuConvertor
+CPPFLAGS+= $(VTK_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
+LDFLAGS+= $(VTK_LIBS) -lSalomeVTKFilter -lVisuConvertor \
+        -L${KERNEL_ROOT_DIR}/lib/salome
 
 @CONCLUDE@
index b0f06af9c224f9b69cda745507d604221f350c6a..6757a4ca6e84989ccfb2df53bbff076970a6eff9 100644 (file)
@@ -65,7 +65,8 @@ LIB_SRC =     VisuGUI.cxx \
                VisuGUI_NonIsometricDlg.cxx \
                 VisuGUI_StreamLinesDlg.cxx \
                 VisuGUI_TimeAnimation.cxx \
-               VisuGUI_CutLinesDlg.cxx 
+               VisuGUI_CutLinesDlg.cxx \
+               VisuGUI_FileDlg.cxx
 
 LIB_MOC = \
                VisuGUI.h \
@@ -86,7 +87,8 @@ LIB_MOC = \
                VisuGUI_NonIsometricDlg.h \
                 VisuGUI_StreamLinesDlg.h \
                 VisuGUI_TimeAnimation.h \
-               VisuGUI_CutLinesDlg.h
+               VisuGUI_CutLinesDlg.h \
+               VisuGUI_FileDlg.h
 
 LIB_CLIENT_IDL = SALOME_Exception.idl \
                 VISU_Gen.idl \
@@ -101,7 +103,8 @@ LIB_SERVER_IDL =
 
 # additionnal information to compil and link file
 
-CPPFLAGS +=  -ftemplate-depth-32 $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) \
+CPPFLAGS +=  -ftemplate-depth-32 $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) \
+       $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) \
        -I${KERNEL_ROOT_DIR}/include/salome
 
 CXXFLAGS +=  -ftemplate-depth-32 $(OCC_CXXFLAGS) \
index 7dfa1d8af927a0a83dca21948f3b59bc76734ae4..23a04a9d9b0840cfcb1e07e263a17dce9c788c13 100644 (file)
@@ -121,6 +121,10 @@ msgstr "Iso Surface"
 msgid "VisuGUI_IsoSurfacesDlg::Number of surfaces"
 msgstr ""
 
+#: VisuGUI_IsoSurfacesDlg.cxx:170
+msgid "VisuGUI_IsoSurfacesDlg::WRN_LOGARITHMIC_RANGE_ISOSURF"
+msgstr "Logarithmic scaling: use range values > 0"
+
 #: VisuGUI_MagnitudeDlg.cxx:43
 msgid "VisuGUI_MagnitudeDlg::VISU_BUT_CANCEL"
 msgstr "Cancel"
@@ -345,3 +349,9 @@ msgstr "Can't visualize current object"
 
 msgid "WRN_CANT_VISUALIZE_PRS"
 msgstr "The presentation can't be visualized.\nNull actor is created."
+
+msgid "LBL_SOURCE_TYPE"
+msgstr "Source type"
+
+msgid "MSG_NO_ANIMATIONDATA"
+msgstr "There is no data for animation"
index 244be8bfa08e06f182eabbbe61403e337a4c4214..7b7a9579d689426c66194eeb67dae72e60da6080 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI.h"
+
+#include "VISU_Gen_i.hh"
+#include "VISU_Result_i.hh"
+#include "VISU_PrsObject_i.hh"
+#include "VISU_ViewManager_i.hh"
+
+#include "VISU_PipeLine.hxx"
+
+#include "VISU_Prs3d_i.hh"
+#include "VISU_Mesh_i.hh"
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_IsoSurfaces_i.hh"
+#include "VISU_DeformedShape_i.hh"
+#include "VISU_CutPlanes_i.hh"
+#include "VISU_CutLines_i.hh"
+#include "VISU_Vectors_i.hh"
+#include "VISU_StreamLines_i.hh"
+#include "VISU_Table_i.hh"
+
+#include "VISU_Actor.h"
+#include "VISU_MeshAct.h"
+
 #include "VisuGUI_PhaseDlg.h"
 #include "VisuGUI_MagnitudeDlg.h"
 #include "VisuGUI_PhaseMagnitudeDlg.h"
@@ -47,14 +68,6 @@ using namespace std;
 #include "VisuGUI_SelVectCompDlg.h"
 #include "VisuGUI_NonIsometricDlg.h"
 
-#include "VISU_Gen_i.hh"
-#include "VISU_Result_i.hh"
-#include "VISU_Extractor.hxx"
-#include "VISU_Table_i.hh"
-#include "VISU_ViewManager_i.hh"
-#include "VISU_LookupTable.hxx"
-#include "VISU_ScalarBarActor.hxx"
-
 #include "SALOMEGUI_ImportOperation.h"
 #include "SALOMEGUI_QtCatchCorbaException.hxx"
 #include "utilities.h"
@@ -81,6 +94,7 @@ using namespace std;
 #include "Plot2d_SetupPlot2dDlg.h"
 #include "Plot2d_ViewFrame.h"
 #include "VTKViewer_ViewFrame.h"
+#include "VisuGUI_FileDlg.h"
 
 // QT Includes
 #define  INCLUDE_MENUITEM_DEF
@@ -122,7 +136,9 @@ static int MYCHECKTIME = 0;
 #endif
 #include <Utils_Timer.hxx>
 
-#ifdef DEBUG
+using namespace std;
+
+#ifdef _DEBUG_
 static int MYDEBUG = 0;
 static int MYDEBUGWITHFILES = 0;
 #else
@@ -159,6 +175,75 @@ VISU::VISU_Gen_i* VisuGUI::GetVisuGen(){
   return VISU::VISU_Gen_i::GetVisuGenImpl();
 }
 
+static int ComputeVisiblePropBounds(VTKViewer_ViewFrame* theViewFrame, float allBounds[6], 
+                                   const char* theActorClassName = "VISU_Actor")
+{
+  vtkRenderer *aRen = theViewFrame->getRenderer();
+  vtkActorCollection *anActColl = aRen->GetActors(); 
+  vtkProp    *prop;
+  float      *bounds;
+  int        nothingVisible=1;
+
+  allBounds[0] = allBounds[2] = allBounds[4] = VTK_LARGE_FLOAT;
+  allBounds[1] = allBounds[3] = allBounds[5] = -VTK_LARGE_FLOAT;
+  // loop through all props
+  for (anActColl->InitTraversal(); (prop = anActColl->GetNextProp()); ){
+    // if it's invisible, or has no geometry, we can skip the rest 
+    if ( prop->GetVisibility() && prop->IsA(theActorClassName)){
+      bounds = prop->GetBounds();
+      // make sure we haven't got bogus bounds
+      if ( bounds != NULL &&
+           bounds[0] > -VTK_LARGE_FLOAT && bounds[1] < VTK_LARGE_FLOAT &&
+           bounds[2] > -VTK_LARGE_FLOAT && bounds[3] < VTK_LARGE_FLOAT &&
+           bounds[4] > -VTK_LARGE_FLOAT && bounds[5] < VTK_LARGE_FLOAT )
+        {
+         nothingVisible = 0;
+         if (bounds[0] < allBounds[0]) allBounds[0] = bounds[0]; 
+         if (bounds[1] > allBounds[1]) allBounds[1] = bounds[1]; 
+         if (bounds[2] < allBounds[2]) allBounds[2] = bounds[2]; 
+         if (bounds[3] > allBounds[3]) allBounds[3] = bounds[3]; 
+         if (bounds[4] < allBounds[4]) allBounds[4] = bounds[4]; 
+         if (bounds[5] > allBounds[5]) allBounds[5] = bounds[5]; 
+        }//not bogus
+      }
+    }  
+  return nothingVisible;
+}
+
+VisuGUI::CameraOrient VisuGUI::SetFitAll(VTKViewer_ViewFrame* theViewFrame){ 
+  static float PRECISION = 0.000001;
+  static float DEVIATION = 600;
+  float XYZ_Bnd[6];
+  if(ComputeVisiblePropBounds(theViewFrame,XYZ_Bnd)) return e3D;
+
+  float absX = XYZ_Bnd[1]-XYZ_Bnd[0];
+  float absY = XYZ_Bnd[3]-XYZ_Bnd[2];
+  
+  float absZ = XYZ_Bnd[5]-XYZ_Bnd[4];
+  
+  CameraOrient aCameraOrient = e3D;
+  if(absX <= PRECISION) aCameraOrient = eFront;
+  else {if(absY <= PRECISION) aCameraOrient = eLeft;
+  else {if(absZ <= PRECISION) aCameraOrient = eTop;}}
+  
+    float dev_abs_XY = absX / absY;
+    float dev_abs_YZ = absY / absZ;
+    float dev_abs_XZ = absX / absZ;
+    if(dev_abs_XY >= DEVIATION || 1./dev_abs_YZ >= DEVIATION) aCameraOrient = eLeft;
+    else{if(1./dev_abs_XY >= DEVIATION || 1./dev_abs_XZ >= DEVIATION) aCameraOrient = eFront; 
+    else {if(dev_abs_XZ >= DEVIATION || dev_abs_YZ >= DEVIATION) aCameraOrient = eTop;}}  
+  switch(aCameraOrient){
+  case eFront: theViewFrame->onViewFront();  break;
+  case eLeft:  theViewFrame->onViewLeft();   break;
+  case eTop:   theViewFrame->onViewTop();    break;
+  case e3D:    theViewFrame->onViewReset();  break; 
+  }
+  theViewFrame->getRenderer()->ResetCameraClippingRange();
+  theViewFrame->onViewFitAll();
+}
 QAD_Desktop* VisuGUI::GetDesktop(){
   return QAD_Application::getDesktop() ;
 }
@@ -273,23 +358,6 @@ int GetScalarMode(VISU::Result_i* theResult, const char* theFieldName){
 
 VisuGUI::VisuGUI(){}
 
-
-VisuGUI* VisuGUI::GetOrCreateVisuGUI( QAD_Desktop* desktop ){
-  if(!visuGUI){
-    static VisuGUI VISUGUI;
-    visuGUI = &VISUGUI;
-  }
-  return visuGUI;
-}
-
-/* ********************************************************************************* */
-/* Function to return VisuGUI object                                                */
-/* ********************************************************************************* */
-VisuGUI* VisuGUI::GetVisuGUI( )
-{
-       return VisuGUI::GetOrCreateVisuGUI(QAD_Application::getDesktop());
-}
-
 /* ==================================================================================== */
 /* ==================================================================================== */
 /*                                     ONGUI EVENT                                     */
@@ -303,7 +371,7 @@ static int isStudyLocked(const SALOMEDS::Study_var& theStudy){
 static int checkLock(const SALOMEDS::Study_var& theStudy) {
   if (isStudyLocked(theStudy)) {
     QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
-                          QObject::tr("WARNING"), 
+                          QObject::tr("WRN_WARNING"), 
                           QObject::tr("WRN_STUDY_LOCKED"),
                           QObject::tr("BUT_OK") );
     return true;
@@ -316,22 +384,20 @@ static int checkLock(const SALOMEDS::Study_var& theStudy) {
 bool VisuGUI::OnGUIEvent(int theCommandID,  QAD_Desktop* parent)
 {
   try{
-  VisuGUI::GetOrCreateVisuGUI(parent);
-  QString VisuInputDir = getVisuInputDir();
-  QString VisuOutputDir = getVisuOutputDir();
-  vtkRenderer *theRenderer = GetRenderer();
-
-  SALOMEDS::Study_var aStudy = GetActiveStudy()->getStudyDocument(); //Document OCAF de l'etude active
-  SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
-  SALOMEDS::GenericAttribute_var anAttr;
-  SALOMEDS::AttributeName_var    aName;
-  SALOMEDS::AttributeIOR_var     anIOR;
-
-  switch (theCommandID)
-    {
-       /* ======================================================================================== */
-       /* Define Selection Mode                                                                  */
-       /* ======================================================================================== */
+    QString VisuInputDir = getVisuInputDir();
+    QString VisuOutputDir = getVisuOutputDir();
+    vtkRenderer *theRenderer = GetRenderer();
+    
+    SALOMEDS::Study_var aStudy = GetActiveStudy()->getStudyDocument(); //Document OCAF de l'etude active
+    SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
+    SALOMEDS::GenericAttribute_var anAttr;
+    SALOMEDS::AttributeName_var    aName;
+    SALOMEDS::AttributeIOR_var     anIOR;
+    
+    switch (theCommandID){
+      /* ======================================================================================== */
+      /* Define Selection Mode                                                                   */
+      /* ======================================================================================== */
     case 101:
     case 102:
     case 103:
@@ -532,22 +598,22 @@ bool VisuGUI::OnGUIEvent(int theCommandID,  QAD_Desktop* parent)
 
     case 8041 : // Object representation : Wireframe
     case 9041 : // Object representation : Wireframe
-      visuGUI->ChangeRepresentation(WIREFRAME);
+      visuGUI->ChangeRepresentation(VISU::WIREFRAME);
       break;
 
     case 8042 : // Object representation : Surface
     case 9042 : // Object representation : Surface
-      visuGUI->ChangeRepresentation(SURFACE);
+      visuGUI->ChangeRepresentation(VISU::SHADED);
       break;
 
     case 8043 : // Object representation : Points
     case 9043 : // Object representation : Points
-      visuGUI->ChangeRepresentation(POINTS);
+      visuGUI->ChangeRepresentation(VISU::POINT);
       break;
 
     case 8044 : // Object representation : Shrink/Unshrink
     case 9044 : // Object representation : Shrink/Unshrink
-      visuGUI->ChangeRepresentation(SHRINK);
+      visuGUI->ChangeRepresentation(VISU::SHRINK);
       break;
 
     case 8051 : // Change object color
@@ -587,7 +653,27 @@ bool VisuGUI::OnGUIEvent(int theCommandID,  QAD_Desktop* parent)
        SetSweepingPreferences();
       }
       break;
-      
+
+/* ======================================================================================== */
+/* Preferences for Full loading                                                             */
+/* ======================================================================================== */
+    case 53:
+    case 54:
+      {
+       QMenuData* pp;
+       QMenuItem* item = parent->menuBar()->findItem(theCommandID,&pp);
+       bool check = !pp->isItemChecked(theCommandID);
+       pp->setItemChecked(theCommandID,check);
+       switch(theCommandID){
+       case 53:
+         QAD_CONFIG->addSetting( "Visu:BuildResult", check );
+         break;
+       case 54:
+         QAD_CONFIG->addSetting( "Visu:BuildDefaultPrs3d", check );
+         break;
+       }
+      }
+      break;
 
     case 113: // Load MED using MED component
       {
@@ -636,27 +722,6 @@ bool VisuGUI::OnGUIEvent(int theCommandID,  QAD_Desktop* parent)
 }
 
 
-/* ********************************************************************************* */
-/* Function to find Actor in Viewer                                                 */
-/* ********************************************************************************* */
-
-
-VISU_Actor *VisuGUI::GetActor(int* theSelectionType){
-  VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d();
-  if (!aPrs3d) return NULL;
-
-  VTKViewer_ViewFrame* vf = VisuGUI::GetVtkViewFrame();
-  if(!vf) return NULL;
-
-  if(theSelectionType){
-    QAD_Study *aStudy = QAD_Application::getDesktop()->getActiveStudy();
-    SALOME_Selection *aSel = SALOME_Selection::Selection(aStudy->getSelection());
-    *theSelectionType = aSel->SelectionMode();
-  }
-
-  return GetActor(aPrs3d,vf);
-}
-
 /* ********************************************************************************** */
 /* Function ShowTrihedron                                                             */
 /* ********************************************************************************** */
@@ -675,7 +740,7 @@ void VisuGUI::ShowTrihedron(bool ShowThd){
 /* ********************************************************************************** */
 
 VisuGUI::~VisuGUI(){
-  MESSAGE("VisuGUI::~VisuGUI");
+  if(MYDEBUG) MESSAGE("VisuGUI::~VisuGUI");
 }
                        
 /* ********************************************************************************** */
@@ -684,34 +749,29 @@ VisuGUI::~VisuGUI(){
 /* ********************************************************************************** */
 
 void VisuGUI::ChangeViewer(int theType){
-  VTKViewer_ViewFrame* vf = GetVtkViewFrame();
-  if (!vf) return;
-
-  vtkActor *anActor;
-  vtkRenderer *aRen = vf->getRenderer();
-  vtkActorCollection *anActColl = aRen->GetActors();
-  for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){
-    if(anActor->IsA("VISU_Actor")){ 
-      VISU_Actor* anVISUActor = VISU_Actor::SafeDownCast(anActor);
-      if(anVISUActor->GetVisibility() > 0)
-       if(theType > 0)
-         anVISUActor->SetRepresentation(theType); 
-       else if(theType == -1)
-         anVISUActor->VisibilityOff();
-       else
-         anVISUActor->VisibilityOn();
+  if(vtkRenderer *aRen = GetRenderer()){
+    vtkActor *anActor;
+    vtkActorCollection *anActColl = aRen->GetActors();
+    for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){
+      if(anActor->GetVisibility() > 0)
+       if(VISU_Actor* anVISUActor = VISU_Actor::SafeDownCast(anActor)){ 
+         anVISUActor = anVISUActor->GetParent();
+         if(theType >= 0)
+           anVISUActor->SetRepresentation(theType); 
+         else
+           anVISUActor->VisibilityOff();
+       }
     }
+    RepaintCurrentView();
   }
 }
 
-
 // -----------------------------------------------------------------------------------------
 // EVENTS
 // -----------------------------------------------------------------------------------------
 
 bool VisuGUI::OnMousePress (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
 {
-  VisuGUI::GetOrCreateVisuGUI(parent);
   return true;
 }
 
@@ -719,7 +779,6 @@ bool VisuGUI::OnMousePress (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame
 
 bool VisuGUI::OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
 {
-  VisuGUI::GetOrCreateVisuGUI(parent);
   return true;
 }
 
@@ -727,17 +786,16 @@ bool VisuGUI::OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame*
 
 bool VisuGUI::OnKeyPress (QKeyEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
 {
-  VisuGUI::GetOrCreateVisuGUI(parent);
   if (GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK) // true = Viewer OCC
     return false;
 
-  MESSAGE ( "VisuGUI::onKeyPress : " << pe->key() )
+  if(MYDEBUG) MESSAGE( "VisuGUI::onKeyPress : " << pe->key() )
 
   switch ( pe->key() )
     {
     case Key_Escape :
       {
-         MESSAGE("--> Key : Escape")
+         if(MYDEBUG) MESSAGE("--> Key : Escape")
          return true;    
       }
     default :
@@ -787,7 +845,21 @@ CREATEPRESENTATION(VisuGUI::CreateStreamLines);
 //=====================================================================================
 bool VisuGUI::setSettings(QAD_Desktop* parent)
 {
-  VisuGUI::GetOrCreateVisuGUI(parent);
+  int anId = 53;
+  QMenuData* pp;
+  QMenuItem* item = parent->menuBar()->findItem(anId,&pp);
+  QString aValue = QAD_CONFIG->getSetting("Visu:BuildResult");
+  
+  if(aValue.isEmpty()? 0 : aValue.toInt()) 
+    pp->setItemChecked(anId, true);
+  
+  anId = 54;
+  item = parent->menuBar()->findItem(anId,&pp);
+  aValue  = QAD_CONFIG->getSetting("Visu:BuildDefaultPrs3d");
+  
+  if(aValue.isEmpty()? 0 : aValue.toInt()) 
+    pp->setItemChecked(anId, true);
+  
   return true;
 }
 
@@ -796,14 +868,14 @@ bool VisuGUI::setSettings(QAD_Desktop* parent)
 // purpose  :
 //=====================================================================================
 void VisuGUI::DisplayPrs() {
-  MESSAGE("VisuGUI::DisplayPrs");
+  if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs");
   Handle(SALOME_InteractiveObject) anIO;
   CORBA::Object_var anObject = GetSelectedObj(&anIO);
   if ( !CORBA::is_nil( anObject ) ) {
     // is it Prs3d object ?
     VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(anObject));
     if(aPrsObject){
-      MESSAGE("VisuGUI::DisplayPrs : Prs3d object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Prs3d object");
       UpdateViewer(aPrsObject);
       if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) {
        vf->getRenderer()->ResetCameraClippingRange();
@@ -815,21 +887,21 @@ void VisuGUI::DisplayPrs() {
     // is it Curve ?
     VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(anObject));
     if(aCurve){
-      MESSAGE("VisuGUI::DisplayPrs : Curve object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Curve object");
       PlotCurve(aCurve, VISU::eDisplay );
       return;
     }
     // is it Container ?
     VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(anObject));
     if(aContainer){
-      MESSAGE("VisuGUI::DisplayPrs : Container object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Container object");
       PlotContainer(aContainer, VISU::eDisplay );
       return;
     }
     // is it Table ?
     VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(anObject));
     if(aTable){
-      MESSAGE("VisuGUI::DisplayPrs : Table object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Table object");
       PlotTable(aTable, VISU::eDisplay );
       return;
     }
@@ -841,13 +913,13 @@ void VisuGUI::DisplayPrs() {
 // purpose  :
 //=====================================================================================
 void VisuGUI::DisplayOnlyPrs() {
-  MESSAGE("VisuGUI::DisplayOnlyPrs");
+  if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs");
   CORBA::Object_var anObject = GetSelectedObj();
   if ( !CORBA::is_nil( anObject ) ) {
     // is it Prs3d object ?
     PortableServer::Servant aServant = VISU::GetServant(anObject);
     if(VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(aServant)){
-      MESSAGE("VisuGUI::DisplayOnlyPrs : Prs3d object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Prs3d object");
       UpdateViewer(aPrsObject, true);
       VTKViewer_ViewFrame* vf = GetVtkViewFrame();
       if (vf) {
@@ -855,13 +927,13 @@ void VisuGUI::DisplayOnlyPrs() {
        vf->Repaint();
       }
     }else if(VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(aServant)){
-      MESSAGE("VisuGUI::DisplayOnlyPrs : Curve object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Curve object");
       PlotCurve(aCurve, VISU::eDisplayOnly );
     }else if(VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(aServant)){
-      MESSAGE("VisuGUI::DisplayOnlyPrs : Container object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Container object");
       PlotContainer(aContainer, VISU::eDisplayOnly );
     }else if(VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(aServant)){
-      MESSAGE("VisuGUI::DisplayOnlyPrs : Table object");
+      if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Table object");
       PlotTable(aTable, VISU::eDisplayOnly );
     }
   }
@@ -872,13 +944,13 @@ void VisuGUI::DisplayOnlyPrs() {
 // purpose  :
 //=====================================================================================
 void VisuGUI::ErasePrs() {
-  MESSAGE("VisuGUI::ErasePrs");
+  if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs");
   CORBA::Object_var anObject = GetSelectedObj();
   if ( !CORBA::is_nil( anObject ) ) {
     // is it Prs3d object ?
     VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(anObject));
     if(aPrsObject){
-      MESSAGE("VisuGUI::ErasePrs : Prs3d object");
+      if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Prs3d object");
       ErasePrs(aPrsObject);
       VTKViewer_ViewFrame* vf = GetVtkViewFrame();
       if (vf) {
@@ -888,19 +960,19 @@ void VisuGUI::ErasePrs() {
     // is it Curve ?
     VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(anObject));
     if(aCurve){
-      MESSAGE("VisuGUI::ErasePrs : Curve object");
+      if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Curve object");
       PlotCurve(aCurve, VISU::eErase );
     }
     // is it Container ?
     VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(anObject));
     if(aContainer){
-      MESSAGE("VisuGUI::ErasePrs : Container object");
+      if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Container object");
       PlotContainer(aContainer, VISU::eErase );
     }
     // is it Table ?
     VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(anObject));
     if(aTable){
-      MESSAGE("VisuGUI::ErasePrs : Table object");
+      if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Table object");
       PlotTable(aTable, VISU::eErase );
     }
   }
@@ -912,7 +984,7 @@ void VisuGUI::ErasePrs() {
 //=====================================================================================
 void VisuGUI::DisplayManyPrs()
 {
-  MESSAGE("VisuGUI::DisplayManyPrs");
+  if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs");
   SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection());
   SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
   for ( ; It.More(); It.Next() ) {
@@ -927,7 +999,7 @@ void VisuGUI::DisplayManyPrs()
          // is it Prs3d object ?
          VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(aCORBAObject));
          if(aPrsObject){
-           MESSAGE("VisuGUI::DisplayManyPrs : Prs3d object");
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Prs3d object");
            UpdateViewer(aPrsObject);
            VTKViewer_ViewFrame* vf = GetVtkViewFrame();
            if (vf) {
@@ -940,21 +1012,21 @@ void VisuGUI::DisplayManyPrs()
          // is it Curve ?
          VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(aCORBAObject));
          if(aCurve){
-           MESSAGE("VisuGUI::DisplayManyPrs: Curve object");
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs: Curve object");
            PlotCurve(aCurve, VISU::eDisplay );
            continue;
          }
          // is it Container ?
          VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(aCORBAObject));
          if(aContainer){
-           MESSAGE("VisuGUI::DisplayManyPrs : Container object");
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Container object");
            PlotContainer(aContainer, VISU::eDisplay );
            continue;
          }
          // is it Table ?
          VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(aCORBAObject));
          if(aTable){
-           MESSAGE("VisuGUI::DisplayManyPrs : Table object");
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Table object");
            PlotTable(aTable, VISU::eDisplay );
            continue;
          }
@@ -964,13 +1036,85 @@ void VisuGUI::DisplayManyPrs()
   }
 }
 
+//=====================================================================================
+// function : DisplayOnlyManyPrs()
+// purpose  :
+//=====================================================================================
+void VisuGUI::DisplayOnlyManyPrs() {
+  if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs");
+  SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection());
+  SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
+  bool aFirstElem = true;
+  for ( ; It.More(); It.Next() ) {
+    Handle(SALOME_InteractiveObject)& anIO = It.Value();
+    if ( anIO->hasEntry() ) {
+      SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+      SALOMEDS::SObject_var aSObject = aStudy->FindObjectID( anIO->getEntry() );
+      VISU::Storable::TRestoringMap pMap;
+      if( !aSObject->_is_nil() ) {
+       CORBA::Object_var aCORBAObject = VISU::SObjectToObject(aSObject);
+       if ( !CORBA::is_nil( aCORBAObject ) ) {
+         // is it Prs3d object ?
+         VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(aCORBAObject));
+         if(aPrsObject){
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs : Prs3d object");
+           UpdateViewer(aPrsObject, aFirstElem);
+           if (aFirstElem) aFirstElem = false;
+           VTKViewer_ViewFrame* vf = GetVtkViewFrame();
+           if (vf) {
+             vf->getRenderer()->ResetCameraClippingRange();
+             vf->Repaint();
+             vf->highlight(anIO, 1);
+           }
+           continue;
+         }
+         // is it Curve ?
+         VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(aCORBAObject));
+         if(aCurve){
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs: Curve object");
+           if (aFirstElem) {
+             PlotCurve(aCurve, VISU::eDisplayOnly );
+             aFirstElem = false;
+           }
+           else PlotCurve(aCurve, VISU::eDisplay );
+           continue;
+         }
+         // is it Container ?
+         VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(aCORBAObject));
+         if(aContainer){
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs : Container object");
+           if (aFirstElem) {
+             PlotContainer(aContainer, VISU::eDisplayOnly );
+             aFirstElem = false;
+           }
+           else PlotContainer(aContainer, VISU::eDisplay );
+           continue;
+         }
+         // is it Table ?
+         VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(aCORBAObject));
+         if(aTable){
+           if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs : Table object");
+           if (aFirstElem) {
+             PlotTable(aTable, VISU::eDisplayOnly );
+             aFirstElem = false;
+           }
+           else PlotTable(aTable, VISU::eDisplay );
+           continue;
+         }
+       }
+      }
+    }
+  }
+}
+
+
 //=====================================================================================
 // function : EraseManyPrs()
 // purpose  :
 //=====================================================================================
 void VisuGUI::EraseManyPrs()
 {
-  MESSAGE("VisuGUI::EraseManyPrs");
+  if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs");
   SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection());
   SALOME_ListIO LIO; LIO = Sel->StoredIObjects();
   SALOME_ListIteratorOfListIO It( LIO );
@@ -986,7 +1130,7 @@ void VisuGUI::EraseManyPrs()
          // is it Prs3d object ?
          VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(aCORBAObject));
          if(aPrsObject){
-           MESSAGE("VisuGUI::EraseManyPrs : Prs3d object");
+           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Prs3d object");
            ErasePrs(aPrsObject);
            VTKViewer_ViewFrame* vf = GetVtkViewFrame();
            if (vf) {
@@ -997,21 +1141,21 @@ void VisuGUI::EraseManyPrs()
          // is it Curve ?
          VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(aCORBAObject));
          if(aCurve){
-           MESSAGE("VisuGUI::EraseManyPrs : Curve object");
+           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Curve object");
            PlotCurve(aCurve, VISU::eErase );
            continue;
          }
          // is it Container ?
          VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(aCORBAObject));
          if(aContainer){
-           MESSAGE("VisuGUI::EraseManyPrs : Container object");
+           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Container object");
            PlotContainer(aContainer, VISU::eErase );
            continue;
          }
          // is it Table ?
          VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(aCORBAObject));
          if(aTable){
-           MESSAGE("VisuGUI::EraseManyPrs : Table object");
+           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Table object");
            PlotTable(aTable, VISU::eErase );
            continue;
          }
@@ -1027,14 +1171,20 @@ void VisuGUI::EraseManyPrs()
 //=====================================================================================
 void VisuGUI::RecreateActor(VISU::Prs3d_i* thePrs) {
   QApplication::setOverrideCursor(Qt::waitCursor);
-  thePrs->Update();
-  for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++)
-    if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){
-      QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame();
-      if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast<VTKViewer_ViewFrame*>(aVFrame))
-       if(VISU_Actor* anActor = GetActor(thePrs,aViewFrame))
-         thePrs->UpdateActor(anActor);
-    }
+  try{
+    thePrs->Update();
+    for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++)
+      if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){
+       QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame();
+       if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast<VTKViewer_ViewFrame*>(aVFrame))
+         if(VISU_Actor* anActor = GetActor(thePrs,aViewFrame))
+           thePrs->UpdateActor(anActor);
+      }
+  }catch(std::runtime_error& ex){
+    QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), 
+                           tr ("ERR_CANT_BUILD_PRESENTATION"), 
+                           tr ("VISU_BUT_OK") ); 
+  }
   QApplication::restoreOverrideCursor();
 }
 
@@ -1048,13 +1198,12 @@ void VisuGUI::RecreateActor(VISU::Prs3d_i* thePrs) {
       PrsName* aPrsObject = dynamic_cast<PrsName*>(aPrs3d); \
       if (aPrsObject) { \
        DlgName* aDlg = new DlgName(); \
-       aDlg->initFromPrsObject(aPrsObject); \
+        aDlg->initFromPrsObject(aPrsObject); \
        if ( aDlg->exec() )  { \
          aDlg->storeToPrsObject(aPrsObject); \
          RecreateActor(aPrsObject); \
          /*RepaintCurrentView();*/ \
-         VTKViewer_ViewFrame* vf = GetVtkViewFrame(); \
-         if (vf) { \
+         if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) { \
            if ( vf->getRenderer()->GetActors()->GetNumberOfItems () > 0 ) { \
                  vf->getRenderer()->ResetCameraClippingRange(); \
                 vf->onViewFitAll(); \
@@ -1066,7 +1215,6 @@ void VisuGUI::RecreateActor(VISU::Prs3d_i* thePrs) {
       } \
     }
 
-
 void VisuGUI::EditPrs() {
   VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d();
 
@@ -1099,7 +1247,15 @@ void VisuGUI::EditPrs() {
 
   case VISU::TSTREAMLINES:
     EDITPRS(VISU::StreamLines_i, VisuGUI_StreamLinesDlg);
+  default: 
+    return;        
   }
+  
+  Handle(SALOME_InteractiveObject) anIO;
+  CORBA::Object_var anObject = GetSelectedObj(&anIO);
+  if ( !CORBA::is_nil( anObject ) ) 
+    if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) 
+      vf->highlight(anIO, 1);
 }
 
 
@@ -1119,7 +1275,14 @@ void VisuGUI::EditScalarBar() {
       
       VTKViewer_ViewFrame* vf = GetVtkViewFrame();
       if (vf)
-       vf->Repaint();
+       {
+         vf->Repaint();
+         
+         Handle(SALOME_InteractiveObject) anIO;
+         CORBA::Object_var anObject = GetSelectedObj(&anIO);
+         if ( !CORBA::is_nil( anObject ) ) 
+           vf->highlight(anIO, 1);
+       }
       
       if (aDlg->isToSave())
        aDlg->storeToResources();
@@ -1158,7 +1321,6 @@ void VisuGUI::CreateMesh() {
                          tr ("VISU_BUT_OK"));
     return;
   }
-
   VISU::Storable::TRestoringMap aMap;
   SALOMEDS::GenericAttribute_var anAttr;
   if(aSObject->FindAttribute(anAttr, "AttributeComment")) {
@@ -1176,20 +1338,24 @@ void VisuGUI::CreateMesh() {
   Utils_Timer timer;
   timer.Start();
 #endif
+  VISU::Result_i* pResult = dynamic_cast<VISU::Result_i*>(VISU::GetServant(aResult.in()));
   if(aComment == "ENTITY"){
     VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt();
-    aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity);
+    if(VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),anEntity))
+      aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity);
   }else if(aComment == "FAMILY"){
     VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt();
     string aFamilyName = VISU::Storable::FindValue(aMap,"myName").latin1();
-    aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str());
+    if(VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),anEntity,aFamilyName.c_str()))
+      aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str());
   }else if(aComment == "GROUP"){
     string aGroupName = VISU::Storable::FindValue(aMap,"myName").latin1();
-    aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str());
+    if(VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),aGroupName.c_str()))
+      aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str());
   }
 #ifdef CHECKTIME
   timer.Stop();
-  MESSAGE("VisuGUI::CreateMesh() - CREATE MESH");
+  cout<<"VisuGUI::CreateMesh() - CREATE MESH\n";
   timer.Show();
 #endif
 
@@ -1205,92 +1371,90 @@ void VisuGUI::CreateMesh() {
   }
 
   if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){
-    VISU_Actor *anActor = pPresent->CreateActor();
-    if (! anActor ) {
-      QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), 
-                             tr ("ERR_CANT_CREATE_ACTOR"), 
-                             tr ("VISU_BUT_OK") ); 
-      return;
-    }
+    try{
+      VISU_Actor *anActor = pPresent->CreateActor();
 #ifdef CHECKTIME
-    Utils_Timer timer;
-    timer.Start();
+      Utils_Timer timer;
+      timer.Start();
 #endif
-    vf->AddActor(anActor);
-    vf->getRenderer()->ResetCameraClippingRange();
-    vf->onViewFitAll();
+      vf->AddActor(anActor);
+      SetFitAll(vf);
 #ifdef CHECKTIME
-    timer.Stop();
-    MESSAGE("VisuGUI::CreateMesh() - DISPLAY MESH");
-    timer.Show();
+      timer.Stop();
+      cout<<"VisuGUI::CreateMesh() - DISPLAY MESH\n";
+      timer.Show();
 #endif
+      //GetActiveStudy()->updateObjBrowser(); //not necessary
+      GetDesktop()->putInfo("Ready");
+    }catch(std::runtime_error& exc){
+      QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), 
+                             tr ("ERR_CANT_CREATE_ACTOR"), 
+                             tr ("VISU_BUT_OK") ); 
+    }
   }
-  //GetActiveStudy()->updateObjBrowser(); //not necessary
-  GetDesktop()->putInfo("Ready");
 }
 
 //=====================================================================================
 // function : CreateManyMesh()
 // purpose  :
 //=====================================================================================
-void VisuGUI::CreateManyMesh()
-{
+void VisuGUI::CreateManyMesh(){
   if (checkLock(GetStudyDocument())) return;
 
   SALOME_Selection* Sel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
   SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
   for ( ; It.More(); It.Next() ) {
-  SALOMEDS::SObject_var aSObject  = GetActiveStudy()->getStudyDocument()->FindObjectID( It.Value()->getEntry() );
-  
-  SALOMEDS::SObject_var aSObj = aSObject->GetFather();
-  aSObj = aSObj->GetFather();
-  aSObj = aSObj->GetFather();
-  CORBA::Object_var anObject = VISU::SObjectToObject(aSObj);
-  if(CORBA::is_nil(anObject)) {
+    SALOMEDS::SObject_var aSObject  = GetStudyDocument()->FindObjectID(It.Value()->getEntry());
+    SALOMEDS::SObject_var aSObj = aSObject->GetFather();
     aSObj = aSObj->GetFather();
-    anObject = VISU::SObjectToObject(aSObj);
-    if(CORBA::is_nil(anObject)) return;
-  }
-  VISU::Result_var aResult = VISU::Result::_narrow(anObject);
-  if(CORBA::is_nil(aResult)) return;
-
-  VISU::Storable::TRestoringMap aMap;
-  SALOMEDS::GenericAttribute_var anAttr;
-  if(aSObject->FindAttribute(anAttr, "AttributeComment")) {
-    SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
-    string aComm = aComment->Value();
-    QString strIn(aComm.c_str());
-    VISU::Storable::StrToMap(strIn,aMap);
-  }
-  bool isExist;
-  string aComment = VISU::Storable::FindValue(aMap,"myComment",&isExist).latin1();
-  if(!isExist) return;
-  CORBA::Object_var aMesh;
-  string aMeshName = VISU::Storable::FindValue(aMap,"myMeshName").latin1();
-  if(aComment == "ENTITY"){
-    VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt();
-    aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity);
-  }else if(aComment == "FAMILY"){
-    VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt();
-    string aFamilyName = VISU::Storable::FindValue(aMap,"myName").latin1();
-    aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str());
-  }else if(aComment == "GROUP"){
-    string aGroupName = VISU::Storable::FindValue(aMap,"myName").latin1();
-    aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str());
-  }
-  QApplication::restoreOverrideCursor();
-  if(CORBA::is_nil(aMesh)) return;
-
-  VISU::Mesh_i* pPresent = dynamic_cast<VISU::Mesh_i*>(VISU::GetServant(aMesh));
-  VISU_Actor *anActor = pPresent->CreateActor();
-  if (! anActor ) return;
-  if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){
-    vf->AddActor(anActor);
-    vf->getRenderer()->ResetCameraClippingRange();
-    vf->onViewFitAll();
-  }
+    aSObj = aSObj->GetFather();
+    CORBA::Object_var anObject = VISU::SObjectToObject(aSObj);
+    if(CORBA::is_nil(anObject)) {
+      aSObj = aSObj->GetFather();
+      anObject = VISU::SObjectToObject(aSObj);
+      if(CORBA::is_nil(anObject)) return;
+    }
+    VISU::Result_var aResult = VISU::Result::_narrow(anObject);
+    if(CORBA::is_nil(aResult)) return;
+    
+    VISU::Storable::TRestoringMap aMap;
+    SALOMEDS::GenericAttribute_var anAttr;
+    if(aSObject->FindAttribute(anAttr, "AttributeComment")) {
+      SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
+      string aComm = aComment->Value();
+      QString strIn(aComm.c_str());
+      VISU::Storable::StrToMap(strIn,aMap);
+    }
+    bool isExist;
+    string aComment = VISU::Storable::FindValue(aMap,"myComment",&isExist).latin1();
+    if(!isExist) return;
+    CORBA::Object_var aMesh;
+    string aMeshName = VISU::Storable::FindValue(aMap,"myMeshName").latin1();
+    if(aComment == "ENTITY"){
+      VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt();
+      aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity);
+    }else if(aComment == "FAMILY"){
+      VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt();
+      string aFamilyName = VISU::Storable::FindValue(aMap,"myName").latin1();
+      aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str());
+    }else if(aComment == "GROUP"){
+      string aGroupName = VISU::Storable::FindValue(aMap,"myName").latin1();
+      aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str());
+    }
+    QApplication::restoreOverrideCursor();
+    if(CORBA::is_nil(aMesh)) return;
+    
+    VISU::Mesh_i* pPresent = dynamic_cast<VISU::Mesh_i*>(VISU::GetServant(aMesh));
+    try{
+      VISU_Actor *anActor = pPresent->CreateActor();
+      if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){
+       vf->AddActor(anActor);
+       SetFitAll(vf);
+      }
+      GetDesktop()->putInfo("Ready");
+    }catch(std::runtime_error& exc){
+    }
   }
-  GetDesktop()->putInfo("Ready");
 }
 
 //=====================================================================================
@@ -1299,48 +1463,54 @@ void VisuGUI::CreateManyMesh()
 //=====================================================================================
 
 static void ShrinkMesh(VISU_Actor *theActor){
-  if(theActor->isShrunk()) 
-    theActor->unShrink();
+  if(theActor->IsShrunk()) 
+    theActor->UnShrink();
   else
-    theActor->setShrink(0.8);
+    theActor->SetShrink(0.8);
 }
 
-void VisuGUI::ChangeRepresentation(RepresentType theType) {
-  if(VISU::Prs3d_i* aPrsObject = GetSelectedPrs3d()){
+void VisuGUI::ChangeRepresentation(VISU::PresentationType theType) {
+  if(VISU::Prs3d_i* aPrsObject = GetSelectedPrs3d())
     if(VISU_Actor* anActor = GetActor(aPrsObject)){
       switch (theType) {
-      case POINTS:
-      case WIREFRAME:
-      case SURFACE:
-       anActor->SetRepresentation(theType);
-       break;
-      case SHRINK:
+      case VISU::SHRINK:
        ShrinkMesh(anActor);
        break;
+      default:
+       if(VISU::Mesh_i* aMesh = dynamic_cast<VISU::Mesh_i*>(aPrsObject)){
+         aMesh->SetPresentationType(theType);
+         RecreateActor(aMesh);
+       }else
+         anActor->SetRepresentation(theType);
       }
       if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) 
        vf->Repaint();
     }
-  }
 }
 
-void VisuGUI::MakeWireframe() {
-  ChangeRepresentation(WIREFRAME);
+
+void VisuGUI::MakeSurfaceframe() {
+  ChangeRepresentation(VISU::SURFACEFRAME);
 }
 
+void VisuGUI::MakeInsideframe() {
+  ChangeRepresentation(VISU::INSIDEFRAME);
+}
 
-void VisuGUI::MakeSurface() {
-  ChangeRepresentation(SURFACE);
+void VisuGUI::MakeWireframe() {
+  ChangeRepresentation(VISU::WIREFRAME);
 }
 
+void VisuGUI::MakeSurface() {
+  ChangeRepresentation(VISU::SHADED);
+}
 
 void VisuGUI::MakePoints() {
-  ChangeRepresentation(POINTS);
+  ChangeRepresentation(VISU::POINT);
 }
 
-
 void VisuGUI::MakeShrink() {
-  ChangeRepresentation(SHRINK);
+  ChangeRepresentation(VISU::SHRINK);
 }
 
 
@@ -1352,7 +1522,9 @@ void VisuGUI::MakeShrink() {
 VISU::Prs3d_i* VisuGUI::GetSelectedPrs3d(Handle(SALOME_InteractiveObject)* theIO) {
   CORBA::Object_var anObject = GetSelectedObj(theIO);
   if(CORBA::is_nil(anObject)) return NULL;
-  return dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(anObject));
+  PortableServer::Servant aServant = VISU::GetServant(anObject);
+  if(!aServant) return NULL;
+  return dynamic_cast<VISU::Prs3d_i*>(aServant);
 }
 
 void VisuGUI::ChageColor() {
@@ -1364,13 +1536,13 @@ void VisuGUI::ChageColor() {
   NewColor(anActor);
 }
 
-void VisuGUI::ChangeOutlineColor() {
+void VisuGUI::ChangeWireframeColor() {
   VISU::Prs3d_i* aPrsObject = GetSelectedPrs3d();
   if(!aPrsObject) return;
 
-  VISUMesh_Actor* anActor = dynamic_cast<VISUMesh_Actor*>(GetActor(aPrsObject));
+  VISU_MeshAct* anActor = dynamic_cast<VISU_MeshAct*>(GetActor(aPrsObject));
   if (!anActor) return;
-  NewOutlineColor(anActor);
+  NewWireframeColor(anActor);
 }
 
 
@@ -1394,7 +1566,6 @@ void VisuGUI::ChangeLines() {
 }
 void VisuGUI::PlotTable( VISU::Table_i* table, int theDisplaying )
 {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   if ( table && GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) {
     Plot2d_ViewFrame* aPlot = (Plot2d_ViewFrame*)GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame();
     if ( theDisplaying == VISU::eDisplayOnly ) 
@@ -1463,7 +1634,6 @@ void VisuGUI::PlotTable( VISU::Table_i* table, int theDisplaying )
 }
 void VisuGUI::PlotCurve( VISU::Curve_i* theCurve, int theDisplaying )
 {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   if ( theCurve && GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) {
     Plot2d_ViewFrame* aPlot = (Plot2d_ViewFrame*)GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame();
 //  if ( theDisplaying == VISU::eDisplayOnly ) 
@@ -1519,7 +1689,6 @@ void VisuGUI::PlotCurve( VISU::Curve_i* theCurve, int theDisplaying )
 }
 void VisuGUI::PlotContainer( VISU::Container_i* container, int theDisplaying )
 {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   if ( container && GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) {
     Plot2d_ViewFrame* aPlot = (Plot2d_ViewFrame*)GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame();
     if ( theDisplaying == VISU::eDisplayOnly ) 
@@ -1586,7 +1755,6 @@ void VisuGUI::PlotContainer( VISU::Container_i* container, int theDisplaying )
   Slot : opens Table view : for Table object or SObject with table attribute selected
 */
 void VisuGUI::ShowTable() {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if( Sel->IObjectCount() !=1 )
     return;
@@ -1625,7 +1793,6 @@ void VisuGUI::ShowTable() {
   Slot : opens Table view : for Table object or SObject with table attribute selected
 */
 void VisuGUI::CreateTable() {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* aSel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if( aSel->IObjectCount() !=1 )
     return;
@@ -1652,7 +1819,6 @@ void VisuGUI::CreateTable() {
   Opens dialog box for curves creation. Acts only for selected SObject with table attribute.
 */
 void VisuGUI::PlotData() {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if( Sel->IObjectCount() !=1 )
     return;
@@ -1809,7 +1975,6 @@ void VisuGUI::PlotData() {
   Slot : Opens "Setup curve" dialog to set curve properties : for Curve object selected
 */
 void VisuGUI::CurveProperties() {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if( Sel->IObjectCount() !=1 )
     return;
@@ -1867,7 +2032,6 @@ void VisuGUI::CurveProperties() {
   Slot : Clears container contents : for Container object selected
 */
 void VisuGUI::ClearContainer() {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if( Sel->IObjectCount() !=1 )
     return;
@@ -1899,7 +2063,6 @@ void VisuGUI::DeletePrs() {
 void VisuGUI::SaveViewParams()
 {
   if (checkLock(GetStudyDocument())) return;
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if ( Sel->IObjectCount() > 1 || GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK ) 
     return;
@@ -1931,7 +2094,6 @@ void VisuGUI::SaveViewParams()
 
 void VisuGUI::RestoreViewParams()
 {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if ( Sel->IObjectCount() > 1 || GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK ) 
     return;
@@ -2053,7 +2215,6 @@ void VisuGUI::TimeAnimation() {
 
 void VisuGUI::ImportMedField() {
   if (checkLock(GetStudyDocument())) return;
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
   QApplication::setOverrideCursor( Qt::waitCursor );
@@ -2085,36 +2246,13 @@ void VisuGUI::ImportMedField() {
   GetActiveStudy()->updateObjBrowser( true );
   QApplication::restoreOverrideCursor();
 }
-/*
-void VisuGUI::ImportMedMesh() {
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
-  SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
-  if ( Sel->IObjectCount() != 1 )
-    return;
-  string aComment;
-  Handle(SALOME_InteractiveObject) anIO;    
-  CORBA::Object_var anObject = GetSelectedObj( aComment,anIO, GetActiveStudy());
-  if ( !CORBA::is_nil( anObject ) ) {
-    SALOME_MED::MESH_ptr aMesh = SALOME_MED::MESH::_narrow( anObject );
-    if( !CORBA::is_nil( aMesh ) ) {
-      GetVisuGen->ImportMedMesh( aMesh );
-      GetActiveStudy()->updateObjBrowser( true );
-    }
-    SALOME_MED::SUPPORT_ptr aSupport = SALOME_MED::SUPPORT::_narrow( anObject );
-    if( !CORBA::is_nil( aSupport ) ) {
-      GetVisuGen->ImportMedSupport( aSupport );
-      GetActiveStudy()->updateObjBrowser( true );
-    }
-  }
-}
-*/
+
 //=====================================================================================
 // functions : Rename()
 // purpose  :
 //=====================================================================================
 void VisuGUI::Rename() {
   if (checkLock(GetStudyDocument())) return;
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
   if ( Sel->IObjectCount() != 1 )
     return;
@@ -2154,6 +2292,99 @@ void VisuGUI::Rename() {
   }
 }
 
+//=====================================================================================
+// functions : RenameTable()
+// purpose  :
+//=====================================================================================
+void VisuGUI::RenameTable() {
+  if (checkLock(GetStudyDocument())) return;
+  SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
+  if ( Sel->IObjectCount() != 1 )
+    return;
+  SALOMEDS::SObject_var aSObj = GetStudyDocument()->FindObjectID( Sel->firstIObject()->getEntry() );
+  if( aSObj->_is_nil() ) return;
+   
+  VISU::Table_i* table = 0;
+  CORBA::Object_var anObject = GetSelectedObj();
+  if ( !CORBA::is_nil( anObject )) {
+    VISU::Base_var aVisuObj = VISU::Base::_narrow(anObject);
+    if (!CORBA::is_nil(aVisuObj) && aVisuObj->GetType() == VISU::TTABLE) {
+      // Table object
+      CORBA::Object_ptr aTable = VISU::Table::_narrow( anObject );
+      if( !CORBA::is_nil( aTable ) ) {
+       table = dynamic_cast<VISU::Table_i*>( VISU::GetServant( aTable ) );
+      }
+    }
+  }
+
+  //TEST DU PARENT == VISU
+  SALOMEDS::GenericAttribute_var anAttr;  
+  SALOMEDS::AttributeName_var    aName;
+  if ( aSObj->FindAttribute(anAttr, "AttributeName") ) {
+    aName = SALOMEDS::AttributeName::_narrow( anAttr );
+    QString Name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aName->Value() );
+    if ( !Name.isEmpty() ) {
+      QApplication::setOverrideCursor( Qt::waitCursor );
+      if ( table )
+       table->SetName( Name.latin1() );
+      GetActiveStudy()->renameIObject( Sel->firstIObject(), Name );
+      QApplication::restoreOverrideCursor();
+      
+      //int TypeMode;  bool InViewer;
+      //VISU_Actor *ActorTmp = ActorSelected(parent,InViewer,&TypeMode);
+      //ActorTmp->setName((Standard_CString)Name.latin1());
+    }
+  }
+}
+
+
+
+//=====================================================================================
+// functions : RenameContainer()
+// purpose  :
+//=====================================================================================
+void VisuGUI::RenameContainer() {
+  if (checkLock(GetStudyDocument())) return;
+  SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
+  if ( Sel->IObjectCount() != 1 )
+    return;
+  SALOMEDS::SObject_var aSObj = GetStudyDocument()->FindObjectID( Sel->firstIObject()->getEntry() );
+  if( aSObj->_is_nil() ) return;
+   
+  VISU::Container_i* container = 0;
+  CORBA::Object_var anObject = GetSelectedObj();
+  if ( !CORBA::is_nil( anObject )) {
+    VISU::Base_var aVisuObj = VISU::Base::_narrow(anObject);
+    if (!CORBA::is_nil(aVisuObj) && aVisuObj->GetType() == VISU::TCONTAINER) {
+      // Curve object
+      CORBA::Object_ptr aContainer = VISU::Container::_narrow( anObject );
+      if( !CORBA::is_nil( aContainer ) ) {
+       container = dynamic_cast<VISU::Container_i*>( VISU::GetServant( aContainer ) );
+      }
+    }
+  }
+
+  //TEST DU PARENT == VISU
+  SALOMEDS::GenericAttribute_var anAttr;  
+  SALOMEDS::AttributeName_var    aName;
+  if ( aSObj->FindAttribute(anAttr, "AttributeName") ) {
+    aName = SALOMEDS::AttributeName::_narrow( anAttr );
+    QString Name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aName->Value() );
+    if ( !Name.isEmpty() ) {
+      QApplication::setOverrideCursor( Qt::waitCursor );
+      if ( container )
+       container->SetName( Name.latin1() );
+      GetActiveStudy()->renameIObject( Sel->firstIObject(), Name );
+      QApplication::restoreOverrideCursor();
+      
+      //int TypeMode;  bool InViewer;
+      //VISU_Actor *ActorTmp = ActorSelected(parent,InViewer,&TypeMode);
+      //ActorTmp->setName((Standard_CString)Name.latin1());
+    }
+  }
+}
+
+
 
 //=====================================================================================
 // function : CopyPresentation()
@@ -2237,18 +2468,7 @@ void VisuGUI::CopyPresentation(){
 // purpose  :
 //=====================================================================================
 void VisuGUI::InfoOnPoint(){
-  SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
-  int aTypeMode = aSel->SelectionMode();
-  if ( aTypeMode == SelectionPoint ){
-    if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d()){
-      vtkDataSet* aDataSet = aPrs3d->GetMapper()->GetInput();
-      VisuGUI_Selection::PickingPoint( GetActiveStudy(), aDataSet);
-    }
-  }else
-    QAD_MessageBox::warn1( GetDesktop(), 
-                          tr ("WARNING"),
-                          tr ("ERR_WRONG_SELECTION_MODE"),
-                          tr ("VISU_BUT_OK") );
+  GetInfo(SelectionPoint,&(VisuGUI_Selection::PickingPoint));
 }
 
 //=====================================================================================
@@ -2256,13 +2476,27 @@ void VisuGUI::InfoOnPoint(){
 // purpose  :
 //=====================================================================================
 void VisuGUI::InfoOnCell(){
+  GetInfo(SelectionCell,&(VisuGUI_Selection::PickingCell));
+}
+
+void VisuGUI::GetInfo(int theSelectionMode, TGetInfoFun theGetInfoFun){
   SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
-  int aTypeMode = aSel->SelectionMode();
-  if( aTypeMode == SelectionCell){
-    if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d()){
-      vtkDataSet* aDataSet = aPrs3d->GetMapper()->GetInput();
-      VisuGUI_Selection::PickingCell( GetActiveStudy(), aDataSet);
+  if ( aSel->SelectionMode() == theSelectionMode ){
+    Handle(SALOME_InteractiveObject) anIO;
+    if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){
+      TColStd_MapOfInteger aMapIndex;
+      aSel->GetIndex(anIO,aMapIndex);
+      TColStd_MapIteratorOfMapOfInteger anIter(aMapIndex);
+      if(anIter.More()){
+       vtkDataSet* aDataSet = aPrs3d->GetPipeLine()->GetMapper()->GetInput();
+       (*theGetInfoFun)(GetActiveStudy(), aDataSet, anIter.Key());
+       return;
+      }
     }
+    QAD_MessageBox::warn1(QAD_Application::getDesktop(), 
+                         tr ("VISU_WARNING"),
+                         tr ("WRN_NO_AVAILABLE_DATA"),
+                         tr ("VISU_BUT_OK"));
   }else
     QAD_MessageBox::warn1( GetDesktop(), 
                           tr ("WARNING"),
@@ -2275,27 +2509,7 @@ void VisuGUI::InfoOnCell(){
 // purpose  :
 //=====================================================================================
 void VisuGUI::SelectPoint(){
-  SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
-  if ( aSel->SelectionMode() != SelectionPoint ) {
-    QAD_MessageBox::warn1( GetDesktop(), 
-                          tr ("WARNING"),
-                          tr ("ERR_WRONG_SELECTION_MODE"),
-                          tr ("VISU_BUT_OK") );
-    return;
-  }
-  Handle(SALOME_InteractiveObject) anIO;
-  if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){
-    bool ok = FALSE;
-    int anId = SALOMEGUI_SetValueDlg::getInteger( tr("Point selection"),
-                                                tr("Point number:" ), 
-                                                0,
-                                                &ok, 
-                                                GetDesktop());
-    vtkDataSet *aDataSet = aPrs3d->GetMapper()->GetInput();
-    int aMaxId = aDataSet->GetNumberOfPoints();
-    if (ok && 0 < anId && anId <= aMaxId )
-      VisuGUI_Selection::Highlight( GetActiveStudy(), anIO, anId );
-  }
+  Select(SelectionPoint,&vtkDataSet::GetNumberOfPoints,"Point selection","Point number:");
 }
 
 //=====================================================================================
@@ -2303,27 +2517,44 @@ void VisuGUI::SelectPoint(){
 // purpose  :
 //=====================================================================================
 void VisuGUI::SelectCell(){
+  Select(SelectionCell,&vtkDataSet::GetNumberOfCells,"Cell selection","Cell number:");
+}
+
+void VisuGUI::Select(int theSelectionMode, TSelectFun theSelectFun, 
+                    const char* theTitle, const char* theRequest)
+{
   SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
-  if ( aSel->SelectionMode() != SelectionCell) {
+  if(aSel->SelectionMode() == theSelectionMode){
+    Handle(SALOME_InteractiveObject) anIO;
+    if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){
+      bool ok = FALSE;
+      int anIndex = 0;
+      TColStd_MapOfInteger aMapIndex;
+      aSel->GetIndex(anIO,aMapIndex);
+      TColStd_MapIteratorOfMapOfInteger anIter(aMapIndex);
+      if(anIter.More()) anIndex = anIter.Key();
+      int anId = SALOMEGUI_SetValueDlg::getInteger( tr(theTitle),
+                                                   tr(theRequest), 
+                                                   anIndex,
+                                                   &ok, 
+                                                   GetDesktop());
+      if(!ok) return;
+      vtkDataSet* aDataSet = aPrs3d->GetPipeLine()->GetMapper()->GetInput();
+      int aMaxId = (aDataSet->*theSelectFun)();
+      if(0 <= anId && anId < aMaxId){
+       VisuGUI_Selection::Highlight( GetActiveStudy(), anIO, anId );
+       return;
+      }
+    }
+    QAD_MessageBox::warn1(QAD_Application::getDesktop(), 
+                         tr ("VISU_WARNING"),
+                         tr ("WRN_NO_AVAILABLE_DATA"),
+                         tr ("VISU_BUT_OK"));
+  }else
     QAD_MessageBox::warn1( GetDesktop(), 
                           tr ("WARNING"),
                           tr ("ERR_WRONG_SELECTION_MODE"),
                           tr ("VISU_BUT_OK") );
-    return;
-  }
-  Handle(SALOME_InteractiveObject) anIO;
-  if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){
-    bool ok = FALSE;
-    int anId = SALOMEGUI_SetValueDlg::getInteger( tr("Cell selection"),
-                                                tr("Cell number:" ), 
-                                                0,
-                                                &ok, 
-                                                GetDesktop());
-    vtkDataSet *aDataSet = aPrs3d->GetMapper()->GetInput();
-    int aMaxId = aDataSet->GetNumberOfCells();
-    if (ok && 0 < anId && anId <= aMaxId )
-      VisuGUI_Selection::Highlight( GetActiveStudy(), anIO, anId );
-  }
 }
 
 //=====================================================================================
@@ -2332,7 +2563,6 @@ void VisuGUI::SelectCell(){
 //=====================================================================================
 void VisuGUI::DefinePopup( QString & theContext, QString & theParent, QString & theObject )
 {
-  VisuGUI::GetOrCreateVisuGUI(QAD_Application::getDesktop());
   theObject = "";
   theContext = "";
 }
@@ -2449,27 +2679,25 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
                          const QString & theParent, const QString & theObject)
 {
   int isViewer = (theParent.compare("ObjectBrowser") != 0), initId = isViewer? 800: 900;
-  VisuGUI::GetOrCreateVisuGUI(parent);
   QAD_ResourceMgr* rmgr = parent->createResourceManager();
 
   bool isVTKViewer = (GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK);
   thePopup->clear();
-
-  SALOME_Selection* Sel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
-  if ( Sel->IObjectCount() == 0 ) {
+  SALOME_Selection* aSelection = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
+  if ( aSelection->IObjectCount() == 0 ) {
     if ( theParent == "Viewer" && isVTKViewer)
       // Available only for VTK viewer
       thePopup->insertItem( "Save view parameters", visuGUI, SLOT( SaveViewParams() ) );
     return false;
   }
-
-  if( Sel->IObjectCount() > 1 ) {
+  if( aSelection->IObjectCount() > 1 ) {
     int selMode = checkHomoSelection();
-    MESSAGE( "VisuGUI::CustomPopup: multiple selection : selMode = "<<selMode );
+    if(MYDEBUG) MESSAGE("VisuGUI::CustomPopup: multiple selection : selMode = "<<selMode );
     if ( selMode == homoCurves ) {
       if ( GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) {
        thePopup->insertItem( "Display", visuGUI, SLOT( DisplayManyPrs() ) );
        thePopup->insertItem( "Erase", visuGUI, SLOT( EraseManyPrs () ) );
+       thePopup->insertItem( "Display Only", visuGUI, SLOT( DisplayOnlyManyPrs() ) );
       }
     }
     else if ( selMode == homoPresentations ) {
@@ -2486,16 +2714,15 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
     }
     return true;
   }
-
   VISU::Storable::TRestoringMap aMap;
-  Handle(SALOME_InteractiveObject) anIO;    
+  Handle(SALOME_InteractiveObject) anIO;
   CORBA::Object_var anObject = GetSelectedObj(&anIO,GetActiveStudy(),&aMap);
   if (!CORBA::is_nil(anObject)) {
     SALOMEDS::SObject_var aSObject = GetStudyDocument()->FindObjectID(anIO->getEntry());
     VISU::Base_var aVisuObj = VISU::Base::_narrow(anObject);
     if (!CORBA::is_nil(aVisuObj)) {
       VISU::VISUType aType = aVisuObj->GetType();
-      MESSAGE("VisuGUI::CustomPopup - VISU object :: "<<aType);
+      if(MYDEBUG) MESSAGE("VisuGUI::CustomPopup - VISU object :: "<<aType);
       switch (aType) {
       case VISU::TVISUGEN:
        thePopup->insertItem("Import From File", visuGUI, SLOT(ImportFromFile()));
@@ -2508,6 +2735,7 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
        break;
        
       case VISU::TTABLE:
+       thePopup->insertItem( "Rename...", visuGUI, SLOT( RenameTable() ) );
        thePopup->insertItem( "Show Table",    visuGUI, SLOT( ShowTable() ) );
        thePopup->insertItem( "Create Curves", visuGUI, SLOT( PlotData() ) );
        if ( GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) {
@@ -2539,8 +2767,10 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
          if( !CORBA::is_nil( aCnt ) ) {
            VISU::Container_i* container = dynamic_cast<VISU::Container_i*>( VISU::GetServant( aCnt ) );
            if ( container && container->GetNbCurves() > 0 ) {
-             if ( !isStudyLocked( GetActiveStudy()->getStudyDocument() ) ) 
+             if ( !isStudyLocked( GetActiveStudy()->getStudyDocument() ) ) {
+               thePopup->insertItem( "Rename...", visuGUI, SLOT( RenameContainer() ) );
                thePopup->insertItem( "Clear", visuGUI, SLOT( ClearContainer() ) );
+             }
              if ( GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) {
                thePopup->insertItem( "Display", visuGUI, SLOT( DisplayPrs() ) );
                thePopup->insertItem( "Erase", visuGUI, SLOT( ErasePrs () ) );
@@ -2555,51 +2785,78 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
        {
          VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(anObject));
          if (aPrsObject) {
-           VISU_Actor* anVISUActor = visuGUI->GetActor(aPrsObject);
            if (isVTKViewer) {
              // Add Presentation menu
-             if ((aType != VISU::TSTREAMLINES) && anVISUActor) {
+             if (VISU_Actor* anVISUActor = visuGUI->GetActor(aPrsObject)){
                QPopupMenu* aPresMenu = new QPopupMenu(GetDesktop());
                int aRepresent = anVISUActor->GetRepresentation();
                switch(aRepresent){
-               case 0: //POINTS
+               case VISU::POINT :
                  aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe()));
                  aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface()));
+                 if (aType == VISU::TMESH || aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE)
+                   aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe()));
+                 if (aType == VISU::TMESH)  
+                   aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe()));
                  break;
-               case 1: //WIREFRAME
+               case VISU::WIREFRAME :
+                 aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints()));
                  aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface()));
+                 if (aType == VISU::TMESH || aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE)
+                   aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe()));
+                 if (aType == VISU::TMESH)
+                   aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe()));
+                 break;
+               case VISU::SHADED :
                  aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints()));
+                 aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe()));
+                 if (aType == VISU::TMESH || aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE)
+                   aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe()));
+                 if (aType == VISU::TMESH)
+                   aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe()));
                  break;
-               case 2: //SURFACE
+               case VISU::INSIDEFRAME :
+                 aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints()));
+                 aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface()));
                  aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe()));
+                 if (aType == VISU::TMESH)
+                   aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe()));
+                 break;
+               case VISU::SURFACEFRAME :
                  aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints()));
+                 aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface()));
+                 aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe()));
+                 aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe()));
                  break;
                }
-               if (anVISUActor->GetShrinkable()) {
-                 if (anVISUActor->isShrunk())
-                   aPresMenu->insertItem("Unshrink", visuGUI, SLOT(MakeShrink()));
-                 else
-                   aPresMenu->insertItem("Shrink", visuGUI, SLOT(MakeShrink()));
+               if(anVISUActor->GetShrinkable())
+                 if(aType != VISU::TVECTORS && aType != VISU::TSTREAMLINES){
+                   if (anVISUActor->IsShrunk())
+                     aPresMenu->insertItem("Unshrink", visuGUI, SLOT(MakeShrink()));
+                   else
+                     aPresMenu->insertItem("Shrink", visuGUI, SLOT(MakeShrink()));
+                 }
+               thePopup->insertItem("Representation", aPresMenu);
+
+               // Add Properties
+               QPopupMenu* aPropMenu = new QPopupMenu(GetDesktop());
+               if(aType == VISU::TMESH){
+                 if(aRepresent == VISU::SURFACEFRAME){
+                   aPropMenu->insertItem("Cell Color", visuGUI, SLOT(ChageColor()));
+                   aPropMenu->insertItem("Edge Color", visuGUI, SLOT(ChangeWireframeColor()));
+                 }else
+                   aPropMenu->insertItem("Color", visuGUI, SLOT(ChageColor()));
+               }else if(aType == VISU::TDEFORMEDSHAPE)
+                 aPropMenu->insertItem("Color", visuGUI, SLOT(ChageColor()));
+
+               if (aType != VISU::TVECTORS && aType != VISU::TSTREAMLINES)
+                 aPropMenu->insertItem("Opacity", visuGUI, SLOT(ChangeOpacity()));
+               if (aType != VISU::TVECTORS){
+                 aPropMenu->insertItem("Line width", visuGUI, SLOT(ChangeLines()));
+                 thePopup->insertItem("Properties", aPropMenu);                  
                }
-               thePopup->insertItem("Representation", aPresMenu);        
+               thePopup->insertSeparator();
              }
-             
-             // Add Properties
-             QPopupMenu* aPropMenu = new QPopupMenu(GetDesktop());
-             if ((aType == VISU::TMESH) || 
-                 (aType ==  VISU::TDEFORMEDSHAPE) || 
-                 (aType == VISU::TVECTORS) ||
-                 (aType == VISU::TSTREAMLINES))
-               aPropMenu->insertItem("Color", visuGUI, SLOT(ChageColor()));
-             if (aType == VISU::TMESH)
-               aPropMenu->insertItem("Outline Color", visuGUI, SLOT(ChangeOutlineColor()));
-             
-             if ((aType != VISU::TVECTORS) && (aType != VISU::TSTREAMLINES))
-               aPropMenu->insertItem("Opacity", visuGUI, SLOT(ChangeOpacity()));
-             aPropMenu->insertItem("Line width", visuGUI, SLOT(ChangeLines()));
-             thePopup->insertItem("Properties", aPropMenu);              
-             
-             thePopup->insertSeparator();
            }
            thePopup->insertItem("Rename...", visuGUI, SLOT(Rename()));
            if (aType != VISU::TMESH) {
@@ -2607,12 +2864,11 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
                thePopup->insertItem("Edit...", visuGUI, SLOT(EditPrs()));
              thePopup->insertItem("Edit Scalar Bar...", visuGUI, SLOT(EditScalarBar()));
              
-             if ((aType != VISU::TVECTORS) && (aType != VISU::TSTREAMLINES) 
-                  && (aType != VISU::TCUTLINES) && isVTKViewer)
-               thePopup->insertItem("Sweep", visuGUI, SLOT(Sweep()));
-             
              if (aType == VISU::TCUTLINES)
                thePopup->insertItem( "Create Table", visuGUI, SLOT( CreateTable() ) ); 
+
+             thePopup->insertItem("Sweep", visuGUI, SLOT(Sweep()));
+             
            }
            if (isVTKViewer) {
              if ( theParent == "Viewer" && 
@@ -2620,18 +2876,24 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
                     aType == VISU::TSCALARMAP || 
                     aType == VISU::TDEFORMEDSHAPE ) ) {
                thePopup->insertSeparator();
-               if ( Sel->SelectionMode() == SelectionPoint ) {
-                 thePopup->insertItem("Results at Point", visuGUI, SLOT(InfoOnPoint()));
+               TColStd_MapOfInteger aMapIndex;
+               aSelection->GetIndex(anIO,aMapIndex);
+               if ( aSelection->SelectionMode() == SelectionPoint ) {
+                 if(aMapIndex.Extent() == 1) 
+                   thePopup->insertItem("Results at Point", visuGUI, SLOT(InfoOnPoint()));
                  thePopup->insertItem("Select a Point",   visuGUI, SLOT(SelectPoint()));
                }
-               else if ( Sel->SelectionMode() == SelectionCell) {
-                 thePopup->insertItem("Results on Cell", visuGUI, SLOT(InfoOnCell()));
+               else if ( aSelection->SelectionMode() == SelectionCell) {
+                 if(aMapIndex.Extent() == 1) 
+                   thePopup->insertItem("Results on Cell", visuGUI, SLOT(InfoOnCell()));
                  thePopup->insertItem("Select a Cell",  visuGUI, SLOT(SelectCell()));
                }
              }
              thePopup->insertSeparator();
-             if (visuGUI->IsDisplayed(aPrsObject) )
+             
+             if (visuGUI->IsDisplayed(aPrsObject) ){
                thePopup->insertItem("Erase", visuGUI, SLOT(ErasePrs()));
+             }
              else
                thePopup->insertItem("Display", visuGUI, SLOT(DisplayPrs()));
              
@@ -2647,8 +2909,9 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri
       }
       return false;
     }
+    
     else {
-      // possibly this is the MED field/mesh and suppot objects
+      // possibly this is the MED field/mesh and support objects
       SALOME_MED::MED_ptr aMED = SALOME_MED::MED::_narrow( anObject );
       if(!CORBA::is_nil(aMED))
        thePopup->insertItem( "Import Structure", visuGUI, SLOT( ImportMedField() ) );
@@ -2734,14 +2997,10 @@ void VisuGUI::BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
   BEGIN_OF("VisuGUI::BuildPresentation");
 
   if (theIO.IsNull()) {
-    MESSAGE("VisuGUI::BuildPresentation(): null SALOME_InteractiveObject passed");
+    if(MYDEBUG) MESSAGE("VisuGUI::BuildPresentation(): null SALOME_InteractiveObject passed");
     return;
   }
 
-   /* Create or retrieve an object VisuGUI */
-
-  VisuGUI::GetOrCreateVisuGUI(QAD_Application::getDesktop());
-
   SALOMEDS::Study_var aStudy = GetActiveStudy()->getStudyDocument();
   SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
 
@@ -2752,34 +3011,28 @@ void VisuGUI::BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
   SALOMEDS::SObject_var aSObj = aStudy -> FindObjectID ( theIO->getEntry() );
   SCRUTE(aSObj);
   if (aSObj -> _is_nil() ) {
-    MESSAGE("No SObject for interacative object is found");
+    if(MYDEBUG) MESSAGE("No SObject for interacative object is found");
     return;
   }
   
   CORBA::Object_var anObject = VISU::SObjectToObject(aSObj);
   if(!CORBA::is_nil(anObject)) {
-    
     VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(anObject));
     if ( !aPrsObject ) {
-      MESSAGE("The object is not VISU::Prs3d_i");
+      if(MYDEBUG) MESSAGE("The object is not VISU::Prs3d_i");
       return;
     }
     VISU_Actor *SelectedActor = visuGUI->GetActor(aPrsObject);
-    if ( ! SelectedActor )
-      SelectedActor = aPrsObject -> CreateActor();
-    SCRUTE(SelectedActor);
-    if  ( SelectedActor == NULL )   {  
-      MESSAGE("VisuGUI::BuildPresentation(): actor doesn't exist in Render");
-      return;
-    }
-    VTKViewer_ViewFrame* vf = GetVtkViewFrame();
-    vf->AddActor(SelectedActor);
-  }
-    else {
-      MESSAGE("CORBA::is_nil(anObject) = true");
-    }
+    if(!SelectedActor)
+      try{
+       SelectedActor = aPrsObject -> CreateActor();
+       if(VTKViewer_ViewFrame* vf = GetVtkViewFrame())
+         vf->AddActor(SelectedActor);
+      }catch(std::runtime_error& exc){
+      }
+  }else
+    if(MYDEBUG) MESSAGE("CORBA::is_nil(anObject) = true");
   END_OF("VisuGUI::BuildPresentation");
-
 }
 
 extern "C"
@@ -2787,25 +3040,25 @@ extern "C"
  
   bool OnGUIEvent(int theCommandID, QAD_Desktop* parent)
   {
-    //MESSAGE("VisuGUI::OnGUIEvent "<< theCommandID);
+    //if(MYDEBUG) MESSAGE("VisuGUI::OnGUIEvent "<< theCommandID);
     return VisuGUI::OnGUIEvent(theCommandID, parent);
   }
 
   bool OnKeyPress (QKeyEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
   {
-    MESSAGE("VisuGUI::OnKeyPress ");
+    if(MYDEBUG) MESSAGE("VisuGUI::OnKeyPress ");
     return VisuGUI::OnKeyPress (pe, parent, studyFrame);
   }
 
   bool OnMousePress (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
   {
-    //MESSAGE("VisuGUI::OnMousePress ");
+    //if(MYDEBUG) MESSAGE("VisuGUI::OnMousePress ");
     return VisuGUI::OnMousePress (pe, parent, studyFrame);
   }
 
   bool OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
   {
-    //MESSAGE("VisuGUI::OnMouseMove ");
+    //if(MYDEBUG) MESSAGE("VisuGUI::OnMouseMove ");
     return VisuGUI::OnMouseMove (pe, parent, studyFrame);
   }
 
@@ -2853,44 +3106,69 @@ extern "C"
 //
 
 void VisuGUI::NewColor(VISU_Actor *theActor){
-  if(VISU::Prs3d_i* aPrs3d = theActor->getPrs3d()){
-    SALOMEDS::Color anOldColor = aPrs3d->GetColor(), aNewColor;
+  if(VISU::Prs3d_i* aPrs3d = theActor->GetPrs3d()){
+    VISU::Mesh_i* aMesh = dynamic_cast<VISU::Mesh_i*>(aPrs3d);
+    VISU::DeformedShape_i* aDeformedShape = dynamic_cast<VISU::DeformedShape_i*>(aPrs3d);
+    SALOMEDS::Color anOldColor, aNewColor;
+    int aRepresent = theActor->GetRepresentation();
+    if(aMesh)
+      switch(aRepresent){
+      case VISU::POINT :
+       anOldColor = aMesh->GetNodeColor();
+       break;
+      case VISU::WIREFRAME :
+      case VISU::INSIDEFRAME :
+       anOldColor = aMesh->GetLinkColor();
+       break;
+      case VISU::SHADED :
+      case VISU::SURFACEFRAME :
+       anOldColor = aMesh->GetCellColor();
+       break;
+      }
+    else if(aDeformedShape)
+      anOldColor = aDeformedShape->GetColor();
+    else
+      return;
     QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B));
     QColor aColorNew = QColorDialog::getColor(aColor, GetDesktop());
     if(aColorNew.isValid()){
       aNewColor.R = aColorNew.red()/255.;
       aNewColor.G = aColorNew.green()/255.;
       aNewColor.B = aColorNew.blue()/255.;
-      aPrs3d->SetColor(aNewColor);
-      aPrs3d->Update();
-      for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++)
-       if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){
-         QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame();
-         if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast<VTKViewer_ViewFrame*>(aVFrame))
-           if(VISU_Actor* anActor = GetActor(aPrs3d,aViewFrame))
-             aPrs3d->UpdateActor(anActor);
+      if(aMesh)
+       switch(aRepresent){
+       case VISU::POINT :
+         aMesh->SetNodeColor(aNewColor);
+         break;
+       case VISU::WIREFRAME :
+       case VISU::INSIDEFRAME :
+         aMesh->SetLinkColor(aNewColor);
+         break;
+       case VISU::SHADED :
+       case VISU::SURFACEFRAME :
+         aMesh->SetCellColor(aNewColor);
+         break;
        }
+      else
+       aDeformedShape->SetColor(aNewColor);
+      RecreateActor(aPrs3d);
     }
   }
 }
 
-void VisuGUI::NewOutlineColor(VISUMesh_Actor *theActor){
-  if(VISU::Mesh_i* aPrs3d = dynamic_cast<VISU::Mesh_i*>(theActor->getPrs3d())){
-    SALOMEDS::Color anOldColor = aPrs3d->GetColor(), aNewColor;
-    QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B));
-    QColor aColorNew = QColorDialog::getColor(aColor, GetDesktop());
-    if(aColorNew.isValid()){
-      aNewColor.R = aColorNew.red()/255.;
-      aNewColor.G = aColorNew.green()/255.;
-      aNewColor.B = aColorNew.blue()/255.;
-      aPrs3d->SetLinkColor(aNewColor);
-      for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++)
-       if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){
-         QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame();
-         if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast<VTKViewer_ViewFrame*>(aVFrame))
-           if(VISU_Actor* anActor = GetActor(aPrs3d,aViewFrame))
-             aPrs3d->UpdateActor(anActor);
-       }
+void VisuGUI::NewWireframeColor(VISU_MeshAct *theActor){
+  if(VISU::Prs3d_i* aPrs3d = theActor->GetPrs3d()){
+    if(VISU::Mesh_i* aMesh = dynamic_cast<VISU::Mesh_i*>(aPrs3d)){
+      SALOMEDS::Color anOldColor = aMesh->GetLinkColor(), aNewColor;
+      QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B));
+      QColor aColorNew = QColorDialog::getColor(aColor, GetDesktop());
+      if(aColorNew.isValid()){
+       aNewColor.R = aColorNew.red()/255.;
+       aNewColor.G = aColorNew.green()/255.;
+       aNewColor.B = aColorNew.blue()/255.;
+       aMesh->SetLinkColor(aNewColor);
+       VisuGUI::RecreateActor(aMesh);
+      }
     }
   }
 }
@@ -3054,7 +3332,6 @@ QString VisuGUI::getVisuOutputDir()
 /* ======================================================================================== */
 VISU::Result_i* VisuGUI::CreatePresent(SALOMEDS::SObject_var theField, VISU::Result_var& theResult){
   if(MYDEBUG) MESSAGE("VisuGUI::CreatePresent");
-  VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() );
   SALOMEDS::SObject_var aSObj = theField->GetFather(); 
   if (CORBA::is_nil(aSObj)) return NULL;
   aSObj = aSObj->GetFather(); if (CORBA::is_nil(aSObj)) return NULL;
@@ -3074,7 +3351,7 @@ VISU::Result_i* VisuGUI::CreatePresent(SALOMEDS::SObject_var theField, VISU::Res
 #define CREATEPRS(PRSTYPE, FNAME, FCREATE) \
 PRSTYPE* FNAME(SALOMEDS::SObject_var theField, \
               const char* theMeshName, VISU::Entity theEntity, \
-              const char* theFieldName, double theTimeId) {\
+              const char* theFieldName, int theTimeId) {\
   VISU::Result_var aResult; \
   VISU::Result_i* pResult = CreatePresent(theField,aResult); \
   if(pResult != NULL){ \
@@ -3114,23 +3391,26 @@ bool FNAME(SALOMEDS::SObject_var theField) { \
   QString aTimeStampId = VISU::Storable::FindValue(aMap,"myTimeStampId",&isExist).latin1(); \
   Utils_Timer timer; \
   if(MYCHECKTIME) timer.Start(); \
-  TYPE* pPresent = FCREATE(theField,aMeshName,(VISU::Entity)anEntity.toInt(),aFieldName,aTimeStampId.toDouble()); \
+  TYPE* pPresent = FCREATE(theField,aMeshName,(VISU::Entity)anEntity.toInt(),aFieldName,aTimeStampId.toInt()); \
   if(MYCHECKTIME) { \
     timer.Stop(); \
-    MESSAGE("BUILDPRS(TYPE, FCREATE, FNAME, DLGNAME) - CREATE PRSOBJECT"); \
+    cout<<"BUILDPRS(TYPE, FCREATE, FNAME, DLGNAME) - CREATE PRSOBJECT\n"; \
     timer.Show(); \
   } \
   if (pPresent) { \
-    DLGNAME* aDlg = new DLGNAME(); \
-    aDlg->initFromPrsObject(pPresent); \
-    if (aDlg->exec()) { \
-      aDlg->storeToPrsObject(pPresent); \
-    } else { \
-      DeletePresentation(pPresent); \
+    QString aValue = QAD_CONFIG->getSetting("Visu:BuildDefaultPrs3d"); \
+    if(aValue.isEmpty() || (!aValue.isEmpty() && !aValue.toInt())){ \
+      DLGNAME* aDlg = new DLGNAME(); \
+      aDlg->initFromPrsObject(pPresent); \
+      if (aDlg->exec()) { \
+        aDlg->storeToPrsObject(pPresent); \
+      } else { \
+        DeletePresentation(pPresent); \
+        delete aDlg; \
+        return false; \
+      } \
       delete aDlg; \
-      return false; \
     } \
-    delete aDlg; \
     CreateActor(pPresent); \
     return true; \
   } \
@@ -3155,26 +3435,40 @@ void VisuGUI::ImportTablesFromFile(){
   flt.append( "Files (*.xls *.txt *.tab)" );
   flt.append( "All Files (*.*)" );
   QString aDir = getVisuInputDir();
-  QString aFile = QAD_FileDlg::getFileName(QAD_Application::getDesktop(),
+  QFileInfo aFileInfo = QAD_FileDlg::getFileName(QAD_Application::getDesktop(),
                                           aDir,flt,tr("Import From File"),true);
-  if(!aFile.isEmpty()){
-    QAD_Application::getDesktop()->putInfo( "Importing From File " + aFile + "..." );
-    aDir = QAD_Tools::getDirFromPath(aFile);
+  
+  if(aFileInfo.exists()){
+    QAD_Application::getDesktop()->putInfo( "Importing From File " + aFileInfo.filePath() + "..." );
+    aDir = QAD_Tools::getDirFromPath(aFileInfo.filePath());
     QAD_CONFIG->addSetting("Visu:InputDir",aDir);
-    QApplication::setOverrideCursor( Qt::waitCursor );
-    QAD_PyInterp* myPyInterp = GetActiveStudy()->get_PyInterp();
-    myPyInterp->run("import VisuGUI");
-    myPyInterp->run("reload(VisuGUI)");
-    myPyInterp->run("VisuGUI.AddTablesInStudyFromFile('"+aFile+"')");
-    //     VISU::Result_var aResult = myComponent->ImportFile(aFile.latin1());
-    //     if(aResult->_is_nil())
-    //       QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"),
-    //                               tr ("There is an error in imported file"),
-    //                               tr ("VISU_BUT_OK") );
-    //     else
-    // QAD_Application::getDesktop()->putInfo(aFile+" imported.");
+    QAD_WaitCursor wc;
+
+    CORBA::Object_var anObject;
+#ifdef CHECKTIME
+    Utils_Timer timer;
+    timer.Start();
+#endif
+   
+    anObject=GetVisuGen()->ImportTables(aFileInfo.filePath());
+    
+#ifdef CHECKTIME
+    timer.Stop();
+    cout<<"VisuGUI::ImportTablesFromFile() - IMPORT FILE\n";
+    timer.Show();
+#endif
+    
+    if(CORBA::is_nil(anObject)) {
+      wc.stop();
+      QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"),
+                             tr ("ERR_ERROR_IN_THE_FILE"),
+                             tr ("VISU_BUT_OK") );
+      wc.start();
+    }
+    else {
+      QAD_Application::getDesktop()->putInfo(aFileInfo.filePath()+" imported.");
+    }
     GetActiveStudy()->updateObjBrowser(); //update Object browser
-    QApplication::restoreOverrideCursor();
   }
 }
 
@@ -3187,32 +3481,46 @@ void VisuGUI::ImportFromFile(){
   //flt.append( "Exportable Files (*.med *.dat)" );
   //flt.append( "Dat Files (*.dat)" );
   flt.append( "Med Files (*.med)" );
-  flt.append( "Dat Files (*.xls)" );
   QString aDir = getVisuInputDir();
-  QFileInfo aFileInfo = QAD_FileDlg::getFileName(QAD_Application::getDesktop(),
-                                                aDir,flt,tr("Import From File"),true);
+  QFileInfo aFileInfo = VisuGUI_FileDlg::getFileName(QAD_Application::getDesktop(),
+                                                    aDir,flt,tr("Import From File"),true);
+  
   if(aFileInfo.exists()){
     QAD_Application::getDesktop()->putInfo( "Importing From File " + aFileInfo.filePath() + "..." );
     aDir = QAD_Tools::getDirFromPath(aFileInfo.filePath());
     QAD_CONFIG->addSetting("Visu:InputDir",aDir);
     QAD_WaitCursor wc;
-
-    CORBA::Object_var anObject;
+    
+    VISU::Result_var aResult;
+    
 #ifdef CHECKTIME
     Utils_Timer timer;
     timer.Start();
 #endif
-    if(aFileInfo.extension(false) == "med")
-       anObject = GetVisuGen()->ImportFile(aFileInfo.filePath());
-    else if(aFileInfo.extension(false) == "xls")
-       anObject = GetVisuGen()->ImportTables(aFileInfo.filePath());
+    if(aFileInfo.extension(false) == "med"){
+      QString IsBuild = QAD_CONFIG->getSetting("Visu:BuildResult");
+      bool isBuild = (IsBuild.isEmpty()? 0 : IsBuild.toInt());
+      
+      if (VisuGUI_FileDlg::IsBuild)
+       {
+         aResult = GetVisuGen()->ImportFile(aFileInfo.filePath());
+         if(!CORBA::is_nil(aResult.in())) aResult->BuildAll();  
+       }
+      else
+       {
+         QAD_CONFIG->addSetting( "Visu:BuildResult", false );
+         aResult=GetVisuGen()->ImportFile( aFileInfo.filePath() );
+         QAD_CONFIG->addSetting( "Visu:BuildResult", isBuild );
+       }
+    }
+    
 #ifdef CHECKTIME
     timer.Stop();
-    MESSAGE("VisuGUI::ImportFromFile() - IMPORT FILE");
+    cout<<"VisuGUI::ImportFromFile() - IMPORT FILE\n";
     timer.Show();
 #endif
 
-    if(CORBA::is_nil(anObject)) {
+    if(CORBA::is_nil(aResult.in())) {
       wc.stop();
       QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"),
                             tr ("ERR_ERROR_IN_THE_FILE"),
@@ -3265,7 +3573,7 @@ bool VisuGUI::TestObjectBrowser(SALOMEDS::SObject_var& objVisu ){
   if(MYDEBUG) MESSAGE("VisuGUI::TestObjectBrowser");
   Handle(SALOME_InteractiveObject) anIO;    
   CORBA::Object_var anObject = GetSelectedObj(&anIO);
-  if(anIO->hasEntry()){
+  if(!anIO.IsNull() && anIO->hasEntry()){
     objVisu = GetStudyDocument()->FindObjectID(anIO->getEntry());
     QString aValue = getValue(objVisu,"myType");
     if((VISU::VISUType)aValue.toInt() == VISU::TTIMESTAMP) return true;
@@ -3286,7 +3594,7 @@ VISU_Actor* VisuGUI::GetActor(VISU::Prs3d_i* thePrs, VTKViewer_ViewFrame* theVie
   vtkActorCollection *anActColl = vf->getRenderer()->GetActors();
   for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL;)
     if(VISU_Actor* anVISUActor = dynamic_cast<VISU_Actor*>(anActor))
-      if(thePrs == anVISUActor->getPrs3d())
+      if(thePrs == anVISUActor->GetPrs3d())
        return anVISUActor->GetParent();
   return NULL;
 }
@@ -3309,26 +3617,28 @@ VISU_Actor* VisuGUI::UpdateViewer(VISU::Prs3d_i* thePrs, bool theDispOnly){
   for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){
     if(anActor->IsA("VISU_Actor")){ 
       anVISUActor = VISU_Actor::SafeDownCast(anActor);
-      VISU::Prs3d_i* aPrs = anVISUActor->getPrs3d();      
+      VISU::Prs3d_i* aPrs = anVISUActor->GetPrs3d();      
       if(aPrs == NULL) continue;
       if (thePrs == aPrs) {
        aResActor = anVISUActor->GetParent();
        thePrs->UpdateActor(aResActor);
        aResActor->VisibilityOn();
+        
       } else if (theDispOnly) {
-       anVISUActor->VisibilityOff();
+       anVISUActor->GetParent()->VisibilityOff();
       }
     } 
   }
   if (aResActor) return aResActor;
-  anVISUActor = thePrs->CreateActor();
-  MESSAGE("UpdateViewer - thePrs->CreateActor() = "<<anVISUActor);
-  if ( anVISUActor ) {
+  try{
+    anVISUActor = thePrs->CreateActor();
     vf->AddActor(anVISUActor);
-  } else 
+  }catch(std::runtime_error& exc){
     QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"),
                            tr ("ERR_CANT_VISUALIZE_OBJECT"),
                            tr ("VISU_BUT_OK") );
+    anVISUActor = NULL;
+  }
   return anVISUActor;
 }
 
@@ -3375,27 +3685,26 @@ void VisuGUI::DeletePresentation(VISU::Prs3d_i* thePrs) {
  * Creates new actor of presentation
  */
 void VisuGUI::CreateActor(VISU::Prs3d_i* thePrs) {
- if (!thePrs) return;
 if (!thePrs) return;
   QApplication::setOverrideCursor( Qt::waitCursor );
-  VTKViewer_ViewFrame* vf = GetVtkViewFrame();
-  if (vf) {
+  if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){
 #ifdef CHECKTIME
-  Utils_Timer timer;
-  timer.Start();
+    Utils_Timer timer;
+    timer.Start();
 #endif
-    VISU_Actor* aActor = thePrs->CreateActor();
-    if ( ! aActor ) {
+    try{
+      VISU_Actor* aActor = thePrs->CreateActor();
+      vf->AddActor(aActor);
+    }catch(std::runtime_error& exc){
       QApplication::restoreOverrideCursor();
       QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"),
-                            tr ("WRN_CANT_VISUALIZE_PRS"),
-                            tr ("VISU_BUT_OK") );
-      return;
+                             tr ("WRN_CANT_VISUALIZE_PRS"),
+                             tr ("VISU_BUT_OK") );
     }
-    vf->AddActor(aActor);
 #ifdef CHECKTIME
-  timer.Stop();
-  MESSAGE("VisuGUI::CreateActor(VISU::Prs3d_i* thePrs) - DISPLAY ACTOR");
-  timer.Show();
+    timer.Stop();
+    cout<<"VisuGUI::CreateActor(VISU::Prs3d_i* thePrs) - DISPLAY ACTOR\n";
+    timer.Show();
 #endif
   }
   QApplication::restoreOverrideCursor();
index ad52d84ff17eacbe2e8988b8cce73d29720b52ba..1c97bbb96f97614dfac859d45e980b0b078225b6 100644 (file)
 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
 
 #include "QAD_Desktop.h"
-#include "VISU_Actor.h"
-#include "VISU_PrsObject_i.hh"
-#include "VISU_Table_i.hh"
-#include "VISU_ViewManager_i.hh"
+class VTKViewer_ViewFrame;
+
+#include "VISUConfig.hh"
+class VISU_Actor;
+class VISU_MeshAct;
+class VISU_ScalarMapAct;
+
+#include <vtkDataSet.h>
+class vtkRenderer;
 
 #include <TColStd_MapOfInteger.hxx>
 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
 #include "SALOME_ListIteratorOfListIO.hxx"
 
-class vtkRenderer;
+namespace VISU{
+  class VISU_Gen_i;
 
-enum RepresentType { POINTS, WIREFRAME, SURFACE, SHRINK };
+  class Result_i;
 
+  class Prs3d_i;
+  class ScalarMap_i;
+  class DeformedShape_i;
+  class IsoSurfaces_i;
+  class CutPlanes_i;
+  class CutLines_i;
+  class Vectors_i;
+  class StreamLines_i;
 
+  class Table_i;
+  class Curve_i;
+  class Container_i;
+}
 
 // ======================================================================
 //                             CLASS VIUSGUI
 // ======================================================================
 // 
+
 class VisuGUI : public QObject{
   Q_OBJECT;
  public:
   VisuGUI();     
   ~VisuGUI();    
-
+  
   static VISU::VISU_Gen_i* GetVisuGen();
 
   static QAD_Desktop* GetDesktop();
@@ -74,46 +93,53 @@ class VisuGUI : public QObject{
   static SALOMEDS::StudyBuilder_var NewBuilder();
   static VISU::Storable::TRestoringMap getMapOfValue(SALOMEDS::SObject_var theSObject);
 
-  static  VisuGUI* GetOrCreateVisuGUI(QAD_Desktop* desktop);
-  static  VisuGUI* GetVisuGUI() ;
-
   static VISU::Result_i*  CreatePresent(SALOMEDS::SObject_var theField, VISU::Result_var& theResult);
 
+  enum CameraOrient {e3D, eFront, eLeft, eTop};
+  static CameraOrient SetFitAll( VTKViewer_ViewFrame* vf);
+
   bool CreateScalarMap(SALOMEDS::SObject_var theField);
   static VISU::ScalarMap_i* CreateScalarMapPrs(SALOMEDS::SObject_var theField, 
                                               const char* theMeshName, VISU::Entity theEntity, 
-                                              const char* theFieldName, double theTimeId);
+                                              const char* theFieldName, int theTimeId);
   bool CreateDeformedShape(SALOMEDS::SObject_var theField);
   static VISU::DeformedShape_i* CreateDeformedShapePrs(SALOMEDS::SObject_var theField, 
                                                       const char* theMeshName, VISU::Entity theEntity, 
-                                                      const char* theFieldName, double theTimeId);
+                                                      const char* theFieldName, int theTimeId);
   bool CreateVectors(SALOMEDS::SObject_var theField);
   static VISU::Vectors_i* CreateVectorsPrs(SALOMEDS::SObject_var theField, 
                                           const char* theMeshName, VISU::Entity theEntity, 
-                                          const char* theFieldName, double theTimeId);
+                                          const char* theFieldName, int theTimeId);
   bool CreateIsoSurfaces(SALOMEDS::SObject_var theField);
   static VISU::IsoSurfaces_i* CreateIsoSurfacesPrs(SALOMEDS::SObject_var theField, 
                                                   const char* theMeshName, VISU::Entity theEntity, 
-                                                  const char* theFieldName, double theTimeId);
+                                                  const char* theFieldName, int theTimeId);
   bool CreateCutPlanes(SALOMEDS::SObject_var theField);
   static VISU::CutPlanes_i* CreateCutPlanesPrs(SALOMEDS::SObject_var theField, 
                                               const char* theMeshName, VISU::Entity theEntity, 
-                                              const char* theFieldName, double theTimeId);
+                                              const char* theFieldName, int theTimeId);
   bool CreateCutLines(SALOMEDS::SObject_var theField);
   static VISU::CutLines_i* CreateCutLinesPrs(SALOMEDS::SObject_var theField, 
                                             const char* theMeshName, VISU::Entity theEntity, 
-                                            const char* theFieldName, double theTimeId);
+                                            const char* theFieldName, int theTimeId);
   bool CreateStreamLines(SALOMEDS::SObject_var theField);
   static VISU::StreamLines_i* CreateStreamLinesPrs(SALOMEDS::SObject_var theField, 
                                                   const char* theMeshName, VISU::Entity theEntity, 
-                                                  const char* theFieldName, double theTimeId);
+                                                  const char* theFieldName, int theTimeId);
   bool TestObjectBrowser(SALOMEDS::SObject_var& objVisu);
+
+  typedef void (*TGetInfoFun)(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId);
+  void GetInfo(int theSelectionMode, TGetInfoFun theGetInfoFun);
+
+  typedef int (vtkDataSet::* TSelectFun)();
+  void Select(int theSelectionMode, TSelectFun theSelectFun, 
+             const char* theTitle, const char* theRequest);
   
   static void ShowTrihedron(bool Show);
   static void ChangeViewer(int theType);
             
   static void NewColor(VISU_Actor *Actor);
-  static void NewOutlineColor(VISUMesh_Actor *Actor);
+  static void NewWireframeColor(VISU_MeshAct *Actor);
   static void NewOpacity(VISU_Actor *Actor);
   static void NewLinewidth(VISU_Actor *Actor);
             
@@ -135,12 +161,11 @@ class VisuGUI : public QObject{
   void ErasePrs(VISU::Prs3d_i* thePrs);
   
   static VISU::Prs3d_i* GetSelectedPrs3d(Handle(SALOME_InteractiveObject)* theIO = NULL);
-  void RecreateActor(VISU::Prs3d_i* thePrs);
+  static void RecreateActor(VISU::Prs3d_i* thePrs);
   static void CreateActor(VISU::Prs3d_i* thePrs);
-  static VISU_Actor *GetActor(int* theSelectionType = NULL);
   static VISU_Actor* GetActor(VISU::Prs3d_i* thePrs, VTKViewer_ViewFrame* theViewFrame = NULL);
   
-  void VisuGUI::ChangeRepresentation(RepresentType theType);
+  void VisuGUI::ChangeRepresentation(VISU::PresentationType theType);
   void DeletePresentation(VISU::Prs3d_i* thePrs);
   
   void         SetState(int aState );
@@ -193,15 +218,18 @@ class VisuGUI : public QObject{
   void EditPrs();
   void EditScalarBar();
   void DisplayManyPrs();
+  void DisplayOnlyManyPrs();
   void EraseManyPrs();
   
+  void MakeSurfaceframe();
+  void MakeInsideframe();
   void MakeWireframe();
   void MakeSurface();
   void MakePoints();
   void MakeShrink();
   
   void ChageColor();
-  void ChangeOutlineColor();
+  void ChangeWireframeColor();
   void ChangeOpacity();
   void ChangeLines();
   
@@ -216,6 +244,8 @@ class VisuGUI : public QObject{
   
   void DeletePrs();
   void Rename();
+  void RenameTable();
+  void RenameContainer();
   void Sweep();
   void TimeAnimation();
   
@@ -227,9 +257,10 @@ class VisuGUI : public QObject{
 
   void InfoOnPoint();
   void InfoOnCell();
+
   void SelectPoint();
   void SelectCell();
-
+  
 private :
   QDialog* myActiveDialogBox;
   int myState ;
index 0e87bf97cab33215f6b11438fd5810ff2c822977..5b55f9cd2c0d9381bc544a61ca8eaa39f9b27308 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI_CutPlanesDlg.h"
-#include <qlayout.h>
+#include "VISU_CutPlanes_i.hh"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qstyle.h>
+#include <qstring.h>
+#include <qvalidator.h>
+#include <qlineedit.h>
+
+using namespace std;
+
 /*!
   Constructor
 */
@@ -68,6 +77,17 @@ VisuGUI_CutPlanesDlg::VisuGUI_CutPlanesDlg()
   nbPlan->setValue( 1 );
   nbPlan->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 
+  myPosTable = new QTable(this, "Positions of planes" );
+  myPosTable->setMaximumHeight( 227 );
+  myPosTable->setMinimumWidth( 294 );
+  //myPosTable->setGeometry( QRect( 11, 98, 289, 325 ) );
+  myPosTable->setNumCols(2);
+  myPosTable->setNumRows(0);
+  
+  QHeader *th = myPosTable->horizontalHeader();
+  th->setLabel( 0, "Position" );
+  th->setLabel( 1, "Set default" );
+    
   QGroupBox* GBrot = new QGroupBox( tr( "Rotations" ), this, "GBrot" );
   GBrot->setColumnLayout(0, Qt::Vertical );
   GBrot->layout()->setSpacing( 0 );
@@ -117,26 +137,39 @@ VisuGUI_CutPlanesDlg::VisuGUI_CutPlanesDlg()
   QLabel* aPosLbl = new QLabel(tr( "LBL_POS" ), this);
   myPosSpn = new QAD_SpinBoxDbl( this, 0, 1, 0.1 );
 
+  th->setStyle("QStyle::CE_PushButton");
+
   // layouting
   TopLayout->addMultiCellWidget( SelPlane, 0, 0, 0, 1 );
-  TopLayout->addWidget( LabelPosi_3,   1, 0 );
-  TopLayout->addWidget( nbPlan,        1, 1 );
-  TopLayout->addMultiCellWidget( GBrot,        2, 2, 0, 1 );
-  TopLayout->addWidget(aPosLbl, 3, 0 );
-  TopLayout->addWidget(myPosSpn, 3, 1 );
-  TopLayout->addMultiCellWidget( GroupButtons, 4, 4, 0, 1 );
+  TopLayout->addMultiCellWidget( GBrot, 1, 1, 0, 1 );
+  TopLayout->addWidget( LabelPosi_3,   2, 0 );
+  TopLayout->addWidget( nbPlan,        2, 1 );
+  TopLayout->addMultiCellWidget( myPosTable, 3, 3, 0, 1 );
+  TopLayout->setRowStretch ( 3, 3 );
+  TopLayout->addWidget(aPosLbl, 4, 0 );
+  TopLayout->addWidget(myPosSpn, 4, 1 );
+  TopLayout->addMultiCellWidget( GroupButtons, 5, 5, 0, 1 );
 
   // signals and slots connections
   connect( SelPlane, SIGNAL( clicked( int )), this, SLOT( orientationChanged( int ) ) );
-  
+  connect( nbPlan, SIGNAL( valueChanged( int )), this, SLOT( DrawTable( ) ) );
+  connect( myPosSpn, SIGNAL( valueChanged( double )), this, SLOT( DrawTable( ) ) );
+  connect( RBzx, SIGNAL( toggled(bool)), this, SLOT( DrawTable( ) ) );
+  connect( RByz, SIGNAL( toggled(bool)), this, SLOT( DrawTable( ) ) );
+  connect( RBxy, SIGNAL( toggled(bool)), this, SLOT( DrawTable( ) ) );
+  connect( th, SIGNAL( clicked(int)), this, SLOT( setDefault(int) ) );
+
   connect( buttonOk,     SIGNAL( clicked() ), this, SLOT( accept() ) );
   connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
 
+  myCutPlanes = NULL;
+
   // default values
+  hasInit = false;
   X1 = 0; X2 = 0;
   Y1 = 0; Y2 = 0;
   Z1 = 0; Z2 = 0;
-  RBxy->setChecked( true );
+  RByz->setChecked( true );
   orientationChanged( 0 );
 }
 
@@ -145,6 +178,7 @@ VisuGUI_CutPlanesDlg::VisuGUI_CutPlanesDlg()
 */
 VisuGUI_CutPlanesDlg::~VisuGUI_CutPlanesDlg()
 {
+  if(myCutPlanes) delete myCutPlanes; 
 }
 
 
@@ -153,6 +187,11 @@ void VisuGUI_CutPlanesDlg::initFromPrsObject(VISU::CutPlanes_i* thePrs) {
   setRotation(thePrs->GetRotateX()*180./PI, thePrs->GetRotateY()*180./PI);
   setPlanePos(thePrs->GetOrientationType());
   myPosSpn->setValue(thePrs->GetDisplacement());
+  hasInit = true;
+  // init table
+  myCutPlanes = new VISU::CutPlanes_i(thePrs->GetResult(),false);
+  myCutPlanes->SameAs(thePrs);
+  DrawTable();
 }
 
 void VisuGUI_CutPlanesDlg::storeToPrsObject(VISU::CutPlanes_i* thePrs) {
@@ -161,7 +200,12 @@ void VisuGUI_CutPlanesDlg::storeToPrsObject(VISU::CutPlanes_i* thePrs) {
   thePrs->SetRotateY(getRotation2()*PI/180.);
   thePrs->SetOrientationType(getOrientaion());
   thePrs->SetDisplacement(myPosSpn->value());
-  thePrs->Update();
+  for (int i = 0; i < getNbPlanes(); ++i) 
+    {
+      if (!((QCheckBox*)myPosTable->cellWidget( i, 1 ))->isChecked())
+       thePrs->SetPlanePosition( i, ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->text().toDouble() );
+      else thePrs->SetDefault(i);
+    }
 }
 
 /*!
@@ -267,3 +311,87 @@ double VisuGUI_CutPlanesDlg::getRotation2()
 {
   return Rot2->value();
 }
+
+/*!
+  Draw the table of planes positions
+*/
+
+void VisuGUI_CutPlanesDlg::DrawTable()
+{
+  if (!hasInit) return;
+
+  int aNbRows = myPosTable->numRows();
+  int aNbPlanes = getNbPlanes();  
+     
+  if (aNbRows>0)
+    for (int i = 0; i < aNbRows; ++i) 
+      {
+       if (!((QCheckBox*)myPosTable->cellWidget( i, 1 ))->isChecked())
+         myCutPlanes->SetPlanePosition( i, ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->text().toDouble() );
+      }
+  
+  myCutPlanes->SetNbPlanes(aNbPlanes);
+  myCutPlanes->SetDisplacement(myPosSpn->value());
+  myCutPlanes->SetOrientationType(getOrientaion());
+
+  if (aNbRows < aNbPlanes)
+    {
+      if (aNbRows == 0) myPosTable->setNumRows(aNbPlanes);
+      else myPosTable->insertRows(aNbRows, aNbPlanes - aNbRows );
+      
+      QHeader *vh = myPosTable->verticalHeader();
+      QString str;
+
+      QDoubleValidator *dvalidator = new QDoubleValidator(myPosTable);
+      dvalidator->setDecimals(32);
+
+      for (int i = aNbRows; i < myPosTable->numRows(); ++i) 
+       {
+         QLineEdit *editline = new QLineEdit( myPosTable );
+         editline->setValidator(dvalidator);
+         myPosTable->setCellWidget( i, 0, editline );
+                 
+         QCheckBox *checkbox = new QCheckBox( myPosTable );
+         myPosTable->setCellWidget(i, 1, checkbox );
+         connect(checkbox , SIGNAL( clicked() ), this , SLOT( setDefault() ) );
+         
+         str = str.setNum(i+1);
+         str.prepend ("Plane# ");
+         vh->setLabel( i, str );
+       }
+    }
+  else if (aNbRows > aNbPlanes)
+    for (int i = aNbRows-1; myPosTable->numRows() != aNbPlanes; --i )
+      myPosTable->removeRow(i);
+  
+  for (int i = 0; i < myPosTable->numRows(); ++i) 
+    {
+      ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setText( QString::number(myCutPlanes->GetPlanePosition(i)) );
+      
+      if (myCutPlanes->IsDefault(i)) 
+       {
+         ((QCheckBox*)myPosTable->cellWidget( i, 1 ))->setChecked(true);
+         ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setEnabled(false);
+       }
+    }
+}
+
+void VisuGUI_CutPlanesDlg::setDefault(int all)
+{
+  if (all == 0) return;
+
+  if (all == 1)
+    for (int i = 0; i < getNbPlanes(); ++i) 
+      ((QCheckBox*)myPosTable->cellWidget( i, 1 ))->setChecked(true);
+       
+  for (int i = 0; i < getNbPlanes(); ++i) 
+    {
+      if ( ((QCheckBox*)myPosTable->cellWidget( i, 1 ))->isChecked() )
+       {
+         myCutPlanes->SetDefault(i);
+         ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setText( QString::number(myCutPlanes->GetPlanePosition(i)) );
+         ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setEnabled(false);
+       }
+      else ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setEnabled(true); 
+    }
+}
index 9432108f866c47eb69dc5afe1f6b77f4c6d82ceb..c26532fa627d03ef4548247716e554bdc22ef5f6 100644 (file)
@@ -29,6 +29,9 @@
 #ifndef VISUGUI_CUTPLANESDLG_H
 #define VISUGUI_CUTPLANESDLG_H
 
+#include "QAD_SpinBoxDbl.h"
+#include "VisuGUI_ScalarBarDlg.h"
+
 #include <qdialog.h>
 #include <qbuttongroup.h>
 #include <qgroupbox.h>
 #include <qpushbutton.h>
 #include <qradiobutton.h>
 #include <qspinbox.h>
-#include "QAD_SpinBoxDbl.h"
-#include "VISU_PrsObject_i.hh"
-#include "VisuGUI_ScalarBarDlg.h"
+#include <qtable.h>
 
+#include "SALOMEconfig.h"
+#include CORBA_CLIENT_HEADER(VISU_Gen)
+namespace VISU{
+  class CutPlanes_i;
+}
 
 class VisuGUI_CutPlanesDlg : public QDialog
 { 
@@ -62,8 +68,7 @@ public:
 
     void initFromPrsObject(VISU::CutPlanes_i* thePrs);
     void storeToPrsObject(VISU::CutPlanes_i* thePrs);
-
-
+   
 private:
     QLabel* LabelRot1;
     QLabel* LabelRot2;
@@ -74,22 +79,18 @@ private:
     QRadioButton* RByz;
     QRadioButton* RBxy;
     QAD_SpinBoxDbl* myPosSpn;
-
+    QTable* myPosTable;
+    VISU::CutPlanes_i* myCutPlanes;  
     double          X1, X2;
     double          Y1, Y2;
     double          Z1, Z2;
-    
+    bool hasInit;
 
 private slots:
     void editScalarBar();
     void orientationChanged( int );
+    void DrawTable();
+    void setDefault( int all = -1);
 };
 
 #endif // VISUGUI_CUTPLANESDLG_H
-
-
-
-
-
-
-
index 3b3f8e3e7c666a46008549432829ccf52aadb7ba..5977d5eedade169bf1cba5ec63ed8ed146881563 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI_IsoSurfacesDlg.h"
-#include <limits.h>
-#include <qlayout.h>
+#include "VISU_IsoSurfaces_i.hh"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
-#include <qvalidator.h>
 #include "QAD_MessageBox.h"
 
+#include <limits.h>
+
+#include <qlayout.h>
+#include <qvalidator.h>
+
+using namespace std;
 
 /*!
   Constructor
 */
 VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg()
-    : QDialog( QAD_Application::getDesktop(), "VisuGUI_IsoSurfacesDlg", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+  : QDialog( QAD_Application::getDesktop(), "VisuGUI_IsoSurfacesDlg", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
 {
   setCaption( tr( "Iso Surfaces Definition" ) );
   setSizeGripEnabled( TRUE );
-
+  
   QGridLayout* TopLayout = new QGridLayout( this ); 
   TopLayout->setSpacing( 6 );
   TopLayout->setMargin( 11 );
@@ -78,12 +82,21 @@ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg()
   LabelMax->setBuddy(MaxIso);
   TopGroupLayout->addWidget( MaxIso, 1, 1 );
   
+  CBUpdate = new QCheckBox ( tr( "Update scalar bar with these values" ), TopGroup);
+  CBUpdate->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed) );
+  TopGroupLayout->addMultiCellWidget( CBUpdate, 4, 4, 0, 1);
+  CBUpdate->setChecked(true);
+  
+  CBLog = new QCheckBox ( tr( "Logarithmic scaling" ), TopGroup);
+  CBLog->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed) );
+  TopGroupLayout->addMultiCellWidget( CBLog, 3, 3, 0, 1);
+  
   QLabel* LabelNbr = new QLabel( tr( "Number of surfaces:" ), TopGroup, "LabelNbr" );
   TopGroupLayout->addWidget( LabelNbr, 2, 0 );
   NbrIso = new QSpinBox( 1, 100, 1, TopGroup, "NbrIso" );
   NbrIso->setValue( 1 );
   TopGroupLayout->addWidget( NbrIso, 2, 1 );
-
+  
   QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" );
   GroupButtons->setGeometry( QRect( 10, 10, 281, 48 ) ); 
   GroupButtons->setColumnLayout(0, Qt::Vertical );
@@ -93,7 +106,7 @@ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg()
   GroupButtonsLayout->setAlignment( Qt::AlignTop );
   GroupButtonsLayout->setSpacing( 6 );
   GroupButtonsLayout->setMargin( 11 );
-
+  
   QPushButton* buttonOk = new QPushButton( tr( "&OK" ), GroupButtons, "buttonOk" );
   buttonOk->setAutoDefault( TRUE );
   buttonOk->setDefault( TRUE );
@@ -105,38 +118,66 @@ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg()
   
   TopLayout->addWidget( TopGroup,     0, 0 );
   TopLayout->addWidget( GroupButtons, 1, 0 );
-
+  
   // signals and slots connections
   connect( buttonOk,     SIGNAL( clicked() ), this, SLOT( accept() ) );
   connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
+  connect( CBUpdate, SIGNAL( clicked() ), this, SLOT(onCBUpdate() ) ); 
 }
 
 /*!
-   Destructor
+  Destructor
 */
 VisuGUI_IsoSurfacesDlg::~VisuGUI_IsoSurfacesDlg()
 {
 }
 
-
 void VisuGUI_IsoSurfacesDlg::initFromPrsObject(VISU::IsoSurfaces_i* thePrs) {
   NbrIso->setValue(thePrs->GetNbSurfaces());
-  MinIso->setText(QString::number(thePrs->GetRangeMin()));
-  MaxIso->setText(QString::number(thePrs->GetRangeMax()));
+  MinIso->setText(QString::number(thePrs->GetSubMin()));
+  MaxIso->setText(QString::number(thePrs->GetSubMax()));
+  switch(thePrs->GetScaling()){
+  case VISU::LOGARITHMIC : 
+    CBLog->setChecked(true);
+    break;
+  default:  
+    CBLog->setChecked(false);
+  }
 }
 
-
 void VisuGUI_IsoSurfacesDlg::storeToPrsObject(VISU::IsoSurfaces_i* thePrs) {
   thePrs->SetNbSurfaces(NbrIso->value());
-  thePrs->SetRange(MinIso->text().toDouble(), MaxIso->text().toDouble());
-  thePrs->Update();
+  thePrs->SetSubRange(MinIso->text().toDouble(), MaxIso->text().toDouble());
+  if (CBUpdate->isChecked())
+    {
+      thePrs->SetRange(MinIso->text().toDouble(), MaxIso->text().toDouble());
+      if (CBLog->isChecked())
+       thePrs->SetScaling(VISU::LOGARITHMIC);
+      else 
+       thePrs->SetScaling(VISU::LINEAR);
+    }
 }
 
 void VisuGUI_IsoSurfacesDlg::accept() {
+  
   if (MinIso->text().toDouble() >= MaxIso->text().toDouble())
     QAD_MessageBox::warn1( this,tr("VISU_WARNING"),
-                               tr("MSG_MINMAX_VALUES"),
-                               tr("VISU_BUT_OK"));
-  else
-    QDialog::accept();
+                          tr("MSG_MINMAX_VALUES"),
+                          tr("VISU_BUT_OK"));
+  else if ( CBUpdate->isChecked() && CBLog->isChecked() && (MinIso->text().toDouble() <=0 || MaxIso->text().toDouble() <=0) )
+    {
+      
+      QAD_MessageBox::warn1( this,
+                            tr("VISU_WARNING"),
+                            tr("WRN_LOGARITHMIC_RANGE_ISOSURF"),
+                            tr("VISU_BUT_OK"));
+    }
+  else QDialog::accept();
+}
+
+void VisuGUI_IsoSurfacesDlg::onCBUpdate()
+{
+  if (CBUpdate->isChecked())
+    CBLog->setDisabled(false);
+  else CBLog->setDisabled(true);
 }
index b6658369291460251faa99d69d2df535e3665ae3..24e74cb8f8da10abb59e6e43ad0ca44f60d9c72b 100644 (file)
 #include <qgroupbox.h>
 #include <qspinbox.h>
 #include <qpushbutton.h>
-#include "VISU_PrsObject_i.hh"
+#include <qcheckbox.h>
 #include <qlineedit.h>
 
+namespace VISU{
+  class IsoSurfaces_i;
+}
 
 class VisuGUI_IsoSurfacesDlg : public QDialog
 { 
@@ -45,17 +48,20 @@ class VisuGUI_IsoSurfacesDlg : public QDialog
 public:
     VisuGUI_IsoSurfacesDlg();
     ~VisuGUI_IsoSurfacesDlg();
-
+    
     void initFromPrsObject(VISU::IsoSurfaces_i* thePrs);
     void storeToPrsObject(VISU::IsoSurfaces_i* thePrs);
-
+    
 protected slots:
   void accept();
-
- private:
-    QLineEdit* MinIso;
-    QLineEdit* MaxIso;
-    QSpinBox*       NbrIso;
+  void onCBUpdate();
+   
+private:
+  QLineEdit* MinIso;
+  QLineEdit* MaxIso;
+  QSpinBox*       NbrIso;
+  QCheckBox* CBUpdate;
+  QCheckBox* CBLog;
 };
 
 #endif // VISUGUI_ISOSURFACESDLG_H
index 28c0f1afa21d7f8d5cb31e8fc60f6351b14ed463..c8f38d87995a5c088c8a29c81254cd1e861f1a36 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI_MagnitudeDlg.h"
-#include <qlayout.h>
+#include "VISU_DeformedShape_i.hh"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 
+#include <qlayout.h>
+
+using namespace std;
+
 /*!
   Constructor
 */
@@ -104,12 +108,12 @@ VisuGUI_MagnitudeDlg::~VisuGUI_MagnitudeDlg()
 
 void VisuGUI_MagnitudeDlg::initFromPrsObject(VISU::DeformedShape_i* thePrs) {
   setFactor(thePrs->GetScale());
-  UseMagn->setChecked(thePrs->isColored());
+  UseMagn->setChecked(thePrs->IsColored());
 }
 
 
 void VisuGUI_MagnitudeDlg::storeToPrsObject(VISU::DeformedShape_i* thePrs) {
   thePrs->SetScale(getFactor());
-  thePrs->setColored(isColored());
+  thePrs->ShowColored(isColored());
 }
 
index c1436aead2df50857adb9e2fabf87ba7ccb3092d..37c7609cccb765449c404fc69b0cc41af1d6fc73 100644 (file)
 #include <qcheckbox.h>
 #include <qlabel.h>
 #include <qpushbutton.h>
+
 #include "QAD_SpinBoxDbl.h"
-#include "VISU_PrsObject_i.hh"
+
+namespace VISU{
+  class DeformedShape_i;
+}
 
 class VisuGUI_MagnitudeDlg : public QDialog
 { 
index df3f1c27fab5684bf458eef287e8ee1a23372bf9..a6c14ba1ab70a0f84a20cda76c1667ae0d8571cd 100644 (file)
@@ -9,26 +9,29 @@
 //  Module : VISU
 //  $Header$ 
 
-using namespace std;
 #include "VisuGUI_NonIsometricDlg.h"
+#include "VISU_Actor.h"
+#include "VISU_PipeLine.hxx"
 
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qpushbutton.h>
-#include <qlayout.h>
 #include "QAD_SpinBoxDbl.h"
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_StudyFrame.h"
 #include "QAD_RightFrame.h"
 #include "VTKViewer_ViewFrame.h"
-#include "VISU_Actor.h"
 #include "utilities.h"
 
 #include "SALOME_Selection.h"
 #include "SALOME_ListIteratorOfListIO.hxx"
 #include "SALOME_ListIO.hxx"
 
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+
+using namespace std;
+
 /*!
   Constructor
 */
index 1694a48d0ac859d9d0d43c8017532451aa144f3c..3a2691ce4986f6e8d4899447cd93c8f03f51220c 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI_ScalarBarDlg.h"
-#include <limits.h>
-#include <qlayout.h>
-#include <qvalidator.h>
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_ScalarMapPL.hxx"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_Config.h"
 #include "QAD_MessageBox.h"
 #include "VISU_Convertor.hxx"
 
+#include <limits.h>
+#include <qlayout.h>
+#include <qvalidator.h>
+
+using namespace std;
+
 /*!
   Constructor
 */
@@ -418,6 +423,7 @@ void VisuGUI_ScalarBarDlg::storeToResources() {
  * Initialise dialog box from presentation object
  */
 void VisuGUI_ScalarBarDlg::initFromPrsObject(VISU::ScalarMap_i* thePrs) {
+  initFromResources();
   myModeCombo->setCurrentItem(thePrs->GetScalarMode());
   setPosAndSize( thePrs->GetPosX(), 
                 thePrs->GetPosY(), 
@@ -432,10 +438,10 @@ void VisuGUI_ScalarBarDlg::initFromPrsObject(VISU::ScalarMap_i* thePrs) {
     setLogarithmic(false);
   }
   float aRange[2];
-  thePrs->GetFieldRange(aRange);
+  thePrs->GetScalarMapPL()->GetSourceRange(aRange);
   Rmin = aRange[0]; Rmax = aRange[1];
   setRange( thePrs->GetMin(), thePrs->GetMax(), 
-           0.0, 0.0, thePrs->isRangeFixed() );
+           0.0, 0.0, thePrs->IsRangeFixed() );
   setScalarBarData( thePrs->GetNbColors(), thePrs->GetLabels() );
   bool isScalarMode = (thePrs->GetField()->myNbComp > 1);
   myModeLbl->setEnabled(isScalarMode);
@@ -451,19 +457,19 @@ void VisuGUI_ScalarBarDlg::storeToPrsObject(VISU::ScalarMap_i* thePrs) {
   thePrs->SetPosition(XSpin->value(), YSpin->value());
   thePrs->SetSize(WidthSpin->value(), HeightSpin->value());
   thePrs->SetOrientation((RBvert->isChecked())? VISU::ScalarMap::VERTICAL : VISU::ScalarMap::HORIZONTAL);
-  if (RBFrange->isChecked()) {
-    thePrs->CalculateRange();
-  } else {
-    thePrs->SetRange(MinEdit->text().toDouble(), MaxEdit->text().toDouble());
-  }    
   if(isLogarithmic()) 
     thePrs->SetScaling(VISU::LOGARITHMIC); 
   else
     thePrs->SetScaling(VISU::LINEAR);
+
+  if (RBFrange->isChecked()) {
+    thePrs->SetSourceRange();
+  } else {
+    thePrs->SetRange(MinEdit->text().toDouble(), MaxEdit->text().toDouble());
+  }    
   thePrs->SetNbColors(ColorSpin->value());
   thePrs->SetLabels(LabelSpin->value());
-  thePrs->Update();
-
+   
   if (isToSave()) storeToResources();
 }
 
index a1706e82590256de24c9ee957ee8600fa374d226..7c2cf9bb5fc574a8aaaf5675a6824282ea188ad9 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef VISUGUI_SCALARBARDLG_H
 #define VISUGUI_SCALARBARDLG_H
 
+#include "QAD_SpinBoxDbl.h"
+
 #include <qdialog.h>
 #include <qbuttongroup.h>
 #include <qgroupbox.h>
@@ -40,9 +42,9 @@
 #include <qlineedit.h>
 #include <qcombobox.h>
 
-#include "QAD_SpinBoxDbl.h"
-#include "VISU_PrsObject_i.hh"
-
+namespace VISU{
+  class ScalarMap_i;
+}
 
 class VisuGUI_ScalarBarDlg : public QDialog
 { 
index ff359e22ae367b170c3bd1fc1890bdeda16a13b7..4bd329a68388351af91fbe0f4454bd16b5e1e2d3 100644 (file)
@@ -48,24 +48,6 @@ using namespace std;
 #include "VisuGUI_PointsResultsDlg.h"
 #include "VisuGUI_Selection.h"
 
-int PickViewer(QAD_Study *theActiveStudy, int theSelectionMode){
-  SALOME_Selection *aSel = SALOME_Selection::Selection(theActiveStudy->getSelection());
-  SALOME_ListIteratorOfListIO It(aSel->StoredIObjects());
-  for(;It.More(); It.Next()){
-    Handle(SALOME_InteractiveObject) IObject = It.Value();
-    if (aSel->SelectionMode() == theSelectionMode ){
-      if (aSel->HasIndex(IObject)) {
-       TColStd_MapOfInteger MapIndex ;
-       aSel->GetIndex(IObject, MapIndex) ;
-       TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
-       for(;ite.More(); ite.Next())
-         return ite.Key();
-      }
-    }
-  }
-  return -1;
-}
-
 template<class TData, class TDialog> void SetMessage(TData* theData, int theId, TDialog* theDialog){
   // Scalar result
   QString Msg_1;
@@ -90,12 +72,11 @@ template<class TData, class TDialog> void SetMessage(TData* theData, int theId,
 //                                     PICKING CELL                                            //
 // ============================================================================================ //
 
-void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet){
-  int id = PickViewer(theActiveStudy,SelectionCell);
-  if(id >= 0){
+void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId){
+  if(theId >= 0){
     VisuGUI_CellsResultsDlg *aResultsDlg = new VisuGUI_CellsResultsDlg(QAD_Application::getDesktop(), 0, TRUE, 0); 
     vtkCellData *aData = theDataSet->GetCellData();
-    vtkCell *aCell = theDataSet->GetCell(id);
+    vtkCell *aCell = theDataSet->GetCell(theId);
 
     float aPntCoord[12][3];
     int aNbOfPoints = aCell->GetNumberOfPoints();
@@ -115,9 +96,9 @@ void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDa
                                 QString::number( aPntCoord[i][2] ));
     }
 
-    SetMessage(aData,id,aResultsDlg);
+    SetMessage(aData,theId,aResultsDlg);
 
-    aResultsDlg->IdCell->setText( QString::number( id ) );
+    aResultsDlg->IdCell->setText( QString::number( theId ) );
     aResultsDlg->NbPoint->setText( QString::number( aNbOfPoints ) );
     aResultsDlg->exec(); 
     delete aResultsDlg;
@@ -129,20 +110,19 @@ void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDa
 //                                     PICKING POINT                                           //
 // ============================================================================================ //
 
-void VisuGUI_Selection::PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet){
-  int id = PickViewer(theActiveStudy,SelectionPoint);
-  if(id >= 0){
+void VisuGUI_Selection::PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId){
+  if(theId >= 0){
     VisuGUI_PointsResultsDlg *aResultsDlg = new VisuGUI_PointsResultsDlg(QAD_Application::getDesktop(), 0, TRUE, 0); 
     vtkPointData *aData = theDataSet->GetPointData();
 
     float Coord[3];
-    theDataSet->GetPoint(id,Coord);
+    theDataSet->GetPoint(theId,Coord);
     aResultsDlg->CoordX->setText( QString::number( Coord[0] ) );
     aResultsDlg->CoordY->setText( QString::number( Coord[1] ) );
     aResultsDlg->CoordZ->setText( QString::number( Coord[2] ) );
-    aResultsDlg->IdPoint->setText( QString::number(id) );
+    aResultsDlg->IdPoint->setText( QString::number(theId) );
     
-    SetMessage(aData,id,aResultsDlg);
+    SetMessage(aData,theId,aResultsDlg);
 
     aResultsDlg->exec(); 
     delete aResultsDlg;
@@ -152,6 +132,6 @@ void VisuGUI_Selection::PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theD
 void VisuGUI_Selection::Highlight(QAD_Study *theActiveStudy, const Handle(SALOME_InteractiveObject)& theIO, int theId){
   MESSAGE("HighlightCell");
   SALOME_Selection *aSel = SALOME_Selection::Selection(theActiveStudy->getSelection());
-  aSel->AddIObject( theIO, false );
-  aSel->AddOrRemoveIndex( theIO, theId, false, true );
+  aSel->AddIObject(theIO);
+  aSel->AddOrRemoveIndex(theIO, theId, false);
 }                                     
index 09e43574240b4e7ef2b17e2ecaecd3168636fb0f..0148a53bbfa75b9c76ef3a323b242f247815af18 100644 (file)
@@ -41,8 +41,8 @@
 #define SelectionActor 4
 
 namespace VisuGUI_Selection{
-  void PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet);
-  void PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet);
+  void PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId);
+  void PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId);
   void Highlight(QAD_Study *theActiveStudy, const Handle(SALOME_InteractiveObject)& theIO, int theId);
 };
 
index 44e46939be11fc39fd7d7f3cf0d12689e2de5f4a..503347116b09dee25e0ecfc45fbd7d0c9021f9ed 100644 (file)
@@ -9,16 +9,26 @@
 //  Module : VISU
 
 #include "VisuGUI_StreamLinesDlg.h"
-#include <limits.h>
-#include <qlayout.h>
-#include <qgroupbox.h>
-#include <qcolordialog.h>
+#include "VISU_StreamLines_i.hh"
+#include "VISU_Mesh_i.hh"
+#include "VISU_Gen_i.hh"
+#include "VISU_StreamLinesPL.hxx"
+#include "VISU_Actor.h"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_Config.h"
+#include "QAD_MessageBox.h"
 #include "VisuGUI.h"
 #include "SALOME_Selection.h"
+#include "VTKViewer_ViewFrame.h"
+
+#include <limits.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qcolordialog.h>
 
+using namespace std;
 
 extern VisuGUI *visuGUI;
 
@@ -39,11 +49,18 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg()
   aSrcLayout->setSpacing( 6 );
   aSrcLayout->setMargin( 0 );
   
-  myUseSrcChk = new QCheckBox(tr("Use source presentation"), aSourceBox);
-  aSrcLayout->addMultiCellWidget(myUseSrcChk, 0, 0, 0, 1);
+  QLabel* aTypeLbl = new QLabel( tr( "LBL_SOURCE_TYPE" ), aSourceBox);
+  aSrcLayout->addWidget(aTypeLbl, 0, 0);
+
+  myUseSrcCombo = new QComboBox(aSourceBox);
+  const char* aChoise[] = { "None", "Entity", "Family", "Group", "Presentation", 0 };
+  myUseSrcCombo->insertStrList(aChoise);
+  aSrcLayout->addWidget(myUseSrcCombo, 0, 1);
 
   mySrcCombo = new QComboBox(aSourceBox);
-  mySrcCombo->setEnabled(myUseSrcChk->isChecked());
+  mySrcCombo->setEnabled((myUseSrcCombo->currentItem() == 0));
+  
+  connect(myUseSrcCombo, SIGNAL(activated(int)), this, SLOT(onSourceTypeChange(int)));
 
   // Find All prs obj
   QAD_Study* aActiveStudy =  VisuGUI::GetActiveStudy();
@@ -52,21 +69,67 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg()
     Handle(SALOME_InteractiveObject) aIO = aSel->firstIObject();
     if (aIO->hasEntry()){
       SALOMEDS::SObject_var aSObject = VisuGUI::GetStudyDocument()->FindObjectID(aIO->getEntry());
-      SALOMEDS::SComponent_var aComp = aSObject->GetFatherComponent();
-      SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( aComp );
+      aSObject = aSObject->GetFather();
+      aSObject = aSObject->GetFather();
+      aSObject = aSObject->GetFather();
+      aSObject = aSObject->GetFather();
+      mySelectionObj = aSObject;
+      CORBA::Object_var anObject = VISU::SObjectToObject(mySelectionObj);
+      VISU::Result_var aResult;
+      if (CORBA::is_nil(anObject)) {
+       mySelectionObj = mySelectionObj->GetFather();
+      }
+      SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( mySelectionObj );
 
       for (aIter->InitEx(true); aIter->More(); aIter->Next() ) {
        SALOMEDS::SObject_var aChildSObj = aIter->Value();
        CORBA::Object_var aChildObject = VISU::SObjectToObject( aChildSObj );
+
        if(!CORBA::is_nil( aChildObject ) ) {
          VISU::Prs3d_var aPrsObj = VISU::Prs3d::_narrow( aChildObject );
-         if( !CORBA::is_nil( aPrsObj ) ) {
-           if (aPrsObj->GetType() != VISU::TSTREAMLINES) {
+         if( !CORBA::is_nil( aPrsObj ) ) { // if this is a Prs object
+           if ((aPrsObj->GetType() != VISU::TSTREAMLINES) && 
+               (aPrsObj->GetType() != VISU::TMESH)) {
              SALOMEDS::GenericAttribute_var anAttr;
              if ( aChildSObj->FindAttribute(anAttr, "AttributeName") ) {           
                SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
-               mySrcCombo->insertItem(QString(aName->Value()));
+               myPrsLst += QString(aName->Value());
                myPrsList.append(aPrsObj);
+               continue;
+             }
+           }
+         }
+       }
+       // else { // This is not a Prs object
+       SALOMEDS::GenericAttribute_var anAttr;
+       if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) {
+         SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
+         string aComm = aComment->Value();
+         QString strIn(aComm.c_str());
+         VISU::Storable::TRestoringMap aMap;
+         VISU::Storable::StrToMap(strIn,aMap);
+         bool isExist;
+         VISU::VISUType aType = (VISU::VISUType)VISU::Storable::FindValue(aMap,"myType",&isExist).toInt();
+         if (isExist) {
+           if ((aType == VISU::TFAMILY) || (aType == VISU::TGROUP) || (aType == VISU::TENTITY)) { 
+             SALOMEDS::GenericAttribute_var aNameAttr;
+             if ( aChildSObj->FindAttribute(aNameAttr, "AttributeName") ) {        
+               SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(aNameAttr);
+               VISU::Prs3d_var aPrsObj = VISU::Prs3d::_narrow( aChildObject );
+               switch(aType) {
+               case VISU::TFAMILY:
+                 myFamilisLst += QString(aName->Value());
+                 myFamilyList.append(aPrsObj);
+                 break;
+               case VISU::TGROUP:
+                 myGroupsLst += QString(aName->Value());
+                 myGroupList.append(aPrsObj);
+                 break;
+               case VISU::TENTITY:
+                 myEntitiesLst += QString(aName->Value());
+                 myEntityList.append(aPrsObj);
+                 break;
+               }
              }
            }
          }
@@ -74,8 +137,7 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg()
       }
     }
   }  
-
-  connect(myUseSrcChk, SIGNAL(toggled(bool)), mySrcCombo, SLOT(setEnabled(bool)));
+  //  connect(myUseSrcChk, SIGNAL(toggled(bool)), mySrcCombo, SLOT(setEnabled(bool)));
   aSrcLayout->addMultiCellWidget(mySrcCombo, 1, 1, 0, 1);
 
   QLabel* aPercentLbl = new QLabel( tr( "Used points (0..1)" ), aSourceBox);
@@ -92,19 +154,20 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg()
   myStepLen = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 0.1);
   myStepLen->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
   TopLayout->addWidget(myStepLen, 1, 1);
+  connect(myStepLen, SIGNAL(valueChanged(double)), this, SLOT(StepLengthChanged(double)));
 
   QLabel* aIntegStepLenLbl = new QLabel( tr( "Integration Step" ), this);
   TopLayout->addWidget(aIntegStepLenLbl, 2, 0);
   myIntegStepLen = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 0.1);
   myIntegStepLen->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
   TopLayout->addWidget(myIntegStepLen, 2, 1);
+  connect(myIntegStepLen, SIGNAL(valueChanged(double)), this, SLOT(IntegrationStepChanged(double)));
   
   QLabel* aPropagationLbl = new QLabel( tr( "Propagation Time" ), this);
   TopLayout->addWidget(aPropagationLbl, 3, 0);
   myPropTime = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 1);
   myPropTime->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
   TopLayout->addWidget(myPropTime, 3, 1);
-
   connect(myPropTime, SIGNAL(valueChanged(double)), this, SLOT(PropagationTimeChanged(double)));
   
   QLabel* aDirLbl = new QLabel( tr( "Direction" ), this);
@@ -151,9 +214,15 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg()
 
 
 void VisuGUI_StreamLinesDlg::initFromPrsObject(VISU::StreamLines_i* thePrs) {
+  myPropTime->setValue(thePrs->GetPropagationTime());
+
+  myStepLen->setRange(VISU_StreamLinesPL::GetMinStepLength(thePrs->GetIntegrationStep()),
+                     VISU_StreamLinesPL::GetMaxStepLength(thePrs->GetPropagationTime()));
   myStepLen->setValue(thePrs->GetStepLength());
+  
+  myIntegStepLen->setRange(thePrs->GetMinIntegrationStep(),thePrs->GetMaxIntegrationStep());
   myIntegStepLen->setValue(thePrs->GetIntegrationStep());
-  myPropTime->setValue(thePrs->GetPropagationTime());
+  
   switch (thePrs->GetDirection()) {
   case VISU::StreamLines::FORWARD:
     myDirCombo->setCurrentItem(0);
@@ -164,39 +233,48 @@ void VisuGUI_StreamLinesDlg::initFromPrsObject(VISU::StreamLines_i* thePrs) {
   case VISU::StreamLines::BOTH:
     myDirCombo->setCurrentItem(2);
   }
-  myUseScalar->setChecked(thePrs->isColored());
+  myUseScalar->setChecked(thePrs->IsColored());
   myPntPercent->setValue(thePrs->GetUsedPoints());
-
-  myUseSrcChk->setChecked(false);
+  
+  mySrcCombo->setEnabled(false);
   QString aSrcEntry = thePrs->GetSourceEntry();
-  if (!aSrcEntry.isEmpty()) {
-    for (int i = 0; i < myPrsList.count(); i++) {
-      VISU::Prs3d_i* aPrs = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(myPrsList[i]));
-      if (aSrcEntry == aPrs->GetEntry()) {
-       myUseSrcChk->setChecked(true);
-       mySrcCombo->setCurrentItem(i);
-       break;
-      }
-    }
-  }
-
+  
   SALOMEDS::Color anOldColor = thePrs->GetColor();
   QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B));
   setColor(aColor);
   enableSetColor();
+  
+#define INITPRS(PRSLIST, PRSNUM) \
+    for (int i = 0; i < PRSLIST.count(); i++) { \
+      VISU::Prs3d_i* aPrs = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(PRSLIST[i])); \
+      if (aPrs == NULL) continue; \
+      if (aSrcEntry == aPrs->GetEntry()) { \
+        onSourceTypeChange(PRSNUM); \
+       myUseSrcCombo->setCurrentItem(PRSNUM); \
+       mySrcCombo->setEnabled(true); \
+       mySrcCombo->setCurrentItem(i); \
+       return; \
+      } \
+    }
+  
+  if (!aSrcEntry.isEmpty()) {
+    INITPRS(myEntityList, 1);
+    INITPRS(myFamilyList, 2);
+    INITPRS(myGroupList, 3);    
+    INITPRS(myPrsList, 4);
+  }
+  
+#undef INITPRS
 
-  myIntegStepLen->setMaxValue(thePrs->GetMaxIntegrationStep());
-  myIntegStepLen->setMinValue(thePrs->GetMinIntegrationStep());
-  myStepLen->setMaxValue(myPropTime->value());
-  myStepLen->setMinValue(myPropTime->value()/10000.);
 }
 
 
 
 void VisuGUI_StreamLinesDlg::storeToPrsObject(VISU::StreamLines_i* thePrs) {
-  thePrs->SetStepLength(myStepLen->value());
+  //Order of setting of the values are important 
   thePrs->SetIntegrationStep(myIntegStepLen->value());
   thePrs->SetPropagationTime(myPropTime->value());
+  thePrs->SetStepLength(myStepLen->value());
   switch (myDirCombo->currentItem()) {
   case 0:
     thePrs->SetDirection(VISU::StreamLines::FORWARD);
@@ -207,19 +285,51 @@ void VisuGUI_StreamLinesDlg::storeToPrsObject(VISU::StreamLines_i* thePrs) {
   case 2:
     thePrs->SetDirection(VISU::StreamLines::BOTH);
   }
-  thePrs->setColored(myUseScalar->isChecked());
-  if(!thePrs->isColored()){
+  thePrs->ShowColored(myUseScalar->isChecked());
+  if(!thePrs->IsColored()){
     SALOMEDS::Color aColor;
     aColor.R = myColor.red()/255.;
     aColor.G = myColor.green()/255.;
     aColor.B = myColor.blue()/255.;
     thePrs->SetColor(aColor);
   }
-  if (myUseSrcChk->isChecked() && (myPrsList.count() > 0)) {
-    thePrs->SetSource(myPrsList[mySrcCombo->currentItem()]);
-  } else 
-    thePrs->SetSource(VISU::Prs3d::_nil());
   thePrs->SetUsedPoints(myPntPercent->value());
+
+  int aSrcSelection = myUseSrcCombo->currentItem();
+  int aSrcItem = (mySrcCombo->count() > 0)? mySrcCombo->currentItem() : -1;
+  if ((aSrcSelection > 0) && (aSrcItem > -1)) {
+    VISU::Prs3d_var aPrs;
+    VISU::VISUType aType;
+    QString aName;
+    switch (aSrcSelection){
+    case 1: // Entity
+      aPrs = myEntityList[aSrcItem];
+      aType = VISU::TENTITY;
+      aName = myEntitiesLst[aSrcItem];
+      break;
+    case 2: // Family
+      aPrs = myFamilyList[aSrcItem];
+      aType = VISU::TFAMILY;
+      aName = myFamilisLst[aSrcItem];
+      break;
+    case 3: // Group
+      aPrs = myGroupList[aSrcItem];
+      aType = VISU::TGROUP;
+      aName = myGroupsLst[aSrcItem];
+      break;
+    case 4: // Presentation
+      aPrs = myPrsList[aSrcItem];
+      break;
+    }
+    if (!CORBA::is_nil( aPrs )) {
+      thePrs->SetSource(aPrs);
+    } else if (aSrcSelection == 4) {
+      thePrs->SetSource(VISU::Prs3d::_nil());
+    } else { // Create Mesh presentation
+      thePrs->SetSource(createMesh(aType, aName));
+    }
+  } else 
+    thePrs->SetSource(VISU::Prs3d::_nil());  
 }
 
 /*!
@@ -260,8 +370,121 @@ void VisuGUI_StreamLinesDlg::enableSetColor()
   SelColor->setEnabled(!myUseScalar->isChecked() );
 }
 
+void VisuGUI_StreamLinesDlg::StepLengthChanged(double theValue){
+}
+
+void VisuGUI_StreamLinesDlg::IntegrationStepChanged(double theValue) {
+  PropagationTimeChanged(myPropTime->value());
+}
+
 void VisuGUI_StreamLinesDlg::PropagationTimeChanged(double theValue) {
-  myStepLen->setMaxValue(theValue);
-  myStepLen->setMinValue(theValue/1000000.);
+  myStepLen->setMinValue(VISU_StreamLinesPL::GetMinStepLength(myIntegStepLen->value()));
+  myStepLen->setMaxValue(VISU_StreamLinesPL::GetMaxStepLength(myPropTime->value()));
+}
+
+void VisuGUI_StreamLinesDlg::onSourceTypeChange(int theIndex) {
+  mySrcCombo->clear();
+  if (theIndex == 0) {
+    mySrcCombo->setEnabled(false);
+    return;
+  } else
+    mySrcCombo->setEnabled(true);
+
+  switch(theIndex) {
+  case 1: // Entity
+    mySrcCombo->insertStringList(myEntitiesLst);
+    return;
+  case 2: // Family
+    mySrcCombo->insertStringList(myFamilisLst);
+    return;
+  case 3: // Group
+    mySrcCombo->insertStringList(myGroupsLst);
+    return;
+  case 4: // Presentation
+    mySrcCombo->insertStringList(myPrsLst);
+    return;
+  }
 }
 
+
+VISU::Mesh_var VisuGUI_StreamLinesDlg::createMesh(VISU::VISUType theType, QString theName) {
+  CORBA::Object_var anObject = VISU::SObjectToObject(mySelectionObj);
+  VISU::Result_var aResult;
+  if (!CORBA::is_nil(anObject)) {
+    aResult = VISU::Result::_narrow(anObject);
+  }
+  if(CORBA::is_nil(aResult)) {
+    QAD_MessageBox::warn1(QAD_Application::getDesktop(), tr ("VISU_WARNING"),
+                         tr ("WRN_NO_AVAILABLE_DATA"),
+                         tr ("VISU_BUT_OK"));
+    return VISU::Mesh::_nil();
+  }
+  SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( mySelectionObj );
+  VISU::Storable::TRestoringMap aMap;
+
+  for (aIter->InitEx(true); aIter->More(); aIter->Next() ) {
+    SALOMEDS::SObject_var aChildSObj = aIter->Value();
+    SALOMEDS::GenericAttribute_var anAttr;
+    if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) {
+      SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
+      CORBA::String_var aComm = aComment->Value();
+      QString strIn(aComm.in());
+      aMap.clear();
+      VISU::Storable::StrToMap(strIn,aMap);
+      bool isExist;
+      VISU::VISUType aType = (VISU::VISUType)VISU::Storable::FindValue(aMap,"myType",&isExist).toInt();
+      if (isExist) {
+       if (aType != theType) continue;
+
+       SALOMEDS::GenericAttribute_var aNameAttr;
+       if ( aChildSObj->FindAttribute(aNameAttr, "AttributeName") ) {      
+         SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(aNameAttr);
+         if (QString(aName->Value()) == theName) break; //use current map
+       }
+      }
+    }
+  }
+  CORBA::Object_var aMesh;
+  QString aMeshName = VISU::Storable::FindValue(aMap,"myMeshName");
+  switch (theType) {
+  case VISU::TFAMILY: 
+    {
+      VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt();
+      aMesh = VisuGUI::GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.latin1(),anEntity,theName.latin1());
+    }
+    break;
+  case VISU::TGROUP:
+    {
+      aMesh = VisuGUI::GetVisuGen()->GroupMesh(aResult,aMeshName.latin1(), theName.latin1());
+    }
+    break;
+  case VISU::TENTITY:
+    {
+      VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt();
+      aMesh = VisuGUI::GetVisuGen()->MeshOnEntity(aResult,aMeshName.latin1(),anEntity);
+    }
+    break;
+  }
+  VISU::Mesh_i* pPresent = NULL;
+  if(!CORBA::is_nil(aMesh)) 
+    pPresent = dynamic_cast<VISU::Mesh_i*>(VISU::GetServant(aMesh));
+  if (pPresent == NULL) {
+    QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), 
+                           tr ("ERR_CANT_BUILD_PRESENTATION"), 
+                           tr ("VISU_BUT_OK") ); 
+    return VISU::Mesh::_nil();
+  }
+  // Create Actor
+  if(VTKViewer_ViewFrame* vf = visuGUI->GetVtkViewFrame()){
+    try{
+      pPresent->SetPresentationType(VISU::POINT);
+      VISU_Actor *anActor = pPresent->CreateActor();
+      vf->AddActor(anActor);
+    }catch(std::runtime_error& exc){
+      QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), 
+                             tr ("ERR_CANT_CREATE_ACTOR"), 
+                             tr ("VISU_BUT_OK") ); 
+    }
+  } 
+  return pPresent->_this();
+}
index 1e1d97884e483b46860ea75568a5b4db4513cef3..0b9c78b671943ae7c1d6737a5f24800b10280d81 100644 (file)
 #ifndef VISUGUI_STREAMLINESDLG_H
 #define VISUGUI_STREAMLINESDLG_H
 
+#include "QAD_SpinBoxDbl.h"
+
 #include <qdialog.h>
 #include <qcombobox.h>
 #include <qcheckbox.h>
-#include "QAD_SpinBoxDbl.h"
-#include "VISU_PrsObject_i.hh"
+#include <qstringlist.h>
 
+#include "SALOMEconfig.h"
+#include CORBA_CLIENT_HEADER(VISU_Gen)
+
+namespace VISU{
+  class StreamLines_i;
+}
 
 class VisuGUI_StreamLinesDlg: public QDialog
 { 
@@ -32,9 +39,14 @@ public:
 
 private slots:
   void onSelectionActive(bool theActive);
+  void StepLengthChanged(double theValue);
+  void IntegrationStepChanged(double theValue);
   void PropagationTimeChanged(double theValue);
+  void onSourceTypeChange(int theIndex);
 
 private:
+  VISU::Mesh_var createMesh(VISU::VISUType theType, QString theName);
+
     QAD_SpinBoxDbl* myStepLen;
     QAD_SpinBoxDbl* myIntegStepLen;
     QAD_SpinBoxDbl* myPropTime;
@@ -42,10 +54,19 @@ private:
     QCheckBox* myUseScalar;
     QPushButton*    SelColor;
     QColor          myColor;
-    QCheckBox* myUseSrcChk;
+    //QCheckBox* myUseSrcChk;
+    QComboBox* myUseSrcCombo;
     QAD_SpinBoxDbl* myPntPercent;
     QComboBox* mySrcCombo;
     QValueList<VISU::Prs3d_var> myPrsList;
+    QValueList<VISU::Prs3d_var> myEntityList;
+    QValueList<VISU::Prs3d_var> myFamilyList;
+    QValueList<VISU::Prs3d_var> myGroupList;
+    QStringList myEntitiesLst;
+    QStringList myFamilisLst;
+    QStringList myGroupsLst;
+    QStringList myPrsLst;
+    SALOMEDS::SObject_var mySelectionObj;
 
 private slots:
   void setVColor();
index 2c971c41f8ab08a87af788815e2a9c4811684078..3d1f175d41107d14141df6b5dedadd1db7c9b9ab 100644 (file)
 #include "VisuGUI_StreamLinesDlg.h"
 #include "VISU_TimeAnimation.h"
 
-static double MAXVALUE = 1.0E+300;
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_IsoSurfaces_i.hh"
+#include "VISU_DeformedShape_i.hh"
+#include "VISU_CutPlanes_i.hh"
+#include "VISU_CutLines_i.hh"
+#include "VISU_Vectors_i.hh"
+#include "VISU_StreamLines_i.hh"
 
+static double MAXVALUE = 1.0E+300;
 
 
 SetupDlg::SetupDlg(QWidget* theParent, VISU_TimeAnimation* theAnimator) 
@@ -632,6 +639,12 @@ void VisuGUI_TimeAnimationDlg::createFrames() {
     if (myAnimator->getFieldData(i).myPrs == 0) 
       myAnimator->generatePresentations(i);
   }
+  if (myAnimator->getNbFrames() == 0) {
+    myPlayFrame->setEnabled(false);
+    QApplication::restoreOverrideCursor();
+   QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_NO_ANIMATIONDATA")); 
+    return;    
+  }    
   mySlider->setMaxValue(myAnimator->getNbFrames()-1);
   myPlayFrame->setEnabled(true);
   if (!myAnimator->generateFrames()) {
@@ -648,7 +661,7 @@ void VisuGUI_TimeAnimationDlg::createFrames() {
 
 //************************************************************************
 void VisuGUI_TimeAnimationDlg::onPlayPressed() {
-  if (myPlayBtn->isOn()) {
+  if (myPlayBtn->isOn() && (!myAnimator->running())) {
     myPlayBtn->setIconSet(MYpausePixmap);
     if (mySaveCheck->isChecked())
       myAnimator->dumpTo(myPathEdit->text());
index 9ae881e76ff8a44afebf1815b2c952c78b194c65..35f0d62534125ef9f700797f0e487bacc7a3d14f 100644 (file)
 
 #include "VisuGUI_ScalarBarDlg.h"
 
-class VISU_TimeAnimation;
+#include "SALOMEconfig.h"
+#include CORBA_SERVER_HEADER(SALOMEDS)
+#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
+#include CORBA_CLIENT_HEADER(VISU_Gen)
 
+class VISU_TimeAnimation;
 
 /**
  * Auxilliary class for presentations definition
index 174ee491e463230b8b5dd58989d72e3cf18089d1..2e471d3f4dc20ee31f9b724512f40216ae191227 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI_VectorsDlg.h"
-#include <qlayout.h>
-#include <qcolordialog.h>
+#include "VISU_Vectors_i.hh"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 
+#include <qlayout.h>
+#include <qcolordialog.h>
+
+using namespace std;
+
 /*!
   Constructor
 */
@@ -178,7 +182,7 @@ VisuGUI_VectorsDlg::~VisuGUI_VectorsDlg()
 void VisuGUI_VectorsDlg::initFromPrsObject(VISU::Vectors_i* thePrs) {
   setScaleFactor(thePrs->GetScale());
   setLineWidth((int)thePrs->GetLineWidth());
-  setUseMagnColor(thePrs->isColored());
+  setUseMagnColor(thePrs->IsColored());
   SALOMEDS::Color anOldColor = thePrs->GetColor();
   QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B));
   setColor(aColor);
@@ -197,8 +201,8 @@ void VisuGUI_VectorsDlg::initFromPrsObject(VISU::Vectors_i* thePrs) {
 void VisuGUI_VectorsDlg::storeToPrsObject(VISU::Vectors_i* thePrs) {
   thePrs->SetScale(getScaleFactor());
   thePrs->SetLineWidth(getLineWidth());
-  thePrs->setColored(getUseMagnColor());
-  if(!thePrs->isColored()){
+  thePrs->ShowColored(getUseMagnColor());
+  if(!thePrs->IsColored()){
     SALOMEDS::Color aColor;
     aColor.R = myColor.red()/255.;
     aColor.G = myColor.green()/255.;
index 68f560f8a30109b20c5864154823e1e12181c429..d66af01717e010e525ab01c139abedd39b53682f 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef VISUGUI_VECTORSDLG_H
 #define VISUGUI_VECTORSDLG_H
 
+#include "QAD_SpinBoxDbl.h"
+
 #include <qdialog.h>
 #include <qbuttongroup.h>
 #include <qgroupbox.h>
 #include <qlabel.h>
 #include <qspinbox.h>
 #include <qpushbutton.h>
-#include "QAD_SpinBoxDbl.h"
-#include "VISU_PrsObject_i.hh"
 
+#include "SALOMEconfig.h"
+#include CORBA_CLIENT_HEADER(VISU_Gen)
+namespace VISU{
+  class Vectors_i;
+}
 
 class VisuGUI_VectorsDlg : public QDialog
 { 
index 3de24794084e89f3ea5610a3bb55a08a59bf23b4..9b0341c4685560e289e50f14fabb57c3b25e3325 100644 (file)
 //  Module : VISU
 //  $Header$
 
-using namespace std;
 #include "VisuGUI_VisuAsDlg.h"
-#include "VISU_PrsObject_i.hh"
+
+#include "VISU_Actor.h"
+#include "VISU_Prs3d_i.hh"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_RightFrame.h"
 #include "VTKViewer_ViewFrame.h"
+
 #include <qlayout.h>
 
+using namespace std;
+
 /*!
   Constructor
 */
@@ -175,7 +180,7 @@ void VisuGUI_VisuAsDlg::RefreshListActors( const QString &VAType )
 */
 bool VisuGUI_VisuAsDlg::ActorTypeIsValid( VISU_Actor* Actor, int test )
 {
-  VISU::Prs3d_i* aPrs3d = Actor->getPrs3d();
+  VISU::Prs3d_i* aPrs3d = Actor->GetPrs3d();
   if(!aPrs3d) return false;
   if(test == -1) {
     switch(aPrs3d->GetType()){
index 62fa0ff7b46aaad3e1e5d7da02a877f9b4708eb0..d166aace8ee349c18bb309ada36199347d6ce7e8 100644 (file)
@@ -29,8 +29,6 @@
 #ifndef VISUGUI_VISUASDLG_H
 #define VISUGUI_VISUASDLG_H
 
-#include "VISU_Actor.h"
-
 #include <qdialog.h>
 #include <qcombobox.h>
 #include <qgroupbox.h>
@@ -38,6 +36,8 @@
 #include <qpushbutton.h>
 #include <qlabel.h>
 
+class VISU_Actor;
+
 class VisuGUI_VisuAsDlg : public QDialog
 { 
     Q_OBJECT
index 3be2f51f7b509d4097aaa38e26b4c056cdc67fc8..823e58c55f89bbe6b16e9c205bc435f2ee7749a7 100644 (file)
@@ -17,12 +17,13 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 
 # Libraries targets
 LIB = libVISUEngine.la
-LIB_SRC = VISU_Gen_i.cc VISU_Result_i.cc \
-       VISU_PrsObject_i.cc VISU_ViewManager_i.cc VISU_Table_i.cc \
-       VISU_Extractor.cxx VISU_FieldTransform.cxx \
-       VISU_Convertor.cxx VISU_MedConvertor.cxx VISU_DatConvertor.cxx \
-       VISU_Convertor_impl.cxx VISU_CorbaMedConvertor.cxx \
-       VISU_TimeAnimation.cxx
+LIB_SRC = VISUConfig.cc VISU_Gen_i.cc VISU_Result_i.cc \
+       VISU_ViewManager_i.cc VISU_PrsObject_i.cc VISU_Table_i.cc \
+       VISU_Prs3d_i.cc VISU_Mesh_i.cc VISU_ScalarMap_i.cc \
+       VISU_IsoSurfaces_i.cc VISU_DeformedShape_i.cc \
+       VISU_CutPlanes_i.cc VISU_CutLines_i.cc \
+       VISU_Vectors_i.cc VISU_StreamLines_i.cc \
+       VISU_TimeAnimation.cxx VISU_CorbaMedConvertor.cxx
 
 LIB_MOC = VISU_TimeAnimation.h
 
@@ -30,33 +31,34 @@ LIB_SERVER_IDL = VISU_Gen.idl SALOME_Component.idl SALOME_Exception.idl SALOME_S
 LIB_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl
 
 # Executables targets
-BIN = VISU_Convertor
-BIN_SRC = VISU_Convertor_impl.cxx VISU_MedConvertor.cxx 
+BIN = 
+BIN_SRC = 
 
 BIN_CLIENT_IDL =  
 BIN_SERVER_IDL =
  
 EXPORT_HEADERS = VISUConfig.hh VISU_Gen_i.hh VISU_Result_i.hh \
        VISU_PrsObject_i.hh VISU_ViewManager_i.hh VISU_Table_i.hh \
-       VISU_Extractor.hxx VISU_FieldTransform.hxx VISU_Convertor.hxx \
+       VISU_Prs3d_i.hh VISU_Mesh_i.hh VISU_ScalarMap_i.hh \
+       VISU_IsoSurfaces_i.hh VISU_DeformedShape_i.hh \
+       VISU_CutPlanes_i.hh VISU_CutLines_i.hh \
+       VISU_Vectors_i.hh VISU_StreamLines_i.hh \
        VISU_TimeAnimation.h
+
 # additionnal information to compil and link file
 
 CPPFLAGS += -ftemplate-depth-32 $(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) \
        $(MED2_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
-LDFLAGS  += $(QT_MT_LIBS) $(VTK_LIBS) $(QWT_LIBS) -lSalomeNS -lSalomeDS -lTOOLSDS -lSalomeHDFPersist \
-       -lSalomeContainer -lOpUtil -lSalomeGUI -lVTKViewer -lVisuObject \
+LDFLAGS  += $(QT_MT_LIBS) $(VTK_LIBS) $(QWT_LIBS) -lSalomeNS -lTOOLSDS -lSalomeHDFPersist \
+       -lSalomeContainer -lOpUtil -lSalomeGUI -lVTKViewer \
+       -lVisuConvertor -lVisuPipeLine -lVisuObject \
        -L${KERNEL_ROOT_DIR}/lib/salome
 
 LIBS+= $(PYTHON_LIBS) $(MED2_LIBS) $(HDF5_LIBS) -lPlot2d -lSalomeHDFPersist -lSalomeLoggerServer -lRegistry -lqsplitterP -lSalomeLifeCycleCORBA -lSalomeObject -lSalomeNotification -L${KERNEL_ROOT_DIR}/lib/salome
 
-
 # additional file to be cleaned
 MOSTLYCLEAN =
 CLEAN =
 DISTCLEAN =
 
 @CONCLUDE@
-
-
-
index 3b5dcd8d70c459194fe45167512ea5658a141ba1..68f5d16c9c7dccecc80d8dfdf3eaadb1ba8bb4dc 100644 (file)
@@ -1,8 +1,26 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
-//  File   : VISU_Common.hh
+//  File   : VISUConfig.hh
 //  Author : Alexey PETROV
 //  Module : VISU
 
 #include <qfileinfo.h>
 #include <qapplication.h>
 
-using namespace std;
 // IDL headers
-#include <SALOMEconfig.h>
+#include "SALOMEconfig.h"
 #include CORBA_SERVER_HEADER(VISU_Gen)
 #include CORBA_SERVER_HEADER(MED)
 #include CORBA_SERVER_HEADER(SALOMEDS)
@@ -37,6 +53,7 @@ using namespace std;
 namespace VISU{
   //===========================================================================
   class VISU_Gen_i;
+
   class Base_i : public virtual POA_VISU::Base,
                  public virtual PortableServer::RefCountServantBase
   {
@@ -57,8 +74,9 @@ namespace VISU{
     static SALOME_NamingService* GetNS() { return myNamingService;}
     static SALOME_LifeCycleCORBA* GetLCC() { return myEnginesLifeCycle;}
     static VISU_Gen_i* GetVisuGenImpl() { return myVisuGenImpl;}
-    static VISU_Gen_var GetVisuGenInter();
   };
+
+
   //===========================================================================
   class Mutex{
     QMutex* myMutex;
@@ -68,22 +86,24 @@ namespace VISU{
     Mutex(QMutex* theMutex, QApplication* theQApp, int theDelay = 0);
     ~Mutex();
   };
+
+
   //===========================================================================
   class Storable : public virtual Base_i {
   protected:
     virtual void ToStream(std::ostringstream& theStr) = 0;
   public:
-    string ToString();
+    std::string ToString();
     virtual const char* GetComment() const = 0;
-    typedef map<string,QString> TRestoringMap;
+    typedef std::map<std::string,QString> TRestoringMap;
     typedef Storable* (*TStorableEngine)(SALOMEDS::SObject_ptr theSObject, 
-                                        const string& thePrefix, const TRestoringMap& theMap);
-    typedef map<string,TStorableEngine> TCallbackMap;
+                                        const std::string& thePrefix, const TRestoringMap& theMap);
+    typedef std::map<string,TStorableEngine> TCallbackMap;
     static void Registry(const char* theComment, TStorableEngine theEngine) 
       throw(std::logic_error&);
-    static Storable* Create(SALOMEDS::SObject_ptr, const string& thePrefix, const string& theString) 
+    static Storable* Create(SALOMEDS::SObject_ptr, const std::string& thePrefix, const std::string& theString) 
       throw(std::runtime_error&);
-    static const QString& FindValue(const TRestoringMap& theMap, const string& theArg, bool* isFind = NULL)
+    static const QString& FindValue(const TRestoringMap& theMap, const std::string& theArg, bool* isFind = NULL)
       throw(std::logic_error&);
     static void StrToMap(const QString& theStr, VISU::Storable::TRestoringMap& theMap);
     static SALOMEDS::SObject_ptr GetResultSO(SALOMEDS::SObject_ptr theSObject);
@@ -91,18 +111,25 @@ namespace VISU{
     static void DataToStream(std::ostringstream& theStr, const QString& theName, const int theVal);
     static void DataToStream(std::ostringstream& theStr, const QString& theName, const double theVal);
   };
+
+
   //===========================================================================
   const CORBA::Boolean IsMultifile();
+  QString GenerateName(const string& theFmt, int theId);
+
   PortableServer::Servant GetServant(CORBA::Object_ptr theObject);
   CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr theSObject);
+
   SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument);
-  string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument, 
-                         const char* theFatherEntry, const char* theRefFatherEntry,
-                         const char* theIOR, const char* theName, 
-                         const char* thePersistentRef, const char* theComment,
-                         CORBA::Boolean theCreateNew = true);
-  string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry,
-                             const char* theComment, int IsAllLevels = true);
+
+  std::string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument, 
+                              const char* theFatherEntry, const char* theRefFatherEntry,
+                              const char* theIOR, const char* theName, 
+                              const char* thePersistentRef, const char* theComment,
+                              CORBA::Boolean theCreateNew = true);
+
+  std::string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry,
+                                  const char* theComment, int IsAllLevels = true);
 }
 
 #endif
index 1b8797106c19f36dbebc25faa3d92460d2554672..09a465037483256cc8056bc6c38a63bfe07b3f8b 100644 (file)
@@ -1,20 +1,43 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
+//
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //
 //  File   : VISU_CorbaMedConvertor.cxx
 //  Author : Alexey PETROV
 //  Module : VISU
+//  $Header$
+//  Copyright (C) 2003  CEA/DEN, EDF R&D
 
-using namespace std;
 #include "VISU_CorbaMedConvertor.hxx"
-using namespace VISU;
+
 #include <valarray>    
 #include <vtkCellType.h>
 
+using namespace VISU;
+using namespace std;
+
 #define USER_INTERLACE MED_FULL_INTERLACE
 
-#ifdef DEBUG
+#ifdef _DEBUG_
 static int MYDEBUG = 0;
 #else
 static int MYDEBUG = 0;
@@ -58,8 +81,8 @@ static int CELLGEOM[MED_NBR_GEOMETRIE_MAILLE] = {
   SALOME_MED::MED_TETRA4,
   SALOME_MED::MED_PYRA5,
   SALOME_MED::MED_PENTA6,
-  SALOME_MED::MED_TETRA10,
   SALOME_MED::MED_HEXA8,
+  SALOME_MED::MED_TETRA10,
   SALOME_MED::MED_PYRA13,
   SALOME_MED::MED_PENTA15,
   SALOME_MED::MED_HEXA20
@@ -129,8 +152,8 @@ static SalomeMed2vtk salome_med2vtk[SALOME_MED::MED_ALL_ELEMENTS] = {
   CORBAMED2VTK(MED_TETRA4,VTK_TETRA,4),
   CORBAMED2VTK(MED_PYRA5,VTK_PYRAMID,5),
   CORBAMED2VTK(MED_PENTA6,VTK_WEDGE,6),
-  CORBAMED2VTK(MED_TETRA10,VTK_TETRA,4),
   CORBAMED2VTK(MED_HEXA8,VTK_HEXAHEDRON,8),
+  CORBAMED2VTK(MED_TETRA10,VTK_TETRA,4),
   CORBAMED2VTK(MED_PYRA13,VTK_PYRAMID,5),
   CORBAMED2VTK(MED_PENTA15,VTK_WEDGE,6),
   CORBAMED2VTK(MED_HEXA20,VTK_HEXAHEDRON,8)
@@ -153,6 +176,74 @@ string GetName(SALOMEDS::SObject_ptr aSObject){
   return "";
 }
 
+
+static void GetCellsSize(vtkIdType& theNbCells, vtkIdType& theCellsSize,
+                        SALOME_MED::MESH_ptr theMEDMesh,
+                        const VISU::TEntity& theEntity)
+{
+  int iGeomElemEnd;
+  int* aGeomElemVector;
+  GetEntity2Geom(theEntity,aGeomElemVector,&iGeomElemEnd);
+  theNbCells = theCellsSize = 0;
+  const SALOME_MED::medEntityMesh& aMedEntity = aVisu2MedEntity[theEntity];
+  if(MYDEBUG) MESSAGE("GetCellsSize - theEntity = "<<theEntity);
+  for (int iGeomElem = 0, aCounter = 0; iGeomElem < iGeomElemEnd; iGeomElem++) {
+    int medId = GetIdMEDType(aGeomElemVector[iGeomElem]);
+    SALOME_MED::medGeometryElement aMedType = salome_med2vtk[medId].medType;
+    med_int iNumElemEnd = theMEDMesh->getNumberOfElements(aMedEntity,aMedType);
+    if(iNumElemEnd > 0){
+      if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<<iNumElemEnd);
+      theNbCells += iNumElemEnd;
+      theCellsSize += iNumElemEnd*(salome_med2vtk[medId].vtkNbNodes + 1);
+    }
+  }
+}
+
+
+static void GetCellsSize(vtkIdType& theNbCells, vtkIdType& theCellsSize,
+                        SALOME_MED::FAMILY_ptr theMEDFamily)
+{
+  SALOME_MED::medGeometryElement_array_var aGeom = theMEDFamily->getTypes();
+  med_int iGeomElemEnd = aGeom->length();
+  theNbCells = theCellsSize = 0;
+  if(MYDEBUG) MESSAGE("GetCellsSize - iGeomElemEnd = "<<iGeomElemEnd);
+  for (int iGeomElem = 0; iGeomElem < iGeomElemEnd; iGeomElem++) {
+    SALOME_MED::medGeometryElement aGeomType = aGeom[iGeomElem];
+    Engines::long_array_var aCellNumForType = theMEDFamily->getNumber(aGeomType);
+    int medId = GetIdMEDType(aGeomType);
+    med_int iNumElemEnd = aCellNumForType->length();
+    if(iNumElemEnd > 0){
+      if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<<iNumElemEnd);
+      theNbCells += iNumElemEnd;
+      theCellsSize += iNumElemEnd*(salome_med2vtk[medId].vtkNbNodes + 1);
+    }
+  }
+}
+
+
+static void GetCellsSize(VISU::TMesh& theMesh, 
+                        SALOME_MED::MESH_ptr theMEDMesh, 
+                        const VISU::TEntity& theEntity)
+{
+  VISU::TMeshOnEntity& aMeshOnEntity = theMesh.myMeshOnEntityMap[theEntity];
+  if(theEntity == VISU::NODE_ENTITY){
+    theMesh.myNbPoints = theMEDMesh->getNumberOfNodes();
+    aMeshOnEntity.myNbCells = theMesh.myNbPoints;
+    aMeshOnEntity.myCellsSize = 2*theMesh.myNbPoints;
+    vtkIdType aNbCells, aCellsSize;
+    GetCellsSize(aNbCells,aCellsSize,theMEDMesh,VISU::CELL_ENTITY);
+    if(aNbCells > 0){
+      VISU::TMeshOnEntity& aMeshOnCells = theMesh.myMeshOnEntityMap[VISU::CELL_ENTITY];
+      aMeshOnCells.myEntity = VISU::CELL_ENTITY;
+      aMeshOnCells.myMeshName = theMesh.myName;
+      aMeshOnCells.myNbCells = aNbCells;
+      aMeshOnCells.myCellsSize = aCellsSize;
+    }
+  }else
+    GetCellsSize(aMeshOnEntity.myNbCells,aMeshOnEntity.myCellsSize,theMEDMesh,theEntity);
+}
+
+
 VISU_Convertor* VISU_MEDFieldConvertor::Build() throw (std::runtime_error&){
   if(myField->_is_nil()) 
     throw std::runtime_error("VISU_MEDFieldConvertor::Build >> myField->_is_nil() !!!");
@@ -180,11 +271,9 @@ VISU_Convertor* VISU_MEDFieldConvertor::Build() throw (std::runtime_error&){
   aMeshOnEntity.myMeshName = aMeshName.in();
   VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
   aMeshOnEntity2.mySupport = aMEDSupport;
-  if(anEntity == VISU::NODE_ENTITY){
-    aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myEntity = VISU::CELL_ENTITY;
-    aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myMeshName = aMeshName.in();
+  if(anEntity == VISU::NODE_ENTITY)
     aMesh2.myMeshOnEntityMap[VISU::CELL_ENTITY].mySupport = aMEDSupport;
-  }
+  GetCellsSize(aMesh,aMEDMesh,anEntity);
 
   VISU::TField& aField = aMeshOnEntity.myFieldMap[aFieldName.in()];
   aField.myId = myField->getOrderNumber();
@@ -192,6 +281,8 @@ VISU_Convertor* VISU_MEDFieldConvertor::Build() throw (std::runtime_error&){
   aField.myEntity = anEntity;
   aField.myMeshName = aMeshName.in();
   aField.myNbComp = myField->getNumberOfComponents();
+  aField.myNbValField = 1;
+  aField.myDataSize = aMeshOnEntity.myNbCells * aField.myNbComp;
   aField.myCompNames.resize(aField.myNbComp);
   aField.myUnitNames.resize(aField.myNbComp);
   if(MYDEBUG) MESSAGE("VISU_MEDFieldConvertor::Build - aMeshName = "<<aMeshName<<"; myDim = "<<aMesh.myDim);
@@ -221,8 +312,8 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
       CORBA::Short aTag = mySObject->Tag();
       SALOMEDS::SObject_var aMedCompSObj = mySObject->GetFather();
       SALOMEDS::SObject_var aMeshSObj;
-      CORBA::Boolean aBool = aMedCompSObj->FindSubObject(aTag+1,aMeshSObj);
-      if(!aBool) throw std::runtime_error("VISU_MEDConvertor::Build >> Cann't find MEDMESH label !!!");
+      if(!aMedCompSObj->FindSubObject(aTag+1,aMeshSObj)) 
+       throw std::runtime_error("VISU_MEDConvertor::Build >> Cann't find MEDMESH label !!!");
       if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - MEDMESH found.");
       SALOMEDS::ChildIterator_var aMeshIterator = aStudy->NewChildIterator(aMeshSObj);
       for(; aMeshIterator->More(); aMeshIterator->Next()){
@@ -246,50 +337,49 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
          if(CORBA::is_nil(aMedSupport)) continue;
          SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
          if(aMEDSupport->_is_nil()) continue;
+         SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
          SALOME_MED::medEntityMesh aMEDEntity = aMEDSupport->getEntity();
          VISU::TEntity anEntity = aMed2VisuEntity[aMEDEntity];
          CORBA::String_var aSupportName = aMEDSupport->getName();
-         bool isDataPresent = false;
          if(aMEDSupport->isOnAllElements()){
            if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - Support isOnAllElements = '"<<aSupportName<<"' anEntity = "<<anEntity);
+           int aNbCells, aCellsSize;
            //Check, if there is any data on the support?
-           SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
            if(anEntity == VISU::NODE_ENTITY){
-             if(aMeshOnSupport->getNumberOfNodes() > 0) 
-               isDataPresent = true;
+             aMesh.myNbPoints = aMeshOnSupport->getNumberOfNodes();
+             aNbCells = aMesh.myNbPoints;
+             aCellsSize = 2*aMesh.myNbPoints;
            }else{
-             int iGeomElemEnd;
-             int* aGeomElemVector;
-             GetEntity2Geom(anEntity,aGeomElemVector,&iGeomElemEnd);
-             const SALOME_MED::medEntityMesh& aMedEntity = aVisu2MedEntity[anEntity];
-             for (int iGeomElem = 0, aCounter = 0; iGeomElem < iGeomElemEnd; iGeomElem++) {
-               int medId = GetIdMEDType(aGeomElemVector[iGeomElem]);
-               SALOME_MED::medGeometryElement aMedType = salome_med2vtk[medId].medType;
-               med_int iNumElemEnd = aMeshOnSupport->getNumberOfElements(aMedEntity,aMedType);
-               if(iNumElemEnd > 0) {
-                 isDataPresent = true;
-                 break;
-               }
-             }
+             GetCellsSize(aNbCells,aCellsSize,aMeshOnSupport,anEntity);
            }
-           if(!isDataPresent) continue;
+           if(aNbCells == 0) continue;
            VISU::TMeshOnEntity& aMeshOnEntity = aMesh.myMeshOnEntityMap[anEntity];
-           aMeshOnEntity.myEntity = anEntity;
            aMeshOnEntity.myMeshName = aMeshName.in();
-           VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
+           aMeshOnEntity.myEntity = anEntity;
+           aMeshOnEntity.myNbCells = aNbCells;
+           aMeshOnEntity.myCellsSize = aCellsSize;
+
+           VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
            aMeshOnEntity2.mySupport = aMEDSupport;
          }else{
            SALOME_MED::FAMILY_var aMEDFamily = SALOME_MED::FAMILY::_narrow(aMedSupport);
            if(!aMEDFamily->_is_nil()) {
-             if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aFamily = '"<<aSupportName<<"' anEntity = "<<anEntity);
-             VISU::TMeshOnEntity& aMeshOnEntity = aMesh.myMeshOnEntityMap[anEntity];
-             VISU::TFamily& aFamily = aMeshOnEntity.myFamilyMap[aSupportName.in()];
-             aFamily.myName = aSupportName.in();
-             aFamily.myEntity = anEntity;
-             aFamily.myId = aMEDFamily->getIdentifier();
-             VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
-             VISUMED::TFamily& aFamily2 = aMeshOnEntity2.myFamilyMap[aSupportName.in()];
-             aFamily2.myFamily = aMEDFamily;
+             int aNbCells, aCellsSize;
+             GetCellsSize(aNbCells,aCellsSize,aMEDFamily);
+             if(aNbCells > 0){
+               if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aFamily = '"<<aSupportName<<"' anEntity = "<<anEntity);
+               VISU::TMeshOnEntity& aMeshOnEntity = aMesh.myMeshOnEntityMap[anEntity];
+               VISU::TFamily& aFamily = aMeshOnEntity.myFamilyMap[aSupportName.in()];
+               aFamily.myName = aSupportName.in();
+               aFamily.myEntity = anEntity;
+               aFamily.myNbCells = aNbCells;
+               aFamily.myCellsSize = aCellsSize;
+               aFamily.myId = aMEDFamily->getIdentifier();
+
+               VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
+               VISUMED::TFamily& aFamily2 = aMeshOnEntity2.myFamilyMap[aSupportName.in()];
+               aFamily2.myFamily = aMEDFamily;
+             }
            }
            SALOME_MED::GROUP_var aMEDGroup = SALOME_MED::GROUP::_narrow(aMedSupport);
            if(!aMEDGroup->_is_nil()) {
@@ -297,17 +387,13 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
              VISUMED::TGroupMap& aGroupMap2 = aMesh2.myGroupMap;
              VISUMED::TGroup& aGroup2 = aGroupMap2[aSupportName.in()];
              aGroup2.myGroup = aMEDGroup;
-             //VISU::TGroupMap& aGroupMap = aMesh.myGroupMap;
-             //VISU::TMeshOnEntity& aMeshOnEntity = aMesh.myMeshOnEntityMap[anEntity];
-             //VISU::TGroup& aGroup = aGroupMap[aSupportName.in()];
-             //aGroup.myName = aSupportName.in();
-             //aGroup.myMeshName = aMesh.myName;
              SALOME_MED::Family_array_var aFamilies = aMEDGroup->getFamilies();
              int iFamilyEnd = aFamilies->length();
              for(int iFamaily = 0; iFamaily < iFamilyEnd; iFamaily++){
                aMEDFamily = aFamilies[iFamaily];
                CORBA::String_var aFamilyName = aMEDFamily->getName();
                VISU::TMeshOnEntity& aMeshOnEntity = aMesh.myMeshOnEntityMap[anEntity];
+               if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aGroup - aFamilyName = '"<<aFamilyName.in()<<"'");
                VISU::TFamily& aFamily = aMeshOnEntity.myFamilyMap[aFamilyName.in()];
                VISU::TBindGroups& aBindGroups = aFamily.myGroups;
                aBindGroups.insert(aSupportName.in());
@@ -335,6 +421,8 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
              VISU::TGroup& aGroup = aGroupMap[aGroupName];
              aGroup.myName = aGroupName;
              aGroup.myMeshName = aMesh.myName;
+             aGroup.myNbCells += aFamily.myNbCells;
+             aGroup.myCellsSize += aFamily.myCellsSize;
              VISU::TFamilyAndEntity aFamilyAndEntity(aFamily.myName,aFamily.myEntity);
              aGroup.myFamilyAndEntitySet.insert(aFamilyAndEntity);
            }
@@ -342,15 +430,14 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
        }
       }
       SALOMEDS::SObject_var aFieldSObj;
-      aBool = aMedCompSObj->FindSubObject(aTag+2,aFieldSObj);
-      if(aBool){
+      if(aMedCompSObj->FindSubObject(aTag+2,aFieldSObj)){
        if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - MEDFIELD found.");
        SALOMEDS::ChildIterator_var aFieldIterator = aStudy->NewChildIterator(aFieldSObj);
        for(int iField = 0; aFieldIterator->More(); aFieldIterator->Next(), iField++){
          aFieldSObj = aFieldIterator->Value();
          if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aFieldName = '"<<::GetName(aFieldSObj)<<"'");
          SALOMEDS::ChildIterator_var aTimeStampIterator = aStudy->NewChildIterator(aFieldSObj);
-         for(; aTimeStampIterator->More(); aTimeStampIterator->Next()){
+         for(int iTimeStamp = 1; aTimeStampIterator->More(); aTimeStampIterator->Next(), iTimeStamp++){
            SALOMEDS::SObject_var aTimeStampSObj = aTimeStampIterator->Value();
            if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<<::GetName(aTimeStampSObj)<<"'");
            CORBA::Object_var aMedField = SObjectToObject(aTimeStampSObj);
@@ -377,11 +464,9 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
            aMeshOnEntity.myMeshName = aMeshName.in();
            VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
            aMeshOnEntity2.mySupport = aMEDSupport;
-           if(anEntity == VISU::NODE_ENTITY){
-             aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myEntity = VISU::CELL_ENTITY;
-             aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myMeshName = aMeshName.in();
+           if(anEntity == VISU::NODE_ENTITY)
              aMesh2.myMeshOnEntityMap[VISU::CELL_ENTITY].mySupport = aMEDSupport;
-           }
+           GetCellsSize(aMesh,aMEDMesh,anEntity);
 
            VISU::TField& aField = aMeshOnEntity.myFieldMap[aFieldName.in()];
            aField.myId = iField;
@@ -389,20 +474,23 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
            aField.myEntity = anEntity;
            aField.myMeshName = aMeshName.in();
            aField.myNbComp = aMEDField->getNumberOfComponents();
+           aField.myNbValField = iTimeStamp;
+           aField.myDataSize = aMeshOnEntity.myNbCells * aField.myNbComp;
+           if(MYDEBUG && !iTimeStamp) 
+             MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity.myNbCells = "<<aMeshOnEntity.myNbCells);
            aField.myCompNames.resize(aField.myNbComp);
            aField.myUnitNames.resize(aField.myNbComp);
-           //int iTimeStamp = aMEDField->getOrderNumber();
-           int iTimeStamp = aMEDField->getIterationNumber();
-           VISU::TField::TValForTime& aValForTime = aField.myValField[iTimeStamp];
-           aValForTime.myId = iTimeStamp;
-           double dt = aMEDField->getTime();
-           aValForTime.myTime = VISU::TField::TTime(dt,"");
 
+           int anId = aMEDField->getIterationNumber();
+           VISU::TField::TValForTime& aValForTime = aField.myValField[anId];
+           aValForTime.myId = anId;
+           aValForTime.myTime = VISU::TField::TTime(aMEDField->getTime(),"");
            VISUMED::TField& aField2 = aMeshOnEntity2.myFieldMap[aFieldName.in()];
-           VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[iTimeStamp];
+           VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[anId];
            aValForTime2.myField = aMEDField;
            if(MYDEBUG) 
-             MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<"'; myEntity = "<<anEntity<<"; myTime = "<<dt);
+             MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<
+                     "'; myEntity = "<<anEntity<<"; myTime = "<<aValForTime.myTime.first);
          }      
        }
       }
@@ -411,7 +499,7 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
     return NULL; 
   }
   SALOMEDS::ChildIterator_var aTimeStampIterator = aStudy->NewChildIterator(mySObject);
-  for(; aTimeStampIterator->More(); aTimeStampIterator->Next()){
+  for(int iTimeStamp = 1; aTimeStampIterator->More(); aTimeStampIterator->Next(), iTimeStamp++){
     SALOMEDS::SObject_var aTimeStampSObj = aTimeStampIterator->Value();
     if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<<::GetName(aTimeStampSObj)<<"'");
     CORBA::Object_var aMedField = SObjectToObject(aTimeStampSObj);
@@ -430,6 +518,7 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
     VISU::TMesh &aMesh = myMeshMap[aMeshName.in()];
     aMesh.myDim = aMEDMesh->getSpaceDimension();
     aMesh.myName = aMeshName.in();
+    aMesh.myNbPoints = aMEDMesh->getNumberOfNodes();
     VISUMED::TMesh &aMesh2 = myMeshMap2[aMeshName.in()];
     aMesh2.myMesh = aMEDMesh;
     if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aMeshName = "<<aMeshName<<"; myDim = "<<aMesh.myDim);
@@ -439,11 +528,9 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
     aMeshOnEntity.myMeshName = aMeshName.in();
     VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity];
     aMeshOnEntity2.mySupport = aMEDSupport;
-    if(anEntity == VISU::NODE_ENTITY){
-      aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myEntity = VISU::CELL_ENTITY;
-      aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myMeshName = aMeshName.in();
+    if(anEntity == VISU::NODE_ENTITY)
       aMesh2.myMeshOnEntityMap[VISU::CELL_ENTITY].mySupport = aMEDSupport;
-    }
+    GetCellsSize(aMesh,aMEDMesh,anEntity);
 
     VISU::TField& aField = aMeshOnEntity.myFieldMap[aFieldName.in()];
     CORBA::Short iField = mySObject->Tag();
@@ -452,20 +539,23 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){
     aField.myEntity = anEntity;
     aField.myMeshName = aMeshName.in();
     aField.myNbComp = aMEDField->getNumberOfComponents();
+    aField.myNbValField = iTimeStamp;
+    aField.myDataSize = aMeshOnEntity.myNbCells * aField.myNbComp;
+    if(MYDEBUG && !iTimeStamp) 
+      MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity.myNbCells = "<<aMeshOnEntity.myNbCells);
     aField.myCompNames.resize(aField.myNbComp);
     aField.myUnitNames.resize(aField.myNbComp);
-    //int iTimeStamp = aMEDField->getOrderNumber();
-    int iTimeStamp = aMEDField->getIterationNumber();
-    VISU::TField::TValForTime& aValForTime = aField.myValField[iTimeStamp];
-    aValForTime.myId = iTimeStamp;
-    double dt = aMEDField->getTime();
-    aValForTime.myTime = VISU::TField::TTime(dt,"");
 
+    int anId = aMEDField->getIterationNumber();
+    VISU::TField::TValForTime& aValForTime = aField.myValField[anId];
+    aValForTime.myId = anId;
+    aValForTime.myTime = VISU::TField::TTime(aMEDField->getTime(),"");
     VISUMED::TField& aField2 = aMeshOnEntity2.myFieldMap[aFieldName.in()];
-    VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[iTimeStamp];
+    VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[anId];
     aValForTime2.myField = aMEDField;
     if(MYDEBUG) 
-      MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<"'; myEntity = "<<anEntity<<"; myTime = "<<dt);
+      MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<
+             "'; myEntity = "<<anEntity<<"; myTime = "<<aValForTime.myTime.first);
   }
   return this; 
 }
index e850515dca2e0da3db52de578917cef3998b971c..b506b18138c4975fc5ada326597b785dfe621777 100644 (file)
@@ -1,10 +1,31 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
+//
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //
 //  File   : VISU_CorbaMedConvertor.hxx
 //  Author : Alexey PETROV
 //  Module : VISU
+//  $Header$
+//  Copyright (C) 2003  CEA/DEN, EDF R&D
 
 #ifndef VISU_CorbaMedConvertor_HeaderFile
 #define VISU_CorbaMedConvertor_HeaderFile
index c31b72141c8d69d4548cf302386b83f8ec4fabb2..f64209251c350ff67f205c47db7f03dbdbbf5100 100644 (file)
@@ -1,28 +1,54 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
-//  File   : VISU_Gen_i.cc file 
-//  Author : Alexey Petrov
+//  File   : VISU_Gen_i.cc
+//  Author : Alexey PETROV
 //  Module : VISU
-//  $Header: 
 
-using namespace std;
 #include "VISU_Gen_i.hh"
 #include "VISU_Result_i.hh"
-#include "VISU_Convertor.hxx"
 #include "VISU_PrsObject_i.hh"
 #include "VISU_ViewManager_i.hh"
-#include "VISU_TimeAnimation.h"
+
+#include "VISU_Prs3d_i.hh"
+#include "VISU_Mesh_i.hh"
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_IsoSurfaces_i.hh"
+#include "VISU_DeformedShape_i.hh"
+#include "VISU_CutPlanes_i.hh"
+#include "VISU_CutLines_i.hh"
+#include "VISU_Vectors_i.hh"
+#include "VISU_StreamLines_i.hh"
 #include "VISU_Table_i.hh"
+#include "VISU_TimeAnimation.h"
 
 #include "HDFascii.hxx"
 #include "SALOMEDS_Tool.hxx"
+
+#include "utilities.h"
+
 #include <strstream>   
 #include <TCollection_AsciiString.hxx>
 #include <TColStd_SequenceOfAsciiString.hxx>
-#include <vtkUnstructuredGridReader.h>
-#include <vtkUnstructuredGridWriter.h>
 
 #include <omnithread.h>        
 #include CORBA_SERVER_HEADER(SALOME_Session)
@@ -30,17 +56,17 @@ using namespace std;
 
 #include <qstring.h>
 #include <qfileinfo.h>
+
+using namespace std;
+
 static QFileInfo aFileInfo;
 
-#ifdef DEBUG
+#ifdef _DEBUG_
 static int MYDEBUG = 0;
 #else
 static int MYDEBUG = 0;
 #endif
 
-#include <utilities.h>
-
-//static int IS_LOADED = (cout<<"\n----------------- VisuEngine_factory is loaded -----------------\n", 1);
 extern "C" {
   PortableServer::ObjectId * 
     VISUEngine_factory(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, PortableServer::ObjectId * contId,
@@ -51,205 +77,22 @@ extern "C" {
        return pVISU_Gen->getId() ;
       }
   VISU::VISU_Gen_ptr  
-    GetVisuGen(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, 
-              SALOME_NamingService* theNamingService, QMutex* theMutex)
-      {
-       if(MYDEBUG) MESSAGE("extern \"C\" GetVisuGen");
-       VISU::VISU_Gen_i *aVISU_Gen = new VISU::VISU_Gen_i(theORB,thePOA,theNamingService,theMutex);
-       return VISU::VISU_Gen::_duplicate(aVISU_Gen->_this());
-       //return aVISU_Gen->_this();
-      }
-}
-
-namespace VISU{
-  //===========================================================================
-  //apo - static QMutex VISUMutex;
-  QMutex* Base_i::myMutex = NULL; //apo - &VISUMutex;
-  CORBA::ORB_var Base_i::myOrb;
-  PortableServer::POA_var Base_i::myPOA;
-  SALOME_NamingService* Base_i::myNamingService;
-  SALOME_LifeCycleCORBA* Base_i::myEnginesLifeCycle;
-  VISU_Gen_i* Base_i::myVisuGenImpl;
-  VISU_Gen_var Base_i::GetVisuGenInter() { return myVisuGenImpl->_this();}
-  Base_i::~Base_i() {}
-  char* Base_i::GetID(){ 
-    //CORBA::Object_var anObject = _this();
-    //return CORBA::string_dup(myOrb->object_to_string(anObject));
-    return CORBA::string_dup(myOrb->object_to_string(_this()));
-  }
-  //===========================================================================
-  static int mySCnt = 0;
-  static int myQCnt = 0;
-  static int myIsBatchMode = 0;
-
-  static int QApp_Counter = 0;
-  static int Session_Counter = 0;
-  static int COUNTER = 0;
-
-  Mutex::Mutex(QMutex* theMutex, QApplication* theQApp, int theDelay) :
-    myQApp(theQApp), isQAppLocked(theQApp->locked()), myDelay(theDelay),
-    myMutex(theMutex), isSessionLocked(theMutex->locked())
+  GetVisuGen(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, 
+            SALOME_NamingService* theNamingService, QMutex* theMutex)
   {
-    if(MYDEBUG) MESSAGE("Mutex::Mutex : "<<(!isQAppLocked && !myQCnt)<<" "<<(!isSessionLocked && !mySCnt));
-    if(!myIsBatchMode && isQAppLocked) myIsBatchMode++;
-    if(!isSessionLocked && !mySCnt) { myMutex->lock();}; mySCnt++;
-    if(!isQAppLocked && !myQCnt) { 
-      myQApp->lock(); 
-      myQApp->syncX();
-    };
-    myQCnt++;
-  }
-  Mutex::~Mutex(){
-    myQCnt--; 
-    if(!isQAppLocked && !myQCnt) { 
-      myQApp->flushX(); 
-      //if(myDelay > 0)
-       myQApp->processEvents(myDelay+3);
-      myQApp->unlock();
-    }
-    mySCnt--; if(!isSessionLocked && !mySCnt) { myMutex->unlock();}
-    if(MYDEBUG) MESSAGE("Mutex::~Mutex : "<<(!isQAppLocked && !myQCnt)<<" "<<(!isSessionLocked && !mySCnt));
-  }
-  //===========================================================================
-  static Storable::TCallbackMap VisuStoreMap;
-  string Storable::ToString(){
-    ostringstream strOut;
-    Storable::DataToStream( strOut, "myComment", GetComment() );
-    ToStream(strOut);
-    strOut<<ends;
-    if(MYDEBUG) MESSAGE("Storable::ToString - "<<strOut.str());
-    //apo - auto_ptr<char> aRet(strOut.str());
-    return strOut.str(); 
+    if(MYDEBUG) MESSAGE("extern \"C\" GetVisuGen");
+    VISU::VISU_Gen_i *aVISU_Gen = new VISU::VISU_Gen_i(theORB,thePOA,theNamingService,theMutex);
+    return VISU::VISU_Gen::_duplicate(aVISU_Gen->_this());
+    //return aVISU_Gen->_this();
   }
+}
 
-  void Storable::Registry(const char* theComment, TStorableEngine theEngine)
-    throw(std::logic_error&)
-      {
-       if(!VisuStoreMap.insert(TCallbackMap::value_type(theComment,theEngine)).second){
-         if(MYDEBUG) MESSAGE("Storable::Registry >> dupliacte registring !!!");
-         throw std::logic_error("Storable::Registry >> dupliacte registring !!!");
-       }
-      }
-
-  void RegistryStorable() throw(std::logic_error&) {
-    //Storable::Registry(View3D_i::myComment.c_str(),&View3DRestore);
-    Storable::Registry(Result_i::myComment.c_str(),&ResultRestore);
-    Storable::Registry(Mesh_i::myComment.c_str(),&MeshRestore);
-    Storable::Registry(ScalarMap_i::myComment.c_str(),&ScalarMapRestore);
-    Storable::Registry(DeformedShape_i::myComment.c_str(),&DeformedShapeRestore);
-    Storable::Registry(CutPlanes_i::myComment.c_str(),&CutPlanesRestore);
-    Storable::Registry(CutLines_i::myComment.c_str(),&CutLinesRestore);
-    Storable::Registry(IsoSurfaces_i::myComment.c_str(),&IsoSurfacesRestore);
-    Storable::Registry(StreamLines_i::myComment.c_str(),&StreamLinesRestore);
-    Storable::Registry(Vectors_i::myComment.c_str(),&VectorsRestore);
-    Storable::Registry(Table_i::myComment.c_str(),&TableRestore);
-    Storable::Registry(Curve_i::myComment.c_str(),&CurveRestore);
-    Storable::Registry(Container_i::myComment.c_str(),&ContainerRestore);
-  }
+namespace VISU{
+  static string VisuTmpDir;
 
-  void Storable::StrToMap(const QString& theStr, VISU::Storable::TRestoringMap& theMap){
-    if(0 && MYDEBUG) MESSAGE("Storable::StrToMap : string="<<theStr);
-    QStringList strList = QStringList::split( ";", theStr, false );
-    for ( int i = 0; i < strList.count(); i++ ) {
-      QString next = strList[ i ];
-      int pos = next.find("=");
-      QString aName, aValue;
-      if ( pos < 0 ) {
-       aName = next.stripWhiteSpace();
-       aValue = "";
-      }
-      else {
-       aName = next.left( pos ).stripWhiteSpace();
-       aValue = next.mid( pos+1 );
-       if ( aValue.isNull() )
-         aValue = "";
-      }
-      if ( !aName.isEmpty() )
-       theMap.insert( TRestoringMap::value_type( aName.latin1(), aValue ) );   
-    }
-  }
-  void Storable::DataToStream(ostringstream& theStr, const QString& theName, const QString& theVal) {
-    QString output = ( !theName.isNull() ? theName : QString("") ) 
-                   + QString( "=" ) 
-                  + ( !theVal.isNull()  ? theVal  : QString("") );
-    theStr<<output.latin1()<<";";
-  }
-  void Storable::DataToStream(ostringstream& theStr, const QString& theName, const int theVal) {
-    QString output = ( !theName.isNull() ? theName : QString("") ) 
-                   + QString( "=" ) 
-                  + QString::number( theVal );
-    theStr<<output.latin1()<<";";
-  }
-  void Storable::DataToStream(ostringstream& theStr, const QString& theName, const double theVal) {
-    QString output = ( !theName.isNull() ? theName : QString("") ) 
-                   + QString( "=" ) 
-                  + QString::number( theVal );
-    theStr<<output.latin1()<<";";
-  }
-  Storable* Storable::Create(SALOMEDS::SObject_ptr theSObject,
-                            const string& thePrefix, const string& theLocalPersistentID) 
-    throw (std::runtime_error&)
-      {
-       try{
-         QString strIn( theLocalPersistentID.c_str() );
-         TRestoringMap aMap;
-         StrToMap(strIn,aMap);
-         //CORBA::String_var aResultID(GetResultSO(theSObject)->GetID());
-         //aMap.insert(TRestoringMap::value_type("ResultID", strdup(aResultID)));
-         bool isExist;
-         QString aComment = VISU::Storable::FindValue(aMap,"myComment",&isExist);
-         if ( isExist ) {
-           TCallbackMap::const_iterator i = VisuStoreMap.find(aComment.latin1());
-           if(MYDEBUG) MESSAGE("Storable::Create - "<<aComment.latin1()<<" "<<(i != VisuStoreMap.end()));
-           if(i == VisuStoreMap.end()) return NULL;
-           return (i->second)(theSObject,thePrefix,aMap);
-         }
-       }catch(std::logic_error& exc){
-         MESSAGE("Follow exception was accured :\n"<<exc.what());
-       }catch(...){
-         MESSAGE("Unknown exception was accured!");
-       }
-       return NULL;
-      }
-  const QString& Storable::FindValue(const TRestoringMap& theMap, const string& theArg, bool* isFind)
-    throw(std::logic_error&)
-      {
-       TRestoringMap::const_iterator i = theMap.find(theArg);
-       if(i == theMap.end()) {
-         if(MYDEBUG) MESSAGE("Storable::Init >> there is no value for "<<theArg);
-         if(isFind != NULL) *isFind = false;
-         //throw std::logic_error(string("Storable::Init >> there is no value for ") + theArg);
-         static QString BAD_VALUE("NULL");
-         return BAD_VALUE;
-       }
-       if(isFind != NULL) *isFind = true;
-       return i->second;
-      }
+  static CORBA::Boolean myIsMultiFile;
+  const CORBA::Boolean IsMultifile() { return myIsMultiFile;}
 
-  //===========================================================================
-  PortableServer::Servant GetServant(CORBA::Object_ptr theObject){
-    PortableServer::POA_ptr aPOA = Base_i::GetPOA();
-    if(CORBA::is_nil(theObject)) 
-      if(MYDEBUG) MESSAGE("GetServant - CORBA::is_nil(theObject)");
-    return aPOA->reference_to_servant(theObject);
-  }
-  //===========================================================================
-  CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr theSObject){
-    SALOMEDS::GenericAttribute_var anAttr;
-    CORBA::Object_var anObj;
-    try{
-      if(theSObject->FindAttribute(anAttr, "AttributeIOR")){
-       SALOMEDS::AttributeIOR_var anIOR  = SALOMEDS::AttributeIOR::_narrow(anAttr);
-       CORBA::String_var aValue = anIOR->Value();
-       CORBA::ORB_ptr anORB = Base_i::GetORB();
-       if(strcmp(aValue,"") != 0)
-         anObj = anORB->string_to_object(aValue);
-      }
-    }catch(...){
-      MESSAGE("SObjectToObject - Unknown exception was accured!");
-    }
-    return anObj;
-  }
   //===========================================================================
   SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument){
     SALOMEDS::SComponent_var aSComponent = theStudyDocument->FindComponent("VISU");
@@ -276,82 +119,31 @@ namespace VISU{
       SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
       aPixmap->SetPixMap( "ICON_OBJBROWSER_Visu" );
       
-      VISU_Gen_var aVisuGen = Base_i::GetVisuGenInter();
+      VISU_Gen_var aVisuGen = Base_i::GetVisuGenImpl()->_this();
       aStudyBuilder->DefineComponentInstance(aSComponent,aVisuGen);
       if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
       aStudyBuilder->CommitCommand();
     }
     return aSComponent;
   }
-  //===========================================================================
-  string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry,
-                                  const char* theComment, int IsAllLevels)
-    {
-      if(0 && MYDEBUG) MESSAGE("FindEntryWithComment - '"<<theComment<<"'");
-      SALOMEDS::ChildIterator_var anIter = 
-       theStudyDocument->NewChildIterator(theStudyDocument->FindObjectID(theStartEntry));
-      anIter->InitEx(IsAllLevels);
-      SALOMEDS::SObject_var aFieldSO;
-      for(;anIter->More();anIter->Next()) {
-       SALOMEDS::GenericAttribute_var anAttr;
-       if (anIter->Value()->FindAttribute(anAttr,"AttributeComment")) {
-         SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr);
-         CORBA::String_var aString = aCmnt->Value();
-         string aValue(aString);
-         if (aValue == theComment) {
-           aFieldSO = anIter->Value();
-           aString = aFieldSO->GetID();
-           aValue = aString;
-           return aValue;
-         }
-       }
-      }
-      return "";
-    }
-  //===========================================================================
-  string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument, 
-                              const char* theFatherEntry, const char* theRefFatherEntry,
-                              const char* theIOR, const char* theName, 
-                              const char* thePersistentRef, const char* theComment,
-                              CORBA::Boolean theCreateNew)
-    {
-      if(0 && MYDEBUG) 
-       MESSAGE("CreateAttributes - theName = "<<theName<<"; theComment = '"<<theComment<<
-               "'; theFatherEntry = "<<theFatherEntry);
-      SALOMEDS::StudyBuilder_var aStudyBuilder = theStudyDocument->NewBuilder();
-      SALOMEDS::SObject_var aFather = theStudyDocument->FindObjectID(theFatherEntry);
-      SALOMEDS::SObject_var newObj;
-      if (theCreateNew) newObj = aStudyBuilder->NewObject(aFather);
-      else newObj = aFather;
-      SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
-      SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-      anIOR->SetValue(theIOR); 
-      anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
-      SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
-      aName->SetValue(theName); 
-      anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePersistentRef");
-      SALOMEDS::AttributePersistentRef_var aPRef = SALOMEDS::AttributePersistentRef::_narrow(anAttr);
-      aPRef->SetValue(thePersistentRef); 
-      anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
-      SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr);
-      aCmnt->SetValue(theComment);
-      if(strcmp(theRefFatherEntry,"") != 0){
-       SALOMEDS::SObject_var aRefFather = theStudyDocument->FindObjectID(theRefFatherEntry);
-       SALOMEDS::SObject_var anObj = aStudyBuilder->NewObject(aRefFather);
-       aStudyBuilder->Addreference(anObj,newObj);
-      }
-      CORBA::String_var anEntry = newObj->GetID();
-      string aRet(anEntry);
-      if(0 && MYDEBUG) MESSAGE("CreateAttributes - anEntry = "<<aRet<<"; IOR = "<<theIOR);
-      return aRet;
-    }
-  //===========================================================================
-  static SALOMEDS::SComponent_var VisuSComponent;
-  static string VisuTmpDir;
-  static CORBA::Boolean myIsMultiFile;
-  const CORBA::Boolean IsMultifile() { 
-    return myIsMultiFile;
+
+
+  void RegistryStorable() throw(std::logic_error&) {
+    Storable::Registry(Result_i::myComment.c_str(),&(Result_i::Restore));
+    Storable::Registry(Mesh_i::myComment.c_str(),&(Mesh_i::Restore));
+    Storable::Registry(ScalarMap_i::myComment.c_str(),&(ScalarMap_i::Restore));
+    Storable::Registry(DeformedShape_i::myComment.c_str(),&(DeformedShape_i::Restore));
+    Storable::Registry(CutPlanes_i::myComment.c_str(),&(CutPlanes_i::Restore));
+    Storable::Registry(CutLines_i::myComment.c_str(),&(CutLines_i::Restore));
+    Storable::Registry(IsoSurfaces_i::myComment.c_str(),&(IsoSurfaces_i::Restore));
+    Storable::Registry(StreamLines_i::myComment.c_str(),&(StreamLines_i::Restore));
+    Storable::Registry(Vectors_i::myComment.c_str(),&(Vectors_i::Restore));
+    Storable::Registry(Table_i::myComment.c_str(),&(Table_i::Restore));
+    Storable::Registry(Curve_i::myComment.c_str(),&(Curve_i::Restore));
+    Storable::Registry(Container_i::myComment.c_str(),&(Container_i::Restore));
   }
+
+
   //===========================================================================
   VISU_Gen_i::VISU_Gen_i(CORBA::ORB_ptr orb,
                         PortableServer::POA_ptr poa,
@@ -369,7 +161,7 @@ namespace VISU{
     //aSession->GetInterface(); 
     Engines::Component_var aComponent = aSession->GetVisuComponent();
     myVisuGen = VISU::VISU_Gen::_narrow(aComponent);
-  }
+  } 
 
   VISU_Gen_i::VISU_Gen_i(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, 
                         SALOME_NamingService* theNamingService, QMutex* theMutex) :
@@ -405,9 +197,9 @@ namespace VISU{
   }
   //===========================================================================
   bool VISU_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent,
-                     const SALOMEDS::TMPFile & theStream,
-                     const char* theURL,
-                     bool isMultiFile)
+                       const SALOMEDS::TMPFile & theStream,
+                       const char* theURL,
+                       bool isMultiFile)
   {
     if(MYDEBUG) MESSAGE("VISU_Gen_i::Load - myMutex = "<<myMutex);
     if(myMutex){
@@ -416,7 +208,6 @@ namespace VISU{
       SALOMEDS::StudyBuilder_var  aStudyBuilder = aStudy->NewBuilder(); 
       TCollection_AsciiString aTmpDir =
        isMultiFile?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir();
-      VisuSComponent = SALOMEDS::SComponent::_duplicate(theComponent);
       VisuTmpDir = aTmpDir.ToCString();
       SALOMEDS::ListOfFileNames_var aSeq =
        SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.ToCString(),isMultiFile);
@@ -429,14 +220,16 @@ namespace VISU{
   bool VISU_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent,
                             const SALOMEDS::TMPFile & theStream,
                             const char* theURL,
-                            bool isMultiFile) {
+                            bool isMultiFile) 
+  {
     return Load(theComponent, theStream, theURL, isMultiFile);
   }
 
   char* VISU_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject,
                                           const char* aLocalPersistentID,
                                           CORBA::Boolean isMultiFile,
-                                          CORBA::Boolean isASCII) {
+                                          CORBA::Boolean isASCII) 
+  {
     if(myMutex){
       CORBA::String_var aString("");
       if(strcmp(aLocalPersistentID,"") != 0) {
@@ -451,8 +244,8 @@ namespace VISU{
   }
   //===========================================================================
   SALOMEDS::TMPFile* VISU_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent,
-                                   const char* theURL,
-                                   bool isMultiFile)
+                                     const char* theURL,
+                                     bool isMultiFile)
   {
     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - myMutex = "<<myMutex);
     if(myMutex){
@@ -577,15 +370,20 @@ namespace VISU{
     return myVisuGen->IORToLocalPersistentID(theSObject, IORString, isMultiFile, isASCII);
   }
 
-  void VISU_Gen_i::SetCurrentStudy(SALOMEDS::Study_ptr theStudy){
-    //if(MYDEBUG) MESSAGE("VISU_Gen_i::SetCurrentStudy : "<<(!theStudy->_is_nil()));
+  char* VISU_Gen_i::GetID(){
     if(myMutex)
-      myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
-    else
-      myVisuGen->SetCurrentStudy(theStudy);
+      return Base_i::GetID();
+    return myVisuGen->GetID();
+  }
+
+  void VISU_Gen_i::SetCurrentStudy(SALOMEDS::Study_ptr theStudy){
+    if(myMutex){
+      if(!CORBA::is_nil(theStudy))
+       myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
+    }else
+      myVisuGen->SetCurrentStudy(SALOMEDS::Study::_duplicate(theStudy));
   }
   SALOMEDS::Study_ptr VISU_Gen_i::GetCurrentStudy(){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::GetCurrentStudy : "<<myMutex);
     if(myMutex)
       return SALOMEDS::Study::_duplicate(myStudyDocument);
     return myVisuGen->GetCurrentStudy();
@@ -616,11 +414,12 @@ namespace VISU{
     if(myMutex){
       if(myStudyDocument->GetProperties()->IsLocked()) return Result::_nil();
       Mutex mt(myMutex,qApp);
+      VISU::Result_var aResult;
       aFileInfo.setFile(theFileName);
       Result_i* pResult = new Result_i(myStudyDocument);
       if(pResult->Create(theFileName) != NULL) 
-       return Result::_duplicate(pResult->_this());
-      return Result::_nil();
+       aResult = pResult->_this();
+      return aResult._retn();
     }
     return myVisuGen->ImportFile(theFileName);
   }
@@ -697,124 +496,51 @@ namespace VISU{
   }
 
   ScalarMap_ptr VISU_Gen_i::ScalarMapOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                            const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::ScalarMapOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return ScalarMap::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(ScalarMap_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-       ScalarMap_i* aPresent = new ScalarMap_i(pResult);
-       if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL){
-         //Base_i::myPOA->activate_object(aPresent);
-         //aPresent->_remove_ref();
-         return aPresent->_this();
-       }
-      }
-      return ScalarMap::_nil();
-    }
+                                            const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::ScalarMap_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->ScalarMapOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
   DeformedShape_ptr VISU_Gen_i::DeformedShapeOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                                    const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::DeformedShapeOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return DeformedShape::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(DeformedShape_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-       DeformedShape_i* aPresent = new DeformedShape_i(pResult);
-       if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) 
-         return DeformedShape::_duplicate(aPresent->_this());
-      }
-      return DeformedShape::_nil();
-    }
+                                                    const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::DeformedShape_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->DeformedShapeOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
   Vectors_ptr VISU_Gen_i::VectorsOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                                    const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::VectorsOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return Vectors::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(Vectors_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-       Vectors_i* aPresent = new Vectors_i(pResult);
-       if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) 
-         return Vectors::_duplicate(aPresent->_this());
-      }
-      return Vectors::_nil();
-    }
+                                                    const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::Vectors_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->VectorsOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
   IsoSurfaces_ptr VISU_Gen_i::IsoSurfacesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                                    const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::IsoSurfacesOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return IsoSurfaces::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(IsoSurfaces_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-       IsoSurfaces_i* aPresent = new IsoSurfaces_i(pResult);
-       if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) 
-         return IsoSurfaces::_duplicate(aPresent->_this());
-      }
-      return IsoSurfaces::_nil();
-    }
+                                                    const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::IsoSurfaces_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->IsoSurfacesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
   StreamLines_ptr VISU_Gen_i::StreamLinesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                                    const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::StreamLinesOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return StreamLines::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(StreamLines_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-       StreamLines_i* aPresent = new StreamLines_i(pResult);
-       if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) 
-         return StreamLines::_duplicate(aPresent->_this());
-      }
-      return StreamLines::_nil();
-    }
+                                                    const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::StreamLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->StreamLinesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
   CutPlanes_ptr VISU_Gen_i::CutPlanesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                                    const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::CutPlanesOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return CutPlanes::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(CutPlanes_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-       CutPlanes_i* aPresent = new CutPlanes_i(pResult);
-       if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) 
-         return CutPlanes::_duplicate(aPresent->_this());
-      }
-      return CutPlanes::_nil();
-    }
+                                                    const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::CutPlanes_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->CutPlanesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
   CutLines_ptr VISU_Gen_i::CutLinesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                           const char* theFieldName, CORBA::Double theIteration){
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::CutLinesOnField : "<<myMutex);
-    if(myMutex){
-      if(myStudyDocument->GetProperties()->IsLocked()) return CutLines::_nil();
-      Mutex mt(myMutex,qApp);
-      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
-      if(CutLines_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){
-        CutLines_i* aPresent = new CutLines_i(pResult);
-        if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) 
-          return CutLines::_duplicate(aPresent->_this());
-      }
-      return CutLines::_nil();
-    }
+                                           const char* theFieldName, CORBA::Double theIteration)
+  {
+    if(myMutex) return Prs3dOnField<VISU::CutLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration);
     return myVisuGen->CutLinesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
   }
 
@@ -953,7 +679,7 @@ namespace VISU{
          }
        }
       } catch (...) {
-       MESSAGE("Unknown exception was accured!");
+       INFOS("Unknown exception was accured!");
       }
       return false;
     }
@@ -1023,6 +749,9 @@ namespace VISU{
 
       // Assign an ID = 1 the the type VISU::Result
       theObjectID = 1;
+
+
+      SALOMEDS::SComponent_var aSComponent = theObject->GetStudy()->FindComponent("VISU");
       return aStreamFile._retn();
     }
     return myVisuGen->CopyFrom(theObject, theObjectID);
@@ -1044,7 +773,7 @@ namespace VISU{
       Mutex mt(myMutex,qApp);
       SALOMEDS::SObject_var aResultSO;
       if (theObjectID != 1) return aResultSO._retn();
-      
+
       CORBA::String_var aTmpDir = (const char*)SALOMEDS_Tool::GetTmpDir();
       SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir, false);
 
@@ -1057,25 +786,31 @@ namespace VISU{
       stmIn.read(aString, aLength);
       aString[aLength] = 0;
       myIsMultiFile = true;
-      
+
       string aFileName(aTmpDir.in());
       if(aSeq->length() > 1) aFileName += aSeq[1].in();
-      Storable* aStorable = Storable::Create(theObject,aFileName,aString);
-
-      SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames;
-      aSeqToRm->length(1);
-      aSeqToRm[0] = "copy_persistent";
-      SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeqToRm.in(), true);
 
       SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent();
       SALOMEDS::Study_var aStudy = theObject->GetStudy();
       SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
       CORBA::String_var aComponentID(aComponent->GetID()), aSObjID(theObject->GetID());
+
       if (strcmp(aComponentID, aSObjID) == 0) //create the new result SObject
        aResultSO = aStudyBuilder->NewObject(aComponent);
       else 
        aResultSO = SALOMEDS::SObject::_duplicate(theObject);
-      SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR");
+
+      //Just for Result::Restore to find the Comment attribute :(
+      SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeComment");
+
+      Storable* aStorable = Storable::Create(aResultSO,aFileName,aString);
+
+      SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames;
+      aSeqToRm->length(1);
+      aSeqToRm[0] = "copy_persistent";
+      SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeqToRm.in(), true);
+
+      anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR");
       SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
       CORBA::String_var anIORValue(aStorable->GetID());
       anIOR->SetValue(anIORValue);
index 9604f49890e35e30e15df1dd8aea9021e407cff5..08c4010cf44e46cdf4796bf64a6002a2d76ce734 100644 (file)
@@ -16,6 +16,7 @@
 #include "SALOME_NamingService.hxx"
 
 namespace VISU{
+  class Result_i;
   class VISU_Gen_i : public virtual POA_VISU::VISU_Gen,
                     public virtual ::Engines_Component_i,
                     public virtual Base_i
@@ -33,10 +34,13 @@ namespace VISU{
               const char *instanceName, 
               const char *interfaceName);
     virtual ~VISU_Gen_i();
+
+    virtual char* GetID();
     virtual VISU::VISUType GetType() { return VISU::TVISUGEN;};
 
     virtual void SetCurrentStudy(SALOMEDS::Study_ptr theStudy);
     virtual SALOMEDS::Study_ptr GetCurrentStudy();
+
     virtual ViewManager_ptr GetViewManager();
 
     virtual SALOMEDS::SObject_ptr ImportTables(const char* theFileName);
@@ -53,6 +57,23 @@ namespace VISU{
     virtual Mesh_ptr GroupMesh(Result_ptr theResult, const char* theMeshName, const char* theGroupName);
 
     //Create 3D collored Presentation Of Different Types
+    template<typename TPrs3d_i> typename TPrs3d_i::TInterface::_ptr_type 
+    Prs3dOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
+              const char* theFieldName, CORBA::Double theIteration)
+    {
+      typedef typename TPrs3d_i::TInterface TPrs3d;
+      if(myStudyDocument->GetProperties()->IsLocked()) return TPrs3d::_nil();
+      Mutex mt(myMutex,qApp);
+      Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult));
+      if(TPrs3d_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,int(theIteration))){
+       TPrs3d_i* aPresent = new TPrs3d_i(pResult);
+       if(aPresent->Create(theMeshName,theEntity,theFieldName,int(theIteration)) != NULL){
+         return aPresent->_this();
+       }
+      }
+      return TPrs3d::_nil();
+    }
+
     virtual ScalarMap_ptr ScalarMapOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
                                           const char* theFieldName, CORBA::Double theIteration);
     virtual DeformedShape_ptr DeformedShapeOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, 
index a021b42c29597a3aafbb69ade2c33011222bbd54..5ba1f599d7801860425b6678dcab95244a3cc965 100644 (file)
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //  File   : VISU_PrsObject_i.cxx
 //  Author : Alexey PETROV
 //  Module : VISU
 
-using namespace std;
 #include "VISU_PrsObject_i.hh"
-#include "VISU_Extractor.hxx"
-#include "VISU_FieldTransform.hxx"
-#include "VISU_LookupTable.hxx"
-#include "VISU_ScalarBarActor.hxx"
-#include "VISU_Actor.h"
 using namespace VISU;
+using namespace std;
 
-#include "QAD_Config.h"
-
-#include <vtkUnstructuredGridReader.h>
-#include <vtkUnstructuredGridWriter.h>
-#include <vtkPolyDataWriter.h>
-
-#include <vtkDataSet.h>
-#include <vtkDataSetMapper.h>
-#include <vtkProperty.h>
-
-#include <vtkPolyData.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkGeometryFilter.h>
-
-#include <vtkWarpVector.h>
-#include <vtkContourFilter.h>
-#include <vtkAppendPolyData.h>
-#include <vtkCutter.h>
-#include <vtkPlane.h>
-#include <vtkCellDataToPointData.h>
-
-#include <vtkGlyph3D.h>
-#include <vtkHedgeHog.h>
-#include <vtkPolyDataSource.h>
-#include <vtkGlyphSource2D.h>
-#include <vtkTransformPolyDataFilter.h>
-#include <vtkCellCenters.h>
-#include <vtkConeSource.h>
-#include <vtkStreamLine.h>
-#include <vtkMaskPoints.h>
-
-#ifdef DEBUG
+#ifdef _DEBUG_
 static int MYDEBUG = 0;
 static int MYDEBUGWITHFILES = 0;
 #else
 static int MYDEBUG = 0;
 static int MYDEBUGWITHFILES = 0;
 #endif
-static float EPS = 1.0E-3;
-const float PI2 = 2.0*PI;
-
-void WriteToFile(vtkPolyData* theDataSet, const string& theFileName){
-  vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
-  aWriter->SetFileName(theFileName.c_str());
-  aWriter->SetInput(theDataSet);
-  aWriter->Write();
-  aWriter->Delete();
-}
-
-//==============================================================================
-void SetIOR(SALOMEDS::SObject_var& theSObject, const char* theIOR){
-  SALOMEDS::GenericAttribute_var anAttr;
-  theSObject->FindAttribute(anAttr, "AttributeIOR");
-  SALOMEDS::AttributeIOR_var anIOR  = SALOMEDS::AttributeIOR::_narrow(anAttr);
-  CORBA::String_var aValue(theIOR);
-  anIOR->SetValue(aValue);
-}
-
-float CalcScaleFactor(float theBound[6], int theNbElem){
-  float aVolume = 1, vol, idim = 0;
-  for(int i = 0; i < 6; i += 2){
-    vol = fabs(theBound[i+1] - theBound[i]);
-    if(vol > 0) {
-      idim++; 
-      aVolume *= vol;
-    }
-  }
-  aVolume /= theNbElem;
-  float aFactor = pow(aVolume,(float)1./idim);
-  return aFactor;
-}
-
-VISU::Result_i* GetResult(SALOMEDS::SObject_ptr theSObject){
-  VISU::Result_var aResult = FindResult(theSObject);
-  if(!aResult->_is_nil())
-    return dynamic_cast<VISU::Result_i*>(VISU::GetServant(aResult.in()));
-  return NULL;
-}
-
 
-//----------------------------------------------------------------
-//                      PrsObject
-//----------------------------------------------------------------
 void VISU::PrsObject_i::SetName( const char* theName )
 {
   myName = theName;
@@ -115,2111 +53,3 @@ QString VISU::PrsObject_i::GetEntry() {
   CORBA::String_var anEntry = aSObject->GetID();
   return anEntry.in();
 }
-
-
-//----------------------------------------------------------------
-//                      Prs3d Object
-//----------------------------------------------------------------
-VISU::Prs3d_i::Prs3d_i(Result_i* theResult) : 
-       PrsObject_i(theResult->GetStudyDocument()), 
-       myResult(theResult) 
-{
-  myMapper = MapperType::New();
-  myGeomFilter = vtkGeometryFilter::New();
-  myGeomFilter->PointClippingOff();
-  myGeomFilter->CellClippingOff();
-  myGeomFilter->ExtentClippingOff();
-  myGeomFilter->MergingOff();
-  myColor.R = 0.5;
-  myColor.G = 0.5;
-  myColor.B = 0.5;
-  myAddToStudy = true;
-}
-
-void VISU::Prs3d_i::SameAs(const Prs3d_i* theOrigin)
-{
-  Prs3d_i* aOrigin = const_cast<Prs3d_i*>(theOrigin);
-  SetColor(aOrigin->GetColor());
-  myMapper->ShallowCopy(aOrigin->GetMapper());
-}
-
-void VISU::Prs3d_i::SetColor(const SALOMEDS::Color& theColor){
-  myColor = theColor;
-}
-
-VISU::Prs3d_i::~Prs3d_i() {
-  CORBA::release(myStudy);
-  myMapper->Delete();
-  myGeomFilter->Delete();
-}
-
-void VISU::Prs3d_i::Destroy() {
-  CORBA::Object_var anObj = _this();
-  PortableServer::POA_ptr aPOA = Base_i::GetPOA();
-  PortableServer::ObjectId_var anId = aPOA->reference_to_id(anObj);
-  aPOA->deactivate_object(anId.in());
-  //this->_remove_ref();
-}
-
-
-/**
- * Create Actor referred on existing IO
- */
-bool VISU::Prs3d_i::CreateActor(VISU_Actor* theActor, const Handle(SALOME_InteractiveObject)& theIO){
-  //MESSAGE("Prs3d_i::CreateActor");
-  Update();
-  myMapper->Update(); 
-  static float eps = VTK_LARGE_FLOAT * 0.1 ;
-  float aLength = myMapper->GetInput()->GetLength();
-  if(aLength > eps){
-    MESSAGE("Prs3d_i::CreateActor >> Diagonal of the actor is too large : "<<aLength);
-    return false;
-  }
-  theActor->SetShrinkable(myMapper->GetInput()->GetNumberOfCells() > 10);
-  myMapper->SetResolveCoincidentTopologyToShiftZBuffer();
-  myMapper->SetResolveCoincidentTopologyZShift(0.02);
-  theActor->SetMapper(myMapper);
-  if (myAddToStudy) {
-    if (theIO.IsNull()){
-      //Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(GetEntry(),"VISU",GetName()); 
-      //There is a bug in gcc compiler - const Standard_CString is mapping as char * const not as const char *
-      //(where Standard_CString is defined as typedef char* Standard_CString)
-      Handle(SALOME_InteractiveObject) anIO = 
-       new SALOME_InteractiveObject(strdup(GetEntry()),"VISU",(const Standard_CString)GetName());
-      theActor->setIO(anIO); 
-    }else
-      theActor->setIO(theIO); 
-  }
-  theActor->setPrs3d(this);
-  return true;
-}
-
-void VISU::Prs3d_i::UpdateActor(VISU_Actor* theActor) {
-  if(MYDEBUG) MESSAGE("Prs3d_i::UpdateActor");
-  myMapper->Update(); 
-  theActor->Modified();
-}
-
-VISU::Storable* VISU::Prs3d_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  if(MYDEBUG) MESSAGE(GetComment());
-  myName = (const char*)(VISU::Storable::FindValue(theMap,"myName"));
-  myColor.R = VISU::Storable::FindValue(theMap,"myColor.R").toDouble();
-  myColor.G = VISU::Storable::FindValue(theMap,"myColor.G").toDouble();
-  myColor.B = VISU::Storable::FindValue(theMap,"myColor.B").toDouble();
-  return this;
-}
-
-void VISU::Prs3d_i::ToStream(std::ostringstream& theStr){
-  Storable::DataToStream( theStr, "myName",   myName.c_str() );
-  Storable::DataToStream( theStr, "myColor.R",   myColor.R );
-  Storable::DataToStream( theStr, "myColor.G",   myColor.G );
-  Storable::DataToStream( theStr, "myColor.B",   myColor.B );
-}
-
-void VISU::Prs3d_i::Update(){ 
-  myMapper->Modified();
-}
-
-
-//----------------------------------------------------------------
-//                      Mesh Object
-//----------------------------------------------------------------
-int VISU::Mesh_i::myNbPresent = 0;
-
-QString VISU::Mesh_i::GenerateName() { return VISU::GenerateName("Mesh",myNbPresent++);}
-
-const string VISU::Mesh_i::myComment = "MESH";
-
-const char* VISU::Mesh_i::GetComment() const { return myComment.c_str();}
-
-
-VISU::Mesh_i::Mesh_i(Result_i* theResult) : 
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult) 
-{
-  myInput = NULL;
-  SALOMEDS::Color aColor = {0,1,1};
-  SetCellColor(aColor);
-  SetNodeColor(aColor);
-  SALOMEDS::Color aLinkColor = {83/255.,83/255.,83/255.};
-  SetLinkColor(aLinkColor);
-}
-
-void VISU::Mesh_i::SameAs(const Mesh_i* theOrigin)
-{
-  return; // Same as command for mesh is not valid in current architecture
-//   VISU::Prs3d_i::SameAs(theOrigin);
-//   Mesh_i* aMesh = (Mesh_i*) theOrigin;
-//   SetCellColor(aMesh->GetCellColor());
-//   SetNodeColor(aMesh->GetNodeColor());
-//   SetLinkColor(aMesh->GetLinkColor());
-//   SetPresentationType(aMesh->GetPresentationType());
-//   Build(false);
-}
-
-void VISU::Mesh_i::Destroy(){
-  SALOMEDS::SObject_var aSObj = myStudy->FindObjectID(GetEntry());
-  if(!aSObj->_is_nil()){
-    SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
-    aStudyBuilder->RemoveAttribute(aSObj,"AttributeIOR");
-  }
-  Prs3d_i::Destroy();
-}
-
-VISU::Storable* VISU::Mesh_i::Create(const char* theMeshName, int theEntity){
-  myMeshName = theMeshName;
-  myEntity = theEntity;
-  mySubMeshName = "";
-  return Build(false);
-}
-
-VISU::Storable* VISU::Mesh_i::Create(const char* theMeshName, int theEntity, const char* theFamilyName){
-  myMeshName = theMeshName;
-  myEntity = theEntity;
-  mySubMeshName = theFamilyName;
-  return Build(false);
-}
-VISU::Storable* VISU::Mesh_i::Create(const char* theMeshName, const char* theGroupName){
-  myMeshName = theMeshName;
-  myEntity = -1;
-  mySubMeshName = theGroupName;
-  return Build(false);
-}
-
-VISU::Storable* VISU::Mesh_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  Prs3d_i::Restore(theMap,false);
-
-  myMeshName = VISU::Storable::FindValue(theMap,"myMeshName").latin1();
-  myEntity = VISU::Storable::FindValue(theMap,"myEntity").toInt();
-  mySubMeshName = VISU::Storable::FindValue(theMap,"mySubMeshName").latin1();
-
-  myColor.R = VISU::Storable::FindValue(theMap,"myCellColor.R").toDouble();
-  myColor.G = VISU::Storable::FindValue(theMap,"myCellColor.G").toDouble();
-  myColor.B = VISU::Storable::FindValue(theMap,"myCellColor.B").toDouble();
-
-  myNodeColor.R = VISU::Storable::FindValue(theMap,"myNodeColor.R").toDouble();
-  myNodeColor.G = VISU::Storable::FindValue(theMap,"myNodeColor.G").toDouble();
-  myNodeColor.B = VISU::Storable::FindValue(theMap,"myNodeColor.B").toDouble();
-
-  myLinkColor.R = VISU::Storable::FindValue(theMap,"myLinkColor.R").toDouble();
-  myLinkColor.G = VISU::Storable::FindValue(theMap,"myLinkColor.G").toDouble();
-  myLinkColor.B = VISU::Storable::FindValue(theMap,"myLinkColor.B").toDouble();
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::Mesh_i::ToStream(std::ostringstream& theStr){
-  Prs3d_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myMeshName", myMeshName.c_str() );
-  Storable::DataToStream( theStr, "myEntity", myEntity );
-  Storable::DataToStream( theStr, "mySubMeshName", mySubMeshName.c_str() );
-
-  Storable::DataToStream( theStr, "myCellColor.R", myColor.R );
-  Storable::DataToStream( theStr, "myCellColor.G", myColor.G );
-  Storable::DataToStream( theStr, "myCellColor.B", myColor.B );
-
-  Storable::DataToStream( theStr, "myNodeColor.R", myNodeColor.R );
-  Storable::DataToStream( theStr, "myNodeColor.G", myNodeColor.G );
-  Storable::DataToStream( theStr, "myNodeColor.B", myNodeColor.B );
-
-  Storable::DataToStream( theStr, "myLinkColor.R", myLinkColor.R );
-  Storable::DataToStream( theStr, "myLinkColor.G", myLinkColor.G );
-  Storable::DataToStream( theStr, "myLinkColor.B", myLinkColor.B );
-}
-
-VISU::Storable* VISU::MeshRestore(SALOMEDS::SObject_ptr theSObject, 
-                                 const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::Mesh_i* pResent = new VISU::Mesh_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::Mesh_i::~Mesh_i(){
-  if(MYDEBUG) MESSAGE("Mesh_i::~Mesh_i()");
-}
-
-
-VISU::Storable* VISU::Mesh_i::Build(int theRestoring){
-  try{
-    if(myResult->GetInput() == NULL) 
-      throw std::runtime_error("Mesh_i::Build - myResult->GetInput() == NULL !!!");
-    if(!theRestoring) myName = (const char*)(GenerateName());
-    if(myEntity >= 0) 
-      if(mySubMeshName == "") 
-       myType = VISU::TENTITY; 
-      else 
-       myType = VISU::TFAMILY;
-    else 
-      myType = VISU::TGROUP;
-    if(MYDEBUG) MESSAGE("Mesh_i::Build - myType = "<<myType);
-    //Building Input and comment for searching according label
-    QString aComment;
-    switch(myType){
-    case VISU::TENTITY : 
-      myInput = myResult->GetInput()->GetMeshOnEntity(myMeshName,(VISU::TEntity)myEntity); 
-      aComment.sprintf("myComment=ENTITY;myType=%d;myMeshName=%s;myId=%d",
-                      VISU::TENTITY,myMeshName.c_str(),myEntity);
-      break;
-    case VISU::TFAMILY : 
-      myInput = myResult->GetInput()->GetMeshOnEntity(myMeshName,(VISU::TEntity)myEntity,mySubMeshName);
-      aComment.sprintf("myComment=FAMILY;myType=%d;myMeshName=%s;myEntityId=%d;myName=%s",
-                      VISU::TFAMILY,myMeshName.c_str(),myEntity,mySubMeshName.c_str());
-      break;
-    case VISU::TGROUP : 
-      myInput = myResult->GetInput()->GetMeshOnGroup(myMeshName,mySubMeshName);
-      aComment.sprintf("myComment=GROUP;myType=%d;myMeshName=%s;myName=%s",
-                      VISU::TGROUP,myMeshName.c_str(),mySubMeshName.c_str());
-      break;
-    }
-    if(myInput == NULL) throw std::runtime_error("Mesh_i::Build - myInput == NULL !!!");
-    //Binding pipeline
-    vtkUnstructuredGrid *aDataSet = myInput->GetOutput();
-    //Avoid selection points that don't belong any of cells
-    myGeomFilter->SetInput(aDataSet);
-    myMapper->SetInput(myGeomFilter->GetOutput());
-    myMapper->ScalarVisibilityOff();
-    //Setting IOR on the label
-    if(!theRestoring) {
-      string aResultEntry = myResult->GetEntry();
-      string anEntry = FindEntryWithComment(myStudy,aResultEntry.c_str(),aComment.latin1());
-      if(anEntry == "") throw std::runtime_error("Mesh_i::Build - anEntry was not found !!!");
-      SALOMEDS::SObject_var aSObj = myStudy->FindObjectID(anEntry.c_str());
-      SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
-      SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aSObj,"AttributeIOR");
-      SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-      CORBA::String_var aString = GetID();
-      anIOR->SetValue(aString); 
-    }
-    aDataSet->GetBounds(myBounds);
-    if(MYDEBUGWITHFILES){
-      string aFileName = string("/users/")+getenv("USER")+"/"+getenv("USER");
-      aFileName += "-Mesh.vtk";
-      ::WriteToFile(myGeomFilter->GetOutput(),aFileName.c_str());
-    }
-    return this;
-  }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
-  }catch(...){
-    MESSAGE("Unknown exception was accured!");
-  }
-  return NULL;
-}
-
-
-VISU_Actor* VISU::Mesh_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO) {
-  VISUMesh_Actor* anActor = VISUMesh_Actor::New();
-  if(MYDEBUG) MESSAGE("Prs3d_i::CreateActor");
-  if(VISU::Prs3d_i::CreateActor(anActor,theIO)){  
-    UpdateActor(anActor);
-    return anActor;
-  }else{
-    anActor->Delete();
-    return NULL;
-  }
-}
-void VISU::Mesh_i::UpdateActor(VISU_Actor* theActor) {
-  if(VISUMesh_Actor* anActor = dynamic_cast<VISUMesh_Actor*>(theActor)){
-    if(MYDEBUG) MESSAGE("Mesh_i::UpdateActor");
-    VISU::Prs3d_i::UpdateActor(theActor);
-    vtkProperty* aSurfaceProperty = anActor->GetProperty();
-    aSurfaceProperty->SetColor(myColor.R, myColor.G, myColor.B);
-    vtkProperty* anEdgeProperty = anActor->GetEdgeProperty();
-    anEdgeProperty->SetColor(myLinkColor.R, myLinkColor.G, myLinkColor.B);
-  }
-}
-
-
-
-//==============================================================================
-int VISU::ScalarMap_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                 const char* theFieldName, double theIteration){
-  try{
-    const VISU::TField& aField = theResult->GetInput()->GetField(theMeshName,(VISU::TEntity)theEntity,theFieldName);
-    const VISU::TField::TValField& aValField = aField.myValField;
-    bool aRes = aValField.find((int)theIteration) != aValField.end();
-    if(MYDEBUG) MESSAGE("ScalarMap_i::IsPossible = "<<aRes)
-    return aRes;
-  }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
-  }catch(...){
-    MESSAGE("Unknown exception was accured!");
-  }
-  return 0;
-}
-
-int VISU::ScalarMap_i::myNbPresent = 0;
-QString VISU::ScalarMap_i::GenerateName() { return VISU::GenerateName("ScalarMap",myNbPresent++);}
-
-const string VISU::ScalarMap_i::myComment = "SCALARMAP";
-const char* VISU::ScalarMap_i::GetComment() const { return myComment.c_str();}
-
-VISU::ScalarMap_i::ScalarMap_i(Result_i* theResult, bool theAddToStudy) : 
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult) 
-{
-  myAddToStudy = theAddToStudy;
-  myInput = VISU_Extractor::New();
-  myFieldTransform = VISU_FieldTransform::New();
-  myMapperTable = VISU_LookupTable::New();
-  myBarTable = VISU_LookupTable::New();
-  myIsColored = true;
-  myMapScale = 1.0;
-}
-
-void VISU::ScalarMap_i::Destroy(){
-  if(myAddToStudy){
-    SALOMEDS::SObject_var aSObj = myStudy->FindObjectID(GetEntry());
-    if(!aSObj->_is_nil()){
-      SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
-      aStudyBuilder->RemoveObject(aSObj);
-    }
-  }
-  Prs3d_i::Destroy();
-}
-
-void VISU::ScalarMap_i::SameAs(const ScalarMap_i* theOrigin)
-{
-  ScalarMap_i* aScalarMap = const_cast<ScalarMap_i*>(theOrigin);
-  VISU::Prs3d_i::SameAs(aScalarMap);
-  myField = aScalarMap->GetField();
-  myMeshName = myField->myMeshName;
-  myEntity = myField->myEntity;
-  myIteration = aScalarMap->GetIteration();
-  myFieldName = aScalarMap->GetFieldName();
-
-  SetScalarMode(aScalarMap->GetScalarMode());
-  SetRange(aScalarMap->GetMin(), aScalarMap->GetMax());
-  SetScaling(aScalarMap->GetScaling());
-  SetOrientation(aScalarMap->GetOrientation());
-  SetPosition(aScalarMap->GetPosX(), aScalarMap->GetPosY());
-  SetSize(aScalarMap->GetWidth(), aScalarMap->GetHeight());
-  SetNbColors(aScalarMap->GetNbColors());
-  SetLabels(aScalarMap->GetLabels());
-  SetTitle(aScalarMap->GetTitle());
-  Build(-1);
-  Update();
-}
-
-
-/**
- * Creates Scalar Map and initialises it from resources
- */
-VISU::Storable* VISU::ScalarMap_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                         const char* theFieldName, CORBA::Double theIteration){
-  myIsFixedRange = false;
-  // Orientation
-  QString aOrient = QAD_CONFIG->getSetting("Visu:SBOrientation");
-  if ( !aOrient.isEmpty() ) 
-    myOrientation = (VISU::ScalarMap::Orientation) aOrient.toInt();
-  else
-    myOrientation = VISU::ScalarMap::VERTICAL;
-
-  // Scalar Bar origin
-  QString aXorigin = QAD_CONFIG->getSetting("Visu:SBXorigin");
-  if ( !aXorigin.isEmpty() )
-    myPosition[0] = aXorigin.toFloat();
-  else {
-    if(myOrientation == VISU::ScalarMap::VERTICAL) {
-      myPosition[0] = 0.03;
-    } else {
-      myPosition[0] = 0.2;
-    }
-  }
-  
-  QString aYorigin = QAD_CONFIG->getSetting("Visu:SBYorigin");
-  if ( !aYorigin.isEmpty() )
-    myPosition[1] = aYorigin.toFloat();
-  else {
-    if(myOrientation == VISU::ScalarMap::VERTICAL) {
-      myPosition[1] = 0.1;
-    } else {
-      myPosition[1] = 0.012;
-    }
-  }
-
-  // Scalar Bar size
-  QString aWidth = QAD_CONFIG->getSetting("Visu:SBWidth");
-  if ( !aWidth.isEmpty() )
-    myWidth = aWidth.toFloat();
-  else {
-    myWidth =(myOrientation == VISU::ScalarMap::VERTICAL)? 0.17:0.6;
-  }
-  QString aHeight = QAD_CONFIG->getSetting("Visu:SBHeight");
-  if ( !aHeight.isEmpty() )
-    myHeight = aHeight.toFloat();
-  else {
-    myHeight =(myOrientation == VISU::ScalarMap::VERTICAL)? 0.8:0.12;
-  }
-
-  // Nb of Colors
-  QString aColors = QAD_CONFIG->getSetting("Visu:SBNumberOfColors");
-  myNumberOfColors = (aColors.isEmpty())? 64 : aColors.toInt();
-  if (myNumberOfColors > 64) 
-    myNumberOfColors = 64;
-
-  // Nb of Labels
-  QString aLabels = QAD_CONFIG->getSetting("Visu:SBNumberOfLabels");
-  myNumberOfLabels = (aLabels.isEmpty())? 5 : aLabels.toInt();
-  if (myNumberOfLabels > 65) 
-    myNumberOfLabels = 65;
-  
-  // Scalar Range
-  QString aFixRange = QAD_CONFIG->getSetting("Visu:SBImposeRange");
-  myIsFixedRange = (aFixRange.compare("true") == 0);
-  
-  QString aRangeMin = QAD_CONFIG->getSetting("Visu:SBMinimumValue");
-  myScalarRange[0] = (aRangeMin.isEmpty())? 0 : aRangeMin.toFloat();
-  
-  QString aRangeMax = QAD_CONFIG->getSetting("Visu:SBMaximumValue");
-  myScalarRange[1] = (aRangeMax.isEmpty())? 0 : aRangeMax.toFloat();
-
-  QString aScaling = QAD_CONFIG->getSetting("Visu:SBScaling");
-  if(aScaling.compare("LOGARITHMIC") == 0) 
-    myScaling = VISU::LOGARITHMIC;
-  else 
-    myScaling = VISU::LINEAR;
-
-//    myName = GenerateName();
-  myMeshName = theMeshName;
-  myEntity = theEntity;
-  myFieldName =theFieldName;
-  myScalarMode = 0;
-  myIteration = theIteration;
-  return Build(false);
-}
-
-
-
-VISU::Storable* VISU::ScalarMap_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  Prs3d_i::Restore(theMap,false);
-
-  myAddToStudy = false; //SRN Added 21/06/2003 SAL2983: to avoid addition of the new ScalarMap to study.
-
-  myMeshName = (const char*)(VISU::Storable::FindValue(theMap,"myMeshName"));
-  myEntity = VISU::Storable::FindValue(theMap,"myEntity").toInt();
-  myFieldName = (const char*)(VISU::Storable::FindValue(theMap,"myFieldName"));
-  myIteration = VISU::Storable::FindValue(theMap,"myIteration").toInt();
-
-  myScalarMode = VISU::Storable::FindValue(theMap,"myScalarMode").toInt();
-  myScalarRange[0] = VISU::Storable::FindValue(theMap,"myScalarRange[0]").toDouble();
-  myScalarRange[1] = VISU::Storable::FindValue(theMap,"myScalarRange[1]").toDouble();
-  myIsFixedRange = VISU::Storable::FindValue(theMap,"myIsFixedRange").toInt();
-  myScaling = (VISU::Scaling)VISU::Storable::FindValue(theMap,"myScaling").toInt();
-
-  myTitle = (const char*)(VISU::Storable::FindValue(theMap,"myTitle"));
-  myOrientation = (VISU::ScalarMap::Orientation)VISU::Storable::FindValue(theMap,"myOrientation").toInt();
-  myNumberOfColors = VISU::Storable::FindValue(theMap,"myNumberOfColors").toInt();
-  myNumberOfLabels = VISU::Storable::FindValue(theMap,"myNumberOfLabels").toInt();
-  myPosition[0] = VISU::Storable::FindValue(theMap,"myPosition[0]").toDouble();
-  myPosition[1] = VISU::Storable::FindValue(theMap,"myPosition[1]").toDouble();
-  myWidth = VISU::Storable::FindValue(theMap,"myWidth").toDouble();
-  myHeight = VISU::Storable::FindValue(theMap,"myHeight").toDouble();
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::ScalarMap_i::ToStream(std::ostringstream& theStr){
-  Prs3d_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myMeshName",       myMeshName.c_str() );
-  Storable::DataToStream( theStr, "myEntity",         myEntity );
-  Storable::DataToStream( theStr, "myFieldName",      myFieldName.c_str() );
-  Storable::DataToStream( theStr, "myIteration",      myIteration );
-
-  Storable::DataToStream( theStr, "myScalarMode",     myScalarMode );
-  Storable::DataToStream( theStr, "myScalarRange[0]", myScalarRange[0] );
-  Storable::DataToStream( theStr, "myScalarRange[1]", myScalarRange[1] );
-  Storable::DataToStream( theStr, "myIsFixedRange",   myIsFixedRange );
-  Storable::DataToStream( theStr, "myScaling",        myScaling );
-
-  Storable::DataToStream( theStr, "myTitle",          myTitle.c_str() );
-  Storable::DataToStream( theStr, "myOrientation",    myOrientation );
-  Storable::DataToStream( theStr, "myNumberOfColors", myNumberOfColors );
-  Storable::DataToStream( theStr, "myNumberOfLabels", myNumberOfLabels );
-  Storable::DataToStream( theStr, "myPosition[0]",    myPosition[0] );
-  Storable::DataToStream( theStr, "myPosition[1]",    myPosition[1] );
-  Storable::DataToStream( theStr, "myWidth",          myWidth );
-  Storable::DataToStream( theStr, "myHeight",         myHeight );
-}
-
-void VISU::ScalarMap_i::SetScaling(VISU::Scaling theScaling){
-  VISU_FieldTransform::TTransformFun aFun;
-  if(MYDEBUG)  MESSAGE("ScalarMap_i::SetScaling - theScaling = "<<theScaling);
-  switch(theScaling){
-  case VISU::LOGARITHMIC : 
-    aFun = &Logarithmic10;  
-    break;
-  default:  
-    aFun = &Identical;
-  }
-  myScaling = theScaling;
-  vtkUnstructuredGrid *aDataSet = myInput->GetUnstructuredGridOutput();
-  myFieldTransform->SetInput(aDataSet);
-  myFieldTransform->SetTransformFunction(aFun);
-  myFieldTransform->SetScalarRange(myScalarRange);
-  if(MYDEBUGWITHFILES){
-    string aFileName = string("/users/")+getenv("USER")+"/"+getenv("USER");
-    aFileName += "-PrsScaling.vtk";
-    WriteToFile(myFieldTransform->GetUnstructuredGridOutput(),aFileName.c_str());
-  }
-}
-
-VISU::Scaling VISU::ScalarMap_i::GetScaling(){
-  return myScaling;
-}
-
-
-void VISU::ScalarMap_i::SetRange(CORBA::Double theMin, CORBA::Double theMax) { 
-  if(theMin > theMax) return;
-  myScalarRange[0] = theMin; 
-  myScalarRange[1] = theMax; 
-  myFieldTransform->SetScalarRange(myScalarRange);
-  myIsFixedRange = true;
-  if(MYDEBUG) MESSAGE("ScalarMap_i::SetRange = "<<myScalarRange[0]<<"; "<<myScalarRange[1]);
-}
-   
-void VISU::ScalarMap_i::CalculateRange() {
-  GetFieldRange(myScalarRange);
-}
-
-void VISU::ScalarMap_i::GetFieldRange(float theRange[2]) {
-  myInput->Update();
-  myInput->GetUnstructuredGridOutput()->GetScalarRange(theRange);
-}
-
-void VISU::ScalarMap_i::SetScalarMode(CORBA::Long theScalarMode){
-  myScalarMode = theScalarMode;
-  vtkUnstructuredGridReader* aReader = 
-    myResult->GetInput()->GetFieldOnMesh(myMeshName,(VISU::TEntity)myEntity,myFieldName,(int)myIteration);
-  if(aReader != NULL) {
-    if( MYDEBUG) MESSAGE("ScalarMap_i::SetScalarMode = "<<myIteration);
-    string aFieldName = VISU_Convertor::GenerateName(myFieldName,(int)myIteration);
-    myInput->Extract(aReader,aFieldName,myScalarMode,myField->myNbComp,myField->myEntity);
-    if(MYDEBUGWITHFILES){
-      string aFileName = string("/users/")+getenv("USER")+"/"+getenv("USER");
-      aFileName += "-ScalarMode.vtk";
-      WriteToFile(myInput->GetUnstructuredGridOutput(),aFileName.c_str());
-    }
-  }
-}
-
-VISU::Storable* VISU::ScalarMapRestore(SALOMEDS::SObject_ptr theSObject, 
-                                      const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::ScalarMap_i* pResent = new VISU::ScalarMap_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::ScalarMap_i::~ScalarMap_i(){
-  if(MYDEBUG) MESSAGE("ScalarMap_i::~ScalarMap_i()");
-  myInput->Delete();
-  myFieldTransform->Delete();
-  myMapperTable->Delete();
-  myBarTable->Delete();
-}
-
-
-VISU::Storable* VISU::ScalarMap_i::Build(int theRestoring){
-  if(MYDEBUG) 
-    MESSAGE("ScalarMap_i::Build - "<<myFieldName<<"; theRestoring = "<<theRestoring);
-  try{
-    if(myResult->GetInput() == NULL) 
-      throw std::runtime_error("Mesh_i::Build - myResult->GetInput() == NULL !!!");
-    myField = &(myResult->GetInput()->GetField(myMeshName,(VISU::TEntity)myEntity,myFieldName));
-    if(myField == NULL) throw std::runtime_error("There is no Field with the parameters !!!");
-    SetScalarMode(myScalarMode);
-    if(myInput->GetInput() == NULL) throw std::runtime_error("Can't build build vtk representation !!!");
-    vtkUnstructuredGrid *aDataSet = myInput->GetUnstructuredGridOutput();
-    SetScaling(myScaling);
-    aDataSet->GetBounds(myBounds);
-    CORBA::String_var anIOR = GetID();
-    const VISU::TField::TValField& aValField = myField->myValField;
-    const VISU::TField::TValForTime& aValForTime = aValField.find((int)myIteration)->second;
-    const VISU::TField::TTime& aTime = aValForTime.myTime;
-    QString aComment;
-    myName = "NoName";
-    if(theRestoring == 0){
-      if (!myIsFixedRange) aDataSet->GetScalarRange(myScalarRange);
-      aComment.sprintf("%s %s",myFieldName.c_str(),VISU_Convertor::GenerateName(aValForTime.myTime).c_str());
-      //aComment.sprintf("%s, %g",myFieldName.c_str(),aTime.first);
-      myTitle = (const char*)(aComment.simplifyWhiteSpace());
-    }
-    if (myAddToStudy) {
-      myName = (const char*)(GenerateName());
-      aComment.sprintf("myComment=TIMESTAMP;myType=%d;myMeshName=%s;myEntityId=%d;myFieldName=%s;myTimeStampId=%d;myNumComponent=%d",
-                      VISU::TTIMESTAMP,myMeshName.c_str(),myEntity,myFieldName.c_str(),(int)myIteration,myField->myNbComp);
-      string aResultEntry = myResult->GetEntry();
-      string aRefFatherEntry = myResult->GetRefFatherEntry();
-      string anEntry = FindEntryWithComment(myStudy,aResultEntry.c_str(),aComment.latin1());
-      if(anEntry == "") throw std::runtime_error("There is no Entry for binding the presentation !!!");
-      aComment.sprintf("myComment=%s;myMeshName=%s;myEntityId=%d;myFieldName=%s;myTimeStampId=%d;myNumComponent=%d;myComponentId=%d",
-                      GetComment(),myMeshName.c_str(),myEntity,myFieldName.c_str(),(int)myIteration,myField->myNbComp,myScalarMode);
-      CreateAttributes(myStudy,anEntry.c_str(),aRefFatherEntry.c_str(),
-                      anIOR,myName.c_str(),"",aComment.latin1(),true);
-    }
-    if(MYDEBUG) 
-      MESSAGE("ScalarMap_i::Build - myFieldName = "<<myFieldName<<"; myName = "<<myName<<
-             "; myScalarRange[0] = "<<myScalarRange[0]<<"; myScalarRange[1] = "<<myScalarRange[1]<<
-             "; myNumberOfColors = "<<myNumberOfColors);
-    myGeomFilter->SetInput(DoHook(theRestoring));
-    myMapper->SetInput(myGeomFilter->GetOutput());
-    myMapper->SetColorModeToMapScalars();
-    myMapper->ScalarVisibilityOn();
-    return this;
-  }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
-  }catch(...){
-    MESSAGE("Unknown exception was accured!");
-  }
-  return NULL;
-}
-
-
-VISU::ScalarMap_i::DataType* VISU::ScalarMap_i::DoHook(int theRestoring){
-  myMapper->ScalarVisibilityOn();
-  Update();
-  return myFieldTransform->GetUnstructuredGridOutput();
-}
-
-void VISU::ScalarMap_i::Update() {
-  if (!myIsFixedRange) CalculateRange();
-
-  int aScaling = GetScaling() == VISU::LOGARITHMIC? VTK_SCALE_LOG10: VTK_SCALE_LINEAR;
-  float aScalarRange[2] = {myScalarRange[0], myScalarRange[1]};
-  myMapperTable->SetScale(VTK_SCALE_LINEAR);
-  if(aScaling == VTK_SCALE_LOG10)
-    VISU_LookupTable::ComputeLogRange(myScalarRange,aScalarRange);
-  myMapperTable->SetRange(aScalarRange);
-  myMapper->SetScalarRange(aScalarRange);
-  myMapperTable->SetHueRange(0.667,0.0);
-  myMapperTable->SetNumberOfColors(myNumberOfColors);
-  myMapperTable->SetMapScale(myMapScale);
-  myMapperTable->Build();
-  myMapper->SetLookupTable(myMapperTable);   
-  myMapper->MapScalars(1.0f);
-  
-  myBarTable->SetHueRange(0.667,0.0);
-  myBarTable->SetNumberOfColors(myNumberOfColors);
-  myBarTable->SetRange(myScalarRange);
-  myBarTable->SetScale(aScaling);
-  myBarTable->Build();
-
-  VISU::Prs3d_i::Update();
-}
-
-void VISU::ScalarMap_i::SetMapScale(double theMapScale){
-  if(MYDEBUG) MESSAGE("ScalarMap_i::SetMapScale() - theMapScale = "<<theMapScale);
-  myMapScale = theMapScale;
-  Update();
-}
-
-VISU_Actor* VISU::ScalarMap_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO) {
-  VISUScalarMap_Actor* anActor = VISUScalarMap_Actor::New();
-  if(VISU::Prs3d_i::CreateActor(anActor,theIO)){  
-    anActor->SetBarVisibility(&myIsColored);
-    anActor->myFieldName = myFieldName;
-    anActor->GetProperty()->EdgeVisibilityOn();
-    UpdateActor(anActor);
-    return anActor;
-  }else{
-    anActor->Delete();
-    return NULL;
-  }
-}
-
-void VISU::ScalarMap_i::UpdateActor(VISU_Actor* theActor) {
-  if(VISUScalarMap_Actor* anActor = dynamic_cast<VISUScalarMap_Actor*>(theActor)){
-    VISU::Prs3d_i::UpdateActor(theActor);
-    theActor->SetVisibility(theActor->GetVisibility());
-    VISU_ScalarBarActor * aScalarBar = anActor->GetScalarBar();
-    aScalarBar->SetLookupTable(myBarTable);
-    aScalarBar->SetTitle(myTitle.c_str());
-    aScalarBar->SetOrientation(myOrientation);
-    aScalarBar->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport();
-    aScalarBar->GetPositionCoordinate()->SetValue(myPosition[0],myPosition[1]);
-    aScalarBar->SetWidth(myWidth);
-    aScalarBar->SetHeight(myHeight);
-    aScalarBar->SetNumberOfLabels(myNumberOfLabels);
-    aScalarBar->Modified();
-  }
-}
-
-//==============================================================================
-int VISU::DeformedShape_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                     const char* theFieldName, double theIteration){
-  try{
-    if(!VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration)) return 0;
-    const VISU::TField& aField = theResult->GetInput()->GetField(theMeshName,(VISU::TEntity)theEntity,theFieldName);
-    return aField.myNbComp > 1;
-  }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
-  }catch(...){
-    MESSAGE("Unknown exception was accured!");
-  }
-  return 0;
-}
-
-int VISU::DeformedShape_i::myNbPresent = 0;
-QString VISU::DeformedShape_i::GenerateName() { return VISU::GenerateName("Def.Shape",myNbPresent++);}
-
-const string VISU::DeformedShape_i::myComment = "DEFORMEDSHAPE";
-const char* VISU::DeformedShape_i::GetComment() const { return myComment.c_str();}
-
-VISU::DeformedShape_i::DeformedShape_i(Result_i* theResult, bool theAddToStudy) : 
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult),       
-       ScalarMap_i(theResult, theAddToStudy)
-{
-  if(MYDEBUG) MESSAGE("DeformedShape_i::DeformedShape_i");
-  myWarpVector = vtkWarpVector::New();
-}
-
-void VISU::DeformedShape_i::Destroy(){
-  ScalarMap_i::Destroy();
-}
-
-void VISU::DeformedShape_i::SameAs(const DeformedShape_i* theOrigin)
-{
-  DeformedShape_i* aDefShape = const_cast<DeformedShape_i*>(theOrigin);
-  setColored(aDefShape->isColored());
-  SetScale(aDefShape->GetScale());
-  VISU::ScalarMap_i::SameAs(theOrigin);
-}
-
-
-VISU::Storable* VISU::DeformedShape_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                             const char* theFieldName, double theIteration){
-  myIsColored = false;
-  return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
-}
-
-VISU::Storable* VISU::DeformedShape_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  ScalarMap_i::Restore(theMap,false);
-
-  myFactor = VISU::Storable::FindValue(theMap,"myFactor").toDouble();
-  myIsColored = VISU::Storable::FindValue(theMap,"myIsColored").toInt();
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::DeformedShape_i::ToStream(std::ostringstream& theStr){
-  ScalarMap_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myFactor", myFactor );
-  Storable::DataToStream( theStr, "myIsColored", myIsColored );
-}
-
-VISU::Storable* VISU::DeformedShapeRestore(SALOMEDS::SObject_ptr theSObject, 
-                                          const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::DeformedShape_i* pResent = new VISU::DeformedShape_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::DeformedShape_i::~DeformedShape_i(){
-  if(MYDEBUG) MESSAGE("DeformedShape_i::~DeformedShape_i()");
-  myWarpVector->Delete();
-}
-
-
-VISU::ScalarMap_i::DataType* VISU::DeformedShape_i::DoHook(int theRestoring){
-  if(theRestoring == 0)
-    myFactor = ScaleFactor()/GetMax();
-  if(MYDEBUG) MESSAGE("DeformedShape_i::DoHook() - myFactor = "<<myFactor);
-  Update();
-  return myWarpVector->GetOutput();
-}
-
-
-float VISU::DeformedShape_i::ScaleFactor() { 
-  vtkUnstructuredGrid *aDataSet = myInput->GetUnstructuredGridOutput();
-  aDataSet->Update();
-  int nbCells = aDataSet->GetNumberOfCells(), nbPoints = aDataSet->GetNumberOfPoints();
-  return ::CalcScaleFactor(myBounds, nbCells? nbCells: nbPoints);
-}
-
-void VISU::DeformedShape_i::Update(){
-  if(myField->myNbComp > 1){
-    if(myField->myEntity == VISU::CELL_ENTITY){
-      vtkCellDataToPointData *aFilter = vtkCellDataToPointData::New();
-      aFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-      aFilter->PassCellDataOn();
-      myWarpVector->SetInput(aFilter->GetUnstructuredGridOutput());
-      aFilter->Delete();
-    }else
-      myWarpVector->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-    myWarpVector->SetScaleFactor(myFactor*myMapScale);
-    myMapper->SetScalarVisibility(myIsColored);
-  }
-  ScalarMap_i::Update();
-}
-
-void VISU::DeformedShape_i::SetColor(const SALOMEDS::Color& theColor){
-  VISU::Prs3d_i::SetColor(theColor);
-  myIsColored = false;
-}
-
-void VISU::DeformedShape_i::SetMapScale(double theMapScale){
-  myMapScale = theMapScale;
-  Update();
-}
-
-VISU_Actor* VISU::DeformedShape_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO) {
-  VISU_Actor* anActor = VISU::ScalarMap_i::CreateActor(theIO);
-  anActor->SetRepresentation(1);
-  return anActor;
-}
-
-void VISU::DeformedShape_i::UpdateActor(VISU_Actor* theActor) {
-  VISU::ScalarMap_i::UpdateActor(theActor);
-  if(!myIsColored)
-    theActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B);
-}
-
-//==============================================================================
-int VISU::CutPlanes_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                 const char* theFieldName, double theIteration){
-  return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration);
-}
-
-int VISU::CutPlanes_i::myNbPresent = 0;
-QString VISU::CutPlanes_i::GenerateName() { return VISU::GenerateName("CutPlanes",myNbPresent++);}
-
-const string VISU::CutPlanes_i::myComment = "CUTPLANES";
-const char* VISU::CutPlanes_i::GetComment() const { return myComment.c_str();}
-
-VISU::CutPlanes_i::CutPlanes_i(Result_i* theResult, bool theAddToStudy) :
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult),       
-       ScalarMap_i(theResult, theAddToStudy)
-{
-  if(MYDEBUG) MESSAGE("CutPlanes_i::CutPlanes_i");
-  myAppendPolyData = vtkAppendPolyData::New();
-}
-
-void VISU::CutPlanes_i::Destroy(){
-  ScalarMap_i::Destroy();
-}
-
-void VISU::CutPlanes_i::SameAs(const CutPlanes_i* theOrigin)
-{
-  CutPlanes_i* aCutPlanes = const_cast<CutPlanes_i*>(theOrigin);
-  SetNbPlanes(aCutPlanes->GetNbPlanes());
-  SetDisplacement(aCutPlanes->GetDisplacement());
-  SetOrientationType(aCutPlanes->GetOrientationType());
-  SetRotateX(aCutPlanes->GetRotateX());
-  SetRotateY(aCutPlanes->GetRotateY());
-  VISU::ScalarMap_i::SameAs(theOrigin);
-}
-
-VISU::Storable* VISU::CutPlanes_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                         const char* theFieldName, double theIteration){
-  return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
-}
-
-VISU::Storable* VISU::CutPlanes_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  ScalarMap_i::Restore(theMap,false);
-
-  myNbPlanes = VISU::Storable::FindValue(theMap,"myNbPlanes").toInt();
-  myDisplacement = VISU::Storable::FindValue(theMap,"myDisplacement").toDouble();
-  myBasePlane = (VISU::CutPlanes::Orientation)VISU::Storable::FindValue(theMap,"myBasePlane").toInt();
-  SetOrientationType(myBasePlane);
-  float aRot[2];
-  aRot[0] = VISU::Storable::FindValue(theMap,"aRot[0]").toDouble();
-  SetRotateX(aRot[0]);
-  aRot[1] = VISU::Storable::FindValue(theMap,"aRot[1]").toDouble();
-  SetRotateY(aRot[1]);
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::CutPlanes_i::ToStream(std::ostringstream& theStr){
-  ScalarMap_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myNbPlanes",  myNbPlanes );
-  Storable::DataToStream( theStr, "myDisplacement",  myDisplacement );
-  Storable::DataToStream( theStr, "myBasePlane", myBasePlane );
-  Storable::DataToStream( theStr, "aRot[0]",     GetRotateX() );
-  Storable::DataToStream( theStr, "aRot[1]",     GetRotateY() );
-}
-
-VISU::Storable* VISU::CutPlanesRestore(SALOMEDS::SObject_ptr theSObject, 
-                                      const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::CutPlanes_i* pResent = new VISU::CutPlanes_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::CutPlanes_i::~CutPlanes_i(){
-  if(MYDEBUG) MESSAGE("CutPlanes_i::~CutPlanes_i()");
-  myAppendPolyData->Delete();
-}
-
-
-float* GetIdent(float theR[3][3]){
-  for(int i = 0; i < 3; i++)
-    for(int j = 0; j < 3; j++)
-      theR[i][j] = (i==j? 1.0: 0.0);
-  return theR[0];
-}
-
-
-float* GetRx(float theRx[3][3], float thaAng){
-  theRx[0][0] = 1.0;            theRx[0][1] = 0.0;            theRx[0][2] = 0.0;
-  theRx[1][0] = 0.0;            theRx[1][1] = cos(thaAng);    theRx[1][2] = -sin(thaAng);
-  theRx[2][0] = 0.0;            theRx[2][1] = sin(thaAng);    theRx[2][2] = cos(thaAng);
-  return theRx[0];
-}
-
-
-float* GetRy(float theRy[3][3], float thaAng){
-  theRy[0][0] = cos(thaAng);    theRy[0][1] = 0.0;            theRy[0][2] = sin(thaAng);
-  theRy[1][0] = 0.0;            theRy[1][1] = 1.0;            theRy[1][2] = 0.0;   
-  theRy[2][0] = -sin(thaAng);   theRy[2][1] = 0.0;            theRy[2][2] = cos(thaAng);   
-  return theRy[0];
-}
-
-
-float* GetRz(float theRz[3][3], float thaAng){
-  theRz[0][0] = cos(thaAng);    theRz[0][1] = -sin(thaAng);   theRz[0][2] = 0.0;
-  theRz[1][0] = sin(thaAng);    theRz[1][1] = cos(thaAng);    theRz[1][2] = 0.0;   
-  theRz[2][0] = 0.0;            theRz[2][1] = 0.0;            theRz[2][2] = 1.0;   
-  return theRz[0];
-}
-
-
-void MulMatrix(float C[3][3], const float A[3][3], const float B[3][3]){ // C = A*B;
-  for(int i = 0; i < 3; i++)
-    for(int j = 0; j < 3; j++){
-      C[i][j] = 0.0;
-      for(int k = 0; k < 3; k++)
-       C[i][j] += A[i][k]*B[k][j];
-    }
-}
-
-
-void Sub(float C[3], const float A[3], float B[3]){ // AxB;
-  for(int i = 0; i < 3; i++)  C[i] = B[i] - A[i];
-}
-
-float DotMul(const float A[3], const float B[3]){ // A*B;
-  float C = 0.0;
-  for(int i = 0; i < 3; i++)  C += A[i]*B[i];
-  return C;
-}
-
-void Mul(float C[3], const float A[3], float B[3]){ // AxB;
-  C[0] = A[1]*B[2] - A[2]*B[1];
-  C[1] = A[2]*B[0] - A[0]*B[2];
-  C[2] = A[0]*B[1] - A[1]*B[0];
-}
-
-void Mul(float C[3], const float A[3], float B){ // A*B;
-  for(int i = 0; i < 3; i++)  C[i] = A[i]*B;
-}
-
-void CorrectPnt(float thePnt[3], const float BoundPrj[3]){
-  for(int i = 0, j = 0; i < 3; ++i, j=2*i){
-    if(thePnt[i] < BoundPrj[j]) thePnt[i] = BoundPrj[j];
-    if(thePnt[i] > BoundPrj[j+1]) thePnt[i] = BoundPrj[j+1];
-  }
-}
-
-void GetBoundProject(float BoundPrj[3], const float BoundBox[6], const float Dir[3]){
-  float BoundPoints[8][3] = { {BoundBox[0],BoundBox[2],BoundBox[4]},
-                             {BoundBox[1],BoundBox[2],BoundBox[4]},
-                             {BoundBox[0],BoundBox[3],BoundBox[4]},
-                             {BoundBox[1],BoundBox[3],BoundBox[4]},
-                             {BoundBox[0],BoundBox[2],BoundBox[5]},
-                             {BoundBox[1],BoundBox[2],BoundBox[5]}, 
-                             {BoundBox[0],BoundBox[3],BoundBox[5]}, 
-                             {BoundBox[1],BoundBox[3],BoundBox[5]}};
-  BoundPrj[0] = DotMul(Dir,BoundPoints[0]), BoundPrj[1] = BoundPrj[0];
-  float tmp;
-  for(int i = 1; i < 8; i++){
-    tmp = DotMul(Dir,BoundPoints[i]);
-    if(BoundPrj[1] < tmp) BoundPrj[1] = tmp;
-    if(BoundPrj[0] > tmp) BoundPrj[0] = tmp;
-  }
-  BoundPrj[2] = BoundPrj[1] - BoundPrj[0];
-  BoundPrj[1] = BoundPrj[0] + (1.0 - EPS)*BoundPrj[2];
-  BoundPrj[0] = BoundPrj[0] + EPS*BoundPrj[2];
-  BoundPrj[2] = BoundPrj[1] - BoundPrj[0];
-}
-
-void VISU::CutPlanes_i::SetRotateX(CORBA::Double theAng){
-  if(myBasePlane == VISU::CutPlanes::XY)
-    myAng[0] = theAng;   
-  else if(myBasePlane == VISU::CutPlanes::YZ)
-    myAng[1] = theAng; 
-  else if(myBasePlane == VISU::CutPlanes::ZX)
-    myAng[2] = theAng;
-}
-
-CORBA::Double VISU::CutPlanes_i::GetRotateX(){
-  if(myBasePlane == VISU::CutPlanes::XY)
-    return myAng[0];   
-  else if(myBasePlane == VISU::CutPlanes::YZ)
-    return myAng[1]; 
-  else if(myBasePlane == VISU::CutPlanes::ZX)
-    return myAng[2];
-}
-
-void VISU::CutPlanes_i::SetRotateY(CORBA::Double theAng){
-  if(myBasePlane == VISU::CutPlanes::XY)
-    myAng[1] = theAng;   
-  else if(myBasePlane == VISU::CutPlanes::YZ)
-    myAng[2] = theAng; 
-  else if(myBasePlane == VISU::CutPlanes::ZX)
-    myAng[0] = theAng;
-}
-
-CORBA::Double VISU::CutPlanes_i::GetRotateY(){
-  if(myBasePlane == VISU::CutPlanes::XY)
-    return myAng[1];   
-  else if(myBasePlane == VISU::CutPlanes::YZ)
-    return myAng[2]; 
-  else if(myBasePlane == VISU::CutPlanes::ZX)
-    return myAng[0];
-}
-
-void GetDir(float theDir[3], float theAng[3],
-           const VISU::CutPlanes::Orientation& theBasePlane)
-{
-  int iPlane = 0;
-  float aRx[3][3], aRy[3][3], aRz[3][3], aRotation[3][3];
-  if(theBasePlane == VISU::CutPlanes::XY){ // X-Y
-    if(fabs(theAng[0]) > EPS) ::GetRx(aRx,theAng[0]); else ::GetIdent(aRx);
-    if(fabs(theAng[1]) > EPS) ::GetRy(aRy,theAng[1]); else ::GetIdent(aRy);
-    ::MulMatrix(aRotation,aRx,aRy);
-    iPlane = 2;
-  }else if(theBasePlane == VISU::CutPlanes::YZ){ // Y-Z
-    if(fabs(theAng[1]) > EPS) ::GetRy(aRy,theAng[1]); else ::GetIdent(aRy);
-    if(fabs(theAng[2]) > EPS) ::GetRz(aRz,theAng[2]); else ::GetIdent(aRz);
-    ::MulMatrix(aRotation,aRy,aRz);
-     iPlane = 0;
-  }else if(theBasePlane == VISU::CutPlanes::ZX){ // Z-X
-    if(fabs(theAng[2]) > EPS) ::GetRz(aRz,theAng[2]); else ::GetIdent(aRz);
-    if(fabs(theAng[0]) > EPS) ::GetRx(aRx,theAng[0]); else ::GetIdent(aRx);
-    ::MulMatrix(aRotation,aRz,aRx);
-    iPlane = 1;
-  }
-  for(int i = 0; i < 3; i++)  theDir[i] = aRotation[i][iPlane];
-}
-
-void CutWithPlane(vtkAppendPolyData* theAppendPolyData, vtkDataSet* theDataSet,
-                 float theDir[3], float theOrig[3])
-{
-  vtkCutter *aCutPlane = vtkCutter::New();
-  aCutPlane->SetInput(theDataSet);
-  vtkPlane *aPlane = vtkPlane::New();
-  aPlane->SetOrigin(theOrig);
-
-  aPlane->SetNormal(theDir);
-  aCutPlane->SetCutFunction(aPlane);
-  aPlane->Delete();
-  theAppendPolyData->AddInput(aCutPlane->GetOutput());
-  aCutPlane->Delete();
-}
-
-void CutWithPlanes(vtkAppendPolyData* theAppendPolyData, vtkDataSet* theDataSet,
-                  int theNbPlanes, float theDir[3], float theBounds[6], float theDisplacement)
-{
-  float aInvDir[3], aBoundPrj[3], aOrig[3], aPosition;
-  ::Mul(aInvDir,theDir,-1.0);
-  ::GetBoundProject(aBoundPrj, theBounds, theDir);
-  if(theNbPlanes > 1){
-    float aDBoundPrj = aBoundPrj[2]/(theNbPlanes - 1);
-    float aDisplacement = aDBoundPrj*theDisplacement;
-    float aStartPosition = aBoundPrj[0] - 0.5*aDBoundPrj + aDisplacement;
-    for (int i = 0; i < theNbPlanes; i++){
-      aPosition = aStartPosition + i*aDBoundPrj;
-      float aDelta = (aBoundPrj[0] - aPosition) / aBoundPrj[2];
-      if(aDelta > 0)
-       aPosition = aBoundPrj[0];
-       //if(fabs(aDelta) < EPS) aPosition = aBoundPrj[0]; else continue;
-      aDelta = (aBoundPrj[2] - aPosition) / aBoundPrj[2];
-      if(aDelta < 0) 
-       aPosition = aBoundPrj[2];
-       //if(fabs(aDelta) < EPS) aPosition = aBoundPrj[2]; else continue;
-      Mul(aOrig,theDir,aPosition);
-      if(i != 0) 
-       CutWithPlane(theAppendPolyData,theDataSet,theDir,aOrig);
-      else
-       CutWithPlane(theAppendPolyData,theDataSet,aInvDir,aOrig);
-    }
-  }else{
-    aPosition = aBoundPrj[0] + aBoundPrj[2]*theDisplacement;
-    Mul(aOrig,theDir,aPosition);
-    CutWithPlane(theAppendPolyData,theDataSet,theDir,aOrig);
-  }
-}
-
-VISU::ScalarMap_i::DataType* VISU::CutPlanes_i::DoHook(int theRestoring){
-  if(theRestoring == 0){
-    myNbPlanes = 10;
-    myDisplacement = 0.5;
-    myBasePlane = VISU::CutPlanes::XY;
-    myAng[0] = myAng[1] = myAng[2] = 0.0;
-  }
-  if(MYDEBUG) 
-    MESSAGE("CutPlanes_i::DoHook() - myNbPlanes = "<<myNbPlanes<<"; myBasePlane = "<<myBasePlane<<
-           "; myAng[0] = "<<myAng[0]<<"; myAng[1] = "<<myAng[1]<<"; myAng[2] = "<<myAng[2]);
-  Update();
-  return myAppendPolyData->GetOutput();
-}
-
-void VISU::CutPlanes_i::Update(){
-  int iEnd = myAppendPolyData->GetNumberOfInputs();
-  if(MYDEBUG) MESSAGE("CutPlanes_i::Update - iEnd = "<<iEnd);
-  for(int i = iEnd-1; i >= 0; i--)
-    myAppendPolyData->RemoveInput(myAppendPolyData->GetInput(i));
-  float aDir[3];
-  ::GetDir(aDir,myAng,myBasePlane);
-  vtkDataSet* aDataSet = myFieldTransform->GetUnstructuredGridOutput();
-  ::CutWithPlanes(myAppendPolyData,aDataSet,GetNbPlanes(),aDir,myBounds,myDisplacement);
-  myMapper->ScalarVisibilityOn();
-  VISU::ScalarMap_i::Update();
-}
-
-//==============================================================================
-int VISU::CutLines_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                const char* theFieldName, double theIteration){
-  return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration);
-}
-
-int VISU::CutLines_i::myNbPresent = 0;
-QString VISU::CutLines_i::GenerateName() { return VISU::GenerateName("CutLines",myNbPresent++);}
-
-const string VISU::CutLines_i::myComment = "CUTLINES";
-const char* VISU::CutLines_i::GetComment() const { return myComment.c_str();}
-
-VISU::CutLines_i::CutLines_i(Result_i* theResult, bool theAddToStudy) :
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult),       
-       ScalarMap_i(theResult, theAddToStudy)
-{
-  if(MYDEBUG) MESSAGE("CutLines_i::CutLines_i");
-  myAppendPolyData = vtkAppendPolyData::New();
-}
-
-void VISU::CutLines_i::Destroy(){
-  ScalarMap_i::Destroy();
-}
-
-void VISU::CutLines_i::SameAs(const CutLines_i* theOrigin)
-{
-  CutLines_i* aCutLines = const_cast<CutLines_i*>(theOrigin);
-  SetNbLines(aCutLines->GetNbLines());
-  SetDisplacement(aCutLines->GetDisplacement());
-  SetDisplacement2(aCutLines->GetDisplacement2());
-  SetOrientationType(aCutLines->GetOrientationType());
-  SetOrientationType2(aCutLines->GetOrientationType2());
-  SetRotateX(aCutLines->GetRotateX());
-  SetRotateY(aCutLines->GetRotateY());
-  SetRotateX2(aCutLines->GetRotateX2());
-  SetRotateY2(aCutLines->GetRotateY2());
-  VISU::ScalarMap_i::SameAs(theOrigin);
-}
-
-VISU::Storable* VISU::CutLines_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                      const char* theFieldName, double theIteration){
-  return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
-}
-
-VISU::Storable* VISU::CutLines_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  ScalarMap_i::Restore(theMap,false);
-  myNbLines = VISU::Storable::FindValue(theMap,"myNbLines").toInt();
-  myDisplacement[0] = VISU::Storable::FindValue(theMap,"myDisplacement[0]").toDouble();
-  myDisplacement[1] = VISU::Storable::FindValue(theMap,"myDisplacement[1]").toDouble();
-  myBasePlane[0] = (VISU::CutPlanes::Orientation)VISU::Storable::FindValue(theMap,"myBasePlane[0]").toInt();
-  myBasePlane[1] = (VISU::CutPlanes::Orientation)VISU::Storable::FindValue(theMap,"myBasePlane[1]").toInt();
-  SetOrientationType(myBasePlane[0]);
-  SetOrientationType2(myBasePlane[1]);
-  float aRot[2];
-  aRot[0] = VISU::Storable::FindValue(theMap,"aRot[0][0]").toDouble();
-  SetRotateX(aRot[0]);
-  aRot[1] = VISU::Storable::FindValue(theMap,"aRot[0][1]").toDouble();
-  SetRotateY(aRot[1]);
-  aRot[0] = VISU::Storable::FindValue(theMap,"aRot[1][0]").toDouble();
-  SetRotateX2(aRot[0]);
-  aRot[1] = VISU::Storable::FindValue(theMap,"aRot[1][1]").toDouble();
-  SetRotateY2(aRot[1]);
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::CutLines_i::ToStream(std::ostringstream& theStr){
-  ScalarMap_i::ToStream(theStr);
-  Storable::DataToStream( theStr, "myNbLines",      myNbLines );
-  Storable::DataToStream( theStr, "myDisplacement[0]", myDisplacement[0] );
-  Storable::DataToStream( theStr, "myDisplacement[1]", myDisplacement[1] );
-  Storable::DataToStream( theStr, "myBasePlane[0]", myBasePlane[0] );
-  Storable::DataToStream( theStr, "myBasePlane[1]", myBasePlane[1] );
-  Storable::DataToStream( theStr, "aRot[0][0]",     GetRotateX() );
-  Storable::DataToStream( theStr, "aRot[0][1]",     GetRotateY() );
-  Storable::DataToStream( theStr, "aRot[1][0]",     GetRotateX2() );
-  Storable::DataToStream( theStr, "aRot[1][1]",     GetRotateY2() );
-}
-
-VISU::Storable* VISU::CutLinesRestore(SALOMEDS::SObject_ptr theSObject, 
-                                     const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::CutLines_i* pResent = new VISU::CutLines_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::CutLines_i::~CutLines_i(){
-  if(MYDEBUG) MESSAGE("CutLines_i::~CutLines_i()");
-  myAppendPolyData->Delete();
-}
-
-void VISU::CutLines_i::SetRotateX(CORBA::Double theAng){
-  if(myBasePlane[0] == VISU::CutPlanes::XY)
-    myAng[0][0] = theAng;   
-  else if(myBasePlane[0] == VISU::CutPlanes::YZ)
-    myAng[0][1] = theAng; 
-  else if(myBasePlane[0] == VISU::CutPlanes::ZX)
-    myAng[0][2] = theAng;
-}
-
-CORBA::Double VISU::CutLines_i::GetRotateX(){
-  if(myBasePlane[0] == VISU::CutPlanes::XY)
-    return myAng[0][0];   
-  else if(myBasePlane[0] == VISU::CutPlanes::YZ)
-    return myAng[0][1]; 
-  else if(myBasePlane[0] == VISU::CutPlanes::ZX)
-    return myAng[0][2];
-}
-
-void VISU::CutLines_i::SetRotateY(CORBA::Double theAng){
-  if(myBasePlane[0] == VISU::CutPlanes::XY)
-    myAng[0][1] = theAng;   
-  else if(myBasePlane[0] == VISU::CutPlanes::YZ)
-    myAng[0][2] = theAng; 
-  else if(myBasePlane[0] == VISU::CutPlanes::ZX)
-    myAng[0][0] = theAng;
-}
-
-CORBA::Double VISU::CutLines_i::GetRotateY(){
-  if(myBasePlane[0] == VISU::CutPlanes::XY)
-    return myAng[0][1];   
-  else if(myBasePlane[0] == VISU::CutPlanes::YZ)
-    return myAng[0][2]; 
-  else if(myBasePlane[0] == VISU::CutPlanes::ZX)
-    return myAng[0][0];
-}
-
-void VISU::CutLines_i::SetRotateX2(CORBA::Double theAng){
-  if(myBasePlane[1] == VISU::CutPlanes::XY)
-    myAng[1][0] = theAng;   
-  else if(myBasePlane[1] == VISU::CutPlanes::YZ)
-    myAng[1][1] = theAng; 
-  else if(myBasePlane[1] == VISU::CutPlanes::ZX)
-    myAng[1][2] = theAng;
-}
-
-CORBA::Double VISU::CutLines_i::GetRotateX2(){
-  if(myBasePlane[1] == VISU::CutPlanes::XY)
-    return myAng[1][0];   
-  else if(myBasePlane[1] == VISU::CutPlanes::YZ)
-    return myAng[1][1]; 
-  else if(myBasePlane[1] == VISU::CutPlanes::ZX)
-    return myAng[1][2];
-}
-
-void VISU::CutLines_i::SetRotateY2(CORBA::Double theAng){
-  if(myBasePlane[1] == VISU::CutPlanes::XY)
-    myAng[1][1] = theAng;   
-  else if(myBasePlane[1] == VISU::CutPlanes::YZ)
-    myAng[1][2] = theAng; 
-  else if(myBasePlane[1] == VISU::CutPlanes::ZX)
-    myAng[1][0] = theAng;
-}
-
-CORBA::Double VISU::CutLines_i::GetRotateY2(){
-  if(myBasePlane[1] == VISU::CutPlanes::XY)
-    return myAng[1][1];   
-  else if(myBasePlane[1] == VISU::CutPlanes::YZ)
-    return myAng[1][2]; 
-  else if(myBasePlane[1] == VISU::CutPlanes::ZX)
-    return myAng[1][0];
-}
-
-VISU::ScalarMap_i::DataType* VISU::CutLines_i::DoHook(int theRestoring){
-  if(theRestoring == 0){
-    myNbLines = 10;
-    myDisplacement[0] = myDisplacement[1] = 0.5;
-    myAng[0][0] = myAng[0][1] = myAng[0][2] = 0.0;
-    myAng[1][0] = myAng[1][1] = myAng[1][2] = 0.0;
-    myBasePlane[0] = VISU::CutPlanes::ZX;
-    myBasePlane[1] = VISU::CutPlanes::XY;
-  }
-  Update();
-  return myAppendPolyData->GetOutput();
-}
-
-void ClearAppendPolyData(vtkAppendPolyData *theAppendPolyData){
-  int iEnd = theAppendPolyData->GetNumberOfInputs();
-  for(int i = iEnd-1; i >= 0; i--)
-    theAppendPolyData->RemoveInput(theAppendPolyData->GetInput(i));
-}
-
-void VISU::CutLines_i::Update(){
-  ::ClearAppendPolyData(myAppendPolyData);
-  vtkAppendPolyData *anAppendPolyData = vtkAppendPolyData::New();
-  //Build base plane
-  float aDir[2][3];
-  ::GetDir(aDir[0],myAng[0],myBasePlane[0]);
-  ::CutWithPlanes(anAppendPolyData,myFieldTransform->GetUnstructuredGridOutput(),1,aDir[0],myBounds,myDisplacement[0]);
-  anAppendPolyData->Update();
-  vtkPolyData *aPolyData = anAppendPolyData->GetOutput();
-  if(MYDEBUG) MESSAGE("CutPlanes_i::Update - aPolyData->GetNumberOfCells() = "<<aPolyData->GetNumberOfCells());
-  if(aPolyData->GetNumberOfCells() == 0){
-    ::ClearAppendPolyData(anAppendPolyData);
-    vtkGeometryFilter *aGeomFilter = vtkGeometryFilter::New();
-    aGeomFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-    anAppendPolyData->AddInput(aGeomFilter->GetOutput());
-    aGeomFilter->Delete();
-    anAppendPolyData->Update();
-  }
-  //Build lines
-  float aBounds[6];
-  aPolyData = anAppendPolyData->GetOutput();
-  aPolyData->GetBounds(aBounds);
-  ::GetDir(aDir[1],myAng[1],myBasePlane[1]);
-  ::CutWithPlanes(myAppendPolyData,aPolyData,GetNbLines(),aDir[1],aBounds,myDisplacement[1]);
-  anAppendPolyData->Delete();
-  //Calculate values for building of table
-  ::Mul(myDirLn,aDir[0],aDir[1]); 
-  ::GetBoundProject(myBoundPrjLn, myBounds, myDirLn);
-  Mul(myBasePnt,myDirLn,myBoundPrjLn[0]);
-  CorrectPnt(myBasePnt,myBounds);
-  myMapper->ScalarVisibilityOn();
-  VISU::ScalarMap_i::Update();
-}
-
-void VISU::CutLines_i::BuildTableOfReal(SALOMEDS::SObject_ptr theSObject){
-  if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal");
-  Update();
-  SALOMEDS::GenericAttribute_var anAttr;
-  SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
-  anAttr = aStudyBuilder->FindOrCreateAttribute(theSObject, "AttributeTableOfReal");
-  SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr);
-
-  typedef set<long> TLineCont;
-  typedef map<float,TLineCont> TXMap;
-  typedef map<float,float> TXYMap;
-  typedef vector<TXYMap> TCurveVect;
-
-  const VISU::TField::TValField& aValField = myField->myValField;
-  const VISU::TField::TValForTime& aValForTime = aValField.find((int)myIteration)->second;
-  const VISU::TField::TTime& aTime = aValForTime.myTime;
-  QString aTitle;
-  //aTitle.sprintf("%s %s",myTitle.c_str(),aTime.second.c_str());
-  aTitle.sprintf("%s",myTitle.c_str());
-  aTitle = aTitle.simplifyWhiteSpace();
-  aTableOfReal->SetTitle(aTitle.latin1());
-
-  myAppendPolyData->Update();
-  int iLineEnd = myAppendPolyData->GetNumberOfInputs();
-  if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal iLineEnd = "<<iLineEnd);
-  TCurveVect aCurveVect(iLineEnd); 
-  TLineCont aLineCont;
-  TXMap aXMap;
-  for(int iLine = 0; iLine < iLineEnd; iLine++){
-    vtkDataSet *aDataSet = myAppendPolyData->GetInput(iLine);
-    aDataSet->Update();
-    int aNbPoints = aDataSet->GetNumberOfPoints();
-    if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal iLine = "<<iLine<<"; aNbPoints = "<<aNbPoints);
-    vtkPointData *aPointData = aDataSet->GetPointData();
-    vtkDataArray *aScalars = aPointData->GetScalars();
-    vtkCellDataToPointData *aFilter = NULL;
-    if(!aScalars) {
-      aFilter = vtkCellDataToPointData::New();
-      aFilter->SetInput(aDataSet);
-      aFilter->PassCellDataOn();
-      aDataSet = aFilter->GetOutput();
-      aDataSet->Update();
-    }
-    aPointData = aDataSet->GetPointData();
-    aScalars = aPointData->GetScalars();
-    if(!aScalars) continue;
-    aLineCont.insert(iLine);
-    TXYMap& aXYMap = aCurveVect[iLine];
-    float aPnt[3], aVect[3], aDist;
-    for(int i = 0; i < aNbPoints; i++){
-      aDataSet->GetPoint(i,aPnt);
-      Sub(aVect,myBasePnt,aPnt);
-      aDist = DotMul(aVect,myDirLn) / myBoundPrjLn[2];
-      // the workaround
-      if(aDist < 0.0) aDist = 0.0; 
-      if(aDist > 1.0) aDist = 1.0;
-      aXYMap[aDist] = aScalars->GetTuple1(i);
-      //aXMap[aDist].insert(iLine);
-    }
-    if(aFilter) aFilter->Delete();
-  }
-  iLineEnd = aLineCont.size();
-  if(iLineEnd == 0){
-    MESSAGE("CutPlanes_i::BuildTableOfReal aLineCont.size() == 0 !!!");
-    return;
-  }
-  //Resorting of theXYMap
-  for(int iLine = 0; iLine < iLineEnd; iLine++){
-    TXYMap& aXYMap = aCurveVect[iLine], aNewXYMap;
-    if(aXYMap.size() > 2){
-      TXYMap::const_iterator aXYMapIter[2] = {aXYMap.begin(), ++aXYMap.begin()};
-      aNewXYMap[aXYMapIter[0]->first] = aXYMapIter[0]->second;
-      for(; aXYMapIter[1] != aXYMap.end(); aXYMapIter[0]++, aXYMapIter[1]++){
-       float aY[3] = {aXYMapIter[0]->second, aXYMapIter[1]->second, 0.0};
-       aY[2] = (aY[0] + aY[1])/2.0;
-       float aX[3] = {aXYMapIter[0]->first, aXYMapIter[1]->first, 0.0};
-       aX[2] = (aX[0] + aX[1])/2.0;
-       aNewXYMap[aX[2]] = aY[2];
-       aXMap[aX[2]].insert(iLine);
-      }
-      aNewXYMap[aXYMapIter[0]->first] = aXYMapIter[0]->second;
-      aXYMap = aNewXYMap;
-    }
-  }
-  QString aString;
-  aTableOfReal->SetNbColumns(aXMap.size());
-  TXMap::const_iterator aXMapIter = aXMap.begin();
-  for(long i = 0; aXMapIter != aXMap.end(); aXMapIter++, i++){
-    float aDist = aXMapIter->first; 
-    aTableOfReal->PutValue(aDist,1,i+1);
-    aString.sprintf("%d",i);
-    aTableOfReal->SetColumnTitle(i+1,aString.latin1());
-    const TLineCont& aLineCont = aXMapIter->second;
-    long jEnd = aLineCont.size();
-    if(0&& MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal aDist = "<<aDist<<"; jEnd = "<<jEnd);
-    TLineCont::const_iterator aLineContIter = aLineCont.begin();
-    for(; aLineContIter != aLineCont.end(); aLineContIter++){
-      long iLine = *aLineContIter;
-      const TXYMap& aXYMap = aCurveVect[iLine];
-      TXYMap::const_iterator aXYMapIter = aXYMap.find(aDist);
-      if(aXYMapIter == aXYMap.end()) continue;
-      float aVal = aXYMapIter->second;
-      aTableOfReal->PutValue(aVal,iLine+2,i+1);
-    }
-  }
-  
-  aTableOfReal->SetRowTitle(1,"X");
-  TLineCont::const_iterator aLineContIter = aLineCont.begin();
-  QString aUnitName = myField->myUnitNames[0].c_str();
-  if(myScalarMode != 0) 
-    aUnitName = myField->myUnitNames[myScalarMode-1].c_str();
-  aUnitName = aUnitName.simplifyWhiteSpace();
-  for(long i = 0; aLineContIter != aLineCont.end(); aLineContIter++, i++){
-    long iLine = *aLineContIter;
-    aString.sprintf("Y%d",iLine);
-    aTableOfReal->SetRowTitle(i+2,aString.latin1());
-    aTableOfReal->SetRowUnit(i+2,aUnitName.latin1());
-  }
-}
-
-//==============================================================================
-int VISU::IsoSurfaces_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                   const char* theFieldName, double theIteration){
-  return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration);
-}
-
-int VISU::IsoSurfaces_i::myNbPresent = 0;
-QString VISU::IsoSurfaces_i::GenerateName() { return VISU::GenerateName("IsoSurfaces",myNbPresent++);}
-
-const string VISU::IsoSurfaces_i::myComment = "ISOSURFACES";
-const char* VISU::IsoSurfaces_i::GetComment() const { return myComment.c_str();}
-
-VISU::IsoSurfaces_i::IsoSurfaces_i(Result_i* theResult, bool theAddToStudy) :
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult),       
-       ScalarMap_i(theResult, theAddToStudy)
-{
-  if(MYDEBUG) MESSAGE("IsoSurfaces_i::IsoSurfaces_i");
-  myContourFilter = vtkContourFilter::New();
-}
-
-void VISU::IsoSurfaces_i::Destroy(){
-  ScalarMap_i::Destroy();
-}
-
-void VISU::IsoSurfaces_i::SameAs(const IsoSurfaces_i* theOrigin) {
-  IsoSurfaces_i* aIsoSurfaces = const_cast<IsoSurfaces_i*>(theOrigin);
-  SetNbSurfaces(aIsoSurfaces->GetNbSurfaces());
-  SetRange(aIsoSurfaces->GetRangeMin(), aIsoSurfaces->GetRangeMax());
-  VISU::ScalarMap_i::SameAs(theOrigin);
-}
-
-VISU::Storable* VISU::IsoSurfaces_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                           const char* theFieldName, double theIteration){
-  myNbSurface = 10;
-  myRange[0] = 0;
-  myRange[1] = 0;
-  return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
-}
-
-VISU::Storable* VISU::IsoSurfaces_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  ScalarMap_i::Restore(theMap,false);
-
-  myNbSurface = VISU::Storable::FindValue(theMap,"myNbSurface").toInt();
-  myRange[0] = VISU::Storable::FindValue(theMap,"myRange[0]").toDouble();
-  myRange[1] = VISU::Storable::FindValue(theMap,"myRange[1]").toDouble();
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::IsoSurfaces_i::ToStream(std::ostringstream& theStr){
-  ScalarMap_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myNbSurface", myNbSurface );
-  Storable::DataToStream( theStr, "myRange[0]", myRange[0] );
-  Storable::DataToStream( theStr, "myRange[1]", myRange[1] );
-}
-
-VISU::Storable* VISU::IsoSurfacesRestore(SALOMEDS::SObject_ptr theSObject, 
-                                        const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::IsoSurfaces_i* pResent = new VISU::IsoSurfaces_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::IsoSurfaces_i::~IsoSurfaces_i(){
-  if(MYDEBUG) MESSAGE("IsoSurfaces_i::~IsoSurfaces_i()");
-  myContourFilter->Delete();
-}
-
-void VISU::IsoSurfaces_i::SetRange(float theMin, float theMax){ 
-  if(theMin <= theMax){
-    myRange[0] = theMin;  myRange[1] = theMax; 
-  }
-}
-
-VISU::ScalarMap_i::DataType* VISU::IsoSurfaces_i::DoHook(int theRestoring){
-  if(MYDEBUG)  MESSAGE("IsoSurfaces_i::DoHook() - myNbSurface = "<<myNbSurface);
-  if(theRestoring == 0) {
-    myRange[0] = myScalarRange[0];
-    myRange[1] = myScalarRange[1];
-  }
-  Update();
-  return myContourFilter->GetOutput();
-}
-
-
-void VISU::IsoSurfaces_i::Update(){
-  if(myField->myEntity == VISU::CELL_ENTITY){
-    vtkCellDataToPointData *aFilter = vtkCellDataToPointData::New();
-    aFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-    aFilter->PassCellDataOn();
-    myContourFilter->SetInput(aFilter->GetOutput());
-    aFilter->Delete();
-  } else
-    myContourFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-  int aNbSurface = (int)(myMapScale*myNbSurface);
-  if(aNbSurface < 1) aNbSurface = 1;
-  if(GetScaling() == VISU::LOGARITHMIC){ 
-    float aLogRange[2];
-    VISU_LookupTable::ComputeLogRange(myRange,aLogRange);
-    myContourFilter->GenerateValues(aNbSurface,aLogRange);
-  }else
-    myContourFilter->GenerateValues(aNbSurface,myRange);
-  myMapper->ScalarVisibilityOn();
-  VISU::ScalarMap_i::Update();
-}
-
-void VISU::IsoSurfaces_i::SetMapScale(double theMapScale){
-  myMapScale = theMapScale;
-  Update();
-}
-
-//==============================================================================
-int VISU::StreamLines_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                                   const char* theFieldName, double theIteration){
-  return DeformedShape_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration);
-}
-
-int VISU::StreamLines_i::myNbPresent = 0;
-QString VISU::StreamLines_i::GenerateName() { return VISU::GenerateName("StreamLines",myNbPresent++);}
-
-const string VISU::StreamLines_i::myComment = "STREAMLINES";
-const char* VISU::StreamLines_i::GetComment() const { return myComment.c_str();}
-
-VISU::StreamLines_i::StreamLines_i(Result_i* theResult, bool theAddToStudy) :
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult),       
-       ScalarMap_i(theResult, theAddToStudy),
-       DeformedShape_i(theResult, theAddToStudy)
-{
-  if(MYDEBUG) MESSAGE("StreamLines_i::StreamLines_i");
-  myStream = vtkStreamLine::New();
-}
-
-void VISU::StreamLines_i::Destroy(){
-  DeformedShape_i::Destroy();
-}
-
-VISU::Storable* VISU::StreamLines_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                           const char* theFieldName, double theIteration)
-{
-  return DeformedShape_i::Create(theMeshName,theEntity,theFieldName,theIteration);
-}
-
-void VISU::StreamLines_i::SameAs(const StreamLines_i* theOrigin) {
-  myPrs3di = NULL;
-  StreamLines_i* aIsoLines = const_cast<StreamLines_i*>(theOrigin);
-  SetDirection(aIsoLines->GetDirection());
-  SetStepLength(aIsoLines->GetStepLength());
-  SetIntegrationStep(aIsoLines->GetIntegrationStep());
-  SetPropagationTime(aIsoLines->GetPropagationTime());
-  VISU::DeformedShape_i::SameAs(theOrigin);
-  SetUsedPoints(aIsoLines->GetUsedPoints());
-}
-
-VISU::Storable* VISU::StreamLines_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  DeformedShape_i::Restore(theMap,false);
-
-  myStepLength = VISU::Storable::FindValue(theMap,"myStepLength").toDouble();
-  myIntegrationStep = VISU::Storable::FindValue(theMap,"myIntegrationStep").toDouble();
-  myPropagationTime = VISU::Storable::FindValue(theMap,"myPropagationTime").toDouble();
-  myDirection = (VISU::StreamLines::Direction) VISU::Storable::FindValue(theMap,"myDirection").toInt();
-  mySourceEntry = VISU::Storable::FindValue(theMap,"mySourceEntry").latin1();
-  myPercents = VISU::Storable::FindValue(theMap,"myPercents").toDouble();
-  myPrs3di = NULL;
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::StreamLines_i::ToStream(std::ostringstream& theStr){
-  DeformedShape_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myStepLength", myStepLength );
-  Storable::DataToStream( theStr, "myIntegrationStep", myIntegrationStep );
-  Storable::DataToStream( theStr, "myPropagationTime", myPropagationTime );
-  Storable::DataToStream( theStr, "myDirection", (int)myDirection );
-  Storable::DataToStream( theStr, "mySourceEntry", mySourceEntry.c_str());
-  Storable::DataToStream( theStr, "myPercents", myPercents );
-
-}
-
-VISU::Storable* VISU::StreamLinesRestore(SALOMEDS::SObject_ptr theSObject, 
-                                        const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::StreamLines_i* pResent = new VISU::StreamLines_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::StreamLines_i::~StreamLines_i(){
-  if(MYDEBUG) MESSAGE("StreamLines_i::~StreamLines_i()");
-  myStream->Delete();
-}
-
-void VISU::StreamLines_i::SetSource(VISU::Prs3d_ptr thePrs3d){
-  if(thePrs3d->_is_nil()) {
-    myPrs3di = NULL;
-    mySourceEntry = "";
-  } else {
-    myPrs3di = dynamic_cast<VISU::Prs3d_i*>(GetServant(thePrs3d));
-    CORBA::String_var aString = thePrs3d->GetID();
-    SALOMEDS::SObject_var aSObject = myStudy->FindObjectIOR(aString);
-    aString = aSObject->GetID();
-    mySourceEntry = aString.in();
-  }
-}
-
-VISU::Prs3d_ptr VISU::StreamLines_i::GetSource(){
-  VISU::Prs3d_var aPrs3d;
-  if(MYDEBUG) MESSAGE("StreamLines_i::GetSource() mySourceEntry = '"<<mySourceEntry<<"'");
-  if(mySourceEntry != ""){
-    SALOMEDS::SObject_var aSObject = myStudy->FindObjectID(mySourceEntry.c_str());
-    CORBA::Object_var anObj = SObjectToObject(aSObject);
-    if(!CORBA::is_nil(anObj)){
-      aPrs3d = VISU::Prs3d::_narrow(anObj);
-      if(!aPrs3d->_is_nil())
-       myPrs3di = dynamic_cast<VISU::Prs3d_i*>(GetServant(aPrs3d.in()));
-    }
-  }
-  return aPrs3d._retn();
-}
-
-// in this method we calculate minimal width of the dataset
-// at least three integration steps could be in this width
-float VISU::StreamLines_i::GetMaxIntegrationStep() {
-  float aMaxSizeY = fabs(myBounds[2] - myBounds[3]);
-  float aMaxSizeZ = fabs(myBounds[4] - myBounds[5]);
-  float aMinMax = fabs(myBounds[0] - myBounds[1]);
-  if (aMinMax < 1.0e-20 || (aMaxSizeY < aMinMax && aMaxSizeY > 1.0e-20)) aMinMax = aMaxSizeY;
-  if (aMinMax < 1.0e-20 || (aMaxSizeZ < aMinMax && aMaxSizeZ > 1.0e-20)) aMinMax = aMaxSizeZ;
-  return aMinMax / 2.0;
-}
-
-float VISU::StreamLines_i::GetMinIntegrationStep() {
-  float aVolume = 1;
-  float degree = 0;
-  if (fabs(myBounds[0] - myBounds[1]) > 1.0e-20 ) {
-    aVolume *= fabs(myBounds[0] - myBounds[1]);
-    degree+=1.0;
-  }
-  if (fabs(myBounds[2] - myBounds[3]) > 1.0e-20 ) {
-    aVolume *= fabs(myBounds[2] - myBounds[3]);
-    degree+=1.0;
-  }
-  if (fabs(myBounds[4] - myBounds[5]) > 1.0e-20 ) {
-    aVolume *= fabs(myBounds[4] - myBounds[5]);
-    degree+=1.0;
-  }
-  if (degree < 0.5) return 0.0; // absolutely empty object
-  float anAverageVolume = aVolume / 1.0e+8; // we have to use no more, than 1GB memory (approx)
-  return pow((double)(anAverageVolume), (double)(1.0 / degree));
-}
-
-float VISU::StreamLines_i::GetBasePropagationTime() {
-  return myFieldTransform->GetUnstructuredGridOutput()->GetLength() / (GetMax() + GetMin()) * 2.0;
-}
-
-VISU::ScalarMap_i::DataType* VISU::StreamLines_i::DoHook(int theRestoring){
-  if(theRestoring == 0){
-    myDirection = VISU::StreamLines::BOTH;
-    vtkDataSet *aDataSet = myFieldTransform->GetUnstructuredGridOutput();
-    aDataSet->Update();
-
-    myIntegrationStep = GetMaxIntegrationStep() / 10.0;
-    float aMinMax = aDataSet->GetLength() /
-      (sqrt((float)(aDataSet->GetNumberOfPoints() + aDataSet->GetNumberOfCells()))+1.0);
-    if (aMinMax > myIntegrationStep) myIntegrationStep = (myIntegrationStep * 9.0 + aMinMax) / 10.0;
-    if (myIntegrationStep < GetMinIntegrationStep()) myIntegrationStep = GetMinIntegrationStep();
-
-    myPropagationTime = GetBasePropagationTime();
-    myStepLength = myPropagationTime / 20.;
-    if (myStepLength > myIntegrationStep * 2) myStepLength = myIntegrationStep * 2;
-    if (myStepLength  < myPropagationTime / 100.) myStepLength = myPropagationTime / 100.;
-
-    myPrs3di = NULL;
-    myPercents = 0.3;
-  }
-  Update();
-  return myStream->GetOutput();
-}
-
-
-void SetStreamerSource(vtkStreamer *theStreamer, vtkDataSet* theDataSet, 
-                      VISU::Prs3d_i* thePrs3di, float thePercents)
-{
-  if(thePrs3di)
-    theDataSet = thePrs3di->GetMapper()->GetInput();
-  theDataSet->Modified();
-  theDataSet->Update();
-  vtkMaskPoints *aMaskPoints = vtkMaskPoints::New();
-  aMaskPoints->SetInput(theDataSet);
-  //aMaskPoints->RandomModeOn();
-  int aNbPoints = (int)(theDataSet->GetNumberOfPoints()*thePercents);
-  if(MYDEBUG) MESSAGE("SetStreamerSource aNbPoints = "<<theDataSet->GetNumberOfPoints()<<";\t"<<aNbPoints);
-  aMaskPoints->SetMaximumNumberOfPoints(aNbPoints);
-  theStreamer->SetSource(aMaskPoints->GetOutput());
-  aMaskPoints->Delete();
-}
-
-void VISU::StreamLines_i::Update(){
-  //apo - myStream->DebugOn();
-  VISU::Prs3d_var aPrs3d = GetSource();
-  if(myField->myNbComp > 1){
-    myStream->SetStepLength(myStepLength);
-    myStream->SetIntegrationStepLength(myIntegrationStep);
-    myStream->SetMaximumPropagationTime(myPropagationTime);
-    if(myField->myEntity == VISU::CELL_ENTITY){
-      vtkCellDataToPointData *aFilter = vtkCellDataToPointData::New();
-      aFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-      aFilter->PassCellDataOn();
-      myStream->SetInput(aFilter->GetOutput());
-      aFilter->Delete();
-      vtkCellCenters *centers = vtkCellCenters::New(); // for vectors on cells
-      centers->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-      centers->VertexCellsOn();
-      //myStream->SetSource(centers->GetOutput());
-      SetStreamerSource(myStream,centers->GetOutput(),myPrs3di,myPercents);
-      centers->Delete();
-    }else{
-      myStream->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-      //myStream->SetSource(myFieldTransform->GetUnstructuredGridOutput());
-      SetStreamerSource(myStream,myFieldTransform->GetUnstructuredGridOutput(),myPrs3di,myPercents);
-    }
-    switch (myDirection) {
-    case VISU::StreamLines::FORWARD:
-      myStream->SetIntegrationDirectionToForward();
-      break;
-    case VISU::StreamLines::BACKWARD:
-      myStream->SetIntegrationDirectionToBackward();
-      break;
-    case VISU::StreamLines::BOTH:
-      myStream->SetIntegrationDirectionToIntegrateBothDirections();
-    }
-  }
-  myStream->Modified();
-  VISU::DeformedShape_i::Update();
-}
-
-//==============================================================================
-int VISU::Vectors_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                               const char* theFieldName, double theIteration){
-  return DeformedShape_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration);
-}
-
-int VISU::Vectors_i::myNbPresent = 0;
-QString VISU::Vectors_i::GenerateName() { return VISU::GenerateName("Vectors",myNbPresent++);}
-
-const string VISU::Vectors_i::myComment = "VECTORS";
-const char* VISU::Vectors_i::GetComment() const { return myComment.c_str();}
-
-VISU::Vectors_i::Vectors_i(Result_i* theResult, bool theAddToStudy) :
-       PrsObject_i(theResult->GetStudyDocument()), 
-       Prs3d_i(theResult),       
-       ScalarMap_i(theResult, theAddToStudy),
-       DeformedShape_i(theResult, theAddToStudy)
-{
-  if(MYDEBUG) MESSAGE("Vectors_i::Vectors_i");
-  myGlyph = vtkGlyph3D::New();
-  myHog = vtkHedgeHog::New();
-}
-
-void VISU::Vectors_i::Destroy(){
-  DeformedShape_i::Destroy();
-}
-
-void VISU::Vectors_i::SameAs(const VISU::Vectors_i* theOrigin) {
-  Vectors_i* aVectors = const_cast<Vectors_i*>(theOrigin);
-  SetLineWidth(aVectors->GetLineWidth());
-  SetGlyphType(aVectors->GetGlyphType());
-  SetGlyphPos(aVectors->GetGlyphPos());
-  VISU::DeformedShape_i::SameAs(theOrigin);
-}
-
-VISU::Storable* VISU::Vectors_i::Create(const char* theMeshName, VISU::Entity theEntity, 
-                                       const char* theFieldName, double theIteration){
-  myLineWidth = 1.0;
-  myTypeGlyph = VISU::Vectors::ARROW;
-  myPosGlyph = VISU::Vectors::CENTER;
-  return DeformedShape_i::Create(theMeshName,theEntity,theFieldName,theIteration);
-}
-
-VISU::Storable* VISU::Vectors_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding)
-     throw(std::logic_error&)
-{
-  DeformedShape_i::Restore(theMap,false);
-
-  myTypeGlyph = (VISU::Vectors::GlyphType)VISU::Storable::FindValue(theMap,"myTypeGlyph").toInt();
-  myLineWidth = VISU::Storable::FindValue(theMap,"myLineWidth").toDouble();
-  myPosGlyph = (VISU::Vectors::GlyphPos)VISU::Storable::FindValue(theMap,"myPosGlyph").toInt();
-
-  if(theBuilding)
-    return Build(true);
-  return NULL;
-}
-
-void VISU::Vectors_i::ToStream(std::ostringstream& theStr){
-  DeformedShape_i::ToStream(theStr);
-
-  Storable::DataToStream( theStr, "myTypeGlyph", myTypeGlyph );
-  Storable::DataToStream( theStr, "myLineWidth", myLineWidth );
-  Storable::DataToStream( theStr, "myPosGlyph",  myPosGlyph );
-}
-
-VISU::Storable* VISU::VectorsRestore(SALOMEDS::SObject_ptr theSObject, 
-                                    const string& thePrefix, const Storable::TRestoringMap& theMap)
-     throw(std::logic_error&)
-{
-  VISU::Result_i* pResult = GetResult(theSObject);
-  if(pResult != NULL){
-    VISU::Vectors_i* pResent = new VISU::Vectors_i(pResult);
-    return pResent->Restore(theMap);
-  }
-  return NULL;
-}
-
-
-VISU::ScalarMap_i::DataType* VISU::Vectors_i::DoHook(int theRestoring){
-  if(theRestoring == 0){
-    myTypeGlyph = VISU::Vectors::ARROW;
-    myLineWidth = 1;
-    myPosGlyph = VISU::Vectors::TAIL;
-    myFactor = ScaleFactor()/GetMax();
-  }
-  if(MYDEBUG) 
-    MESSAGE("Vectors_i::DoHook() - myFactor = "<<myFactor<<"; myTypeGlyph = "<<myTypeGlyph<<
-           "; myLineWidth = "<<myLineWidth<<"; myPosGlyph = "<<myPosGlyph);
-  Update();
-  if (myTypeGlyph == VISU::Vectors::NONE) return myHog->GetOutput();
-  return myGlyph->GetOutput();
-}
-
-VISU::Vectors_i::~Vectors_i(){
-  if(MYDEBUG) MESSAGE("Vectors_i::~Vectors_i()");
-  myGlyph->Delete();
-  myHog->Delete();
-}
-
-void VISU::Vectors_i::Update() {
-  switch (myTypeGlyph) {
-  case VISU::Vectors::ARROW:
-    {
-      vtkGlyphSource2D *aGlyphSource = vtkGlyphSource2D::New();
-      aGlyphSource->SetGlyphTypeToArrow();
-      aGlyphSource->SetFilled(0);
-      if(myPosGlyph == VISU::Vectors::TAIL)
-       aGlyphSource->SetCenter(0.5, 0.0, 0.0);
-      else if(myPosGlyph == VISU::Vectors::HEAD)
-       aGlyphSource->SetCenter(-0.5, 0.0, 0.0);
-      myGlyph->SetSource(aGlyphSource->GetOutput());
-      aGlyphSource->Delete();
-    }
-    break;
-
-  case VISU::Vectors::CONE2:
-  case VISU::Vectors::CONE6:
-    {
-      vtkConeSource *aGlyphSource = vtkConeSource::New(); //by default
-      if (myTypeGlyph == VISU::Vectors::CONE6)
-       aGlyphSource->SetResolution(7);
-      else
-       aGlyphSource->SetResolution(3);
-      aGlyphSource->SetHeight(1.0);
-      aGlyphSource->SetRadius(.1);
-      vtkTransform *aTransform = vtkTransform::New();
-
-      if(myPosGlyph == VISU::Vectors::TAIL)
-       aGlyphSource->SetCenter(0.5, 0.0, 0.0);
-      else if(myPosGlyph == VISU::Vectors::HEAD)
-       aGlyphSource->SetCenter(-0.5, 0.0, 0.0);
-      
-      vtkTransformPolyDataFilter *aFilter = vtkTransformPolyDataFilter::New();
-      aFilter->SetInput(aGlyphSource->GetOutput());
-      aGlyphSource->Delete();
-      aFilter->SetTransform(aTransform);
-      aTransform->Delete();
-      myGlyph->SetSource(aGlyphSource->GetOutput());
-      aFilter->Delete();
-    }
-    break;
-  case VISU::Vectors::NONE:
-    {
-      if(myField->myEntity == VISU::CELL_ENTITY){
-       vtkCellCenters *centers = vtkCellCenters::New(); // for vectors on cells
-       centers->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-       centers->VertexCellsOn();
-       myHog->SetInput(centers->GetOutput());
-       centers->Delete();
-      }else
-       myHog->SetInput(myFieldTransform->GetInput());
-      
-      myHog->SetScaleFactor(myFactor);
-      myHog->Update();
-      myMapper->SetInput(myHog->GetOutput());
-      myMapper->Update();
-      return;
-    }
-  }
-  if(myField->myNbComp > 1){
-    if(myField->myEntity == VISU::CELL_ENTITY){
-      vtkCellCenters *centers = vtkCellCenters::New(); // for vectors on cells
-      centers->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-      centers->VertexCellsOn();
-      myGlyph->SetInput(centers->GetOutput());
-      centers->Delete();
-    }else
-      myGlyph->SetInput(myFieldTransform->GetUnstructuredGridOutput());
-    myGlyph->SetVectorModeToUseVector();
-    myGlyph->SetScaleModeToScaleByVector();
-    //myGlyph->SetColorModeToColorByVector();
-    myGlyph->SetColorModeToColorByScalar();
-    myGlyph->SetScaleFactor(2*myFactor);
-  }
-  myGlyph->Modified();
-  VISU::DeformedShape_i::Update();
-}
-
-VISU_Actor* VISU::Vectors_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO) {
-  VISU_Actor* anActor = VISU::DeformedShape_i::CreateActor(theIO);
-  return anActor;
-}
-
-void VISU::Vectors_i::UpdateActor(VISU_Actor* theActor) {
-  VISU::DeformedShape_i::UpdateActor(theActor);
-  theActor->GetProperty()->SetLineWidth(myLineWidth);
-  theActor->GetProperty()->SetRepresentation(2);
-  theActor->SetShrinkable(false);
-}
-
-//==============================================================================
-
index cd6230199b9906707cd9bbd58105b0cb459770c7..304df61bf57de95c61cf2eea9ff3233a36c2813e 100644 (file)
@@ -1,5 +1,23 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //  File   : VISU_PrsObject_i.hxx
 #ifndef VISU_PrsObject_i_HeaderFile
 #define VISU_PrsObject_i_HeaderFile
 
-#include "VISU_Result_i.hh"
-//#include "VISU_Convertor.hxx"
-#include "Handle_SALOME_InteractiveObject.hxx"
-
-class VISU_Extractor;
-class VISU_FieldTransform;
-class VISU_ScalarBarActor;
-class VISU_LookupTable;
-class VISU_Actor;
-
-class vtkDataSetMapper;
-class vtkDataSet;
-class vtkProperty;
-
-class vtkPolyDataMapper;
-class vtkPolyData;
-class vtkGeometryFilter;
-
-class vtkWarpVector;
-class vtkContourFilter;
-class vtkAppendPolyData;
-
-class vtkGlyph3D;
-class vtkHedgeHog;
-class vtkPolyDataSource;
-class vtkStreamLine;
+#include "VISUConfig.hh"
 
 namespace VISU{
-  struct TField;
-  //==============================================================================
   class PrsObject_i : public virtual POA_VISU::PrsObject,
                       public virtual Storable
   {
     PrsObject_i(const PrsObject_i&);
 
   public:
-    PrsObject_i(SALOMEDS::Study_ptr theStudy) : 
-      myStudy(SALOMEDS::Study::_duplicate(theStudy)) {};
+    PrsObject_i(SALOMEDS::Study_ptr theStudy) : myStudy(SALOMEDS::Study::_duplicate(theStudy)) {};
     virtual ~PrsObject_i() {}
 
   protected:
-    string myName;
+    std::string myName;
     SALOMEDS::Study_var myStudy;
 
   public:
@@ -59,589 +49,8 @@ namespace VISU{
     const SALOMEDS::Study_var& GetStudyDocument() const { return myStudy;}
     QString GetEntry();
   };
-
-
-  //==============================================================================
-  class Prs3d_i : public virtual POA_VISU::Prs3d,
-                  public virtual PrsObject_i
-  {
-    Prs3d_i();
-    Prs3d_i(const Prs3d_i&);
-  public:
-    Prs3d_i(Result_i* theResult);
-    virtual void SameAs(const Prs3d_i* theOrigin);
-    virtual ~Prs3d_i();
-    virtual void Destroy();
-
-    typedef vtkPolyDataMapper MapperType;
-    typedef vtkDataSet DataType;
-
-    virtual SALOMEDS::Color GetColor() { return myColor;}
-    virtual void SetColor(const SALOMEDS::Color& theColor);
-
-  protected:
-    Result_i* myResult;
-    MapperType *myMapper;
-    vtkGeometryFilter *myGeomFilter;
-    float myBounds[6];
-    struct SALOMEDS::Color myColor;
-
-    bool myAddToStudy;
-    bool CreateActor(VISU_Actor* theActor, const Handle(SALOME_InteractiveObject)& theIO = NULL);
-
-  public:
-    virtual void Update();
-    virtual const char* GetComment() const = 0;
-    virtual QString GenerateName() = 0;
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    virtual void ToStream(std::ostringstream& theStr);
-    virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL) = 0;
-    virtual void UpdateActor(VISU_Actor* theActor);
-    MapperType* GetMapper() const { return myMapper;}
-    Result_i* GetResult() const { return myResult; }
-  };
-
-
-  //==============================================================================
-  class Mesh_i : public virtual POA_VISU::Mesh,
-                 public virtual Prs3d_i
-  {
-    static int myNbPresent;
-    Mesh_i();
-    Mesh_i(const Mesh_i&);
-  public:
-    Mesh_i(Result_i* theResult);
-    virtual void SameAs(const Mesh_i* theOrigin);
-    virtual ~Mesh_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TMESH;};
-
-    virtual void SetCellColor(const SALOMEDS::Color& theColor) { SetColor(theColor);}
-    virtual SALOMEDS::Color GetCellColor() { return GetColor();}
-
-    virtual void SetNodeColor(const SALOMEDS::Color& theColor) { myNodeColor = theColor;}
-    virtual SALOMEDS::Color GetNodeColor() { return myNodeColor;}
-
-    virtual void SetLinkColor(const SALOMEDS::Color& theColor) { myLinkColor = theColor;}
-    virtual SALOMEDS::Color GetLinkColor() { return myLinkColor;}
-
-    virtual void SetPresentationType(VISU::PresentationType theType) { myPresentType = theType;}
-    virtual PresentationType GetPresentationType() { return myPresentType;}
-
-    typedef VISU::Mesh InterfaceType;
-    typedef vtkUnstructuredGridReader InputType;
-
-  protected:
-    Storable* Build(int theRestoring);
-
-    InputType *myInput;
-    VISU::VISUType myType;
-    string myMeshName;
-    int myEntity;
-    string mySubMeshName;
-    struct SALOMEDS::Color myNodeColor, myLinkColor;
-    VISU::PresentationType myPresentType;
-
-  public:
-    virtual Storable* Create(const char* theMeshName, int theEntity);
-    virtual Storable* Create(const char* theMeshName, int theEntity, const char* theFamilyName);
-    virtual Storable* Create(const char* theMeshName, const char* theGroupName);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    virtual void ToStream(std::ostringstream& theStr);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL);
-    virtual void UpdateActor(VISU_Actor* theActor);
-    virtual InputType* GetInput() const { return myInput;}
-  };
-  Storable* MeshRestore(SALOMEDS::SObject_ptr theSObject, 
-                       const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-  //==============================================================================
-  class ScalarMap_i : public virtual POA_VISU::ScalarMap,
-                     public virtual Prs3d_i
-  {
-    static int myNbPresent;
-    ScalarMap_i();
-    ScalarMap_i(const ScalarMap_i&);
-
-  public:
-    ScalarMap_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const ScalarMap_i* theOrigin);
-    virtual ~ScalarMap_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TSCALARMAP;};
-
-    virtual void SetScalarMode(CORBA::Long theScalarMode);
-    virtual CORBA::Long GetScalarMode() { return myScalarMode;}
-
-    virtual void SetScaling(VISU::Scaling theScaling);
-    virtual VISU::Scaling GetScaling();
-
-    virtual void SetRange(CORBA::Double theMin, CORBA::Double theMax);
-    virtual CORBA::Double GetMin() { return myScalarRange[0];}  
-    virtual CORBA::Double GetMax() { return myScalarRange[1];}
-
-    virtual void SetOrientation(VISU::ScalarMap::Orientation theOrientation) { 
-      myOrientation = theOrientation;
-    }
-    virtual VISU::ScalarMap::Orientation GetOrientation() { return myOrientation;}
-
-    virtual void SetPosition(CORBA::Double X, CORBA::Double Y) { myPosition[0] = X; myPosition[1] = Y;}
-    virtual CORBA::Double GetPosX() { return myPosition[0];} 
-    virtual CORBA::Double GetPosY() { return myPosition[1];}
-      
-    virtual void SetSize(CORBA::Double theWidth, CORBA::Double theHeight) { 
-      myWidth = theWidth; myHeight = theHeight;
-    }
-    virtual CORBA::Double GetWidth() { return myWidth;}  
-    virtual CORBA::Double GetHeight() { return myHeight;}
-
-    virtual void SetNbColors(CORBA::Long theNbColors) { myNumberOfColors = theNbColors;}
-    virtual CORBA::Long GetNbColors() { return myNumberOfColors;}
-
-    virtual void SetLabels(CORBA::Long theNbLabels) { myNumberOfLabels = theNbLabels;}
-    virtual CORBA::Long GetLabels() { return myNumberOfLabels;}
-    
-    virtual void SetTitle(const char* theName) { myTitle = theName;}
-    virtual char* GetTitle() { return CORBA::string_dup(myTitle.c_str());}
-
-    virtual void CalculateRange();
-    virtual void GetFieldRange(float theRange[2]);
-    virtual bool isRangeFixed() { return myIsFixedRange; }
-    
-    virtual double GetIteration() { return myIteration; }
-
-    typedef VISU::ScalarMap InterfaceType;
-    typedef VISU_Extractor InputType;
-
-  protected:
-    Storable* Build(int theRestoring);
-    virtual DataType* DoHook(int theRestoring);
-
-    InputType *myInput;
-    
-    string myMeshName;
-    int myEntity;
-    string myFieldName;
-    int myScalarMode;
-    double myIteration;
-    VISU_LookupTable *myMapperTable, *myBarTable;
-    VISU_FieldTransform *myFieldTransform;
-    const TField* myField;
-    
-    float myScalarRange[2];
-    bool myIsFixedRange;
-    bool myIsColored;
-    VISU::Scaling myScaling;
-    float myMapScale;
-
-    string myTitle;
-    VISU::ScalarMap::Orientation myOrientation;
-    int myNumberOfColors, myNumberOfLabels;
-    float myPosition[2], myWidth, myHeight;
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-    InputType* GetInput() { return myInput;}
-
-    virtual void Update();
-    const VISU::TField*  GetField() const { return myField;}
-    const string&  GetFieldName() const { return myFieldName;}
-    int GetScalarMode() const { return myScalarMode;}
-    virtual void SetMapScale(double theMapScale = 1.0);
-
-    virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL);
-    virtual void UpdateActor(VISU_Actor* theActor);
-  };
-  Storable* ScalarMapRestore(SALOMEDS::SObject_ptr theSObject, 
-                            const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-  //==============================================================================
-  class DeformedShape_i : public virtual POA_VISU::DeformedShape,
-                         public virtual ScalarMap_i
-  {
-    static int myNbPresent;
-    DeformedShape_i();
-    DeformedShape_i(const DeformedShape_i&);
-  public:
-    DeformedShape_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const DeformedShape_i* theOrigin);
-    virtual ~DeformedShape_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TDEFORMEDSHAPE;};
-
-    virtual void SetScale(CORBA::Double theScale) { myFactor = theScale;}
-    virtual CORBA::Double GetScale() { return myFactor;}
-
-    typedef VISU::DeformedShape InterfaceType;
-
-    virtual bool isColored() { return myIsColored; }
-    virtual void setColored(bool theColor) { myIsColored = theColor; }
-    virtual void SetColor(const SALOMEDS::Color& theColor);
-
-  protected:
-    virtual DataType* DoHook(int theRestoring);
-    float myFactor;
-    vtkWarpVector *myWarpVector;
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual void Update();
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-    float ScaleFactor();
-    virtual void SetMapScale(double theMapScale = 1.0);
-
-    virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL);
-    virtual void UpdateActor(VISU_Actor* theActor);
-  };
-  Storable* DeformedShapeRestore(SALOMEDS::SObject_ptr theSObject, 
-                                const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-
-
-  //==============================================================================
-  class CutPlanes_i : public virtual POA_VISU::CutPlanes,
-                     public virtual ScalarMap_i
-  {
-    static int myNbPresent;
-    CutPlanes_i();
-    CutPlanes_i(const CutPlanes_i&);
-  public:
-    CutPlanes_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const CutPlanes_i* theOrigin);
-    virtual ~CutPlanes_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TCUTPLANES;};
-
-    virtual void SetOrientationType(VISU::CutPlanes::Orientation theOrient) { 
-      myBasePlane = theOrient;
-    }
-    virtual VISU::CutPlanes::Orientation GetOrientationType() { return myBasePlane;}
-
-    virtual void SetDisplacement(CORBA::Double theDisp) { myDisplacement = theDisp;}
-    virtual CORBA::Double GetDisplacement() { return myDisplacement;}
-
-    virtual void SetNbPlanes(CORBA::Long theNb) { myNbPlanes = theNb;}
-    virtual CORBA::Long GetNbPlanes() { return myNbPlanes;}
-    
-    virtual void SetRotateX(CORBA::Double theAngle);
-    virtual CORBA::Double GetRotateX();
-    virtual void SetRotateY(CORBA::Double theAngle);
-    virtual CORBA::Double GetRotateY();
-    
-    typedef VISU::CutPlanes InterfaceType;
-
-  protected:
-    virtual DataType* DoHook(int theRestoring);
-
-    int myNbPlanes;
-    float myAng[3], myDisplacement;
-    vtkAppendPolyData *myAppendPolyData;
-    VISU::CutPlanes::Orientation myBasePlane;
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual void Update();
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-    void SetPlane(int theId);
-  };
-  Storable* CutPlanesRestore(SALOMEDS::SObject_ptr theSObject, 
-                            const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-
-  //==============================================================================
-  class CutLines_i : public virtual POA_VISU::CutLines,
-                     public virtual ScalarMap_i
-  {
-    static int myNbPresent;
-    CutLines_i();
-    CutLines_i(const CutPlanes_i&);
-  public:
-    CutLines_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const CutLines_i* theOrigin);
-    virtual ~CutLines_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TCUTLINES;};
-
-    virtual void SetOrientationType(VISU::CutPlanes::Orientation theOrient) { 
-      myBasePlane[0] = theOrient;
-    }
-    virtual VISU::CutPlanes::Orientation GetOrientationType() { return myBasePlane[0];}
-
-    virtual void SetOrientationType2(VISU::CutPlanes::Orientation theOrient) { 
-      myBasePlane[1] = theOrient;
-    }
-    virtual VISU::CutPlanes::Orientation GetOrientationType2() { return myBasePlane[1];}
-
-    virtual void SetDisplacement(CORBA::Double theDisp) { myDisplacement[0] = theDisp;}
-    virtual CORBA::Double GetDisplacement() { return myDisplacement[0];}
-    virtual void SetDisplacement2(CORBA::Double theDisp) { myDisplacement[1] = theDisp;}
-    virtual CORBA::Double GetDisplacement2() { return myDisplacement[1];}
-
-    virtual void SetNbLines(CORBA::Long theNb) { myNbLines = theNb;}
-    virtual CORBA::Long GetNbLines() { return myNbLines;}
-    
-    virtual void SetRotateX(CORBA::Double theAngle);
-    virtual CORBA::Double GetRotateX();
-    virtual void SetRotateY(CORBA::Double theAngle);
-    virtual CORBA::Double GetRotateY();
-
-    virtual void SetRotateX2(CORBA::Double theAngle);
-    virtual CORBA::Double GetRotateX2();
-    virtual void SetRotateY2(CORBA::Double theAngle);
-    virtual CORBA::Double GetRotateY2();
-
-    typedef VISU::CutLines InterfaceType;
-
-  protected:
-    virtual DataType* DoHook(int theRestoring);
-
-    int myNbLines;
-    vtkAppendPolyData *myAppendPolyData;
-    float myAng[2][3], myDisplacement[2];
-    VISU::CutPlanes::Orientation myBasePlane[2];
-    float myDirLn[3], myBoundPrjLn[3], myBasePnt[3];
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    void BuildTableOfReal(SALOMEDS::SObject_ptr theSObject);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual void Update();
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-  };
-  Storable* CutLinesRestore(SALOMEDS::SObject_ptr theSObject, 
-                           const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-
-  //==============================================================================
-  class IsoSurfaces_i : public virtual POA_VISU::IsoSurfaces,
-                       public virtual ScalarMap_i
-  {
-    static int myNbPresent;
-    IsoSurfaces_i();
-    IsoSurfaces_i(const IsoSurfaces_i&);
-  public:
-    IsoSurfaces_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const IsoSurfaces_i* theOrigin);
-    virtual ~IsoSurfaces_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TISOSURFACE;};
-
-    virtual void SetNbSurfaces(CORBA::Long theNb) { myNbSurface = theNb;}
-    virtual CORBA::Long GetNbSurfaces() { return myNbSurface;}
-
-    virtual void SetRange(float theMin, float theMax);
-    virtual float GetRangeMin() { return myRange[0]; }
-    virtual float GetRangeMax() { return myRange[1]; }
-
-    typedef VISU::IsoSurfaces InterfaceType;
-
-  protected:
-    virtual DataType* DoHook(int theRestoring);
-
-    vtkContourFilter *myContourFilter;
-    int myNbSurface;
-    float myRange[2];
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual void Update();
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-    virtual void SetMapScale(double theMapScale = 1.0);
-  };
-  Storable* IsoSurfacesRestore(SALOMEDS::SObject_ptr theSObject, 
-                              const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-
-  //==============================================================================
-  class StreamLines_i : public virtual POA_VISU::StreamLines,
-                       public virtual DeformedShape_i
-  {
-    static int myNbPresent;
-    StreamLines_i();
-    StreamLines_i(const StreamLines_i&);
-  public:
-    StreamLines_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const StreamLines_i* theOriginal);
-    virtual ~StreamLines_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TSTREAMLINES;}
-
-    typedef VISU::StreamLines InterfaceType;
-
-    virtual void SetDirection(VISU::StreamLines::Direction theDirection) 
-    { myDirection = theDirection; }
-    virtual VISU::StreamLines::Direction GetDirection() { return myDirection;}
-
-    virtual void SetStepLength(CORBA::Double theStep) { myStepLength = theStep; }
-    virtual CORBA::Double GetStepLength() { return myStepLength; }
-
-    virtual void SetPropagationTime(CORBA::Double theTime) { myPropagationTime = theTime; }
-    virtual CORBA::Double GetPropagationTime() { return myPropagationTime; }
-
-    virtual void SetIntegrationStep(CORBA::Double theStep) { myIntegrationStep = theStep; }
-    virtual CORBA::Double GetIntegrationStep() { return myIntegrationStep; }
-
-    virtual void SetSource(VISU::Prs3d_ptr thePrs3d);
-    virtual VISU::Prs3d_ptr GetSource();
-
-    virtual void SetUsedPoints(CORBA::Double thePercents) { myPercents = thePercents; }
-    virtual CORBA::Double GetUsedPoints() { return myPercents; }
-
-  protected:
-    virtual DataType* DoHook(int theRestoring);
-    vtkStreamLine* myStream;
-
-    VISU::StreamLines::Direction myDirection;
-    float myStepLength;
-    float myIntegrationStep;
-    float myPropagationTime;
-    string mySourceEntry;
-    VISU::Prs3d_i* myPrs3di;
-    float myPercents;
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    
-    virtual float GetMinIntegrationStep();
-    virtual float GetMaxIntegrationStep();
-    virtual float GetBasePropagationTime();
-
-    virtual void Update();
-    virtual QString GetSourceEntry() { return QString(mySourceEntry.c_str()); }
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-  };
-  Storable* StreamLinesRestore(SALOMEDS::SObject_ptr theSObject, 
-                              const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-
-
-  //==============================================================================
-  class Vectors_i : public virtual POA_VISU::Vectors,
-                   public virtual DeformedShape_i
-  {
-    static int myNbPresent;
-    Vectors_i();
-    Vectors_i(const Vectors_i&);
-  public:
-    Vectors_i(Result_i* theResult, bool theAddToStudy = true);
-    virtual void SameAs(const Vectors_i* theOrigin);
-    virtual ~Vectors_i();
-    virtual void Destroy();
-
-    virtual VISU::VISUType GetType() { return VISU::TVECTORS;};
-
-    virtual void SetLineWidth(CORBA::Double theWidth) { myLineWidth = theWidth;}
-    virtual CORBA::Double GetLineWidth() { return myLineWidth;}
-
-    virtual void SetGlyphType(VISU::Vectors::GlyphType theType) { myTypeGlyph = theType;}
-    virtual VISU::Vectors::GlyphType GetGlyphType() { return myTypeGlyph;}
-    
-    virtual void SetGlyphPos(VISU::Vectors::GlyphPos thePos) { myPosGlyph = thePos;}
-    virtual VISU::Vectors::GlyphPos GetGlyphPos() { return myPosGlyph;}
-
-    typedef VISU::Vectors InterfaceType;
-
-  protected:
-    virtual DataType* DoHook(int theRestoring);
-
-    float myLineWidth;
-    VISU::Vectors::GlyphType myTypeGlyph;
-    VISU::Vectors::GlyphPos myPosGlyph;
-    vtkGlyph3D *myGlyph;
-    vtkHedgeHog *myHog;
-
-  public:
-    virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, 
-                            const char* theFieldName, double theIteration);
-    virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true)
-      throw(std::logic_error&);
-    static const string myComment;
-    virtual const char* GetComment() const;
-    virtual QString GenerateName();
-    virtual void Update();
-    virtual void ToStream(std::ostringstream& theStr);
-    static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, 
-                         const char* theFieldName, double theIteration);
-    virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL);
-    virtual void UpdateActor(VISU_Actor* theActor);
-  };
-  Storable* VectorsRestore(SALOMEDS::SObject_ptr theSObject, 
-                          const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
-  //==============================================================================
 }
+
 #endif
 
 
index 28fecf2bf97d577a360046f68358b3f2901ab798..5b7a705ba5afdbee33db6d95cacea2a7d7bc5218 100644 (file)
@@ -1,18 +1,34 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //  File   : VISU_Result_i.cc
 //  Author : Alexey PETROV
 //  Module : VISU
 
-using namespace std;
 #include "VISU_Result_i.hh"
 #include "VISU_Convertor_impl.hxx"
 #include "VISU_CorbaMedConvertor.hxx"
-#include "VISU_Extractor.hxx"
-using namespace VISU;
 
+#include "QAD_Config.h"
 #include "SALOMEDS_Tool.hxx"
 #include "HDFascii.hxx"
 
@@ -24,9 +40,10 @@ using namespace VISU;
 #include <vtkUnstructuredGridReader.h>
 #include <vtkUnstructuredGridWriter.h>
 
+using namespace VISU;
 using namespace std;
 
-#ifdef DEBUG
+#ifdef _DEBUG_
 static int MYDEBUG = 0;
 static int MYDEBUGWITHFILES = 0;
 #else
@@ -51,23 +68,6 @@ VISU::Result_var VISU::FindResult(SALOMEDS::SObject_ptr theSObject){
   return aResult;
 }
 
-QString VISU::GenerateName(const string& theFmt, int theId){
-  static QString aName;
-  if(theId > 0)
-    aName.sprintf("%s:%d",theFmt.c_str(),theId);
-  else
-    aName.sprintf("%s",theFmt.c_str());
-  return aName;
-}
-
-void VISU::WriteToFile(vtkUnstructuredGrid* theDataSet, const string& theFileName){
-  vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
-  aWriter->SetFileName(theFileName.c_str());
-  aWriter->SetInput(theDataSet);
-  aWriter->Write();
-  aWriter->Delete();
-}
-
 QString GenerateName(const char* theName){
   typedef map<string,int> TNameMap;
   static TNameMap aMap;
@@ -118,6 +118,71 @@ const char* VISU::Result_i::GetComment() const { return myComment.c_str();}
 VISU::Result_i::Result_i(SALOMEDS::Study_ptr theStudy) {
   myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
   myInput = NULL;
+  myIsDone = 0;
+}
+
+CORBA::Boolean VISU::Result_i::BuildAll(){
+  if(MYDEBUG) MESSAGE("Result_i::Build - myIsDone = "<<myIsDone);
+  if(myIsDone) return 1;
+  try{
+    const VISU::TMeshMap& aMeshMap = myInput->GetMeshMap();
+    VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin();
+    for(; aMeshMapIter != aMeshMap.end(); aMeshMapIter++){
+      const string& aMeshName = aMeshMapIter->first;
+      const VISU::TMesh& aMesh = aMeshMapIter->second;
+      const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh.myMeshOnEntityMap;
+      VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter;
+      //Import fields
+      aMeshOnEntityMapIter = aMeshOnEntityMap.begin();
+      for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++){
+       const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first;
+       const VISU::TMeshOnEntity& aMeshOnEntity = aMeshOnEntityMapIter->second;
+       const VISU::TFieldMap& aFieldMap = aMeshOnEntity.myFieldMap;
+       VISU::TFieldMap::const_iterator aFieldMapIter = aFieldMap.begin();
+       for(; aFieldMapIter != aFieldMap.end(); aFieldMapIter++){
+         const string& aFieldName = aFieldMapIter->first;
+         const VISU::TField& aField = aFieldMapIter->second;
+         const VISU::TField::TValField& aValField = aField.myValField;
+         VISU::TField::TValField::const_iterator aValFieldIter = aValField.begin();
+         for(; aValFieldIter != aValField.end(); aValFieldIter++){
+           int aTimeStamp = aValFieldIter->first;
+           myInput->GetTimeStampOnMesh(aMeshName,anEntity,aFieldName,aTimeStamp);
+         }
+       }
+      }
+      //Importing groups
+      const VISU::TGroupMap& aGroupMap = aMesh.myGroupMap;
+      VISU::TGroupMap::const_iterator aGroupMapIter = aGroupMap.begin();
+      for(; aGroupMapIter != aGroupMap.end(); aGroupMapIter++){
+       const string& aGroupName = aGroupMapIter->first;
+       myInput->GetMeshOnGroup(aMeshName,aGroupName);
+      }
+      //Import families
+      aMeshOnEntityMapIter = aMeshOnEntityMap.begin();
+      for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++){
+       const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first;
+       const VISU::TMeshOnEntity& aMeshOnEntity = aMeshOnEntityMapIter->second;
+       const VISU::TFamilyMap& aFamilyMap = aMeshOnEntity.myFamilyMap;
+       VISU::TFamilyMap::const_iterator aFamilyMapIter = aFamilyMap.begin();
+       for(; aFamilyMapIter != aFamilyMap.end(); aFamilyMapIter++){
+         const string& aFamilyName = aFamilyMapIter->first;
+         myInput->GetMeshOnEntity(aMeshName,anEntity,aFamilyName);
+       }
+      }
+      //Import mesh on entity
+      aMeshOnEntityMapIter = aMeshOnEntityMap.begin();
+      for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++){
+       const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first;
+       myInput->GetMeshOnEntity(aMeshName,anEntity);
+      }
+    }
+    myIsDone = 1;
+  }catch(std::runtime_error& exc){
+    INFOS("Follow exception was accured :\n"<<exc.what());
+  }catch(...){
+    INFOS("Unknown exception was accured!");
+  }
+  return myIsDone;
 }
 
 VISU::Storable* VISU::Result_i::Build(SALOMEDS::SObject_ptr theSObject) 
@@ -136,7 +201,7 @@ VISU::Storable* VISU::Result_i::Build(SALOMEDS::SObject_ptr theSObject)
                                           anIOR,myName.c_str(),"",aComment.latin1(),true);
     mySObject = myStudyDocument->FindObjectID(aResultEntry.c_str());
     if(mySObject->_is_nil()) throw std::runtime_error("Build - There is no SObject for the Result !!!");
-    if(theSObject != NULL){
+    if(!CORBA::is_nil(theSObject)){
       CORBA::String_var aString = theSObject->GetID();
       CreateReference(myStudyDocument,aResultEntry,aString.in());
     }
@@ -250,6 +315,8 @@ VISU::Storable* VISU::Result_i::Build(SALOMEDS::SObject_ptr theSObject)
       }
     }
   }
+  QString aIsBuild = QAD_CONFIG->getSetting("Visu:BuildResult");
+  if(aIsBuild.isEmpty()? 0 : aIsBuild.toInt()) BuildAll();
   return this;
 }
 
@@ -259,13 +326,13 @@ VISU::Storable* VISU::Result_i::Create(const char* theFileName){
     myInput = CreateConvertor(theFileName);
     if(myInput == NULL) return NULL;
     myFileInfo.setFile(theFileName);
-    myName = (const char*)(::GenerateName(myFileInfo.fileName().latin1()));
+    myName = ::GenerateName(myFileInfo.fileName()).latin1();
     VISU::Storable* aStorable = Build();
     return aStorable;
   }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
+    INFOS("Follow exception was accured :\n"<<exc.what());
   }catch(...){
-    MESSAGE("Unknown exception was accured!");
+    INFOS("Unknown exception was accured!");
   }
   return NULL;
 }
@@ -278,13 +345,13 @@ VISU::Storable* VISU::Result_i::Create(SALOMEDS::SObject_ptr theMedSObject){
     if(myInput == NULL) return NULL;
     string aCompDataType = GetComponentDataType(theMedSObject);
     myFileInfo.setFile(aCompDataType.c_str());
-    myName = (const char*)(::GenerateName("aResult"));
+    myName = ::GenerateName("aResult").latin1();
     VISU::Storable* aStorable = Build(theMedSObject);
     return aStorable;
   }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
+    INFOS("Follow exception was accured :\n"<<exc.what());
   }catch(...){
-    MESSAGE("Unknown exception was accured!");
+    INFOS("Unknown exception was accured!");
   }
   return NULL;
 }
@@ -297,19 +364,19 @@ VISU::Storable* VISU::Result_i::Create(SALOME_MED::FIELD_ptr theField){
     if(myInput == NULL) return NULL;
     string aCompDataType = "MED";
     myFileInfo.setFile(aCompDataType.c_str());
-    myName = (const char*)(::GenerateName("aResult"));
+    myName = ::GenerateName("aResult").latin1();
     VISU::Storable* aStorable = Build();
     return aStorable;
   }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
+    INFOS("Follow exception was accured :\n"<<exc.what());
   }catch(...){
-    MESSAGE("Unknown exception was accured!");
+    INFOS("Unknown exception was accured!");
   }
   return NULL;
 }
 
 VISU::Storable* VISU::Result_i::Restore(SALOMEDS::SObject_ptr theSObject, 
-                                       const string& thePrefix, const Storable::TRestoringMap& theMap)
+                                       const Storable::TRestoringMap& theMap, const string& thePrefix)
      throw(std::logic_error&)
 {
   if(MYDEBUG)  MESSAGE("Result_i::Restore - "<<thePrefix);
@@ -386,16 +453,18 @@ VISU::Storable* VISU::Result_i::Restore(SALOMEDS::SObject_ptr theSObject,
       SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr);
       aCmnt->SetValue(aComment.latin1());
     }
+    QString aIsBuild = QAD_CONFIG->getSetting("Visu:BuildResult");
+    if(aIsBuild.isEmpty()? 0 : aIsBuild.toInt()) BuildAll();
     return this;
   }catch(std::runtime_error& exc){
-    MESSAGE("Follow exception was accured :\n"<<exc.what());
+    INFOS("Follow exception was accured :\n"<<exc.what());
   }catch(...){
-    MESSAGE("Unknown exception was accured!");
+    INFOS("Unknown exception was accured!");
   }
   return NULL;
 }
 
-VISU::Result_i::InputType* VISU::Result_i::GetInput() { 
+VISU::Result_i::TInput* VISU::Result_i::GetInput() { 
   return myInput;
 }
 
@@ -404,14 +473,14 @@ void VISU::Result_i::ToStream(std::ostringstream& theStr){
   Storable::DataToStream(theStr,"myName",myName.c_str());
 }
 
-VISU::Storable* VISU::ResultRestore(SALOMEDS::SObject_ptr theSObject, 
-                                   const string& thePrefix, const Storable::TRestoringMap& theMap)
+VISU::Storable* VISU::Result_i::Restore(SALOMEDS::SObject_ptr theSObject, 
+                                       const string& thePrefix, const Storable::TRestoringMap& theMap)
      throw(std::logic_error&)
 {
   SALOMEDS::Study_var aStudy = theSObject->GetStudy();
   VISU::Result_i* pResult = new VISU::Result_i(aStudy);
   if(pResult == NULL) return NULL;
-  return pResult->Restore(theSObject,thePrefix,theMap);
+  return pResult->Restore(theSObject,theMap,thePrefix);
 }
      
 string VISU::Result_i::GetRefFatherEntry() { 
index d796d86c3abeb57492396080a17ab39705162893..163231ec64ff0f86731c3896cc54d932d167dd7f 100644 (file)
@@ -1,5 +1,23 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //  File   : VISU_Result_i.hh
 
 #include "VISUConfig.hh"
 
-class vtkUnstructuredGridReader;
-class vtkUnstructuredGrid;
 class VISU_Convertor;
-class FieldInfo;
-class QAD_Study;
 
 namespace VISU{
   class Result_i : public virtual POA_VISU::Result,
@@ -27,30 +41,34 @@ namespace VISU{
     Result_i(SALOMEDS::Study_ptr theStudy);
     virtual ~Result_i();
 
-    virtual VISU::VISUType GetType() { return VISU::TRESULT;};
+    virtual VISU::VISUType GetType() { return VISU::TRESULT;}
+    virtual CORBA::Boolean BuildAll();
 
-    typedef VISU_Convertor InputType;
-    typedef vtkUnstructuredGridReader OutputType;
+    typedef VISU_Convertor TInput;
     enum TSourceId {eRestoredComponent = -2, eRestoredFile = -1, eFile = 1, eComponent = 2};
   private:
     TSourceId mySourceId;
-    InputType *myInput;
+    TInput *myInput;
+    CORBA::Boolean myIsDone;
     string myName;
     QFileInfo myFileInfo;
   protected:
-    virtual Storable* Build(SALOMEDS::SObject_ptr theSObject = NULL
+    virtual Storable* Build(SALOMEDS::SObject_ptr theSObject = SALOMEDS::SObject::_nil()
       throw (std::runtime_error&);
   public:
     virtual Storable* Create(const char* theFileName);
     virtual Storable* Create(SALOMEDS::SObject_ptr theMedSObject);
     virtual Storable* Create(SALOME_MED::FIELD_ptr theField);
     virtual Storable* Restore(SALOMEDS::SObject_ptr theSObject, 
-                             const string& thePrefix, const Storable::TRestoringMap& theMap)
+                             const Storable::TRestoringMap& theMap, const string& thePrefix)
+      throw(std::logic_error&);
+    static Storable* Restore(SALOMEDS::SObject_ptr theSObject, 
+                            const string& thePrefix, const Storable::TRestoringMap& theMap)
       throw(std::logic_error&);
     virtual void ToStream(std::ostringstream& theStr);
     virtual const char* GetComment() const;
     static const string myComment;
-    InputType* GetInput();
+    TInput* GetInput();
     const string& GetName() const { return myName;}
     const QFileInfo& GetFileInfo() const { return myFileInfo;}
     Result_i::TSourceId GetSourceId() const { return mySourceId;}
@@ -65,11 +83,6 @@ namespace VISU{
     const SALOMEDS::Study_var& GetStudyDocument() const;
     const SALOMEDS::SComponent_var& GetSComponent() const;
   };
-  Storable* ResultRestore(SALOMEDS::SObject_ptr theSObject, 
-                          const string& thePrefix, const Storable::TRestoringMap& theMap)
-    throw(std::logic_error&);
   Result_var FindResult(SALOMEDS::SObject_ptr theSObject);
-  QString GenerateName(const string& theFmt, int theId);
-  void WriteToFile(vtkUnstructuredGrid* theDataSet, const string& theFileName);
 }
 #endif
index 5d01988c6912034fa248cb6b74cf5b30ae14e3db..12d15ee401aa66637f3f7fe1fee9f18cd2894739 100644 (file)
@@ -1,25 +1,47 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //  File   : VISU_Table_i.cc
 //  Author : Vadim SANDLER
 //  Module : VISU
 
-using namespace std;
 #include "VISU_Table_i.hh"
 
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_Study.h"
+
+#include "VISU_CutLines_i.hh"
+
+#include <memory>      
 #include <fstream>     
 #include <strstream>
+
 #include <qfileinfo.h>
-#include <qstringlist.h>
-#include <memory>      
 
-#ifdef DEBUG
-static int MYDEBUG = 1;
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
 #else
 static int MYDEBUG = 0;
 #endif
@@ -183,8 +205,9 @@ void VISU::Table_i::ToStream( std::ostringstream& theStr )
 /*!
   Called from engine to restore table from the file
 */
-VISU::Storable* VISU::TableRestore(SALOMEDS::SObject_ptr theSObject, 
-                                  const string& thePrefix, const Storable::TRestoringMap& theMap)
+VISU::Storable* VISU::Table_i::Restore(SALOMEDS::SObject_ptr theSObject, 
+                                      const string& thePrefix, const Storable::TRestoringMap& theMap)
+  throw(std::logic_error&)
 {
   SALOMEDS::Study_var aStudy = theSObject->GetStudy();
   VISU::Table_i* pResent = new VISU::Table_i( aStudy, "" );
@@ -590,8 +613,9 @@ const char* VISU::Curve_i::GetTableID() {
 /*!
   Called from engine to restore curve from the file
 */
-VISU::Storable* VISU::CurveRestore(SALOMEDS::SObject_ptr theSObject, 
-                                  const string& thePrefix, const Storable::TRestoringMap& theMap)
+VISU::Storable* VISU::Curve_i::Restore(SALOMEDS::SObject_ptr theSObject, 
+                                      const string& thePrefix, const Storable::TRestoringMap& theMap)
+  throw(std::logic_error&)
 {
   SALOMEDS::Study_var aStudy = theSObject->GetStudy();
   VISU::Table_i* pTable = GetTable( aStudy, theMap );
@@ -854,8 +878,9 @@ void VISU::Container_i::ToStream( std::ostringstream& theStr )
 /*!
   Called from engine to restore container from the file
 */
-VISU::Storable* VISU::ContainerRestore(SALOMEDS::SObject_ptr theSObject, 
-                                      const string& thePrefix, const Storable::TRestoringMap& theMap)
+VISU::Storable* VISU::Container_i::Restore(SALOMEDS::SObject_ptr theSObject, 
+                                          const string& thePrefix, const Storable::TRestoringMap& theMap)
+  throw(std::logic_error&)
 {
   SALOMEDS::Study_var aStudy = theSObject->GetStudy();
   VISU::Container_i* pResent = new VISU::Container_i( aStudy );
@@ -865,7 +890,8 @@ VISU::Storable* VISU::ContainerRestore(SALOMEDS::SObject_ptr theSObject,
 //-------------------------------------------------------------
 //             Implementation of reading from file
 //-------------------------------------------------------------
-typedef vector<float> TValues;
+typedef double TValue;
+typedef vector<TValue> TValues;
 
 struct TRow{
   string myTitle;
@@ -888,7 +914,8 @@ struct TTable2D{
     if(myColumnUnits.size() != iEnd) myColumnUnits.resize(iEnd);
     int jEnd = myRows.size();
     for(int j = 0; j < jEnd; j++)
-      if(myRows[j].myValues.size() != iEnd) return 0;
+      if(myRows[j].myValues.size() != iEnd) 
+       return 0;
     return 1;
   }
   void getColumns(TTable2D& theTable2D) const {
@@ -928,12 +955,12 @@ int getLine(ifstream& theStmIn, QString& theString){
     if(tmp == '\n') break;
   }
   aStrOut<<ends;
-  auto_ptr<char> aRet(aStrOut.str());
-  theString = aRet.get();
+  theString = aStrOut.str();
   return !theStmIn.eof();
 }
 
 void ImportTables(const char* theFileName, TTableCont& theTableCont){
+  static int STRPRECISION = 12;
   ifstream aStmIn;
   QFileInfo aFileInfo(theFileName);
   if(!aFileInfo.isFile() || !aFileInfo.isReadable() || !aFileInfo.size()) return;
@@ -942,73 +969,75 @@ void ImportTables(const char* theFileName, TTableCont& theTableCont){
   do{
     //Find beginning of Table
     while(getLine(aStmIn,aTmp) && aTmp == "\n");
-    //cout<<"\n There is new Table2D with Title = ";
+    if(MYDEBUG) cout<<"\n There is new Table2D with Title = ";
     TTable2D aTable2D;
     while(!aStmIn.eof() && aTmp != "\n"){
       if(aTmp.find("#TITLE:") == 0){
        int aLen = aTmp.find(":") + 1;
        aTmp.remove(0,aLen);
        QString aTitle = aTmp.stripWhiteSpace();
-       aTable2D.myTitle = (const char*)aTitle;
-       //cout<<aTitle<<endl;
+       aTable2D.myTitle = aTitle.latin1();
+       if(MYDEBUG) cout<<aTitle<<endl;
       }else if(aTmp.find("#COLUMN_TITLES:") == 0){
        int aLen = aTmp.find(":") + 1;
        aTmp.remove(0,aLen);
        QStringList aStrList = QStringList::split("|",aTmp);
-       //cout<<"Its Column Titles : ";
+       if(MYDEBUG) cout<<"Its Column Titles : ";
        for(int i = 0; i < aStrList.count(); i++){
          aTmp = aStrList[i].stripWhiteSpace();
          aTable2D.myColumnTitles.push_back(aTmp.latin1());
-         //cout<<"\t"<<aTmp;
+         if(MYDEBUG) cout<<"\t"<<aTmp;
        }
-       //cout<<endl;
+       if(MYDEBUG) cout<<endl;
       }else if(aTmp.find("#COLUMN_UNITS:") == 0){
        int aLen = aTmp.find(":") + 1;
        aTmp.remove(0,aLen);
        QStringList aStrList = QStringList::split(" ",aTmp);
-       //cout<<"Its Column Units : ";
+       if(MYDEBUG) cout<<"Its Column Units : ";
        for(int i = 0; i < aStrList.count(); i++){
          aTmp = aStrList[i].stripWhiteSpace();
          aTable2D.myColumnUnits.push_back(aTmp.latin1());
-         //cout<<"\t"<<aTmp;
+         if(MYDEBUG) cout<<"\t"<<aTmp;
        }
-       //cout<<endl;
+       if(MYDEBUG) cout<<endl;
       }else if(aTmp.find("#") == 0){
        //It is a comment
       }else if(aTmp.find("#TITLE:") > 0){
        QStringList aStrList = QStringList::split("#TITLE:",aTmp);
        QString aTitle = aStrList[1].stripWhiteSpace();
        TRow aRow; 
-       aRow.myTitle = (const char*)aTitle;
-       //cout<<aTitle<<" : ";
+       aRow.myTitle = aTitle.latin1();
+       if(MYDEBUG) cout<<aTitle<<" : ";
        QStringList aValList = QStringList::split(" ",aStrList[0]);
        for(int i = 0; i < aValList.count(); i++){
          float aVal = aValList[i].toFloat();
          aRow.myValues.push_back(aVal);
-         //cout<<"\t"<<aVal;
+         if(MYDEBUG) cout<<"\t"<<aVal;
        }
        aTable2D.myRows.push_back(aRow);
-       //cout<<endl;
+       if(MYDEBUG) cout<<endl;
       }else{
-       QStringList aValList = QStringList::split(" ",aTmp);
-       TRow aRow; 
-       for(int i = 0; i < aValList.count(); i++){
-         float aVal = aValList[i].toFloat();
+       TRow aRow;
+       TValue aVal;
+       istrstream aStream(aTmp);
+       aStream.precision(STRPRECISION);
+       while(aStream>>aVal){
          aRow.myValues.push_back(aVal);
-         //cout<<"\t"<<aVal;
+         if(MYDEBUG) cout<<"\t"<<aVal;
        }
-       aTable2D.myRows.push_back(aRow);
-       //cout<<endl;
+       if(aRow.myValues.size() > 0)
+         aTable2D.myRows.push_back(aRow);
+       if(MYDEBUG) cout<<endl;
       }
       getLine(aStmIn,aTmp);
     }
     if(aTable2D.Check()){
-      //cout<<"aTable2D checked "<<aTable2D.myTitle<<endl;
+      if(MYDEBUG) cout<<"aTable2D checked "<<aTable2D.myTitle<<endl;
       theTableCont.push_back(aTable2D);
     }
   }while(!aStmIn.eof());
   aStmIn.close();
-  //cout<<"After close"<<endl;
+  if(MYDEBUG) cout<<"After close"<<endl;
 }
 
 SALOMEDS::SObject_var VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy){
@@ -1024,51 +1053,12 @@ SALOMEDS::SObject_var VISU::ImportTables(const char* theFileName, SALOMEDS::Stud
   QFileInfo aFileInfo(theFileName);
   aName->SetValue(aFileInfo.fileName().latin1());
   int iEnd = aTableCont.size();
-  /*
   for(int i = 0, iEnd = aTableCont.size(); i < iEnd; i++){
     const TTable2D& aTable2D = aTableCont[i];
     SALOMEDS::SObject_var aRealObject = aStudyBuilder->NewObject(aFileObject);
     anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeName");
     aName = SALOMEDS::AttributeName::_narrow(anAttr);
-    cout<<"aTable2D.myTitle = "<<aTable2D.myTitle<<endl;
-    if(aTable2D.myTitle != "")
-      aName->SetValue(aTable2D.myTitle.c_str());
-    else{
-      QString aNewName;
-      aNewName.sprintf("Table:%d",i);
-      aName->SetValue(aNewName.latin1());
-    }
-    anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeTableOfReal");
-    SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr);
-    aTableOfReal->SetTitle(aTable2D.myTitle.c_str());
-    const TRows& aRows = aTable2D.myRows;
-    //aTable2D.getColumns(aRows);
-    int kEnd = aRows[0].myValues.size();
-    aTableOfReal->SetNbColumns(kEnd);
-    for(int j = 0, jEnd = aRows.size(); j < jEnd; j++){
-      cout<<"j = "<<j<<endl;
-      const TRow& aRow = aRows[j];
-      SALOMEDS::DoubleSeq_var aDoubleSeq = new SALOMEDS::DoubleSeq();
-      int kEnd = aRow.myValues.size();
-      aDoubleSeq->length(kEnd);
-      cout<<"kEnd = "<<kEnd<<endl;
-      for(int k = 0; k < kEnd; k++) aDoubleSeq[k] = aRow.myValues[k];
-      aTableOfReal->AddRow(aDoubleSeq.in());
-      aTableOfReal->SetRowTitle(j+1,aRow.myTitle.c_str());
-      aTableOfReal->SetRowUnit(j+1,aRow.myUnit.c_str());
-    }
-    for(int k = 0; k < kEnd; k++){
-      aTableOfReal->SetColumnTitle(k+1,aTable2D.myColumnTitles[k].c_str());
-      //aTableOfReal->SetColumnUnit(k+1,aTable2D.myColumnUnits[k].c_str());
-    }
-  }
-  */
-  for(int i = 0, iEnd = aTableCont.size(); i < iEnd; i++){
-    const TTable2D& aTable2D = aTableCont[i];
-    SALOMEDS::SObject_var aRealObject = aStudyBuilder->NewObject(aFileObject);
-    anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeName");
-    aName = SALOMEDS::AttributeName::_narrow(anAttr);
-    //cout<<"aTable2D.myTitle = "<<aTable2D.myTitle<<endl;
+    if(MYDEBUG) cout<<"aTable2D.myTitle = "<<aTable2D.myTitle<<endl;
     if(aTable2D.myTitle != "")
       aName->SetValue(aTable2D.myTitle.c_str());
     else{
@@ -1084,19 +1074,17 @@ SALOMEDS::SObject_var VISU::ImportTables(const char* theFileName, SALOMEDS::Stud
     int kEnd = aNewTable2D.myRows[0].myValues.size();
     aTableOfReal->SetNbColumns(kEnd);
     for(int j = 0, jEnd = aNewTable2D.myRows.size(); j < jEnd; j++){
-      //cout<<"j = "<<j<<endl;
+      if(MYDEBUG) cout<<"j = "<<j<<endl;
       SALOMEDS::DoubleSeq_var aDoubleSeq = new SALOMEDS::DoubleSeq();
       aDoubleSeq->length(kEnd);
-      //cout<<"kEnd = "<<kEnd<<endl;
+      if(MYDEBUG) cout<<"kEnd = "<<kEnd<<endl;
       for(int k = 0; k < kEnd; k++) aDoubleSeq[k] = aNewTable2D.myRows[j].myValues[k];
       aTableOfReal->AddRow(aDoubleSeq.in());
       aTableOfReal->SetRowTitle(j+1,aNewTable2D.myRows[j].myTitle.c_str());
       aTableOfReal->SetRowUnit(j+1,aNewTable2D.myRows[j].myUnit.c_str());
     }
-    for(int k = 0; k < kEnd; k++){
+    for(int k = 0; k < kEnd; k++)
       aTableOfReal->SetColumnTitle(k+1,aNewTable2D.myColumnTitles[k].c_str());
-      //aTableOfReal->SetColumnUnit(k+1,aTable2D.myColumnUnits[k].c_str());
-    }
   }
   return aFileObject;
 }
index 5863cf2880b60ff56c557b22c8ac567aff18eb57..2618e5cee49b74586b4a0a7e8ef180c33230bfad 100644 (file)
@@ -1,5 +1,23 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
 //  File   : VISU_Table_i.hh
 #define VISU_Table_i_HeaderFile
 
 #include "VISU_PrsObject_i.hh"
-#include <qstringlist.h>
 #include "Plot2d_Curve.h"
 
+#include <qstringlist.h>
+
 namespace VISU{
   //==============================================================================
   class Table_i : public virtual POA_VISU::Table,
@@ -47,6 +66,9 @@ namespace VISU{
     virtual Storable* Create();
     virtual Storable* Restore( const Storable::TRestoringMap& theMap )
       throw(std::logic_error&);
+    static Storable* Restore(SALOMEDS::SObject_ptr theSObject, 
+                            const string& thePrefix, const Storable::TRestoringMap& theMap)
+      throw(std::logic_error&);
     virtual void ToStream( std::ostringstream& theStr );
     static const string myComment;
     virtual const char* GetComment() const;
@@ -55,8 +77,6 @@ namespace VISU{
 
     virtual char* GetObjectEntry() { return CORBA::string_dup( myObjectEntry.c_str() ); }
   };
-  Storable* TableRestore(SALOMEDS::SObject_ptr theSObject, 
-                        const string& thePrefix, const Storable::TRestoringMap& theMap);
   SALOMEDS::SObject_var ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy);
 
   //==============================================================================
@@ -103,6 +123,9 @@ namespace VISU{
     virtual Storable* Create();
     virtual Storable* Restore( const Storable::TRestoringMap& theMap )
       throw(std::logic_error&);
+    static Storable* Restore(SALOMEDS::SObject_ptr theSObject, 
+                            const string& thePrefix, const Storable::TRestoringMap& theMap)
+      throw(std::logic_error&);
     virtual void ToStream( std::ostringstream& theStr );
     static const string myComment;
     virtual const char* GetComment() const;
@@ -119,8 +142,6 @@ namespace VISU{
 
     virtual Plot2d_Curve* CreatePresentation();
   };
-  Storable* CurveRestore(SALOMEDS::SObject_ptr theSObject, 
-                        const string& thePrefix, const Storable::TRestoringMap& theMap);
 
   //==============================================================================
   class Container_i : public virtual POA_VISU::Container,
@@ -150,6 +171,9 @@ namespace VISU{
     virtual Storable* Create();
     virtual Storable* Restore( const Storable::TRestoringMap& theMap )
       throw(std::logic_error&);
+    static Storable* Restore(SALOMEDS::SObject_ptr theSObject, 
+                            const string& thePrefix, const Storable::TRestoringMap& theMap)
+      throw(std::logic_error&);
     virtual void ToStream( std::ostringstream& theStr );
     static const string myComment;
     virtual const char* GetComment() const;
@@ -159,9 +183,7 @@ namespace VISU{
     VISU::Curve_i* GetCurve( CORBA::Long theIndex );
 
   };
-  Storable* ContainerRestore(SALOMEDS::SObject_ptr theSObject, 
-                            const string& thePrefix, const Storable::TRestoringMap& theMap);
 }
-#endif // (#ifndef VISU_Table_i_HeaderFile)
+#endif
 
 
index d5f4cc64cfe6ba8233d36399fc12699f6092d736..49cd78fa76eb117bf31e41bafaeec42d35c9095a 100644 (file)
@@ -7,7 +7,25 @@
 //  Module : VISU
 
 #include "VISU_TimeAnimation.h"
+#include "VISU_Result_i.hh"
+#include "VISU_Prs3d_i.hh"
+#include "VISU_Mesh_i.hh"
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_IsoSurfaces_i.hh"
+#include "VISU_DeformedShape_i.hh"
+#include "VISU_CutPlanes_i.hh"
+#include "VISU_CutLines_i.hh"
+#include "VISU_Vectors_i.hh"
+#include "VISU_StreamLines_i.hh"
+#include "VISU_ViewManager_i.hh"
 #include "VISU_ScalarBarActor.hxx"
+#include "VISU_Actor.h"
+
+#include "VTKViewer_ViewFrame.h"
+
+#include "QAD_Config.h"
+
+using namespace std;
 
 //QWaitCondition myCondition;
 static int MYDELAY = 1;
@@ -136,7 +154,7 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) {
     QString aMeshName = VISU::Storable::FindValue(aTimeMap,"myMeshName"); 
     VISU::Entity anEntity = (VISU::Entity) VISU::Storable::FindValue(aTimeMap,"myEntityId").toInt(); 
     QString aFieldName = VISU::Storable::FindValue(aTimeMap,"myFieldName"); 
-    double aTimeStampId = VISU::Storable::FindValue(aTimeMap,"myTimeStampId").toDouble(); 
+    int aTimeStampId = VISU::Storable::FindValue(aTimeMap,"myTimeStampId").toInt(); 
     
     switch (aData.myPrsType) {
     case VISU::TSCALARMAP: // ScalarMap
@@ -186,7 +204,7 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) {
     case VISU::TVECTORS: // Vectors
       {
        VISU::Vectors_i* aPresent = new VISU::Vectors_i(pResult, false);
-       aPresent->Create(aMeshName.latin1(), anEntity, 
+       aPresent->Create(aMeshName.latin1(), anEntity,  
                         aFieldName.latin1(), aTimeStampId);
        //VISU::Vectors_var aTmp = aPresent->_this();
        //aPresent->_remove_ref();
@@ -210,8 +228,11 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) {
     i++;
   }
   aData.myNbFrames = i;
-  for (i = 0; i < aData.myNbFrames; i++) 
-    aData.myPrs[i]->SetRange(aMin, aMax);
+  QString aFixRange = QAD_CONFIG->getSetting("Visu:SBImposeRange");
+  if (aFixRange.compare("true") != 0) {
+    for (i = 0; i < aData.myNbFrames; i++) 
+      aData.myPrs[i]->SetRange(aMin, aMax);
+  }
 }
 
 
@@ -230,17 +251,17 @@ CORBA::Boolean VISU_TimeAnimation::generateFrames() {
     FieldData& aData = myFieldsLst[i];
     aData.myActors = (VISU_Actor**) malloc(aData.myNbFrames * sizeof(VISU_Actor*));
     for (long j = 0; j < aData.myNbFrames; j++) {
-      VISU_Actor* aActor = aData.myPrs[j]->CreateActor();
-      if (aActor == NULL) {
-       aNoError = false;
-       aActor = 0;
-       myLastError += QString("%1 ").arg(aData.myTiming[j]);
-      } else {
+      VISU_Actor* aActor = NULL;
+      try{
+       aActor = aData.myPrs[j]->CreateActor();
        myView->AddActor(aActor);
-       if (j == 0) {
+       if(j == 0)
          aActor->VisibilityOn();
-       else
+       else
          aActor->VisibilityOff();
+      }catch(std::runtime_error& exc){
+       aNoError = false;
+       myLastError += QString("%1 ").arg(aData.myTiming[j]);
       }
       aData.myActors[j] = aActor;
     }
index 34af55dc94683209d6a9f84cd87340ba8c63e008..0331f2f773b52e8bd94c2f763a7c31aa44330f74 100644 (file)
@@ -9,14 +9,19 @@
 #ifndef VISU_TIMEANIMATION_H
 #define VISU_TIMEANIMATION_H
 
+#include "VISUConfig.hh"
+
+class VTKViewer_ViewFrame;
+class VISU_Actor;
+
 #include <qobject.h>
 #include <qvaluelist.h>
 #include <qthread.h>
-#include "VISU_Actor.h"
-#include "VISU_PrsObject_i.hh"
-#include "VISU_ViewManager_i.hh"
-#include "VTKViewer_ViewFrame.h"
 
+namespace VISU{
+  class Result_i;
+  class ScalarMap_i;
+}
 
 struct FieldData
 {
index f93106df75988359da56207404875a65cfe781c1..1035f51fbacc903f6230498966482ff7f912a986 100644 (file)
@@ -1,14 +1,44 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
-//  File   : VISU_ViewManager_i.cxx
+//  File   : VISU_ViewManager_i.cc
 //  Author : Alexey PETROV
 //  Module : VISU
 
-using namespace std;
 #include "VISU_ViewManager_i.hh"
+
 #include "VISU_PrsObject_i.hh"
+#include "VISU_Result_i.hh"
+
+#include "VISU_Prs3d_i.hh"
+#include "VISU_Mesh_i.hh"
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_IsoSurfaces_i.hh"
+#include "VISU_DeformedShape_i.hh"
+#include "VISU_CutPlanes_i.hh"
+#include "VISU_CutLines_i.hh"
+#include "VISU_Vectors_i.hh"
+#include "VISU_StreamLines_i.hh"
+
 #include "VISU_Table_i.hh"
 #include "VISU_ScalarBarActor.hxx"
 #include "VISU_Actor.h"
@@ -19,24 +49,25 @@ using namespace std;
 #include "QAD_Study.h"
 #include "QAD_RightFrame.h"
 #include "QAD_StudyFrame.h"
-#include <qstring.h>
-#include <qfileinfo.h>
 
+#include "VTKViewer_ViewFrame.h"
 #include "SALOMEGUI_TableDlg.h"
 #include "Plot2d_CurveContainer.h"
 #include "Plot2d_ViewFrame.h"
-//#include "SALOMEGUI_SetupCurveDlg.h"
-//#include "SALOMEGUI_SetupPlot2dDlg.h"
 
-#include "VTKViewer_ViewFrame.h"
+#include <memory>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+
 #include <vtkTransformPolyDataFilter.h>
 #include <vtkDataSetMapper.h>
 #include <vtkRenderer.h>
 #include <vtkCamera.h>
 
-#include <memory>
+using namespace std;
 
-#ifdef DEBUG
+#ifdef _DEBUG_
 static int MYDEBUG = 0;
 #else
 static int MYDEBUG = 0;
@@ -72,7 +103,7 @@ namespace VISU{
     for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL;){
       if(anActor->IsA("VISU_Actor")){ 
        anVISUActor = VISU_Actor::SafeDownCast(anActor);
-       if (thePrs == anVISUActor->getPrs3d()) {
+       if (thePrs == anVISUActor->GetPrs3d()) {
          aResActor = anVISUActor->GetParent();
          if(theDisplaing < eErase)
            aResActor->VisibilityOn();
@@ -91,11 +122,11 @@ namespace VISU{
       return aResActor;
     }
     if(thePrs != NULL && theDisplaing < eErase){
-      anVISUActor = thePrs->CreateActor();
-      if(anVISUActor)
+      try{
+       anVISUActor = thePrs->CreateActor();
        vf->AddActor(anVISUActor);
-      else{
-       MESSAGE ("Null actor is created");
+      }catch(std::runtime_error& exc){
+       INFOS("Null actor is created");
        return NULL;
       }
     }
@@ -289,6 +320,20 @@ namespace VISU{
       return;
     }
   }
+
+
+  void ViewManager_i::ProcessEvents() {
+    while (true) {
+      qApp->lock();
+      qApp->syncX();
+      qApp->flushX(); 
+      qApp->processEvents();
+      qApp->unlock();
+      //sleep(1);
+    }
+  }
+
+
   //===========================================================================
   View_i::View_i(SALOMEDS::Study_ptr theStudy) {
     if(MYDEBUG) MESSAGE("View_i::View_i");
@@ -348,7 +393,7 @@ namespace VISU{
   void XYPlot_i::Update() {
     if(MYDEBUG) MESSAGE("XYPlot_i::Update");
     Mutex mt(myMutex,qApp,MYDELAY);
-    myName = myStudyFrame->title();
+    myName = (const char*)(myStudyFrame->title());
     myView->Repaint();
   }
   void XYPlot_i::Close(){
@@ -767,7 +812,7 @@ namespace VISU{
     vtkActor *actor;
     while(actor = theActors->GetNextActor()){
       if(VISU_Actor* anActor = dynamic_cast<VISU_Actor*>(actor)){
-       VISU::Prs3d_i* aPrs3d  = anActor->getPrs3d();
+       VISU::Prs3d_i* aPrs3d  = anActor->GetPrs3d();
        if(anActor->GetVisibility() && aPrs3d){
          aPrs3d->Update();
          aPrs3d->UpdateActor(anActor);
index 0ba521676d033b0b7f20d95f8afe534420c7db4c..9463e7542aded12f9c97d891445886c4821a6696 100644 (file)
@@ -1,8 +1,26 @@
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//  VISU OBJECT : interactive object for VISU entities implementation
 //
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
 //
 //
-//  File   : VISU_ViewManager_i.hxx
+//  File   : VISU_ViewManager_i.hh
 //  Author : Alexey PETROV
 //  Module : VISU
 
 #define VISU_ViewManager_i_HeaderFile
 
 #include "VISUConfig.hh"
+
 class QAD_Study;
 class QAD_StudyFrame;
+
 class VTKViewer_ViewFrame;
-class Plot2d_ViewFrame;
 class SALOMEGUI_TableDlg;
+class Plot2d_ViewFrame;
+
 class VISU_Actor;
+
 class vtkRenderer;
 class vtkCamera;
 
@@ -34,6 +56,7 @@ namespace VISU{
     virtual TableView_ptr CreateTableView(VISU::Table_ptr theTable);
     virtual XYPlot_ptr CreateXYPlot();
     virtual void Destroy(View_ptr theView);
+    virtual void ProcessEvents();
 
   protected:
     SALOMEDS::Study_var myStudyDocument;
index 8c99d8cabda5455e581d2031798d02075590ad09..85f7c17d11509370894a4e29bb74c0cd836aca9a 100644 (file)
@@ -37,17 +37,20 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 # Libraries targets
 
 LIB = libVISU_Swigcmodule.la 
-LIB_SRC =
+LIB_SRC = VISU_Gen_s.cc
+SWIG_FLAGS += 
 
-#SWIG_DEF = libVisuGUI_Swig.i
-#EXPORT_PYSCRIPTS = libVisuGUI_Swig.py visu.py visu_view3d.py batchmode_visu.py
-EXPORT_PYSCRIPTS = batchmode_visu.py batchmode_visu_table.py batchmode_visu_view3d.py \
+SWIG_DEF = libVISU_Swig.i
+EXPORT_PYSCRIPTS = libVISU_Swig.py batchmode_visu.py batchmode_visu_table.py batchmode_visu_view3d.py \
        visu_med.py visu_view3d.py visu.py visu_gui.py visu_prs_example.py\
-       visu_table.py visu_big_table.py visu_view.py
+       visu_table.py visu_big_table.py visu_view.py \
+       visu_swig_test.py
 
 LIB_CLIENT_IDL = 
 
-CPPFLAGS += $(PYTHON_INCLUDES)  -DHAVE_CONFIG_H
-LDFLAGS += $(PYTHON_LIBS) -lVISUGUI
+CPPFLAGS += -ftemplate-depth-32 $(PYTHON_INCLUDES) $(QT_INCLUDES) \
+       $(VTK_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES)
+LDFLAGS += $(PYTHON_LIBS) -lVisuConvertor -lVisuPipeLine
 
 @CONCLUDE@
index a63e63508dd98a9bc2c4e856be05fa3f1db35f4a..559a3eb448664431ec4703ac1f9fd93433138526 100644 (file)
@@ -13,3 +13,64 @@ import visu
 myVisu = visu.Initialize(orb,naming_service,lcc,myStudyManager,myStudy,10)
 if myVisu is None:
     raise RuntimeError, "myVisu is none, VISU component is not loaded  or found"
+
+def try_mesh_parameters(theMeshPattern):
+    aResult = []
+    if theMeshPattern is None : return aResult ;
+    theMeshPattern =  theMeshPattern._narrow(VISU.Mesh)
+    if theMeshPattern is None : return aResult ;
+
+    aTYPES = [VISU.POINT, VISU.WIREFRAME, VISU.SHADED, VISU.INSIDEFRAME, VISU.SHRINK]
+    import copy; import os;
+    for ind in aTYPES:
+        aNewMesh = copy.deepcopy(theMeshPattern);
+        aNewMesh.SetPresentationType(ind)
+        aResult.append(aNewMesh)
+
+    return aResult
+    
+def try_scalarmap_parameters(thePattern, theNum):
+    aList = []
+    if thePattern  is None : return aList 
+    thePattern =  thePattern._narrow(VISU.ScalarMap)
+    if thePattern  is None : return aList 
+    SCALING = [VISU.LINEAR, VISU.LOGARITHMIC]
+    import copy
+    import random
+    for ind in range(0,theNum):
+        anObj = copy.deepcopy(thePattern);
+        if ind%2 :
+            #try incorrect value deliberately (but allowed by idl description)
+            #try SetScalarMode(long)
+            mode = random.randint(-100000,100000); #incorrect value deliberately
+        else:
+            #correct value of ScalarMode
+            mode = random.randint(0, 3)
+
+        print "\tSetScalarMode(" + str(mode) +")"
+        anObj.SetScalarMode(mode)
+
+        # --- SCALING ---
+        scal = random.randint(0,1)
+        print "\tSetScaling(" + str(SCALING[scal]) +")"
+        anObj.SetScaling(SCALING[scal])
+        
+        # --- BOUNDARIES ---
+        if ind%2 :
+            alfa =  random.random()*random.randint(-100000,100000)
+            betta = random.random()*random.randint(-100000,100000)
+            aMin = alfa; aMax = betta
+        else:
+            #more correct set
+            aPMin = thePattern.GetMin()
+            aPMax = thePattern.GetMax()
+            aLen = aPMax - aPMin
+            alfa =  random.random()%0.5
+            betta = random.random()%0.5
+            aMin = alfa*aLen*random.randint(-1,1) + aPMin
+            aMax = betta*aLen*random.randint(-1,1) + aPMax
+        print "\tSetRange(" + str(aMin) + ", " + str(aMax) + ")"
+        anObj.SetRange(aMin, aMax)
+        aList.append(anObj) 
+       
+    return aList
index 21468ec0f67b713d3fc12ddae22e48c04c43a7d7..47396189701d96b73484a7bb989e4c529180ab89 100644 (file)
@@ -24,7 +24,7 @@ myFieldName = "VITESSE";
 #medFile = "brideResultats.dat"
 #myFieldName = "VM_Elem.";
 
-medFile = os.getenv('SALOME_ROOT_DIR') + '/../SALOME_ROOT/data/' + medFile
+medFile = os.getenv('SALOME_ROOT_DIR') + '/data/' + medFile
 myResult = myVisu.ImportFile(medFile)
 
 
index ee17ad917a30b4841afb61c12ee41258d376c555..1f9a4de79a811b50957e926adf6ca86cfca54857 100644 (file)
 //  $Header$
 
 %module libVISU_Swig
+%{
+#include "VISU_Gen_s.hh"
+%}
 
-//%include "VisuGUI_Swig.i"
+
+class Convertor{
+public:
+  Convertor(){};
+  Convertor(const char* theFileName);
+};
+
+
+class ScalarMap{
+public:
+  ScalarMap(){};
+  ScalarMap(Convertor* theConvertor, const char* theMeshName, int theEntity, 
+            const char* theFieldName, int theIteration);
+};
+
+class View3D{
+public:
+  View3D();
+  void Display(ScalarMap* theScalarMap);
+  void SetPosition(int theX, int theY);
+};
\ No newline at end of file
index b991d2175237065484c67e5cfa89c509963d7bf1..b36b04e621575f2bb09765aa7926f9adbe05e2a8 100644 (file)
@@ -11,6 +11,11 @@ import os
 import re
 from time import sleep
 
+# NRI : temporary added because interface is declared into Engines module.
+import MED_idl
+import Med_Gen_idl
+#
+
 import VISU
 import SALOME
 import SALOMEDS
@@ -271,6 +276,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
             anAttr = aMeshSObj.FindAttribute("AttributeName")[1]
         anAttr = anAttr._narrow(SALOMEDS.AttributeName);
         aMeshName = anAttr.Value()
+        aMeshNamePic = re.sub(".","_",aMeshName)
         print "  ", aMeshName
         
         aFolderIter = myLocalStudy.NewChildIterator(aMeshSObj);
@@ -306,13 +312,13 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                         anEntityId = "3"
 
                     if HasValue(thePrsTypeList,VISU.TMESH) :
-                        print "      ", anEntityName,
+                        print "      ", anEntityName, aMeshName,
                         aMesh = theVisu.MeshOnEntity(theResult,aMeshName,anEntity)
                         if aMesh is None : print "Error"
                         else : print ",OK"
                         theView.DisplayOnly(aMesh)
                         theView.FitAll()
-                        aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "." + thePictureExt
+                        aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "." + thePictureExt
                         aPictureName = re.sub("\s+","_", aPictureName);
                         theView.SavePicture(aPictureName)
                         aVISUObjList.append(aMesh)
@@ -331,7 +337,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                 else : print ",OK"
                                 theView.DisplayOnly(aMesh)
                                 theView.FitAll()
-                                aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + anFamilyName + "." + thePictureExt
+                                aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + anFamilyName + "." + thePictureExt
                                 aPictureName = re.sub("\s+","_", aPictureName);
                                 theView.SavePicture(aPictureName)
                                 aVISUObjList.append(aMesh)
@@ -351,7 +357,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                         else : print ",OK"
                         theView.DisplayOnly(aMesh)
                         theView.FitAll()
-                        aPictureName = thePictureDir + aMeshName + "_" + aGroupName + "." + thePictureExt
+                        aPictureName = thePictureDir + aMeshNamePic + "_" + aGroupName + "." + thePictureExt
                         aPictureName = re.sub("\s+","_", aPictureName);
                         theView.SavePicture(aPictureName)
                         aVISUObjList.append(aMesh)
@@ -399,7 +405,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                 else : print ",OK"
                                 theView.DisplayOnly(aPrsObj)
                                 theView.FitAll()
-                                aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSCALARMAP." + thePictureExt
+                                aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSCALARMAP." + thePictureExt
                                 aPictureName = re.sub("\s+","_", aPictureName);
                                 theView.SavePicture(aPictureName)
                                 aVISUObjList.append(aPrsObj)
@@ -411,7 +417,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                 else : print ",OK"
                                 theView.DisplayOnly(aPrsObj)
                                 theView.FitAll()
-                                aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TISOSURFACE." + thePictureExt
+                                aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TISOSURFACE." + thePictureExt
                                 aPictureName = re.sub("\s+","_", aPictureName);
                                 theView.SavePicture(aPictureName)
                                 aVISUObjList.append(aPrsObj)
@@ -424,7 +430,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                 aPrsObj.SetOrientationType(VISU.CutPlanes.ZX)
                                 theView.DisplayOnly(aPrsObj)
                                 theView.FitAll()
-                                aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTPLANES." + thePictureExt
+                                aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTPLANES." + thePictureExt
                                 aPictureName = re.sub("\s+","_", aPictureName)
                                 theView.SavePicture(aPictureName)
                                 aVISUObjList.append(aPrsObj)
@@ -438,7 +444,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                 aPrsObj.SetOrientationType2(VISU.CutPlanes.ZX)
                                 theView.DisplayOnly(aPrsObj)
                                 theView.FitAll()
-                                aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTLINES." + thePictureExt
+                                aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTLINES." + thePictureExt
                                 aPictureName = re.sub("\s+","_", aPictureName)
                                 theView.SavePicture(aPictureName)
                                 aVISUObjList.append(aPrsObj)
@@ -452,19 +458,19 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                     else : print ",OK"
                                     theView.DisplayOnly(aPrsObj)
                                     theView.FitAll()
-                                    aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TDEFORMEDSHAPE." + thePictureExt
+                                    aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TDEFORMEDSHAPE." + thePictureExt
                                     aPictureName = re.sub("\s+","_", aPictureName)
                                     theView.SavePicture(aPictureName)
                                     aVISUObjList.append(aPrsObj)
 
                                 if HasValue(thePrsTypeList,VISU.TVECTORS) :
                                     print "          Creating VectorsOnField",
-                                    aPrsObj = theVisu.VectorsOnField(theResult,aMeshName,anEntity,aFieldName,aTimeStampId)
+                                    aPrsObj = theVisu.VectorsOnField(theResult,aMeshNamePic,anEntity,aFieldName,aTimeStampId)
                                     if aPrsObj is None : print "Error"
                                     else : print ",OK"
                                     theView.DisplayOnly(aPrsObj)
                                     theView.FitAll()
-                                    aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TVECTORS." + thePictureExt
+                                    aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TVECTORS." + thePictureExt
                                     aPictureName = re.sub("\s+","_", aPictureName)
                                     theView.SavePicture(aPictureName)
                                     aVISUObjList.append(aPrsObj)
@@ -476,7 +482,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi
                                     else : print ",OK"
                                     theView.DisplayOnly(aPrsObj)
                                     theView.FitAll()
-                                    aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSTREAMLINES." + thePictureExt
+                                    aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSTREAMLINES." + thePictureExt
                                     aPictureName = re.sub("\s+","_", aPictureName)
                                     theView.SavePicture(aPictureName)
                                     aVISUObjList.append(aPrsObj)
@@ -491,3 +497,340 @@ def generateName(prefix = None):
         return "Study" + str(int)
     else :
         return prefix + str(int)
+    
+
+
+# ----------------------
+# MESH
+# ----------------------
+def try_mesh_parameters(theMeshPattern):
+    aResult = []
+    if theMeshPattern is None : return aResult ;
+    theMeshPattern =  theMeshPattern._narrow(VISU.Mesh)
+    if theMeshPattern is None : return aResult ;
+
+    aTYPES = [VISU.POINT, VISU.WIREFRAME, VISU.SHADED, VISU.INSIDEFRAME, VISU.SHRINK]
+    import copy; import os;
+    for ind in aTYPES:
+        aNewMesh = copy.deepcopy(theMeshPattern);
+        aNewMesh.SetPresentationType(ind)
+        aResult.append(aNewMesh)
+
+    return aResult
+
+
+# ----------------------------    
+# SCALAR MAP 
+# ----------------------------    
+ind=1  #try safe way
+def try_scalarmap_parameters(thePattern, dump = 0):
+
+    if thePattern  is None : return None 
+
+    SCALING = [VISU.LINEAR, VISU.LOGARITHMIC]
+    import copy
+    import random
+
+    anObj = thePattern#copy.deepcopy(thePattern);
+    #ind = random.randint(1,2)
+    if ind%2 :
+            #try incorrect value deliberately (but allowed by idl description)
+            #try SetScalarMode(long)
+            mode = random.randint(-100000,100000); #incorrect value deliberately
+    else:
+            #correct value of ScalarMode
+            mode = random.randint(0, 3)
+
+    if dump : print "\tSetScalarMode(" + str(mode) +")"
+    anObj.SetScalarMode(mode)
+
+    # --- SCALING ---
+    scal = random.randint(0,1)
+    if dump : print "\tSetScaling(" + str(SCALING[scal]) +")"
+    anObj.SetScaling(SCALING[scal])
+        
+    # --- BOUNDARIES ---
+    if ind%2 :
+            alfa =  random.random()*random.randint(-100000,100000)
+            betta = random.random()*random.randint(-100000,100000)
+            aMin = alfa; aMax = betta
+    else:
+            #more correct set
+            aPMin = thePattern.GetMin()
+            aPMax = thePattern.GetMax()
+            aLen = aPMax - aPMin
+            alfa =  random.random()%0.5
+            betta = random.random()%0.5
+            aMin = alfa*aLen*random.randint(-1,1) + aPMin
+            aMax = betta*aLen*random.randint(-1,1) + aPMax
+    if dump : print "\tSetRange(" + str(aMin) + ", " + str(aMax) + ")"
+    anObj.SetRange(aMin, aMax)
+
+        # --- POSITION ---
+    if ind%2:
+            X=random.random()*random.randint(-100000,100000)
+            Y=random.random()*random.randint(-100000,100000)
+    else :
+             X=random.random()
+             Y=random.random()
+    if dump : print "SetPosition("+ str(X) + ", " + str(Y) + " )"
+    anObj.SetPosition(X, Y)
+
+        # --- SCALAR BAR SIZE ---
+    if ind%2:
+            aWidth=random.random()*random.randint(-100000,100000)
+            aHeight=random.random()*random.randint(-100000,100000)
+    else :
+             aWidth=random.random()
+             aHeight=random.random()
+    if dump : print " SCALAR BAR Width = " + str(aWidth) + " Height = ", str(aHeight)
+    anObj.SetSize(aWidth, aHeight)
+    
+    return anObj
+
+
+def dump_scalarmap_parameters(anObj):
+    
+    print "\tGetScalarMode() = " + str(anObj.GetScalarMode()) 
+    print "\tGetScaling() = " + str(anObj.GetScaling()) 
+    print "\tGetMin() = " + str(anObj.GetMin()) + "  GetMax() = " + str (anObj.GetMax())
+    print "\tGetOrientation() = " + str(anObj.GetOrientation())
+    print "\tGetPosX() = ", str(anObj.GetPosX()) + "  GetPosY() = ", str(anObj.GetPosY())
+    print "\tGetWidth() = ", str ( anObj.GetWidth()) + "  GetHeight() = " + str(anObj.GetHeight())
+
+# ----------------------
+# DEFORMED SHAPE
+# ----------------------
+def try_deformedshape_parameters(thePattern) :
+
+    if thePattern  is None : return None 
+    import copy
+    import random
+
+    anObj = try_scalarmap_parameters(thePattern)
+
+    # --- SCALING ---
+    if ind%2:
+        anObj.SetScale( random.random()*random.randint(-100000, 100000))
+    else :
+        anObj.SetScale( anObj.GetScale()*random.random())
+
+    return anObj
+
+
+def dump_deformedshape_parameters(theObject):
+    dump_scalarmap_parameters(theObject)
+    print "GetScale() = ", theObject.GetScale()
+    
+# ----------------------
+# CUT PLANES
+# ----------------------
+def try_cutplanes_parameters(thePattern) :
+
+    if thePattern  is None : return aList 
+    import copy
+    import random
+
+    ORIENT = [VISU.CutPlanes.XY, VISU.CutPlanes.YZ, VISU.CutPlanes.ZX]
+
+    ind = random.randint(1,2)
+    anObj = try_scalarmap_parameters(thePattern)
+        
+    # --- ORIENTATION ---
+    anObj.SetOrientationType(ORIENT[random.randint(0,2)])
+
+    # --- NUMBER OF PLANES ---
+    if ind%2 :   anObj.SetNbPlanes(random.randint(-40,40))
+    else :       anObj.SetNbPlanes(random.randint(0,10)) #try behaivor if NbPlanes=0
+
+    # --- DISPLACEMENT ---
+    anObj.SetDisplacement(random.randint(-100000,100000))
+
+    # --- PLANE POSITION ---
+    if ind%2:
+        PlaneNb = random.randint(-100000,100000) #incorrect value is possible
+    else    : PlaneNb = random.randint(0, anObj.GetNbPlanes())
+        
+    anObj.SetPlanePosition(PlaneNb, random.random()*random.randint(-100000,100000))
+
+    # --- SET DEFAULT ---
+    anObj.SetDefault(PlaneNb)
+
+    # --- SET X,Y,Z ROTATION ---
+    if ind%2 :
+            angle1 = random.random()*random.randint(-100000,100000)
+            angle2 = random.random()*random.randint(-100000,100000)
+    else :
+            angle1 = random.random()*3.14
+            angle2 = random.random()*3.14
+        
+    anObj.SetRotateX(angle1)
+    anObj.SetRotateY(angle2)
+
+    return anObj
+        
+def dump_cutplanes_parameters(theObject):
+        dump_saclarmap_parameters(theObject)
+
+        print "GetOrientationType = " + str(theObject.GetOrientationType())
+        PlanesNb = theObject.GetNbPlanes()
+        print "GetNbPlanes() = ", str(PlanesNb)
+        for i in range(0,PlanesNb+1):
+            if theObject.IsDefault(i) :
+                print "Default plane : "+str(i); break
+        print "GetPlanePosition(" + str(i) + ") = ", theObject.GetPlanePosition(i)
+        print "GetDisplacement() = ", str(theObject.GetDisplacement())
+        print "GetRotateX() = ", str(theObject.GetRotateX())
+        print "GetRotateY() = ", str(theObject.GetRotateY())
+        print "GetRotateZ() = ", str(theObject.GetRotateZ())
+
+# ----------------------
+# CUT LINES
+# ----------------------
+def try_cutlines_parameters(thePattern):
+
+    if thePattern  is None : return None 
+    import copy
+    import random
+
+    ORIENT = [VISU.CutPlanes.XY, VISU.CutPlanes.YZ, VISU.CutPlanes.ZX]
+    ind = random.randint(1,2)
+    anObj = try_scalarmap_parameters(thePattern)
+
+    # --- ORIENTATION ---
+    anObj.SetOrientationType(ORIENT[random.randint(0,2)])
+    anObj.SetOrientationType2(ORIENT[random.randint(0,2)])
+
+    # --- Base Plane Position ---
+    anObj.SetBasePlanePosition( random.random()*random.randint(-100000,100000))
+
+    # --- NUMBER OF LINES ---
+    if ind%2:
+            anObj.SetNbLines(random.randint(-5, 50))
+
+    # --- ROTATION ---
+    anObj.SetRotateX(random.randint(-100,100)*random.random())
+    anObj.SetRotateX2(random.randint(-100,100)*random.random())
+    anObj.SetRotateY(random.randint(-100,100)*random.random())
+    anObj.SetRotateY2(random.randint(-100,100)*random.random())
+
+    return anObj
+
+def dump_cutlines_parameters(theObject):
+    dump_scalarmap_parameters(theObject)
+
+    print "GetOrientationType() = " + str(theObject.GetOrientationType())
+    print "GetOrientationType2() = " + str(theObject.GetOrientationType2())
+    print "GetBasePlanePosition() = "+ str(theObject.GetBasePlanePosition())
+    print "GetNbLines() = " + str(theObject.GetNbLines())
+    print "GetRotateX() = ", str(theObject.GetRotateX())
+    print "GetRotateX2() = ", str(theObject.GetRotateX2())
+    print "GetRotateY() = ", str(theObject.GetRotateY())
+    print "GetRotateY2() = ", str(theObject.GetRotateY2())
+
+# ----------------------
+# STREAM LINES
+# ----------------------
+def try_streamlines_parameters(thePattern):
+
+    if thePattern  is None : return None 
+    import copy
+    import random
+
+    DIRECTION = [VISU.StreamLines.FORWARD, VISU.StreamLines.BACKWARD, VISU.StreamLines.BOTH]
+
+    ind = random.randint(1,2)
+    anObj = (try_deformedshape_parameters(thePattern))[0]
+
+    # --- DIREACTION ---
+    anObj.SetDirection(DIRECTION[random.randint(0,2)])
+
+    # --- STEP LENGTH ---
+    if ind%2 : anObj.SetStepLength(random.random()*random.randint(-1000,1000))
+    else :
+            aLen = anObj.GetMax() - anObj.GetMin()
+            anObj.SetStepLength(aLen/random.randint(1,100))
+            
+    # --- PROPAGATION TIME ---
+    anObj.SetPropagationTime(random.random()*random.randint(1,100))
+
+    # --- INTEGRATION STEP ---
+    if ind%2 :
+            anObj.SetIntegrationStep(random.random()*random.randint(-1000,1000))
+    else:
+            anObj.SetIntegrationStep(random.random())
+
+    # --- USED POINT ---
+    anObj.SetUsedPoints(random.random()*random.randint(-10000,10000))
+
+    return anObj
+        
+def dump_streamlines_parameters(theObject):
+    
+    dump_deformedshape_parameters(theObject)
+    
+    print "GetDirection() = "      + str(theObject.GetDirection())
+    print "GetStepLength() = "     + str(theObject.GetStepLength())
+    print "GetPropagationTime() =" + str(theObject.GetPropagationTime())
+    print "GetIntegrationStep() =" + str(theObject.GetIntegrationStep())
+    print "GetUsedPoints()      =" + str(theObject.GetUsedPoints())
+    
+# ----------------------
+# VECTORS     
+# ----------------------
+def try_vectors_parameters(thePattern, theNum):
+
+    if thePattern  is None : return None 
+    import copy
+    import random
+    GLIPH_TYPE = [VISU.Vectors.ARROW, VISU.Vectors.CONE2, VISU.Vectors.CONE6, VISU.Vectors.NONE]
+    GLIPH_POS = [VISU.Vectors.CENTER, VISU.Vectors.TAIL, VISU.Vectors.HEAD]
+    ind = random.randint(1,2)
+    anObj = (try_deformedshape_parameters(thePattern))[0]
+
+    # --- LINE WIDTH ---
+    if ind%2 :
+            anObj.SetLineWidth(random.random()*random.randint(-10000,10000))
+    else :
+            anObj.SetLineWidth(random.randint(1, 10))
+
+    # --- GLIPH TYPE ---
+    anObj.SetGlyphType(GLIPH_TYPE[random.randint(0, len(GLIPH_TYPE)-1)])
+        
+    # --- GLIPH POS ---
+    anObj.SetGlyphPos(GLIPH_POS[random.randint(0, len(GLIPH_POS)-1)])
+    
+    return anObj
+
+def dump_vetctors_parameters(theObject):
+    
+    dump_deformedshape_parameters(theObject)
+    
+    print "GetLineWidth() = " +str(theObject.GetLineWidth())
+    print "GetGlyphType() = " +str(theObject.GetGlyphType())
+    print "GetGlyphPos()  = " +str(theObject.GetGlyphPos())
+
+
+# ----------------------
+# ISO SURFACES     
+# ----------------------
+
+def try_isosurfaces_parameters(thePattern) :
+    if thePattern  is None : return None 
+    import copy
+    import random
+    
+    anObj = try_scalarmap_parameters(thePattern)
+    ind = random.randint(1,2)   
+    # --- SURFACES NUMBER ---
+    if ind%2 :
+            anObj.SetNbSurfaces(random.randint(-100000,100000))
+    else:
+            anObj.SetNbSurfaces(random.randint(1, 50))
+            
+    return anObj
+
+def dump_isosurfaces_parameters(theObject):
+    
+    dump_scalarmap_parameters(theObject)
+    print "GetNbSurfaces() = "+ str(theObject.GetNbSurfaces())
index dda0c4e8c1ff960af5e52650ca8ec22e4f61dbda..2a75f06ac8bae9a29cca9d50b614b5e25d8a7af6 100644 (file)
@@ -42,7 +42,7 @@ def getFieldObjectFromStudy(number,subnumber):
 
 med_comp = salome.lcc.FindOrLoadComponent("FactoryServer", "MED")
 
-medDir = os.getenv('SALOME_ROOT_DIR') + '/../SALOME_ROOT/data/'
+medDir = os.getenv('SALOME_ROOT_DIR') + '/data/'
 
 def importMedFrom(medDir,medFile):
     medFile = medDir + medFile
index f94f29eeebd2e4b41559e4388fe83daf45bd6820..1248289fe26c53c0b12249b56e9c197071ced672 100644 (file)
@@ -20,7 +20,7 @@ myVisu = visu_gui.myVisu
 medFile = "fra.med"
 myFieldName = "VITESSE";
 
-medFile = os.getenv('SALOME_ROOT_DIR') + '/../SALOME_ROOT/data/' + medFile
+medFile = os.getenv('SALOME_ROOT_DIR') + '/data/' + medFile
 myResult = myVisu.ImportFile(medFile)
 
 aMeshName ="LE VOLUME"